From 81727a940941deb8bdf873242a2f3d9cfac994c6 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 1 Jul 2022 14:18:03 +0200 Subject: source org: let's merge the pc folders, also remove misc_ from chess/handheld because i can't make up my mind --- scripts/target/mame/mame.lua | 51 +- src/mame/arcade.flt | 24 +- src/mame/at/at.cpp | 6389 -------------- src/mame/at/atpci.cpp | 263 - src/mame/at/ct486.cpp | 210 - src/mame/at/ps2.cpp | 301 - src/mame/chess/README.md | 3 + src/mame/chess/ave_arb.cpp | 365 + src/mame/chess/cking_master.cpp | 260 + src/mame/chess/compuchess.cpp | 507 ++ src/mame/chess/conchess.cpp | 344 + src/mame/chess/conic_cchess2.cpp | 285 + src/mame/chess/conic_cchess3.cpp | 161 + src/mame/chess/regence.cpp | 217 + src/mame/chess/tasc.cpp | 381 + src/mame/handheld/README.md | 4 + src/mame/handheld/hh_cop400.cpp | 2506 ++++++ src/mame/handheld/hh_cops1.cpp | 850 ++ src/mame/handheld/hh_hmcs40.cpp | 5345 ++++++++++++ src/mame/handheld/hh_melps4.cpp | 381 + src/mame/handheld/hh_pic16.cpp | 1965 +++++ src/mame/handheld/hh_pps41.cpp | 1617 ++++ src/mame/handheld/hh_rw5000.cpp | 1109 +++ src/mame/handheld/hh_sm510.cpp | 10093 ++++++++++++++++++++++ src/mame/handheld/hh_sm510.h | 116 + src/mame/handheld/hh_tms1k.cpp | 14465 ++++++++++++++++++++++++++++++++ src/mame/handheld/hh_tms1k.h | 73 + src/mame/handheld/hh_ucom4.cpp | 3060 +++++++ src/mame/handheld/monty.cpp | 296 + src/mame/handheld/rzone.cpp | 355 + src/mame/handheld/scrablex.cpp | 229 + src/mame/handheld/talkingbb.cpp | 351 + src/mame/handheld/talkingfb.cpp | 256 + src/mame/handheld/tispeak.cpp | 1909 +++++ src/mame/handheld/tispellb.cpp | 452 + src/mame/handheld/wildfire.cpp | 212 + src/mame/ibmpc/calchase.cpp | 763 -- src/mame/ibmpc/fruitpc.cpp | 180 - src/mame/ibmpc/igspc.cpp | 125 - src/mame/ibmpc/pangofun.cpp | 212 - src/mame/ibmpc/paokaipc.cpp | 130 - src/mame/ibmpc/pcat_dyn.cpp | 286 - src/mame/ibmpc/pcat_nit.cpp | 461 - src/mame/ibmpc/pcxt.cpp | 618 -- src/mame/ibmpc/quakeat.cpp | 186 - src/mame/ibmpc/queen.cpp | 323 - src/mame/ibmpc/sis630.cpp | 305 - src/mame/mame.lst | 90 +- src/mame/mess.flt | 72 +- src/mame/misc_chess/README.md | 3 - src/mame/misc_chess/ave_arb.cpp | 365 - src/mame/misc_chess/cking_master.cpp | 260 - src/mame/misc_chess/compuchess.cpp | 507 -- src/mame/misc_chess/conchess.cpp | 344 - src/mame/misc_chess/conic_cchess2.cpp | 285 - src/mame/misc_chess/conic_cchess3.cpp | 161 - src/mame/misc_chess/regence.cpp | 217 - src/mame/misc_chess/tasc.cpp | 381 - src/mame/misc_handheld/README.md | 4 - src/mame/misc_handheld/hh_cop400.cpp | 2506 ------ src/mame/misc_handheld/hh_cops1.cpp | 850 -- src/mame/misc_handheld/hh_hmcs40.cpp | 5345 ------------ src/mame/misc_handheld/hh_melps4.cpp | 381 - src/mame/misc_handheld/hh_pic16.cpp | 1965 ----- src/mame/misc_handheld/hh_pps41.cpp | 1617 ---- src/mame/misc_handheld/hh_rw5000.cpp | 1109 --- src/mame/misc_handheld/hh_sm510.cpp | 10093 ---------------------- src/mame/misc_handheld/hh_sm510.h | 116 - src/mame/misc_handheld/hh_tms1k.cpp | 14465 -------------------------------- src/mame/misc_handheld/hh_tms1k.h | 73 - src/mame/misc_handheld/hh_ucom4.cpp | 3060 ------- src/mame/misc_handheld/monty.cpp | 296 - src/mame/misc_handheld/rzone.cpp | 355 - src/mame/misc_handheld/scrablex.cpp | 229 - src/mame/misc_handheld/talkingbb.cpp | 351 - src/mame/misc_handheld/talkingfb.cpp | 256 - src/mame/misc_handheld/tispeak.cpp | 1909 ----- src/mame/misc_handheld/tispellb.cpp | 452 - src/mame/misc_handheld/wildfire.cpp | 212 - src/mame/pc/README.md | 3 + src/mame/pc/at.cpp | 6389 ++++++++++++++ src/mame/pc/atpci.cpp | 263 + src/mame/pc/calchase.cpp | 763 ++ src/mame/pc/ct486.cpp | 210 + src/mame/pc/ec184x.cpp | 347 + src/mame/pc/fruitpc.cpp | 180 + src/mame/pc/igspc.cpp | 125 + src/mame/pc/iskr103x.cpp | 139 + src/mame/pc/kb_7007_3.h | 129 + src/mame/pc/kb_poisk1.h | 239 + src/mame/pc/mc1502.cpp | 486 ++ src/mame/pc/pangofun.cpp | 212 + src/mame/pc/paokaipc.cpp | 130 + src/mame/pc/pcat_dyn.cpp | 286 + src/mame/pc/pcat_nit.cpp | 461 + src/mame/pc/pcxt.cpp | 618 ++ src/mame/pc/poisk1.cpp | 767 ++ src/mame/pc/ps2.cpp | 301 + src/mame/pc/quakeat.cpp | 186 + src/mame/pc/queen.cpp | 323 + src/mame/pc/sis630.cpp | 305 + src/mame/xussrpc/ec184x.cpp | 347 - src/mame/xussrpc/iskr103x.cpp | 139 - src/mame/xussrpc/kb_7007_3.h | 129 - src/mame/xussrpc/kb_poisk1.h | 239 - src/mame/xussrpc/mc1502.cpp | 486 -- src/mame/xussrpc/poisk1.cpp | 767 -- 107 files changed, 61138 insertions(+), 61154 deletions(-) delete mode 100644 src/mame/at/at.cpp delete mode 100644 src/mame/at/atpci.cpp delete mode 100644 src/mame/at/ct486.cpp delete mode 100644 src/mame/at/ps2.cpp create mode 100644 src/mame/chess/README.md create mode 100644 src/mame/chess/ave_arb.cpp create mode 100644 src/mame/chess/cking_master.cpp create mode 100644 src/mame/chess/compuchess.cpp create mode 100644 src/mame/chess/conchess.cpp create mode 100644 src/mame/chess/conic_cchess2.cpp create mode 100644 src/mame/chess/conic_cchess3.cpp create mode 100644 src/mame/chess/regence.cpp create mode 100644 src/mame/chess/tasc.cpp create mode 100644 src/mame/handheld/README.md create mode 100644 src/mame/handheld/hh_cop400.cpp create mode 100644 src/mame/handheld/hh_cops1.cpp create mode 100644 src/mame/handheld/hh_hmcs40.cpp create mode 100644 src/mame/handheld/hh_melps4.cpp create mode 100644 src/mame/handheld/hh_pic16.cpp create mode 100644 src/mame/handheld/hh_pps41.cpp create mode 100644 src/mame/handheld/hh_rw5000.cpp create mode 100644 src/mame/handheld/hh_sm510.cpp create mode 100644 src/mame/handheld/hh_sm510.h create mode 100644 src/mame/handheld/hh_tms1k.cpp create mode 100644 src/mame/handheld/hh_tms1k.h create mode 100644 src/mame/handheld/hh_ucom4.cpp create mode 100644 src/mame/handheld/monty.cpp create mode 100644 src/mame/handheld/rzone.cpp create mode 100644 src/mame/handheld/scrablex.cpp create mode 100644 src/mame/handheld/talkingbb.cpp create mode 100644 src/mame/handheld/talkingfb.cpp create mode 100644 src/mame/handheld/tispeak.cpp create mode 100644 src/mame/handheld/tispellb.cpp create mode 100644 src/mame/handheld/wildfire.cpp delete mode 100644 src/mame/ibmpc/calchase.cpp delete mode 100644 src/mame/ibmpc/fruitpc.cpp delete mode 100644 src/mame/ibmpc/igspc.cpp delete mode 100644 src/mame/ibmpc/pangofun.cpp delete mode 100644 src/mame/ibmpc/paokaipc.cpp delete mode 100644 src/mame/ibmpc/pcat_dyn.cpp delete mode 100644 src/mame/ibmpc/pcat_nit.cpp delete mode 100644 src/mame/ibmpc/pcxt.cpp delete mode 100644 src/mame/ibmpc/quakeat.cpp delete mode 100644 src/mame/ibmpc/queen.cpp delete mode 100644 src/mame/ibmpc/sis630.cpp delete mode 100644 src/mame/misc_chess/README.md delete mode 100644 src/mame/misc_chess/ave_arb.cpp delete mode 100644 src/mame/misc_chess/cking_master.cpp delete mode 100644 src/mame/misc_chess/compuchess.cpp delete mode 100644 src/mame/misc_chess/conchess.cpp delete mode 100644 src/mame/misc_chess/conic_cchess2.cpp delete mode 100644 src/mame/misc_chess/conic_cchess3.cpp delete mode 100644 src/mame/misc_chess/regence.cpp delete mode 100644 src/mame/misc_chess/tasc.cpp delete mode 100644 src/mame/misc_handheld/README.md delete mode 100644 src/mame/misc_handheld/hh_cop400.cpp delete mode 100644 src/mame/misc_handheld/hh_cops1.cpp delete mode 100644 src/mame/misc_handheld/hh_hmcs40.cpp delete mode 100644 src/mame/misc_handheld/hh_melps4.cpp delete mode 100644 src/mame/misc_handheld/hh_pic16.cpp delete mode 100644 src/mame/misc_handheld/hh_pps41.cpp delete mode 100644 src/mame/misc_handheld/hh_rw5000.cpp delete mode 100644 src/mame/misc_handheld/hh_sm510.cpp delete mode 100644 src/mame/misc_handheld/hh_sm510.h delete mode 100644 src/mame/misc_handheld/hh_tms1k.cpp delete mode 100644 src/mame/misc_handheld/hh_tms1k.h delete mode 100644 src/mame/misc_handheld/hh_ucom4.cpp delete mode 100644 src/mame/misc_handheld/monty.cpp delete mode 100644 src/mame/misc_handheld/rzone.cpp delete mode 100644 src/mame/misc_handheld/scrablex.cpp delete mode 100644 src/mame/misc_handheld/talkingbb.cpp delete mode 100644 src/mame/misc_handheld/talkingfb.cpp delete mode 100644 src/mame/misc_handheld/tispeak.cpp delete mode 100644 src/mame/misc_handheld/tispellb.cpp delete mode 100644 src/mame/misc_handheld/wildfire.cpp create mode 100644 src/mame/pc/README.md create mode 100644 src/mame/pc/at.cpp create mode 100644 src/mame/pc/atpci.cpp create mode 100644 src/mame/pc/calchase.cpp create mode 100644 src/mame/pc/ct486.cpp create mode 100644 src/mame/pc/ec184x.cpp create mode 100644 src/mame/pc/fruitpc.cpp create mode 100644 src/mame/pc/igspc.cpp create mode 100644 src/mame/pc/iskr103x.cpp create mode 100644 src/mame/pc/kb_7007_3.h create mode 100644 src/mame/pc/kb_poisk1.h create mode 100644 src/mame/pc/mc1502.cpp create mode 100644 src/mame/pc/pangofun.cpp create mode 100644 src/mame/pc/paokaipc.cpp create mode 100644 src/mame/pc/pcat_dyn.cpp create mode 100644 src/mame/pc/pcat_nit.cpp create mode 100644 src/mame/pc/pcxt.cpp create mode 100644 src/mame/pc/poisk1.cpp create mode 100644 src/mame/pc/ps2.cpp create mode 100644 src/mame/pc/quakeat.cpp create mode 100644 src/mame/pc/queen.cpp create mode 100644 src/mame/pc/sis630.cpp delete mode 100644 src/mame/xussrpc/ec184x.cpp delete mode 100644 src/mame/xussrpc/iskr103x.cpp delete mode 100644 src/mame/xussrpc/kb_7007_3.h delete mode 100644 src/mame/xussrpc/kb_poisk1.h delete mode 100644 src/mame/xussrpc/mc1502.cpp delete mode 100644 src/mame/xussrpc/poisk1.cpp diff --git a/scripts/target/mame/mame.lua b/scripts/target/mame/mame.lua index 01e621be1f6..d099c0e4036 100644 --- a/scripts/target/mame/mame.lua +++ b/scripts/target/mame/mame.lua @@ -1269,7 +1269,6 @@ function linkProjects_mame_mame(_target, _subtarget) "appliedtech", "arcadia", "aristocr", - "at", "atari", "atlus", "att", @@ -1290,6 +1289,7 @@ function linkProjects_mame_mame(_target, _subtarget) "cantab", "capcom", "casio", + "chess", "commodore", "cce", "ccs", @@ -1356,6 +1356,7 @@ function linkProjects_mame_mame(_target, _subtarget) "gridcomp", "grundy", "h01x", + "handheld", "hartung", "hds", "heathkit", @@ -1368,7 +1369,6 @@ function linkProjects_mame_mame(_target, _subtarget) "hp", "husky", "ibm6580", - "ibmpc", "ie15", "igs", "igt", @@ -1420,8 +1420,6 @@ function linkProjects_mame_mame(_target, _subtarget) "miltonbradley", "mips", "misc", - "misc_chess", - "misc_handheld", "mit", "mits", "mitsubishi", @@ -1581,7 +1579,6 @@ function linkProjects_mame_mame(_target, _subtarget) "wing", "wyse", "xerox", - "xussrpc", "yamaha", "yunsung", "zaccaria", @@ -1769,11 +1766,6 @@ files { MAME_DIR .. "src/mame/aristocr/*.cpp", } -createMAMEProjects(_target, _subtarget, "at") -files { - MAME_DIR .. "src/mame/at/*.cpp", -} - createMAMEProjects(_target, _subtarget, "atari") files { MAME_DIR .. "src/mame/atari/*.cpp", @@ -2334,11 +2326,6 @@ files { MAME_DIR .. "src/mame/ibm6580/*.h", } -createMAMEProjects(_target, _subtarget, "ibmpc") -files { - MAME_DIR .. "src/mame/ibmpc/*.cpp", -} - createMAMEProjects(_target, _subtarget, "ie15") files { MAME_DIR .. "src/mame/ie15/*.cpp", @@ -2860,12 +2847,6 @@ files { MAME_DIR .. "src/mame/palm/*.ipp", } -createMAMEProjects(_target, _subtarget, "pc") -files { - MAME_DIR .. "src/mame/pc/*.cpp", - MAME_DIR .. "src/mame/pc/*.h", -} - createMAMEProjects(_target, _subtarget, "pce") files { MAME_DIR .. "src/mame/pce/*.cpp", @@ -3505,12 +3486,6 @@ files { MAME_DIR .. "src/mame/xerox/*.h", } -createMAMEProjects(_target, _subtarget, "xussrpc") -files { - MAME_DIR .. "src/mame/xussrpc/*.cpp", - MAME_DIR .. "src/mame/xussrpc/*.h", -} - createMAMEProjects(_target, _subtarget, "yamaha") files { MAME_DIR .. "src/mame/yamaha/*.cpp", @@ -3560,21 +3535,27 @@ files { -- remaining drivers -------------------------------------------------- -createMAMEProjects(_target, _subtarget, "misc") +createMAMEProjects(_target, _subtarget, "chess") files { - MAME_DIR .. "src/mame/misc/*.cpp", - MAME_DIR .. "src/mame/misc/*.h", + MAME_DIR .. "src/mame/chess/*.cpp", } -createMAMEProjects(_target, _subtarget, "misc_chess") +createMAMEProjects(_target, _subtarget, "handheld") files { - MAME_DIR .. "src/mame/misc_chess/*.cpp", + MAME_DIR .. "src/mame/handheld/*.cpp", + MAME_DIR .. "src/mame/handheld/*.h", } -createMAMEProjects(_target, _subtarget, "misc_handheld") +createMAMEProjects(_target, _subtarget, "misc") files { - MAME_DIR .. "src/mame/misc_handheld/*.cpp", - MAME_DIR .. "src/mame/misc_handheld/*.h", + MAME_DIR .. "src/mame/misc/*.cpp", + MAME_DIR .. "src/mame/misc/*.h", +} + +createMAMEProjects(_target, _subtarget, "pc") +files { + MAME_DIR .. "src/mame/pc/*.cpp", + MAME_DIR .. "src/mame/pc/*.h", } createMAMEProjects(_target, _subtarget, "skeleton") diff --git a/src/mame/arcade.flt b/src/mame/arcade.flt index 59934c2b53b..8576c6d50b4 100644 --- a/src/mame/arcade.flt +++ b/src/mame/arcade.flt @@ -345,17 +345,6 @@ gametron/gotya.cpp gametron/sbugger.cpp gottlieb/exterm.cpp gottlieb/gottlieb.cpp -ibmpc/calchase.cpp -ibmpc/fruitpc.cpp -ibmpc/igspc.cpp -ibmpc/pangofun.cpp -ibmpc/paokaipc.cpp -ibmpc/pcat_dyn.cpp -ibmpc/pcat_nit.cpp -ibmpc/pcxt.cpp -ibmpc/quakeat.cpp -ibmpc/queen.cpp -ibmpc/sis630.cpp igs/cabaret.cpp igs/dunhuang.cpp igs/funtech.cpp @@ -1065,6 +1054,17 @@ pacman/jrpacman.cpp pacman/pacman.cpp pacman/pengo.cpp pacman/schick.cpp +pc/calchase.cpp +pc/fruitpc.cpp +pc/igspc.cpp +pc/pangofun.cpp +pc/paokaipc.cpp +pc/pcat_dyn.cpp +pc/pcat_nit.cpp +pc/pcxt.cpp +pc/quakeat.cpp +pc/queen.cpp +pc/sis630.cpp pce/ggconnie.cpp pce/paranoia.cpp pce/tourvis.cpp @@ -1570,7 +1570,7 @@ zaccaria/zaccaria.cpp -saturnkr -vsaturn -//ibmpc/sis630.cpp +//pc/sis630.cpp -shutms11 //miltonbradley/vectrex.cpp diff --git a/src/mame/at/at.cpp b/src/mame/at/at.cpp deleted file mode 100644 index 18ef2ee0e7a..00000000000 --- a/src/mame/at/at.cpp +++ /dev/null @@ -1,6389 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol, Miodrag Milanovic -/*************************************************************************** - - IBM AT Compatibles - -Commodore PC 30-III and PC 40-III -================================= -Links: http://www.richardlagendijk.nl/cip/computer/item/pc30iii/en , ftp://ftp.zimmers.net/pub/cbm-pc/firmware/pc30/ -Info: The PC 30-III and PC 40-III share the same mainboard. On a PC 30-III the onboard Paradise VGA is not populated. -Form factor: Desktop PC -CPU: Siemens SAB 80286-12 (PC 30-III), Intel 80286-12 (PC 40-III) -RAM: 1MB on board -Chipset: Faraday FE3020, MOS 5720 1788 41, Faraday FE3000, FE3010B, -Bus: 3x16 bit ISA, 1x8 bit ISA -Video: PC 30-III: ATI EGA Wonder 800+, PC 40-III: Onboard Paradise VGA, 256KB -Mass storage: One HD disk drive standard, second drive optional; PC 30-III: 20MB, PC 40-III: 40MB AT-IDE HD standard, 80MB or 100MB optional -On board: Serial, Parallel, Commodore 1532 Mouse port (MS Bus mouse compatible), Keyboard, Beeper, Floppy (2 devices), AT-IDE (1 device) -Options: 80287 - -Sanyo MBC-28 -============ -Links: http://www.cc-computerarchiv.de/CC-Archiv/bc-alt/gb-san/gb-san-12_91.html -Form factor: Desktop -CPU: 80386sx-20 -RAM: 1MB - 8MB on board -Mass storage: 1.44MB Floppy disk drive and 80MB IDE hard disk -On board: 2xserial, parallel, bus mouse, keyboard -To-Do: Complains about missing mouse hardware (Bus Mouse), hangs in POST - -Siemens PCD-2 -============= -Links: http://www.z80.eu/siemenspcd2.html , http://www.z80.eu/downloads/Siemens_PCD-2_SW-Monitor-Buchse-Belegung.pdf , https://www.computerwoche.de/a/at-klon-und-lan-ergaenzen-siemens-palette,1166395 -Form factor: low profile desktop -CPU: 80286-12 on a Tandon supplied slot CPU card -RAM: 1MB - 4MB in four SIMM modules -Mass storage: 1.2MB Floppy disk drive and 20MB or 40MB MFM harddisk -Bus: Vertical passive ISA backplane with six slots -On board: 2xserial, parallel, floppy, keyboard, RTC, MFM harddisk controller piggybacked to bus extension on slot CPU -Options: 80287 - -Compaq Portable II -================== -Links: http://tkc8800.com/post/compaq-portable-ii-restoration , https://www.seasip.info/VintagePC/compaq2.html , https://en.wikipedia.org/wiki/Compaq_Portable_II -Form factor: Luggable -CPU: 80286-8 -RAM: 256K or 640K on board, 512kB and 2048kB ISA memory cards and 512kB and 1536kB memory boards that attached to the back of the motherboard, 4.2M max. -Display: Green-screen CRT -Mass storage: one or two 5.25" floppy drives, 10MB or 20MB mfm harddisk connected via an MFM=>IDE bridgeboard -Bus: two 8bit and two 16bit ISA slots -On board: Serial, parallel -Standard cards: Floppy/IDE combo card, special Compaq CGA/MDA hybrid video card -Options: Compaq EGA card (drives internal monitor), 80287, floppy drives (360K, 1.2M, 1.44M) - -Compaq Portable III -=================== -Links: http://www.old-computers.com/museum/computer.asp?c=1064 , http://www.freakedenough.at/infoseiten/read.php?id=66 , http://www.1000bit.it/ad/bro/compaq/CompaqProtable3.pdf , http://oldcomputers.net/compaqiii.pdf -Info: The later Compaq Portable 386 uses the same case, screen and video adapter; Models: 1 (no), 20 (20MB) and 40 (40MB harddisk) -Form factor: Luggable -CPU: AMD N80L286-12/S 12MHz (could be downclocked to 8MHz) -RAM: 640KB, attitional RAM cards were 512KB or 2MB to give 1.1MB, 1.6MB, 2.1MB, 2.6MB, 4.6MB or 6.6MB of total RAM -Video: AT&T 6300/Olivetti M24 driver compatible "Super CGA" with a 640x400 red/amber Plasma screen -Mass storage: One 1.2MB floppy disk drive, no/20MB/40MB hard disk -On board: Serial, Parallel, RTC, RGBI (external Monitor), keyboard -Options: 80827, Expansion box with 2 ISA slots, 300/1200Baud internal Modem, Compaq EGA Board -To-Do: Emulate Graphics card fully - -Ericsson/Nokia Data/ICL WS286 -============================= -Links: http://oju.mbnet.fi/retro/EricssonPC_eng.html -Info: WS286 was introduced 1986 as first 8Mhz AT in the world a few weeks ahead competition, aquired by Nokia Data 1988 which in turn was aquired by ICL 1990 -Form factor: Desktop PC -CPU: Intel 286, 8MHz -RAM: 640KB -Mass storage: Floppy: 5.25" 1.2Mb, HDD: 40Mb - -Nixdorf 8810 M55 -================ -Links: https://www.computerwoche.de/a/auch-nixdorf-nun-in-der-at-clone-riege,1166613 -Info: Rebadged NCR PC-8, an AT-clone in a huge desktop case -Form factor: Desktop PC -CPU: Intel 286; CPU card has a 20Mhz, a 12 MHz and a 14.31818 crystal -RAM: 512K on CPU card, 128K on a piggyback card and a memory expansion board -Bus: Passive backplane, ISA -Video: Paradise EGA on another piggyback board -Mass storage: Floppy: 5.25" 1.2MB, MFM HDD - -Lion 3500C/T -========== -Info: BIOS saved according to http://mess.redump.net/dumping/dump_bios_using_debug from a 3560C machine -Form factor: notebook -CPU: Intel 486DX2-66 -RAM: 2MB, 4MB, 8MB or 16MB -Chipset: ETEQ ET/486H (ET82C491 & ET82C492), 82C206, 82C712 -ROM: 128K Video (E0000-EFFFF) & BIOS ROM (F0000-FFFFF) -Video: Cirrus Logic GD-6420BF/6430 6342 internal VGA, 640x480 256 color display -Mass storage: Floppy 3.5" 1.44MB, 3.5" HDD, 120MB -Input: Trackball connected as a PS/2 mouse -Options: 100 pin expansion port for 3305 Docking station (2xISA16 slots), external keypad -Ports: External VGA, external keyboard, COM1, external keypad, COM2, LPT1, buzzer -Variants: T denotes an active 8.4" display, C a passive 9.5" color display. 3560T/C (486DX2-66), 3530T/C(486DX2-50), 3500T/C (486DX-33), 3500SXT/SXC(486SX-25) - -***************************************************************************/ - -#include "emu.h" - -/* mingw-gcc defines this */ -#ifdef i386 -#undef i386 -#endif /* i386 */ - -#include "bus/isa/isa_cards.h" -#include "bus/lpci/pci.h" -#include "bus/lpci/vt82c505.h" -#include "bus/pc_kbd/keyboards.h" -#include "bus/pc_kbd/pc_kbdc.h" -#include "cpu/i386/i386.h" -#include "cpu/i86/i286.h" -#include "machine/at.h" -#include "machine/cs8221.h" -#include "machine/ds128x.h" -#include "machine/idectrl.h" -#include "machine/nvram.h" -#include "machine/ram.h" -#include "machine/vt82c496.h" -#include "machine/wd7600.h" -#include "emupal.h" -#include "softlist_dev.h" -#include "speaker.h" - -class at_state : public driver_device -{ -public: - at_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_mb(*this, "mb"), - m_ram(*this, RAM_TAG) - { } - - void pc30iii(machine_config &config); - void k286i(machine_config &config); - void ibm5170(machine_config &config); - void ct386sx(machine_config &config); - void xb42639(machine_config &config); - void at486l(machine_config &config); - void comportii(machine_config &config); - void comportiii(machine_config &config); - void comslt286(machine_config &config); - void dsys200(machine_config &config); - void ibm5162(machine_config &config); - void neat(machine_config &config); - void at386l(machine_config &config); - void ibm5170a(machine_config &config); - void ec1842(machine_config &config); - void at486(machine_config &config); - void ficpio2(machine_config &config); - void at386sx(machine_config &config); - void pc40iii(machine_config &config); - void pc45iii(machine_config &config); - void c286lt(machine_config &config); - void csl286(machine_config &config); - void c386sx16(machine_config &config); - void atturbo(machine_config &config); - void at386(machine_config &config); - void m290(machine_config &config); - void ncrpc8(machine_config &config); - void n8810m15(machine_config &config); - void n8810m55(machine_config &config); - void ews286(machine_config &config); - void olyport40(machine_config &config); - void micral45(machine_config &config); - void euroat(machine_config &config); - void pg750(machine_config &config); - - void init_at(); - void init_atpci(); - -protected: - required_device m_maincpu; - required_device m_mb; - required_device m_ram; - uint16_t ps1_unk_r(offs_t offset); - void ps1_unk_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - uint8_t ps1_portb_r(); - - void init_at_common(int xmsbase); - uint16_t m_ps1_reg[2]; - - static void cfg_single_360K(device_t *device); - static void cfg_single_1200K(device_t *device); - static void cfg_single_1440K(device_t *device); - static void cfg_dual_1440K(device_t *device); - void at16_io(address_map &map); - void at16_map(address_map &map); - void at16l_map(address_map &map); - void at32_io(address_map &map); - void at32_map(address_map &map); - void at32l_map(address_map &map); - void ficpio_io(address_map &map); - void ficpio_map(address_map &map); - void neat_io(address_map &map); - void ps1_16_io(address_map &map); -}; - -class at_vrom_fix_state : public at_state -{ -public: - using at_state::at_state; - - void init_megapcpla(); - - void ibmps1(machine_config &config); - void megapcpla(machine_config &config); - -protected: - virtual void machine_start() override; -}; - -class megapc_state : public driver_device -{ -public: - megapc_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_ram(*this, RAM_TAG), - m_wd7600(*this, "wd7600"), - m_isabus(*this, "isabus"), - m_speaker(*this, "speaker") - { } - - void megapcpl(machine_config &config); - void megapc(machine_config &config); - - void init_megapc(); - void init_megapcpl(); - -private: - required_device m_maincpu; - required_device m_ram; - required_device m_wd7600; - required_device m_isabus; - required_device m_speaker; - - uint16_t wd7600_ior(offs_t offset); - void wd7600_iow(offs_t offset, uint16_t data); - DECLARE_WRITE_LINE_MEMBER( wd7600_hold ); - void wd7600_tc(offs_t offset, uint8_t data) { m_isabus->eop_w(offset, data); } - DECLARE_WRITE_LINE_MEMBER( wd7600_spkr ) { m_speaker->level_w(state); } - void megapc_io(address_map &map); - void megapc_map(address_map &map); - void megapcpl_io(address_map &map); - void megapcpl_map(address_map &map); -}; - - -void at_state::at16_map(address_map &map) -{ - map.unmap_value_high(); - map(0x000000, 0x09ffff).bankrw("bank10"); - map(0x0e0000, 0x0fffff).rom().region("bios", 0); - map(0xfe0000, 0xffffff).rom().region("bios", 0); -} - -void at_state::at16l_map(address_map &map) -{ - map.unmap_value_high(); - map(0x000000, 0x09ffff).bankrw("bank10"); - map(0x0e0000, 0x0fffff).rom().region("bios", 0x20000); - map(0xfe0000, 0xffffff).rom().region("bios", 0x20000); -} - -void at_state::at32_map(address_map &map) -{ - map.unmap_value_high(); - map(0x00000000, 0x0009ffff).bankrw("bank10"); - map(0x000e0000, 0x000fffff).rom().region("bios", 0); - map(0x00800000, 0x00800bff).ram().share("nvram"); - map(0xfffe0000, 0xffffffff).rom().region("bios", 0); -} - -void at_state::at32l_map(address_map &map) -{ - map.unmap_value_high(); - map(0x00000000, 0x0009ffff).bankrw("bank10"); - map(0x000e0000, 0x000fffff).rom().region("bios", 0x20000); - map(0x00800000, 0x00800bff).ram().share("nvram"); - map(0xfffe0000, 0xffffffff).rom().region("bios", 0x20000); -} - -void at_state::ficpio_map(address_map &map) -{ - map.unmap_value_high(); - map(0x00000000, 0x0009ffff).bankrw("bank10"); - map(0x00800000, 0x00800bff).ram().share("nvram"); - map(0xfffe0000, 0xffffffff).rom().region("isa", 0x20000); -} - -void at_state::at16_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); -} - -uint16_t at_state::ps1_unk_r(offs_t offset) -{ - return m_ps1_reg[offset]; -} - -void at_state::ps1_unk_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - if((offset == 0) && (data == 0x60)) - data = 0x68; - - COMBINE_DATA(&m_ps1_reg[offset]); -} - -uint8_t at_state::ps1_portb_r() -{ - uint8_t data = m_mb->portb_r(); - /* 0x10 is the dram refresh line bit, 15.085us. */ - data = (data & ~0x10) | ((machine().time().as_ticks(66291) & 1) ? 0x10 : 0); - - return data; -} - -void at_state::ps1_16_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); - map(0x0061, 0x0061).r(FUNC(at_state::ps1_portb_r)); - map(0x0102, 0x0105).rw(FUNC(at_state::ps1_unk_r), FUNC(at_state::ps1_unk_w)); -} - -void at_state::neat_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); - map(0x0022, 0x0023).m("cs8221", FUNC(cs8221_device::map)); -} - -void at_state::at32_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); -} - -void at_state::ficpio_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); - map(0x00a8, 0x00af).rw("chipset", FUNC(vt82c496_device::read), FUNC(vt82c496_device::write)); - map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); - map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); -} - -void megapc_state::init_megapc() -{ - uint8_t* ROM = memregion("bios")->base(); - ROM[0x19145] = 0x45; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped - ROM[0x1fea0] = 0x20; // to correct checksum -} - -void megapc_state::init_megapcpl() -{ - uint8_t* ROM = memregion("bios")->base(); - ROM[0x187b1] = 0x55; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped - ROM[0x1fea0] = 0x20; // to correct checksum -} - -void at_vrom_fix_state::init_megapcpla() -{ - uint8_t* ROM = memregion("bios")->base(); - - init_at_common(0xa0000); - - ROM[0x33c2a] = 0x45; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped - ROM[0x3af37] = 0x45; - ROM[0x3cf1b] = 0x54; // this will allow the keyboard to work during the POST memory test - ROM[0x3fffe] = 0x1c; - ROM[0x3ffff] = 0x41; // to correct checksum -} - -uint16_t megapc_state::wd7600_ior(offs_t offset) -{ - if (offset < 4) - return m_isabus->dack_r(offset); - else - return m_isabus->dack16_r(offset); -} - -void megapc_state::wd7600_iow(offs_t offset, uint16_t data) -{ - if (offset < 4) - m_isabus->dack_w(offset, data); - else - m_isabus->dack16_w(offset, data); -} - -WRITE_LINE_MEMBER( megapc_state::wd7600_hold ) -{ - // halt cpu - m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); - - // and acknowledge hold - m_wd7600->hlda_w(state); -} - -void megapc_state::megapc_map(address_map &map) -{ -} - -void megapc_state::megapcpl_map(address_map &map) -{ -} - -void megapc_state::megapc_io(address_map &map) -{ - map.unmap_value_high(); -} - -void megapc_state::megapcpl_io(address_map &map) -{ - map.unmap_value_high(); -} - -/********************************************************** - * - * Init functions - * - **********************************************************/ - -void at_state::init_at_common(int xmsbase) -{ - address_space& space = m_maincpu->space(AS_PROGRAM); - - /* managed RAM */ - membank("bank10")->set_base(m_ram->pointer()); - - if (m_ram->size() > xmsbase) - { - offs_t ram_limit = 0x100000 + m_ram->size() - xmsbase; - space.install_ram(0x100000, ram_limit - 1, m_ram->pointer() + xmsbase); - } -} - -void at_state::init_at() -{ - init_at_common(0xa0000); -} - -void at_state::init_atpci() -{ - init_at_common(0x100000); -} - -void at_vrom_fix_state::machine_start() -{ - at_state::machine_start(); - - address_space& space = m_maincpu->space(AS_PROGRAM); - space.install_rom(0xc0000, 0xcffff, memregion("bios")->base()); -} - -void at_state::cfg_single_1200K(device_t *device) -{ - dynamic_cast(*device->subdevice("fdc:0")).set_default_option("525hd"); - dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); -} - -void at_state::cfg_single_360K(device_t *device) -{ - dynamic_cast(*device->subdevice("fdc:0")).set_default_option("525dd"); - dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); -} - -void at_state::cfg_single_1440K(device_t *device) -{ - dynamic_cast(*device->subdevice("fdc:0")).set_default_option("35hd"); - dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); -} - -void at_state::cfg_dual_1440K(device_t *device) -{ - dynamic_cast(*device->subdevice("fdc:0")).set_default_option("35hd"); - dynamic_cast(*device->subdevice("fdc:1")).set_default_option("35hd"); -} - -static void pci_devices(device_slot_interface &device) -{ - device.option_add_internal("vt82c505", VT82C505); -} - -void at_state::ibm5170(machine_config &config) -{ - /* basic machine hardware */ - i80286_cpu_device &maincpu(I80286(config, m_maincpu, 12_MHz_XTAL / 2)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); - maincpu.set_addrmap(AS_IO, &at_state::at16_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - // FIXME: determine ISA bus clock - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "ega", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "fdc", false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, "comat", false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, "ide", false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("1664K").set_extra_options("640K,1024K,2M,4M,8M,15M"); -} - -void at_state::ibm5170a(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(16_MHz_XTAL / 2); -} - -void at_state::ews286(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(16_MHz_XTAL / 2); // Exact crystal needs to be verified, 8 MHz according to specification - - subdevice("isa2")->set_option_machine_config("fdc", cfg_single_1200K); // From pictures but also with a 3.5" as second floppy - - SOFTWARE_LIST(config, "ews286_disk_list").set_original("ews286_flop"); - - m_ram->set_default_size("640K"); -} - -void at_state::ec1842(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(12'000'000); -} - -void at_state::ibm5162(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(6'000'000); - subdevice("isa1")->set_default_option("cga"); -} - -void at_vrom_fix_state::ibmps1(machine_config &config) -{ - ibm5170(config); - - m_maincpu->set_clock(10_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &at_vrom_fix_state::at16l_map); - m_maincpu->set_addrmap(AS_IO, &at_vrom_fix_state::ps1_16_io); - - subdevice("isa1")->set_default_option("vga"); - subdevice("isa1")->set_fixed(true); - subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); -} - -void at_state::atturbo(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(12'000'000); - subdevice("isa1")->set_default_option("svga_et4k"); - subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); // FIXME: determine ISA bus clock -} - -void at_state::neat(machine_config &config) -{ - atturbo(config); - m_maincpu->set_addrmap(AS_IO, &at_state::neat_io); - - ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); // TODO: move this into the cs8221 - rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb - rtc.set_century_index(0x32); - - CS8221(config, "cs8221", 0, "maincpu", "mb:isa", "bios"); -} - -void at_state::xb42639(machine_config &config) -{ - atturbo(config); - m_maincpu->set_clock(12'500'000); -} - -void at_state::k286i(machine_config &config) -{ - ibm5162(config); - subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); // FIXME: determine ISA bus clock - ISA16_SLOT(config, "isa6", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa7", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa8", 0, "mb:isabus", pc_isa16_cards, nullptr, false); -} - -void at_state::at386(machine_config &config) -{ - i386_device &maincpu(I386(config, m_maincpu, 12'000'000)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); - maincpu.set_addrmap(AS_IO, &at_state::at32_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - // on-board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: deteremine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("1664K").set_extra_options("2M,4M,8M,15M,16M,32M,64M"); -} - -void at_state::at386l(machine_config &config) -{ - at386(config); - m_maincpu->set_addrmap(AS_PROGRAM, &at_state::at32l_map); -} - -void at_state::at486(machine_config &config) -{ - i486_device &maincpu(I486(config, m_maincpu, 25'000'000)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); - maincpu.set_addrmap(AS_IO, &at_state::at32_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - // on-board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: deteremine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,16M,20M,32M,64M,128M"); -} - -void at_state::at486l(machine_config &config) -{ - at486(config); - m_maincpu->set_addrmap(AS_PROGRAM, &at_state::at32l_map); -} - -void at_state::at386sx(machine_config &config) -{ - atturbo(config); - i386sx_device &maincpu(I386SX(config.replace(), m_maincpu, 16'000'000)); /* 386SX */ - maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); - maincpu.set_addrmap(AS_IO, &at_state::at16_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); -} - -void at_state::ct386sx(machine_config &config) -{ - at386sx(config); - m_maincpu->set_addrmap(AS_IO, &at_state::neat_io); - CS8221(config, "cs8221", 0, "maincpu", "mb:isa", "maincpu"); -} - -// Commodore PC 30-III -void at_state::pc30iii(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(6'000'000); // should be 24_MHz_XTAL / 2, but doesn't post with that setting - subdevice("isa1")->set_default_option("vga"); // should be ATI EGA Wonder 800+ -} - -// Commodore PC 40-III -void at_state::pc40iii(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(6'000'000); // should be 24_MHz_XTAL / 2, but doesn't post with that setting - subdevice("isa1")->set_default_option("vga"); // should be onboard Paradise VGA, see ROM declarations -} - -void megapc_state::megapc(machine_config &config) -{ - i386sx_device &maincpu(I386SX(config, m_maincpu, 50_MHz_XTAL / 2)); - maincpu.set_addrmap(AS_PROGRAM, &megapc_state::megapc_map); - maincpu.set_addrmap(AS_IO, &megapc_state::megapc_io); - maincpu.set_irq_acknowledge_callback("wd7600", FUNC(wd7600_device::intack_cb)); - - WD7600(config, m_wd7600, 50_MHz_XTAL / 2); - m_wd7600->set_cputag(m_maincpu); - m_wd7600->set_isatag("isa"); - m_wd7600->set_ramtag(m_ram); - m_wd7600->set_biostag("bios"); - m_wd7600->set_keybctag("keybc"); - m_wd7600->hold_callback().set(FUNC(megapc_state::wd7600_hold)); - m_wd7600->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - m_wd7600->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - m_wd7600->cpureset_callback().set_inputline(m_maincpu, INPUT_LINE_RESET); - m_wd7600->a20m_callback().set_inputline(m_maincpu, INPUT_LINE_A20); - // isa dma - m_wd7600->ior_callback().set(FUNC(megapc_state::wd7600_ior)); - m_wd7600->iow_callback().set(FUNC(megapc_state::wd7600_iow)); - m_wd7600->tc_callback().set(FUNC(megapc_state::wd7600_tc)); - // speaker - m_wd7600->spkr_callback().set(FUNC(megapc_state::wd7600_spkr)); - - // on board devices - ISA16(config, m_isabus, 0); - m_isabus->set_memspace(m_maincpu, AS_PROGRAM); - m_isabus->set_iospace(m_maincpu, AS_IO); - m_isabus->iochck_callback().set(m_wd7600, FUNC(wd7600_device::iochck_w)); - m_isabus->irq2_callback().set(m_wd7600, FUNC(wd7600_device::irq09_w)); - m_isabus->irq3_callback().set(m_wd7600, FUNC(wd7600_device::irq03_w)); - m_isabus->irq4_callback().set(m_wd7600, FUNC(wd7600_device::irq04_w)); - m_isabus->irq5_callback().set(m_wd7600, FUNC(wd7600_device::irq05_w)); - m_isabus->irq6_callback().set(m_wd7600, FUNC(wd7600_device::irq06_w)); - m_isabus->irq7_callback().set(m_wd7600, FUNC(wd7600_device::irq07_w)); - m_isabus->irq10_callback().set(m_wd7600, FUNC(wd7600_device::irq10_w)); - m_isabus->irq11_callback().set(m_wd7600, FUNC(wd7600_device::irq11_w)); - m_isabus->irq12_callback().set(m_wd7600, FUNC(wd7600_device::irq12_w)); - m_isabus->irq14_callback().set(m_wd7600, FUNC(wd7600_device::irq14_w)); - m_isabus->irq15_callback().set(m_wd7600, FUNC(wd7600_device::irq15_w)); - m_isabus->drq0_callback().set(m_wd7600, FUNC(wd7600_device::dreq0_w)); - m_isabus->drq1_callback().set(m_wd7600, FUNC(wd7600_device::dreq1_w)); - m_isabus->drq2_callback().set(m_wd7600, FUNC(wd7600_device::dreq2_w)); - m_isabus->drq3_callback().set(m_wd7600, FUNC(wd7600_device::dreq3_w)); - m_isabus->drq5_callback().set(m_wd7600, FUNC(wd7600_device::dreq5_w)); - m_isabus->drq6_callback().set(m_wd7600, FUNC(wd7600_device::dreq6_w)); - m_isabus->drq7_callback().set(m_wd7600, FUNC(wd7600_device::dreq7_w)); - - ISA16_SLOT(config, "board1", 0, "isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock - ISA16_SLOT(config, "board2", 0, "isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "isabus", pc_isa16_cards, "lpt", true); - ISA16_SLOT(config, "board5", 0, "isabus", pc_isa16_cards, "vga", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "isabus", pc_isa16_cards, nullptr, false); - - at_keyboard_controller_device &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", 12_MHz_XTAL)); - keybc.hot_res().set("wd7600", FUNC(wd7600_device::kbrst_w)); - keybc.gate_a20().set("wd7600", FUNC(wd7600_device::gatea20_w)); - keybc.kbd_irq().set("wd7600", FUNC(wd7600_device::irq01_w)); - keybc.kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - keybc.kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,15M,16M"); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50); - - // video hardware - PALETTE(config, "palette").set_entries(256); // todo: really needed? - - /* software lists */ - SOFTWARE_LIST(config, "disk_list").set_original("megapc"); -} - -void megapc_state::megapcpl(machine_config &config) -{ - megapc(config); - i486_device &maincpu(I486(config.replace(), m_maincpu, 66'000'000 / 2)); - maincpu.set_addrmap(AS_PROGRAM, &megapc_state::megapcpl_map); - maincpu.set_addrmap(AS_IO, &megapc_state::megapcpl_io); - maincpu.set_irq_acknowledge_callback("wd7600", FUNC(wd7600_device::intack_cb)); -} - -void at_vrom_fix_state::megapcpla(machine_config &config) -{ - i486_device &maincpu(I486(config, m_maincpu, 66'000'000 / 2)); // 486SLC - maincpu.set_addrmap(AS_PROGRAM, &at_vrom_fix_state::at32l_map); - maincpu.set_addrmap(AS_IO, &at_vrom_fix_state::at32_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - // on board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_dm", false); // closest to the CL-GD5420 - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("4M").set_extra_options("2M,8M,15M,16M,32M,64M,128M,256M"); - - /* software lists */ - SOFTWARE_LIST(config, "disk_list").set_original("megapc"); -} - -void at_state::ficpio2(machine_config &config) -{ - i486_device &maincpu(I486(config, m_maincpu, 25'000'000)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::ficpio_map); - maincpu.set_addrmap(AS_IO, &at_state::ficpio_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); - rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb - rtc.set_century_index(0x32); - - RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M"); - - // on board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - - ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("mb:pic8259_slave", FUNC(pic8259_device::ir6_w)); - ide_controller_32_device &ide2(IDE_CONTROLLER_32(config, "ide2").options(ata_devices, "cdrom", nullptr, true)); - ide2.irq_handler().set("mb:pic8259_slave", FUNC(pic8259_device::ir7_w)); - - PCI_BUS(config, "pcibus", 0).set_busnum(0); - PCI_CONNECTOR(config, "pcibus:0", pci_devices, "vt82c505", true); - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - vt82c496_device &chipset(VT82C496(config, "chipset")); - chipset.set_cputag(m_maincpu); - chipset.set_ramtag(m_ram); - chipset.set_isatag("isa"); -} - -// Compaq Portable III -void at_state::comportiii(machine_config &config) -{ - /* basic machine hardware */ - i80286_cpu_device &maincpu(I80286(config, m_maincpu, 48_MHz_XTAL / 4 /*12000000*/)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); - maincpu.set_addrmap(AS_IO, &at_state::at16_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - // FIXME: determine ISA bus clock - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdc", true).set_option_machine_config("fdc", cfg_single_1200K); - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "hdc", true); - ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "cga_cportiii", true); - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("640K").set_extra_options("1152K,1664K,2176K,2688K,4736K,6784K"); -} - -void at_state::comportii(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(48_MHz_XTAL / 6); - - subdevice("isa2")->set_option_machine_config("fdc", cfg_single_360K); - subdevice("isa4")->set_default_option("hdc"); - m_ram->set_default_size("640K").set_extra_options("1152K,1664K,2176K,2688K,4224K"); -} - -// Nixdorf 8810 M55 -void at_state::n8810m15(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(6'000'000); - subdevice("isa1")->set_default_option("cga"); -} - -// Nixdorf 8810 M55 -void at_state::n8810m55(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(6'000'000); - subdevice("isa1")->set_default_option("ega"); -} - -// AEG Olympia Olyport 40-21 -void at_state::olyport40(machine_config &config) -{ - neat(config); - m_maincpu->set_clock(12'000'000); - subdevice("isa1")->set_default_option("cga"); -} - -// Bull Micral 45 -void at_state::micral45(machine_config &config) -{ - atturbo(config); - m_maincpu->set_clock(12'000'000); - subdevice("isa1")->set_default_option("ega"); -} - -void at_state::euroat(machine_config &config) -{ - ibm5170(config); - m_maincpu->set_clock(24_MHz_XTAL / 2); // Bus speed can be set up to CPU speed - - subdevice("isa2")->set_option_machine_config("fdc", cfg_single_1440K); // From pictures but also with a 3.5" as second floppy - - m_ram->set_default_size("640K"); -} - -// Siemens PG 750 -void at_state::pg750(machine_config &config) -{ - i386_device &maincpu(I386(config, m_maincpu, 12'000'000)); - maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); - maincpu.set_addrmap(AS_IO, &at_state::at32_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - AT_MB(config, m_mb).at_softlists(config); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); // TODO: move this into the cs8221 - rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb - rtc.set_century_index(0x32); - - // on-board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdc", true).set_option_machine_config("fdc", cfg_dual_1440K); // FIXME: deteremine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "ega", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "hdc", false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, m_ram).set_default_size("3712K"); -} - -//************************************************************************** -// ROM DEFINITIONS -//************************************************************************** - -//************************************************************************** -// IBM systems -//************************************************************************** -ROM_START( ibm5170 ) - ROM_REGION16_LE(0x20000, "bios", 0) // - IBM 5170, 6 Mhz, one wait state RAM or 8 Mhz, one wait state RAM - - ROM_SYSTEM_BIOS( 0, "rev1", "IBM PC/AT 5170 01/10/84") - ROMX_LOAD( "6181028.u27", 0x10000, 0x8000, CRC(f6573f2a) SHA1(3e52cfa6a6a62b4e8576f4fe076c858c220e6c1a), ROM_SKIP(1) | ROM_BIOS(0)) /* T 6181028 8506AAA // TMM23256P-5878 // (C)IBM CORP 1981,-1984 */ - ROMX_LOAD( "6181029.u47", 0x10001, 0x8000, CRC(7075fbb2) SHA1(a7b885cfd38710c9bc509da1e3ba9b543a2760be), ROM_SKIP(1) | ROM_BIOS(0)) /* T 6181029 8506AAA // TMM23256P-5879 // (C)IBM CORP 1981,-1984 */ - - ROM_SYSTEM_BIOS( 1, "rev2", "IBM PC/AT 5170 06/10/85") /* Another verification of these crcs would be nice */ - ROMX_LOAD( "6480090.u27", 0x10000, 0x8000, CRC(99703aa9) SHA1(18022e93a0412c8477e58f8c61a87718a0b9ab0e), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "6480091.u47", 0x10001, 0x8000, CRC(013ef44b) SHA1(bfa15d2180a1902cb6d38c6eed3740f5617afd16), ROM_SKIP(1) | ROM_BIOS(1)) - - ROM_SYSTEM_BIOS( 2, "landmark", "Landmark/Supersoft diagnostic ROMs") // use Hercules or MDA - ROMX_LOAD( "5170_even_u27_ 27256.bin", 0x10000, 0x8000, CRC(6790392d) SHA1(c4a5310341f346dd072d096152060ef5e4430a7f), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "5170_odd_u47_ 27256.bin", 0x10001, 0x8000, CRC(4c0f3db4) SHA1(97a0cf589b93551ed1d03bd622cbc8fd5634512f), ROM_SKIP(1) | ROM_BIOS(2)) - -// ROM_SYSTEM_BIOS( 3, "atdiag", "IBM PC/AT 5170 w/Super Diagnostics") -// ROMX_LOAD( "atdiage.bin", 0xf8000, 0x4000, CRC(e8855d0c) SHA1(c9d53e61c08da0a64f43d691bf6cadae5393843a), ROM_SKIP(1) | ROM_BIOS(3)) -// ROMX_LOAD( "atdiago.bin", 0xf8001, 0x4000, CRC(606fa71d) SHA1(165e45bae7ae2da274f1e645c763c5bfcbde027b), ROM_SKIP(1) | ROM_BIOS(3)) - - /* Mainboard PALS */ - ROM_REGION( 0x2000, "pals", 0 ) - ROM_LOAD( "1501824_717750.mmipal14l4.u87.jed", 0x0000, 0x02E7, CRC(3c819a27) SHA1(d2f4889e628dbbef50b7f48cb1d1a313232bacc8)) /* MMI 1501824 717750 // (C)1983 IBM(M) */ - ROM_LOAD( "1503135_705075.mmipal14l4.u130.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 705075 // (C) IBM CORP 83 */ - /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ - ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ - - /* Mainboard PROMS */ - ROM_REGION( 0x2000, "proms", 0 ) - ROM_LOAD( "1501814.82s123an.u115", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8713 // SK-D 1501814 */ - ROM_LOAD( "55x8041.82s147an.u72", 0x0020, 0x0200, CRC(f2cc4fe6) SHA1(e285468516bd05083155a8a272583deef655315a)) /* S N82S147AN 8709 // V-C55X8041 */ -ROM_END - -ROM_START( ibm5170a ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS( 0, "rev3", "IBM PC/AT 5170 11/15/85") - ROMX_LOAD( "61x9266.u27", 0x10000, 0x8000, CRC(4995be7a) SHA1(8e8e5c863ae3b8c55fd394e345d8cca48b6e575c), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "61x9265.u47", 0x10001, 0x8000, CRC(c32713e4) SHA1(22ed4e2be9f948682891e2fd056a97dbea01203c), ROM_SKIP(1) | ROM_BIOS(0)) - - ROM_SYSTEM_BIOS( 1, "3270at", "IBM 3270 PC/AT 5281 11/15/85") /* pretty much just a part string and checksum change from the 5170 rev3 */ - ROMX_LOAD( "62x0820.u27", 0x10000, 0x8000, CRC(e9cc3761) SHA1(ff9373c1a1f34a32fb6acdabc189c61b01acf9aa), ROM_SKIP(1) | ROM_BIOS(1)) /* T 62X0820-U27 8714HAK // TMM23256P-6746 // (C)IBM CORP 1981,-1985 */ - ROMX_LOAD( "62x0821.u47", 0x10001, 0x8000, CRC(b5978ccb) SHA1(2a1aeb9ae3cd7e60fc4c383ca026208b82156810), ROM_SKIP(1) | ROM_BIOS(1)) /* T 62X0821-U47 8715HAK // TMM23256P-6747 // (C)IBM CORP 1981,-1985 */ - - /* Mainboard PALS */ - ROM_REGION( 0x2000, "pals", 0 ) - ROM_LOAD( "1501824_717750.mmipal14l4.u87.jed", 0x0000, 0x02E7, CRC(3c819a27) SHA1(d2f4889e628dbbef50b7f48cb1d1a313232bacc8)) /* MMI 1501824 717750 // (C)1983 IBM(M) */ - ROM_LOAD( "1503135_705075.mmipal14l4.u130.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 705075 // (C) IBM CORP 83 */ /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ - ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ - - /* Mainboard PROMS */ - ROM_REGION( 0x2000, "proms", 0 ) - ROM_LOAD( "1501814.82s123an.u115", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8713 // SK-D 1501814 */ - ROM_LOAD( "55x8041.82s147an.u72", 0x0020, 0x0200, CRC(f2cc4fe6) SHA1(e285468516bd05083155a8a272583deef655315a)) /* S N82S147AN 8709 // V-C55X8041 */ -ROM_END - - -ROM_START( ibm5162 ) //MB p/n 62x1168 - IBM 5162, 6 Mhz, zero wait state RAM - ROM_REGION16_LE(0x20000, "bios", 0) - - ROM_LOAD16_BYTE( "78x7460.u34", 0x10000, 0x8000, CRC(1db4bd8f) SHA1(7be669fbb998d8b4626fefa7cd1208d3b2a88c31)) /* 78X7460 U34 // (C) IBM CORP // 1981-1986 */ - ROM_LOAD16_BYTE( "78x7461.u35", 0x10001, 0x8000, CRC(be14b453) SHA1(ec7c10087dbd53f9c6d1174e8f14212e2aec1818)) /* 78X7461 U35 // (C) IBM CORP // 1981-1986 */ - - /* Mainboard PALS */ - ROM_REGION( 0x2000, "pals", 0 ) - ROM_LOAD( "59x7599.mmipal20l8.u27.jed", 0x0000, 0x02E7, NO_DUMP) /* MMI PAL20L8ACN5 8631 // N59X7599 IBM (C)85 K3 */ - ROM_LOAD( "1503135.mmipal14l4.u81.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 8625 // (C) IBM CORP 83 */ - /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ - ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ - - /* Mainboard PROMS */ - ROM_REGION( 0x2000, "proms", 0 ) - ROM_LOAD( "1501814.82s123an.u72", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8623 // SK-U 1501814 */ - ROM_LOAD( "59x7594.82s147an.u90", 0x0020, 0x0200, NO_DUMP) /* S N82S147AN 8629 // VCT 59X7594 */ -ROM_END - - -// According to http://nerdlypleasures.blogspot.com/2014/04/the-original-8-bit-ide-interface.html -// the IBM PS/1 Model 2011 use a customised version of the XTA (8-bit IDE) harddisk interface - -// https://en.wikipedia.org/wiki/IBM_PS/1 -// http://ps-2.kev009.com/pcpartnerinfo/ctstips/937e.htm -// https://ps1stuff.wordpress.com/documentation/ibm-ps1-model-2011/ -// https://barotto.github.io/IBMulator/#download - -ROM_START( ibm2011 ) - ROM_REGION16_LE( 0x40000, "bios", 0) - // Spanish version - ROM_SYSTEM_BIOS( 0, "2011es", "IBM PS/1 2011 ES") - ROMX_LOAD( "ibm_1057757_24-05-90.bin", 0x00000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "ibm_1057757_29-15-90.bin", 0x00001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(0)) - // US version - ROM_SYSTEM_BIOS( 1, "2011us", "IBM PS/1 2011 US") // constant resets - ROMX_LOAD( "1057754.bin", 0x00000, 0x20000, CRC(648a6a61) SHA1(6cebaf9f2431e67fea37f34b06916264d6737ab6), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "1057756.bin", 0x00001, 0x20000, CRC(862f94ac) SHA1(1eba7fa20301403db7c4f53032267902191ea2c7), ROM_SKIP(1) | ROM_BIOS(1)) -ROM_END - -ROM_START( ibm2011rd ) // these international versions were shipped with DOS in a ROM disk and require a different memory map, they don't yet load properly - ROM_REGION16_LE( 0x80000, "bios", 0) - // Swedish version - ROM_SYSTEM_BIOS( 0, "2011se", "IBM PS/1 2011 SE") - ROMX_LOAD( "ibm2011se_f80000.bin", 0x00000, 0x40000, CRC(1b90693b) SHA1(2cdcfda55fea25a991c1568ff398d97c5e07e96d), ROM_BIOS(0)) - ROMX_LOAD( "ibm2011se_fc0000.bin", 0x40000, 0x40000, CRC(ef7aa453) SHA1(993dd6e17c6fd5c2ef513d94383f36b1929d1936), ROM_BIOS(0)) - // Portuguese version - ROM_SYSTEM_BIOS( 1, "2011pt", "IBM PS/1 2011 PT") - ROMX_LOAD( "u18_x1_1057451.bin", 0x00000, 0x20000, CRC(0484e15d) SHA1(39fb05843c8371f4b716679e6ce512bcf5a05dac), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "u36_x4_1057449.bin", 0x00001, 0x20000, CRC(23d7e4fe) SHA1(9c89efa61fc77485b65fff9133d6a19caca553e9), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "u23_x2_1057757.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "u28_x3_1057759.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(1)) - // German version - ROM_SYSTEM_BIOS( 2, "2011de", "IBM PS/1 2011 DE") - ROMX_LOAD( "x1_1057866_u10.bin", 0x00000, 0x20000, CRC(ef0f0bb4) SHA1(d1e4c081f1a74732eb6e37a3bfb9403819b7d891), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "x4_1057864_u36.bin", 0x00001, 0x20000, CRC(16d357ff) SHA1(6521b160bf0dd05b890ad197d9c9359d806da18a), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "x2_1057757_u23.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "x3_1057759_u28.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(2)) - // Italian version - ROM_SYSTEM_BIOS( 3, "2011it", "IBM_PS/1 2011 IT") - ROMX_LOAD( "x1-1057630-u18.bin", 0x00000, 0x20000, CRC(3843830c) SHA1(68b2f443b6ceadbc94a725fe66ad9c9685490dcb), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "x4-1057628-u36.bin", 0x00001, 0x20000, CRC(1ddf3afb) SHA1(da55abaf4f775e2e3efdd952beb9f97769e3cac3), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "x2_1057757_u23.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "x3_1057759_u28.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(3)) - // UK version - ROM_SYSTEM_BIOS( 4, "2011uk", "IBM_PS/1 2011 UK") - ROMX_LOAD( "u18_x1.bin", 0x00000, 0x20000, CRC(029c4d8a) SHA1(bf2f56ac2e03098144b3dcc34f7daa09c8e08288), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "u36_x4.bin", 0x00001, 0x20000, CRC(bf6c5631) SHA1(68cbff7e229cd77ae8c2e8835dbb9b3047f41e4c), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "u23_x2.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "u28_x3.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(4)) -ROM_END - -// From Wikipedia: -// Model MB FRU CPU ISA Sl. RAM VRAM Hard-Drive Serial/Modem -// 2121-C42 92F9690 Intel 80386SX @ 16 MHz 0 2 MB 256KB 95F4720 40MB IDE 2400 baud modem -// 2121-B82 92F9690 Intel 80386SX @ 16 MHz 2 2 MB 256KB 92F9943 80MB IDE 2400 baud modem -// 2121-C92 Intel 80386SX @ 16 MHz 0 2 MB 256KB 129MB IDE 2400 baud modem -// 2121-G42 Intel 80386SX @ 20 MHz 0 2 MB 256KB 40MB IDE 2400 baud modem -// 2121-A82 Intel 80386SX @ 20 MHz 2 2 MB 256KB 40MB IDE 2400 baud modem -// 2121-S92 Intel 80386SX @ 20 MHz 0 2 MB 256KB 129MB IDE 2400 baud modem -// 2121-M82 Intel 80386SX @ 20 MHz 2 2 MB 256KB 80MB IDE 2400 baud modem -// 2121-A62 2 256KB 56F8863 160MB IDE 2400 baud modem -// 2121-A92 256KB serial port -// 2121-A94 Intel 80386SX @ 20 MHz 2 6 MB 256KB 129MB IDE 2400 baud modem - -ROM_START( ibm2121 ) - ROM_REGION16_LE( 0x40000, "bios", 0) - ROM_SYSTEM_BIOS( 0, "2121", "IBM PS/1 2121" ) - ROMX_LOAD( "fc0000.bin", 0x00000, 0x40000, CRC(96bbaf52) SHA1(8737d805444837023a58702279f8fe6e7f08e7ba), ROM_BIOS(0)) - ROM_SYSTEM_BIOS( 1, "2121us", "IBM PS/1 2121 US" ) - ROMX_LOAD( "ibm2121us_fc0000.bin", 0x00000, 0x40000, CRC(817aad71) SHA1(43b7b84390fcc081a946cdb4bdce4ba7a4a88074), ROM_BIOS(1)) -ROM_END - -ROM_START( ibm2121rd ) // international versions shipped with ROM DOS, need a different memory map at least - ROM_REGION16_LE( 0x80000, "bios", 0) - ROM_SYSTEM_BIOS( 0, "2121sp", "IBM PS/1 2121 Spanish" ) - ROMX_LOAD( "ibm2121sp_f80000.bin", 0x00000, 0x40000, CRC(90505c4b) SHA1(59becaec25644820a78464d66e472a8a225d94cc), ROM_BIOS(0)) - ROMX_LOAD( "ibm2121sp_fc0000.bin", 0x40000, 0x40000, CRC(f83fac75) SHA1(a42b1b9465983392eaa0159d4bfc30620a7af499), ROM_BIOS(0)) - ROM_SYSTEM_BIOS( 1, "2121fr", "IBM PS/1 2121 French" ) - ROMX_LOAD( "ibm2121fr_f80000.bin", 0x00000, 0x40000, CRC(9c6de65d) SHA1(6b219c9480a06bc9218e8212acc7cfd1ceaccd4b), ROM_BIOS(1)) - ROMX_LOAD( "ibm2121fr_fc0000.bin", 0x40000, 0x40000, CRC(f83fac75) SHA1(a42b1b9465983392eaa0159d4bfc30620a7af499), ROM_BIOS(1)) -ROM_END - -// http://ps-2.kev009.com/pcpartnerinfo/ctstips/937e.htm -ROM_START( ibm2123 ) - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD( "ps1_2123_87f4794_rom.bin", 0x00000, 0x20000, CRC(64f921b8) SHA1(e1856bf3dd3ce21f44078aeca1f58c491b202ad2)) -ROM_END - -// From Wikipedia: -// 2133 Desktop case. The 3x3 references the available slots and drive bays. -// 2155 Desktop case larger than 2133. The 5x5 references the available slots and drive bays. Including a 5.25" bay. -// 2168 Tower unit. The 6x8 references the available slots and bays. Including 5.25" bays. -// Model MB FRU CPU RAM SIMM Video chip VRAM Hard-Drive Notes -// 2133-711 93F2397 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM 256KB 59G9567 85MB IDE -// 2133-811 Intel 80386SX @ 25 MHz 4 MB 85MB IDE -// 2133-13 ??? Intel 80386SX @ 25 MHz 2 MB 2x72 Pin FPM 256KB -// 2133-W13 Intel 80386SX @ 25 MHz 2 MB 129MB IDE -// 2133-13T 65G3766 Intel 80486SX @ 25 MHz 4 MB 2×72 Pin FPM 256KB 93F2329 129MB IDE -// 2133-?43 34G1885 Intel 80486SX @ 20 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE -// 2133-?50 34G1848 Intel 80486SX @ 25 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE -// 2133-?53 34G1848 Intel 80486SX @ 25 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE -// 2133-652 Intel 80486SX @ 33 MHz 4 MB 4×72 Pin FPM Cirrus CL-GD5424 512KB 84G3927 171MB IDE -// 2133-575 Intel 80486DX @ 33 MHz 4 MB 4×72 Pin FPM 512KB 170MB IDE -// 2133-594 Intel 80486DX2 @66 MHz 4 MB 4×72 Pin FPM 512KB 253MB IDE -// 2133-E11 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM Cirrus CL-GD5424 512 KB 85MB IDE Canada models, English model -// 2133-F11 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM Cirrus CL-GD5424 512 KB 85MB IDE Canada models, French model -// 2133-E43 Intel 80486SX @ 20 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, English model -// 2133-F43 Intel 80486SX @ 20 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, French model -// 2133-E53 Intel 80486SX @ 25 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, English model -// 2133-F53 Intel 80486SX @ 25 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, French model - -ROM_START( ibm2133 ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "ps1_2133_52g2974_rom.bin", 0x00000, 0x20000, CRC(89fc7600) SHA1(758e161353f6781c39ac67f1ba293c14038b17dc)) -ROM_END - - -//************************************************************************** -// Apricot systems -// -// http://bbs.actapricot.org/files/ , http://insight.actapricot.org/insight/products/main.htm -// -//************************************************************************** - -// Apricot XEN-S (Venus I Motherboard 286) -// BIOS-String: apricot / Phoenix ROM BIOS PLUS Version 3.10.17 / Apricot XEN-S 25th June 1992 -// Gate A20 failure - MAME message: char SEL checker, contact MAMEdev -ROM_START( xb42639 ) - /* actual VGA BIOS not dumped*/ - ROM_REGION16_LE(0x20000, "bios", 0) - // XEN-S (Venus I Motherboard) - ROM_LOAD16_BYTE( "3-10-17i.lo", 0x10000, 0x8000, CRC(3786ca1e) SHA1(c682d7c76f234559d03bcf21010c13c4dbeafb69)) - ROM_LOAD16_BYTE( "3-10-17i.hi", 0x10001, 0x8000, CRC(d66710eb) SHA1(e8c1cd5f9ecfbd8825655e416d7ddf2ae362e69b)) -ROM_END - -// Apricot XEN-S (Venus II Motherboard 286) -// BIOS-String: apricot XEN-S Series Personal Computer / Phoenix ROM BIOS PLUS Version 3.10.04 / XEN-S II BIOS VR 1.2.17 16th October 1990 -// Gate A20 failure -ROM_START( xb42639a ) - /* actual VGA BIOS not dumped*/ - ROM_REGION16_LE(0x20000, "bios", 0) - // XEN-S (Venus II Motherboard) - ROM_LOAD16_BYTE( "10217.lo", 0x10000, 0x8000, CRC(ea53406f) SHA1(2958dfdbda14de4e6b9d6a8c3781131ab1e32bef)) - ROM_LOAD16_BYTE( "10217.hi", 0x10001, 0x8000, CRC(111725cf) SHA1(f6018a45bda4476d40c5881fb0a506ff75ec1688)) -ROM_END - -// Apricot XEN-S (Venus I Motherboard 386) -// BIOS-String: apricot / Phoenix ROM BIOS PLUS Version 3.10.17 / Apricot XEN-S 25th June 1992 -// MAME message: char SEL checker, contact MAMEdev -ROM_START( xb42664 ) - /* actual VGA BIOS not dumped */ - ROM_REGION32_LE(0x20000, "bios", 0) - // XEN-S (Venus I Motherboard) - ROM_LOAD16_BYTE( "3-10-17i.lo", 0x10000, 0x8000, CRC(3786ca1e) SHA1(c682d7c76f234559d03bcf21010c13c4dbeafb69)) - ROM_LOAD16_BYTE( "3-10-17i.hi", 0x10001, 0x8000, CRC(d66710eb) SHA1(e8c1cd5f9ecfbd8825655e416d7ddf2ae362e69b)) -ROM_END - -// Apricot XEN-S (Venus II Motherboard 386) -// BIOS-String: apricot XEN-S Series Personal Computer / Phoenix ROM BIOS PLUS VERSION 3.10.04 / XEN-S II BIOS VR 1.2.17 16th October 1990 -ROM_START( xb42664a ) - /* actual VGA BIOS not dumped*/ - ROM_REGION32_LE(0x20000, "bios", 0) - // XEN-S (Venus II Motherboard) - ROM_LOAD16_BYTE( "10217.lo", 0x10000, 0x8000, CRC(ea53406f) SHA1(2958dfdbda14de4e6b9d6a8c3781131ab1e32bef)) - ROM_LOAD16_BYTE( "10217.hi", 0x10001, 0x8000, CRC(111725cf) SHA1(f6018a45bda4476d40c5881fb0a506ff75ec1688)) -ROM_END - -// Apricot Qi 300 (Rev D,E & F Motherboard) - no display -ROM_START( xb42663 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "qi310223.lo", 0x00000, 0x10000, CRC(53047f49) SHA1(7b38e533f7f27295269549c63e5477d950239167)) - ROM_LOAD16_BYTE( "qi310223.hi", 0x00001, 0x10000, CRC(4852869f) SHA1(98599d4691d40b3fac2936034c70b386ce4caf77)) -ROM_END - -// Apricot Qi 600 (Neptune Motherboard) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) -ROM_START( qi600 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "qi610223.lo", 0x00000, 0x10000, CRC(563114a9) SHA1(62932b3bf0b5502ff708f604c21773f00afda58e)) - ROM_LOAD16_BYTE( "qi610223.hi", 0x00001, 0x10000, CRC(0ae133f6) SHA1(6039c366f7fe0ebf60b34c1a7d6b2d781b664001)) -ROM_END - -// Apricot Qi 900 (Scorpion Motherboard) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) -ROM_START( qi900 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "qi910224.lo", 0x00000, 0x10000, CRC(b012ad3c) SHA1(807e788a6bd03f5e983fe503af3d0b202c754b8a)) - ROM_LOAD16_BYTE( "qi910224.hi", 0x00001, 0x10000, CRC(36e66d56) SHA1(0900c5272ec3ced550f18fb08db59ab7f67a621e)) -ROM_END - -// Apricot FTs (Scorpion) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) -ROM_START( ftsserv ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "fts10226.lo", 0x00000, 0x10000, CRC(efbd738f) SHA1(d5258760bafdaf1bf13c4a49da76d4b5e7b4ccbd)) - ROM_LOAD16_BYTE( "fts10226.hi", 0x00001, 0x10000, CRC(2460853f) SHA1(a6bba8d2f800140afd129c4d5278f7ae8fe7e63a)) - /* FT Server series Front Panel */ - ROM_REGION(0x10000,"front", 0) - ROM_LOAD( "fp10009.bin", 0x0000, 0x8000, CRC(8aa7f718) SHA1(9ee6c6a5bb92622ea8d3805196d42ff68887d820)) -ROM_END - -// Apricot XEN-LS (Venus IV Motherboard) - no display -ROM_START( apxenls3 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "31020.lo", 0x10000, 0x8000, CRC(a19678d2) SHA1(d13c12fa7e94333555eabf58b81bad421e21cd91)) - ROM_LOAD16_BYTE( "31020.hi", 0x10001, 0x8000, CRC(4922e020) SHA1(64e6448323dad2209e004cd93fa181582e768ed5)) -ROM_END - -// Apricot LANstation (Krypton Motherboard) - no display -ROM_START( aplanst ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "31024", "Bios 3-10-24") - ROMX_LOAD( "31024.lo", 0x10000, 0x8000, CRC(e52b59e1) SHA1(cfcaa4d8d658df8df463108ef30695bd4ee7a617), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "31024.hi", 0x10001, 0x8000, CRC(7286aefa) SHA1(dfc0e3f4936780fa62ae9ec392ce17aa65e717cd), ROM_SKIP(1) | ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "31025", "Bios 3-10-25") - ROMX_LOAD( "31025.lo", 0x10000, 0x8000, CRC(1aec09bc) SHA1(51d56c97c7c1674554aa89b68945329ea967a8bc), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "31025.hi", 0x10001, 0x8000, CRC(0763caa5) SHA1(48510a933dcd6efea3b14d04444f584c3e6fefeb), ROM_SKIP(1) | ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "31026", "Bios 3-10-26i") - ROMX_LOAD( "31026i.lo", 0x10000, 0x8000, CRC(670b6ab4) SHA1(8d61a0edf187f99b67eb58f5e11276deee801d17), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "31026i.hi", 0x10001, 0x8000, CRC(ef01c54f) SHA1(911f95d65ab96878e5e7ebccfc4b329db47a1351), ROM_SKIP(1) | ROM_BIOS(2)) -ROM_END - -// Apricot LANstation (Novell Remote Boot) - no display -ROM_START( aplannb ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "lsl31025.lo", 0x00000, 0x10000, CRC(8bb7229b) SHA1(31449d12884ec4e7752e6c1ce7ce9e0d044eadf2)) - ROM_LOAD16_BYTE( "lsh31025.hi", 0x00001, 0x10000, CRC(09e5c1b9) SHA1(d42be83b4181d3733268c29df04a4d2918370f4e)) -ROM_END - -// Apricot VX FT server - no display -ROM_START( apvxft ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "ft10221.lo", 0x00000, 0x10000, CRC(8f339de0) SHA1(a6542406746eaf1ff7f9e3678c5cbe5522fb314a)) - ROM_LOAD16_BYTE( "ft10221.hi", 0x00001, 0x10000, CRC(3b16bc31) SHA1(0592d1d81e7fd4715b0612083482db122d78c7f2)) -ROM_END - -// Apricot LS Pro (Caracal Motherboard,Chipset: VLSI VL82C483, ROM: 256KB Flash ROM, PCMCIA Type 2/3 slots) -ROM_START( aplscar ) - ROM_REGION32_LE(0x40000, "bios", 0) - // 0: MAME exits with "Fatal error: i386: Called modrm_to_EA with modrm value C8!" - ROM_SYSTEM_BIOS(0, "car306", "Caracal 3.06") - ROMX_LOAD( "car306.bin", 0x00000, 0x40000, CRC(fc271dea) SHA1(6207cfd312c9957243b8157c90a952404e43b237), ROM_BIOS(0)) - // 1: no display - ROM_SYSTEM_BIOS(1, "car307", "Caracal 3.07") - ROMX_LOAD( "car307.bin", 0x00000, 0x40000, CRC(66a01852) SHA1(b0a68c9d67921d27ba483a1c50463406c08d3085), ROM_BIOS(1)) -ROM_END - -// Apricot XEN PC (A1 Motherboard) - no display -ROM_START( apxena1 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "a1-r26.bin", 0x00000, 0x20000, CRC(d29e983e) SHA1(5977df7f8d7ac2a154aa043bb6f539d96d51fcad)) -ROM_END - -// Apricot XEN PC (P2 Motherboard, Chipset: M1429G/31, ROM: 128KB Flash ROM, on board: graphics Cirrus Logic GD5434 (via VL)) -ROM_START( apxenp2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: ACR97E00-M00-951005-R02-G2 / BIOS V2.0 - Keyboard Interface Error - Pointing DeviceInterface Error - // after a while the boot continues to the message "Password Violated, System Halted !" - ROM_SYSTEM_BIOS(0, "p2r02g2", "p2r02g2") - ROMX_LOAD( "p2r02g2.bin", 0x00000, 0x20000, CRC(311bcc5a) SHA1(be6fa144322077dcf66b065e7f4e61aab8c278b4), ROM_BIOS(0)) - // 1: BIOS-String: ACR97E00-M00-951005-R01-F0 / BIOS V2.0 (error messages as above) - ROM_SYSTEM_BIOS(1, "lep121s", "SCSI-Enabling ROMs") - ROMX_LOAD("p2r01f0.bin", 0x00000, 0x20000, CRC(bbc68f2e) SHA1(6954a52a7dda5521794151aff7a04225e9c7df77), ROM_BIOS(1)) -ROM_END - -// Apricot XEN-i 386 (Leopard Motherboard) -ROM_START( apxeni ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Phoenix 80386 ROM BIOS PLUS Version 1.10.01 / XEN-i 386 Business Microcomputer / VR 1.2.1 22nd July 1988 - ROM_SYSTEM_BIOS(0, "lep121", "Rom Bios 1.2.1") - ROMX_LOAD( "lep121.bin", 0x18000, 0x8000, CRC(948c1927) SHA1(d06bdbd6292db73c815ad1060daf055293dfddf5), ROM_BIOS(0)) - // 1: Phoenix 80386 ROM BIOS PLUS Version 1.10.01 / XEN-i 386 Business Microcomputer / VR 1.2.1 22nd January 1991 - ROM_SYSTEM_BIOS(1, "lep121s", "SCSI-Enabling ROMs") - ROMX_LOAD( "lep121s.bin", 0x18000, 0x8000, CRC(296118e4) SHA1(d1feaa9704e6ce3bc10c900bdd310d9494b02304), ROM_BIOS(1)) -ROM_END - -// Apricot LS Pro (Bonsai Motherboard, on board: ethernet (Intel 82596), Chipset: VLSI SCAMP VL82C311 / VL82C333, ROM: 128KB) -ROM_START( aplsbon ) - ROM_REGION32_LE(0x20000 ,"bios", 0) - // 0: BIOS-String: Phoenix BIOS A486 Version 1.01 / LS Pro BIOS Version 1.06, 4th July 1994 - Pointer device failure - ROM_SYSTEM_BIOS(0, "bon106", "Bonsai 1-06") - ROMX_LOAD( "bon106.bin", 0x00000, 0x20000, CRC(98a4eb76) SHA1(e0587afa78aeb9a8803f9b9f9e457e9847b0a2b2), ROM_BIOS(0)) - // 1: flashing screen - ROM_SYSTEM_BIOS(1, "bon203", "Bonsai 2-03") - ROMX_LOAD( "bon203.bin", 0x00000, 0x20000, CRC(32a0e125) SHA1(a4fcbd76952599993fa8b76aa36a96386648abb2), ROM_BIOS(1)) - // 2: BIOS-String: Phoenix BIOS A486 Version 1.01 / LS Pro BIOS Version 1.07.03, 2nd February 1995 - ROM_SYSTEM_BIOS(2, "bon10703", "Bonsai 1-07-03") - ROMX_LOAD( "bon10703.bin", 0x00000, 0x20000, CRC(0275b3c2) SHA1(55ef4cbb7f3166f678aaa478234a42049deaba5f), ROM_BIOS(2)) - // 3: flashing screen - ROM_SYSTEM_BIOS(3, "bon20402", "Bonsai 2.03") - ROMX_LOAD( "bon20402.bin", 0x00000, 0x20000, CRC(ac5803fb) SHA1(b8fe92711c6a38a5d9e6497e76a0929c1685c631), ROM_BIOS(3)) -ROM_END - -// Apricot XEN-LS II (Samurai Motherboard, on board: CD-ROM, graphics, ethernet (Intel 82596), Chipset: VLSI 82C425, VLSI 82C486) -ROM_START( apxlsam ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "sam107", "ROM BIOS Version 1-07") - ROMX_LOAD( "sam1-07.bin", 0x00000, 0x20000, CRC(65e05a8e) SHA1(c3cd198a129122cb05a28798e54331b06cfdd310), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "sam206", "ROM BIOS Version 2-06") - ROMX_LOAD( "sam2-06.bin", 0x00000, 0x20000, CRC(9768bb0f) SHA1(8166b77b133072f72f23debf85984eb19578ffc1), ROM_BIOS(1)) -ROM_END - -// Apricot FTs (Panther Rev F 1.02.26) -ROM_START( aprpand ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "pf10226.std", 0x00000, 0x10000, CRC(7396fb87) SHA1(a109cbad2179eec55f86c0297a59bb015461da21)) - ROM_CONTINUE( 0x00001, 0x10000 ) -ROM_END - -// Apricot FT//ex 486 (J3 Motherboard, Chipset: Opti 82C696) -ROM_START( aprfte ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "1-2r2-4.486", 0x00000, 0x20000, CRC(bccc236d) SHA1(0765299363e68cf65710a688c360a087856ece8f)) -ROM_END - - -//************************************************************************** -// Amstrad systems -//************************************************************************** - -// Amstrad MegaPC -ROM_START( megapc ) - ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) - ROM_REGION(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "41651-bios lo.u18", 0x00000, 0x10000, CRC(1e9bd3b7) SHA1(14fd39ec12df7fae99ccdb0484ee097d93bf8d95)) - ROM_LOAD16_BYTE( "211253-bios hi.u19", 0x00001, 0x10000, CRC(6acb573f) SHA1(376d483db2bd1c775d46424e1176b24779591525)) -ROM_END - -// Amstrad MegaPC Plus -ROM_START( megapcpl ) - ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) - ROM_REGION(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "41652.u18", 0x00000, 0x10000, CRC(6f5b9a1c) SHA1(cae981a35a01234fcec99a96cb38075d7bf23474)) - ROM_LOAD16_BYTE( "486slc.u19", 0x00001, 0x10000, CRC(6fb7e3e9) SHA1(c439cb5a0d83176ceb2a3555e295dc1f84d85103)) -ROM_END - -// Amstrad MegaPC Plus (Winbond chipset) -ROM_START( megapcpla ) - ROM_REGION32_LE(0x40000, "bios", 0) - ROM_LOAD( "megapc_bios.bin", 0x00000, 0x10000, CRC(b84938a2) SHA1(cecab72a96993db4f7c648c229b4211a8c53a380)) - ROM_CONTINUE(0x30000, 0x10000) -ROM_END - -// Amstrad PC2386 -ROM_START( pc2386 ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "c000.bin", 0x00000, 0x4000, CRC(33145bbf) SHA1(c49eaec19f656482e12c8bf282cd4ee5986d227d) ) - ROM_LOAD( "f000.bin", 0x30000, 0x10000, CRC(f54a063c) SHA1(ce70ec493053afab662f51199ef9c9304a209b8e) ) - ROM_FILL(0x3fff1, 1, 0x5b) // f000:e05b is the standard at reset vector jump address - ROM_FILL(0x3fff2, 1, 0xe0) // why does this rom's point to nowhere sane? - ROM_FILL(0x3fff3, 1, 0x00) // and why does the rest of the rom look okay? - ROM_FILL(0x3fff4, 1, 0xf0) - - ROM_REGION( 0x1000, "keyboard", 0 ) // PC2286 / PC2386 102-key keyboard - ROM_LOAD( "40211.ic801", 0x000, 0x1000, CRC(4440d981) SHA1(a76006a929f26c178e09908c66f28abc92e7744c) ) -ROM_END - - -//************************************************************************** -// Commodore systems -//************************************************************************** - -// Commodore Laptop C286-LT - screen remains blank - CPU: AMD N80C286-12 - Chipset: OAK OTI054 (J9105), OTI055 (FOY 107), OTI053 (J9105), OTI051(J9107) -ROM_START( c286lt ) - ROM_REGION16_LE(0x20000, "bios", 0) // BIOS contains Cirrus Logic VGA firmware, rebadged Sanyo MBC-17NB - ROM_SYSTEM_BIOS(0, "c286lt13", "C286-LT V1.3") - ROMX_LOAD( "cbm-c286lt-bios-v1.3-390854-01-1200.bin", 0x00000, 0x20000, CRC(785e87d2) SHA1(e271500169955473d44102a60f051b5f6cfae589), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "c286v17-854", "C286-LT V1.7 390854") - ROMX_LOAD( "cbm-c286lt-bios-v1.7-390854-04.bin", 0x00000, 0x20000, CRC(2f762ab1) SHA1(d6cb37f0dcb261df86c01d4e1eabe10a52b2070f), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "c286v17-940", "C286-LT V1.7 390940") - ROMX_LOAD( "cbm-c286lt-bios-v1.7-390940-04.bin", 0x00000, 0x20000, CRC(22d45839) SHA1(bc7159440c52c1f69957da8fdfa76ac0a42ebd16), ROM_BIOS(2)) -ROM_END - -// Commodore SL 286-16 - this is the wider one, the "slimline model" has only two ISA slots on a riser, an online OTI VGA and a Headland chipset -ROM_START( csl286 ) // continuous short beeps after POST - Chipset is marked "Chips", one IC is P82C212B-12 (16MHz) - system has a WDC VGA card - ROM_REGION16_LE(0x20000, "bios", 0) // one ISA slot with a riser providing five slots - is or is similar to a DTK PTM 1661c - ROM_LOAD16_BYTE( "cbm-sl286-16-bios-lo-v1.02-390958-03.bin", 0x10000, 0x8000, CRC(7d0c9472) SHA1(1d614f6835a388f67ece73f40d8a9f65cca3e855)) - ROM_LOAD16_BYTE( "cbm-sl286-16-bios-hi-v1.02-390959-03.bin", 0x10001, 0x8000, CRC(b6d81ddd) SHA1(9478bb846bd1e0dc1904f21d43c6df01ecbc9c83)) -ROM_END - -// Commodore SL 386SX -ROM_START( c386sx16 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // actual VGA BIOS not dumped - uses a WD Paradise according to http://www.cbmhardware.de/pc/pc.php - // complains "Time-of-day clock stopped" - // photos of the system show one ISA16 slot for a riser card, an Acumos AVGA2 chip, a VLSI 82C311 IC, one other VLSI and an Acer chip. - ROM_SYSTEM_BIOS(0, "c386sxv100", "SL 386SX V1.00") // Commodore 80386SX BIOS Rev. 1.00 - 390914-01/390915-01 - continuous beeps after POST - ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.0-390914-01.bin", 0x10000, 0x8000, CRC(03e00583) SHA1(8be8478cabd9de3d547a08207ffdcd39bf1bcd94), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.0-390915-01.bin", 0x10001, 0x8000, CRC(cbe31594) SHA1(d6ace0b5ae4a0f63d047c2918210188f4c77c0c0), ROM_SKIP(1) | ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "c386sxv101", "SL 386SX V1.01") // Rev. 1.01 - 390914-02/390915-02 - continuous beeps after POST - ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.01-390914-02-2700.bin", 0x10000, 0x8000, CRC(711f1523) SHA1(5318127cd42e60dabd221ae8dd16812726a0e889), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.01-390915-02-3b00.bin", 0x10001, 0x8000, CRC(a1390cbc) SHA1(12aef4b95581e8c4489036c75697f18e9f3727b5), ROM_SKIP(1) | ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "c386sxv102", "SL 386SX V1.02") // Rev. 1.02 - 390914-03/390914-03/390915-03 - ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.02-390914-03-0300.bin", 0x10000, 0x8000, CRC(301eb832) SHA1(6c599792b254b6d98dc130040d4f7858fd504f15), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.02-390915-03-3800.bin", 0x10001, 0x8000, CRC(01815d9d) SHA1(0af291626e71ed65ff6dfee2fe4776a29f2bbb97), ROM_SKIP(1) | ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "c386sxv103", "SL 386SX V1.03") // Commodore 80386SX BIOS Rev. 1.03 - - // this was replaced with the consistently named ROMs from http://www.zimmers.net/cbmpics/cpcs3.html, the 'hi' ROM looks like a bad dump, with its alternative the POST comes up - // ROMX_LOAD( "390914-01.u39", 0x10000, 0x8000, CRC(8f849198) SHA1(550b04bac0d0807d6e95ec25391a81272779b41b), ROM_SKIP(1) | ROM_BIOS(3)) /* 390914-01 V1.03 CS-2100 U39 Copyright (C) 1990 CBM */ - // ROMX_LOAD( "390915-01.u38", 0x10001, 0x8000, CRC(ee4bad92) SHA1(6e02ef97a7ce336485814c06a1693bc099ce5cfb), ROM_SKIP(1) | ROM_BIOS(3)) /* 390915-01 V1.03 CS-2100 U38 Copyright (C) 1990 CBM */ - ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.03-390914-03.bin", 0x10000, 0x8000, CRC(8f849198) SHA1(550b04bac0d0807d6e95ec25391a81272779b41b), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.03-390915-03.bin", 0x10001, 0x8000, CRC(ebdd5097) SHA1(2e4d2375efb9c1ebc0ccf3bb1ff2bb64c449af32), ROM_SKIP(1) | ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "c386sxv104", "SL 386SX V1.04") // Rev. 1.04 - 390914-04/390915-04 - ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.04-390914-04.bin", 0x10000, 0x8000, CRC(377a8e1c) SHA1(9a36f10ad496e44f190937426f3e7de368d6ab7b), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.04-390915-04.bin", 0x10001, 0x8000, CRC(4149f5d9) SHA1(9a62b235ac45145ca6720d11b2cbc17b8c25704a), ROM_SKIP(1) | ROM_BIOS(4)) -ROM_END - -// Commodore 386SX-25 - Form factor: slimline desktop - Chipset: : VLSI 82C311, unreadable, Acer - CPU: i386sx-25, FPU socket provided - On board: Keyboard (DIN), mouse (mini DIN), par, -// 2xser, beeper, Floppy, IDE - VGA on board: acumos AVGA2-340-1 - Mass storage: 3.5" FDD, 80MB IDE HDD - RAM: 8xSIMM30 - OSC: 24.000MHz, 50.000MHz, unreadable - ISA16: 1 (for riser card) -ROM_START( c386sx25 ) // BIOS-String: Award Modular BIOS v4.20 (80386DX) Commodore 386sx-25 BIOS-Version 1.09 391443-09 - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "c386sx25_f000.rom", 0x10000, 0x10000, CRC(1322064d) SHA1(6ce16a956b8454d3746ccb923fac45924e4302a4)) - - ROM_REGION( 0x8000, "vga", 0) - ROM_LOAD( "c386sx25_c000.rom", 0x0000, 0x8000, CRC(92212c6b) SHA1(61d222872bf4e21de053705c267103e409adb0ab)) -ROM_END - -// Commodore Laptop C386SX-LT - screen remains blank -ROM_START( c386sxlt ) - ROM_REGION16_LE(0x20000, "bios", 0) // BIOS contains Cirrus Logic VGA firmware, rebadged Sanyo MBC-18NB, but different versions exist - ROM_SYSTEM_BIOS(0, "c386sxlt_b400", "C386SX-LT V1.2 B400") - ROMX_LOAD( "cbm-386lt-bios-v1.2-390981-03-b400.bin", 0x00000, 0x20000, CRC(b84f6883) SHA1(3f31060726c7c49a891b35ab024524a4239eb4d0), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "c386sxlt_cf00", "C386SX-LT V1.2 CF00") - ROMX_LOAD( "cbm-386lt-bios-v1.2-390982-03-cf00.bin", 0x00000, 0x20000, CRC(c8cd2641) SHA1(18e55bff494c42389dfb445f2bc11e78db30e5f7), ROM_BIOS(1)) -ROM_END - -// Commodore DT386 -ROM_START( dt386 ) - // BIOS-String: 40-0502-DG1112-00101111-070791-SOLUTION-0 / 386DX-33 BIOS V1.00 #391560-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "dt386vp10", "DT386 V.pre 1.0") - ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-vpre1.0-391560-01.bin", 0x10000, 0x10000, CRC(600472f4) SHA1(2513c8bdb24fe27f73c82cbca9e1a983e4a0ba10), ROM_BIOS(0)) - // BIOS-String: 40-0500-DG112-00101111-070791-SOLUTION-0 / 386DX-33 Rev.1E (091592) - ROM_SYSTEM_BIOS(1, "dt386v1e", "DT386 V.1e") - ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v-xxxxxx-xx.bin", 0x10000, 0x10000, CRC(dc1ca1b5) SHA1(7441cb9d5ad5ca6e6425de73295eb74d1281929f), ROM_BIOS(1)) - // BIOS-String: 40-0500-DG1112-00101111-070791-SOLUTION-0 / 386DX-33 Rev.1E (091592) / Commodore BIOS Version 1.0 391560-01 - ROM_SYSTEM_BIOS(2, "dt386v10", "DT386 V.1.0") - ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v1.00-391560-01.bin", 0x10000, 0x10000, CRC(da1f7e6d) SHA1(b825fc015233e7eef93a3abbdfc3eeb0da096f50), ROM_BIOS(2)) - // BIOS-String: 40-0501-DG1112-00101111-070791-SOLUTION-0 / Commodore 386DX-33 BIOS Rev. 1.01 391560-02 - ROM_SYSTEM_BIOS(3, "dt386v101", "DT386 V.1.01") - ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v1.01-391560-02.bin", 0x10000, 0x10000, CRC(b3157f57) SHA1(a1a96c8d111e3c1da8f655b4b7e1c5be4af140e9), ROM_BIOS(3)) -ROM_END - -// Commodore DT486 - BIOS contains Paradise VGA ROM - Keyboard error -ROM_START( dt486 ) // BIOS string: 41-0102-001283-00111111-060692-SYM_486-0 - Commodore 486DX-33 BIOS Version 1.01 391521-02 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "dt486", "DT486") - ROM_LOAD( "cbm-dt486dx-33c-bios-u32--v1.01-391521-02.bin", 0x00000, 0x20000, BAD_DUMP CRC(a3977625) SHA1(83bc563fb41eae3dd5d260f13c6fe8979a77e99c)) -ROM_END - -// Commodore PC 30-III -ROM_START( pc30iii ) // Chipset: MOS 5720 1788 41, Faraday FE3010B, FE3020, FE3000A, FE3030 - ISA8: 1, ISA16: 3 - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "pc30iii_v200", "PC 30-III v2.00") - ROMX_LOAD( "pc30iii_390339-02_3e58.bin", 0x18000, 0x4000, CRC(f4a5860e) SHA1(b843744fe928bcfd8e037b0208cc85c0746535cf),ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "pc30iii_390340-02_42a8.bin", 0x18001, 0x4000, CRC(934df54a) SHA1(3b1c8916ba2b2517bc9f26dd74254586bcf0e91d),ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "pc30iii_v201", "PC 30-III v2.01") - ROMX_LOAD( "cbm-pc30c-bios-lo-v2.01-390339-03-35c1.bin", 0x18000, 0x4000, CRC(36307aa9) SHA1(50237ffea703b867de426ab9ebc2af46bac1d0e1),ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "cbm-pc30c-bios-hi-v2.01-390340-03-3f3f.bin", 0x18001, 0x4000, CRC(41bae42d) SHA1(27d6ad9554be86359d44331f25591e3122a31519),ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Commodore PC 40-III -// Chipset: MOS 5720 3888 41, Faraday FE3010B, FE3000A, FE3030, FE3020 - onboard VGA is a Paradise PVGA1A - ISA8: 1, ISA16: 3 -ROM_START( pc40iii ) - // VGA BIOS - // ROM_LOAD( "pc40iii_390337-01_v2.0_f930.bin", 0x00000, 0x4000, CRC(82b210d3) SHA1(1380107deef02455c6ce4d12162fdc32e375cbde)) - // ROM_LOAD( "pc40iii_390338-01_v2.0_b6d0.bin", 0x00001, 0x4000, CRC(526d7424) SHA1(60511ca0e856b7611d556aa82219d646f96c9b94)) - - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "pc40iii_v200", "PC 40-III v2.00") - ROMX_LOAD( "pc40iii_390339-01_v2.0_473a.bin", 0x18000, 0x4000, CRC(2ad2dc0f) SHA1(b41d5988fda8cc23418c3f665d780c617aa3fc2b),ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "pc40iii_390340-01_v2.0_4bc6.bin", 0x18001, 0x4000, CRC(62dc7d93) SHA1(e741528697b1d00450fd18e3db8b925606e0bd22),ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "pc40iii_v201", "PC 40-III v2.03") - ROMX_LOAD( "cbm-pc40c-bios-lo-v2.03-390339-04-03bc.bin", 0x18000, 0x4000, CRC(e5fd11c6) SHA1(18c21d9a4ae687eef5464b76a0d614b9dfd30ec8),ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "cbm-pc40c-bios-hi-v2.03-390340-04-3344.bin", 0x18001, 0x4000, CRC(63d6f0f7) SHA1(a88dee7694baa71913acbe76cb4e2a4e95979ad9),ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Commodore PC 45-III - this is a PC 40-III with a BIOS update and a bigger, 52MB, harddisk -ROM_START( pc45iii ) - ROM_REGION16_LE(0x20000, "bios", 0) // Commodore 286 BIOS Rev. 2.04 - 390339-05/390340-05 - ROM_LOAD16_BYTE( "cbm-pc45c-bios-lo-v2.04-390339-05.bin", 0x18000, 0x4000, CRC(b87b4cd1) SHA1(a6723d63a255b4010ad32b5dc9797e4724a64c14)) - ROM_LOAD16_BYTE( "cbm-pc45c-bios-hi-v2.04-390340-05.bin", 0x18001, 0x4000, CRC(b6976111) SHA1(e7c92307db3969a6a50ffd8cbc3d2ed16b4df6ad)) -ROM_END - -// Commodore PC 50-II - a photo of the mainboard shows four ROMs (two each for BIOS and VGA), so the 128K dumps available were probably made from a running system. -ROM_START( pc50ii ) // Chipset: Chips P82C211-12 C(16MHz), P82C212B-12 (16MHz), P82C215-12, P82C206, VLSI 8942VT - ISA8: 1, ISA16: 5 - ROM_REGION16_LE(0x20000, "bios", 0) // keyboard MCU is P8042AH MITAC V2.48 (undumped), onboard video PVGA1A-JK - // 0: Commodore PC50-II BIOS Rev1.0 - 609200-03 - ROM_SYSTEM_BIOS(0, "pc50iiv100", "PC 50-II V1.00") // complains "Time-of-day clock stopped" and reboots - ROMX_LOAD( "cbm-pc50b-bios-lo-v1.00-390339-01.bin", 0x10001, 0x8000, CRC(0f0e2fd6) SHA1(61a8043ac919c2a8fe668bf25e5f0b67868d11ae),ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "cbm-pc50b-bios-hi-v1.00-390340-01.bin", 0x10000, 0x8000, CRC(87008421) SHA1(cf41973a7bd439441baec1138dd63044fafe7391),ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: Commodore PC50-II BIOS Rev1.01 - 609200-03 - ROM_SYSTEM_BIOS(1, "pc50iiv101", "PC 50-II V1.01") // same behaviour as above - ROMX_LOAD( "cbm-pc50b-bios-lo-u31-v1.01-xxxxxx-xx-a800.bin", 0x10001, 0x8000, CRC(bf2c7009) SHA1(6b94df37861b30ef6a39a4ed64d4c9ac1e96043a),ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "cbm-pc50b-bios-hi-u28-v1.01-xxxxxx-xx-cd00.bin", 0x10000, 0x8000, CRC(628fcb2f) SHA1(74241cbcb4e183015d5e7a516d46b08d6f47504a),ROM_SKIP(1) | ROM_BIOS(1) ) - // 2: Commodore PC50-II BIOS Rev1.02 - 609200-03 - ROM_SYSTEM_BIOS(2, "pc50iiv102", "PC 50-II V1.02") // same behaviour as above - ROMX_LOAD( "cbm-pc50b-bios-lo-u32-v1.02-609200-03o-9e00.bin", 0x10001, 0x8000, CRC(57225c22) SHA1(3b2ded119480ce2dd5bb7c113c5814ce47e17d4c),ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "cbm-pc50b-bios-hi-u27-v1.02-609200-03e-c400.bin", 0x10000, 0x8000, CRC(4ec903af) SHA1(fb70e22c0538d7310c9034626d4d9c0e4f63dfd7),ROM_SKIP(1) | ROM_BIOS(2)) - - // VGA BIOS - // ROM_LOAD( "m_pc50-ii_1bad_pvgadk_odd.bin", 0x00000, 0x8000, CRC(f36eca7e) SHA1(4335fa4a4567cbc010ff2ffeb97a536ed93b0219)) - // ROM_LOAD( "m_pc50-ii_54e3_pvgadk_even.bin", 0x00001, 0x8000, CRC(01f6b964) SHA1(799a84ddde8a7672a6df9439bad6198ec3ff98ec)) -ROM_END - -// Commodore PC-60-III - complaining "time-of-day-clock stopped" - Phoenix P8242 '87 keyboard BIOS -ROM_START( pc60iii ) // onboard Paradise PVGA1A-JK, 2xRS232, 1xparallel, keyboard - ROM_REGION32_LE(0x20000, "bios", 0) // Chipset: Chips P82C301C, P82B305, P82A303, P82A304, Chips F82307, 25531/390423-1 COMBO SMC B9016, Commodore CSG, four MOSEL MS82C308-35JC, ISA16: 7, RAM card: 2 (up to 8MB, extended ISA connector) - // 0: Commodore PC60-III 80386 BIOS Rev. 1.2 - 390473-01/390474-01 - ROM_SYSTEM_BIOS(0, "pc60iiiv12", "PC60-III V1.2") - ROMX_LOAD( "cbm-pc60c-bios-lo_u73-v1.2-390473-01.bin", 0x00000, 0x10000, CRC(ff2cd8b3) SHA1(62e95f818c5016f4be2741872dc644999dee33ce),ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "cbm-pc60c-bios-hi_u67-v1.2-390474-01.bin", 0x00001, 0x10000, CRC(690fff4b) SHA1(adc262d40da64354c7c76b61f46d2c7ed35e9df9),ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: Commodore PC-60-III 80386/25MHz BIOS Rev. 1.3 390473-02/390474-02 - ROM_SYSTEM_BIOS(1, "pc60iiiv13", "PC60-III V1.3") - ROMX_LOAD( "cbm-pc60c-bios-lo-v1.30-390473-02.bin", 0x00000, 0x10000, CRC(3edd83e0) SHA1(3ebf393d6c33d9b8600f56c7be9eedb5aefb2645),ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "cbm-pc60c-bios-hi-v1.30-390474-02.bin", 0x00001, 0x10000, CRC(12209ac4) SHA1(76f271944894c77dde735da2b2ba065e81a99564),ROM_SKIP(1) | ROM_BIOS(1) ) - // 2: Commodore PC60-III 80386/25MHz BIOS rev.1.33 390473-04/390474-04 - ROM_SYSTEM_BIOS(2, "pc60iiiv133", "PC60-III V1.33") - ROMX_LOAD( "cbm-pc60-bios-lo-v1.33-390473-04.bin", 0x00000, 0x10000, CRC(afd0aae0) SHA1(7fa4388c939f30e603f0fc90f9512e500b282432),ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "cbm-pc60-bios-hi-v1.33-390474-04.bin", 0x00001, 0x10000, CRC(7b7958db) SHA1(d542c63ec0d17e1e87403ac01735e75ce58302a9),ROM_SKIP(1) | ROM_BIOS(2) ) - // 3: Commodore PC60-III 80386-25MHz BIOS Rev.1.3.5 - 390473-06/390474-06 - ROM_SYSTEM_BIOS(3, "pc60iiiv135", "PC60-III V1.3.5") - ROMX_LOAD( "cbm-pc60c-bios-lo-v1.35-390473-06.bin", 0x00000, 0x10000, CRC(6ff4aea9) SHA1(3fcb3a5c275dbfb93c3e55224d731f1b52343d4b),ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "cbm-pc60c-bios-hi-v1.35-390474-06.bin", 0x00001, 0x10000, CRC(5a04e3f0) SHA1(311a3ff3e578ecbce0ecd9f3b006ab772623255a),ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: Commodore 80386 BIOS Rev.1.36 - 390473-07/390474-07 - ROM_SYSTEM_BIOS(4, "c386v136", "Commodore 386 V1.3.6") - ROMX_LOAD( "cbm-pc60c-bios-lo-v1.36-390473-07-9b0e.bin", 0x00000, 0x10000, CRC(be7504f8) SHA1(a45f7690a41d416bc10ca6f583b8fdd2219a3d8a),ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "cbm-pc60c-bios-hi-v1.36-390474-07-ddf2.bin", 0x00001, 0x10000, CRC(d8e08ffa) SHA1(fb5fb973b01df6e486d76076d3373583758b1d01),ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: Commodore 80386 BIOS Rev.1.36.03 - 390473-07/390474-07 - ROM_SYSTEM_BIOS(5, "c386v13603", "Commodore 386 V1.3.603") - ROMX_LOAD( "cbm-pc60c-bios-lo-v1.3603-390473-07.bin", 0x00000, 0x10000, CRC(2cda07c7) SHA1(01fd6260192541dd73f88d2cc0f99fe5603efc81),ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "cbm-pc60c-bios-hi-v1.3603-390474-07.bin", 0x00001, 0x10000, CRC(39845b9b) SHA1(9d3cbfde4b2acc1d576aafa80126b75a49d3d8df),ROM_SKIP(1) | ROM_BIOS(5) ) -ROM_END - -// Commodore PC-70-III - complaining "time-of-day-clock stopped" -ROM_START( pc70iii ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Commodore 80486 BIOS Rev.1.00 - 390934-01/390935-01 - ROM_SYSTEM_BIOS(0, "pc70v100", "PC70 V1.00") - ROMX_LOAD("cbm-pc70c_bios-u117-lo-v1.00-390934-01.bin", 0x00000, 0x10000, CRC(3eafd811) SHA1(4deecd5dc429ab09e7c0d308250cb716f8b8e42a), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("cbm-pc70c_bios-u112-hi-v1.00-390935-01.bin", 0x00001, 0x10000, CRC(2d1dfec9) SHA1(d799b3579577108549d9d4138a8a32c35ac3ce1c), ROM_SKIP(1) | ROM_BIOS(0)) - // 1: Commodore PC70-III 80486/25MHz BIOS Rev.1.00.01 - xxxxxx - 00/xxxxxx-00 - ROM_SYSTEM_BIOS(1, "pc70v101", "PC70 V1.00.01") - ROMX_LOAD("cbm-pc70c-bios-lo-v1.00.01-xxxxxx-00.bin", 0x00000, 0x10000, CRC(6c8bbd31) SHA1(63d1739a58a0d441ebdd543e3994984c433aedb4), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("cbm-pc70c-bios-hi-v1.00.01-xxxxxx-00.bin", 0x00001, 0x10000, CRC(ef279cdd) SHA1(d250368b2f731e842d6f280a6134f1e38846874b), ROM_SKIP(1) | ROM_BIOS(1)) -ROM_END - -// Commodore Tower 386 -ROM_START( comt386 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // Phoenix 80386 ROM BIOS PLUS Version 1.10 22 - Twinhead International Corporation - ROM_LOAD16_BYTE( "cbm-t386-bios-lo-v1.1022c-.bin", 0x10000, 0x8000, CRC(6857777e) SHA1(e80dbffd3523c9a1b027f57138c55768fc8328a6)) - ROM_LOAD16_BYTE( "cbm-t386-bios-hi-v1.1022c-.bin", 0x10001, 0x8000, CRC(6a321a7e) SHA1(c350fb273522f742c6008deda00ed13947a269b7)) -ROM_END - -// Commodore Tower 486 -ROM_START( comt486 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0500-DG1112-00101111-070791-SOLUTION-0 - 4D3FF Rev.D (092892) - ROM_SYSTEM_BIOS(0, "v0", "Tower 486 V0") - ROMX_LOAD( "cbm-t486dx-bios-v-xxxxxx-xx.bin", 0x10000, 0x10000, CRC(f51c0ca0) SHA1(2b08a606ae2f37b3e72d687f890d729a58fd3ccd), ROM_BIOS(0)) - // continuous chirps - ROM_SYSTEM_BIOS(1, "v1", "Tower 486 V1") - ROMX_LOAD( "cbm-t486dx-66-bios-v1.01-391566-02.bin", 0x10000, 0x10000, CRC(3d740698) SHA1(888f23d85b41c07e15e2811b76194cf478bc80cd), ROM_BIOS(1)) - // BIOS-String: 40-0103-001283-00101111-0606-SYM_486-0 - Commodore 486DX2-66 BIOS Version 1.03 391684-02 - ROM_SYSTEM_BIOS(2, "v2", "Tower 486 V2") - ROMX_LOAD( "cbm-t486dx-66-bios-v1.03-391684-02.bin", 0x10000, 0x10000, CRC(13e8b04b) SHA1(dc5c84d228f802f7580b3f3b8e70cf8f74de5d79), ROM_BIOS(2)) - // BIOS-String: 40-0103-001283-00101111-060692-SYM_486-0 - Commodore 486DX-50 BIOS Version 1.03 391522-03 - ROM_SYSTEM_BIOS(3, "v3", "Tower 486 V3") - ROMX_LOAD( "cbm-t486dx-50-bios-v1.03-.bin", 0x10000, 0x10000, CRC(e02bb928) SHA1(6ea121b214403390d382ca4685cfabcbcca1a28b), ROM_BIOS(3)) -ROM_END - - -//************************************************************************** -// 80286 BIOS -//************************************************************************** - -ROM_START( at ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS-String: D286-0011-110387 - ROM_SYSTEM_BIOS(0, "at", "PC 286") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 03-11-1987)*/ - ROMX_LOAD( "at110387.1", 0x10001, 0x8000, CRC(679296a7) SHA1(ae891314cac614dfece686d8e1d74f4763cf40e3),ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "at110387.0", 0x10000, 0x8000, CRC(65ae1f97) SHA1(91a29c7deecf7a9afbba330e64e0eee9aafee4d1),ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS-String: S286-6181-101590-K0 - additional info from chukaev.ru54.com: UMC chipset - ROM_SYSTEM_BIOS(1, "ami206", "AMI C 206.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 15-10-1990)*/ - ROMX_LOAD( "amic206.bin", 0x10000, 0x10000,CRC(25a67c34) SHA1(91e9d8cdc2f1b40a601a23ceaff2189fd1245f3b), ROM_BIOS(1) ) - // 2: (BIOS release date:: 07-07-1991) - Chipset: Headland HT21/E - ROM_SYSTEM_BIOS(2, "amiht21", "AMI HT 21.1") /* as above */ - ROMX_LOAD( "ht21e.bin", 0x10000, 0x10000, CRC(e80f7fed) SHA1(62d958d98c95e9e4d1b290a6c1054ae98770f276), ROM_BIOS(2) ) - // 3: BIOS-String: D286-1430-040990-K0 - additional info from chukaev.ru54.com: Chipset: TI TACT8230... 1BPB, 2BPB, 3EPB - ISA8: 3, ISA16: 5 - ROM_SYSTEM_BIOS(3, "amip1", "AMI P.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 09-04-1990)*/ - ROMX_LOAD( "poisk-h.bin", 0x10001, 0x8000, CRC(83fd3f8c) SHA1(ca94850bbd949b97b11710629886b0ee69489a81),ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "poisk-l.bin", 0x10000, 0x8000, CRC(0b2ed291) SHA1(bb51a3f317cf4d429a6cfb44a46ca0ac39d9aaa7),ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: Award 286 Modular BIOS Version 3.11 - WINBOND - ROM_SYSTEM_BIOS(4, "aw201", "Award 201") /* (BIOS release date:: 21-11-1990) */ - ROMX_LOAD( "83201-5h.bin", 0x10001, 0x8000, CRC(968d1fc0) SHA1(dc4122a6c696f0b43e7894dc1b669346eed755d5),ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "83201-5l.bin", 0x10000, 0x8000, CRC(bf50a89a) SHA1(2349a1db6017a7fb0673e99d3680c8753407be8d),ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: Award 286 Modular BIOS V3.03 NFS 11/10/87" - T.M.C - ROM_SYSTEM_BIOS(5, "aw303", "Award 303 NFS") /* (BIOS release date:: 15-11-1985) */ - ROMX_LOAD( "aw303-hi.bin", 0x18001, 0x4000, CRC(78f32d7e) SHA1(1c88398fb171b33b7e6191bad63704ae85bfed8b), ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "aw303-lo.bin", 0x18000, 0x4000, CRC(3d2a70c0) SHA1(1329113bec514ed2a6d803067b1132744ef534dd), ROM_SKIP(1) | ROM_BIOS(5) ) - // 6: Award 286 Modular BIOS Version 3.03GS - ROM_SYSTEM_BIOS(6, "aw303gs", "Award 303GS") /* (BIOS release date:: 15-11-1985) */ - ROMX_LOAD( "aw303gs-hi.bin", 0x18001, 0x4000, CRC(82392e18) SHA1(042453b7b29933a1b72301d21fcf8fa6b293c9c9), ROM_SKIP(1) | ROM_BIOS(6) ) - ROMX_LOAD( "aw303gs-lo.bin", 0x18000, 0x4000, CRC(a4cf8ba1) SHA1(b73e34be3b2754aaed1ac06471f4441fea06c67c), ROM_SKIP(1) | ROM_BIOS(6) ) - // 7: BIOS-String: D286-6069-040990-K0 - ROM_SYSTEM_BIOS(7, "ami_200960", "AMI 200960") /* (BIOS release date:: 09-04-1990 */ - ROMX_LOAD( "ami_286_bios_sn200960_even.bin", 0x10000, 0x8000, CRC(67745815) SHA1(ca6886c7a0716a92a8720fc71ff2d95328c467a5), ROM_SKIP(1) | ROM_BIOS(7) ) - ROMX_LOAD( "ami_286_bios_sn200960_odd.bin", 0x10001, 0x8000, CRC(360a5f73) SHA1(1b1980fd99779d0cdc4764928a641e081b35ee9f), ROM_SKIP(1) | ROM_BIOS(7) ) - // 8: BIOS-String: DVL2-1160-040990-K0 - ROM_SYSTEM_BIOS(8, "dvl2", "DVL2") /* (BIOS release date:: 09-04-1990) */ - ROMX_LOAD( "ami_dvl2-1160-040990-k8_even.bin", 0x10000, 0x8000, CRC(86093016) SHA1(f60b2679c8c23a34bdd64f25d83cb5a5a337bd57), ROM_SKIP(1) | ROM_BIOS(8) ) - ROMX_LOAD( "ami_dvl2-1160-040990-k8_odd.bin", 0x10001, 0x8000, CRC(4e1c944a) SHA1(0763a0a1002baced071fea301f627d2e550878b8), ROM_SKIP(1) | ROM_BIOS(8) ) - // 9: DTK 286 BIOS Ver 3.18 07/01/88 - ROM_SYSTEM_BIOS(9, "dtk318", "DTK v3.18") /* (BIOS release date:: 11-03-1986) */ - ROMX_LOAD( "dtk_286_bios_ver3.18.bin", 0x18000, 0x8000, CRC(b4b8b59a) SHA1(73c12222f5003fdc8bbfee178b20c8dda2fe5cb4), ROM_BIOS(9) ) - // 10: BIOS-String: D286-6061-040990-K0 - ROM_SYSTEM_BIOS(10, "d286-k0", "AMI D286-K0") /* (BIOS release date:: 09-04-1990) */ - ROMX_LOAD( "ami_d286-6061-040990-k0.bin", 0x10000, 0x10000, CRC(1679c1b5) SHA1(9d95da3b40c5f13d096823f383aba099b3a77183), ROM_BIOS(10) ) - // 11: BIOS-String: S286-1169-030389-K0 for ACHIEVE MICROSYSTEMS - ROM_SYSTEM_BIOS(11, "s286-k0", "Achieve S286-K0") /* (BIOS release date:: 03-03-1989) */ - ROMX_LOAD( "ach_s286-1169-030389-k0_ev.bin", 0x10000, 0x8000, CRC(58f1f29c) SHA1(42f5189d12b75fad5e53ff472b4603c6fcbd46cd), ROM_SKIP(1) | ROM_BIOS(11) ) - ROMX_LOAD( "ach_s286-1169-030389-k0_od.bin", 0x10001, 0x8000, CRC(84bfc180) SHA1(2daa51b09c449712c9a737793b83754951e53a41), ROM_SKIP(1) | ROM_BIOS(11) ) - // 12: Award BIOS Version 3.01B - ROM_SYSTEM_BIOS(12, "awa301b", "Award BIOS Version 3.01B") /* (BIOS release date:: 01-01-1988) */ - ROMX_LOAD( "aw286lo.rom", 0x18000, 0x4000, CRC(5afbb4a2) SHA1(513fd75d90720820484fdd280e4a6c22a0ef238c), ROM_SKIP(1) | ROM_BIOS(12) ) - ROMX_LOAD( "aw286hi.rom", 0x18001, 0x4000, CRC(b2551251) SHA1(0c8bd12a3d54ae6d2ad0210b9ca4deca94be10ed), ROM_SKIP(1) | ROM_BIOS(12) ) - // 13: no screen display - ROM_SYSTEM_BIOS(13, "awa286", "awa286") /* (BIOS release date:: 21-11-1990) */ - ROMX_LOAD( "awd286lo.rom", 0x18000, 0x4000, CRC(d1a9c01f) SHA1(9123c6f76d85725036a0f8b9c6480142abea478f), ROM_SKIP(1) | ROM_BIOS(13) ) - ROMX_LOAD( "awd286hi.rom", 0x18001, 0x4000, CRC(b0bde4cc) SHA1(9c3fd2c0f69dde905d4e8f3be421374ef99682df), ROM_SKIP(1) | ROM_BIOS(13) ) - // 14: DTK 286 BIOS Ver. 3.01 07/24/87 - no screen display - ROM_SYSTEM_BIOS(14, "dtk286", "dtk286") /* (BIOS release date:: 11-03-1986) */ - ROMX_LOAD( "dtk286lo.rom", 0x18000, 0x4000, CRC(dfc70856) SHA1(39158e6ed50236d371277631e77d06f77fb0531e), ROM_SKIP(1) | ROM_BIOS(14) ) - ROMX_LOAD( "dtk286hi.rom", 0x18001, 0x4000, CRC(a98fc743) SHA1(fb9e330148cb5584f61c1febea71c53b6f9d61b7), ROM_SKIP(1) | ROM_BIOS(14) ) - // 15: Phoenix 80286 ROM BIOS Version 3.07 (R04) - ROM_SYSTEM_BIOS(15, "mitph307", "Mitac Phoenix v3.07") /* (BIOS release date:: 30-07-1987) */ - ROMX_LOAD( "mitac_phoenix_v3.07_even.bin", 0x10000, 0x8000, CRC(1c4becc9) SHA1(bfdea3f2a248312ed8cf4765a1a7dc1a2f7cecd8), ROM_SKIP(1) | ROM_BIOS(15) ) - ROMX_LOAD( "mitac_phoenix_v3.07_odd.bin", 0x10001, 0x8000, CRC(3ee16ed1) SHA1(b77e18e10e9187a01cb55c05b2a6e5311981ab56), ROM_SKIP(1) | ROM_BIOS(15) ) - // 16: BIOS-String: Pyramid Software Development Personal Computer AT Bios Version 2.14 - ROM_SYSTEM_BIOS(16, "precise", "Precise") /* (no regular BIOS release date) */ - ROMX_LOAD( "precise 860407_low.bin", 0x10000, 0x8000, CRC(d839c074) SHA1(473ca7b42914ce12f2d6c91afb0b2c2e65194489), ROM_SKIP(1) | ROM_BIOS(16) ) - ROMX_LOAD( "precise 860407_high.bin", 0x10001, 0x8000, CRC(b5e13c54) SHA1(07f5806fb53d0cb7ef7b54312fd6aa163d58b9a5), ROM_SKIP(1) | ROM_BIOS(16) ) - // ROM_LOAD( "precise_860407_keyboard_mcu.bin", 0x0000, 0x800, CRC(d1faad5c) SHA1(cb315a3da632c969012c298bb8e1cf8883b70501)) - // 17: Access Methods Inc. for Flying Triumph (AMI before they became American Megatrends) - BIOS String: Ref. no. 1406-061296 - // complains about "Channel-2 timer not funcional but boots - ROM_SYSTEM_BIOS(17, "ami_ft", "AMI Flying Triumph") /* (BIOS release date:: 12-06-1986) */ - ROMX_LOAD( "286_access_methods_rom2_32k.bin", 0x10000, 0x8000, CRC(749c65af) SHA1(7c6e9e217afe020b7b36785549fdbfb89de8f872), ROM_SKIP(1) | ROM_BIOS(17) ) - ROMX_LOAD( "286_access_methods_rom4_32k.bin", 0x10001, 0x8000, CRC(0f15581a) SHA1(2a22635f30388ca371f0f1f31652cfa647bb322d), ROM_SKIP(1) | ROM_BIOS(17) ) - // 18: MS-0010-2 - Phoenix ROM BIOS Version 3.06 - ROM_SYSTEM_BIOS(18, "ms-0010-2", "MS-0010-2") /* (BIOS release date:: 19-01-1987) (ISA8: 3, ISA16: 5) */ - ROMX_LOAD( "286-ms0010-2-lo_32k.bin", 0x10000, 0x8000, CRC(2c381474) SHA1(94b9825d412ea39d67857102a0375852b349fcd6), ROM_SKIP(1) | ROM_BIOS(18) ) - ROMX_LOAD( "286-ms0010-2-hi_32k.bin", 0x10001, 0x8000, CRC(4fdb8c64) SHA1(c2e7f88f0ac97ee5eed0c97864b7f1810e99ea26), ROM_SKIP(1) | ROM_BIOS(18) ) - // 19: M219 V2.1 - chipset: Toshiba CHIP2 TC6154AF - // BIOS-String: X0-0100-001437-00101111-060692-M219-0 - ROM_SYSTEM_BIOS(19, "m219", "Toshiba M219") - ROMX_LOAD( "3tcm001.bin", 0x10000, 0x10000, CRC(146a42e9) SHA1(cf511919f271e868e34881912c0a1a859d80f91e), ROM_BIOS(19)) - // ***** Motherboards using the original Chips CS8220 chipset: P82C202, P82C201, P82A203, P82A204, P82A205 - // 20: AL-6410 (found online, no markings on the board itself), Chipset: Chips P82A204, P82A203, P82A205, P82C201, P82C202 - ROM_SYSTEM_BIOS(20, "al6410", "AL-6410") /* (BIOS-String: D286-1103-110387-K0) (BIOS release date:: 03-11-1987) (ISA8: 2, ISA16: 6) */ - ROMX_LOAD( "al-6410_ami_bios_low.bin", 0x10000, 0x8000, CRC(50c4e121) SHA1(5f9c27aabdc6bb810e90bced2053b7c21c4994dd), ROM_SKIP(1) | ROM_BIOS(20) ) - ROMX_LOAD( "al-6410_ami_bios_high.bin", 0x10001, 0x8000, CRC(a44be083) SHA1(99f73d7ceb315eb3770c94d90228f8859cadc610), ROM_SKIP(1) | ROM_BIOS(20) ) - // 21: AT SYSTEM 6M/8M/10M - Chipset: Chips P82A205; P82C201; P82A203; P82A204 - ISA8:2, ISA16: 6 - ROM_SYSTEM_BIOS(21, "at6m8m10m", "AT SYSTEM 6M/8M/10M") // (BIOS release date:: 04-02-1987) - OSC: 20.000000MHz - MQ-14.3 - 12.000 - ROMX_LOAD( "286-at system 6m8m10m-l_32k.bin", 0x10000, 0x8000, CRC(37e0e1c1) SHA1(f5cd17658554a73bb86c5c8e630dac3e34b38e51), ROM_SKIP(1) | ROM_BIOS(21) ) - ROMX_LOAD( "286-at system 6m8m10m-r_32k.bin", 0x10001, 0x8000, CRC(c672efff) SHA1(7224bb6b4d25ef34bc0aa9d7c450baf9b47fd917), ROM_SKIP(1) | ROM_BIOS(21) ) - // 22: CDTEK - BIOS-String: DSUN-1202-042088-K0 286-BIOS AMI for CDTEK - ISA8:2, ISA16:6 - Chipset ICs plus SN76LS612N, RTC MC146818P - ROM_SYSTEM_BIOS(22, "cdtekchips", "CDTEK 286") // ISA8:2, ISA16: 6 - OSC: 12.000, 14.31818, 16000.00KHz - ROMX_LOAD( "286-cdtek2-even_32k.bin", 0x10000, 0x8000, CRC(94867e8d) SHA1(12e61cc8b875b57324c93276c9f6093f2bd0e277), ROM_SKIP(1) | ROM_BIOS(22) ) - ROMX_LOAD( "286-cdtek2-odd_32k.bin", 0x10001, 0x8000, CRC(153ed3bd) SHA1(10b711e0f0d79e0b6d181f24fe66544d2d72a310), ROM_SKIP(1) | ROM_BIOS(22) ) - // 23: This board looks identical to #2 but has different chips fitted: SN76LS612N = Zymos HCT612, Chips P82A204 = TACT80204FN, P82A203 = STK-5134, P82A205 = STK-5135, - // P82C201 = STK-5132, P82C202 = STK-5133 - BIOS-String: Phoenix 80286 ROM BIOS Version 3.06 - ROM_SYSTEM_BIOS(23, "286tact", "286 TACT") // OSC: 20.0000MHz, 14.31818 - 24.000MHz - ROMX_LOAD( "286-tact-320548-1_32k.bin", 0x10000, 0x8000, CRC(0b528d19) SHA1(15f5a94d89461655c0f74681bbae5745db009ac2), ROM_SKIP(1) | ROM_BIOS(23) ) - ROMX_LOAD( "286-tact-320548-2_32k.bin", 0x10001, 0x8000, CRC(418aa2d0) SHA1(b6af0b8aa595d8f8de6c0fc851bf1c226dcc7ca7), ROM_SKIP(1) | ROM_BIOS(23) ) - // 24: Tulip 286 CPU card - Chipset: TACT 82204FN, 82202N, Chips P82A205, P82C201, P82A203, SN74LS612N, HD146818P, 2xAM9517A-5PC, 2xP8259A - // CPU: AND N80L286-10, FPU socket provided - OSC: 16.000 - BIOS-String: - ROM_SYSTEM_BIOS(24, "286tu", "Tulip 286 CPU card") // no display - ROMX_LOAD( "tc7be.bin", 0x18000, 0x4000, CRC(260c6994) SHA1(a7e28c2978faaa9c5ccab32932ef1391c1b3d35a), ROM_SKIP(1) | ROM_BIOS(24) ) - ROMX_LOAD( "tc7bo.bin", 0x18001, 0x4000, CRC(c8373edc) SHA1(77ce220914863f482a3a983b43ff8ca8c72b470c), ROM_SKIP(1) | ROM_BIOS(24) ) -ROM_END - -ROM_START( atturbo ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS-String: 20-0001-001223-00101111-050591-KB-8042--0 - additional info from chukaev.ru54.com: Chipset: VLSI VL82C311L-FC4, VL82C113A-FC - ROM_SYSTEM_BIOS(0, "vl82c", "VL82C311L-FC4")/*(Motherboard Manufacturer: Biostar Microtech Corp.) (BIOS release date: 05-05-1991)*/ - ROMX_LOAD( "2vlm001.bin", 0x10000, 0x10000, CRC(f34d800a) SHA1(638aca592a0e525f957beb525e95ca666a994ee8), ROM_BIOS(0) ) - // 1: same as BIOS '1' in at - ROM_SYSTEM_BIOS(1, "ami206", "AMI C 206.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 15-10-1990)*/ - ROMX_LOAD( "amic206.bin", 0x10000, 0x10000,CRC(25a67c34) SHA1(91e9d8cdc2f1b40a601a23ceaff2189fd1245f3b), ROM_BIOS(1) ) - // 2: same as BIOS '7' in at - ROM_SYSTEM_BIOS(2, "amiht21", "AMI HT 21.1") /* not a bad dump, sets unknown probably chipset related registers at 0x1e8 before failing post */ - ROMX_LOAD( "ht21e.bin", 0x10000, 0x10000, CRC(e80f7fed) SHA1(62d958d98c95e9e4d1b290a6c1054ae98770f276), ROM_BIOS(2) ) - // 3: same as BIOS '8' in at - ROM_SYSTEM_BIOS(3, "amip1", "AMI P.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 09-04-1990)*/ - ROMX_LOAD( "poisk-h.bin", 0x10001, 0x8000, CRC(83fd3f8c) SHA1(ca94850bbd949b97b11710629886b0ee69489a81),ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "poisk-l.bin", 0x10000, 0x8000, CRC(0b2ed291) SHA1(bb51a3f317cf4d429a6cfb44a46ca0ac39d9aaa7),ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: BIOS-String: DG22-1131-040990-K0 / 286-BIOS G2 V1.1 6-28-90 - Headland GC102/GC113-PC/HT101A - CPU/FPU: N80286-12, IIT2C87-10 - ROM_SYSTEM_BIOS(4, "ami1131", "AMI-1131") /*(Motherboard Manufacturer: Elitegroup Computer Co., Ltd.) (BIOS release date:: 09-04-1990)*/ - ROMX_LOAD( "2hlm003h.bin", 0x10001, 0x8000, CRC(2babb42b) SHA1(3da6538f44b434cdec0cbdddd392ccfd34666f06),ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "2hlm003l.bin", 0x10000, 0x8000, CRC(317cbcbf) SHA1(1adad6280d8b07c2921fc5fc13ecaa10e6bfebdc),ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: same as BIOS '0' in at - ROM_SYSTEM_BIOS(5, "at", "PC 286") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 03-11-1987)*/ - ROMX_LOAD( "at110387.1", 0x10001, 0x8000, CRC(679296a7) SHA1(ae891314cac614dfece686d8e1d74f4763cf40e3),ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "at110387.0", 0x10000, 0x8000, CRC(65ae1f97) SHA1(91a29c7deecf7a9afbba330e64e0eee9aafee4d1),ROM_SKIP(1) | ROM_BIOS(5) ) - // 6 - ROM_SYSTEM_BIOS(6, "bravo", "AST Bravo/286") // fails with keyboard controller test, probably expects specific kbdc rom - ROMX_LOAD( "107000-704.bin", 0x10000, 0x8000, CRC(94faf87e) SHA1(abaafa6c2ae9b9fba95b244dcbcc1c752ac6c0a0),ROM_SKIP(1) | ROM_BIOS(6) ) - ROMX_LOAD( "107000-705.bin", 0x10001, 0x8000, CRC(e1263c1e) SHA1(b564f1043ef45ecbdf4f06bb500150ad992c2931),ROM_SKIP(1) | ROM_BIOS(6) ) - // ***** Motherboards using the original Chips CS8220 chipset: P82C202, P82C201, P82A203, P82A204, P82A205 - // 7 same as BIOS '20' in at - ROM_SYSTEM_BIOS(7, "al6410", "AL-6410") - ROMX_LOAD( "al-6410_ami_bios_low.bin", 0x10000, 0x8000, CRC(50c4e121) SHA1(5f9c27aabdc6bb810e90bced2053b7c21c4994dd), ROM_SKIP(1) | ROM_BIOS(7) ) - ROMX_LOAD( "al-6410_ami_bios_high.bin", 0x10001, 0x8000, CRC(a44be083) SHA1(99f73d7ceb315eb3770c94d90228f8859cadc610), ROM_SKIP(1) | ROM_BIOS(7) ) - // 8: same as BIOS '21' in at - ROM_SYSTEM_BIOS(8, "at6m8m10m", "AT SYSTEM 6M/8M/10M") - ROMX_LOAD( "286-at system 6m8m10m-l_32k.bin", 0x10000, 0x8000, CRC(37e0e1c1) SHA1(f5cd17658554a73bb86c5c8e630dac3e34b38e51), ROM_SKIP(1) | ROM_BIOS(8) ) - ROMX_LOAD( "286-at system 6m8m10m-r_32k.bin", 0x10001, 0x8000, CRC(c672efff) SHA1(7224bb6b4d25ef34bc0aa9d7c450baf9b47fd917), ROM_SKIP(1) | ROM_BIOS(8) ) - // 9: same as BIOS '22' in at - ROM_SYSTEM_BIOS(9, "cdtekchips", "CDTEK 286") - ROMX_LOAD( "286-cdtek2-even_32k.bin", 0x10000, 0x8000, CRC(94867e8d) SHA1(12e61cc8b875b57324c93276c9f6093f2bd0e277), ROM_SKIP(1) | ROM_BIOS(9) ) - ROMX_LOAD( "286-cdtek2-odd_32k.bin", 0x10001, 0x8000, CRC(153ed3bd) SHA1(10b711e0f0d79e0b6d181f24fe66544d2d72a310), ROM_SKIP(1) | ROM_BIOS(9) ) - // 10: same as BIOS '23' in at - ROM_SYSTEM_BIOS(10, "286tact", "286 TACT") - ROMX_LOAD( "286-tact-320548-1_32k.bin", 0x10000, 0x8000, CRC(0b528d19) SHA1(15f5a94d89461655c0f74681bbae5745db009ac2), ROM_SKIP(1) | ROM_BIOS(10) ) - ROMX_LOAD( "286-tact-320548-2_32k.bin", 0x10001, 0x8000, CRC(418aa2d0) SHA1(b6af0b8aa595d8f8de6c0fc851bf1c226dcc7ca7), ROM_SKIP(1) | ROM_BIOS(10) ) - // 11: BIOS-String: DG22-6080-091991-K0 / 286-BIOS (C) 1989 American Megatrends Inc / (C) 1991 TriGem Corporation - ROM_SYSTEM_BIOS(11, "tg286m", "TG286M") - ROMX_LOAD( "ami.bin", 0x10000, 0x10000, CRC(5751542a) SHA1(0fa0e86a0599e8500bb9ca9efa77cfc9c82a9dc0), ROM_BIOS(11)) - // 12: BIOS-String: 286 Modular BIOS Version B3.11.03 - REFRESH TIMING ERROR - ROM_SYSTEM_BIOS(12, "cl286", "CL286") - ROMX_LOAD( "award.bin", 0x10000, 0x10000, CRC(839a30b3) SHA1(c40a15c2636cf734e83ddf22213f637766f6456e), ROM_BIOS(12)) - // 13: BIOS-String: 286 Modular BIOS Version 3.03 Copyright Award Software Inc. - DIGICOM - // ID: Digicom DIGIS 286S Turbo8/10MHz - Chipset: Chips P82C201-10, P82A205, P82A204, P82C202, NS16450N, HCT612, MC146818P, 2xNEC D8237AC-5 - // FPU socket provided - RAM: 1MB (4x9xTMS4256-12) - BIOS: Award 286 BIOS - OSC: 20.000MHz, 16000.00KHz, 1.8432MHz, 14.31818 - ISA8: 3, ISA16: 4 - // Keyboard BIOS: AWARD - ROM_SYSTEM_BIOS(13, "digis286s", "DIGICOM DIGIS 286S") - ROMX_LOAD( "80286-286s_turbo_lo.bin", 0x10000, 0x8000, CRC(7ecc1082) SHA1(eb5231e169ab550749c44383da20ab049cdf2a6d), ROM_SKIP(1) | ROM_BIOS(13) ) - ROMX_LOAD( "80286-286s_turbo_hi.bin", 0x10001, 0x8000, CRC(bea8047e) SHA1(17eb6ab8dbc61e372acdda060b84bc4914980322), ROM_SKIP(1) | ROM_BIOS(13) ) -ROM_END - - -//************************************************************************** -// 80286 motherboard -//************************************************************************** - -// ID: Peacock computer S-286 Rev A - CPU: 80286, FPU socket provided - Chipset: TI TACT82204FN, STK5134, STK-5136, STK-5132, STK-5133 -// RAM: no onboard RAM, ISA8 socket marked "RAM-1" and "RAM-4", matching card "RAM-1A" with 1MB DIP - BIOS: Award 286 BIOS Q2093374 -// Keyboard BIOS: Award Q2093198 - OSC: "clock II F22/F28", "clock II F19/F29" - ISA8: 3, ISA16: 4 - DIP8: 01101000 -ROM_START( peas286 ) // BIOS-String: 286 Modular BIOS Version - REFRESH TIMING ERROR - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-s-286-peacock-lo.bin", 0x10000, 0x08000, CRC(78efd1d5) SHA1(3b6c5c6e77a3f77de1c81c0936d7fb2eab7b2487), ROM_SKIP(1) ) - ROMX_LOAD( "286-s-286-peacock-hi.bin", 0x10001, 0x08000, CRC(5b8ba43a) SHA1(a38ebb1d21f051065ede45643ed394cc5ac1dbf2), ROM_SKIP(1) ) -ROM_END - -// ID: PC CHIPS M209 - Chipset: UMC UM82C206L, PC 4L50F2052 - BIOS: AMI 286 BIOS 162020 CDTEK - Keyboard BIOS: AMI KEY BOARD BIOS 162020 CDTEK -// CPU:AMD N80L286-16/S - RAM: SIPP30x4, 1MB DIP - BIOS-ID: S286-6181-101590-K0 - ISA8: 1, ISA16: 6 - OSC: 33.333MHz, 14.31818 -ROM_START( pccm209 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "pcchips_m209_gq4x.bin", 0x10000, 0x08000, CRC(d1a68208) SHA1(58285d293f723507a5401e55c5e4e5d27681d824)) - ROM_CONTINUE( 0x10001, 0x08000 ) -ROM_END - -// ID: unknown - ASI 100B0, identified as “HAM 12 TI 286 Motherboard ZERO WAIT” - Chipset: Texas Instruments TACT82301PB, TACT82302PB, TACT82303PB (cf. at386sx) -// CPU: xxx, FPU: IIT 2C87-12 - RAM: 1MB in DIP, 4xSIPP30 - OSC: 24.000MHz, 14.31818 - ISA8: 3, ISA16: 5 -ROM_START( asi100b0 ) // BIOS-String: D286-1112-040990-K0 - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "asi286_signetics_s-27c256-20fa-l.bin", 0x10000, 0x08000, CRC(54505e72) SHA1(024edd1b435252db38274626c84904422cdb8787), ROM_SKIP(1) ) - ROMX_LOAD( "asi286_signetics_s-27c256-20fa-h.bin", 0x10001, 0x08000, CRC(9aff417a) SHA1(f74da97c797b0856ee6ff634c40eee6403416e4c), ROM_SKIP(1) ) -ROM_END - -// ID: Wearnes CL286-12/16S (CL286-12S and CL286-16S) - Chipset: Texas Instruments TACT82206FN / Micrel MIC9212CP, MIC9211CP, MIC9215CP, WD16C785-JT -// BIOS/Version: AMI 080190 - Keyboard BIOS: KB-BIOS-VER-F - Rom Type : NMC27C256Q x 2, CL286-12S 080190 EVEN CS8A11, CL286-12S 080190 ODD CSD77D -// CPU: AMD N80L286-12/S, FPU socket provided - RAM: 1MB (8xKM44C256AP-8), 4xSIMM30 - ISA8: 1, ISA18: 5 - On board: Floppy, IDE, par, 2xser -ROM_START( cl28612s ) // dies after initialising the graphics card - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "cl286-12s16s_even.bin", 0x10000, 0x08000, CRC(0e8d1b02) SHA1(43339afd2ce0acc38074359b81629658cc6936f6), ROM_SKIP(1) ) - ROMX_LOAD( "cl286-12s16s_odd.bin", 0x10001, 0x08000, CRC(09e35644) SHA1(cc5ca52cbf0b5fe4c315ce725715f759e6ca4f63), ROM_SKIP(1) ) -ROM_END - -// TD60C - chipset: CITYGATE D90-272 - BIOS: AMI 286 BIOS, EE265746 - Keyboard-BIOS: JETkey V3.0 -// BIOS-String: 30-0101-429999-00101111-050591-D90-0 / TD60C BIOS VERSION 2.42B - ISA16: 6 - CPU: CS80C286, FPU: i287XL -ROM_START( td60c ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "2cgm001.bin", 0x10000, 0x8000, CRC(35e4898b) SHA1(7ef8e097e010ec8dff9e33c4b42a278ff736059c)) - ROM_CONTINUE( 0x10001, 0x8000 ) -ROM_END - -// BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10.01 - CPU: AMD N80L286-16/S / FPU: socket provided - RAM: 640KB DIP / 4xSIPP30 -// Chipset: SUNTAC ST62??? ST62C303-A - BIOS: Phoenix - Keyboard-BIOS: NEC D8041AHC - ISA16: 4 - ISA8: 2 - OSC: [unreadable] - 32.000 MHz -ROM_START( suntac303 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "286-suntac-2055712.bin", 0x10000, 0x8000, CRC(407b89d8) SHA1(d419bdd8bfb6191c68254204efdd756c5131701c)) - ROM_CONTINUE( 0x10001, 0x8000 ) -ROM_END - -// Olivetti M203 motherboard - complains about "Timer Sync Error" -// on board Paradise PVGA1A VGA chip - Chipset: 2 TACT chips, one VLSI chip - one 16bit ISA "slot" in pin strip form intended for an expansion module -ROM_START( olim203 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-olivetti-m203-low.bin", 0x00000, 0x10000, CRC(d683dc20) SHA1(04271529139724d7a091490658b186b59a83676f), ROM_SKIP(1) ) - ROMX_LOAD( "286-olivetti-m203-high.bin", 0x00001, 0x10000, CRC(c7324ecf) SHA1(fa5ee92c21e54ec711d01b211760521a71ef424d), ROM_SKIP(1) ) -ROM_END - -// Snobol Mini 286 - BIOS-String: DGS2-1402-101090-K0 -// Chipset: GST GOLD GS62C101 and GS62C102 -ROM_START( snomi286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "gst_286.bin", 0x10000, 0x8000, CRC(89db769b) SHA1(3996856d637dc379978c0b5eb79362f46b60a80f) ) - ROM_CONTINUE( 0x10001, 0x8000) -ROM_END - -// PC-Chips M205 - Chipset: PCChips 4L50F2052 aka PCCHIP1 - ISA8: 3, ISA16: 5 -// the 64K ROM has first the 32K even, then the 32K odd part -// BIOS-String: S286-6181-101590-K0 -ROM_START( pccm205 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: v2.25, 17 January, 1991 (C) 1990 PC Chips INC. - ROM_SYSTEM_BIOS(0, "v225", "PC Chips v2.25") - ROMX_LOAD( "m205.bin", 0x10000, 0x8000, CRC(6f7bc8d6) SHA1(14062505b316e0d4409fb4e502651e09fea0a4c1), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_CONTINUE( 0x10001, 0x8000) - // 1: v2.23, 29 December, 1990 (C) 1990 EVER-SUCCESS SYSTEMS LTD. - ROM_SYSTEM_BIOS(1, "v223", "Ever-Success Systems v2.23") - ROMX_LOAD( "m205_odd.bin", 0x10000, 0x8000, CRC(3a8ed558) SHA1(0648a2f1674bb07a175b983f107bb72c38ac1e61), ROM_SKIP(1) | ROM_BIOS(1) ) - ROM_CONTINUE( 0x10001, 0x8000) -ROM_END - -// PC-Chips M216 REV 1.2 - Chipset PC CHIPS CHIP 3 - CPU: Harris CS80C286-20, IIT 2C87-10 -// BIOS: AMI ; 07/07/91; S/NO. 0245157 - ISA16: 6 - BIOS-String: 30-0000-ZZ1437-00101111-070791-PC CHIPS-8 -ROM_START( pccm216 ) // no display - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "2pcm001.bin", 0x10000, 0x10000, CRC(9c7c9f05) SHA1(39cb6645d9aab846f7e64d1d44610ea3cbe52581)) -ROM_END - -// Unknown 80C286 motherboard (RAM: 4xSIMM30, 1MB DIP, ISA16: 6) - CPU: Harris CS80C286-16, FPU: 80287 - OSC: 32.000MHz, 14.31818 -// SARC RC2015; HM6818P; 82C042 or JETkey Keyboard BIOS; 1MB onboard RAM (8x LH64256AD-80) -ROM_START( sarcpc ) - ROM_REGION16_LE(0x20000, "bios", 0) // 27C512 - // BIOS-String: 20-0300-00834-00101111-050591-SARC286 / [80286 Standard System 2V1] - //ROM_SYSTEM_BIOS(0, "sarcrev12", "SARC Rev. 1.2") - ROM_LOAD( "sarcrev12.bin", 0x10000, 0x10000, CRC(1c5e3f2d) SHA1(1fcc8b1b9d9383467223dd41e420f9352beca654) ) -ROM_END - -// Everex EV-1806 (6 16-bit ISA, 1 8-bit ISA) - OSC: 14.31818MHz, 24.000MHz, 30.000MHz - RAM: 4 banks of 9xKM41C256P-8, sockets for 1MBit chips provided -// Everex IC-00121-0 + IC-00122-0; CHIPS P82C206; Intel 8272A(?); 146818A RTC -ROM_START( ev1806 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "everex_ev-1806_rev-f1a-21_even_u62.bin", 0x18000, 0x4000, CRC(7364e49b) SHA1(e8f5f41514005da0e36792e009cf3eae51c19c20), ROM_SKIP(1) ) - ROMX_LOAD( "everex_ev-1806_rev-f1a-21_odd_u61.bin", 0x18001, 0x4000, CRC(05c87bf7) SHA1(8c2243d9ee3d2af1517dc1134a22a7d1ed11262f), ROM_SKIP(1) ) -ROM_END - - -// MAT286 REV.D (5 16-bit ISA, 1 8-bit ISA, RAM: DIP 1MB, 2xSIPP30) - CPU: Siemens SAB 80286-16-N - OSC: 32.000MHz, 14.31818 -// Headland Technology HT12P-16/A; HM6818P RTC; JETkey keyboard BIOS; unmarked 40-pin DIP (prob. 80287) -ROM_START( mat286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // BIOS-String: DH12-1112-061390-K0 - HT-12 286 BIOS - Board is also used in Polish Optimus 286 computer with a special Hercules character ROM (also available) - // Files separated from single BIOS64 dump (PCB photo shows split ROMs are used) - ROMX_LOAD( "9221fkf_imp23256_ami-l.bin", 0x10000, 0x08000, CRC(55deb5c2) SHA1(19ce1a7cc985b5895c585e39211475de2e3b0dd1), ROM_SKIP(1) ) - ROMX_LOAD( "9221gjf_imp23256_ami-h.bin", 0x10001, 0x08000, CRC(04a2cec4) SHA1(564d37a8b2c0f4d0e23cd1e280a09d47c9945da8), ROM_SKIP(1) ) -ROM_END - -ROM_START( ec1842 ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "4202004.bin", 0x1c001, 0x2000, CRC(33fb5382) SHA1(35eb62328324d93e7a06f2f9d1ad0002f83fc99b)) - ROM_LOAD16_BYTE( "4202005.bin", 0x1c000, 0x2000, CRC(8e05c119) SHA1(9d81613b4fc305c14ae9fda0b1dd97a290715530)) - ROM_LOAD16_BYTE( "4202006.bin", 0x18001, 0x2000, CRC(6da537ef) SHA1(f79feb433dcf41f5cdef52b845e3550d5f0fb5c0)) - ROM_LOAD16_BYTE( "4202007.bin", 0x18000, 0x2000, CRC(d6ee0e95) SHA1(6fd4c42190e879501198fede70ae43bc420681d0)) - // EGA ROM - //ROM_LOAD16_BYTE( "4200009.bin", 0xc0000, 0x2000, CRC(9deeb39f) SHA1(255b859d3ea05891aa65a4a742ecaba744dfc923)) - //ROM_LOAD16_BYTE( "4200010.bin", 0xc0001, 0x2000, CRC(f2c38d93) SHA1(dcb3741d06089bf1a80cb766a6b94029ad698d73)) -ROM_END - -ROM_START( ec1849 ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "cpu-card_27c256_015.rom", 0x10000, 0x8000, CRC(68eadf0a) SHA1(903a7f1c3ebc6b27c31b512b2908c483608b5c13)) - ROM_LOAD16_BYTE( "cpu-card_27c256_016.rom", 0x10001, 0x8000, CRC(bc3924d6) SHA1(596be415e6c2bc4ff30a187f146664531565712c)) - //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_040.rom", 0xc0001, 0x2000, CRC(a3ece315) SHA1(e800e11c3b1b6fcaf41bfb7d4058a9d34fdd2b3f)) - //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_041.rom", 0xc0000, 0x2000, CRC(b0a2ba7f) SHA1(c8160e8bc97cd391558f1dddd3fd3ec4a19d030c)) -ROM_END - -// Morse KP-286 -// BIOS-String: DS24-1216-061390-K0 -// Chipset: SUNTAC ST62C211 and ST62C203-A -ROM_START ( mkp286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-morse_kp286_lo.bin", 0x10000, 0x8000, CRC(0d35d2c9) SHA1(52b366608ea25a96d8e27c5d77689688fff38609), ROM_SKIP(1) ) - ROMX_LOAD( "286-morse_kp286_hi.bin", 0x10001, 0x8000, CRC(a5f640e0) SHA1(7bbb7fce54079005cb691816d2301a3eda475a82), ROM_SKIP(1) ) -ROM_END - - -// WYSEpc 286 - motherboard: WY-2200-01 - continuous ticks from the speaker -ROM_START( wy220001 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "wyse_tech_rev.a_250325-02_27128-15.bin", 0x18000, 0x4000, CRC(010f1c4d) SHA1(712d6ca4e4bdbc6b105c8691d612407edcfd9cf7), ROM_SKIP(1)) - ROMX_LOAD( "wyse_tech_rev.a_250326-02_27128-15.bin", 0x18001, 0x4000, CRC(37fcd62b) SHA1(ada0e232387c8ba7067168f50f8b7a89eb824c44), ROM_SKIP(1)) -ROM_END - - -// ***** 286 mainboards using the Chips & Technologies CS8221 NEAT chipset: P82C211 + P82C212 + P82C215 + P82C206 - -ROM_START( neat ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS-String: ENET-1131-030389-K0 - ROM_SYSTEM_BIOS(0, "neat286", "NEAT 286") - ROMX_LOAD( "at030389.0", 0x10000, 0x8000, CRC(4c36e61d) SHA1(094e8d5e6819889163cb22a2cf559186de782582),ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "at030389.1", 0x10001, 0x8000, CRC(4e90f294) SHA1(18c21fd8d7e959e2292a9afbbaf78310f9cad12f),ROM_SKIP(1) | ROM_BIOS(0)) - // 1: Phoenix 80286 ROM BIOS PLUS Version 3.10 12 - High Performance 286 ROM BIOS Ver C.12 - ROM_SYSTEM_BIOS(1, "pb800", "Packard Bell PB800") - ROMX_LOAD( "3.10.12-1.bin", 0x10001, 0x8000, CRC(e6bb54c5) SHA1(fa5a376dd44696c78dcc8994e18938b5e1b3e45a),ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "3.10.12-2.bin", 0x10000, 0x8000, CRC(bde46933) SHA1(c7221192f48d6f2f5b773c3c7d2a52b635cb473e),ROM_SKIP(1) | ROM_BIOS(1)) - // 2: DTK Corp. 286 Computer - DTK 286 Chipset ROM BIOS Version 3.26 - #24062890N - ISA8: 3, ISA16: 5, RAM: 1MB DIP, 4xSIMM30 - ROM_SYSTEM_BIOS(2, "ptm1632c", "UNIT PTM1632C DTK V.3.26") - ROMX_LOAD( "ptm1632c_l.bin", 0x10000, 0x8000, CRC(df0bc27c) SHA1(f94e2decd13c285c23b6a61c035cab88fa00ba6e), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "ptm1632c_h.bin", 0x10001, 0x8000, CRC(a80136e0) SHA1(5edc2d387efb42cf70361197de808ce1b06d8aec), ROM_SKIP(1) | ROM_BIOS(2)) - // 3: BIOS-String: DTK Corp. 286 COMPUTER - (C) DTK NEAT BIOS Ver 3.25N2 06/06/89 - DTK PTM-1233C - Chipset: P82C211; P82C212B; P82C215 - BIOS: dtk 286E 8864 - IS8: 3 - ISA16: 5 - ROM_SYSTEM_BIOS(3, "ptm1233c", "DTK PTM-1233C") - ROMX_LOAD( "286-dtk ptm-1233c-low_32k.bin", 0x10000, 0x8000, CRC(8909164c) SHA1(51978929a690746c1956ca6b1f0412777dc5d35b), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "286-dtk ptm-1233c-high_32k.bin", 0x10001, 0x8000, CRC(9105968c) SHA1(737d4df8040655315a648fed8a8d574f39e7dc35), ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: 286-NEAT - BIOS-String: ENET-1131-040990-K0 - NEAT V3.2 6-18-90 - ISA8: 3, ISA16: 5 - ROM_SYSTEM_BIOS(4, "286neat", "286-NEAT") - ROMX_LOAD( "286-neat_neat012-l-verify.bin", 0x10000, 0x8000, CRC(591d226c) SHA1(7f42797ead8213022192bb2bbbe2de7f6796ac6f), ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "286-neat_neat012-h-verify.bin", 0x10001, 0x8000, CRC(0198e2e4) SHA1(10ced383b6dc00c2e98b7bed0782f59a9c266625), ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: AUVA VIP BAM/16-11 - BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 20 - ISA8:1, ISA16: 5, Memory Slot: 1 - ROM_SYSTEM_BIOS(5, "bam1611", "VIP BAM/16-11") // OSC: 18.432 - 14.318 - 32.000MHz - ROMX_LOAD( "286-vip bam-6-11 m215100-lo_32k.bin", 0x10000, 0x8000, CRC(b51b8bc1) SHA1(a7ebbced98aca32a7f0cdf80d1b832dfeb92d5e7), ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "286-vip bam-6-11 m215100-hi_32k.bin", 0x10001, 0x8000, CRC(46ddd5a6) SHA1(fd4267af298c7f70e062a7c4e023caf852bbf082), ROM_SKIP(1) | ROM_BIOS(5) ) - // 6: CP-805 - BIOS-String: ENET-1138-030390-K0 - ROM_SYSTEM_BIOS(6, "cp805", "CP-805") - ROMX_LOAD( "286-chips ami78384 even.bin", 0x10000, 0x8000, CRC(5280fee0) SHA1(25051ad6bbccddc0738861b614dbafbca5c3bff5), ROM_SKIP(1) | ROM_BIOS(6) ) - ROMX_LOAD( "286-chips ami78384 odd.bin", 0x10001, 0x8000, CRC(24526bf3) SHA1(8f8b46fe2e708fa53d0eeb44a16924cd878bdd33), ROM_SKIP(1) | ROM_BIOS(6) ) - // 7: BIOS-String: ENET-1107-040990-K0 - ROM_SYSTEM_BIOS(7, "ami211", "AMI 21.1") /*(Motherboard Manufacturer: Dataexpert Corp. Motherboard) (Neat 286 Bios, 82c21x Chipset ) (BIOS release date:: 09-04-1990)*/ - ROMX_LOAD( "ami211.bin", 0x10000, 0x10000,CRC(a0b5d269) SHA1(44db8227d35a09e39b93ed944f85dcddb0dd0d39), ROM_BIOS(7)) - // 8: BIOS-String: ENET-1230-043089-K0 - ROM_SYSTEM_BIOS(8, "amic21", "AMI C 21.1") /* (Motherboard Manufacturer: Unknown.) (Neat 286 Bios, 82c21x Chipset ) (BIOS release date:: 30-04-1989) */ - ROMX_LOAD( "amic21-2.bin", 0x10001, 0x8000, CRC(8ffe7752) SHA1(68215f07a170ee7bdcb3e52b370d470af1741f7e),ROM_SKIP(1) | ROM_BIOS(8) ) - ROMX_LOAD( "amic21-1.bin", 0x10000, 0x8000, CRC(a76497f6) SHA1(91b47d86967426945b2916cb40e76a8da2d31d54),ROM_SKIP(1) | ROM_BIOS(8) ) - // 9: BIOS-String: - AGC N286 - CPU: AMD N80L286-16/S, FPU socket provided - RAM: 36xTMC64C1024-80N (18pin), 36x16pin sockets provided as an alternative (2xBank 0, 2xBank 1), 4xSIPP30 (2xBank 0/2 and 2xBank 1/3) - // Chipset: Chips P82C212B-12, P82C206 H, P82C211-12 C, P82C215-12 - OSC: 20.000, 32.000MHz, 24.0000MHz, 32.768KHz, 14.31818 - BIOS: AMI 286 BIOS PLUS CO.NO.1190 - // Keyboard-BIOS: AMI KEYBOARD BIOS PLUS CO.NO. 1190 - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS(9, "n286", "N286")// stops after initialising the graphics card - ROMX_LOAD( "286-chips-ami1190-even_32k.bin", 0x10000, 0x8000, CRC(db941036) SHA1(994cced82b5fb5f8833c718b4226a7e9620b56df),ROM_SKIP(1) | ROM_BIOS(9) ) - ROMX_LOAD( "286-chips-ami1190-odd_32k.bin", 0x10001, 0x8000, CRC(71cfc2d1) SHA1(8b8cf81161aec3e2c7f653e5d3a6b4e9627663c6),ROM_SKIP(1) | ROM_BIOS(9) ) -ROM_END - -// Chaintech ELT-286B-160B(E) mainboards - NEAT chipset: Chips P82C206, P82C211C, P82C212B, P82C215 -ROM_START( elt286b ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS/Version: AWARD A2133130/21323132 - BIOS-String: 286 Modular BIOS Version 0N3.03 NFS / ELT - // Keyboard-BIOS: AWARD A21266586 - OSC: 24.000MHz, 12.000MHz, 20.000MHz, 14(... unreadable) - ISA8: 2, ISA16: 5 - ROM_SYSTEM_BIOS(0, "160b", "ELT-286B-160B") - ROMX_LOAD( "286-elt-286b-160b_l_32k.bin", 0x10000, 0x8000, CRC(4514a284) SHA1(0f9d4a24bdd0fb6aa15c7c1db860c4e6df632091), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "286-elt-286b-160b_h_32k.bin", 0x10001, 0x8000, CRC(109bbf7c) SHA1(88b6b1c7c08739f8b198f05adbe6edc24be35fd0), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS/Version: Phoenix 2061618 BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 20 / Phoenix C&T 8221 NEAT Dual Mode BIOS / ELT - // Keyboard-BIOS: Phoenix/Intel i8242 - ISA8: 2, ISA16: 5 - OSC: 32.000MHz, 24.000MHz, 14.31818MHz - ROM_SYSTEM_BIOS(1, "160eb", "ELT-286B-160BE") - ROMX_LOAD( "286-2061618 l_32k.bin", 0x10000, 0x8000, CRC(f89aabc4) SHA1(94472edc9692b9da6450fb12994d62230c8cc5c5), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "286-2061618 h_32k.bin", 0x10001, 0x8000, CRC(e23a60bf) SHA1(48af3f123d30cd2fde9e42f2c9a57eec143287b6), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Advanced Logic Research PWB 7270 REV E - Chipset: Chips P82C212B-12 A, P82C211-12 C, P82C215 A 16 MHz, P62C206 H1, UMC xxx, DP8473V -// CPU: AMD N80L286-16/S, FPU: Intel D80287, Conntector for 386/486 FEATURE - RAM: 1MB (8x514256), 2xSIMM30 - OSC: 32.000MHz, 24.0000MHz, 1.8432MHz, 14.31818 MHz -// BIOS: POWER FLEX+ 3.10.09 ODD CS0F00, POWER FLEX+ 3.10.09 EVEN CS8A00 - Keyboard BIOS: M5L8042 - On board: IDE, keyboard, 2x25pin (ser/par?) - ISA16: 5 -// BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 09 - Advanced Logic Research, Inc. PowerFlex PLUS 286/386sx -// Timer chip counter 2 failed, Keyboard failure -ROM_START( pwb7270e ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "alreven.bin", 0x10000, 0x08000, CRC(b6428bae) SHA1(4e6e6eec67ff62cf8b4a3ce500bd15a54ee3d5fe), ROM_SKIP(1) ) - ROMX_LOAD( "alrodd.bin", 0x10001, 0x08000, CRC(6eedbcf0) SHA1(58173b6f749d40aa294747823d4b442c8938710e), ROM_SKIP(1) ) -ROM_END - - -// ***** 286 motherboards using the Acer (ALi) M1207 chipset - -// CMP enterprise CO.LTD. Phoenix 80286 ROM BIOS Version 3.00 -// ROM_SYSTEM_BIOS(26, "cmpa286", "CMP A286") /* (Chipset Acer (ALi) M1207-12) (BIOS release date:: 01-09-1986) (ISA8: 2, ISA16: 6) */ -ROM_START ( cmpa286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-a286-even_16k.bin", 0x18000, 0x4000, CRC(30809487) SHA1(413de43ca7e1930cdf3c006718d8baf743a9ff1e), ROM_SKIP(1) ) - ROMX_LOAD( "286-a286-odd_16k.bin", 0x18001, 0x4000, CRC(3a11aacf) SHA1(23185531ae10912b974048d3607b563e55d3fa96), ROM_SKIP(1) ) -ROM_END - -// AUVA VIP-M21502A BAM16-A0 - BIOS-String: DAR2-1105-061390-K0 - 286-BIOS AMI for AUVA 286, 02/08/1991 - ISA8:2, ISA16:5 -ROM_START( bam16a0 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-vip-m21502a-lo_32k.bin", 0x10000, 0x8000, CRC(413692db) SHA1(54bf664526b137cabf974c1fc659493e76243a88), ROM_SKIP(1) ) - ROMX_LOAD( "286-vip-m21502a-hi_32k.bin", 0x10001, 0x8000, CRC(5db9db04) SHA1(8085384b943454a708be3104b47f6793d0040ab1), ROM_SKIP(1) ) -ROM_END - - -// ***** 286 motherboards using the Chips SCAT 82C235 chipset - -// Biostar MB-1212C - ISA8:2, ISA16:5 -ROM_START ( mb1212c ) - // 0: BIOS-String: ESC2-1223-083090-K2 - 286 BIOS AMI for MB-1212C version 1.1 - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "mb1212_1", "mb1212_1") - ROMX_LOAD( "biostar mb-1212c.bin", 0x10000, 0x10000, CRC(153a783a) SHA1(acad4a3ffe93d3884dcb743c32d6317a132cda7b), ROM_BIOS(0) ) - // 1: CHIPS SCAT BIOS Version 125D - MB-1212C - ROM_SYSTEM_BIOS(1, "mb1212_2", "mb1212_2") - ROMX_LOAD( "mb-1212c.bin", 0x10000, 0x10000, CRC(4675530a) SHA1(c34b1c67ac29695e565363f484e17ab5f8ddaad5), ROM_BIOS(1) ) -ROM_END - - -// ***** 286 motherboards using the Headland G2 chipset - -// LM-103S - 1 8-bit ISA, 6 16-bit ISA - RAM: 4xSIPP30, 2 banks DIP (each bank has 4xV53C104AP80 and 2x16pin empty sockets) -// Headland Technology G2 chipset: HT101A + 2x HT102; HM6818P RTC; AMI keyboard BIOS 904189, BIOS AMI 904189 -// BIOS-String: D286-1234-121589-K0 - CPU: AMD N80L286-16/S - OSC: 32.000MHz, 14.31818MHz -ROM_START( lm103s ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "ami_lm103-s_lo.bin", 0x10000, 0x8000, CRC(a24be20b) SHA1(ffc5faf6d773154bf2f037556d2e381e81a28a58), ROM_SKIP(1) ) - ROMX_LOAD( "ami_lm103-s_hi.bin", 0x10001, 0x8000, CRC(7b63e60c) SHA1(da78b95b12051b6d4701a412fdc5e7874595c188), ROM_SKIP(1) ) -ROM_END - -// CDTEK board with Headland G2 chipset - ISA8:1, ISA16:5 -ROM_START ( cdtekg2 ) // BIOS-String: D286-1435-040990-K0 - Board is used in Polish California Access 286 with a special Hercules character ROM (also available) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286_cdtek headland-l_32k.bin", 0x10000, 0x8000, CRC(341fe2a3) SHA1(f8e10aea477c2b3c92b28a7e0fd0adf8ade22b9e), ROM_SKIP(1) ) - ROMX_LOAD( "286_cdtek headland-h_32k.bin", 0x10001, 0x8000, CRC(bd6fd54f) SHA1(72500ebe4041fbe635562bf55c5d3635257e38f1), ROM_SKIP(1) ) -ROM_END - -// Octek board with Headland G2 chipset - ISA8:2, ISA16:6 -//BIOS-String: 286 Modular BIOS Version 3.03 - O.O.A.L. -ROM_START ( octekg2 ) // BIOS-String: D286-1435-040990-K0 - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-octek-g2_u44_32k.bin", 0x10000, 0x8000, CRC(05892a08) SHA1(e12795524d87c422b0b5d660b36139592893e9c6), ROM_SKIP(1) ) - ROMX_LOAD( "286-octek-g2_u45_32k.bin", 0x10001, 0x8000, CRC(2f81de14) SHA1(952d9e35a6f8ea74eb8b4bf7ea80d7c358474cb8), ROM_SKIP(1) ) -ROM_END - -// Octek Fox M 286 Rev 1.1 - Chipset: Headland HT101A/2xHT102 - CPU: AMD N80L286-16/S, FPU socket provided - RAM: 514256x8 (4 empty tag sockets provided), 4xSIMM30 -// BIOS: AMI 286 BIOS 212491, Keyboard BIOS: AMI Keyboard BIOS setup - OSC: 32.000MHz, 14.31818 - ISA8: 2, ISA16: 4 - undumped PAL: PAL 090-103, 089-001, 090-011 -// BIOS-String: D286-6069-040990-K0 - BIOS release date:: 09-04-1990 -ROM_START( ocfoxm ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "ami_286_bios_sn200960_even.bin", 0x10000, 0x8000, CRC(67745815) SHA1(ca6886c7a0716a92a8720fc71ff2d95328c467a5), ROM_SKIP(1) ) - ROMX_LOAD( "ami_286_bios_sn200960_odd.bin", 0x10001, 0x8000, CRC(360a5f73) SHA1(1b1980fd99779d0cdc4764928a641e081b35ee9f), ROM_SKIP(1) ) -ROM_END - -ROM_START( headg2 ) - ROM_REGION16_LE( 0x20000, "bios", 0) - // 0: 286 board with Headland GC101A-PC; GC102-PC chipset and Phoenix BIOS 2493119, ISA8: 2, ISA16: 5 - ROM_SYSTEM_BIOS(0, "head_ph_1", "Headland/Phoenix #1") // Phoenix 80286 ROM BIOS PLUS Version 3.10.21 ((BIOS release date:: 15-01-1988) - ROMX_LOAD( "286-headland-lo_32k.bin", 0x10000, 0x8000, CRC(21b68bed) SHA1(1e4acda50b12ad463c169ba615805f5dcf257b18), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "286-headland-hi_32k.bin", 0x10001, 0x8000, CRC(04c8ab12) SHA1(b46c14528aca15464e4050b423c2f621a4313a85), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS-String: 286 Modular BIOS Version 3.03HL - ISA16: 5 - ROM_SYSTEM_BIOS(1, "head4530", "Headland 4530") - ROMX_LOAD( "286-headland 4530-high_32k.bin", 0x10001, 0x8000, CRC(f84c0e75) SHA1(42dc068d1cd5105cd576b023e2ccfe0f0646d4e3), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "286-headland 4530-low_32k.bin", 0x10000, 0x8000, CRC(0856dde8) SHA1(cee5d6002c405df984f3c7fa83c4f3e034f1e586), ROM_SKIP(1) | ROM_BIOS(1) ) - // 2: Quadtel Enhanced 286 BIOS Version 3.04.02 - Headland HT101, HT102 - ROM_SYSTEM_BIOS(2, "ami101", "AMI HT 101.1") /* (Quadtel Enhanced 286 Bios Version 3.04.02) (BIOS release date:: 09/11/1989) */ - ROMX_LOAD( "amiht-h.bin", 0x10001, 0x8000, CRC(8022545f) SHA1(42541d4392ad00b0e064b3a8ccf2786d875c7c19),ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "amiht-l.bin", 0x10000, 0x8000, CRC(285f6b8f) SHA1(2fce4ec53b68c9a7580858e16c926dc907820872),ROM_SKIP(1) | ROM_BIOS(2) ) -ROM_END - - -// ***** 286 motherboards using the Headland HT12/A chipset - -// Octek Fox II - Chipset: Headland HT12/A - BIOS String: DH1X-6069-113090-K0 - HT-1X 286 BIOS -ROM_START( o286foxii ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-fox2-even_32k.bin", 0x10000, 0x8000, CRC(54dc119f) SHA1(4bc543beef0d2201fa20eac90a0a6ca38ebf0dbf), ROM_SKIP(1)) - ROMX_LOAD( "286-fox2-odd_32k.bin", 0x10001, 0x8000, CRC(e5db7775) SHA1(2bd0572b9f7c76eff51375b551586ca8484e2a74), ROM_SKIP(1)) -ROM_END - -// BI-025C HT12 286 - Chipset: Headland HT12/A - BIOS-String: DH12-1103-061390-K0 - ISA8: 2, ISA16: 5 -ROM_START( bi025c ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "bi-025c-ht12_even.bin", 0x10000, 0x8000, CRC(7ea7e088) SHA1(e245b3ecce39e85cacb17abf60d2cee000d1750d), ROM_SKIP(1)) - ROMX_LOAD( "bi-025c-ht12_odd.bin", 0x10001, 0x8000, CRC(f18b3eef) SHA1(e14d4b3ea0234613e60512cf79e5580c9ce7f3f6), ROM_SKIP(1)) -ROM_END - -ROM_START( ht12a ) - ROM_REGION16_LE(0x20000, "bios", 0) - //0: BIOS-String: DH12-1343-061390-K0 - // Original BIOS64 dump split into even and odd bytes (matches another dump of the same BIOS) - // ROM at U6 has sticker with AMI 253770 label; "BB012" at U8 is probably other half of BIOS, though not clear which half is which - // Unknown motherboard (similar layout to LM-103S; 4 SIMM, 5 16-bit ISA, 2 8-bit ISA) - // Headland HT12/A; HM6818A RTC; AMI K053770 keyboard BIOS - // Jumpers at right edge of board are labeled "KEYLOCK" (J6), "SPEAKER" (J7), "TURBO LED" (J8), "TURBO S.W." (J9), "RESET" (J10) - // XTALs X3 and X4 in top right corner (behind 80C287) are both unpopulated - ROM_SYSTEM_BIOS(0, "dh12-k0", "AMI DH12-K0") - ROMX_LOAD( "286_headland_even.bin", 0x10000, 0x8000, CRC(a2530914) SHA1(1aca289240caa6d4bf811d301c338c157b6902a1), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "286_headland_odd.bin", 0x10001, 0x8000, CRC(b5f69002) SHA1(ee9ceef1fc7a328ee82006cd504e72e16f21b3c8), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: 286 board with Headland Headland HT12/A chipset, one ROM market IQS, Phoenix BIOS 3479808 - ISA8: 1, ISA16: 6 - ROM_SYSTEM_BIOS(1, "head_ph_2", "Headland/Phoenix #2") // Phoenix BIOS A286 Version 1.01 - BIOS ID JLI01101 - IT9109 - Reference ID 01 - (BIOS release date:: 19-04-1990) - ROMX_LOAD( "286-headland-iqs-lo_32k.bin", 0x10000, 0x8000, CRC(60424e9d) SHA1(aa813bf48939fe7fcbbfec3133e702bfdff6234e), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "286-headland-iqs-hi_32k.bin", 0x10001, 0x8000, CRC(e56212e0) SHA1(2441845d632d19adc0592e094beb5ec1fbe074f6), ROM_SKIP(1) | ROM_BIOS(1) ) - // BIOS-String: Quadtel HT12 286 BIOS Versio 3.05.03 - // 2: Same board as #1, CPU: AMD N80L286-16S, FPU socket provided, Chipset: Headland HT12 - OSC: 14.31818, 8.000, 32.000MHZ, unpopulated: ASYN BUS CLK - // RAM: 8xHYB514256B-60 (8x20pin, alternativelx 4x18pin), Parity (2x16pin, 2x18pin) empty, 4xSIMM30 (Bank0 SIMM, Bank1 SIMM) - BIOS: Quadtel BIOS Software 286 253893 - // Keyboard-BIOS: Quadtel BIOS Software KEY 316018 (undumped) - JP7: NO ASYN CLK, JP4: CMOS RAM CLEAR, JP3: COLOR - JP: 80287CLK=ASYN CLK - ROM_SYSTEM_BIOS(2, "quadtel", "Quadtel") - ROMX_LOAD( "bios-lo.bin", 0x10000, 0x8000, CRC(433d8044) SHA1(3435d51fad97247b4bcfdb2f3fdb358d99b0e6ea), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "bios-hi.bin", 0x10001, 0x8000, CRC(fe124da4) SHA1(b3e4e598cf1f5cada1b101d0c6434770017de3c6), ROM_SKIP(1) | ROM_BIOS(2) ) - // 3: BIOS-String: DH12-1164-083090-K0 - CPU/FPU: N80L286-16/S, P80C287-10 - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS(3, "head12a01", "Headland HT12/A #1") - ROMX_LOAD( "2hlm002l.bin", 0x10000, 0x8000, CRC(345b9ea1) SHA1(868cc309e433e0dcc9f3aa147263017b7f822461), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "2hlm002h.bin", 0x10001, 0x8000, CRC(35eed8b8) SHA1(119f2676aef038301c3e0bcdb999da6fd740e6a5), ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: MBL M21 - BIOS-String: DH12-1211-061390-K0 / HT-12 286 BIOS - Chipset: Headland HT12/A - ROM_SYSTEM_BIOS(4, "ami121", "AMI HT 12.1") /* (BIOS release date:: 13-06-1990) */ - ROMX_LOAD( "ami2od86.bin", 0x10001, 0x8000, CRC(04a2cec4) SHA1(564d37a8b2c0f4d0e23cd1e280a09d47c9945da8),ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "ami2ev86.bin", 0x10000, 0x8000, CRC(55deb5c2) SHA1(19ce1a7cc985b5895c585e39211475de2e3b0dd1),ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: SPEC 286 rev 4a - BIOS-String: DH12-1120-061390-K0 - ROM_SYSTEM_BIOS(5, "ami122", "AMI HT 12.2") /* (BIOS release date:: 13-06-1990) */ - ROMX_LOAD( "ami2ev89.bin", 0x10000, 0x8000, CRC(705d36e0) SHA1(0c9cfb71ced4587f109b9b6dfc2a9c92302fdb99),ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "ami2od89.bin", 0x10001, 0x8000, CRC(7c81bbe8) SHA1(a2c7eca586f6e2e76b9101191e080a1f1cb8b833),ROM_SKIP(1) | ROM_BIOS(5) ) - // 6: BIOS-String: DH12-1112-061390-K0 - ROM_SYSTEM_BIOS(6, "ami123", "AMI HT 12.3") /*(Motherboard Manufacturer: Aquarius Systems USA Inc.) (BIOS release date:: 13-06-1990)*/ - ROMX_LOAD( "ht12h.bin", 0x10001, 0x8000, CRC(db8b471e) SHA1(7b5fa1c131061fa7719247db3e282f6d30226778),ROM_SKIP(1) | ROM_BIOS(6) ) - ROMX_LOAD( "ht12l.bin", 0x10000, 0x8000, CRC(74fd178a) SHA1(97c8283e574abbed962b701f3e8091fb82823b80),ROM_SKIP(1) | ROM_BIOS(6) ) - // 7: ID: H286-C3 158 - Chipset: Headland HT12/A3A0050 - BIOS: AMI 286 BIOS SETUP 649963 - Keyboard BIOS: JET ELECTRONICS CO LTD SN 9 0922133 - // BIOS-String: DH12-1164-083090-K - CPU: AMD N80L286-12/S, FPU socket provided - RAM: SIMM30: 4, 1MB DIP - OSC: 8.000MHZ - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS(7, "h286c3", "H286-C3") - ROMX_LOAD( "h286-c3-158-hi.bin", 0x10001, 0x8000, CRC(ec0cbbba) SHA1(97d7f32cb9c622cfbd08909ac67d09a8aa734430),ROM_SKIP(1) | ROM_BIOS(7) ) - ROMX_LOAD( "h286-c3-158-lo.bin", 0x10000, 0x8000, CRC(dedcf41a) SHA1(ede2c852b3e947ce4efa54640b2e37db83355a6c),ROM_SKIP(1) | ROM_BIOS(7) ) - // 8: CPU: Harris 286-16, FPU socket provided - Chipset: Headland HT12P-16/A - BIOS: AMIBIOS 03/15/91 - BIOS-String: 20-0000-428022-00101111-031591-HT12-F - // RAM: 1MB DIP, 4xSIMM30 - ISA8: 1, ISA16: 6 - OSC: 32.000MHz, 14.31818 - ROM_SYSTEM_BIOS(8, "8022", "8022") // no display - ROMX_LOAD( "20-0000-428022-00101111-031591-ht12 low.bin", 0x10000, 0x8000, CRC(cb74f8e3) SHA1(fc874787f960587ba37442d59af1beebcfd798b9),ROM_SKIP(1) | ROM_BIOS(8) ) - ROMX_LOAD( "h20-0000-428022-00101111-031591-ht12 high.bin", 0x10001, 0x8000, CRC(36179ed9) SHA1(25968319bcd35ff06a0f0edac6ff0246f3f79c25),ROM_SKIP(1) | ROM_BIOS(8) ) -ROM_END - - -// ***** motherboards using the six chip SUNTAC chipset: ST62BC001-B, ST62BC002-B, ST62BC003-B, ST62C006, ST62BC004-B1, ST62BC005-B - -// Magitronic B233 (8 ISA slots) -// SUNTAC Chipset, http://toastytech.com/manuals/Magitronic%20B233%20Manual.pdf -// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 -ROM_START( magb233 ) - ROM_REGION16_LE(0x20000, "bios", 0) // BIOS-String: DSUN-1105-043089-K0 - ROMX_LOAD( "magitronic_b233_ami_1986_286_bios_plus_even_sa027343.bin", 0x10000, 0x8000, CRC(d4a18444) SHA1(d95242104fc9b51cf26de72ef5b6c52d99ccce30), ROM_SKIP(1) ) - ROMX_LOAD( "magitronic_b233_ami_1986_286_bios_plus_odd_sa027343.bin", 0x10001, 0x8000, CRC(7ac3db56) SHA1(4340140450c4f8b4f6a19eae50a5dc5449edfdf6), ROM_SKIP(1) ) - // ROM_LOAD("magitronic_b233_ami_1986_keyboard_bios_plus_a025352.bin", 0x0000, 0x0800), CRC(84fd28fd) SHA1(43da0f49e52c921844e60b6f3d22f2a316d865cc) ) -ROM_END - -// Magitronic B236 (ISA8: 2, ISA16: 6) - 286 Modular BIOS Version 3.03GX -// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 -ROM_START( magb236 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "sunt-lo.rom", 0x18000, 0x4000, CRC(d05c0edf) SHA1(bfd9c68cd5dc874b9519056b3a8cc6ea504b0be3), ROM_SKIP(1) ) - ROMX_LOAD( "sunt-hi.rom", 0x18001, 0x4000, CRC(e5dce491) SHA1(282ad2da0ef47147cbc0c68295e3d4249f4147b2), ROM_SKIP(1) ) -ROM_END - -// AUVA COMPUTER, INC. BAM/12-S2 - VIP - Phoenix 80286 ROM BIOS PLUS Version 3.10 10 -// Chipset: SUNTAC ST62BC004-B1, ST62BC001-B, ST62BC002-B, ST62BC003-B, ST62BC005-B - ISA8: 3, ISA16: 5 -ROM_START( aubam12s2 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "st-ph-l.rom", 0x00001, 0x10000, CRC(7f60168c) SHA1(a6d8dafa6319753466243dbde9676fa0e402f5fe), ROM_SKIP(1)) - ROMX_LOAD( "st-ph-h.rom", 0x00000, 0x10000, CRC(5b4fd7ee) SHA1(821fe868da5c7ff28f2c7b9bae03d0b8a76af796), ROM_SKIP(1)) -ROM_END - -// HLB-286 MBA-009 - BIOS: 286 Modular BIOS Version 3.03 HL - HLB-286 System -// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 -ROM_START( mba009 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "hlb-286l.bin", 0x18000, 0x4000, CRC(9085b21c) SHA1(4f264612c458ab03f94dbac9852fcf9dea2065cc), ROM_SKIP(1)) - ROMX_LOAD( "hlb-286h.bin", 0x18001, 0x4000, CRC(03cdbee8) SHA1(9ea5f91a76bc8861fdc7e5381e8dc15f8fb428f5), ROM_SKIP(1)) -ROM_END - -// Everex EV-1815 (C & T/Suntac) - RAM: 4xSIMM30, 512KB or 1MB total (2/4 SIMMs) -ROM_START( ev1815 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: Award 286 Modular BIOS Version 3.03 - GCH - // additional info from chukaev.ru54.com: SUNTAC ST62BC... 001-B, 002-B, 003-B, 004-B1, 005 - ISA8: 3, ISA16: 5 - CPU/FPU: N80L286-10, 80287 - ROM_SYSTEM_BIOS(0, "ev1815303", "Everex EV-1815 V3.03") /* (BIOS release date:: 15-11-1985) */ - ROMX_LOAD( "award_v3.03_ev1815_even.bin", 0x18000, 0x4000, CRC(dd64bdd6) SHA1(b3108b692d2aa03701ac894602e9418ae0779702), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "award_v3.03_ev1815_odd.bin", 0x18001, 0x4000, CRC(29f023fb) SHA1(873561bb7087483c0c763ef9cd32c1adf0f7cb5e), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: Award 286 Modular BIOS Version 3.03GS - ROM_SYSTEM_BIOS(1, "ev1815303gs", "Everex EV-1815 V3.03GS") /* (BIOS release date:: 15-11-1985) */ - ROMX_LOAD( "award_v3.03gs_ev1815_even.bin", 0x10000, 0x8000, CRC(59489ec2) SHA1(b3c13ba53d4c4ee75a15703236a748121102ce84), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "award_v3.03gs_ev1815_odd.bin", 0x10001, 0x8000, CRC(5bcd9421) SHA1(f32e5a39da593c6982f964fb05b0802d54c3de45), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Mintek BAY-1000C V1.01 - Chipset: SUNTAC ST62BC002-B, ST62C005-B, ST62BC001-B, ST62BC003-B, ST62BC004-B1, ST62C008 -// CPU: AMD N80L286-12/S - RAM: 4xSIMM30, 18x18pin/16pin, 8x20pin, 4x16pin - OSC: 12.000, 14.31818, 25.000MHz - ISA8: 2, ISA16: 6 -// BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 00 / LYI-CHENG ENTERPRISE CO., LTD. -ROM_START( bay1000c ) - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD16_BYTE( "286-suntac_bay-1000c-ic22_32k.bin", 0x10000, 0x8000, CRC(105d3257) SHA1(cf10d09db57f65fee649adcb39058d9d9aefe9e9)) - ROM_LOAD16_BYTE( "286-suntac_bay-1000c-ic23_32k.bin", 0x10001, 0x8000, CRC(3b997bb1) SHA1(70d3bb9e57624c9f64d70bc5f3c00305a08a8b2e)) -ROM_END - -ROM_START( suntac6 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // CPU: AMD N80L286-12/S - RAM: 36 sockets 18pin/16pin, fitted: 36x41C256P-8 - BIOS: Award 286 - Keyboard-BIOS: M5L8042-165P - // ISA8: 2, ISA16: 6 - OSC: 12.000 MHz, 24.000, 14.31818 - // 0: BIOS-String: 286 Modular BIOS Version 3.03 01 Copyright Award Software Inc. - ROM_SYSTEM_BIOS(0, "terraat", "Terra AT") - ROMX_LOAD( "286-suntac-award_a2132439lo.bin", 0x18000, 0x4000, CRC(5fa269f8) SHA1(4167017aaeb63f4eedde155ba29f33ae2a94403b), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "286-suntac-award_a2132439hi.bin", 0x18001, 0x4000, CRC(114604c3) SHA1(db957783e6b16f6e1b8a831130d37fe51da84430), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS-String: 286 Modular BIOS Version 0N3.03 NFS / ELT - board is identical to #0 - ROM_SYSTEM_BIOS(1, "286suntacelt", "286 SUNTAC ELT") - ROMX_LOAD( "286-suntac-award_a2184058lo.bin", 0x18000, 0x4000, CRC(dbf48678) SHA1(75cb7971519cf55f9bb024eed70b831af1799506), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "286-suntac-award_a2184058hi.bin", 0x18001, 0x4000, CRC(2abea425) SHA1(1183d1fc665eab11042643c4f2e0eaa0490bb3df), ROM_SKIP(1) | ROM_BIOS(1) ) - // 2: BIOS-String: DSUN-1105-043089-K0 - Keyboard-BIOS: AMI Keyboard BIOS PLUS A086031 - // CPU: Intel N80286-12 - RAM: 36x16pin/16pin, used 36xTC511000AP-80 - ISA8: 2, ISA16: 6 - BIOS: AMI 286 BIOS PLUS SA073155 - ROM_SYSTEM_BIOS(2, "sa073155", "SA073155") - ROMX_LOAD( "286-suntac_sa073155_ic22.bin", 0x00000, 0x10000, CRC(abf6c367) SHA1(79a07b9b9af2e1963cfcae75fafc3478885237cb), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "286-suntac_sa073155_ic23.bin", 0x00001, 0x10000, CRC(1d286cd9) SHA1(31be40c5008dc67cb24f4418cffaa57682e654c0), ROM_SKIP(1) | ROM_BIOS(2) ) - // 3: BIOS ROMs are marked TCI, Award 286 Modular BIOS Version 3.03HLS - // complains about "refresh timing error, but works - BIOS release date:: 15-11-1985 - ROM_SYSTEM_BIOS(3, "tci", "TCI") - ROMX_LOAD( "suntac_80286_lo.bin", 0x18000, 0x4000, CRC(f7bf6c49) SHA1(d8e813c264008f096006f46b90769c0927e44da9), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "suntac_80286_hi.bin", 0x18001, 0x4000, CRC(5f382e78) SHA1(8ba222df9d7028513e37978598d8139906e8834c), ROM_SKIP(1) | ROM_BIOS(3) ) - // 4: BIOS-String: D286-5017-011388 - ROM_SYSTEM_BIOS(4, "st62m02", "ST62M-02-B") - ROMX_LOAD( "7_st62m02-b_l.bin", 0x10000, 0x8000, CRC(fd24911f) SHA1(71ab1177d0b6b9482353e3b405f4b332cbeecfc3), ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "7_st62m02-b_h.bin", 0x10001, 0x8000, CRC(fca78c7b) SHA1(35e892bf52fb1cbc9bfaed7866c2ef7a31d4b762), ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 00 - LYI-CHENG ENTERPRISE CO., LTD. - ROM_SYSTEM_BIOS(5, "bay1000", "Bay 1000") - ROMX_LOAD( "286-suntac-bay-1000c-ic22.bin", 0x18000, 0x4000, CRC(7f3ef79e) SHA1(d4f7086e2902d3b264b1fff76d1bea811aa58fc5), ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "286-suntac-bay-1000c-ic23.bin", 0x18001, 0x4000, CRC(cca972a4) SHA1(22bd712700bfacd34070e704e901623ecc37a390), ROM_SKIP(1) | ROM_BIOS(5) ) - // 6: BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10.22 - Personal computer 286 - ROM_SYSTEM_BIOS(6, "st2806036", "Suntac ST2806036") - ROMX_LOAD( "286-suntac-2806036-lo.bin", 0x10000, 0x8000, CRC(907dcbf7) SHA1(8782e49926366d7a640c60b875e6c091091a2f54), ROM_SKIP(1) | ROM_BIOS(6) ) - ROMX_LOAD( "286-suntac-2806036-hi.bin", 0x10001, 0x8000, CRC(ba24e88f) SHA1(07983752c8128ae62391737f428d6db42fefdbb8), ROM_SKIP(1) | ROM_BIOS(6) ) - // 7: BIOS-String: 286 Modular BIOS Version 3.03YK2 Copyright Award Software Inc. - YOUTH KEEP ENTERPRISE CO., LTD. - ROM_SYSTEM_BIOS(7, "youth", "Suntac Youth") - ROMX_LOAD( "286-suntac-youth-rom1-128.bin", 0x18000, 0x4000, CRC(f232c31b) SHA1(49b9990c951a61bde10478cbb5db4b913baae1e2), ROM_SKIP(1) | ROM_BIOS(7) ) - ROMX_LOAD( "286-suntac-youth-rom3-128.bin", 0x18001, 0x4000, CRC(0735b127) SHA1(0c79cbd7d40b75dcba5fe33bf8e3a96050e12af5), ROM_SKIP(1) | ROM_BIOS(7) ) - // 8: BIOS-String: 286 Modular BIOS Version 3.01, Copyright Award Software Inc. - ECS - // complains about Refresh Timing Error - ROM_SYSTEM_BIOS(8, "ecs", "Suntac ECS") - ROMX_LOAD( "st62_award_3.01_ecs_suntac_rom1.bin", 0x18000, 0x4000, CRC(17296492) SHA1(3a3bf7c20946ef56b767f54c8de45cd46d5c1167), ROM_SKIP(1) | ROM_BIOS(8) ) - ROMX_LOAD( "st62_award_3.01_ecs_suntac_rom3.bin", 0x18001, 0x4000, CRC(5f0aa2d9) SHA1(5ed5897adb4507c399f200dad9337c1c8b246a48), ROM_SKIP(1) | ROM_BIOS(8) ) - // 9: AMI 286 BIOS for MORSE Personal Computer - BIOS-String: DSUN-1216-091589-K0 - ROM_SYSTEM_BIOS(9, "stmorse", "ST-Morse") - ROMX_LOAD( "st-morse.bio", 0x10000, 0x10000, CRC(7136e89f) SHA1(50d15f96dba855e58bb39c937ad9358fc0084b10), ROM_BIOS(9) ) - // 10: 286-BIOS (C)1987 AMI, for CDTEK - BIOS-String: DSUN-1202-043089-K0 - ROM_SYSTEM_BIOS(10, "sunami", "Suntac AMI") - ROMX_LOAD( "suntac_ami_286_even_bios.bin", 0x10001, 0x8000, CRC(acdffb05) SHA1(180fd693bf86a6fdecc713d5873f3c0950b56c98), ROM_SKIP(1) | ROM_BIOS(10) ) - ROMX_LOAD( "suntac_ami_286_odd_bios.bin", 0x10000, 0x8000, CRC(9003d5ad) SHA1(6a2de572d11625ecdacc4ad7b5c324b160540541), ROM_SKIP(1) | ROM_BIOS(10) ) - // 11: BIOS-String: Phoenix 286 ROM BIOS PLUS Version 3.10 10 - VIP - ROM_SYSTEM_BIOS(11, "sunphovip", "Suntac Phoenix VIP") - ROMX_LOAD( "st-ph-l.rom", 0x10001, 0x8000, CRC(ebb6446f) SHA1(086a8f016c2c0cc56d3bd7ea4e152ae215d4e5ce), ROM_SKIP(1) | ROM_BIOS(11) ) - ROMX_LOAD( "st-ph-h.rom", 0x10000, 0x8000, CRC(1c77bd34) SHA1(0dea2dd8ba69fdfb829d152840817bcbdcc3e394), ROM_SKIP(1) | ROM_BIOS(11) ) - // 12: BIOS-String: 286-BIOS (C) AMI, for SUPERCOM - SSUN-1120-042589-K0 - ROM_SYSTEM_BIOS(12, "supercom", "Suntac Supercom") - ROMX_LOAD( "supercom_lo.bin", 0x18000, 0x4000, CRC(6c8ce417) SHA1(fc2cdc9d23e9d75bb48d26b102873a9964871f52), ROM_SKIP(1) | ROM_BIOS(12) ) - ROMX_LOAD( "supercom_hi.bin", 0x18001, 0x4000, CRC(6c1b645d) SHA1(0def25267428338804c5858e3f536720a2b7d349), ROM_SKIP(1) | ROM_BIOS(12) ) - // 13: - ROM_SYSTEM_BIOS(13, "suntacmr", "Suntac MR BIOS") - ROMX_LOAD( "v000v200-1.bin", 0x10000, 0x8000, CRC(1a34d56e) SHA1(ae950de20641c6394485d891e50136b1dc5261e3), ROM_SKIP(1) | ROM_BIOS(13) ) - ROMX_LOAD( "v000b200-2.bin", 0x10001, 0x8000, CRC(2aeea8bd) SHA1(e6c306cc56dd614d704262a087dcc07b75fd9ac6), ROM_SKIP(1) | ROM_BIOS(13) ) -ROM_END - -// ***** 286 motherboards using the 5 chip VLSI chipset - -ROM_START( vlsi5 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: MG Products (Japanese) - Chipset: VLSI VL82C102A; VLSI VL82C101B; VLSI VL82C104; VLSI VL82C103A; VLSI VL82C100; (VLSI 8908BT; 8906BT; 8852BT; 8907BT; 8906BT) - // BIOS: AMI 286 BIOS+ - BIOS-String: D286-9987-092588-K0 - ISA8: 2, ISA16: 8 - // (BIOS release date:: 25-09-1988) (ISA8: 3, ISA16: 5) - ROM_SYSTEM_BIOS(0, "286vlsij", "Japanese 286 VLSI") - ROMX_LOAD( "286-vlsi_japan-2-even_32k.bin", 0x10000, 0x8000, CRC(e3e64cbc) SHA1(5259e3c8686f2239a5fb0dc38aa80380ef9ec5fa), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "286-vlsi_japan-2-odd_32k.bin", 0x10001, 0x8000, CRC(aa533f39) SHA1(d88c7d4029a283b94b99e2017d29fbf9eb9105b1), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS-String: D286-1223-121589-K0 - 286-BIOS AMI for MBVLSI-168 - ISA8: 3, ISA16: 5 - ROM_SYSTEM_BIOS(1, "mbvlsi168", "MBVLSI-168") - ROMX_LOAD( "286-vlsi-002350-041_32k.bin", 0x10000, 0x8000, CRC(0e0e2bc9) SHA1(0af05b15ea8141ece84fb4420e6a21720f01c7a6), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "286-vlsi-002350-042_32k.bin", 0x10001, 0x8000, CRC(5ef7b91d) SHA1(d57c7f4c8d28708f128c5f0b1251d5943c7cdf76), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Uniron U3911-V3 - Chipset as above - BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 00 - P/N 891012 - 80286 -ROM_START( u3911v3 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286-uniron-u13_32k.bin", 0x10001, 0x8000, CRC(c1acdf6d) SHA1(cb064dac00620588f66f850fee91ef6b47e57012), ROM_SKIP(1) ) - ROMX_LOAD( "286-uniron-u14_32k.bin", 0x10000, 0x8000, CRC(d2e9c52a) SHA1(ff6726b527b0bebed50c053a698e1b61aada3043), ROM_SKIP(1) ) -ROM_END - -// Toptek 286 Turbo (board name somewhat uncertain; 5x 8-bit ISA, 3x 16-bit ISA, 2 banks of onboard RAM + 2 banks expansion RAM) -// VLSI VL82C100 + VL82C101B + VL82C102A + VL82C103A + VL82C104; MC146818 or HM6818P RTC; unidentified keyboard controller -ROM_START( toptek286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // BIOS-String: D286-1295-091589-K0 - // Original BIOS64 dump split into even and odd bytes based on available PCB info - ROM_LOAD16_BYTE( "toptek_vlsi_even.bin", 0x10000, 0x8000, CRC(f35465e8) SHA1(c85afc2168e355120c63b68d5c11fce7770fe1b7) ) - ROM_LOAD16_BYTE( "toptek_vlsi_odd.bin", 0x10001, 0x8000, CRC(b7272729) SHA1(686c976b9b7989862846a79d00f1f9116f03bc17) ) -ROM_END - - -// ***** 286 motherboards using the 5 chip Winbond chipset W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP - -// KT216WB5-HI Rev.2 (1 8-bit ISA, 5 16-bit ISA) - CPU: Harris CS80C286-16, FPU: 80287 - OSC: 32.000MHz, 14.31818 -// Winbond W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP; MC146818AP RTC; JETkey keyboard BIOS - RAM: 1MB DIP, 4xSIPP30 -ROM_START( kt216wb5 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // BIOS-String: D286-1149-083090-K0 - WIN 286 BIOS - ROMX_LOAD( "kt216wb5_even.bin", 0x10000, 0x8000, CRC(6b5509c0) SHA1(73b303b90cc0cd23b7e13362019193c938a2e502), ROM_SKIP(1) ) - ROMX_LOAD( "kt216wb5_odd.bin", 0x10001, 0x8000, CRC(af541ada) SHA1(26d2617dbe8c15f1b0d4782375bcb291a7923703), ROM_SKIP(1) ) -ROM_END - -// KMA-202F-12R - ISA16:7 - BIOS-String: 286 Modular BIOS Version 3.11 -// Winbond W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP; DS12887+ RTC; AWARD keyboard BIOS -ROM_START( kma202f ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "286_lo.bin", 0x10000, 0x8000, CRC(0ce69691) SHA1(6904ac54f30f2244058653aaa623804dd02b4332), ROM_SKIP(1) ) - ROMX_LOAD( "286_hi.bin", 0x10001, 0x8000, CRC(1330b6f2) SHA1(691bb4a51ce3d9a026ee33c3fd02fc4e13b4a184), ROM_SKIP(1) ) -ROM_END - - -//************************************************************************** -// 80286 Desktop -//************************************************************************** - -// SIIG MiniSys 2000 - Motherboard ID: Labway MS101V1.2 - This is a tiny 286 system, the width of a 3.5" disk drive with an external power supply. -// A physical switch allows to change between VGA and composite video output. -// CPU: Intel 286-12 - BIOS: AMIBIOS - Bios string: DH12-1422-061390-K0 - Chipset: Headland HT12/A, Acer M5105 - RAM: 2xSIMM30 -// OSC: 14.31818MHz, 24.000MHz, 24.000, another unreadable - ISA16: 1 (on riser board) - on board: IDE, Floppy, 2xser, par, game, composite, VGA, -// ext. FDD (motherboard and I/O board connected with a riser board - Mass storage: 3.5" FDD, 3.5" HDD (e.g. Seagate ST351A/X in AT mode) -ROM_START( minisys2k ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "minisys2000_even.bin", 0x10001, 0x8000, CRC(a4c3eade) SHA1(ea6d19fa12994882f8a77f67c2c358bba57abe28), ROM_SKIP(1) ) - ROMX_LOAD( "minisys2000_odd.bin", 0x10000, 0x8000, CRC(0e904497) SHA1(a55de8fdaf0442cc7c640dfc88daa37c851fd324), ROM_SKIP(1) ) -ROM_END - - -// ICL DRS M40 (motherboard: ICL M40/M45/915V) -// Chipset: Chips and Technologies NEAT, WD37C65C-PL - CPU: - FPU socket provided - BIOS: Acer (made by Phoenix) - Keyboard BIOS: KBC V4 82HV -// OSC: 10.000000MHz, 16.000MHz, 25.175999MHz, 32.000000MHz, 14.31818 - RAM: DIP 640KB, 4xSIMM30, 2xSIMM/SIPP30 no sockets - VGA on board: PVGA1A-JK, 256KB RAM -// no regular ISA slots, ISA8: 1, ISA16: 1 on a riser card - On board: IDE, floppy, par, 2xser -ROM_START( icldrsm40 ) // no POST, halts - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "icl_m40_l_bin", 0x10000, 0x8000, CRC(1b493570) SHA1(2a3cee0e7a45f07439c54970513e85c9134fee32), ROM_SKIP(1) ) - ROMX_LOAD( "icl_m40_h.bin", 0x10001, 0x8000, CRC(451421af) SHA1(82d3c94cf04df1b48540fbb3c4d9ad4d6eac8823), ROM_SKIP(1) ) - - ROM_REGION( 0x8000, "vga", 0) // WDC WD90C11-LR VGA BIOS - ROMX_LOAD( "icl_m40_vga_bios_l.bin", 0x0000, 0x4000, CRC(522c5c02) SHA1(37f8299a0dcf6b028e1012313ae787bc389ed1f2), ROM_SKIP(1) ) - ROMX_LOAD( "icl_m40_vga_bios_h.bin", 0x0001, 0x4000, CRC(ed29de22) SHA1(80a508a42dc731fc33584ba2da9e478c401e5d47), ROM_SKIP(1) ) -ROM_END - -// Twinhead PS-286V Rev 0.1 (used in Twinhead Netstation PC) - Chipset: Twinhead TH4100, TH6260, Zilog Z0765A08PSG FDC, 2x16C450PC, -// BIOS: Phoenix NEAT - BIOS Version: 3.1003D 3462421, Keyboard BIOS: Phoenix - CPU: Intel N80286-12, FPU socket provided -// RAM: 8xiT21014-08, 8xSIMM30 - ISA16: 1 - On board: WD VGA, floppy, ide, 2xser, par - Video: WD90C11-LR, IMSG176J-50Z, Twinhead VGA BIOS V1.20, RAM: 2xIntel T21014-08 -// OSC: 14.31818, 24.000MHz - DIP8: on-off-off-off-on-on-on-on -ROM_START( twinnet ) // BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 03 - Twinhead International Corporation - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "ps-286v_lo.bin", 0x10000, 0x8000, CRC(71920f1b) SHA1(f6d76d10b17df7488c5c70a912403dd45f0afbc3), ROM_SKIP(1) ) - ROMX_LOAD( "ps-286v_hi.bin", 0x10001, 0x8000, CRC(d79495e3) SHA1(e5d53ae7059502b2259d575ca8e8fdff7f712389), ROM_SKIP(1) ) - - ROM_REGION( 0x8000, "vga", 0) // WDC WD90C11-LR VGA BIOS - ROM_LOAD( "wdc_vga.bin", 0x0000, 0x8000, CRC(f897048e) SHA1(3baeb553dae4f1c641fb01a16bfe4ae3ca95b13d)) -ROM_END - -// Zenith Z-248 - Motherboard: 85-3379-01 CPU BOARD 113087 - CPU: AMD N80L286-12/C, FPU socket provided - Chipset: Zymos Poach 1 and 2 -// RAM: 6xSIMM30 - OSC: 24.000MHz, 16.000MHz, 14.31818MHz - ISA8: 2, ISA16: 5 - on board diagnostic LEDs: red: CPU D101, ROM D102, RAM D103, INT D104, DSK D105, RDY D106, green: DCOK D107 -// Cards in system documented: DTC 5280 CRA MFM HD controller, Graphics card HEATH P/N150-307-3 L1A2334/Chips P82C434A (undumped), Logitech mouse/hand scanner controller, GW302 Parallel Printer Card, Chips P82C605 Dual Serial Printer Card -// "+++ ERROR: Fatal Slushware RAM Error +++" / "--- Fatal Error: Cannot Continue! ---" (cf. olyport40) -ROM_START( zdz248 ) // use CGA - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "zenith_z-248.bin", 0x10000, 0x10000, CRC(e2042dd9) SHA1(bd51cc74b0b7bd42c449bc4b5702274f766e8ea5)) -ROM_END - -// Samsung Deskmaster 286-12, Microfive motherboard - Chipset: Chips F82C451C, F82C235-12 286 SCAT - CPU: Intel 80286-12, FPU socket provided -// RAM: 6xSIMM40 - BIOS: Phoenix ROM BIOS PLUS 3.10 02M, Chips and Technologies VGA 411 BIOS v211 (one 27C512 EPROM) - Keyboard-BIOS: Intel P8942AN - ISA16: 1 -// OSC: 14.31818, 24.000000MHz, 24.000000MHz, 25.175000MHz, 40.000000MHz - on board: FDD, IDE, beeper, keyboard, mouse, ser, par - VGA Video RAM: 8x41C464J-10 (256K) -ROM_START( samdm286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "samsung-deskmaster-28612-rom.bin", 0x10000, 0x10000, CRC(785d3196) SHA1(214a933d8fa86bfdb633fb5e8595a18a58cdba7d)) -ROM_END - -// Schneider EuroAT - Uses the same case as the Schneider EuroXT, a compact desktop with room for a single floppy drive and an AT IDE harddisk (Seagate ST-142A, ST-157A) -// Mainboard: Baugr.Nr. 51513 with internal EGA, 52591 EGA components omitted (see: EURO VGA) -// Chipset: 2xHeadland GC102-PC, HT101A/B1A4924, Schneider BIGJIM 30773 (cf. EuroPC 2/EuroXT), WD37C65BJM, Siemens SAB 16C450-N -// EGA chipset (mainboard 51513): G2 GC201-PC, 64K RAM - Main RAM: 1MB -// CPU: Siemens SAB 80286-12, Keyboard-BIOS: Schneider ROM BIOS 1985, 1989 Phoenix -// Connectors: Keyboard, Printer, Serial, Floppy (can use the same external floppy disk drives as the EuroXT), EGA monitor -// OSC: 34.0000, 19.2000MHz, 24.0000, 16.000MHz -// BUS: proprietary connectors, ISA riser (ISA8x1, ISA16x1), BIOS can set CPU and BUS speed up to 12MHz -// Proprietary EURO VGA card: 256KB RAM, ATI 18800-1 chipset -// blank screen, beeps 1-2-4 -ROM_START( euroat ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_SYSTEM_BIOS( 0, "v201", "V2.01" ) // also used on Tower AT - ROMX_LOAD( "euro_at_v201a_l.bin", 0x10000, 0x8000, CRC(0f8a2688) SHA1(95db9010b1c0465f878e5036bcf242ddf0a3be6a), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "euro_at_v201a_h.bin", 0x10001, 0x8000, CRC(75b6771b) SHA1(3aa0921914ea6e24249ce3f995fdcb341124d7e9), ROM_SKIP(1) | ROM_BIOS(0) ) - // EGA ROM dump missing - - ROM_SYSTEM_BIOS( 1, "v203", "V2.03" ) - ROMX_LOAD( "80286at_bioslow_schneider_ag_id50444_v2.03.bin", 0x10000, 0x8000, CRC(de356110) SHA1(6bed59a756afa0b6181187d202b325e35afadd55), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "80286at_bioshigh_schneider_ag_id50445_v2.03.bin", 0x10001, 0x8000, CRC(c4c9c840) SHA1(09deaa659191075b6ccc58403979d61bdf990dcd), ROM_SKIP(1) | ROM_BIOS(1) ) - - ROM_REGION( 0x10000, "vga", 0 ) - ROM_LOAD( "euro-vga_52255_bios_v1.02_row.bin", 0x00000, 0x10000, CRC(71d42e58) SHA1(be64990325f52128e102dfc3ed87d2d831183ddc)) -ROM_END - -// Schneider Tower AT 220 (other designations for the 10 MHz 80826, 512KB RAM series are 201, 202, 240), the last two digits are related to the originally installed -// number of 3.5" 720K floppy drives or the size of the MFM harddisk), Model 260 has a 60MB harddisk and can have a 12.5 MHz CPU (depending on where you look and -// probably what was available in Schneider's part bin), systems with a "mega" in the name have 1MB RAM and 1.44MB floppy drives. All have an EGA graphics card on board -// The case looks like a stack of three thinner slices, and extra modules were available that clamped on: a tape streamer, and a 5.25" 1.2MB or a 360KB drive. They were -// connected to the "External drive" port of the Tower AT, much like with Schneider's other PCs. The mainboard as such is divided between the I/O and video portion that resides on -// the backplane board and the CPU and RAM on the CPU card that also contains the keyboard connector. -// Model 220, Schneider Tower-EGA I/O: Chipset: JIM 50101-1 (cf. EuroPC), WD37C65BJM, Gemini VC-001, VLSI VL16C450-PC, Paradise Systems Inc PPC1 38302C -// 104 pin CPU card connector (ISA without the key), 3xISA16, 1xISA8 - on board: parallel, serial, bus mouse (Atari compatible), EGA, internal floppy (26pin), external floppy (DB25) -// Model 220, Schneider Tower-CPU 286 (Baugr.Nr. 50229 Rev.3B): Dallas DS1287, MBL8042H (Compatibility Software 1986/K Phoenix Technologies Ltd - 805931) - Chipset: 2x G2 GC102, G2 GC101 -// OSC: 20.000MHz, 14.318180, beeper, CPU: AMD N80L286-10/S, FPU socket provided - RAM: solder pads for 4xSIMM30, 4x16pin (empty), 4x or 8x51C4256 (512KB or 1MB) -// The Tower AT was available with the Schneider VGA I/O that is described in the tower386sx section. The Tower VGA System 40 and System 70 models had the 12.5MHz CPU card. -// Its BIOS version 2.03 is undumped so far. -// blank screen, beeps 1-2-4 -ROM_START( towerat2xx ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_SYSTEM_BIOS(0, "v2.02", "V2.02" ) // from a model 220 - ROM_SYSTEM_BIOS(1, "v2.01", "V2.01" ) - ROM_SYSTEM_BIOS(2, "v1.07", "V1.07" ) // seen on a model 240 "mega" - ROM_SYSTEM_BIOS(3, "v1.06", "V1.06" ) // from a model 220 - ROM_SYSTEM_BIOS(4, "v1.05a", "V1.05a" ) - ROM_SYSTEM_BIOS(5, "v1.01a", "V1.01a" ) // from a model 220 - - ROMX_LOAD( "phoenix_860376_schneider_ag_tower_at_bios_0_id.nr.50445_v2.02.bin", 0x10000, 0x8000, CRC(8566b3f2) SHA1(a12b5e9e848de123c62374f78ee1d2b4b53dd468), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "phoenix_860376_schneider_ag_tower_at_bios_1_id.nr.50445_v2.02.bin", 0x10001, 0x8000, CRC(7d8249cf) SHA1(d894332aad4c26798e6b41a5e94c471b0235bd50), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "schneider_tower_at_bios_0_low_v2.01a.bin", 0x10000, 0x8000, CRC(0f8a2688) SHA1(95db9010b1c0465f878e5036bcf242ddf0a3be6a), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "schneider_tower_at_bios_1_high_v2.01a.bin", 0x10001, 0x8000, CRC(75b6771b) SHA1(3aa0921914ea6e24249ce3f995fdcb341124d7e9), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "schneider_tower_at_bios_0_low_v1.07.bin", 0x10000, 0x8000, CRC(70a9421d) SHA1(bf6529f259d5bc7c28df19655c57ecce1c57260f), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "schneider_tower_at_bios_1_high_v1.07.bin", 0x10001, 0x8000, CRC(995a62db) SHA1(42e9a866b5f02509d3094c42842eafed1d577f4e), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "schneider_ag_50444_v1.06.u3", 0x10000, 0x8000, CRC(42891d5a) SHA1(d94292b14f9155b4e05c78960f9722fffca976be), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "schneider_ag_50445_v1.06.u4", 0x10001, 0x8000, CRC(bdced2b9) SHA1(cba58c70420695ec69dbb4817d0c6b14b8bdbadd), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "schneider_tower_at_bios_low_v1.05a.bin", 0x10000, 0x8000, CRC(94ad1628) SHA1(bf7319ed9b37a57e67b0b4bf7845d95d0f593d68), ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "schneider_tower_at_bios_high_v1.05a.bin", 0x10001, 0x8000, CRC(f3d48773) SHA1(9386313b6d05acb30e7ba7e1353c259deaaa77bc), ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "schneider_tower_at_bios_low_v1.01.bin", 0x10000, 0x8000, CRC(a94ca070) SHA1(2acca0601c00e76d510c81dfe92d33397fbeccd1), ROM_SKIP(1) | ROM_BIOS(5) ) - ROMX_LOAD( "schneider_tower_at_bios_high_v1.01.bin", 0x10001, 0x8000, CRC(d8f67320) SHA1(3ddf7fdb1370f745c4f1902101605477ee0bb392), ROM_SKIP(1) | ROM_BIOS(5) ) - - // todo: find matching EGA ROMs for BIOS V2.01, 1.07 and 1.05 - ROM_REGION( 0x8000, "gfx", 0) - ROMX_LOAD( "schneider_ag_tower_ega-bios_50477_v1.04.bin", 0x0000, 0x8000, CRC(aabd1017) SHA1(e019c21d6108a0387f7c98e92e4dbc32ab19929f), ROM_BIOS(0) ) // R1.04 matched with system BIOS V2.02 - ROMX_LOAD( "schneider_ag_tower_ega-bios_50477_v1.04.bin", 0x0000, 0x8000, CRC(aabd1017) SHA1(e019c21d6108a0387f7c98e92e4dbc32ab19929f), ROM_BIOS(1) ) - ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(2) ) - ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(3) ) // R1.02 matched with system BIOS V1.06 - ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(4) ) - ROMX_LOAD( "schneider_ega_r1.00.bin", 0x0000, 0x8000, CRC(4e14cb0a) SHA1(6cef69274a52b11201a3477631fa343a7e1a5970), ROM_BIOS(5) ) // R1.00 matched with system BIOS V1.01 */ -ROM_END - - -// Victor V286C - a VGA version exists as well -// CPU: AMD 802L86-10/S - one ISA16 extended to ISA8: 1, ISA16: 3 on a riser card - Keyboard-BIOS: AT-KB M5L8042 -// Chipset: Kyocera AT-S.C.1 VER.A 9771A 89432EAI, Kyocera EAST-2A 9850 8938EAI, MB621103 M AT-1A 8944 Z67, MB622436 MAT-2E 8943 W02 -// On board video EGA/CGA/Hercules based on a L1A2919 PARADISE PBI-38306A controller -// RAM: 640KB on board - OSC: 48.000, 32.0000MHz, 40MHz, 18.63636MHz -// Options: Sockets for a Microsoft 900110003 Bus Mouse controller, FPU 80287 and a DS1287 RTC - 2 DIP switches with 12 positions combined -// Mass storage: 1.2MB floppy, Kyocera KC-30A harddisk on a DTC5187CRH RLL controller -ROM_START( v286c ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "system-bios_kyocera_a2-2_lo.bin", 0x18000, 0x4000, CRC(160c4759) SHA1(937c1bb9483efeba895e038b7132e0e7e5a9aaa4) ) - ROM_LOAD16_BYTE( "system-bios_kyocera_a2-2_hi.bin", 0x18001, 0x4000, CRC(cfe0cbef) SHA1(2610d727d13fa67c7bd9b3545d7846e880c3da37) ) - - ROM_REGION(0x4000, "pega", 0) - ROM_LOAD( "ega-bios_paradise_video-1.bin", 0x0000, 0x4000, CRC(2db77b0b) SHA1(d31ddbbde5be0b0603e9f569c3f924e0afc7c8e4) ) -ROM_END - -// Atari PC 4, PC4X motherboard - Chipset: NEAT CS8221 (P82C206, P82C211, P82C212, P82C215) - ISA8: 1, ISA16: 4 - RAM: 8XSIPP30 -// Paradise Systems PVGA1A-JK, IMSG171P -// on board: external and internal floppy, digital and analog video, ser, par, keyboard, mouse -ROM_START( ataripc4 ) // initializes video, then halts - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "ami_pc4x_1.7_even.bin", 0x10000, 0x8000, CRC(9f142377) SHA1(b3e5c5dfaec133646295d9a16bc1eec54fe2bc35)) - ROM_LOAD16_BYTE( "ami_pc4x_1.7_odd.bin", 0x10001, 0x8000, CRC(ae3d4cb6) SHA1(d7915ef013462aff4f189cda8f6dc0a486777b63)) - - ROM_REGION16_LE(0x10000, "pvga", 0) - ROM_LOAD16_BYTE( "pvga_pc4x_even.bin", 0x00000, 0x8000, CRC(ff222896) SHA1(e22cdcd9c69fc4feef6b8c2903e3506c79ff531b)) - ROM_LOAD16_BYTE( "pvga_pc4x_odd.bin", 0x00001, 0x8000, CRC(8ca04b2f) SHA1(7705d866ecf366bd6ea95071bf5767877461d2d5)) -ROM_END - -// Atari ABC 286/30, PC4LC motherboard (low cost, compared to PC4) - BIOS-String: DNET-0000-092588-K0- ISA16: 3 - RAM: 4xSIPP30 -// NEAT CS8221 (P82C206, P82C211, P82C212, P82C215) - http://www.atari-computermuseum.de/abc286.htm -// on board: internal floppy, digital video (EGA), ser, par, keyboard, mouse -ROM_START( atariabc286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "ami_pc4x_1.x_even.bin", 0x10000, 0x8000, CRC(930447c7) SHA1(fb7212b413ff8aa056bd23baadc22691ce714f8d)) - ROM_LOAD16_BYTE( "ami_pc4x_1.x_odd.bin", 0x10001, 0x8000, CRC(0891fd25) SHA1(4722b1db1b2c985c67f9a9b807ce68c06a905232)) - - // ROM_REGION(0x40000, "ega", 0) - // ROM_LOAD( "p82c441_ega_bios_v1.0.6.bin", 0x00000, 0x08001, BAD_DUMP CRC(80c11ef2) SHA1(90852d3cbb64504c8d57b469a594c22c247c9a39)) -ROM_END - -// Profex PC 33 - Chipset: SUNTAC ST62BC004-B1, ST62BC003-B, ST62C008, ST62C005-B, ST62BC001-B, ST72BC002-B -// RAM: 2xSIPP30, 18x18pin/16pin, 8x20pin, 4x16pin - OSC: 12.000, 14.31818, 24.000MHz - ISA8: 2, ISA16: 6 -// BIOS: Award A2245250 - Keyboard-BIOS: Award - BIOS-String: 286 Modular BIOS 3.03 Copyright Award Software Inc. / GCH -ROM_START( profpc33 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "st62-pro.bio", 0x10000, 0x10000, CRC(a42f9d0e) SHA1(384f4ddaf92307a5eeb70646a85ad991d904c2d2)) -ROM_END - -// Epson PC AX / Equity III+ - 102-System Board Error (according to the technical manual this means -// "TlMER SPEED CHECK: An error was detected in timer controller counter 0." -ROM_START( epsax ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "evax.bin", 0x18000, 0x4000, CRC(5f9e5fc9) SHA1(5dbe414b762494fa65df6ac0391b2281f452f3e9)) - ROM_LOAD16_BYTE( "odax.bin", 0x18001, 0x4000, CRC(e9cba352) SHA1(22be1457332a62ae789e779e9666ffd63c91d010)) -ROM_END - -// Epson PC AX2e -ROM_START( epsax2e ) // see epsax - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "evaxe.bin", 0x10000, 0x8000, CRC(1251f3e9) SHA1(52456943ee4d83c2a3d46e75d292f4fb57a5a2d8)) - ROM_LOAD16_BYTE( "odaxe.bin", 0x10001, 0x8000, CRC(ce08f140) SHA1(1c6e62f2ab45e9574691224dd6a6ab2a823e85cc)) -ROM_END - -// Bull Micral 45 - Chipset: VLSI 8842AV / R2622 / VC2730-0001, VLSI 8832VB / L81711 / VL16C452-QC, MBL8042N, MC146818AP, ???, 900110003 V1.1 1986 MICROSOFT, FDC9268, NCR 53C80, -// CPU: 286, FPU socket proided, 12MHz/8MHz RAM: 6xSIMM30 (1.152MB - 6MB) - ROM: 64KB, 16KB Video BIOS - On board video: Paradise PEGA2A, 256KB video RAM -// On board: Floppy (2xint, 2xext), SCSI, par, ser, CP8, Microsoft Inport - OSC: 16.257MHz, 48MHz, 14.318180MHz - ISA16: 1, riser card with 1xISA8 and 2xISA16 -ROM_START( micral45 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "vu12", "Version U1.2") - ROMX_LOAD( "bm45_u1.2_p665.bin", 0x10000, 0x8000, CRC(046ab44a) SHA1(06e44b0bd8ae77c12319e11f629338651d53141d), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "bm45_u1.2_p664.bin", 0x10001, 0x8000, CRC(5729c972) SHA1(40b2dbc53829384e54cf953ed8b39e5d424bbff2), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "vu20", "Versio U2.0") - ROMX_LOAD( "even.fil", 0x10000, 0x8000, CRC(438a7b36) SHA1(b5c9a71cfd7e87cc91453a73f17e93527c5ac7ac), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "odd.fil", 0x10001, 0x8000, CRC(9decd446) SHA1(dcbd305f065382f5327296391da388c50bb1b734), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Wang PC-250/16 -// Phoenix 80286 ROM BIOS PLUS Version 3.10 07 / ROMBIOS Version 03.13.00 (c) Copyright Wang Laboratories, Inc. 1991 -ROM_START( wpc250 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "wang_pc_250-16_bios_vers_03.13.00_chip_l47_9514rol_lo.bin", 0x10000, 0x8000, CRC(8f3a3061) SHA1(42b13f662f1f0b00748e21b4aa60cfcbc4b098c0)) - ROM_LOAD16_BYTE( "wang_pc_250-16_bios_vers_03.13.00_chip_l46_9514roh_hi.bin", 0x10001, 0x8000, CRC(3ba0cb84) SHA1(09111f9a6672fad58b11dc1f22240c78521bcc1c)) - - // Wang PC-250/16 graphics card using a Chips F82C452 - ROM_REGION(0x8000, "gfx1", 0) - ROM_LOAD( "wang_3050_bios_rom.bin", 0x0000, 0x8000, CRC(a895ad45) SHA1(afeacfffdf32f225c604d28580327e9ecfa96ea5)) -ROM_END - -// Philips PCD204 (PCD200 series) -// Chipset: Paradise PVGA1A-JK, Faraday FE3031-JK - BIOS: M1212 U66/U67 R1.00.01 CKS:056B/617D - Keyboard-BIOS: Phoenix 1072217 -// BIOS-String: - - On board: Floppy, 1xIDE, VGA, Parallel, Serial - Slot for ISA slot adapter: 1 - HD: Maxtor 7060AT (C/H/S: 1024/7/17) -// OSC: 30.000MHz, 16.000MHz, 1.8432MHz, 28.3220MHz, 25.1750MHz, 10.000, 42.000MHz, 25.000MHz - CPU: Intel 80286-12 -ROM_START( pcd204 ) // => emulation runs into hlt - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "u66_mi212_r1.00.01.bin", 0x00001, 0x10000, CRC(e99f817a) SHA1(5cf8556fa4ef5c314d5450756c042f5e3cde09b4) ) - ROM_LOAD16_BYTE( "u67_mi212_r1.00.01.bin", 0x00000, 0x10000, CRC(d879f99f) SHA1(04c09b46c4a67701257f819d66002b8e93f0a391) ) -ROM_END - -// Leanord Elan High Tech 286 - Octek VGA-16 using Chips F82C451 -// Chipset: Chips, passive backplane and slot CPU -// complains about "0000-55AA - Error Base RAM (64Kb) - Halt*" -ROM_START( elanht286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "elan_s_ leanord_rom-bios_286_v3.50.bin", 0x10000, 0x10000, CRC(53dc0965) SHA1(13f352ee9eda008d8ddcc7ed06325dd2513ad378) ) -ROM_END - -// Kaypro 286i -ROM_START( k286i ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "81_1598", 0x18000, 0x4000, CRC(e25a1e43) SHA1(d00b976ac94323f3867b1c256e315839c906dd5a) ) - ROM_LOAD16_BYTE( "81_1599", 0x18001, 0x4000, CRC(08e2a17b) SHA1(a86ef116e82eb9240e60b52f76e5e510cdd393fd) ) -ROM_END - -// Sanyo MBC-28 -ROM_START( mbc28 ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "mbc-28_sl-dt_ver.1620_low_din_checksum,454f00,27c256-15.bin", 0x10000, 0x8000, CRC(423b4693) SHA1(08e877baa59ebd9a1817dcdd27138c638edcbb84) ) - ROM_LOAD16_BYTE( "mbc-28_sl-dt_ver.1620_high_din_checksum,45ae00,27c256-15.bin", 0x10001, 0x8000, CRC(557b7346) SHA1(c0dca88627f8451211172441fefb4020839fb87f) ) -ROM_END - -// Siemens PCD-2 - Harddisk: NEC D5126 -// CPU card W26361-D458-Z4-06-05, Piggyback MFM controller with WDC WD42C22A-JU PROTO chip W26361-D477-Z2-04-05 -// Chips: Intel N82230-2, Intel N82231-2, WDC WD37C65BJM, VLSI 8831AM/X12012/VL16C452-QC -// VGA card: S26361-D463 GS3 using a Video Seven 458-0023 - // ROM_LOAD( "vga_nmc27c256q_435-0029-04_1988_video7_arrow.bin", 0x8000, 0x8000, CRC(0d8d7dff) SHA1(cb5b2ab78d480ec3164d16c9c75f1449fa81a0e7) ) // Video7 VGA card - // ROM_LOAD( "vga_nmc27c256q_435-0030-04_1988_video7_arrow.bin", 0x8000, 0x4000, CRC(0935c003) SHA1(35ac571818f616b856da8bbf6a7a9172f68b3ab6) ) -ROM_START( pcd2 ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_LOAD16_BYTE( "bios_tandon_188782-032a_rev_5.21_low.bin", 0x10000, 0x8000, CRC(a8fbffd3) SHA1(8a3ad5bc7f86ff984be10a8b1ae4542be4c80e5f) ) - ROM_LOAD16_BYTE( "bios_tandon_188782-031a_rev_5.21_high.bin", 0x10001, 0x8000, CRC(8d7dfdcc) SHA1(d1d58c0ad7db60399f9a93db48feb10e44ffd624) ) - - ROM_REGION( 0x0800, "keyboard", 0 ) // reporting keyboard controller failure - ROM_LOAD( "kbd_8742_award_upi_1.61_rev_1.01.bin", 0x000, 0x800, CRC(bb8a1979) SHA1(43d35ecf76e5e8d5ddf6c32b0f6f628a7542d6e4) ) // 8742 keyboard controller -ROM_END - -// Siemens PCD-2M/-2L - Board : CPUAZ-S26361-D458-V30 + W26361-D458-Z4-09-05 (ISA16 slot CPU) - Chipset : Intel/Zymos N82230-2, Intel/Zymos N82231-2, VLSI VL16C452-QC -// BIOS : Copyright (C) 1985 Tandon Corporation, Al Rights Reserved. BIOS Version 5.2 - Keyboard BIOS: Award: UPI 1.61 REV 1.01 - CPU: Siemens SAB 80286-12-N/S, FPU socket provided -// RAM: 4xSIMM30 - DIP8: EN0, EN1, EN2, 256, 640, 1MB, MAP, COL - OSC: 90.0000, 24.0000, 14.31818, 16.0000 - On board: Floppy, 2xpar, 2xser, ISA16 piggyback connector -ROM_START( pcd2m ) // constant beeps, doesn't work - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "tandon188782-032a_rev_5.23_low.bin", 0x10000, 0x8000, CRC(1c922f7a) SHA1(f405ce0bf29c8e86efda964308e8f58f7ef0e5ca) ) - ROM_LOAD16_BYTE( "tandon_188782-031a_rev_5.23_high.bin", 0x10001, 0x8000, CRC(ee31d405) SHA1(2630d73ddd55e82857c5ff4547d69ad7f5d5d1ca) ) -ROM_END - -// Compaq SLT/286 - complains about "102 - System board failure" - CPU: Harris CS80C286-12 -// Chips: Dallas DS1287, Compaq 109778-001/4758, Bt478KPJ35, S8852C4/DP8473V, Fujitsu 8904 Q16/109445-001, Fujitsu 8850 W00/109444-002, Compaq 19034/8846KK/10452-002 -// NS16C450V, Fujitsu 8850 W73/110110-001 -ROM_START( comslt286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "compaq_slt286-bios-revision_j.2-even.bin", 0x10000, 0x8000, CRC(77e894e0) SHA1(e935e62e203ec67eaab198c15a36cc0078fd35b0)) - ROM_LOAD16_BYTE( "compaq_slt286-bios-revision_j.2-odd.bin", 0x10001, 0x8000, CRC(4a0febac) SHA1(7da5ac4bc50f25063a1d1e382b8cff9b297976f8)) -ROM_END - -// Dell System 200 - complains about "memory overlap at 400000" but seems to work otherwise -ROM_START( dsys200 ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_LOAD16_BYTE( "version_3.10_a12_even.bin", 0x10000, 0x8000, CRC(5aa81939) SHA1(d9029d3708c49e72f57ae2a340429c28ec39acab)) - ROM_LOAD16_BYTE( "version_3.10_a12_odd.bin", 0x10001, 0x8000, CRC(942416cb) SHA1(b321704471e159030af82556ff25ac46c27a807e)) - - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "20575_b47-00.bin", 0x000, 0x0800, CRC(148187db) SHA1(0d7542dd0b2bc3d6724ae3618a8543cb84a30e92) ) -ROM_END - -// NCR, probably PC-8 - should get a "NGA" extended CGA graphics card once it's emulated -ROM_START( ncrpc8 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "pc8main", "NCR PC-8 mainboard") // large full size AT mainboard - Setup Version 2.3 - ROMX_LOAD( "ncr_35117_u127_vers.4-2.bin", 0x10000, 0x8000, CRC(f4338669) SHA1(c1d6e714591c8d7ab966acfdbc3b463e06fbd073), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "ncr_35116_u113_vers.4-2.bin", 0x10001, 0x8000, CRC(b1b6a2e2) SHA1(5b2c0a2be59e064076ed757d84f61bf955ceca08), ROM_SKIP(1) | ROM_BIOS(0)) - // Chips: NCR 006-3500404, NCR 006-3500447D, NCR 006-3500402PT, M5L8042-235P, SN76LS612N - ROM_SYSTEM_BIOS(1, "pc8card", "NCR PC-8 CPU card") // passive backplane and CPU card - Setup Version 2.1 - ROMX_LOAD( "ncr_u127-30_v.4.bin", 0x10000, 0x8000, CRC(33121525) SHA1(11f8d8af4dad432f558c646d7d0ff23eb642a815), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "ncr_u113-27_v.4.bin", 0x10001, 0x8000, CRC(87424492) SHA1(5b7aba5678fe55c81fee2e07730b8ae03a23160f), ROM_SKIP(1) | ROM_BIOS(1)) - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD ("ncr_keyboard_mcu_35091.bin", 0x0000, 0x800, CRC(632556cc) SHA1(b35f30bd0664fc1c2775a594f248d1e30237900a)) -ROM_END - -// NCR Class 3302 - CPU: AMD N80L286-12/S, FPU socket provided - Chipset: Chips & Technologies NEAT (82C206, 82C211, 82C212, 82C215), VLSI VL16C452-QC, INMOS IMSG176J-50Z -// Motherboard: PN-386XV REV R4.B - RAM: SIMM30x4, On board: 8x4C4256DJ-10, 4x41C256-10 - BIOS: NCR 3.5 - Keyboard BIOS: M5L8042-277P -// OSC: 24.000MHz, 32.000MHz, 36.000MHz, 1.8432MHz, 25.175/28.322, 14.31818, ISA16: 1 on board, used for a riser with 2 slots -ROM_START( ncr3302 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "f000-flex_drive_test.bin", 0x10000, 0x8000, CRC(09c9eb6b) SHA1(5eb00f65659cee018726e7a4122da1c42b2bbef9)) - ROM_LOAD( "f800-setup_ncr3.5-013190.bin", 0x18000, 0x8000, CRC(31e6a1ba) SHA1(2ff7dc233d167775ec3641c7a4b2d891db5f8ba7)) - - // on board Paradise VGA PVGA1A-JK - // DIP switches (x8 near the Paradise PVGA1A-JK) are undocumented. Setting switch 7 to 'open' generates VGA compatible (yet monochrome) signal, closing switch 7 - // causes 'out of range' on a fixed frequency VGA LCD - Graphics RAM: 8xD6164, 8 empty sockets (18 pin) provided - ROM_REGION(0x8000, "video", 0) - ROM_LOAD( "c000-wd_1987-1989-740011-003058-019c.bin", 0x0000, 0x8000, CRC(658da782) SHA1(6addcf24795c2e8004c21a8e546b53de41766420)) -ROM_END - -// Nixdorf 8810 M30 -// Chipset: Chips P82C211-12 P82C215, P82C212B-12, Zilog Z0853006VSC, L5A0757/NC-LSI56A-SCC1, Chips P82C604A, P82C206 H1 -ROM_START( n8810m30 ) - ROM_REGION16_LE(0x20000, "bios", 0 ) - ROM_LOAD( "at286bios_53889.00.0.17jr.bin", 0x00000, 0x20000, CRC(74870212) SHA1(adb3f379c9aeee6a5beb946d23af6eea706aca1d) ) -ROM_END - -// Nixdorf 8810 M55 - Paradise PEGA 1A383048 piggybacked onto MFM/Floppy controller card -// Chips: M5L8042-235P, NCR 006-3500402PT, 2xAMD AM9517A-5JC, NCR 006-3500447 D, NCR 006-3500404 -ROM_START( n8810m55 ) - ROM_REGION16_LE(0x20000, "bios", 0 ) - ROM_LOAD16_BYTE( "150-3872_u113_27_4.5.1.bin", 0x10001, 0x8000, CRC(35ff4fba) SHA1(557f0f98c27af76f6fa6990592e7150f5fc1fc02)) - ROM_LOAD16_BYTE( "150-3873_u127_30_4.5.1.bin", 0x10000, 0x8000, CRC(5a7e6643) SHA1(f3890919a772eead7232bd227b2c8677377f6e24)) -ROM_END - -// Olivetti M290 - has an Olivetti branded Paradise PVGA1A-JK VGA card - locks up with "Error 2" and a key symbol -// Chipset: Olivetti GA099-B/28927F74AT, Olivetti GA098-B 28909F74AS, TI TACT82206FN, Olivetti 8920K5 -// Floppy/IDE card: WD37C65BJM, NS16C450V -ROM_START( m290 ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "m290_pep3_1.25.bin", 0x10000, 0x10000, CRC(cb57d677) SHA1(4bdf5c52567c129b413c866c63b5fb3562fccd23)) - - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "m290_csl0_1.10.bin", 0x000, 0x0800, CRC(d767d496) SHA1(84246f7b39e0a005425948931cf93624b831e121) ) -ROM_END - -// Ericsson WS286 -ROM_START( ews286 ) // Computer is brown/yellow-ish with Ericsson logo - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "rys_103_1002_r8a_3c00_ic-pos_71.bin", 0x18000, 0x4000, CRC(af179e56) SHA1(58b1df46d6e68eef472a0529cb9317abaf17880f)) // Last ROM set and has Nokia - ROM_LOAD16_BYTE( "rys_103_1003_r8a_8600_ic-pos_69.bin", 0x18001, 0x4000, CRC(555502cb) SHA1(1977fe54b69c5e52731bf3eb8bdabe777aac014b)) // copyright patched in both roms -ROM_END - -// Nokia Data WS286 -//ROM_START(nws286 ) // Computer is grey with Nokia logo. -// ROM_REGION(0x20000,"bios", 0) -// ROM_LOAD16_BYTE( "rys_103_1002_r8a_3c00_ic-pos_71.bin", 0x18000, 0x4000, NO_DUMP) -// ROM_LOAD16_BYTE( "rys_103_1003_r8a_8600_ic-pos_69.bin", 0x18001, 0x4000, NO_DUMP) -//ROM_END - - -//************************************************************************** -// 80286 Notebook/Laptop/Portable -//************************************************************************** - -// CAF Prolite 286/16 - Chipset: CHIPS P82C06, P82C211-12, P82C215-12, P82C212B-17 16MHz, WD47C65BJM, Acer M2201 - on board: beeper, floppy (FDC1.0 undumped) -// CPU: 286, FPU: Socket provided - RAM: 8xSIMM30 - BIOS: CAF Computer Corporation AMI BIOS - Keyboard BIOS: FONTEX TECH.CORP. AMI 286 BIOS PLUS KEYBOARD 07327 -// OSC: 32.768KHz, 16MHz, 9.6MHz, 39.000MHz, 18.000000MHz, 16.257MHz, 1.8432MHz, 32.00MHz, 20MHz -// Video on board: Genoa 7017417 BIOS (undumped), GRAY1.1 (undumped), Genoa GN006001-B, GN006002-B, GN006003-A, 256KB Video RAM - DIP10: off-on-on-off-on-on-on-off-off-off -ROM_START( prolite286 ) // Initialises graphics card, then dies - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "caf_prolite_even.bin", 0x10000, 0x8000, CRC(c3f4b360) SHA1(958fde7fa12425f6ac14fee6ebfd1b1f535c66eb)) - ROM_LOAD16_BYTE( "caf_prolite_odd.bin", 0x10001, 0x8000, CRC(7c2f6f9f) SHA1(6e72f1458308e521e5715cedb83f40ebe0cc4ad7)) -ROM_END - -// AEG Olympia Olyport 40-21 aka Zenith SuperSport - CPU: AMD N80L286-12/8 - Chipset: Chips P82C2185, P82C211C, P82C206 F-1, P82C212B, P82C604, WD37C65BFM, Hitachi HD6305VOP -// OSC: 22.500, 24.000 - Video: CGA, LCD with 16 grey intensities - Connectors: CRT, Ext. Bus, RS232C, Printer, Ext.FDD - Mass storage: FDD 1.44MB, HD: Conner CP-323 (IDE with detached controller PCB) -ROM_START( olyport40 ) // "+++ ERROR: Fatal Slushware RAM Error +++" / "--- Fatal Error: Cannot Continue! ---" - slushware is a ROM shadowing concept cropping up in Zenith brochures - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "mbevn_v2.7b.bin", 0x10000, 0x8000, CRC(eaf0d73c) SHA1(d642afe8a72b95e5e9d9cdc8cf8db833df54eaf0)) - ROM_LOAD16_BYTE( "mbodd_v2.7b.bin", 0x10001, 0x8000, CRC(a750d652) SHA1(c9a3cca535f6e7c44b83d87efcc289afda71b62f)) - - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "nec_d80c42c.bin", 0x000, 0x0800, CRC(49ae4c38) SHA1(d5e6463d1dbcc7d68ef6b9222ff02102918f41b7)) -ROM_END - -// Compaq Portable II -// Chips: Intel D8742, SN76LS612N, 2x NEC D8237AC-5, 2xIntel P8259A-2, MC146818AP, Intel P8254 -// Enhanced Color Graphics board: Chips P82C431, P82C434A -ROM_START( comportii ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_SYSTEM_BIOS(0,"105620-001", "Ver. D (105620/105622)") - ROMX_LOAD( "comportii_105622-001.bin", 0x18000, 0x4000, CRC(30804fa4) SHA1(204d16dac4db4df0ba23a336af62da3f66aa914c), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "comportii_105620-001.bin", 0x18001, 0x4000, CRC(45fe43e8) SHA1(f74c2e30f7bd162be4042946ebcefeb236bd2fe7), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1,"106437-001", "Ver. F (106437/106438)") - ROMX_LOAD( "106438-001.bin", 0x18000, 0x4000, CRC(616361de) SHA1(ce1a6f9be9d374b76a83856f176aaa993d1dd46c), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "106437-001.bin", 0x18001, 0x4000, CRC(b50881ae) SHA1(2a79b39f77b0d3e94e4f765ed6c1961746dad563), ROM_SKIP(1) | ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2,"109739-001", "Ver. P.1 (109739/109740)") - ROMX_LOAD( "109740-001.rom", 0x18000, 0x4000, CRC(0c032f12) SHA1(3ae7833d7f92d6495e2e57caa0260b573187eb72), ROM_SKIP(1) | ROM_BIOS(2) ) - ROMX_LOAD( "109739-001.rom", 0x18001, 0x4000, CRC(83698b85) SHA1(3d3cff84a747aea3db2612a7ac3ebe9cb4700b33), ROM_SKIP(1) | ROM_BIOS(2) ) -ROM_END - -// Compaq Portable III -// Chipset: Fujitsu MB672318, MB672316U, 2x Intel P8237A-5, Compaq 8731KX 104111-002, Intel 8272A, 2xAMD P8259A, Graphics: M77H010 -// MC146818P, Intel D8742, Fujitsu MB672322 -ROM_START( comportiii ) - ROM_REGION16_LE(0x20000,"bios", 0) - ROM_SYSTEM_BIOS(0, "106779-002", "106779-002") - ROMX_LOAD( "cpiii_87c128_106779-002.bin", 0x18000, 0x4000, CRC(aef8f532) SHA1(b0374d5aa8766f11043cbaee007e6d311f792e44), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "cpiii_87c128_106778-002.bin", 0x18001, 0x4000, CRC(c259f628) SHA1(df0ca8aaead617114fbecb4ececbd1a3bb1d5f30), ROM_SKIP(1) | ROM_BIOS(0) ) - // ROM_LOAD( "cpiii_106436-001.bin", 0x0000, 0x0800, CRC(5acc716b) SHA1(afe166ecf99136d15269e44ebf2d66317945bf9c) ) // keyboard - ROM_SYSTEM_BIOS(1, "109737-002", "109737-002") - ROMX_LOAD( "109738-002.bin", 0x10000, 0x8000, CRC(db131b8a) SHA1(6a8517a771272edf16870501fc1ed94c7555ef45), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "109737-002.bin", 0x10001, 0x8000, CRC(8463cc41) SHA1(cb9801591e4a2cd13bbcc40739c9e675ba84c079), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// Nixdorf 8810 M15 Laptop - PC07 - boot from harddisk doesn't work -// Chipset: Faraday FE3020, FE3000A, FE3010EB, FE3030, NEC D65013GF280, Toshiba TC8566AF, MC146818A, NEC D65013GF328, D65013GF371, D65013GF356, NS16C450V, Yamaha V6366C-F, MEI DA7116AFPBW -ROM_START( n8810m15 ) - // ROM_LOAD("charagene_v1.1_daft2c2.bin", 0x00000, 0x4000, CRC(dd324efd) SHA1(67fd91277733596bfad8506dc92d9f776e563dda)) // CGA chargen - - ROM_REGION16_LE(0x20000, "bios", 0 ) - ROM_LOAD16_BYTE( "rbios_even_daft2a3.bin", 0x10000, 0x8000, CRC(790abf68) SHA1(fbdb5e628ee9a605c8c1485a3fbb67736ff03153)) - ROM_LOAD16_BYTE( "rbios_odd_daft2b3.bin", 0x10001, 0x8000, CRC(b09a812a) SHA1(c1b3321715260f9cd8c810325dc10c674ea05174)) -ROM_END - -// Nixdorf 8810 M16 Laptop - PC17 - CGA version - boot from harddisk doesn't work -// Chipset: Chips P82xxxx, Chips P82C211-12, P82C215, P82C212B-12, MX9007G/MX1 16C4522QC, WD37C65BJM, Yamaha V6366C-F -ROM_START( n8810m16c ) - // ROM_LOAD("201cg rev 1.0.u78", 0x00000, 0x4000, CRC(3e31143b) SHA1(489da357e0ab8a469a3fb81cce160637486c87bc)) // CGA chargen - ROM_REGION16_LE(0x20000, "bios", 0 ) - ROM_LOAD16_BYTE( "nmc27c256.u35", 0x10000, 0x8000, CRC(51acd116) SHA1(1a0bf24af4eba48d0deb0132a523e131902d2bcd)) - ROM_LOAD16_BYTE( "nmc27c256.u36", 0x10001, 0x8000, CRC(fb47f9da) SHA1(d9bd4aea850a83764454a5c86c8da09f7c640fd6)) - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "d8749h.u69", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) ) -ROM_END - -// Nixdorf 8810 M16 Laptop - PC17 - VGA version - boot from harddisk doesn't work -// Chipset: MX8945G/MX16C4520C, Chps P82C212B-12, P82C215, P82C206, WD37C65BJM, P82C211-12, Chips F82C455, -ROM_START( n8810m16v ) - // ROM_LOAD("8810m16vga_27c256_221vb_123g1.bin", 0x00000, 0x8000, CRC(3bc80739) SHA1(3d6d7fb01681eccbc0b560818654d5aa1e3c5230)) // C&T VGA BIOS for 82C455 - ROM_REGION16_LE(0x20000, "bios", 0 ) - ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_a.bin", 0x10000, 0x8000, CRC(1de5e49b) SHA1(759878e13801278de96700bbef318a49cca68054)) - ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_b.bin", 0x10001, 0x8000, CRC(a65cf1f8) SHA1(30d46b49e87f272540e24a278848122b3c40bdaf)) - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "8810m16vga_8749_201kb_rev3a.bin", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) ) -ROM_END - - -//************************************************************************** -// 80386 SX and DX BIOS -//************************************************************************** - -ROM_START( at386sx ) - ROM_REGION16_LE(0x20000, "bios", 0 ) - // 0: NCR 386 CPU card - Chipset: TACT82301PB, TACT82302PB, TACT82303PB - ROM_SYSTEM_BIOS( 0, "ncr386sx", "NCR 386sx card" ) // Upgrade card for e.g. NCR PC-8 - Setup Version 2.7.1 - ROMX_LOAD( "ncr_386sx_u12-19_7.3.bin", 0x10001, 0x8000, CRC(9e4c9a2a) SHA1(0a45d9f04f03b7ae39734916af7786bc52e5e917), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "ncr_386sx_u46-17_7.3.bin", 0x10000, 0x8000, CRC(73ad83a2) SHA1(bf6704fb4a0da37251f192cea3af2bc8cc2e9cdb), ROM_SKIP(1) | ROM_BIOS(0)) - // ROM_LOAD( "ncr_386sx_card_150-0004508_u1_v1.1.bin", 0x0000, 0x800, CRC(dd591ac1) SHA1(5bc40ca7340fa57aaf5d707be45a288f14085807)) - // 1: Dell 386SX-33 with 2x 72-pin SIMMs, ISA riser slot - Chipset: VLSI 82C311, Cirrus Logic GD5420 - BIOS: 27C010 EPROM containing Quadtel VGA BIOS and Phoenix system BIOS 02/09/93 - // BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 J01 - Copyrights by Phoenix and Dell - Jostens Learning Corporation 386/33SX - CPU: Intel 386sx - ROM_SYSTEM_BIOS( 1, "dell386sx", "Dell 386sx" ) // emulate integrated VGA card - ROMX_LOAD( "dell386.bin", 0x00000, 0x20000, CRC(d670f321) SHA1(72ba3a76874e0c76231dc6138eb56a8ca46b4b12), ROM_BIOS(1)) - // 2: A3286/A3886-01 COMP V4.0 - Chipset: Intel S82344A (VLSI), S82343 (VLSI) - BIOS: AMI P9 (386SX) BIOS 910520 - // BIOS-String: - 30-05T1-425004-00101111-050591-ITOPSX-0 / MULTITRONIC PERSONAL COMPUTER - Keyboard-BIOS: AMI P9(386SX) Keyboard BIOS 910520 - OSC: 8.000, 14.318180MHz, (unreadable) - CPU: Intel SMD, unreadable - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS( 2, "a3286a3886", "A3286/A3886-01 COMP V4.0") - ROMX_LOAD( "386-a3286-a3886-01-even_32k.bin", 0x10000, 0x8000, CRC(56ed3332) SHA1(9d113e57228ee596c0c24eabb193d3670fb9a309), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD( "386-a3286-a3886-01-odd_32k.bin", 0x10001, 0x8000, CRC(9dbe4874) SHA1(589379055cfedd4268d8b1786491e80527f7fad5), ROM_SKIP(1) | ROM_BIOS(2)) - // 3: CPU/FPU: 386SX/486SLC - Chipset: ALD 93C308-A (93C206 ???) - // BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / CC-070794-P01 - ROM_SYSTEM_BIOS( 3, "ald93c308", "ALD 93C308" ) - ROMX_LOAD( "3ldm001.bin", 0x10000, 0x10000, CRC(56bab3c7) SHA1(6970bdc7407b4b57c8e1d493f9e3d9ae70671b9c), ROM_BIOS(3)) - // 4: BIOS: Phoenix; 01/15/88 - CPU: 386sx-16 - Chipset: Intel - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 02 / 386SX, ADI CORP. - ROM_SYSTEM_BIOS( 4, "intel", "Intel chipset") - ROMX_LOAD( "3iip001l.bin", 0x10000, 0x8000, CRC(f7bef447) SHA1(a6d34c3bf0de93c2b71010948c1f16354996b5ab), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "3iip001h.bin", 0x10001, 0x8000, CRC(f46dc8a2) SHA1(b6566fd761e2e6ec34b61ee3bb043ef62d696b5e), ROM_SKIP(1) | ROM_BIOS(4)) - // 5: BIOS-String: X0-0100-000000-00101111-060692-386sx-0 / Ver. 5.14 - continuous reset - ROM_SYSTEM_BIOS( 5, "v514", "V. 5.14") - ROMX_LOAD( "3zzm001.bin", 0x10000, 0x10000, CRC(f465b03d) SHA1(8294825dcaa254c606cee21db7c74f61c1394ade), ROM_BIOS(5)) -ROM_END - -// NEATsx chipset: Chips 82C811 CPU/Bus controller, 82C812 Page interleave/EMS memory controller, 82C215 Data/Address buffer and 82C206 Integrated Peripheral Controller -ROM_START( ct386sx ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS-String: ENSX-1131-0040990-K0 / AMI 386SX-BIOS / NEATSX V1.1 05-31-90 - ROM_SYSTEM_BIOS(0, "neatsx", "NEATsx 386sx") - ROMX_LOAD( "012l-u25.bin", 0x10000, 0x8000, CRC(4ab1862d) SHA1(d4e8d0ff43731270478ca7671a129080ff350a4f),ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "012h-u24.bin", 0x10001, 0x8000, CRC(17472521) SHA1(7588c148fe53d9dc4cb2d0ab6e0fd51a39bb5d1a),ROM_SKIP(1) | ROM_BIOS(0)) - ROM_FILL(0x1e2c9, 1, 0x00) // skip incompatible keyboard controller test - ROM_FILL(0x1e2cb, 1, 0xbb) // fix checksum - // 1: VIP-M345000 NPM-16 - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 20 / AUVA - Keyboard-BIOS: M5L8042-165P - // ISA8: 2, ISA16: 5, Memory: 1 - OSC: 32.000MHz, 14.31818 - ROM_SYSTEM_BIOS(1, "m345000", "VIP-M345000 NPM-16") - ROMX_LOAD( "386-vip-m345000 a1_32k.bin", 0x10001, 0x8000, CRC(8119667f) SHA1(343221a9729f841eb23eafe5505f1216783e5550), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "386-vip-m345000 a2_32k.bin", 0x10000, 0x8000, CRC(ada1a375) SHA1(74128270aa8fed504e8785c5d490b0fa25cc3895), ROM_SKIP(1) | ROM_BIOS(1)) - // 2: DTK Corp. 386sx COMPUTER / DTK 386sx Chipset ROM BIOS Version 4.26 / #96120590N - ROM_SYSTEM_BIOS(2, "dtk386sx", "DTK 386sx") - ROMX_LOAD( "3cso001.bin", 0x10000, 0x10000, CRC(8a0e26da) SHA1(94aefc745b51015426a73015ab7892b88e7c8bcf), ROM_BIOS(2)) - // 3: Chipset is labeled SOLUTIONS 88C211, 88C212, 88C215, P82C206 - // BIOS-String: ENSX-1107-040990-K0 - CPU: 386SX-16 - ROM_SYSTEM_BIOS(3, "solutions", "SOLUTIONS NEATsx") - ROMX_LOAD( "3som001l.bin", 0x10000, 0x8000, CRC(ecec5d42) SHA1(b1aaed408fe9c3b73dff3fa8b19e62600a49cdb2), ROM_SKIP(1) | ROM_BIOS(3)) - ROMX_LOAD( "3som001h.bin", 0x10001, 0x8000, CRC(85d64a86) SHA1(528506724668ea3aef6aa0bd8d68cfcaa58bf519), ROM_SKIP(1) | ROM_BIOS(3)) - // 4: Manufacturer/Identifier: ELITEGROUP COMPUTER SYSTEMS, INC. NEATSX REV 1.0. - Chipset: NEATsx: Chips P82C206, Chips P82C215, Chips P82C811, Chips P82C812 - // CPU: Intel NC80386sx-20, FPU socket provided - RAM: DIP 1MB (DIP sockets for up to 4MB), 4xSIPP30 - BIOS EPROMs: 2x S27C256 NEATsx-013 PLUS - // Keyboard BIOS: 1988 AMI 1131 KEYBOARD BIOS PLUS - OSC: 32.0000MHz, 40.000MHz, 14.31818 - ISA8: 3, ISA16: 5 - ROM_SYSTEM_BIOS(4, "neatsx013", "NEATsx-013 PLUS") // initializes the graphics card, then dies - ROMX_LOAD( "neatsx-013_l.bin", 0x10000, 0x8000, CRC(7cd4d870) SHA1(c7a5b629dadb43779939043ae4adb5e78c770dc3), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "neatsx-013_h.bin", 0x10001, 0x8000, CRC(388587d4) SHA1(8ae6f6b14a2f53438b6a02c4f032088edb2df484), ROM_SKIP(1) | ROM_BIOS(4)) -ROM_END - -ROM_START( at386 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / AMIBIOS Ver 5.19a - ROM_SYSTEM_BIOS(0, "ami386", "AMI 386") - ROMX_LOAD( "ami386.bin", 0x10000, 0x10000, CRC(3a807d7f) SHA1(8289ba36a3dfc3324333b1a834bc6b0402b546f0), ROM_BIOS(0)) - // 1: Phoenix 80386 ROM BIOS PLUS Verson 1.10 (R22) - ROM_SYSTEM_BIOS(1, "at386", "unknown 386") // This dump possibly comes from a MITAC INC 386 board, given that the original driver had it as manufacturer - ROMX_LOAD( "at386.bin", 0x10000, 0x10000, CRC(3df9732a) SHA1(def71567dee373dc67063f204ef44ffab9453ead), ROM_BIOS(1)) - // 2: BIOS-String: 30-0101-429999-00101111-050591-D90-0 / AMI TD60C BIOS VERSION 2.42B - ROM_SYSTEM_BIOS(2, "amicg", "AMI CG") - ROMX_LOAD( "amicg.1", 0x10000, 0x10000,CRC(8408965a) SHA1(9893d3ac851e01b06a68a67d3721df36ca2c96f5), ROM_BIOS(2)) - // 3: - ROM_SYSTEM_BIOS(3, "msi386", "MSI 386") // MSI 386 mainboard, initializes graphics card, then hangs - Chipset: Chips P82A304, P82A303, P82A302C, 2xP82B305, P82C301C, P82A306A, - ROMX_LOAD( "ami_386_msi_02297_even.bin", 0x10000, 0x8000, CRC(768590a0) SHA1(90c5203d78591a093fd4f54ceb8d9827f1e64f39), ROM_SKIP(1) | ROM_BIOS(3) ) - ROMX_LOAD( "ami_386_msi_02297_odd.bin", 0x10001, 0x8000, CRC(7b1360dc) SHA1(552ccda9f90826621e88d9abdc47306b9c2b2b15), ROM_SKIP(1) | ROM_BIOS(3) ) - // 4 - ROM_SYSTEM_BIOS(4, "ami2939", "AMI2939") // no display - ROMX_LOAD( "ami2939e.rom", 0x10000, 0x8000, CRC(65cbbd32) SHA1(d7d26b496f8e86f01722ad9f171a68f9fcdc477c), ROM_SKIP(1) | ROM_BIOS(4) ) - ROMX_LOAD( "ami2939o.rom", 0x10001, 0x8000, CRC(8db6e739) SHA1(cdd47709d6036fad4be40c15bff41752d831d4b8), ROM_SKIP(1) | ROM_BIOS(4) ) - // 5: NCR 386 slot CPU - Upgrade card for e.g. NCR PC-8 - set graphics card to CGA to see a "Timer One Error" message - ROM_SYSTEM_BIOS(5, "ncr386", "NCR 386 CPU card") // Chipset: SN76LS612PN, 2xAM9517A-5JC, NCR 006-3500402PT M472018 8650A - ROMX_LOAD( "ncr_386_card_04152_u44_ver5.0.bin", 0x10000, 0x10000, CRC(80e44318) SHA1(54e1d4d646a577c53c65b2292b383ed6d91b65b2), ROM_BIOS(5)) - // ROM_LOAD ("ncr_386_card_keyboard_04181_u27_ver5.6.bin", 0x0000, 0x800, CRC(6c9004e7) SHA1(0fe77f47ff77333d1ff9bfcf8d6d92193ab1f208)) - // 6: BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 22 - ROM_SYSTEM_BIOS(6, "cbm386", "Commodore 386") - ROMX_LOAD( "cbm-386-bios-lo-v1.022e-8100.bin", 0x10000, 0x8000, CRC(a054a1b8) SHA1(d952b02cc10534325c1c5aaa8b6dfb77bc20a179), ROM_SKIP(1) | ROM_BIOS(6)) - ROMX_LOAD( "cbm-386-bios-hi-v1.022e-d100.bin", 0x10001, 0x8000, CRC(b9541f3d) SHA1(e37c704521e85b07369d21b0521f4d1871c318dd), ROM_SKIP(1) | ROM_BIOS(6)) - // 7: BIOS-String: X0-0100-000000-00101111-060692-RC2018A-0 / Ver 1.4b / Texas Instruments 486 DLC [S3Q] - ROM_SYSTEM_BIOS(7, "ti486dlc", "TI 486DLC") // board is equipped with a TI486DLC - ROMX_LOAD( "ti_486dlc_rev.s3q.bin", 0x10000, 0x10000, CRC(39b150ed) SHA1(5fc96c6232dd3a066349d8e707e938af55893297), ROM_BIOS(7)) - // 8: BIOS-String: 305-3.2 000-00 - Chipset: TACT82206FN; Intel A82385-33 - Keyboard Controller: P/N: 191106-2 C/S E4F4 Rev. 1.4 - // Board with Tandon and Micronics stickers - BIOS: 192475-305A V305 3.2 - // ISA8: 2, ISA16: 5 - OSC: 14.31818 MHz - 66.0000 MHz, CPU: Intel 80386DX-33, FPU: Intel 80387DX-33 - ROM_SYSTEM_BIOS(8, "tanmic385", "Tandon/Micronics with 385") - ROMX_LOAD( "386-micronics-09-00021-even_32k.bin", 0x10000, 0x8000, CRC(0d4f0093) SHA1(f66364a82c957862a0e54afc3a2f85f911adfd49), ROM_SKIP(1) | ROM_BIOS(8)) - ROMX_LOAD( "386-micronics-09-00021-odd_32k.bin", 0x10001, 0x8000, CRC(54195986) SHA1(f3536340ef1697763e5cd70d0de7bb9b2a4ecde9), ROM_SKIP(1) | ROM_BIOS(8)) - // 9: Biostar MB1325PM - Chipset: Chips P82C206 µIC MI9382 MI9381A - // BIOS: AMI 386 BIOS - BIOS-String: 30-0101-D61223-00101111-050591-OPBC-F / MB-1325PM. - Keyboard-BIOS: AMI - // CPU: AMD 386DX/DXL-25 - ISA8: 1, ISA16: 6, ISA8/Memory: 1 - ROM_SYSTEM_BIOS(9, "mb1325pm", "MB1325PM") - ROMX_LOAD( "386-mb1325pm ok.bin", 0x10000, 0x10000, CRC(768689c1) SHA1(ce46b3baf3cd2586ffaccdded789a54583b73a3b), ROM_BIOS(9)) - // 10: Intel SSBC 386AT - Chipset: Intel P8237A, P8254; P8259A, SN74LS612N - BIOS: 380892-01 Rev. 1.04 U53 L - 380892-02 Rev. 1.04 U52 H - // Keyboard BIOS: Intel 453775-001 - ISA8: 2, ISA16: 4, Memory expansion: 2 - OSC: 1.8432 MHz - 32.000 - 14.31818 - ROM_SYSTEM_BIOS(10, "ssbc386at", "Intel SSBC 386AT" ) // no display - ROMX_LOAD( "386-intel-u53-l_32k.bin", 0x10001, 0x8000, CRC(5198a767) SHA1(03dd494e3a218c59c82ebd7b1dd16905bca30773), ROM_SKIP(1) | ROM_BIOS(10)) - ROMX_LOAD( "386-intel-u52-h_32k.bin", 0x10000, 0x8000, CRC(cedbad7a) SHA1(e1365f5a183a342fe58205679a512c4ccd2a705a), ROM_SKIP(1) | ROM_BIOS(10)) - // 11: BEK P405 clone - BIOS-String: 30-0201-428029-00101111-070791-OPWB-0 - was found as a stray ROM - possibly from a 486 board - ROM_SYSTEM_BIOS(11, "opwb", "OPWB") - ROMX_LOAD( "opwb.bin", 0x10000, 0x10000, CRC(e7597fb6) SHA1(2f1eb88138b400cc3ad554d03e532b5d3b0b11ad), ROM_BIOS(11)) - // 12: unknown manufacturer, Logo could be a "J7" - COPYRIGHT (C) 89 REV.C MADE IN TAIWAN - Chipset: Chips P82C206 - // BIOS: AMI 386 BIOS PLUS 896818 - BIOS-String: DINT-6102-091589-K0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS 896819 - // CPU: Intel 386DX-25 FPU: i386DX-33 - OSC: 54.0000MHz, 16.000MHz, 14.31818MHz - ROM_SYSTEM_BIOS(12, "386atj7", "386AT J7" ) - ROMX_LOAD( "386-big_ami_896818_even.bin", 0x10000, 0x8000, CRC(096e99c4) SHA1(29ff718362af4f5d7c0173f4de84290cec60dded), ROM_SKIP(1) | ROM_BIOS(12)) - ROMX_LOAD( "386-big_ami_896818_odd.bin", 0x10001, 0x8000, CRC(6f92634d) SHA1(e36d401975690043c5d5cb1f781036b319e57f37), ROM_SKIP(1) | ROM_BIOS(12)) - // 13: BIOS-String: DAMI-0000-040990-K0 - silkscreen on board: 17:35-2495-02 - 702430D - H8010-30 - ISA8:2, ISA16: 8 - OSC: 14.31818, 50.000MHz - // Chipset:Laser 27-2024-00 4L40F1028, Laser 27-2025-00 4L40F1026, 2xKS82C37A, KS92C59A, KS82C54-10P - CPU: Intel 386DX-33, FPU socket provided - ROM_SYSTEM_BIOS(13, "vt386vt", "VT386VT" ) - ROMX_LOAD( "vt386vt-702430d-rom0_32k.bin", 0x10000, 0x8000, CRC(00013ee6) SHA1(7fed0b176911a94e8127b01bb77445c78f283ff7), ROM_SKIP(1) | ROM_BIOS(13)) - ROMX_LOAD( "vt386vt-702430d-rom1_32k.bin", 0x10001, 0x8000, CRC(c817ec57) SHA1(acdd0e28cb4798059c02e1342da7efe3eaf2c5cb), ROM_SKIP(1) | ROM_BIOS(13)) - // 14: Micronics I-Cache 09-00021-L8949 - Chipset: Chips P82C206 - RAM: M500/385 Memory Board, Cache: 8xCXK5863P-25 - // BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 10a - Keyboard-BIOS: Intel - CPU/FPU: sockets provided, empty - // ISA8: 2, ISA16: 4, Memory: 1 - OSC: 66.0000MHz, unreadable - ROM_SYSTEM_BIOS(14, "l8949", "L8949" ) - ROMX_LOAD( "386-micronics 09-00021-lo_32k.bin", 0x10000, 0x8000, CRC(3a8743e3) SHA1(42262f60cb655ab120d968dbf9eb03387424bf14), ROM_SKIP(1) | ROM_BIOS(14)) - ROMX_LOAD( "386-micronics 09-00021-hi_32k.bin", 0x10001, 0x8000, CRC(c7fce430) SHA1(e0d6e8dbb8b6d68bd92dab63a259d2c9293f5571), ROM_SKIP(1) | ROM_BIOS(14)) - // 15: BIOS-String: 30-0200-ZZ1453-00101111-050591-SCAT3.04-0 - ROM_SYSTEM_BIOS( 15, "kmxc02", "KMX-C-02" ) - ROMX_LOAD( "3ctm005.bin", 0x10000, 0x10000, CRC(cfba6b2a) SHA1(001642016a3c02b031d739bd8b0fcff9470e86d2), ROM_BIOS(15)) - // 16: BIOS: AMI; 11/11/92 - ISA16: 5 - CPU/FPU: Am386DX-40, IIT 3C87-40 - Chipset: FOREX FRX46C521, KS83C206Q - // BIOS-String: 40-0G00-009999-00101111-111192-4X521-F - ROM_SYSTEM_BIOS( 16, "frx521", "using the Forex FRX46C521" ) // no display - ROMX_LOAD( "3fom001.bin", 0x10000, 0x10000, CRC(8fa851c8) SHA1(68ac21357558d98aee4e2ffb903791e4198e0dd0), ROM_BIOS(16)) - // 17: FOREX 386 Super DX System S3B - ROM_SYSTEM_BIOS( 17, "frxs3b", "Forex Super DX System S3B") // no display - ROMX_LOAD( "3fom003.bin", 0x10000, 0x10000, CRC(4e164e0a) SHA1(dc2d08061c443a3e4ced3ab11f1fa094585cbbba), ROM_BIOS(17)) - // 18: BIOS: AMI; 06/06/92 - BIOS-String: 40-0101-001107-00001111-060692-OPWB4SXB-0 / OPTI-495SX (471WB) BIOS VER 1.0 - // cf. driver hot409 - BIOS is capable of detecting 386sx => 486DX2, this particular BIOS was sorted with the 386s on chukaev - ROM_SYSTEM_BIOS( 18, "495sx", "OPTi 82C495SX") - ROMX_LOAD( "3opm009.bin", 0x10000, 0x10000, CRC(2abe36eb) SHA1(d113527ebd06f0359f2decd4ac0c6202f982d45e), ROM_BIOS(18)) - // 19: BIOS-String: EEMI-0386-030891-K0 - Chipset: 88C311 - ROM_SYSTEM_BIOS( 19, "eemi", "EEMI") - ROMX_LOAD( "3zzm002", 0x10000, 0x10000, CRC(c2a7ff22) SHA1(af2e321d3245ad839a41666917bb24cca0f7884d), ROM_BIOS(19)) - // 20: BIOS-String: 30-0300-ZZ1425-00101111-020291-ITOPDX / 23L-1-0000-00-00-0000-00-00-000-K0 - // 000-0-0000-00-00-0000-00-00-00-2 - ROM_SYSTEM_BIOS( 20, "topcat", "TOPCAT") - ROMX_LOAD( "ami_386_vl82c330_even.bin", 0x10000, 0x8000, CRC(a6f3d881) SHA1(40672d58f79d232dbda9685b9aa20533029fbdfc), ROM_SKIP(1) | ROM_BIOS(20)) - ROM_CONTINUE( 0x10001, 0x8000 ) - // 21: BIOS-String: MR BIOS (tm) V1.35 - RAM Pattern Test Failed at 0F0000H - ROM_SYSTEM_BIOS( 21, "mrv135", "MR BIOS V1.35") - ROMX_LOAD( "mrbios_v1.35_opti324_4floppy.bin", 0x10000, 0x10000, CRC(9a21dcd3) SHA1(dcab673fd2df621839671ef8f6a2eff443de39df), ROM_BIOS(21)) - // 22: BIOS-String: SINT-1185-040990-K0 - Chipset: VIA SL9030, SL9010, SL9025, SL9020, SL9020, SL9350, SL9090A - ROM_SYSTEM_BIOS( 22, "3vim002", "3VIM002") - ROMX_LOAD( "3vim002l.bin", 0x10000, 0x8000, CRC(368b66df) SHA1(1bef1e8e1818513061f0c7cf3c731da360c8400b), ROM_SKIP(1) | ROM_BIOS(22)) - ROMX_LOAD( "3vim002h.bin", 0x10001, 0x8000, CRC(02dbb9fe) SHA1(cfce750a4a019c71e59011fb7a7d891b40f61c61), ROM_SKIP(1) | ROM_BIOS(22)) - // 23: BIOS-String: 30-0201-ZZ1343-00101111-050591-OPWB-0 - ROM_SYSTEM_BIOS( 23, "zz1343", "zz1343") - ROMX_LOAD( "ami_zz1343.bin", 0x10000, 0x10000, CRC(f5464c1f) SHA1(cb069c3d1d322aa769d46749716a35259f78264a), ROM_BIOS(23)) - // 24: ID: AT046DX3-B2.1(PQFP) - CPU: AMD Am386DX/DXL-33, FPU socket provided - Keyboard BIOS: JETkey V3 - Chipset: ACC Micro 2168 F9217D103 SC00 333MHz - // RAM: 8xSIMM30, Cache: 64KB - OSC: 14.31818, 66.660MHz - ISA8: 1, ISA16: 5 - // BIOS-String: 30-004-428002-00101111-070791-ACC2046-0 - ROM_SYSTEM_BIOS( 24, "acc386", "AT046DX3-B2.1") - ROMX_LOAD( "acc386.bin", 0x10000, 0x10000, CRC(2177c9ac) SHA1(2e320dcd173137b9b0cbf92602e9b77398921aaf), ROM_BIOS(24)) -ROM_END - - -//************************************************************************** -// 80386 SX and DX motherboard -//************************************************************************** - -// 486MMBO4088 - Chipset : ETEQ ET486SLC2 A, P82C206 - BIOS : MR 386SX/86SLC BIOS V.1.61 -// Keyboard-BIOS: AMI MEGA-KB-F-WP - CPU: TI 486 TX486SLC/E -33MAB / FPU: IIT XC87SLC-33 - RAM: 8xSIMM30, Cache: 3xISSI IS61C256AH-15N, 2xIS61C256A-20N -// OSC: 14.31818MHz, 66.666MHz - ISA16: 7 -ROM_START( mmbo4088 ) // screen remains blank - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "eteq-mrb.bin", 0x10000, 0x10000, CRC(10267465) SHA1(9cc1e7e8b0ec6e0798229489dce5b2b0300bfbd8)) -ROM_END - -// ILON USA, INC. M-396B - Chipset: PC Chip (silk screen sanded off), KS82C6818A - BIOS: AMIBIOS - BIOS-string: 30-0500-ZZ1437-001001111-070791-PC CHIP-F -// Keyboard-BIOS: Regional HT6542 - CPU: i386sx-25, FPU socket provided - RAM: 4xSIMM30, 8x20pin DIP - OSC: 14.31818, 50.000MHz - ISA16: 6 -ROM_START( ilm396b ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "m396b.bin", 0x10000, 0x10000, CRC(e46bd610) SHA1(e5899f126ae6478f4db238cd1db835e0d1877893)) -ROM_END - -// Prolink P386SX-25PW VER:2.00 - Chipset: OPTi 82C281, F82C206 - BIOS/Version: AMI V007B316 - Keyboard-BIOS: AMI KB-BIOS-VER-F - OSC: 14.31818MHz, 50.000000MHz -// CPU: AMD Am386SX-25, FPU: IIT 3C87SX-33 - RAM: 8xSIMM30, Cache: 4x28pin, 2x24pin - ISA16: 8 - -// BIOS-String: 30-0100-008003-00101111-042591-OPSX-0 / OPSX 386SX BIOS / P386SX/25 PW IVN 1.0 1991.7 -ROM_START( p386sx25pw ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "p386sx25pw.bin", 0x10000, 0x10000, CRC(9cbebe61) SHA1(ef90c1a9cc7fc3accdac9738aaf519c1b3d8260d)) -ROM_END - -// ELT-P9 / Most likely ELT-386SX-160D - Chipset: NEC ELT3000A - CPU: Intel 80386sx-16 - RAM: 8xSIPP30, 1MB DIP - BIOS: Phoenix -// Keyboard BIOS: Intel P8242 - DIP6: 000000 - OSC: 14.31818MHz, 32.000MHz - ISA8: 1, ISA16: 6, ISA8/RAM: 1 -ROM_START( eltp9 ) // Phoenix 80386 ROM BIOS PLUS Version 1.10.20 - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "386_676849_l.bin", 0x10000, 0x8000, CRC(ab477e5e) SHA1(78d784f9c320fe7206c2601c4dbb47a90e5cbf96), ROM_SKIP(1)) - ROMX_LOAD( "386_676849_h.bin", 0x10001, 0x8000, CRC(02241258) SHA1(2bd80bab573cd88829edfb85522e978e5e477806), ROM_SKIP(1)) -ROM_END - -// QTC-SXM KT X20T02/HI Rev.3 - Chipset: VLSI / Intel S82343 + S82344A - BIOS Version: QTC-SXN 03.05.07 -// Keyboard BIOS: NEC Performance 204 (c) Quadtel 265 - CPU: i386sx-20, FPU: Intel 387sx -// RAM: 4xSIMM30, sockets for 1MB DIP - ISA8: 2, ISA16: 4 - OSC: 15.31818MHz, 16.000MHz, 40.0000 -ROM_START( ktx20t02 ) // BIOS-String: Quadtel VL82C286 386SX BIOS Version 3.05.07 - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "qtc-sxm-even-u3-05-07.bin", 0x10000, 0x8000, CRC(21f2ca4c) SHA1(7131de700cb95c825e61d611001bab1d3d3bb195), ROM_SKIP(1)) - ROMX_LOAD( "qtc-sxm-odd-u3-05-07.bin", 0x10001, 0x8000, CRC(1543d0f7) SHA1(12281ef81d7aabf291586f96b678074216f0c23a), ROM_SKIP(1)) -ROM_END - -// PC-CHIPS M317 - Chipset: PC Chip CHIP 5 (14L40F2054) / CHIP 6 (14L50F2053), UMC 82C206F - CPU: 80386, FPU socket privided -// BIOS: AMI 386 BIOS PLUS - Keyboard BIOS: AMI Keyboard BIOS Plus - RAM: 8xSIMM30 - Cache: 64K - solder pads for a memory card connector -// ISA8: 2, ISA16: 6 - OSC: 66.6670MHz, 14.318MHz -ROM_START( pccm317 ) // 40-0300-ZZ1347-00101111-031591-UMCWB-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386_pcchips.bin", 0x10000, 0x10000, CRC(8a6046ea) SHA1(1e6c5dacdb5f9a36e558e44466bcd9182d849932)) -ROM_END - -// ZEOS 386 SX-16 - Chipset: VLSI VL82C201-16QC, 82C202, 82C203, 82C204, 82C205A, 82C100 -// DVLX-6099-091589-K0 - AMI 386 BIOS for ZEOS INTERNATIONAL, LTD. / ST. PAUL, MINNESOTA 55112 USA -// (C)1987 American Megatrends Inc.386-BIOS (C) 1989 AMI, for ZEOS INTERNATIONAL - CPU: Intel 386sx-33, FPU sockets provided -// RAM: 36x16/18pin - ISA8: 2, ISA16: 6 - OSC: 64.000000, 14.31818 -ROM_START( zeos386sx ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "zeos_386_16 even.bin", 0x10000, 0x8000, CRC(9897f140) SHA1(b01de83d438ceda4a80e92dc1fc7d725323427b6), ROM_SKIP(1)) - ROMX_LOAD( "zeos_386_16 odd.bin", 0x10001, 0x8000, CRC(0f930857) SHA1(c63670eb336f1998532a4f601d1845902be279e7), ROM_SKIP(1)) -ROM_END - -// Packard Bell PCB-303 Rev.01 - Chipset: ACC Micro 2036 25MHz, UM82C862F - CPU: i386sx-25, FPU socket provided - RAM: 6xSIMM30 - ISA16: 1 -// VGA on board: OTI 512KB - on board: Floppy, IDE, ser, par, PS/2 mouse and keyboard - OSC: 50.000MHz x2 -ROM_START( pcb303 ) // Phoenix 80386 ROM BIOS PLUS Version 1.10 2715 - 19920411102517 - Error 8602 - Auxiliary Device Failure - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "386-packard-pcb-303.bin", 0x00000, 0x20000, CRC(bbb18c76) SHA1(94f3785c3b96dfe7ab53a97d097bfb17c57229b7)) -ROM_END - -// Philips P3239 (aka Headstart / MaxStation / Magnum / Professional 1200, 48CD, 1600, 64CD, P160, SR16CDPhilips 5107-100-36154 (motherboard), -// 5107-200-35452 (CPU card) - Chipset: VLSI VL82C311-FC2, VL82C107-VC, WD37C65CJM -// CPU (on card): Intel 386sx-20, FPU socket provided - BIOS: M27C1001, 48805 P3239 - on board: 2xser, par, VGA, Floppy, IDE -// RAM: 1MB, 1xSIMM72 - VGA on board: CL-GD5325-40QC-A, MUSIC TR9CI710-50DCA, 256KB - OSC: 9.600, 1.8432MHz, 14.31818, 16.000, 40.000 (on CPU card) -// DIP4: 0001 -ROM_START( php3239 ) // no display, beep code sounds like morse - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "386-philips_p3239.bin", 0x00000, 0x20000, CRC(9178e136) SHA1(e3bad39fcf028f459516d4e9a895035891eb801e)) -ROM_END - -// SOYO 386DX Baby-AT - Chipset: ETEQ ET82C4901 C, ET82C4903 A, Chips P82C206 H1 - CPU: Am386DX/DXL-40, FPU: Cyrix 387DX+ -// RAM: 8xSIMM30, Cache: 8x5C6408-12, 1x ATT7C185P-15 - BIOS: AMI 386 BIOS 336468 - BIOS-String: 41-0100-001102-00101111-121291-BENGAUTO-F - REV: C *** 40MHZ *** -// Keyboard BIOS: AMI KB BIOS-VER-F - ISA8: 1, ISA16: 6 - OSC: 8.000MHz, 80.000MHz -ROM_START( sybaby386 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386dx.bin", 0x10000, 0x10000, CRC(9fcfd21f) SHA1(5e7b42be55a45b0b51d2a7e8bd8d6405dbe69129)) -ROM_END - -// Diamond Flower International 386SX-16/20CN Rev 1.0 - Chipset : CHIPS P82C206, P82C215A, P82C812,P82C811 - BIOS: AMI -// CPU: Intel 80386SX-20, FPU socket privided - RAM: 8xSIMM30 - ISA8: 2, ISA16: 6 -ROM_START( dfi386sx ) // Hangs after initialising the graphics card - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "dfi_386sx_16cn_20cn_27c256_low.bin", 0x10000, 0x8000, CRC(58456dc1) SHA1(51f7052366106fe564aedb99ddf6974f6ad4c5cc), ROM_SKIP(1)) - ROMX_LOAD( "dfi_386sx_16cn_20cn_27c256_high.bin", 0x10001, 0x8000, CRC(1ab36d4b) SHA1(640af1c333255cca85543bc369cb0cede45e1ef6), ROM_SKIP(1)) -ROM_END - -// 3SIUD-1.1 - CPU: AMD Am386SX/SXL-25 - Chipset: SiS 85C206, UMC (unreadable) - RAM: SIMM30x4, 8x20pin, 4x16pin -// BIOS: AMI 386SX BIOS 70167 - Keyboard-BIOS: NEC KB-BIOS VER7 - ISA8: 1, ISA16: 5 - OSC: 50.000000MHz, 14.31818MHz -// BIOS-String: 30-0200-ZZ1266-00101111-050591-UMC386SX-0 / 3SIUD-1.0 -ROM_START( 3siud ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "3siud_bios.bin", 0x10000, 0x10000, CRC(24fa8491) SHA1(635ce3db872e39d84f299356b960b0a16e2cf082)) -ROM_END - -// AMI 386 BABY SCREAMER - BIOS: AMI MARK V BABY SCREAMER - Chipset: VLSI VL82C331-FC, VL82C332-FC, Megatrends MG-9275, Chips ??? - OSC: 14.31818, 66.666, 24.000MHz -// BIOS-String: 40-0301-000000-00101111-070791-SCREAMER-0 / BIOS RELEASE 42121691 - On board: 2xserial, parallel, floppy, 1xIDE -ROM_START( amibaby ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROMX_LOAD( "ami_mark_v_baby_screamer_even.bin", 0x00000, 0x10000, CRC(50baacb7) SHA1(c9cb6bc3ab23f35050a7f079109005331eb5de2c), ROM_SKIP(1)) - ROMX_LOAD( "ami_mark_v_baby_screamer_odd.bin", 0x00001, 0x10000, CRC(42050eed) SHA1(c5e1ed9717acb2e3adcb388ccecf90a74d495132), ROM_SKIP(1)) -ROM_END - -// AUVA TAM/25-P2 M31720P - Chipset: µC M19382, M19381A, Chips - CPU: 386DX 25Mhz - BIOS: DA058290 - Keyboard-BIOS: A179859 -// BIOS-String: 30-0101-D81105-00101111-050591-OPBC-0 / AUVA 386 TAM/25/P2(P2,A1,A2), 01/10/1992- ISA8: 1, ISA16: 6, ISA16/Memory: 1 -ROM_START( tam25p2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "tam25-p2.bin", 0x10000, 0x10000, CRC(0ea69975) SHA1(cb7f071a36653cf4f00a8b158a4900efb8f8b8e8)) -ROM_END - -// Elitegroup ELT-386SX-160BE - Chips P82C206 - CPU: Intel 386sx-16, FPU: socket provided - BIOS:Phoenix 679006 - Keyboard-BIOS: Intel P8242/Phoenix -// ISA8: 2, ISA16: 5 - OSC: 14.31818MHz, 32.000MHz - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 22 / ELT-386SX(P9) -ROM_START( elt386sx ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "elt386l.bin", 0x10000, 0x8000, CRC(95fd5508) SHA1(a66cd78f52f3931c6f8486db0d39f4e55244dcea), ROM_SKIP(1)) - ROMX_LOAD( "elt386h.bin", 0x10001, 0x8000, CRC(90c0597a) SHA1(b67b39662a0bb8c0cde1635d3fd3c1f9fbaad3c0), ROM_SKIP(1)) -ROM_END - -// TD70N motherboard - Chipset: Citygate D100-011 - ISA16: 6 - Keyboard-BIOS: JETkey V5.0 - CPU/FPU: Am386SX/SXL-33, i387SX -ROM_START( td70n ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: BIOS: AMI, Version 3.10 - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70N BIOS VERSION 3.10 - ROM_SYSTEM_BIOS( 0, "td70nv310", "TD70N V3.10" ) - ROMX_LOAD( "3cgm001.bin", 0x10000, 0x8000, CRC(8e58f42c) SHA1(56e2833457424d7176f8360470556629115493df), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_CONTINUE( 0x10001, 0x8000 ) - // 1: BIOS: AMI, Version 3.23T - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / BIOS VERSION 3.23T - ROM_SYSTEM_BIOS( 1, "td70nv323", "TD70N V3.23T" ) - ROMX_LOAD( "3cgm002.bin", 0x10000, 0x8000, CRC(bca54fd8) SHA1(35b568c675e58965074162a93cf04918fc8d240f), ROM_SKIP(1) | ROM_BIOS(1) ) - ROM_CONTINUE( 0x10001, 0x8000 ) -ROM_END - -// TD70A and TD70AN motherboards - Chipset: Citygate D110-014, KS83C206Q - ISA8: 1, ISA16: 5 - Keyboard-BIOS: JETkey V5.0 - CPU: Am386SX-40 -ROM_START( td70a ) // 8042 GATE-A20 ERROR - SYSTEM HALTED - ROM_REGION16_LE(0x20000, "bios", 0) - // BIOS: AMI, Version 2.60 - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70A BIOS VERSION 2.60 - ROM_SYSTEM_BIOS( 0, "td70a", "TD70A" ) - ROMX_LOAD( "3cgm003.bin", 0x10000, 0x8000, CRC(1a92bf18) SHA1(520cd6923dd7b42544f8874813fbf81841778519), ROM_SKIP(1) | ROM_BIOS(0) ) - ROM_CONTINUE( 0x10001, 0x8000 ) - // 1: BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70A BIOS VERSION 2.60G - ROM_SYSTEM_BIOS( 1, "td70an", "TD70AN") - ROMX_LOAD( "bios.bin", 0x10000, 0x8000, CRC(0924948b) SHA1(e66b5223a7fb0b3ddb30ad0873ff099abf331262), ROM_SKIP(1) | ROM_BIOS(1) ) - ROM_CONTINUE( 0x10001, 0x8000 ) -ROM_END - -// MORSE KP 386SX V2.21 - Chipset: MORSE 91A300 (sticker), UMC UM82C206L - BIOS: AMI 386SX BIOS (Ver. 2.10) C-1216 - ISA8: 2, ISA16: 6 -// BIOS-String: - 30-0200-ZZ1216-00101111-050591-386SX-0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS C-1216 - CPU: AM-386SX/SXL-25, FPU: iN80287-12 - OSC: 8.000, 14.31818, 50.000 MHz -ROM_START( mokp386sx ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "386-morse_kp386sx.bin", 0x10000, 0x10000, CRC(f3a9c69f) SHA1(6e028a11f3770d7cda814dfa698f2ab5d6dba535)) -ROM_END - -// ID: Morse KP920121523 V2.20 - Chipset: UMC UM82C206L MORSE 91A311 91A310 - CPU: AM386DX/DXL-40, FPU socket provided - RAM: 8xSIMM30, Cache: 32K/64K/128K -// BIOS: AMI 386DX BIOS Ver. 2.11 C-1216 - Keyboard BIOS: KB-BIOS-VER F MEGATRENDS - OSC: 14.31818MHz, 80.000MHz - ISA16: 8, solder pads for a memory extension card -ROM_START( mokp386 ) // BIOS-String: 30-0200-ZZ1216-00101111-050591-KP386DX-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386-morse-kp920121523.bin", 0x10000, 0x10000, CRC(9392e265) SHA1(1df163bef6cf73a1d2a40ac997b96f93d1f2f4d1)) -ROM_END - -// UNICHIP 386W 367C REV 1.0 - Chipset: UNIchip U4800-VLX/9351EAI/4L04F1914, HMC HM82C206 - CPU: AM386DX-40, FPU socket provided - ISA8: 1, ISA16: 5 - OSC: 14.31818 -ROM_START( uni386w ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS: AMI 386C BIOS 2116295 - - // BIOS-String: 40-0400-001107-00101111-111192-U4800VLX-0 / UNICHIP BIOS VER 2.0A 09/27/1993 - Keyboard-BIOS: AMI 386C BIOS KEYBOARD 2116295 - - ROM_SYSTEM_BIOS(0, "ver20a", "Ver. 2.0A") - ROMX_LOAD( "386-2116295.bin", 0x10000, 0x10000, CRC(7922a8f9) SHA1(785008e10edfd393dc39e921a12d1a07a14bac25), ROM_BIOS(0)) - // 1: AMI, 367 UNICHIP 386 BIOS VER 1.0 (1886636) / BIOS-String: 40-0300-001107-00101111-111192-U4800VLX-0 - ROM_SYSTEM_BIOS(1, "ver10", "Ver. 1.0") - ROMX_LOAD( "3ucm002.bin", 0x10000, 0x10000, CRC(9f2e19da) SHA1(ef64c6ad9d02db849d29e3b998ca42b663656bad), ROM_BIOS(1)) -ROM_END - -// SCsxAIO - Chipset: Chips 82C236 (SCATsx), Acer M5105 A3E - On board: 2xCOM, Floppy, ISA -// BIOS-String: Peacock 386sx Ver. 2.0 24.03.92 30-0000-D01131-00101111-070797-SCATsx-8 - ISA16: 6 -ROM_START( scsxaio ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "386-peacock_scsxaio.bin", 0x10000, 0x10000, CRC(54c3cacd) SHA1(b3c821b30052d0c771b5004a3746eb2cfd186c79)) -ROM_END - -// Shuttle 386SX REV 2.0A - Chipset: KU82335 SX042, Intel N82230-2 (Zymos); Intel N82231-2 (Zymos), BIOS: AMI 80386SX BIOS PLUS Ser #039747 -// BIOS-String: - DINT-1216-073089-K0 / 386-BIOS AMI for MORSE 386SX Personal Computer -// Keyboard-BIOS: AMI 386 Keyboard BIOS PLUS Ser.# 039747, CPU: unreadable (SMD), FPU: empty socket - OSC: 32.000 MHz, 14.31818 - ISA8: 2, ISA16: 6 -ROM_START( sh386sx20 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROMX_LOAD( "386-shuttle386sx-even_32k.bin", 0x10000, 0x8000, CRC(8b0c3d96) SHA1(73b6315928161a013cfe81b226606dfae5a8ef94), ROM_SKIP(1) ) - ROMX_LOAD( "386-shuttle386sx-odd_32k.bin", 0x10001, 0x8000, CRC(9c547735) SHA1(3cef5290324aab9d7523e98bf511eaea351e580d), ROM_SKIP(1) ) -ROM_END - -// Alaris Cougar - Chipset: OPTi 82C499 - ISA16: 5, ISA16/VL: 2 -// BIOS: MR BIOS (r) V1.65 - CPU: 75MHz IBM Blue Lightning -ROM_START( alacou ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "cougrmrb.bin", 0x10000, 0x10000, CRC(c018f1ff) SHA1(92c4689e31b367baf42b12cad8800a851cc3e828)) -ROM_END - -// Alaris Tornado 2 - CPU: 486 - Chipset: Opti/EFAR/SMC - ISA16: 4, PCI: 3, ISA16/VL: 2 - On board: Floppy, 1xIDE, parallel, 2xserial -ROM_START( alator2 ) // unknown beep code LH-HL - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "tornado2.bin", 0x00000, 0x20000, CRC(2478136d) SHA1(4078960032ca983e183b1c39ae98f7cdc34735d0)) -ROM_END - -// DTK PEM 2530 - Chipset: VLSI 9032BT/217203/VL82C100-0C -// Board's original ROMs were damaged (Datatech dtk 386 V4.26 A1763), "original" ROMs came from another user, V3.10 ROMs from a different board -// ISA8: 2, ISA16: 5, Memory connector: 1 - OSC: 40.000 MHz - 14.31818 MHz -ROM_START( pem2530 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // Phoenix 80386 ROM BIOS PLUS Version 1.10 01 KENITEC TECHNOLOGIES - ROM_SYSTEM_BIOS(0, "pem2530ori", "DTK PEM 2530 original") - ROMX_LOAD( "386-dtk_pem-2530_bios-low.bin", 0x10000, 0x8000, CRC(d9aad218) SHA1(a7feaad2889820852e3543229b0b103288470732), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "386-dtk_pem-2530_bios-high.bin", 0x10001, 0x8000, CRC(550c4d77) SHA1(05aba1a98e738f9b706b5a8f09b5b6c86bd336e2), ROM_SKIP(1) | ROM_BIOS(0)) - // 80386 BIOS Version 3.10 Rev. 2.06 (BIOS not original, works in PEM 2530) - // additional info from chukaev.ru54.com: CPUBT-S26361-D548 (Siemens?) - Chipset: VL82C320A, VL82C331, VL16C452B - CPU: NG80386SX-20, socket for 80387SX - ROM_SYSTEM_BIOS(1, "pem2530", "DTK PEM 2530") - ROMX_LOAD( "386-dtk pem-2530-high_32k.bin", 0x10000, 0x8000, CRC(56a822c0) SHA1(b65797c0f87a0815b393758af9c059e6d7172ae9), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "386-dtk pem-2530-low_32k.bin", 0x10001, 0x8000, CRC(8688d883) SHA1(c3034c8b343786cb89de48fb2f4992160414f89e), ROM_SKIP(1) | ROM_BIOS(1)) -ROM_END - -// SM 386-40F - MR BIOS (r) V1.40 - Ver: V1.40-FORX300 -// Chipset: SIS 85C206, FOREX FRX36C200, FOREX FRX36C300 -ROM_START( sm38640f ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "forex300.bin", 0x10000, 0x10000, CRC(8d6c20e6) SHA1(cd4944847d112a8d46612e28b97e7366aaee1eea)) -ROM_END - -// Soyo SY-019H and SY-019I BIOS-String: 30-0200-DH1102-00101111-070791-ETEQ386-0 / REV C3 -// Chipset: SIS 85C206, ETEQ ET82C493, ET82C491 -ROM_START ( sy019hi ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ami_soyo_sy-19i.bin", 0x10000, 0x10000, CRC(369a040f) SHA1(3dbcbcb8b8a50717cae3b17f44ca1b7c394b75fc)) -ROM_END - -// PC-Chips M321 - RAM: 8xSIMM30, Cache: 8 sockets, 4 sockets occupied by CY71C199-25PC - CPU: AM386-DX40, FPU: socket provided - OSC: 80.000MHz, 14.31818 -// Chipset: PCChips C206/306, CHIP6/4L04F1666, CHIP5/4L04F1282 (rev. 2.3, 2.5 and 2.7 boards) - ISA8: 2, ISA16: 6 -ROM_START( pccm321 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 30-0201-ZZ1347-00101111-050591-M320-0 - ROM_SYSTEM_BIOS(0, "m321_23", "PCChips M321 Rev.2.3") // also on a rev. 2.5 board with C&T J38600DX-33, ULSI MathCo-DX33 - ROMX_LOAD( "pcchips_m321_rev2.3.bin", 0x10000, 0x10000, CRC(ca0542e4) SHA1(8af9f88e022f8115708178c6c0b313ea0423a2b5), ROM_BIOS(0) ) - // BIOS-String: 30-0100-001437-00101111-060692-PC CHIP-0 - ROM_SYSTEM_BIOS(1, "m321_27_1", "PCChips M321 Rev.2.7 #1") - ROMX_LOAD( "3pcm002.bin", 0x10000, 0x10000, CRC(0525220a) SHA1(5565daea1db67fb2e6f5e7f5ddf5333569e74ab3), ROM_BIOS(1) ) - // BIOS-String: 30-0100-001437-00101111-060692-PC CHIP-0 - TRANS-AMERITECH ENTERPRISES, Inc. - ROM_SYSTEM_BIOS(2, "m321_27_2", "PCChips M321 Rev.2.7 #2") - ROMX_LOAD( "3pcm004.bin", 0x10000, 0x10000, CRC(d7957833) SHA1(b512d9fc404c4282fb964444aa70a9760edad7db), ROM_BIOS(2) ) - // BIOS-String: 30-0100-ZZ1437-00101111-070791-PC CHIP-0 - ROM_SYSTEM_BIOS(3, "m321_27_3", "PCChips M321 Rev.2.7 #3") - ROMX_LOAD( "pcchips_m321_rev2.7_2.bin", 0x10000, 0x10000, CRC(1c529364) SHA1(a0cb0dc31b34377024efb3124f4167a8e1d748e6), ROM_BIOS(3) ) -ROM_END - -// Morse M3 V3.00 - Chipset: Morse 4L04F1282 + 4L04F1666 + 92A206S / possibly a rebranded OPTi 82C391 chipset - CPU: Am386DX/DXL-33, -// CPU (80386DX) and FPU socket (W3167) provided - RAM: 8xSIMM30, Cache: 4xMOSEL MS62256-A-25NC, 1xT6C6408-20 - BIOS: AMI 386DX BIOS PLUS Ver.3.00 386DX C-1216 -// BIOS-string: 30-0201-ZZ1216-00101111-050591-386DX-0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS C-1216 - OSC: 66.667MHz, 14.31818MHz - ISA8: 1, ISA16: 6 -ROM_START( mom3v3 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "morse_m3_v3.00.bin", 0x10000, 0x10000, CRC(4748a084) SHA1(169696ea08f25e05928c48cc8328c67c51789f0d)) -ROM_END - -// PC-Chips M326 -// Chipset: SARC RC4018A4/9324 and SARC RC6206A4/9408-AHS or SARC RC4018A4/9324 and RC4919A4-9323 (v5.5 board) or SARC RC2016A4-9320 and RC4019A4-9324 (v5.3) -ROM_START( pccm326 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Award Modular BIOS 4.50 - ROM_SYSTEM_BIOS(0, "pccm326", "PCChips M326 V5.2") // BIOS reports a 66MHz 386DX original board has a TI TX486DLC/E-40PCE and IIT 4C87DLC-40 CPU/FPU combo - ROMX_LOAD( "m326_v5.2_m601-326.bin", 0x10000, 0x10000, CRC(cca6a443) SHA1(096c8bfa000c682d6c801da27c7fd14243ebb63b), ROM_BIOS(0) ) - // 1: BIOS-String: 40-0100-001437-001001111-080893-4386-0 / Release 10/01/93 - also on an "M601 Rev. 1.3" board with a i486DX-33 (BIOS AMI AB0077440 - Keyboard-BIOS: Regional HT6542) - ROM_SYSTEM_BIOS(1, "m326r53", "PC-Chips M326 Rev. 5.3") - ROMX_LOAD( "m326_rev.5.3.bin", 0x10000, 0x10000, CRC(6c156064) SHA1(362ce5a2333641083706a878b807ab87537ca1e6), ROM_BIOS(1) ) - // 2: BIOS: AMI; 08/08/93; Release 10/01/93 - ROM_SYSTEM_BIOS(2, "m326", "M326") // no display - ROMX_LOAD( "3sam005.bin", 0x10000, 0x10000, CRC(f232cd4b) SHA1(e005aa3a7d160223fb2912cf2cd5cc8af49e79a5), ROM_BIOS(2) ) -ROM_END - -// Elitegroup UM386 Rev. 1.1 - UMC UM82C482AF, UM82C391A, UM82C206F - OSC: 80.000MHz, 14.31818MHz -// BIOS: AMI-1131 E-91844945 - Keyboard-BIOS: AMI KEYBOARD-BIOS-VER-F / Intel P8942AHP -// RAM: SIMM30x8, Cache: 9xW2464AK-20, 1x ISA8, 7xISA16 - CPU: AM386DX/DXL-40 -ROM_START( ecsum386 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 30-0500-D01131-00101111-070791-UMCWB-0 / UM386 V1.1 03-06-92 - ROM_LOAD( "ami_um386_rev1.1.bin", 0x10000, 0x10000, CRC(81fe4297) SHA1(efb2ba2be6f08cb487ee1b867a2456ed6b5975ad)) -ROM_END - - -// ***** 386sx motherboards using the ALi 1217 chipset - -ROM_START( alim1217 ) - ROM_REGION16_LE(0x20000, "bios", 0) - //0: BIOS-String: 30-0100-ZZ1453-00101111-070791-ACER1217-0 / CPU: 386SX-40 - ROM_SYSTEM_BIOS( 0, "m121701", "ALi M1217 #1" ) - ROMX_LOAD( "3alm005.bin", 0x10000, 0x10000, CRC(8708727c) SHA1(9be25b1af080aee863441cf0d25d0f984accb086), ROM_BIOS(0)) - // 1: BIOS-String: 30-0100-D01131-00101111-070791-ALI1217-F - ROM_SYSTEM_BIOS( 1, "m121702", "ALi M1217 #2" ) - ROMX_LOAD( "3alm006.bin", 0x10000, 0x10000, CRC(e448c436) SHA1(dd37127920a945f1273c70c41e79e4fc70a5de01), ROM_BIOS(1)) - // 2: BIOS-String: 30-0501-D81105-00101111-070791-ACER1217-0 - 386SX NPM/33,40-A0(2) 05/12/1993 - ROM_SYSTEM_BIOS( 2, "m919a00", "386SX NPM/33,40-A0" ) - ROMX_LOAD( "m919a00_npm-40.bin", 0x10000, 0x10000, CRC(4f330d82) SHA1(08224c7bcfb2a859b682bf44ac1ac7fd9f2ade78),ROM_BIOS(2)) - // 3: GMB-386SAT - Am386SX-40, IIT 3C87SX-33 - flashing "K/B controller incorrect" - Chipset: ALi M1217-40 - ISA8: 1, ISA16: 5 - // BIOS: AMI 386SX BIOS AA1280569 - BIOS-String: 30-0100-428036-00101111-111192-ALI1217-F - Keyboard-BIOS: JETkey V5 - ROM_SYSTEM_BIOS( 3, "gmb386sat", "GMB-386SAT_V1.0" ) - ROMX_LOAD( "gmb-386sat_v1.0.bin", 0x10000, 0x10000, CRC(59ecc773) SHA1(f2007fce76b3a91f51bfb5f43c1539d5ae06d35f), ROM_BIOS(3)) - // 4: ML-765 V2 - BIOS: AMI AA0508210 - BIOS-String: 30-0103-DJ1113-00101111-070791-ACER1217-0 - ROM_SYSTEM_BIOS( 4, "ml765", "ML-765" ) - ROMX_LOAD( "3alm011.bin", 0x10000, 0x10000, CRC(27a799d4) SHA1(873cf5968923c5a655ff32f3d968b7cddcb08e76), ROM_BIOS(4)) - // 5: BIOS: AA0030659 - BIOS-String: 30-0100-428029-00101111-070791-ACER1217-0 - ROM_SYSTEM_BIOS( 5, "m121703", "ALi M1217 #3" ) - ROMX_LOAD( "3alm012.bin", 0x10000, 0x10000, CRC(5b822a2a) SHA1(e61b27f06cfec54973fbabff277bde617847b1e2), ROM_BIOS(5)) - // 6: 303N1 - Chipset: ALi M1217, M5818 - BIOS: MR BIOS MR001-SX V.1.41 - Keyboard BIOS: JETkey V3.0 - CPU: i386sx, FPU socket provided - // RAM: 4xSIMM30 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS( 6, "acer310", "Acer 310" ) - ROMX_LOAD( "3alr001.bin", 0x10000, 0x10000, CRC(b45e5c73) SHA1(81ef79faed3914ccff23b3da5e831d7a99626538), ROM_BIOS(6)) - // 7: 8517 V3.2 - Chipset : ALI M1217-40, M5818 A1 - CPU: AMD Am386SX-40, FPU: ULSI Advanced Math Coprocessor SX/SLC US83S87 - BIOS : MR 386SX BIOS V.1.40 SX M1217 - // BIOS-String: - Keyboard-BIOS: JETkey V3.0 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS( 7, "8517v32", "8517 V3.2" ) // MR BIOS (r) V1.40 - ROMX_LOAD( "m1217mrb.bin", 0x10000, 0x10000, CRC(8ac66b9d) SHA1(909e5129066d1b0563b03c4834f9894c9291c287), ROM_BIOS(7)) -ROM_END - -// Computechnik ASC486SLC, 386sx slot CPU - Chipset: ALi M1217-40, PIC P4020 - CPU: TI 486SLC/E -33P AF - RAM: 4xSIMM30 -// OSC: 66.000 - BIOS: AMI 386SX BIOS AA1330085 - Keyboard-BIOS: AMI MEGAKEY - On board: 2xser, par, Floppy, IDE -// BIOS-String: 30-0100-001588-00101111-111192-ALI1217-0 / A-03 -ROM_START( asc486slc ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD("asc486slc.bin", 0x10000, 0x10000, CRC(aadbd3b6) SHA1(635df5b3cfd4525bc8ad9067703c8860dacd987a)) -ROM_END - -// Manufacturer/Identifier: ECS 8517 v3.3 - Chipset: ALI-M1217-40, M5818 A1 9347 TS 10 A45296 - CPU: 386sx, FPU socket provided -// RAM: 4xSIMM30 - BIOS Version: AMI 386sx BIOS AA1021639 - Keyboard BIOS: JETkey V5 - BIOS String: 40-0000-zz1218-00101111-070791-ALI1217-0 -// Board marking: 8517 V3.3 and 200-03690-341-4 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 -ROM_START( ecs8517 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD("8517_v33.bio", 0x10000, 0x10000, CRC(c2b18ace) SHA1(fb10108a8d7a4782442f7a518e0ebab01f2e54bd)) -ROM_END - - -// 386 motherboards using the ALi M1419 chipset - -ROM_START( alim1419 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: KMC-A419-8 VER 1.0 - Chipset: M5818 A1, ALi M1421 A1, M1419 A0 - OSC: 14.31818, 80.000MHz - // BIOS-String: 40-0100-001453-00101111-121291-ALI1419-0 / 486DLC/386DX, ISA8: 1, ISA16: 6 - ROM_SYSTEM_BIOS ( 0, "kmca419", "KMC-A419-8 VER 1.0" ) - ROMX_LOAD( "3alm010.bin", 0x10000, 0x10000, CRC(733d0704) SHA1(b5724f98047e95ea41aaa396a0374357f20cf2de), ROM_BIOS(0)) - // 1: BIOS: Award Modular BIOS v4.50 - BIOS-String: 06/22/93-ACER-M1419-214k6000-00 - ROM_SYSTEM_BIOS( 1, "alim141901", "ALi M1419 #1" ) - ROMX_LOAD( "3alw001.bin", 0x10000, 0x10000, CRC(15bd5c90) SHA1(abe2a8613d2950b27701468144fe9de8063d6e57), ROM_BIOS(1)) - // 2: 386AC P102 - CPU: Am386DX-40, FPU socket provided - Chipset: ALi M1419 A1, M1421 A1 - BIOS: AMI 386DX ISA BIOS AA1226493 - - // Keyboard-BIOS: JETkey V3 - RAM: 8xSIMM30, Cache: 9x28pin - ISA8: 8, ISA16: 7 - OSC: 14.31818, 80.000MHz - // BIOS-String: 40-0102-001128-00101111-121291-ALI1419-0 - ROM_SYSTEM_BIOS( 2, "386acp102", "386AC P102") - ROMX_LOAD( "386ac_p102_ami_aa1226493.bin", 0x10000, 0x10000, CRC(43ba9775) SHA1(9f80ebf1e7ef1d7e5b7c2aad5839b4f982db75d1), ROM_BIOS(2)) - //3: ID: Unknown C3404 Rev:B - Chipset: ALI M1419 A1, M5818 A1, another unreadable (silk screen: M1421) - RAM: 8xSIMM30, Cache: 8x28pin DIP, 64K or 256K - // CPU: AMD Am386DX-40, solder pads for Intel 80386 socket provided, FPU socket provided - BIOS: AMI 386DX ISA BIOS AA1458354 - // BIOS Version: "386DX Subversion 13.19.02 3/23/1993" - BIOS String: 40-0100-001374-00101111-121291-ALI1419-F - Keyboard BIOS: JETkey V3 - // ISA8: 1, ISA16: 6 - OSC: 14.31818, 80.000 MHz - ROM_SYSTEM_BIOS( 3, "c3404", "C3404") // displayed BIOS-String in MAME has -0 instead of -F: this denotes the keyboard controller version http://www.idhw.com/textual/guide/inst_mobo_ami.html - ROMX_LOAD( "386c3404.bio", 0x10000, 0x10000, CRC(8005f1f6) SHA1(1c78a7a3f134fd1299b48cd12b08b013c212fa59), ROM_BIOS(3)) -ROM_END - - -// ***** 386 Motherboards using the Ali M1429 A1 and M1431 A2 chipsets ... they hang before initializing the graphics card - -ROM_START( alim1429 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS( 0, "386ali", "386 board with Ali chipset" ) - ROMX_LOAD( "386_ali_ami_511767.bin", 0x10000, 0x10000, CRC(3c218db4) SHA1(785ea7c36e8be5e7410524e90170d4985cbc9c24), ROM_BIOS(0)) - // 1: Seritech SER-386AD III (written on the underside of the board) - CPU: AMD Am386DX-40 - ISA16: 5 - // BIOS : AMIBIOS 04/04/1993 Ser.# 579092 - BIOS-String : 40-0212-001133-00101111-040493-ALI1429-F - Keyboard BIOS: Regional HT6542 - ROM_SYSTEM_BIOS( 1, "ser386ad", "SER-386AD III" ) - ROMX_LOAD( "ser386ad3.bin", 0x10000, 0x10000, CRC(d80d6deb) SHA1(9f889f7464255431c13ac91d7df31b325447fef5), ROM_BIOS(1)) - // 2: ISA8: 1, ISA16: 5, BIOS-String: 40-0103-001256-00101111-080893-ALI1429-H, BIOS: AMIBIOS, 08/08/93, 386DX ISA BIOS, AA2722981 - ROM_SYSTEM_BIOS( 2, "revb", "REV:B") - ROMX_LOAD( "3alm001.bin", 0x10000, 0x10000, CRC(56ea4d9d) SHA1(0633f78a0013a62be974233a3cad6a5d3cbe90d1), ROM_BIOS(2)) - // 3: CPU: 386DX-40 - - ROM_SYSTEM_BIOS( 3, "alim142901", "ALi M1429 #1" ) - ROMX_LOAD( "3alm007.bin", 0x10000, 0x10000, CRC(b72d754a) SHA1(364a976eac61bc923b76ccddd13f80e0727e5df5), ROM_BIOS(3)) - // 4: REV:8 - CPU: 386DX-40 - ROM_SYSTEM_BIOS( 4, "alim142902", "ALi M1429 #2" ) - ROMX_LOAD( "3alm008.bin", 0x10000, 0x10000, CRC(4cb1052d) SHA1(995a590beb0654c5e784f10019c10bd4b0278d9b), ROM_BIOS(4)) - // 5: ??? REV 2.3, Chipset: Asaki 3A029, 3A031 (= ALi 1429) - BIOS: AMI 386 BIOS S/N: 254468 - // BIOS-String: 40-0215-001926-00101111-040493-ALI1429 - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS( 5, "asaki", "386 with Asaki chipset" ) - ROMX_LOAD( "3asm001.bin", 0x10000, 0x10000, CRC(57c72c4d) SHA1(934223fcd39533bca2e7e57406b1800d9e900ef0), ROM_BIOS(5)) -ROM_END - -// Daewoo AL486V-D Rev:1.1 - BIOS/Version: AMI v299 08/08/93, BIOS-String: 40-0100-001131-00101111-080893-ALI1429 - Keyboard-BIOS: MEGAKEY -// BIOS: AMI v1.9 299 WinPro-d S/No. E-94237376 - OSC: 14.31818 -ROM_START( al486vd ) // this is a 386 class board despite the name - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "al486v-d_v299.bin", 0x10000, 0x10000, CRC(75c75d58) SHA1(50e314cdefe39e8e6f74b9b045a15cc53b3f16ba)) -ROM_END - - -// 386 motherboards using the Chips & Technologies P82C351, P82C355, P82C356 chipset - -// ABIT FU340 - 6x 16-bit ISA + 2x 8-bit ISA - RAM: SIMM30x8, Cache: 32/64/128/256KB with TAG (TULARC info) -// BIOS-String: 30-0200-D01247-00101111-050591-PEAKDM_B-0 / FU340 REV-B PAGE MODE BIOS -ROM_START( fu340 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ami_abit_fu340.bin", 0x10000, 0x10000, CRC(9ea90d90) SHA1(091bdae7b1e36ac5168823d80d5907af2a95e583)) -ROM_END - -// GES 9051N-386C VER -0.01 - CPU/FPU: i386DX-33, i387DX 16-33 - Chipset: Chips F82C351, F82C355, F82C356 - BIOS: AMI 386DX ISA BIOS (AA0365368) -// BIOS-String: 30-1113-002101-00001111-050591-PEAKDM_B-0 / GES 9051N BIOS VERSION 2.0 - ISA8: 3, ISA16: 5 -ROM_START( ges9051n ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3ctm001.bin", 0x10000, 0x10000, CRC(7f03f606) SHA1(d03d5b6541bc7f41d78159f82aa8057229516c37)) -ROM_END - - -// ***** 386sx motherboards using the Chips SCAMPSX chipset - -// ANIX CH-386S-16/20/25G P/N:001-0386S-016 VER 1.0 - Chipset: CHIPS F82C836 - BIOS: AMI 386sx BIOS PLUS S/NO. 141334 -// BIOS-String: 30-0100-D01425-00101111-050591-SCAMPSX-0 - Keyboard-BIOS: Intel/AMI - CPU: Intel (SMD), label not readable - FPU: socket available - ISA16: 6 - OSC: 14.31818 - 32.000 MHz -ROM_START( anch386s ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "386-ch-386s.bin", 0x10000, 0x10000, CRC(8902c64b) SHA1(3234bac6240a3a0bd05302c9ca587f5ae083f2f4)) -ROM_END - -// 80386SX-VH-COM - Chipset: VLSI VL82C311 VL82C113 - BIOS: Award 386SX-BIOS - BIOS-String: 386SX Modular BIOS v3.15 Copyright(c)1984-91 Award Software Inc. -// CPU: i386sx-25, FPU socket provided - RAM: 8xSIMM8 - OSC: 16MHz, 14.31818, 50.000MHz - ISA8: 2, ISA16: 6 -ROM_START( 386sxvhcom ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "80386sx-vh-com.bin", 0x10000, 0x10000, CRC(65f5d279) SHA1(81c40ad1f7dde3235a074d97768ed7e09cf05f52)) -ROM_END - -ROM_START( scamp386sx ) - ROM_REGION16_LE(0x20000,"bios", 0) - // 0: BIOS-String: 30-0100-D61204-00101111-050591-SCAMPSX-0 / MB-1316/20/25VST - ROM_SYSTEM_BIOS(0, "mb386sx", "mb386sx-25spb") // VLSI SCAMPSX - ROMX_LOAD( "386sx_bios_plus.bin", 0x10000, 0x10000, CRC(f71e5a8d) SHA1(e73fda2547d92bf578e93623d5f2349b97e22393), ROM_BIOS(0)) - // 1: BIOS-String: 30-0400-428027-00101111-070791-SCMPSX-0 / VLSI SCAMP 386SX 16/20/25MHz - seen on a PC-Chips/Amtron board - ROM_SYSTEM_BIOS(1, "scamp01", "VLSI SCAMPSX #1") - ROMX_LOAD( "ami_386sx_vlsi_scamp_070791.bin", 0x10000, 0x10000, CRC(082d071c) SHA1(69af9a951f138146036b3c9ac3761cc6589b6cf5), ROM_BIOS(1)) - // 2: Dataexpert (Unknown model) - Chipset: VLSI VL82C311-25FC2 (SCAMPSX), HM6818P - BIOS: AMI 05/05/1991 on a 64KB "Fairchild FM27C512" - // BIOS-String: 30-0100-D41107-00101111-050591-SCAMPSX-0 - SCAMP 386SX WITHOUT COMBO - Keyboard BIOS: 247076 - CPU: AM386SX/SXL-25 - OSC: 50.000MHz, 16.000MHz, 14.31818 - ISA16: 7 - ROM_SYSTEM_BIOS(2, "datax386sx", "Dataexpert 386sx") - ROMX_LOAD( "bios.bin", 0x10000, 0x10000, CRC(0ba46059) SHA1(b152796e9ace0cd17c413df14d989b9cb23aa529), ROM_BIOS(2)) - // 3: VLSI 311 386SX VER 1.0 - CPU: AM386 SX/SXL-25 - Chipset: VPL201, VPL101 - BIOS: AMI 386sx 409425 - OSC: 50.000 MHz - ISA16: 6 - // BIOS-String: 30-0400-D41107-00101111-070791-SCMPSX-0 - ROM_SYSTEM_BIOS( 3, "vlsi311", "VLSI 311") - ROMX_LOAD( "vlsi_311_386sx_ver_1.0_bios.bin", 0x10000, 0x10000, CRC(98056235) SHA1(3a3ff07808c4d43e4935c7463741e3ed8e515af9), ROM_BIOS(3)) - // 4: BIOS-String: 30-0100-ZZ1379-00101111-050591-SCAMPSX-0 / SCAMP 386SX - Chipset: (VLSI ???) 82C310, 82C311 - CPU: 386SX-25 - ROM_SYSTEM_BIOS(4, "scamp02", "VLSI SCAMPSX #2") - ROMX_LOAD( "3vlm002.bin", 0x10000, 0x10000, CRC(4d2b27b3) SHA1(3c67d7bd507ceb4d1762866f69c2cb94cd799a15), ROM_BIOS(4)) -ROM_END - - -// ***** 386 Motherboards using the Chips & Technologies CS8230 chip set: P82C301C, P82C302C, P82A303, P82A304, 2x P82B305, P82A306 A, P82C206 - -// ECS (Elitegroup) 386A - Chipset: CHIPS P82C301/2/5 + P82A303/4/6 + P82C206 - BIOS/Version: AMI 386-BIOS / 386A V1.1 05-19-90 (2 x 27C256) -// BIOS String: EC&T-1131-040990-K8 - Keyboard BIOS: AMI Keyboard BIOS PLUS - CPU: Intel 80386DX-25, FPU: 80387DX-25 - RAM: 8xSIMM30 -// ISA8: 2, ISA8/RAM: 1, ISA16: 5 - OSC: 32.0000MHz, 50.0000MHz, 14.31818 -ROM_START( ecs386a ) // hangs after initialising the graphics card - ROM_REGION32_LE(0x20000, "bios", 0) - ROMX_LOAD( "386a012l.bin", 0x10000, 0x8000, CRC(8a067777) SHA1(aadc84867155e4e167a0380bd409dba62fd238a1), ROM_SKIP(1)) - ROMX_LOAD( "386a012h.bin", 0x10001, 0x8000, CRC(525fc3bd) SHA1(3ab8cb5989933edc6aa9f99fcab518307b60552b), ROM_SKIP(1)) -ROM_END - -ROM_START( cs8230 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: EC&T-1332-040990-K0 - ROM_SYSTEM_BIOS(0, "cs823001", "CS8230 #1") - ROMX_LOAD( "ami_386_cs8230_chipset.bin", 0x10000, 0x10000, CRC(1ee766d0) SHA1(75dba3c9817dfe6caca46f5f4f2f1d76ba88d3c7), ROM_BIOS(0) ) - // 1: BIOS-String: EC&T-1197-022589-K0 - ROM_SYSTEM_BIOS(1, "cs823002", "CS8230 #2") - ROMX_LOAD( "3ctm004l.bin", 0x10000, 0x8000, CRC(b6efc361) SHA1(88d89bf5e7c57ffe4751e14220ac82a2d0a12994), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "3ctm004h.bin", 0x10001, 0x8000, CRC(f26c2672) SHA1(1d3a2554bbf3dc554970e0d62d9c5fad24977f55), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// ECS-386/32 - OSC: 40.000MHz, 32.000MHz, 14.318MHz - CPU: 386DX-20, FPU socket provided -// 8x SIMM, 5x 16-bit ISA, 2x 8-bit ISA, 1x 32-bit proprietary memory expansion slot -ROM_START( ecs38632 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: EC&T-1131-030389-K0 - ROM_SYSTEM_BIOS( 0, "030389", "030389") - ROMX_LOAD( "ami_ecs-386_32_lo.bin", 0x10000, 0x8000, CRC(e119d6a4) SHA1(bcc6164173b44832b8ebfa1883e22efc167e2cd4), ROM_SKIP(1) | ROM_BIOS(0) ) - ROMX_LOAD( "ami_ecs-386_32_hi.bin", 0x10001, 0x8000, CRC(e3072bf8) SHA1(74eec72e190f682cfd5ae5425ebdc854e0ba7bc9), ROM_SKIP(1) | ROM_BIOS(0) ) - // 1: BIOS-String: EC&T-1131-092588-K0 - ROM_SYSTEM_BIOS( 1, "092588", "092588") - ROMX_LOAD( "ami_1131_bios_l.bin", 0x10000, 0x8000, CRC(145c3905) SHA1(9ee2615982e28082971bae8ef8a1f936313ac8c8), ROM_SKIP(1) | ROM_BIOS(1) ) - ROMX_LOAD( "ami_1131_bios_h.bin", 0x10001, 0x8000, CRC(73d57778) SHA1(176c90134540d5054c99c077126c7c5a65199175), ROM_SKIP(1) | ROM_BIOS(1) ) -ROM_END - -// SY-012 16/25 386MB VER: 5.2 - Chipset: Chips P82C301C; P82A306; P82A303; P82C206; P82A304; P82C302; P82B305 -// BIOS: AMI 386 BIOS 10084 - BIOS-String: DC&T-1102-082588-K0 - CPU: i386DX-33, ISA8: 2, ISA16: 5, Memory: 1 -// OSC: 14.31818 - 20.000 MHz - 50.000 MHz - 32.000 MHz -ROM_START( sy012 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROMX_LOAD( "386-sy-012-l_32k.bin", 0x10000, 0x8000, CRC(6ab197f4) SHA1(7efd9033af3a0b36bc5be64cb28c6218cda4d13c), ROM_SKIP(1) ) - ROMX_LOAD( "386-sy-012-h_32k.bin", 0x10001, 0x8000, CRC(61aedfdb) SHA1(0f492dc8102386a1c475c5637fb7853d81d3efb6), ROM_SKIP(1) ) -ROM_END - -// Goldstar 611-606A - Chipset: CHIPS P82C206 P82C301 P82A303 P82C302 P82A304 2xP82A305 - -// OSC: 14.318 - 9.6000000 MHz - 40.000000 MHz - 16.000000 MHz -// BIOS: TI CMC3000 - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 01 - release 2.7B -ROM_START( gs611606a ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROMX_LOAD( "386-goldstar-e_32k.bin", 0x10000, 0x8000, CRC(3f358257) SHA1(1570f3de1955895c29c1c4240e1cd47aadff1be0), ROM_SKIP(1) ) - ROMX_LOAD( "386-goldstar-o_32k.bin", 0x10001, 0x8000, CRC(c5d75635) SHA1(70ceb4089bfd3af6853c3d6e28dbded0c43f6a40), ROM_SKIP(1) ) -ROM_END - -// DFI386-20.REV0 - Chipset: Chips 2xP82B305 P82A304, P82C302 P82C301 P82C206, two unreadable - initializes graphics card then hangs -// BIOS: AMI 386 BIOS PLUS Ser.#: 102856 - Keyboard BIOS: AMI 386 BIOS PLUS Ser.#:102856 -// CPU: i386DX-20 - ISA8: 1, ISA16: 5, Memory: 1 - Memory card shown in photos -// OSC: OSC1: 14.31818, OSC2: 16.000MHz, OSC3: unreadable, OSC4: 40.000MHz -ROM_START( dfi386 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROMX_LOAD( "386-dfi-386-20_even_32k.bin", 0x10000, 0x8000, CRC(2d1309f8) SHA1(a75816b97d1f763dba39bdccf8e58729a58b0e56), ROM_SKIP(1) ) - ROMX_LOAD( "386-dfi-386-20_odd_32k.bin", 0x10001, 0x8000, CRC(1968fe11) SHA1(b5662daa57751859d2cfa7740f708277cbe35080), ROM_SKIP(1) ) -ROM_END - - -// ***** 386 Motherboards using the Forex FRX36C300 + FRX46C402; SiS 85C206 chipset - -// Chipset: FOREX FRX46C402 FRX36C300 SIS 85C206 SiS 85C206 - CPU: Intel 80386DX-16 - ISA16: 7, ISA16/Memory: 1 - OSC: 66.000MHz -ROM_START( frxc402 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS: AMI 386 BIOS PLUS - Ser. 006707 - BIOS-String: 30-0400-ZZ1266-00101111-070791-FORX-0 / FRX/386DX CACHE SYSTEM - ROM_SYSTEM_BIOS(0, "frx386", "FRX/386") - ROMX_LOAD( "386-forex.bin", 0x10000, 0x10000, CRC(4a883c14) SHA1(1c2de190ccd152ff894f9fd128e028d4fa63109a), ROM_BIOS(0)) - // 1: Chipset: Forex FRX36C300 + FRX46C402; IMP 82C206 - ISA16: 8, memory extension connector on board but not fitted - // BIOS: AMI - BIOS-String: - 30-0400-ZZ1139-00101111-070791-FORX-0, FRX/386DX CACHE SYSTEM - Keyboard BIOS: Intel P8942HP with AMI KB-BIOS-VER-F - OSC: 14.31818MHz, 66,667MHz - ROM_SYSTEM_BIOS(1, "frximp", "Forex 386 with IMP chip") - ROMX_LOAD( "386-imp82c206p.bin", 0x10000, 0x10000, CRC(6f340961) SHA1(393720e1bfe3d323a34106992a65dd593284bf95), ROM_BIOS(1)) -ROM_END - -// RAM: 8xSIMM30, Cache: 10 sockets, 5xATT7C199P occupied - ISA8: 2, ISA16: 6 - CPU: AM386DX/DXL-40, FPU: IIT 3C87-25 -// OSC: 80.000MHz, 14.318180MHz - Keyboard-BIOS: AMI 386 BIOS ZA902884 -ROM_START( smih0107 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 30-0400-428005-00101111-070791-FORX-0 / BIOS ID SMIH0107 / IT9112 - ROM_LOAD( "ami_smih0107.bin", 0x10000, 0x10000, CRC(970bb0c0) SHA1(4a958887485f7239d25fa7b0c98569b97ce93800)) -ROM_END - - -// ***** 386 Motherboards using the Forex FRX46C402 + FRX46C411 + SiS 85C206 chipset - -// PT-581392 - CPU: AMD 386DX-40 FPU: ULSI Advanced Math Coprocessor DX/DLC 40MHz US83C87 -// BIOS : AMI 07/07/1991, on a 27C512 type EPROM (64KB) Ser.# 007139, BIOS-String : 30-0400-ZZ1101-00101111-070791-FORX-0 FRX/386DX CACHE SYSTEM -// Keyboard-BIOS: AMI, Ser.# 007139 - OSC: 14.31818, 80.000MHz - ISA16: 8 -ROM_START( pt581392 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pt-581392 386dx.bin", 0x10000, 0x10000, CRC(389a93de) SHA1(8f1320b1d163167272cfad073f58c355e31fcf6f)) -ROM_END - -// Micro-Express Inc. Forex 386 Cache - Chipset: Forex FRX46C402, FRX46C411, Morse 92A206S - Keyboard BIOS: Lance LT38C41 -// BIOS: EPROM, AMI 386 BIOS, #ZA605315 - CPU: AM386DX-40 - OSC: 66.6670MHz - ISA8: 2, ISA16: 5 -// BIOS-String: 30-0701-001585-00101111-121291-microtel-0 / Microtel Computer products present C3HF/09/92 -ROM_START( frx386c ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "forex386.bin", 0x10000, 0x10000, CRC(007b5565) SHA1(cf749fe05cacebb2230cd7493523ae55e80eea8b)) -ROM_END - - -// ***** 386sx motherboards using the Headland HT18/C chipset -// moved here from 286, original comment: not a bad dump, sets unknown probably chipset related registers at 0x1e8 before failing post -ROM_START( ht18c ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: (BIOS release date:: 07-07-1991) - Chipset: Headland HT18/C - ROM_SYSTEM_BIOS(0, "ami181", "AMI HT 18.1") - ROMX_LOAD( "ht18.bin", 0x10000, 0x10000, CRC(f65a6f9a) SHA1(7dfdf7d243f9f645165dc009c5097dd515f86fbb), ROM_BIOS(0) ) - // 1: CPU: 386SX-25 - BIOS: AMI; 12/12/91 - ROM_SYSTEM_BIOS(1, "ami182", "AMI HT 18.2") - ROMX_LOAD( "3hlm001.bin", 0x10000, 0x10000, CRC(b1434d6f) SHA1(1863dd60ad2b494141b4b30fe7b02f454bec82a3), ROM_BIOS(1) ) - // 2: CPU: 386SX-25 - BIOS: AMI; 07/07/91 - ROM_SYSTEM_BIOS(2, "ami183", "AMI HT 18.3") - ROMX_LOAD( "3hlm002.bin", 0x10000, 0x10000, CRC(10a78d11) SHA1(0500d92e2691164bdc5c71b3d6fd0a154f7279d4), ROM_BIOS(2) ) - // 3: CPU: 386SX-25 - BIOS: AMI; 04/30/91 - // BIOS-String: 30-01]1-ZZ1372-00101111-0403091-HT18SX-0 - ROM_SYSTEM_BIOS( 3, "ami184", "AMI HT 18.4") // marked as BAD_DUMP for the "]" in the BIOS string ... and because it actually runs :) - ROMX_LOAD( "3hlm003.bin", 0x10000, 0x10000, BAD_DUMP CRC(50f7a543) SHA1(8962f7ce2fc5c60059894cae04cf5fccd6cee279), ROM_BIOS(3) ) - // 4: MBA-025 - Chipset: Headland HT18/B, HM6818A - BIOS: AMI 386SX BIOS PLUS T.B 238958 - BIOS-String: 30-0100-009999-00101111-043091-HT18SX-0 - // Keyboard-BIOS: AMI Keyboard BIOS PLUS T.B. 238958 - CPU: AMD AM386 SX/SXL-25 - FPU: empty socket - OSC: 32.000 MHz - 50.000 MHz - 14.31818 - ISA8: 1, ISA16: 6 - ROM_SYSTEM_BIOS( 4, "mba025", "MBA-025" ) - ROMX_LOAD( "386-mba-025-low_32k.bin", 0x10000, 0x8000, CRC(4df55219) SHA1(7dc1adb130ae8c3c88e2c58bde6e3b793fa0c78e), ROM_SKIP(1) | ROM_BIOS(4)) - ROMX_LOAD( "386-mba-025-high_32k.bin", 0x10001, 0x8000, CRC(0406fdc9) SHA1(ee21d584c98b0c11ec2cfb609de83c38b0a893c7), ROM_SKIP(1) | ROM_BIOS(4)) -ROM_END - - -// ***** 386 Motherboards using the Macronix MX83C305(A)(FC), MX83C06(A)(FC) chipset - -// CACHING TECH CORPORATION C386MX - Chipset: MX83C306 MX - BIOS: AMI - BIOS-ID: 31-0100-001190-00101111-121291-MXIC -// CPU: 386DX, FPU: Cyrix - RAM: 8xSIMM30 - ISA8: 2, ISA16: 6 -ROM_START( ctcc386mx ) // nine short beeps, no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "c386mx.bio", 0x10000, 0x10000, CRC(9b24ce11) SHA1(d027da188cbdfbe34b279bd3bd84eccda75b4a5a)) -ROM_END - -// TAM/33/40-MA0 (CM318R00,M31-R00) - Chipset: MX83C305, MX83C306 - CPU: AMD Am386DX-40 - ISA16:8 -// OSC: 80.000MHz - 14.31818 - BIOS: AMI 386 BIOS PLUS S/N OA2050592 - BIOS-String: 31-0100-001105-00101111-121291-MXIC-0 - 386DX/Cx486DLX TAM/33,30-MA0/MA01, 09/10/1992 -ROM_START( tam3340ma0 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "tam_33_40-ma0.bin", 0x10000, 0x10000, CRC(56411a9f) SHA1(a6c80ea531912b758fd5b573d4fa125172cacce7)) -ROM_END - -// Octek Jaguar V rev.1.4 - Chipset: MX83C: MX83C305FC, MX83C306FC -// CPU: AMD 386DX-40, FPU socket provided - OSC: 80.000MHz, 14.31818 -ROM_START( ocjagv ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: MR BIOS (r) V1.40 - ROM_SYSTEM_BIOS(0, "jagvmr14", "Jaguar V MR-BIOS 1.40") - ROMX_LOAD( "bios.bin", 0x10000, 0x10000, CRC(a552d6ad) SHA1(91bae14c3ec7edbc9ef240fec1be17f3582d7ec2), ROM_BIOS(0)) - //1: AMI BIOS// BIOS: AMI 386DX ISA BIOS AA0797325 - BIOS-String: 31-0100-426069-00101111-121291-MXIC-0 MX-DIR_001 - // Keyboard-BIOS: Intel - ROM_SYSTEM_BIOS(1, "jagvami", "Jaguar V AMI BIOS") - ROMX_LOAD( "octek_jaguar_v_ami_bios_isa386dx.bin", 0x10000, 0x10000, CRC(f8d14914) SHA1(14e8ecc4794920dc530fc6bd12ad64494e2544e5), ROM_BIOS(1)) -ROM_END - -// DTK MBA-032Q TK83305-4N-D-03 - Chipset: MACRONIX MX83C305FC, MX83C306FC, HM6818A - BIOS/Version: Award v4.20, MXIC 80386 CACHE SYSTEM, S/N 0089082653 -// BIOS string: 08/07/92-MX83C305/306-113b0000-00 (113B00AC) - Keyboard BIOS: Award, S/N: 008902654 - CPU: i386DX-25, solder pads for 80386, FPU socket provided -// RAM: 8xSIMM39 - OSC: 14.31818M, 80.000MHz - ISA8: 2, ISA16: 6 -ROM_START( mba032q ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "mba-032q.bin", 0x10000, 0x10000, CRC(23481187) SHA1(1b6d0f54ce73853fcdd43588196bb6072b39d068)) -ROM_END - -ROM_START( mx83c305 ) - // 0: AMI BIOS, BIOS-String: 31-0101-009999-00101111-121291-MXIC-0 / 09/02/1992 - Keyboard-BIOS: JETkey V5.0 - // Chipset MX83C05AFC, MX8306AFC - CPU: AMD AM386DX-40, OSC: 14.31818 - ISA8: 1, ISA16: 5 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS( 0, "mxic01", "MXIC #1") - ROMX_LOAD( "mxic.bin", 0x10000, 0x10000, CRC(81853049) SHA1(d855b8d935417cfcfd6580fe3ed4ea393dd49b35), ROM_BIOS(0)) - // 1: BIOS-String: 30-0200-009999-00101111-111192-MXIC-0 / 12/15/1993 - ROM_SYSTEM_BIOS( 1, "mxic02", "MXIC #2") - ROMX_LOAD( "3mxm001.bin", 0x10000, 0x10000, CRC(62fcd52b) SHA1(fa34c27be4627c68fe5c828451d86cbfad0ba358), ROM_BIOS(1)) -ROM_END - - -// ***** 386sx motherboards using the Opti F82C206, Opti 82C283 chipset -ROM_START( op82c283 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: Chipset: Opti F82C206, Opti 82C283 - BIOS: ARMAS AMI 386SX BIOS PLUS 9014775 - Keyboard-BIOS: NEC D80C42C - // BIOS-String: 30-013X-D21185-00001111-031591-OPSX-0 - OSC: 50.000MHz, 14.31818MHz - CPU: AM386 SX/SXL-25 - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS( 0, "armas", "386sx ARMAS" ) - ROMX_LOAD( "386-opti-armas.bin", 0x10000, 0x10000, CRC(d9c696bc) SHA1(467617ab4a211ce460766daa3e5803e190368703), ROM_BIOS(0)) - // 1: 386SX MAIN BOARD REV:A1-1M/N: 3805 - Chipset: OPTi F82C206 / OPTi (unreadable) - BIOS:AMI 386SX BIOS ZZ908380 - // BIOS-String: 30-0100-DG112-00101111-031591-OPSX-0 / A10001B / 128KB RESERVED FOR RAM SHADOW. - // Keyboard-BIOS: AMI KB-BIOS-VER-F (Intel P8942AHP) - CPU: AM386 SX/SXL-25 - OSC: 14.31818MHz, 50.000MHz - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS( 1, "3805", "386sx 3805" ) - ROMX_LOAD( "386sx-opti-908380.bin", 0x10000, 0x10000, CRC(38502567) SHA1(d65d272aa60642197c9b639a8679f8f41c4a697b), ROM_BIOS(1)) - // 2: CPU: 386SX-20 - BIOS: AMI; 03/15/91 - no display - unknown ASI motherboard - // BIOS-String: 30-0100-DG1112-00101111-031591-OPSX - ROM_SYSTEM_BIOS( 2, "c28301", "OPTi 82C283 #1") - ROMX_LOAD( "3opm010.bin", 0x10000, 0x10000, CRC(7c2acf57) SHA1(d40605621da40204dc6370d2d00b783b3a7f8dce), ROM_BIOS(2)) -ROM_END - -// Octek Panther II - Chipset: OPTi 82C283, F82C206L/Chips 82C206 - CPU: 386sx - BIOS: AMI 386sx BIOS - Keyboard-BIOS: Intel/AMI -// BIOS-String: 30-0200-420000-00101111-050591-OPSX-0 / OPSX 386SX PAGE INTERLEAVE BIOS - ISA8: 2, ISA16: 4 -ROM_START( ocpanii ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "octek_panther_ii_386sx.bin", 0x10000, 0x10000, CRC(866192d5) SHA1(fe6133ee3ba0d71c0d4690a0843ca82106effcf6)) -ROM_END - -// RYC Alaris LEOPARD LX REV D - Chipset: Opti 82C283 82C206Q - CPU: 486SLC2 (IBM 14 Q) - ISA16: 7 -// BIOS: AMI 486SLC ISA BIOS AA0735388 - Keyboard-BIOS: Intel/AMI MEGA-KB-H-WP -// BIOS-String: 30-0100-006328-00101111-060692-OPSXPI-0 -ROM_START( alaleolx ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "486-ryc-leopard-lx.bin", 0x10000, 0x10000, CRC(bbc7bfd2) SHA1(49833b482efb8e361be88f48e252621b147a3b1b)) -ROM_END - - -// ***** 386 motherboards using the OPTi 82C381/382 "HiD/386 AT chipset" - -// CPU: 386DX-25 - Chipset: OPTI 82C382 25MHz, 82C381P, 82C206 - BIOS: AMI; 09/15/90 -// BIOS-String: EOX3-6069-083090-K0 -ROM_START( op82c381 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3opm004.bin", 0x10000, 0x10000, CRC(933c2c2b) SHA1(191a1a80c128430a0a461ff9202d27969a715d9d)) -ROM_END - -// Shuttle HOT-304 - Chipset: Opti F82C382, Opti (erased), UMC UM82C206L - OSC: 14.31818MHz, 50.000MHz -// BIOS: AMI, Ser.Nr. 150796 - BIOS-String: 30-0101-DK1343-00001111-050591-OPBC-0 - Keyboard BIOS: AMI Ser.Nr. 209210 - ISA8: 1, ISA16: 6, ISA16/Memory: 1 -ROM_START( hot304 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386-hot-304.bin", 0x10000, 0x10000, CRC(cd4ad4ec) SHA1(50f1b7a15096fff7442d575a47728ba4709b2f39)) -ROM_END - -// Arche Technologies Inc. KMA-300G-25 - Chipset: OPTi 82C381, 82C382, UMC206L - CPU: i386-25, FPU: socket provided - RAM: SIMM30x8, Cache: 8x5C6408-35 -// ISA8: 1, ISA16: 6, ISA16/Memory: 1 - OSC: 50.000MHz, 14.31818 MHz -// BIOS-String: EOPG-3700-040990-K0 -ROM_START( kma300g ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "bios.bin", 0x10000, 0x10000, CRC(3149a4a4) SHA1(6a027ed94568a89a800360119da0c568a2a29e19)) -ROM_END - - -// ***** 386sx motherboards using the OPTi 82C291 chipset - -ROM_START( op82c291 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: MR BIOS (r) V1.43 - ROM_SYSTEM_BIOS(0, "mr", "MR") - ROMX_LOAD( "opti_82c291_mr-bios_v143.bin", 0x10000, 0x10000, CRC(f7989a65) SHA1(cc729b6baac486ac3116f08e78eb58bb39365dd5), ROM_BIOS(0)) - // 1: CPU: 386SX-40 - BIOS: AMI - no display, nine beeps, so probably bad dump - ROM_SYSTEM_BIOS( 1, "ami", "AMI") - ROMX_LOAD( "3opm007.bin", 0x10000, 0x10000, CRC(eed82365) SHA1(45f5a608740d161c5a74415ff3f7b573d7e61f58), ROM_BIOS(1)) - -ROM_END - -// DTK Computer PPM-3333P - Chipset: OPTi 82C291 - Opti F82C206 - ISA16: 6 - CPU: AMD Am386SX/SXL-33, FPU: empty socket - OSC: 14.31818 - 66.0000 MHz -ROM_START( ppm3333p ) - ROM_REGION16_LE(0x20000, "bios", 0) - //0: Award Modular BIOS v4.20 (80386DX) / (119U906X) DTK Computer - ROM_SYSTEM_BIOS(0, "ppmawa", "PPM-3333P Award") - ROMX_LOAD( "386sx_opti291-award.bin", 0x10000, 0x10000, CRC(4855b394) SHA1(94dd1a38852eecac538ef4b8bf04bb7c1e4317d2), ROM_BIOS(0)) - //1: BIOS-String: 30-0200-001107-00001111-121291-OPTX 291-0 / OPTI-291WB BIOS VER 1.2 - ROM_SYSTEM_BIOS(1, "ppmami", "PPM-3333P AMI") - ROMX_LOAD( "386sx_opti291-ami.bin", 0x10000, 0x10000, CRC(35727f8f) SHA1(3fb14cd6ea0d7a2bd545beb1586403cc36a77668), ROM_BIOS(1)) -ROM_END - - -// ***** 386 motherboards using the Opti F82C206, 82C391B, 82C392 chipset - -ROM_START( op82c391 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: CPU: 386DX - Chipset: OPTi 82C391 B2, 82C392 B - BIOS: AMI; 07/07/91; AA 0571504 - // BIOS-String: 30-0100-DK1343-00101111-070791-OPWB3/B-0 - ROM_SYSTEM_BIOS(0, "39101", "82C391 #1") - ROMX_LOAD( "3opm001.bin", 0x10000, 0x10000, CRC(3cb65e60) SHA1(c91deaba1b34008449d6cc2aa94d115c47e0640a), ROM_BIOS(0)) - // 1: BIOS: AMI; 05/05/91; AMI 386C BIOS; #1023992 - ROM_SYSTEM_BIOS(1, "39102", "82C391 #2") // no display, nine beeps - ROMX_LOAD( "3opm005.bin", 0x10000, 0x10000, CRC(ef3dcdde) SHA1(53a8d0af776362d5b92d1cce92d6ca8dbeb33398), ROM_BIOS(1)) - // 2: BIOS: AMI; 07/07/91 - no display - ROM_SYSTEM_BIOS(2, "39103", "82C391 #3") - ROMX_LOAD( "3opm011.bin", 0x10000, 0x10000, CRC(6706c85a) SHA1(70af6de83e59df3d9b74e904fde98d0b9cbdaae9), ROM_BIOS(2)) - // 3: BIOS-String: 30-0100-000000-00101111-070791-OPTi391-0 - ROM_SYSTEM_BIOS(3, "39104", "92C391 #4") - ROMX_LOAD( "3opm12.bin", 0x10000, 0x10000, CRC(fa9592c5) SHA1(f9042163e7e2762e999687c3ec94d576f5b7c499), ROM_BIOS(3)) - // 4: BIOS-String: MR BIOS (tm) V1.30 - RAM Pattern Test Failed at 0F0000H - ROM_SYSTEM_BIOS(4, "mrv130", "MR BIOS V1.30") - ROMX_LOAD( "opti_82c391_386_mr_bios_v130.rom", 0x10000, 0x10000, CRC(458c9405) SHA1(845ea33e4e228aa98d1bd3b0148fa306754e3d78), ROM_BIOS(4)) -ROM_END - -ROM_START( op386wb ) - ROM_REGION32_LE(0x20000, "bios", 0) - // OPTi 386WB VER.1.0 - OSC: 66.6670MHz, 50.000MHz, 14,31818 - ISA8: 1, ISA16: 7 - // BIOS: 1006229 - Keyboard-BIOS: Intel P8942AHP - // 0: BIOS-String: 30-0201-D41107-00101111-050591-OPWB-0 - ROM_SYSTEM_BIOS( 0, "1006229", "1006220") - ROMX_LOAD( "386-opti-386wb-10.bin", 0x10000, 0x10000, CRC(1a5dd6b2) SHA1(9e6b556bfdf21d6f3cba6a05a3092887a71a24a8), ROM_BIOS(0)) - // 1: BIOS-String: 30-0201-D41107-00101111-050591-OPWB-0 - ROM_SYSTEM_BIOS( 1, "d41107", "D41107") - ROMX_LOAD( "ami_d41107.bin", 0x10000, 0x10000, CRC(2b6cc50d) SHA1(69f69e0295abf5e331fdf01dc8e6b1c0c6591992), ROM_BIOS(1)) - -ROM_END - -// Shuttle HOT-307H - BIOS-String: 30-0100-DK1343-00101111-070791-OPWB3/B-0 - CPU: 386DX - Chipset: OPTi 82C391 B2, 82C392 B - BIOS: AMI; 07/07/91; AA 0571504 -ROM_START( hot307h ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3opm001.bin", 0x10000, 0x10000, CRC(3cb65e60) SHA1(c91deaba1b34008449d6cc2aa94d115c47e0640a)) -ROM_END - -// ***** 386 Motherboards using the OPTi495SLC chipset => "qdi" in the 486 BIOS section uses that chipset too - -ROM_START( opti495slc ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Chipset: OPTi 82C495SLC / F82C206, BIOS: AMI 486086 - BIOS-String: 40-040A-001102-00101111-111192-OP495SLC-0 - // Keyboard-BIOS: AMI - CPU: AM386DX-40, FPU socket provided - ISA8: 1, ISA16: 5 - OSC: 14.31818 - ROM_SYSTEM_BIOS(0, "op495slc01", "OP495SLC #1") - ROMX_LOAD( "op495slc01.bin", 0x10000, 0x10000, CRC(0b25044b) SHA1(1b585f0d73ea963dcfbf421325e7da6dd3dd918f), ROM_BIOS(0)) - // 1: BIOS-String: 40-0200-001107-00101111-111192-OP495SLC-0 - OPTI 495SLC 80386 ONLY - BIOS: AMI 386C BIOS 1605865 - // Keyboard-BIOS: AMI 386C BIOS Keyboard ISA8: 1, ISA16: 5 - CPU: AMD AM386DX-40 - OSC: 14.3 - ROM_SYSTEM_BIOS(1, "op495slc02", "OP495SLC #2") - ROMX_LOAD( "op495slc02.bin", 0x10000, 0x10000, CRC(4ff251a2) SHA1(e8655217bd46d50af6b30184bf462376d0e388c6), ROM_BIOS(1)) - // 2: BIOS-String: - Same board exists with an OPTi495XLC chip, possibly from A-Trend - ROM_SYSTEM_BIOS(2, "op495slc03", "OP495SLC #3") // no display - ROMX_LOAD( "486dlc-unknown.bin", 0x10000, 0x10000, CRC(2799e876) SHA1(ce7b421ecb27d915585c1a98bebb17cc5c2463e7), ROM_BIOS(2)) - // 3: 364 Ver. 1.1 - Chipset: OPTi 82C495SLC, F82C206Q - CPU: AMD AM386DX-40 - RAM: 8xSIMM30, Cache: 5x14pin - // ISA8: 1, ISA16: 5 - BIOS: AMI 386C BIOS 1684393 - Keyboard-BIOS: AMI 386C BIOS KEYBOARD 1684393 - // BIOS-String: 40-040A-001107-00101111-111192-OP495SLC-0 / OPTI-495SLC BIOS VER 2.1 - ROM_SYSTEM_BIOS(3, "op495slc04", "OP495SLC #4") - ROMX_LOAD( "386c_mobo-364-v1.1.bin", 0x10000, 0x10000, CRC(826ec2d1) SHA1(cc13e385c6614eb654ee0669f67df51f1e1fa585), ROM_BIOS(3)) -ROM_END - - -// ***** 386 Motherboards using the OPTi495XLC chipset: OPTi 82C495XLC F82C206, BIOS: AMI 386DX BIOS Ser.#:AA2602776, Keyboard-BIOS: Lance LT38C41 - ISA8: 1, ISA16: 5 - -ROM_START( opti495xlc ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-081L-001343-00101111-080893-OP495XLC-F / OPTi495XLC For 386 - ROM_SYSTEM_BIOS(0, "optimini", "OPTi Mini 82C495XLC") - ROMX_LOAD( "386-opti-mini.bio", 0x10000, 0x10000, CRC(04c75e45) SHA1(d5bf92421dda3191c6da12ae2fa31c9ee7a831e1), ROM_BIOS(0) ) - // 1: MR BIOS (r) V1.60 - ROM_SYSTEM_BIOS(1, "mr495xlc", "MR BIOS for OPTi 82C495XLC") // use Hercules - ROMX_LOAD( "mr-3dx94.rom", 0x10000, 0x10000, CRC(6925759c) SHA1(540177fe2c10e20037893c9763b0bf6e35163c9c), ROM_BIOS(1) ) - // 2: possibly from A-Trend (A1742X REV.C 94V-0), exists with an OPTi495SLC chip, see above section, ISA8: 2, ISA16: 4, ISA16/VL: 2 - // BIOS-String: X0-0804-001117-00101111-080893-OP395XLC-0 / OPTI 495XLC 3/486 BIOS VER 5.02_T 94/07/07 - ROM_SYSTEM_BIOS(2, "op82c495xlc", "82C495XLC") // this one could also be listed as a 486 board as it has solder pads and sockets for CPUs from 386 to true 486s - ROMX_LOAD( "at080893.bin", 0x10000, 0x10000, CRC(6b49fdaa) SHA1(5b490d1d1216763ef89688c8e383c46470272005), ROM_BIOS(2) ) - // 3: BIOS: AMI; 08/08/93; AA2740000 - hangs - ROM_SYSTEM_BIOS(3, "mao13", "MAO13 Rev. A") - ROMX_LOAD( "3opm002.bin", 0x10000, 0x10000, CRC(2d9dcbd1) SHA1(d8b0d1411b09767e10e66b455ebc74295bd1b896), ROM_BIOS(3) ) -ROM_END - - -// 386sx motherboards using the SARC (or CYCLONE) RC2016A5 chipset - -// Pine PT-319A rev2.2a - CPU: 386sx - BIOS: AMI; 06/06/92 -// BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / Ver 5.20 -ROM_START( pt319a ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "3sam001.bin", 0x10000, 0x10000, CRC(cad22030) SHA1(85bb6027579a87bfe7ea0f7df3676fdaa64920ac)) -ROM_END - - -// CX Technology, Inc. Model SXD (4x SIMM30, Cache: 64/128/256KB in 2 banks plus TAG, 4x 16-bit ISA) - Chipset: SARC RC2016A5; HM6818P; CX109; LT38C41 © Lance Corp. (keyboard controller?) -// additional info from chukaev.ru54.com: Chipset: CYCLONE RC2016A5 - ISA16: 6 - ROM: CX109 340C3A62D0A - CPU/FPU: Am386SX/SXL-33, 387 -ROM_START( cxsxd ) - ROM_REGION16_LE(0x20000,"bios", 0) - // BIOS-String: 03/25/93-SARC_RC2016A-219v0000 / CX 386SX System - ROM_LOAD( "award_cx-sxd_v4.50.srd.bin", 0x10000, 0x10000, CRC(ef1c74d7) SHA1(b40b1cb7143c4e352798bdf3b488d9342a4029a7)) -ROM_END - -// PC-Chips M396F VER 2.2 - CPU: 386SX, 387SX - ISA16: 6 -ROM_START( pccm396f ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: Chipset: PCCHIPS CHIP2 310, HT6542, HM6818A - // BIOS-String: X0-0100-001437-00101111-060692-M396C-0 - BIOS: AMI 386SX BIOS Ver. 2.10 C-1216 - ROM_SYSTEM_BIOS(0, "chips2", "Chips 2") - ROMX_LOAD( "3pcm003.bin", 0x10000, 0x10000, CRC(b7fc6737) SHA1(670e38b628cb71dc09742f097349ac48ccf28696), ROM_BIOS(0)) - // 1: Chipset: SARC RC2016A5 - CPU: 386SX-40/486SLC, 387SX - BIOS: AMI; 06/06/92 - // BIOS-String: X0-0100-001437-00101111-060692-M396F-0 - ROM_SYSTEM_BIOS(1, "sarc01", "SARC RC2016A5 #1") - ROMX_LOAD( "3sam002.bin", 0x10000, 0x10000, CRC(8d5ef8e8) SHA1(5ca2b36d5bee2870f894984909aa2013b5c4d6cf), ROM_BIOS(1)) - // 2: BIOS-String: X0-0100-001437-00101111-060692-M396F-0 - CPU: 386SX-40 (ALI M1386SX A1P) - ROM_SYSTEM_BIOS(2, "sarc02", "SARC RC2016A5 #2") - ROMX_LOAD( "3sam003.bin", 0x10000, 0x10000, CRC(95ea08d8) SHA1(812e8488ad63ca24250e245a2f0273f1d1703fc3), ROM_BIOS(2)) -ROM_END - - -// ***** 386 motherboards using the SIS Rabbit : 85C310 / 85C320 / 85C330 / 85C206 chipset - -// ASUS ISA-386C - BIOS : AMI 05/05/1991, on a 27C512 type EPROM (64KB) -// BIOS-String : 30-0105-001292-00101111-050591-SISDFC-386 - // ISA8: 2, ISA16:5, ISA16/Memory: 1 -ROM_START( isa386c ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "asus_isa-386c_bios.bin", 0x10000, 0x10000, CRC(55e6d1bb) SHA1(e1ac490a30f63b6e4d6d9d0fbaea3d132b8ff053)) -ROM_END - -// Chaintech 333SC - Chipset: UMC UM82C206L, three smaller SiS chips (unreadable, probably SiS Rabbit) -// CPU/FPU present - BIOS: AMI 386 BIOS - Keyboard-BIOS: AMI -// BIOS-String: ESIS-1128-040990-K0 - ISA8: 2, ISA16: 6 - OSC: 14.31818, 66.000MHz -ROM_START( chn333sc ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "bios.bin", 0x10000, 0x10000, CRC(f8b2b0bc) SHA1(2799cce621b93bf38b04deeb419d25a73f7416f4)) -ROM_END - -// Octek Jaguar II - Chipset: SiS 85C330, 85C320, 85C206, 85C310 - CPU: i386-33, FPU: i387-33 - RAM: 8xSIMM30, Cache: 8xIS61C64-25N -// BIOS: AMI - Keyboard-BIOS: AMI KB-BIOS-VER-F - ISA8: 2, ISA16: 5, ISA16/Memory: 1 - OSC: 66.000MHz, 14.31818 -// BIOS-String: 30-0100-006069-00101111-020291-SISC / 0033P-002 -ROM_START( ocjagii ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ami_386_zz457511.bin", 0x10000, 0x10000, CRC(b5bc6a9a) SHA1(b74f592dd3bcd2978ed7d895d483f83413e0f8d5)) -ROM_END - - -ROM_START( sisrabb ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 30-0000-D01128-00101111-070791-SISD-0 - ROM_SYSTEM_BIOS(0, "3sim001", "3sim001") - ROMX_LOAD( "3sim001.bin", 0x10000, 0x10000, CRC(2982f552) SHA1(f1849c207d8c802faaf8ef628f88b28256e7fb31), ROM_BIOS(0)) - // 1: PLATO TECHNOLOGY CO., LTD. - Chipset: SiS 'rabbit': SIS 85C320, 85C330, 85C310, 85C206 - CPU: Intel 80386DX-33, FPU: i387DX-33 - // RAM: 16xSIMM30, Cache: 8xKM688B65P-25, 2xQS8888-25P - BIOS: AMI 386 BIOS Ser# Z403736 - Keyboard BIOS: AMI - BIOS-String: ESIS-1393-040990-K0 / SIS-B 386 BIOS - // OSC: 50.000MHz, 66.0000MHz, 14.31818MHz - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS(1, "plato", "Plato") - ROMX_LOAD( "386-sis-z403736.bin", 0x10000, 0x10000, CRC(8230f4c1) SHA1(952de1e16efe7e3a7514b68ea251b88192de3ac8), ROM_BIOS(1)) -ROM_END - - -// ***** 386 Motherboards using the Symphony SL82C362 SL82C461 SL82C465 chipset - -// FIC 386 SC Rev A2 - Chipset: Symphony SL82C461, SL82C465, SL82C362 -ROM_START( 386sc ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS: AMI 386 BIOS Ser.#: ZZ006975, BIOS-String: 30-0200-DF1211-00101111-042591-SYMP-0 / 386DX BIOS for SYMLABS SL82C360 - Keyboard-BIOS: AMI #Z357365 - // CPU: unreadable, FPU: Cyrix 387DX-25 - OSC: 40.000MHz, 14.31818 - ISA8: 1, ISA16: 7 - ROM_SYSTEM_BIOS(0, "386sc1", "386SC #1") - ROMX_LOAD( "386_sc_symphony.bin", 0x10000, 0x10000, CRC(fabe369c) SHA1(211ff63dd874c273135d1427db3562d752c2bade), ROM_BIOS(0)) - // 1: ID: FIC 386SC REV A2 MBZ86418 - CPU: AMD 386DX/DXL-40, FPU socket provided - RAM: 8xSIMM30, Cache: 512KB - // BIOS Version: AMI 386DX BIOS - ZZ000294 - BIOS String: 30-0200-ZZ1121-00101111-042591-SYMP-0 - 386DX BIOS FOR SYMLABS SL86C360 - ISA8: 1, ISA16: 7 - OSC: 14.31818, 80.000MHz - ROM_SYSTEM_BIOS(1, "386sc2", "386SC #2") - ROMX_LOAD("fic386sc.bio", 0x10000, 0x10000, CRC(6154adb7) SHA1(96c495d9a9975e1af9b42384712e609e3ffcff4e), ROM_BIOS(1)) -ROM_END - -ROM_START( 386sc2c ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 20-0200-DF1121-00101111-102591-SYM_386B-0 / 386DX/SX (S1A.P) - ROM_SYSTEM_BIOS(0, "s1a", "S1A.P") // Chipset: SYMPHONY SL82C362, SL82C461, SL82C465 - ROMX_LOAD( "386-sc-2c_ami_za492668.bin", 0x10000, 0x10000, CRC(b408eeb7) SHA1(cf1974492119e1aae623fa366d5760343e827e52), ROM_BIOS(0)) - // 1: BIOS-String: 20-0200-DF1121-00001111-102591-SYM_386B-0 / 386SX/DX (S1B) - ROM_SYSTEM_BIOS(1, "s1b", "S1B") // also on FIC 386-SC-HG - ROMX_LOAD( "ami_386_za590821.bin", 0x10000, 0x10000, CRC(51a4c231) SHA1(4ad65408f2a401ff262934f886937a2615c08e21), ROM_BIOS(1)) -ROM_END - -// FIC 386-SC-HG - Chipset: SYMPHONY SL82C362, SL82C461, SL82C465 - CPU: AMD Am386DX/DXL-40, FPU socket provided - BIOS: AMI 386 BIOS ZA977287 -// Keyboard BIOS: Intel/AMI - RAM: 8xSIMM30 - ISA16: 6 - OSC: 80.000MHz -ROM_START( 386schg ) // BIOS-String: 20-0200-DF1121-00101111-102591-SYM_386B-0 / 386DX/SX(S1B) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386-za877287-386-sc-hg.bin", 0x10000, 0x10000, CRC(fcaa06c0) SHA1(5ce6258a26311cec46e51cb16bcb66e9c68d16b2)) -ROM_END - -// Peacock P386DX-40 REV: 1.0 - Chipset: Symphony SL82C461, SL82C362, SL82C465, DS1287 - CPU: AMD Am386DX-40, FPU: IIT 3C87-40 - RAM: 8xSIMM30, Cache: 4xW4256AK-20, 1xTC5588P-20 -// BIOS: AMI 386 BIOS #ZA22147 - OSC: 80.000MHz, 14.31818, 24.000 - on board: IDE, Floppy - ISA16: 6 -ROM_START( p386dx40 ) // BIOS-String: 30-0200-DF1121-00101111-070791-SYM_AUTO-0 / Peacock 386 DX Ver. 1.0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386_peacock-p386dx-40-za224147.bin", 0x10000, 0x10000, CRC(f97562cf) SHA1(354b6ffd345c9f50beca0f836b0d4a92df1e7c48)) -ROM_END - - -// ***** 386 Motherboards using the UM82C491F chipset - -ROM_START( um82c491f ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: TAM/33/40-U2 - BIOS: AMI S/NO. OA 242412 - BIOS-String: 40-0102-001105-00101111-040493-UMC491F-0 / TAM/33,40-U2, 08/11/1993 - // ISA8: 1, ISA16: 5 - OSC: 80.000MHz, 14.31818 - ROM_SYSTEM_BIOS(0, "tam3340u2", "TAM/33/40-U2") - ROMX_LOAD( "tam_umc491f.bin", 0x10000, 0x10000, CRC(718890d5) SHA1(52336cfc7cd0f0f51799c999cefcfed2b2942211), ROM_BIOS(0)) - // 1: Board is only marked "rev.0.3, looks like 386GRN - CPU: AMD AM386DX-40 - OSC: 14.31818 - ISA8: 1, ISA16: 5 - // Chipset: UMC UM82C491F - BIOS-String: 08/30/93-UMC-491-214X2000-OO - BIOS: Award 386 D2026361 - Keyboard BIOS: JETkey V3.0 - // additional info from chukaev.ru54.com: REV:0.4 board has JETkey V5.0 keyboard BIOS, uses same motherboard BIOS - ROM_SYSTEM_BIOS( 1, "386grn", "386GRN-like board rev.03") - ROMX_LOAD( "386dx40-27c512.bin", 0x10000, 0x10000, CRC(692a4d52) SHA1(7970a05586eacfe4bfdc575b17bbbfb7ff1c86b0), ROM_BIOS(1)) - // 2: BIOS: AMI; 04/04/93 - CPU: 386DX-40 - BIOS-String: 40-0102-001277-00101111-040493-UMC491F-0 - ROM_SYSTEM_BIOS( 2, "491f01", "UM82C491F #1") - ROMX_LOAD( "3umm005.bin", 0x10000, 0x10000, CRC(032e78f2) SHA1(5271c4362284ec87840b3fb23542506a72a328c2), ROM_BIOS(2)) - // 3: BIOS-String: 08/30/93-UMC-491-214X2000-OO / CACHE 386/486 SYSTEM BIOS - ROM_SYSTEM_BIOS( 3, "491f02", "UM82C491F #2") - ROMX_LOAD( "3umw007.bin", 0x10000, 0x10000, CRC(d82c9bef) SHA1(36e8d1c7629642cbcc337721eef1c73f1f0ed92c), ROM_BIOS(3)) -ROM_END - - -// ***** 386 Motherboards using the UMC UM82C493F/UM82C491F chipset or badge engineered varieties (BIOTEQ) - - // BIOS-String: 40-0100-001494-00101111-080893-UMC491F-0 / 11/26/93 - CPU: TX486DLC/E-40GA, IIT 4C87DLC-40 - ISA8: 1, ISA16: 5 - BIOS: AMI; 208808; 08/08/93 -ROM_START( um82c493f ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS( 0, "493f01", "UM82C493F #1" ) - ROMX_LOAD( "3umm007.bin", 0x10000, 0x10000, CRC(8116555a) SHA1(8f056a83de60373ed26026a226eead19868abeca), ROM_BIOS(0)) -ROM_END - -// 0: 386-4N-D04A -ROM_START( 4nd04a ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 40-0102-428003-00101111-080893-UMC491F-0 - UMC 4913 386 IVN 1.0 1993.12.22 - // Chipset: UMC UM82C493F, UM82C491F - ROM_SYSTEM_BIOS( 0, "ivn10", "386-4N-D04A IVN 1.0" ) - ROMX_LOAD( "386-4n-d04a.bin", 0x10000, 0x10000, CRC(cf386b9c) SHA1(6fd4303e4f0d2ed75d4e7f36dc855037b1779e64), ROM_BIOS(0)) - // 1: 386-4N-D04A PCB V2.0 - BIOS-String: 40-0103-428003-00101111-080893-UMC491F-0 / UMC 4913 386 IVN 1.1 1994.1.31 - ROM_SYSTEM_BIOS( 1, "ivn11", "386-4N-D04A IVN 1.1" ) - ROMX_LOAD( "3umm006.bin", 0x10000, 0x10000, CRC(4056104d) SHA1(5e639e6766dc9a19296358e9a64a76ad57fc733a), ROM_BIOS(1)) - // 2: TK-82C491/493/386-4N-D04 - BIOS-String: (2c4x2u01) U-BOARD / 11/09/93-UMC-491-2C4X2U01-00 - ISA8: 1, ISA16: 5 - ROM_SYSTEM_BIOS( 2, "awa110993", "AWARD 11/09/93") // BIOS: Award; 386 BIOS; A3384454 - ROMX_LOAD( "3umw002.bin", 0x10000, 0x10000, CRC(2c510e81) SHA1(a12c672ec418cc4cd14482901f8ba34c50f319f5), ROM_BIOS(2)) - // 3: TK-82C491/493/386-4N-D04 - BIOS-String: 01/14/94-UMC-491-2C4X2U01-00 / U-BOARD - ROM_SYSTEM_BIOS( 3, "awa011494", "AWARD 01/14/94") - ROMX_LOAD( "3umw003.bin", 0x10000, 0x10000, CRC(64067839) SHA1(4ae3462619ef8da67f74d85ee7ab44bdb49a5728), ROM_BIOS(3)) -ROM_END - -// Biostar MB-1333/40PMB-CH, rev B.3 - Chipset: "Bioteq" [Atmel] AT40391, "Bioteq" G392 [Atmel AT40392], C&T P82C206 -// BIOS: AMI 386 BIOS PLUS - Keyboard-BIOS: AMI - CPU: AM386-DX40 - OSC: 14.31818, -ROM_START( mb133340 ) - ROM_REGION32_LE(0x20000, "bios", 0) // the OPWB3 string also exists in the BIOS versions meant for the OPTI 82C391/392 chipsets - // 0: BIOS-String: 30-0100-D61223-00101111-050591-OPWB3/B-0 / MB-1340PMA-CH, MB-1340PMB-CH, MB-1340PMD-CH, MB-1340PME-CH for B version.. - ROM_SYSTEM_BIOS(0, "opwb3b", "MB-1333/40PMB-CH OPWB3-B") - ROMX_LOAD( "opwb3b.bin", 0x10000, 0x10000, CRC(c9cf46dd) SHA1(c9e58cb6fed770d92892672d0a910d448c507ac1), ROM_BIOS(0)) - // 1: BIOS-String: 30-0201-D61223-00101111-050591-OPWB-0 / MB-1333PMA-CH, MB-1333PMB-CH, MB-1333PMD-CH, MB-1333PME-CH - ROM_SYSTEM_BIOS(1, "opwb", "MB-1333/40PMB-CH OPWB") - ROMX_LOAD( "opwb.bin", 0x10000, 0x10000, CRC(9532c6d1) SHA1(48e889ed61921643147fea95224bcf42bb6e82fa), ROM_BIOS(1)) - // 2: BIOS-String: 40-0100-001223-00101111-040493-UMC491F-0 / MB-1333/40UCG-A, MB-1333/40UCG-B / MB-1433-40UDV-A, MB-1433/50UCV-C, MB6433/50UPC-A for EXT. RTC - ROM_SYSTEM_BIOS( 2, "m21", "M21" ) - ROMX_LOAD( "3bim001.bin", 0x10000, 0x10000, CRC(9ea0ce67) SHA1(cb55a61cd43705a54e4109d816924c8820f78ae5), ROM_BIOS(2)) -ROM_END - - -// ***** 386 motherboards using the UMC UM82C481AF, UM82C482A/B/F, 82C206F chipset - -// QD-U386DX VER 1.0 - CPU/FPU: i386DX-33, IIT 3C87-33 - ISA8:2, ISA16: 5 - BIOS: AMI 386DX ISA BIOS (AA0119183) -// BIOS-String: 30-0200-428003-10101111-070791-UMC480A-F -ROM_START( qdu386dx ) // three short beeps (base 64k RAM failure) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3umm001.bin", 0x10000, 0x10000, CRC(5b6a7d0b) SHA1(02696eaaa5dd21fe4b3b39629aa926ae87a9a2bd)) -ROM_END - -// ASUS ISA-386U30 REV.2.2 - Chipset: UMC UM82C481AF, UM82C482AF, 82C206F - CPU: AM386DX-40 - OSC: 14.31818MHz, 32.000MHz - ISA8: 1, ISA16: 6 -// BIOS: AMI 386DX BIOS AA0974582 - BIOS-String: - Keyboard-BIOS: AMI U2518640 MEGA-KB-F-WP -ROM_START( isa386u30 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "386-isa-386u30.bin", 0x10000, 0x10000, CRC(6d45a044) SHA1(63c06568f9db5ce12dc8dd0fb1ad1009a9fb24f6)) -ROM_END - -// Chicony CH-486-33C REV 1.0 - Chipset: UMC UM82C481, UM82C482, Chips P82C206 - CPU: Intel Overdrive DX2ODPR66, FPU socket provided -// RAM: 16xSIMM30, Cache: 8xW24256AK-25, P4C188-20PC - BIOS: AMI - Keyboard-BIOS: Intel/AMI -// BIOS-String: 40-0300-ZZ1116-00101111-031591-UMCWB-F - OSC: 33.000MHz - ISA8: 2, ISA16: 5 -ROM_START( ch48633c ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ch-486-33c_ami_bios_z944944_am27.bin", 0x10000, 0x10000, CRC(1ca9bf11) SHA1(bb5fb4c7544e2ccb06d423ef4da0729a6bf8b231)) -ROM_END - -// Elitegroup FX-3000 REV:1.0 - Chipset: UMC UM82C481BF, UM82C482AF, UM82C206F - ISA16: 6 -ROM_START( ecsfx3000 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0100-001131-00101111-121291-UMCAUTO-0 / FX3000 V1.3 12-17-92 - Keyboard BIOS: AMI/Intel - BIOS: FX3000-014 - CPU: AM386DX-40 - ROM_SYSTEM_BIOS(0, "v13", "V1.3") - ROMX_LOAD( "fx-3000-bios.bin", 0x10000, 0x10000, CRC(f93c9563) SHA1(46a71e7fbc9238dd470d6d5ce3bc1e057f3aae24), ROM_BIOS(0)) - // 1: BIOS-String: 30-0500-D01131-00101111-070791-UMCWB-0 / FE386 V1.1 12-03-92 - Keyboard-BIOS: Lance LT38C41 - BIOS: AMI-1131 / S/NO. E-92488183 / FE 386-012 - CPU: Cyrix 486DLC-33GP FPU: Cyrix Cx87DLC-33QP - OSC: 66.667MHz, 14.31818 - ROM_SYSTEM_BIOS(1, "v11", "V1.1") - ROMX_LOAD( "486-fx3000.bin", 0x10000, 0x10000, CRC(af303f08) SHA1(65dfa2541d2b08746f91012a2ae0121636402aac), ROM_BIOS(1)) -ROM_END - -ROM_START( um82c481af ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0100-001266-00101111-121291-UMCAUTO-0 - 3DIUD-1.2 - // Chipset: // UMC UM92C206F, UM82C482AF, UM82C481BF - MB manufacturer according to BIOS is Modula Tech Co - // ISA8: 1, ISA16: 6 - RAM: 8xSIMM30, Cache: 9x28pin, used: 4xIS61C256AH-20N, 1xW2465AK-20, CPU: AMD 386DX-40 - // CPU and FPU sockets provided - BIOS: AMI 386 BIOS, Keyboard-BIOS: AMI - ROM_SYSTEM_BIOS(0, "3diud", "386 UMC 3DIUD") - ROMX_LOAD( "386-umc-3flud.bin", 0x10000, 0x10000, CRC(2e795a01) SHA1(02e9e2871c1c1a542f44ab5eef66aee4b04225c1), ROM_BIOS(0)) - // 1: BIOS: Microid Research; 02/26/93 - BIOS-String: MR BIOS (r) V1.44 - ROM_SYSTEM_BIOS(1, "mr1441", "MR BIOS V1.44 #1") // resets continuously - ROMX_LOAD( "3umr001.bin", 0x10000, 0x10000, CRC(466a115e) SHA1(077d797c653528062f1c87b03c608427c35c5505), ROM_BIOS(1)) - // 2: BIOS : MR 386DX/86DLC BIOS V.1.44 - Keyboard BIOS: JETkey V3.0 - CPU: TI 486DLC-40BGA, FPU: IIT 4C87DLC-40 - RAM: 8xSIMM30, Cache - // OSC: 14.31818, 80.000MHz - ISA8: 1, ISA16: 6 - ROM_SYSTEM_BIOS(2, "mr1442", "MR BIOS V1.44 #2") // resets continuously - ROMX_LOAD( "um82481m.bin", 0x10000, 0x10000, CRC(f617e1ce) SHA1(73ee80cb9f50547f26adbe0bfd2435b01728dd09), ROM_BIOS(2)) -ROM_END - - -//************************************************************************** -// 80386 SX and DX Desktop -//************************************************************************** - -// Schneider 386SX VGA System 40 (the number indicates the size of the harddisk, there were System 70 as well) - uses the same case as the Schneider Tower AT -// Schneider Tower VGA I/O: Chipset: WD37C65BJM, BIGJIM 50773 1108-0056, two other bigger chips can't be read on the photos -// 104 pin CPU card connector (ISA without the key), 4xISA16, 1xISA8 - on board: IDE, parallel, serial, bus mouse (Atari compatible), VGA, internal floppy (26pin), external floppy (DB25) -// On board graphics: ATI VGA Wonder-16 (256KB), ATI18800-1 1138-0069 -// CPU card: CPU: Intel NG680386SX-16 (C-Step), FPU socket provided - Chipset: DDA14-075E, Chips P82C812, P82C811, P82C206, P82C215-12 (16MHz) - RAM: 8xSIMM30 -// OSC: 20.000, 14.31818, 24.000000MHz, 32.000000MHz, - keyboard -// beeps 1-2-4 -ROM_START( tower386sx ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "v103", "V1.03") // from a 386SX System 70 - ROMX_LOAD("t386s103.bin", 0x10000, 0x10000, CRC(d4e177e6) SHA1(fa11d49d629cdcac4467a9deedd25171ae499346), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v100", "V1.00") // from a 386SX System 40 - ROMX_LOAD("schneider_ag_386sx_bios_1_version_1.00a_id.nr.52504.u16", 0x10000, 0x8000, CRC(2fec2d3a) SHA1(4227da07f6652b89b9d02d7570ad0476672fd80d), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("schneider_ag_386sx_bios_0_version_1.00a_id.nr.52504.u15", 0x10001, 0x8000, CRC(b3331429) SHA1(b214bccfb62add9caea3d734885bc945b868967a), ROM_SKIP(1) |ROM_BIOS(1)) - - // models upgraded to 512KB video memory were sold as "CEG" models as the memory upgrade enabled some sort of antialiasing ("continuous edge graphics") - // in a 256 color mode with a choice from 792.096 colors. - // according to https://archive.org/stream/byte-magazine-1991-01/1991_01_BYTE_16-01_1990_BYTE_Award_of_Excellence#page/n197/mode/2up this needs an EDSUN D/A chip, it is unknown - // if it's contained on the platter or on the graphics upgrade piggyback card - // The 12.5MHz version of the towerat2xx (VGA Tower System 40 or 70) used the same I/O backplane and were also offered with the CEG upgrade. - ROM_REGION16_LE(0x10000, "vga", 0) - ROM_LOAD16_BYTE("schneider_ag_vga_bios_low_v1.00_id.nr_51368.u13", 0x0000, 0x8000, CRC(ec4ef170) SHA1(0049ae5eab1a21838e674cf77e88994b954b1da3)) - ROM_LOAD16_BYTE("schneider_ag_vga_bios_high_v1.00_id.nr_51368.u14", 0x0001, 0x8000, CRC(5354962a) SHA1(11a503473e2011f323cc81c0b63d24f231c54c31)) -ROM_END - -// Atari PC 5 - American Megatrends 386XT Series-4 motherboard - on board EGA -// screen remains blank, 1 beep repeated (DRAM refresh failure) -ROM_START( ataripc5 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD32_BYTE("ami_pc5_1.00_rom0.bin", 0x00000, 0x8000, CRC(496149a6) SHA1(81033b22af830af8306abfde03a194739fe54355)) - ROM_LOAD32_BYTE("ami_pc5_1.00_rom1.bin", 0x00001, 0x8000, CRC(3c82fe66) SHA1(dd6c2c3c3635761b1d928912269b8937cbdc09ae)) - ROM_LOAD32_BYTE("ami_pc5_1.00_rom2.bin", 0x00002, 0x8000, CRC(7dc5b53b) SHA1(33e138baa84a8acc629bde5a6b54e47d0d4508f1)) - ROM_LOAD32_BYTE("ami_pc5_1.00_rom3.bin", 0x00003, 0x8000, CRC(b588b7a8) SHA1(2f2597b14e54d03cf957cce47536266f68d3aa66)) -ROM_END - -// Datavan Book-Size LAN Station - CPU: Am386SX/SXL-25 - Chipset: Headland HT18/C, RAM: 4xSIMM30 -// BIOS: AMI 386SX BIOS PLUS S/NO. 232659 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS S/NO. 232659 -// BIOS-String: 30-0100-ZZ1612-00101111-070791-HT18-F - ISA16: 1, used for LAN board - on board: 2xser, par, VGA -// Video: Realtek RTG3106 VGA, 1024K, MUSIC TR9C1710-66PCA - VGA BIOS: REALTEK / QUADTEL -// Mass storage: NEC FD1138H, Quantum ProDrive ELS 977/10/17 - unknown DP8390DN based 8bit ISA LAN card -ROM_START( dvbslan ) // 3 short beeps => base memory read/write test error in the first 64 KB block of memory - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD( "ami_bios_386sx_bios_plus.bin", 0x10000, 0x10000, CRC(760afd89) SHA1(452f3e1b8b3b3d00df90c3501c8796de447a2184)) - - ROM_REGION( 0x8000, "vga", 0) // REALTEK VGA BIOS - ROM_LOAD( "realtek_vga.bin", 0x0000, 0x8000, CRC(4e416975) SHA1(826b7ec5494dc83cfcf25922185777bf6db46949)) - - ROM_REGION( 0x2000, "lan", 0) // boot ROM from DP8390DN based LAN adapter - ROM_LOAD( "net_isa_boot.bin", 0x0000, 0x2000, CRC(5bb527fd) SHA1(1eb7c82ef99d64eedffc3ac9c145d33b06cd8cb6)) -ROM_END - -// Epson PC AX3 - see epsax -ROM_START( epsax3 ) - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD16_BYTE( "evax3.bin", 0x10000, 0x8000, CRC(fec03cdc) SHA1(549027e6b786fa98a14912c1fb6d44c607206253)) - ROM_LOAD16_BYTE( "odax3.bin", 0x10001, 0x8000, CRC(0162d959) SHA1(f17741282e078a66e38d82ca48455b17c54e832f)) -ROM_END - - -//************************************************************************** -// 80386 SX and DX Laptop/Notebook -//************************************************************************** - -// Toshiba T3200SXC - CPU: 80386sx-20 - Floppy - 120 MB Hard disk - 1 MB RAM on board, 4 MB extra memory already installed. Can be upgraded to a total of 13 MB. -// TFT Display, 640x480, 256 colors - WD 90C21 video chip, 256 KB RAM - ISA8: 1, ISA16: 1 -ROM_START( tot3200sxc ) // KBC ERROR - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD( "012c_t3200sxc_tc57h1024d-85.bin", 0x00000, 0x20000, CRC(5804a3da) SHA1(922dfb35b134a91a4c39e443597dad6798ce69d9)) -ROM_END - -// Sanyo MBC-18NB notebook - no display -ROM_START( mbc18nb ) - ROM_REGION16_LE( 0x20000, "bios", 0) - ROM_LOAD( "sanyo_18nb.bin", 0x00000, 0x20000, CRC(64e283cf) SHA1(85ce4074c23b388d66e53cc83a8535bf7a2daf1f)) -ROM_END - -// Siemens-Nixdorf PCD-3Nsx notebook -// CPU: Intel NG680386SX-16 or -20 - 1MB RAM,upgradeable to 5MB, 40MB harddisk (-16 model) -// 2MB, upgradeable to 8MB, 80MB harddisk (-20 model), 9" mono VGA LCD, 1.44MB floppy drive -// Chipset: Headland HT21/E, , DP8473V, CHIPS F82C601, DS??87, unknown QFP100, ADC0833BCN (on PCU sub), CL-GD610-320C-C+CL-GD620-C -// Microcontrollers: N8042AH (KBC), N80C51RH (KBE) -// OSC: 14.318, 32.00024.0090 -ROM_START( pcd3nsx ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "337-7_2400_3f_10-15-91.bin", 0x00000, 0x20000, CRC(99befce7) SHA1(150cd6a1476ca0ea970a1103b2a2c668c984433a) ) - - ROM_REGION( 0x1000, "mcu", 0 ) - ROM_LOAD("33b_pcu_rev_3r.bin", 0x0000, 0x1000, CRC(d99308ec) SHA1(26621db2db37ab2bd1da972abb7398f9514329b2) ) - - ROM_REGION( 0x800, "kbc", 0 ) - ROM_LOAD("kbc_c3f.bin", 0x000, 0x800, NO_DUMP) - - ROM_REGION( 0x1000, "kbe", 0 ) - ROM_LOAD("kbe_e3d.bin", 0x0000, 0x1000, NO_DUMP) -ROM_END - -// Siemens-Nixdorf PCD-3Nsl - CPU: 80386SL@25MHz - 2MB RAM, upgradeable to 8MB - 85MB harddisk - 10" mono LCD VGA -// 1.44MB floppy drive -ROM_START( pcd3nsl ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - failure at 100000-10FFFF - Resume memory backup failure - ROM_SYSTEM_BIOS(0, "05-13-93", "05/13/93") - ROMX_LOAD( "3n102l30.bin", 0x00000, 0x20000, CRC(02384c19) SHA1(552dc41b40272027e2b031187f8ab1e1513751b9), ROM_BIOS(0) ) - // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - Memory high address failure at 100000-10FFFF - Resume memory backup failure - ROM_SYSTEM_BIOS(1, "01-26-94", "01/26/94") - ROMX_LOAD( "3n120l40.bin", 0x00000, 0x20000, CRC(1336dd75) SHA1(80306d85f417c51a5235ac2f02ceb58bdb51205f), ROM_BIOS(1) ) -ROM_END - - -// Toshiba T2000SX -// 1MB RAM on board, up to 9MB with 2MB, 4MB or 8MB expansion cards - 16 level grayscale VGA 640x480 display, PVGA1F display controller, 256KB VRAM -// Super integration (SI), components: DMAC 82C37Ax2, PIC 82C59Ax2, PIT 82C54, FDC TC8565, SIO TC8570 - 80C42 and 80C50 for keyboard - RTC 146818AF -// 128KB ROM, 32KB Backup RAM - GA-SYS CNT System control gate array - GA-IO CNT I/O gate array -ROM_START( t2000sx ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "014d.ic9", 0x00000, 0x20000, CRC(e9010b02) SHA1(75688fc8e222640fa22bcc90343c6966fe0da87f)) -ROM_END - - -// Triumph-Adler Walkstation 386 SX - German version of the Olivetti S20 -// VLSI VL82C320 + VL82C331; DP8473V -ROM_START( walk386sx ) - ROM_REGION16_LE( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS - ROM_LOAD( "cthj01_1014.bin", 0x00000, 0x20000, CRC(805084b9) SHA1(a92d78050844ccbcce53109c42603639aedd2335) ) - - ROM_REGION( 0x2000, "mcu", 0 ) // MC68HC805B6FN - ROM_LOAD( "cthj02_08_76.bin", 0x0000, 0x2000, NO_DUMP ) - - ROM_REGION( 0x1000, "cop888", 0 ) // COPCL888-RDT/V - ROM_LOAD( "s9124ab_c4_e904-34162_00.bin", 0x0000, 0x1000, NO_DUMP ) -ROM_END - -// Triumph-Adler Walkstation 386DX - German version of the Olivetti D33 -// VLSI TOPCAT chipset: VL82C330 + VL82C331 + VL82C332 + VL82C106; Austek A38202C; DP8473V -// Video board: Cirrus Logic CL-GD610 + CL-GD620 + CL-GD63 -ROM_START( walk386dx ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS - ROM_LOAD( "am28f010_ctaa060125rc.bin", 0x00000, 0x20000, CRC(6cc540fe) SHA1(9853793d5433bbc5efc09c7f31c4a8a8f78d4549) ) - - ROM_REGION( 0x2000, "mcu", 0 ) - ROM_LOAD( "cthj02_03_76.bin", 0x0000, 0x2000, NO_DUMP ) -ROM_END - -// Siemens PG 750 - Luggable programmer ("Programmiergerät") for the Siemens S5 automation systems, a 486 EISA version exists as well -// Chipset: CHIPS P82C302, P82C301C, P82C206, four more "CHIPS" ICs -// ISA16: 7 -// on board: V24/Mouse, V24/Modem, Printer -ROM_START( pg750 ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - // 0: Phoenix 80386 ROM BIOS PLUS Version 1.10 14 / SIEMENS PG-750 - // Time-of-day clock stopped - // EGA/TIGA Graphics System "Highgraph II" - ROM_DEFAULT_BIOS("v402") - ROM_SYSTEM_BIOS(0, "v40", "v40") - ROMX_LOAD( "pg750_4.0_386_l.bin", 0x10000, 0x8000, CRC(1e6dcd40) SHA1(2def9f729f43652a7b8b32a42e4c073f580d39ce), ROM_SKIP(1)|ROM_BIOS(0) ) - ROMX_LOAD( "pg750_4.0_386_h.bin", 0x10001, 0x8000, CRC(389c20dd) SHA1(eb0e86ba88ac9742868689b2aac9911ed7acac74), ROM_SKIP(1)|ROM_BIOS(0) ) - // 1: Phoenix 80386 ROM BIOS PLUS Version 1.10 17 / SIEMENS PG-750/730 - // Time-of-day clock stopped - ROM_SYSTEM_BIOS(1, "v402", "v402") - ROMX_LOAD( "pg750_4.02_386_l.bin", 0x10000, 0x8000, CRC(208aac51) SHA1(49d50b7ade8f56bda203375a9b138adf2cb5e500), ROM_SKIP(1)|ROM_BIOS(1) ) - ROMX_LOAD( "pg750_4.02_386_h.bin", 0x10001, 0x8000, CRC(c6e14fb6) SHA1(dad6ab5c5a18341ec0dce53fe712b8367340506b), ROM_SKIP(1)|ROM_BIOS(1) ) -ROM_END - -//************************************************************************** -// 80486 BIOS -// -// BIOS files that show "original.tmp" near the beginning are compressed -// and can be unpacked using, e.g., 7-ZIP. -//************************************************************************** - -ROM_START( at486 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 30-0500-ZZ1130-00101111-070791-1219-0 /PAI JUNG ELECTRONIC IND. CO., LTD. - ROM_SYSTEM_BIOS(0, "at486", "PC/AT 486") - ROMX_LOAD( "at486.bin", 0x10000, 0x10000, CRC(31214616) SHA1(51b41fa44d92151025fc9ad06e518e906935e689), ROM_BIOS(0)) - // 1: BIOS-String: 40-0100-009999-11101111-070791-UMC480A-0 / United Microelectronics Corporation (UMC) MG-48602 - ROM_SYSTEM_BIOS(1, "mg48602", "UMC MG-48602") - ROMX_LOAD( "mg48602.bin", 0x10000, 0x10000, CRC(45797823) SHA1(a5fab258aecabde615e1e97af5911d6cf9938c11), ROM_BIOS(1)) - // 2: BIOS-String: 40-0000-001470-00101111-060692-SIS3486-0 / 24X-VS-XX-B - ROM_SYSTEM_BIOS(2, "ft01232", "Free Tech 01-232") - ROMX_LOAD( "ft01232.bin", 0x10000, 0x10000, CRC(30efaf92) SHA1(665c8ef05ca052dcc06bb473c9539546bfef1e86), ROM_BIOS(2)) - - /* 486 boards from FIC - naming convention - xxxxx101 --> for EPROM - xxxxx701 --> for EEPROM using a Flash Utility v5.02 - xxxxBxxx --> NS 311/312 IO Core Logic - xxxxCxxx --> NS 332 IO Core Logic - xxxxGxxx --> Winbond W83787F IO Core Logic - xxxxJxxx --> Winbond W83877F IO Core Logic - */ - // 3: BIOS-String: 06/16/97-VT82C486A-214L2000-00 / Version 3.276GN1 - /* this is the year 2000 beta bios from FIC, supports GIO-VT, GAC-V, GAC-2, VIP-IO, VIO-VP and GVT-2 */ - ROM_SYSTEM_BIOS(3, "ficy2k", "FIC 486 3.276GN1") /* includes CL-GD5429 VGA BIOS 1.00a */ - ROMX_LOAD( "3276gn1.bin", 0x00000, 0x20000, CRC(d4ff0cc4) SHA1(567b6bdbc9bff306c8c955f275e01ae4c45fd5f2), ROM_BIOS(3)) - // 4: BIOS-String: 04/29/94-VT82C486A-214L2000-00 / Award Modular BIOS v4.50 - ROM_SYSTEM_BIOS(4, "ficgac2", "FIC 486-GAC-2") /* includes CL-GD542X VGA BIOS 1.50 */ - ROMX_LOAD( "att409be.bin", 0x00000, 0x20000, CRC(c58e017b) SHA1(14c19e720ce62eb2afe28a70f4e4ebafab0f9e77), ROM_BIOS(4)) - // 5: BIOS-String: 04/08/96-VT82C486A-214L2000-00 / Version 3.27GN1 - ROM_SYSTEM_BIOS(5, "ficgacv", "FIC 486-GAC-V 3.27GN1") /* includes CL-GD542X VGA BIOS 1.41 */ - ROMX_LOAD( "327gn1.awd", 0x00000, 0x20000, CRC(017614d4) SHA1(2228c28f21a7e78033d24319449297936465b164), ROM_BIOS(5)) - // 6: BIOS-String: 05/06/94-VT82C486A-214L2000-00 / Version 3.15GN - ISA16:4, ISA/VL: 2 - ROM_SYSTEM_BIOS(6, "ficgiovp", "FIC 486-GIO-VP 3.15GN") // Chipset: VIP VT82C486A, Promise PDC20230C, one further VIA, one other unreadable - ROMX_LOAD( "giovp315.rom", 0x10000, 0x10000, CRC(e102c3f5) SHA1(f15a7e9311cc17afe86da0b369607768b030ddec), ROM_BIOS(6)) - // 7: BIOS-String: 11/20/94-VT82C486A-214L2000-00 / Version 3.06G (11/25/94) - OSC: 24.0L3P - ISA16:3, ISA/VL: 2 - ROM_SYSTEM_BIOS(7, "ficgiovt", "FIC 486-GIO-VT 3.06G") // 1994-11-20 - Chipset: Winbond W83757AF, W83758P, VIA VT82C486A, VT8255N, VT82C482 - ROMX_LOAD( "306gcd00.awd", 0x10000, 0x10000, CRC(75f3ded4) SHA1(999d4b58204e0b0f33262d0613c855b528bf9597), ROM_BIOS(7)) - // 8: BIOS-String: 11/02/94-VT82C486A-214L2000-00 Version 3.07G - ISA8: 1, ISA16: 4, ISA/VL: 2 - ROM_SYSTEM_BIOS(8, "ficgvt2", "FIC 486-GVT-2 3.07G") // Chipset: VIA VT82C486A, VT82C482, VIA VT8255N - ROMX_LOAD( "3073.bin", 0x10000, 0x10000, CRC(a6723863) SHA1(ee93a2f1ec84a3d67e267d0a490029f9165f1533), ROM_BIOS(8)) - // 9: BIOS-String: 06/27/95-VT82C505-2A4L4000-00 / Version 5.15S - Chipset: S3 Trio64, FDC 37665GT, VT82C496G, VT82C406MV - ROM_SYSTEM_BIOS(9, "ficgpak2", "FIC 486-PAK-2 5.15S") /* includes Phoenix S3 TRIO64 Enhanced VGA BIOS 1.4-01 */ - ROMX_LOAD( "515sbd8a.awd", 0x00000, 0x20000, CRC(778247e1) SHA1(07d8f0f2464abf507be1e8dfa06cd88737782411), ROM_BIOS(9)) - // 10: BIOS-String: 04/01/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS - Chipset: VIA VT82C505, VT82C416, VT82C496G, Winbond W83787F - ROM_SYSTEM_BIOS(10, "ficpio3g7", "FIC 486-PIO-3 1.15G705") // pnp - ISA16: 4, PCI: 3 - ROMX_LOAD( "115g705.awd", 0x00000, 0x20000, CRC(ddb1544a) SHA1(d165c9ecdc9397789abddfe0fef69fdf954fa41b), ROM_BIOS(10)) - // 11: BIOS-String: 04/01/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS - ROM_SYSTEM_BIOS(11, "ficpio3g1", "FIC 486-PIO-3 1.15G105") /* non-pnp */ - ROMX_LOAD( "115g105.awd", 0x00000, 0x20000, CRC(b327eb83) SHA1(9e1ff53e07ca035d8d43951bac345fec7131678d), ROM_BIOS(11)) - // 12: BIOS-String: 11/27/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS - ROM_SYSTEM_BIOS(12, "ficpos", "FIC 486-POS") - ROMX_LOAD( "116di6b7.bin", 0x00000, 0x20000, CRC(d1d84616) SHA1(2f2b27ce100cf784260d8e155b48db8cfbc63285), ROM_BIOS(12)) - // 13: BIOS-String: 06/27/95-VT82C505-2A4L4000-00 / Version 5.15 / Chipset: VIA VT82C496G PC/AT - ROM_SYSTEM_BIOS(13, "ficpvt", "FIC 486-PVT 5.15") // ISA16: 6, ISA/VL: 2 - ROMX_LOAD( "5150eef3.awd", 0x00000, 0x20000, CRC(eb35785d) SHA1(1e601bc8da73f22f11effe9cdf5a84d52576142b), ROM_BIOS(13)) - // 14: BIOS-String: 10/05/95-VT82C505-2A4L4000-00 / Version 5.162W2(PCTIO) - ROM_SYSTEM_BIOS(14, "ficpvtio", "FIC 486-PVT-IO 5.162W2") // Chipset: VT82C406MV, VT82C496G, W83777/83787F, W83758P - ROMX_LOAD( "5162cf37.awd", 0x00000, 0x20000, CRC(378d813d) SHA1(aa674eff5b972b31924941534c3c988f6f78dc93), ROM_BIOS(14)) - // 15: BIOS-String: 40-00AG-001247-00101111-060692-SIS3486-0 / AV4 ISA/VL-BUS SYSTEM BIOS / Chipset: SIS 85C460ATQ - ROM_SYSTEM_BIOS(15, "ava4529j", "AVA4529J") // this is a board with two VLB slots - ROMX_LOAD("amibios_486dx_isa_bios_aa4025963.bin", 0x10000, 0x10000, CRC(65558d9e) SHA1(2e2840665d069112a2c7169afec687ad03449295), ROM_BIOS(15)) - // 16: BIOS-String: 40-0200-001291-00101111-111192-OPT495SX-0 / 34C-OP-WBp-25/33/40/50-D5-ZZ - // Chipset: OPTi 82C495SX - CPU: 486DX - BIOS: AMI 486DX ISA BIOS AA7524842 - ISA8: 1, ISA16: 4, ISA16/VL: 2 - ROM_SYSTEM_BIOS(16, "pat48pv", "PAT-48PV") - ROMX_LOAD("pat48pv.bin", 0x10000, 0x10000, CRC(69e457c4) SHA1(7015b2bccb10ce6e1ad6e992eac785f9d59a7a24), ROM_BIOS(16)) - // 17: Morse P1 V3.10 - CPU: 486DX - ISA8: 2, ISA16: 6 - Chipset: Morse 91A401A- Award Modular BIOS v4.20 / V3.00 - KEYBOARD ERROR OR NO KEYBOARD PRESENT - ROM_SYSTEM_BIOS(17, "p1", "P1") - ROMX_LOAD("morse_p1.bin", 0x10000, 0x10000, CRC(23d99406) SHA1(b58bbf1f66af7ed56b5233cbe2eb5ab623cf9420), ROM_BIOS(17)) - // 18: Chipset: SiS 85C206 CONTAQ 82C592 82C591 - CPU/FPU: 486, socket provided - OSC: 33.333MHz, 14.31818 - BIOS: AMI 486DX ISA BIOS AA0083611 (28pin) - // BIOS-String: 40-0700-D01508-00101111-070791-CTQ 486-0 - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS(18, "82c591", "82C591") - ROMX_LOAD("486-contaq.bin", 0x10000, 0x10000, CRC(e5d2cf16) SHA1(1357a964ef78eaad6894dcc9dce62be50cdf6df5), ROM_BIOS(18)) - // 19: Chipset: PCCHIPS CHIP 16 (9430-AS), CHIP 18 (9432-AS) - CPU: i486DX2-66 - BIOS: AWARD (28pin) - ISA16: 4, ISA16/VL: 3 - OSC: 14.31818MHz - // BIOS-String: 07/13/94--2C4X6H01-00 / Release 07/15/94' - ROM_SYSTEM_BIOS(19, "chips", "Chips") - ROMX_LOAD("486-pcchips.bin", 0x10000, 0x10000, CRC(4e49eca1) SHA1(2343ca9f4760037eb2ef6e7b011b9690e542d6ea), ROM_BIOS(19)) - // 20: CAM/33(50)-P8 M458(A)P80 - Chipset: Opti 82C495SX, F82C206Q 82C392SX - CPU: 486DX-33 (solder pads for 486sx and 486DX) - OSC: 14.318MHz, 33.000MHz - // Keyboard-BIOS: AMI Keyboard BIOS PLUS A317473 - BIOS: AMI 486 BIOS PLUS 214097 (28pin) - RAM: SIMM30x8 - Cache: 1xIS61C256A, 8xUM61256BK-25 - ISA8: 1, ISA16: 6 - // BIOS-String: X0-0101-001105-00101111-060692-495SX_A-0 / 486DX/SX CAM/33,50-P8, CPM/25,33-P8, 12/14/1992 - ROM_SYSTEM_BIOS(20, "cam33", "CAM/33") - ROMX_LOAD("486-cam.bin", 0x10000, 0x10000, CRC(d36a13ea) SHA1(14db51dbcf8decf1cb333c57a36971ef578c89b4), ROM_BIOS(20)) - // 21: 486-PIO3 1.1 - Chipset: Winbond W83787F, VIA VT82C505, VT82C416, VT82C496G - ISA16: 4, PCI:3 - BIOS: AWARD F 4825803 1.14G705 (32pin) - CPU: Socket 3 - // RAM: 2xSIMM72, Cache: 9 sockets marked SRAM 128Kx8 (2 banks +1) - On board: 2xIDE, Floppy, par, 2xser - // BIOS-String: 02/01/96-VT496G-2A4L6F0IC-00 0000C-00 . runs into BootBlock BIOS - ROM_SYSTEM_BIOS(21, "pio3", "486-PIO-3") - ROMX_LOAD("486-pio3.bin", 0x00000, 0x20000, CRC(1edb5600) SHA1(36887cd08881dfa063b37c7c11a6b65c443bd741), ROM_BIOS(21)) - // 22: 486 G486IP IMS - Chipset: IMS 8848 IMS 8849 - CPU: i486DX2-66 - BIOS: AMI 486DX ISA BIOS AB5870352 - Keyboard-BIOS: MEGAKEY (AMI/Intel) - ISA8: 1, ISA16: 4, PCI: 3 - // RAM: SIMM30: 4, SIMM72: 2, Cache: 10 sockets (UM61256AK-15) - BIOS-String: 41-0000-ZZ1124-00101111-060692-IMS8849-0 / PCI BIOS, Dated JUN-16-94 / FOR G486IP - ROM_SYSTEM_BIOS(22, "g486ip", "G486IP") - ROMX_LOAD("g486ip_ims.bin", 0x00000, 0x20000, CRC(4431794a) SHA1(f70e8c326455229c3bb7f305c2f51c4ac11979ed), ROM_BIOS(22)) - // 23: EFA 486 UPIO - // BIOS-String: 11/09/95-UMC-881/886A-2A4X5E39C-00 00 / N486U-PIO/A, Rev 1.03 ROM - NOT FOR SALE - boots into BootBlock BIOS - ROM_SYSTEM_BIOS(23, "486upio", "486 UPIO") - ROMX_LOAD("upio_103.bin", 0x00000, 0x20000, CRC(4e9139cd) SHA1(f2b00356957c712ca652c3751b31161b3110ec69), ROM_BIOS(23)) - // 24: Acer 486 Version 2.2 - Chipset: ALi M1429, M1431 - CPU: 486 - RAM: SIMM30x8 - // screen remains blank - ROM_SYSTEM_BIOS(24, "acer48622", "Acer 486 V2.2.") - ROMX_LOAD("4alm002.bin", 0x10000, 0x10000, CRC(88291af2) SHA1(7ff912e9f0550631377d1a4c3aa266a081e7dce9), ROM_BIOS(24)) - // 25: ACR6BE00-M00-940720-R01-E0 / BIOS V2.0 - Keyboard Interface Error, Pointing DeviceInterface Error - ROM_SYSTEM_BIOS(25, "4alo001", "4ALO001") - ROMX_LOAD("4alo001.bin", 0x00000, 0x20000, CRC(4afb9c50) SHA1(5e56682ba1e04bd0b074de3b2a93fb5322325d01), ROM_BIOS(25)) - // 26: dies after initialising the graphics card - ROM_SYSTEM_BIOS(26, "4alp001", "4ALP001") - ROMX_LOAD("4alp001.bin", 0x10000, 0x10000, CRC(9b4a2881) SHA1(f324bb0304164e9ede1dd2eebb085a76aae398be), ROM_BIOS(26)) - // 27: BIOS-String: 30-0500-ZZ1130-00101111-070791-1219-0 - ROM_SYSTEM_BIOS(27, "zz1130", "ZZ1130") - ROMX_LOAD("4zzw001.bin", 0x10000, 0x10000, CRC(dc21c952) SHA1(affdc4efbca4dad561e4f0141463844ec84ae519), ROM_BIOS(27)) - // 28: screen remains blank - ROM_SYSTEM_BIOS(28, "optimus", "Optimus") - ROMX_LOAD("mb_bios_ami_930808.bin", 0x10000, 0x10000, CRC(89151d5b) SHA1(92a93cae054525adfdc6277a1236e699ea9fbc32), ROM_BIOS(28)) - // 29: 40-0100-DG1112-00101111-070791-UMC480A / Rev. 251191 UMC-486A - ASI board - // The BIOS comes from http://www.elhvb.com/supportbios.info/Archives/BIOS/0-A/ASI/UMC-486A/index.html and contains 28 extra plain textattr - // bytes at the end of the file. These have been lopped off, but the emulated machine complains about a ROM error, thus marked BAD_DUMP - ROM_SYSTEM_BIOS(29, "umc486a", "UMC-486A") - ROMX_LOAD("umc481icorr.ami", 0x10000, 0x10000, BAD_DUMP CRC(d27b2fd4) SHA1(e639dbc7d65b29ffca26701af766fa75bfe33787), ROM_BIOS(29)) - // 30: 40-0201-D41107-00101111-031591-OPBC-0 - ROM_SYSTEM_BIOS(30, "a9c11f1f", "a9c11f1f") - ROMX_LOAD("ami_486_zz686886.bin", 0x10000, 0x10000, CRC(a9c11f1f) SHA1(2a27ecae9547ddd3d230c30a94deb83a4d6b4436), ROM_BIOS(30)) - //31: Award Modular BIOS v4.20 / Version 1.09K - ROM_SYSTEM_BIOS(31, "109k", "1.09K") - ROMX_LOAD("award_486dx_0097042.bin", 0x10000, 0x10000, CRC(b620534b) SHA1(d3777a82cb35639d386a1840dd5cf52527ec6f8b), ROM_BIOS(31)) - // 32: UNIC2 94V-0 9326 - OPTI chipset (3 chips) - // BIOS-String: X0-0100-001378-00101111-060692-495SX_A - ROM_SYSTEM_BIOS(32, "unic2", "UNIC 2 94V-0") - ROMX_LOAD("amibios-486dx-1992-aa8707058-m27c512.bin", 0x10000, 0x10000, CRC(a2b3e326) SHA1(b29c5668fb3337893ef3a96f053f90b929bac0d6), ROM_BIOS(32)) - // 33: BIOS-String: 40-0100-001276-00101111-060692-495_X86-0 - // OPTi 82C495 SX, F82C206 - CPU: two solder pads and two CPU sockets - RAM: 8xSIMM30, Cach: 10x28pin DIP - ISA8: 2, ISA16: 3, ISA16/VLB: 3 - ROM_SYSTEM_BIOS(33, "495sx1", "495sx-1") - ROMX_LOAD("495sx-1.bin", 0x10000, 0x10000, CRC(318a99a3) SHA1(e57380ed2a802cd1648a32317313ade5221f1213), ROM_BIOS(33)) - // 34: Chipset: marked QDI - CPU: Socket 3, 25MHz-50MHz - RAM: 4xSIMM30, 2xSIMM72, Cache: 8x32pin DIP (4x28pin DIP filled), 1x32pin DIP (filled with 28pin DIP) - // BIOS: AMI 486DX ISA BIOS AC2849676 - OSC: 18.31818 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - ROM_SYSTEM_BIOS(34, "qdi486", "QDI486") // screen remains blank - ROMX_LOAD("qdi486.bin", 0x10000, 0x10000, CRC(f44a5a45) SHA1(57cfd7c6524eba21395642bd57b726b45eef4b6a), ROM_BIOS(34)) -ROM_END - - -//************************************************************************** -// 80486 motherboard -//************************************************************************// - -// Addtech Research 4GLX3 Green-B 4GPV3.1 aka VisionEX 4GPV3 - Chipset: Contaq 82C596A - BIOS Version: AMI 01/10/94 486 ISA BIOS AA 6729627 -// Keyboard BIOS: AMI - CPU: Socket 3, solder pads for 80486DX/SX provided - RAM: 8xSIMM30, Cache: 9x28pin DIP - ISA16: 8, ISA16/VLB: 2 -ROM_START( ar4glx3 ) // BIOS-String: 40-0101-006666-00101111-011094-CTQ-596A / KIM Computer by CTL Corporation / Model : [4GLX3] --- Made in U.S.A. - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4glx3_bios.bin", 0x10000, 0x10000, CRC(3367e0b2) SHA1(8dbe58ed783c56ca2cb61ded6f603314739dcfb8)) -ROM_END - -// TMC PAT48AV 1.4 - ALi M1429 A1, M1431 A2 - Bios: AMI 486DX ISA BIOS AB4179743 - Keyboard BIOS: AMI-KB-H-WP - CPU: 486DX socket -// RAM: 8xSIMM30 - Cache: 8xIS61C256AH-20N - OSC: 14.31818 - ISA16: 4, ISA16/VLB: 3 -ROM_START( tmpat48av ) // screen remains blank - BIOS-String: 40-0106-001291-00101111-080893-ALI1429 / 486DX-AC-WBu-25/33/40/50-L6-ZZ - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pat48av_bios_27c512.bin", 0x10000, 0x10000, CRC(a054b7b3) SHA1(edc2554a73aba94d586f8b49a5c5bbbe2890331c)) -ROM_END - -// BIOSTAR - MB-1433/50 AEA-P - V:1 - Chipset: VLSI 82C3480 & 83C3490 (marked BIOTEQ) - BIOS/Version: AMIBIOS 12/12/91 - Keyboard BIOS: MEGA-KB-F-WP -// CPU: It's ST 486Dx2-80 - RAM: 8xSIMM30, Cache: 8xW24M257AK-15, 1xW2465AK-15 - ISA8: 1, ISA16: 6 - OSC: 66.000MHz, 14.318 -ROM_START( mb1433aeap ) // 40-0100-001223-00101111-121291-B82C3480-0 / M1433/50AEA-P - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "mb-1433-aea-p.bin", 0x10000, 0x10000, CRC(daac20f7) SHA1(b6889a4896f83b306e69efa87cae8d03147b6dbd)) -ROM_END - -// FIC ELI6-II (from Unisys ELI 46665 Desktop) - Chipset: VIA 82C486A, VT82C487, SMC FDC37C665QF P - BIOS label: ELI6-U555 -// BIOS Version: Award U573 3/14/95 - CPU: Intel Overdrive DX40DPR100 in Socket 3 - RAM: 4xSIMM72, Cache: 9x256K-15 - ISA16:6 - On board: ISA, Floppy -ROM_START( ficeli6ii ) // BIOS String: 03/14/95-VT82C486A-214L2000-00 / Award Modular BIOS v4.50 /3.20G /F5 1.00 / UNISYS ELI6-II Version U573.BIN (03/14/95) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "fic_eli6ii.bio", 0x10000, 0x10000, CRC(b61cc026) SHA1(59eae42bf1dea01ba04fecd9bb367e47d4a256d4)) -ROM_END - -// Mitac PWA-IH4077D - Chipset: EFAR EC802GL, EC100G, UMC UM82C863F, UM82C865F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9xIS61C256AH-20N -// BIOS: known: R2.03/CKS: 2400H, ATT4077D BIOS R1.01.00/CKS: 3000H - Keyboard BIOS: Award KB-200 or VIA VT82C42N (on ATT4077D) -// On board: 2xser, par, Floppy, IDE - ISA16: 4, ISA17/VL: 2 -ROM_START( pwaih4077d ) // BIOS-String: 04/02/98-EFAR-EC802G-B-2C403D31-00 / (IH4077D R2.08G) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ih4077d.208g", 0x10000, 0x10000, CRC(0f834ba2) SHA1(7e08e454dfa3cf5079845fe61b9ae74b1dcc7981)) -ROM_END - -// ASUS ISA-486SIO rev. 1.2 - Chipset : SiS 85C460 ATQ, Winbond W85C16B - BIOS : AMI 486DX/ISA BIOS AA2310181 - Keyboard BIOS: AMI -// CPU: Intel 80486SX-25 - RAM: 8xSIMM30, Cache: 9x28pin DIP (used: 4xM5M5276P-25, 1xUM6164BK-20) - ISA8: 1, ISA16: 6 - OSC: 25.000MHz, 14.31818 -ROM_START( a486sio )// BIOS-String : 40-0104-001292-00101111-050591-I486SI-F - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "isa-486sio.bin", 0x10000, 0x10000, CRC(f339f8ff) SHA1(d53f0ff30cc7f0c70ffeeda33d16dddbeedd6098)) -ROM_END - -// Micronics JX30GP - Motherboard P/N: 09-00189-10 REV B1 - Chipset: MIC 471, MIC491, PC87312VF (Super I/O), KS82C6818A - -// CPU: Socket 3, solder pads for 80486QFP - RAM: 4xSIMM72, Cache: 6xUM61256FK-15, 1xW24257AK-15 - DIP4: 0000 - OSC: 14.318 -// ISA16: 5, ISA16/VLB: 2 - on board: Floppy, ISA, PS/2 keyboard and mouse -ROM_START( mijx30gp ) // BIOS: Phoenix, 80486 ROM BIOS PLUS Version 0.10 GJX30G-04P, Gateway 2000 Local Bus BIOS - shows Error 8602 - Auxiliary Device Failure - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "micronics_gjx30g-04p_09-24-93.bin", 0x10000, 0x10000, CRC(66477a66) SHA1(549eecf707bbb43bcdc89715b36cc23e3cb1a074)) - ROM_IGNORE(0x10000) // the second half of the 128K ROM seems to contain BIOS source code -ROM_END - -// AMI 80486 EISA Enterprise-II - Chipset: AMI/Intel 82357 - RAM: 8xSIMM30 (32MB max), 128K cache memory - CPU: i486DX 25/33, Weitek WTL4167 FPU socket provided -// on board: Floppy, PS/2 mouse, memory card socket, i/o expansion module slot - EISA: 8 -// BIOS-String: 41-0001-004616-00111111-070791-AMI-EP-0 - EISA CMOS INOPERATIONAL / Software Port NMI INOPERATIONAL / Fail-safe Timer NMI INOPERATIONAL / Keyboard error -ROM_START( amient2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "16092391.cs1", 0x00000, 0x20000, CRC(b0ae5c8d) SHA1(0d6cda74433a5d70e8fc2bec6a77ed97a09a984e)) -ROM_END - -// AMI Enterprise-III EISA Local Bus Series 68 - CPU: i486SX/DX/DX2 25/33/50/66MHz - RAM: 16xSIMM32 (up to 256MB RAM!!!), Cache 256K -// EISA: 6, EISA/VL: 2 - BIOS: Flash - repeated short single beeps (DRAM refresh error) -// BIOS-String: 41-0103-004668-00111111-111192-AMIS68 -ROM_START( amient3 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s68p.rom", 0x00000, 0x20000, CRC(7342b9ef) SHA1(da6b2312ccc175473443b1d562d5e4f3952cac5a)) -ROM_END - -// AMI ENTERPRISE-IV EISA VLB - CPU: 486SX/486SX/486DX/DX2/Pentium overdrive 25/33/50/66 MHz - RAM: 4xSIMM72 (256MB), Cache: 256KB -// EISA: 5, EISA/VL: 2 - on board: floppy, IDE, par, 2xser - screen remains blank -// BIOS-String: 41-0103-004687-00111111-111192-AMIS87 -ROM_START( amient4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s87p.rom", 0x00000, 0x20000, CRC(ff092e7f) SHA1(4999278dca001de74dff518f1f1c9ea8212d7ed4)) -ROM_END - -// AMI Super Voyager PCI-II - Chipset: AMI, SMC - CPU: 486DX/DX2/DX4 - RAM: 4xSIMM72 (64MB), Cache: 5x32pin, 4x28pin+TAG (127/256K) -// BIOS: Flash - Keyboard-BIOS: AMIKEY - ISA16: 4, PCI: 3 - on board: Floppy, 2xIDE, 2xer, par - screen remains blank -ROM_START( amisvpci2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s724p.rom", 0x00000, 0x20000, CRC(fa9ea9b3) SHA1(b0f2206a7f0d6a00e094f7d151c16022a5292858)) -ROM_END - -// AMI Super Voyager VLB - screen remains blank -// BIOS-String: 40-0103-004669-00111111-111192-AMIS69B2 -ROM_START( amisvvlb ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s69b2p.rom", 0x00000, 0x20000, CRC(3a13944c) SHA1(9d7733ee50023edd5b0bf4b098c9c6c35a4dc2b0)) -ROM_END - -// AMI Super Voyager VLB-II - AMI Super Voyager VLB-II - CPU: 486/Overdrive - Chipset: AMI, SMC FDC37C665GT -// RAM: 4xSIMM72, Cache: 8x28pin + TAG - ISA16: 5, ISA16/VL: 2 - BIOS: 28pin in a 32pin socket - on board: Floppy, IDE -// BIOS-String: 40-0100-004682-00111111-111192-AMIS82E -ROM_START( amisvvlb2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s82p.rom", 0x00000, 0x20000, CRC(2e2d33ae) SHA1(349be4b29bc8a4447ab4c73fe4c695276565489f)) -ROM_END - -// AMI Super Voyager VLB-III - Chipset: FDC37C665GT, AMI - CPU: 486SX, 487DX, 486DX/DX2/DX4, Overdrive -// RAM: 4xSIMM72 - on board: mouse, par, 2xser, Floppy, IDE - ISA16: 5, ISA16/VL: 2 - screen remains blank, repeated single beeps -ROM_START( amisvvlb3 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "s707p.rom", 0x00000, 0x20000, CRC(5c0e55c0) SHA1(0c5232a21180d4541202ac6dd34677339b7cbecc)) -ROM_END - -// Edom 486VL3H MV020 - CPU: 486 - Chipset: HiNT CS8005, HMC HM82C206AQ - RAM: 8xSIMM30 -// Cache: IS61C256AH-20Z (8), AE88128AK-15 - Keyboard-BIOS: JETkey V5.0 - ISA8: 2, ISA16: 3, ISA16/VLB: 3 -// BIOS-String: 09/05/94-HINT-8005-214D1W00-00 / HiNT CS8005 FOR 486SX/DX/DX2 VL-BUS [MV020] -ROM_START( ed486vl3h ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4hiw001.bin", 0x10000, 0x10000, CRC(760842fd) SHA1(2fe156f092c84cf385079da1209a8f1e06005f5e)) -ROM_END - -// MSI MS-4134 - Chipset: ALI M1429, M1431, M1435 - CPU: Socket 3, RAM: 4xSIMM30, 2xSIMM72, Cache: 8x32pin + TAG, used: 9xW2464AK-20 -// ISA16: 3, ISA16/VL: 2, PCI: 3 - BIOS: AMI -// BIOS-String: -ROM_START( ms4134 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0105-421169-00101111-080893-1429GPCI-0 / AL57 111594 - ROM_SYSTEM_BIOS(0, "al57", "AL57") - ROMX_LOAD( "al57.rom", 0x00000, 0x20000, CRC(6b6c2a11) SHA1(1e40ef8a7a7b3be057ba6a121abfd0d983d5d5c9), ROM_BIOS(0)) - // 1: BIOS-String: 40-0105-421169-00101111-0890893-1429GPCI-0 / AL51 5/23/1994 - ROM_SYSTEM_BIOS(1, "al51", "AL51") - ROMX_LOAD( "4alm001.bin", 0x00000, 0x20000, CRC(0ea9f232) SHA1(5af1a0cf047b68a7070b8c45081a80e817aade84), ROM_BIOS(1)) -ROM_END - -// Abit 486 EISA-AE4 - Chipset: SiS 85C406, 85C411, three other SiS chips unreadable - CPU: 486, FPU socket provided - RAM: 8xSIMM30, Cache: 8x28pin -// ISA16: 2, EISA: 6 - BIOS: Award EISA486/CU - Keyboard-BIOS: NEC KB-BIOS VER:400 JU-JET 1989 - OSC: 50.000MHz, 14.31818MHz -// Award Modular BIOS v4.20 / AE4 EISA SYSTEM BIOS -ROM_START( abae4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ae4.bin", 0x10000, 0x10000, CRC(d9cbc3c6) SHA1(eeeaef7fd188598d477897f0248c99940cd1a5d7)) -ROM_END - -// FIC 486-KVD - Chipset: VIA VT82C485 - CPU: 486, solder pad for 486sx present - RAM: 8xSIMM30, Cache: 4xIS61C256A-20N+1xCY7C185-20PC, 4 empty sockets (28pin) -// ISA16: 5, ISA16/VL: 2 - BIOS: AMI 486DX ISA BIOS AA7211137 - Keyboard-BIOS: MEGA-KB-H-WP - -ROM_START( fic486kvd ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: X0-0100-001121-00101111-021993-VIA-0 - ROM_SYSTEM_BIOS(0, "021993", "021993") - ROMX_LOAD( "486kvd_aa72111137.bin", 0x10000, 0x10000, CRC(a1f1810f) SHA1(405afbf1635c6b41343aabfeeb3cf4cdc947a5ba), ROM_BIOS(0)) - // 1: BIOS-String: X0-0100-001121-00101111-021993-VIA-0 - ROM_SYSTEM_BIOS(1, "060692", "060692") - ROMX_LOAD( "486-aa9615811.bin", 0x10000, 0x10000, CRC(b6b1a8e4) SHA1(be537fc27f6dedbd7fd935a7900ec075d2183837), ROM_BIOS(1)) -ROM_END - -// Eagle EAGLEN486 GC10A - Chipset: NEC ADC006, LGS Prime 3B 9543 - CPU: Socket 3 - RAM: 2xSIMM72, Cache: fake (not connected, marked write back) -// On board: IDE, Floppy, 2xser, par - ISA16: 4, PCI: 2 - BIOS: 32pin (sst29ee010), only the first half is occupied - // BIOS-String: Phoenix NuBIOS Version 4.04 -ROM_START( gc10a ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "nec_sst29ee010_orig.bin", 0x10000, 0x10000, CRC(7b1feabb) SHA1(468734b766b9c438b2659fddf2cabcfde5a574a2)) - ROM_IGNORE(0x10000) -ROM_END - -// Arstoria AS496 - Chipset: SiS 85C495, 95C497, Winbond - CPU: Socket 3 - RAM: SIMM72x4, Cache: 4+1 - BIOS: 32pin Keyboard-BIOS: BESTKEY - ISA16: 4, PCI: 3 -// BIOS-String: 09/12/96-SiS-496-497/A/B-2A4IBR2CC-00 / ARSTORIA AS496 V2 09/12/96 - boots to Boot Block BIOS -ROM_START( as496 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "as496.bin", 0x00000, 0x20000, CRC(745f8cc8) SHA1(46b9be25a7027a879482a412c9fe5687bbb28f08)) -ROM_END - -// Peacock PCK 486 DX DOC 50-60064-00 - Chipset: Symphony SL82C465 SL82C461 SL82C362 Chips F82C721 - CPU: i486DX-33, FPU socket privoded -// BIOS: AMI 486DX ISA BIOS AA3364567 - Keyboard-BIOS: AMI/Intel P8942AHP - On board: 2xser, Floppy, IDE, par - OSC: 33.000MHz -// BIOS-String: 40-0100-806294-00101111-060692-SYMP-0 / Peacock Computer 486 BIOS Rev. 2.0 / 30.11.92 - ISA16: 6 -ROM_START( pck486dx ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pck486dx.bin", 0x10000, 0x10000, CRC(d0edeba8) SHA1(b5b9492f32e35764c802be2b05a387a9b3aa7989)) -ROM_END - -// FIC 486-GIO-VT2 - Chipset: Winbond W83758P, Winbond W83757AF, VIA VT82C482, VT82C486A, VT82C461 - ISA8: 1, ISA16: 3, ISA/VL: 2 -// On board: Game, 2xIDE, 2xser, par, Floppy -ROM_START( ficgiovt2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 07/06/VT82C486A-214L2000-00 / Version 3.26G - ROM_SYSTEM_BIOS(0, "ficgiovt2_326", "FIC 486-GIO-VT2 3.26G") - ROMX_LOAD( "326g1c00.awd", 0x10000, 0x10000, CRC(2e729ab5) SHA1(b713f97fa0e0b62856dab917f417f5b21020b354), ROM_BIOS(0)) - // 1: BIOS-String: 06/19/95-VT82C486A-214L2000-00 / Version VBS1.08H 486-GIO-VT2 - ROM_SYSTEM_BIOS(1, "vt2vbs108","VBS1.08H 486-GVT-2") - ROMX_LOAD( "award_486_gio_vt2.bin", 0x10000, 0x10000, CRC(58d7c7f9) SHA1(097f15ec2bd672cb3f1763298ca802c7ff26021f), ROM_BIOS(1)) // Vobis version, Highscreen boot logo - // 2: BIOS-String: 07/17/97-VT82C486A-214L2000-00 / Version 3.276 - ROM_SYSTEM_BIOS(2, "ficgiovt2_3276", "FIC 486-GIO-VT2 3.276") - ROMX_LOAD( "32760000.bin", 0x10000, 0x10000, CRC(ad179128) SHA1(595f67ba4a1c8eb5e118d75bf657fff3803dcf4f), ROM_BIOS(2)) - // 3: BIOS-String: 08/30/94-VT82C486A-214L2000-00 / Version VBS1.04 486-GIO-VT2 - Keyboard-BIOS: VT82C42N - ROM_SYSTEM_BIOS(3, "vt2vbs104","VBS1.04 486-GVT-2") - ROMX_LOAD( "486-gio-vt2.bin", 0x10000, 0x10000, CRC(7282133d) SHA1(c78606027eca509cd6d439e4689b8d50753ee80c), ROM_BIOS(3)) // Vobis version, Highscreen boot logo -ROM_END - -// FIC 486-GVT - VIA VT82C486, VIA VT82C482 - AMIBIOS 08/08/93 - CPU: P24T, solder pads for 486 provided - RAM: SIMM30: 4, SIMM72: 2, Cache: 9x28pin DIP -// ISA16: 4, ISA16/VLB: 2 -ROM_START( fic486gvt ) // BIOS-String: X0-0100-001121-00101111-112593-VT486N8-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486gvt.bin", 0x10000, 0x10000, CRC(4c5b4bde) SHA1(04711725fe89d9c793a369d82d411a5495ae3aea)) -ROM_END - -// Octek Hawk REV 1.1 - BIOS: AMI AA1481746 486DX ISA BIOS 28pin - Keyboard-BIOS: Intel/AMI - Chipset: OPTi F82C206L, 82C496 - OSC: 66.667MHz, 14.31818MHz -// BIOS-String: 40-0100-000000-00101111-121291-OPTIDXBB-0 / HAWK -011 - CPU: Intel Overdrive DX2ODPR66 - ISA16: 7 -ROM_START( ochawk ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "hawk.bio", 0x10000, 0x10000, CRC(365b925d) SHA1(3a1776c80540b6878ff79857c2d4e19320a2792a)) -ROM_END - -// Abit AB-PW4 - Chipset: Winbond W83C491F, W83C492F (SL82C491 Symphony Wagner) - BIOS/Version: Award D2144079 - CPU: i486sx-25 - ISA8: 1, ISA16: 3, ISA16/VL: 3 -ROM_START( abpw4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 03/21/95-Winbond-83C491-2C4J6A11-46 / Award v4.50G / GREEN CACHE 486 VESA SYSTEM BIOS - ROM_SYSTEM_BIOS(0, "2c4j6a11", "2C4J6A11-46") - ROMX_LOAD( "award_486_bios_d2144079_c1984-1995.bin",0x10000, 0x10000, CRC(c69184da) SHA1(e8a799f9a3eebfd09c1d19a909574fca17fce7a0), ROM_BIOS(0)) - // 1: BIOS-String: 09/12/95-Winbond-83C491-2C4J6A12-2E - ROM_SYSTEM_BIOS(1, "2c4j6a12", "2C4J6A12-2E") - ROMX_LOAD( "pw4_2e.bin", 0x10000, 0x10000, CRC(c4aeac4d) SHA1(e58f2e2d5c337f447808535629686dde54c09fab), ROM_BIOS(1)) -ROM_END - -// Vintage Sprite SM 486-50USC - Chipset: UM82C491F - BIOS: EPROM/MR-BIOS 1.50 - Keyboard-BIOS: JETkey V3.0 -// CPU: Intel 486DX2-66 - OSC: 33.333000MHz, 14.31818MHz - ISA16: 5, ISA16/VL: 2 -ROM_START( sm48650usc ) // constant reset - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "mrbios_1150usc_um82c491f.bin", 0x10000, 0x10000, CRC(b6ef1220) SHA1(94511df49713ec30467c8d9b18eb04e83fa7a809)) -ROM_END - -// Octek Hippo VL+ - CPU: 486 - BIOS: EPROM/MR - Keyboard-BIOS: MR/Amikey - Chipset: DCA/Octek (label stickers) - ISA16: 3, ISA16/VL: 3 -// MR BIOS (r) V1.52 / 486SLC CPU 28MHz -ROM_START( ochipvlp ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: // reset loop - ROM_SYSTEM_BIOS( 0, "v152", "V1.52") - ROMX_LOAD( "vlmr152.rom", 0x10000, 0x10000, CRC(b4febf98) SHA1(a28ffa20fe772eac5fd149821d5637af63965371), ROM_BIOS(0)) - // 1: MR BIOS (r) V3.21 2GB support - ROM_SYSTEM_BIOS( 1, "v321", "V3.21 with 2GB support") - ROMX_LOAD( "v053b407.rom", 0x10000, 0x10000, CRC(415d92b1) SHA1(e5a9f2a677002368d20f1281e2ac3469b19079f9), ROM_BIOS(1)) -ROM_END - -// Octek Hippo COM - Chipset: UMC UM82C865F, UM82C863F, UM82C491F - CPU: 486sx - BIOS: EPROM/AMI 486DX ISA BIOS - Keyboard-BIOS: MEGATRENDS MEGA-KB-H-WP / Intel -// BIOS-String: 40-0102-428003-00101111-080893-UMC491F-0 / U491/3 GREEN 486 MAIN BOARD INV1.1 94.2.21 - ISA16: 4 - On board: 1xIDE, Floppy, Game, 2xserial, 1xparallel -ROM_START( ochipcom ) - ROM_REGION32_LE( 0x20000, "bios", 0) - ROM_LOAD( "hippo_com_bios.bin", 0x10000, 0x10000, CRC(d35f65a1) SHA1(885f55f87d2070c6a846768e5cf76499dad8d15c)) -ROM_END - -// J-Bond A433C-C/A450C-C RAM: 8xSIMM30, Cache: 8xCY7199-25PC/2xCY7C166-20PC - 2 8-bit ISA, 6 16-bit ISA) -// Chipset: ETEQ ET82C491 + ET82C493; CHIPS P82C206; AMI KB-BIOS-VER-F P8042AHP - OSC: 33.000MHz - CPU: i486DX-33 -// BIOS: AMI 486 BIOS ZZ566787 - BIOS-String: 40-0200-001353-0010111-070791-ETEQ4/1C-0 / ETEQ 486 Mar. 05, 1992 -ROM_START( a433cc ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ami_j-bond_a433c-c.bin", 0x10000, 0x10000, CRC(66031e98) SHA1(d2d1a26837d3ca943a6ef09ec3e6fbfaaa62cc46)) -ROM_END - -// ASUS PVI-486AP4 (Socket 3, 4xSIMM72, Cache: 128/256/512KB, 4 PCI, 4 ISA, 1 VLB) -// Intel Aries PCIset S82425EX + S82426EX; DS12887 RTC; VIA VT82C42N - BIOS: 32pin -ROM_START( a486ap4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 07/20/94-ARIES-P/I-AP4G-00 / #401A0-0104 - ROM_SYSTEM_BIOS(0, "486ap4v104", "ASUS PVI-486AP4 V1.04") - ROMX_LOAD( "awai0104.bin", 0x00000, 0x20000, CRC(52ea7123) SHA1(3d242ea6d1bcdddd41e32e40708133c72f2bd060), ROM_BIOS(0)) - // 1: BIOS-String: 10/21/94-ARIES-P/I-AP4G-00 / #401A0-0203 - ROM_SYSTEM_BIOS(1, "486ap4v203", "ASUS PVI-486AP4 V2.03") - ROMX_LOAD( "awai0203.bin", 0x00000, 0x20000, CRC(68d3a3f4) SHA1(6eee0c9aed2ede028eb170f8dd7921563293b99f), ROM_BIOS(1)) - // 2: BIOS-String: 11/08/94-ARIES-P/I-AP4G-00 / #401A0-0204 - ROM_SYSTEM_BIOS(2, "486ap4v204", "ASUS PVI-486AP4 V2.04") - ROMX_LOAD( "awai0204.bin", 0x00000, 0x20000, CRC(b62b35bb) SHA1(b6fa3d7b1c88da37ce74aca329a31d2587652d97), ROM_BIOS(2)) - // 3: BIOS-String: 11/25/97/ARIES-P/I-AP4G-00 / #401A0-0205-2 - ROM_SYSTEM_BIOS(3, "486ap4v205-2", "ASUS PVI-486AP4 V2.05-2") - ROMX_LOAD( "0205.002", 0x00000, 0x20000, CRC(632e8ee6) SHA1(3cf57b2654b0365e41ef5f5c82f68eeadf0e7a21), ROM_BIOS(3)) -ROM_END - -// ASUS PCI/I-486SP3G V3.02 (Socket 3, RAM: 4xSIMM72, Cache: 128/256/512K, 1 IDE, 1 SCSI, 3 PCI, 4 ISA) - BIOS: 32pin -// Intel Saturn II chipset: 82424ZX CDC + 82423TX DPU + 82378ZB SIO; NCR 53C820; National PC87332; DS12887 RTC; VIA VT82C42N -ROM_START( a486sp3g ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 10/21/94-SATURN-II-P/I-SP3G-00 / #401A0-302 - ROM_SYSTEM_BIOS(0, "v302", "ASUS PCI/I-486SP3G V3.02") - ROMX_LOAD( "awsg0302.bin", 0x00000, 0x20000, CRC(21e918a0) SHA1(c7f937e3e90a43d7c7f867e686625b28a9c2484c), ROM_BIOS(0)) - // 1: BIOS-String: 08/15/95-SATURN-II-P/I-SP3G-00 / #401A0-304 - ROM_SYSTEM_BIOS(1, "v304", "ASUS PCI/I-486SP3G V3.04") - ROMX_LOAD( "awsg0304.bin", 0x00000, 0x20000, CRC(f4d830d2) SHA1(086ccd14c7b0c521be1958d58b3539c4bfe4721f), ROM_BIOS(1)) - // 2: BIOS-String: 04/21/99-SATURN-II-P/I-SP3G-00 / #401A0-0306-1 - ROM_SYSTEM_BIOS(2, "v306", "ASUS PCI/I-486SP3G V3.06") - ROMX_LOAD( "0306.001.bin", 0x00000, 0x20000, CRC(278e1025) SHA1(75835e59cf28bb6b9258f676766633cbffa56848), ROM_BIOS(2)) -ROM_END - -// ASUS VL/EISA-486SV1 (8 EISA, 1 VLB) - -ROM_START( a486sv1 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 05/20/94-SIS-486/EISA-E-486SV1-00 / #401A0-0112 - //ROM_SYSTEM_BIOS(0, "v112", "Award BIOS V1.12") - ROM_LOAD( "e4sv0112.awd", 0x10000, 0x10000, CRC(d1d42fc9) SHA1(61549bf597517bb3c33e724e32b3cca981e65000)) -ROM_END - -// FIC 486-VIP-IO (3 ISA, 4 PCI) -// VIA GMC chipset: VT82C505 + VT82C486A + VT82C482 + VT82C483 + VT83C461 IDE; DS12885Q RTC; National PC87332VLJ-S I/O -ROM_START( ficvipio ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 12/07/94-VT82C505-2A4L4000-00 / Version 4.26GN2(ES2) (12/07/94) - ROM_SYSTEM_BIOS(0, "426gn2", "FIC 486-VIP-IO 4.26GN2") - ROMX_LOAD( "426gn2.awd", 0x00000, 0x20000, CRC(5f472aa9) SHA1(9160abefae32b450e973651c052657b4becc72ba), ROM_BIOS(0)) - // 1: BIOS-String: 02/08/96-VT82C505-2A4L4000-00 / Version 4.27GN2A (02/14/96) - ROM_SYSTEM_BIOS(1, "427gn2a", "FIC 486-VIP-IO 4.27GN2A") - ROMX_LOAD( "427gn2a.awd", 0x00000, 0x20000, CRC(035ad56d) SHA1(0086db3eff711fc710b30e7f422fc5b4ab8d47aa), ROM_BIOS(1)) - // 2: BIOS-String: 01/18/95-VT82C505-2A4L4000-00 / Version 4.26GN2A (01/18/95) - ROM_SYSTEM_BIOS(2, "426gn2a", "FIC 486-VIP-IO 4.26GN2A") - ROMX_LOAD( "486-vip-io.bin", 0x00000, 0x20000, CRC(907ed412) SHA1(5d2c584a230826935f56151a7c74419baf54796b), ROM_BIOS(2)) -ROM_END - -// Shuttle HOT-409 (6 16-bit ISA incl. 2 VLB, 2 8-bit ISA, 8 SIMM30, Cache: 64/128/256K+Tag in 2 banks) -// OPTi 82C495SX + 82C392SX + F82C206; MEGA-KB-1-WP -ROM_START( hot409 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0200-001343-00101111-111192-OPT495SX-0 / Version 2.0 - ROM_SYSTEM_BIOS(0, "hot409v20", "Shuttle HOT-409 V2.0") - ROMX_LOAD( "ami1992.bin", 0x10000, 0x10000, CRC(a19c3fd4) SHA1(404822c98344061b60883533395a89fe4902c177), ROM_BIOS(0)) - // 1: BIOS-String: 40-0204-001343-00101111-080893-OPT495SX-0 / OPTi495SX Version 3.0 - ROM_SYSTEM_BIOS(1, "hot409lba", "Shuttle HOT-409 V3.0 with LBA") - ROMX_LOAD( "409lba.rom", 0x10000, 0x10000, CRC(78c5e47e) SHA1(7f14a88a5548fc67dd00e73fd09745e899b93a89), ROM_BIOS(1)) - // 2: BIOS-String: 40-0200-001343-00101111-111192-OPT495SX-0 / VERSION 1.1 - ROM_SYSTEM_BIOS(2, "hot409v11", "Shuttle HOT-409 V1.1") - ROMX_LOAD( "amibios_hot409.bin", 0x10000, 0x10000, CRC(17729ee5) SHA1(ea3f5befe16ede7e9f4be3b367624745a6935ece), ROM_BIOS(2)) -ROM_END - -// Siemens-Nixdorf 486 mainboards and BIOS versions -// The same mainboards were used in various case versions to get the different model lines, so an identification by the mainboard number (Dxxx) is safest -ROM_START( pcd4x ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - // D756, was used in PCD-4Lsx, contains Cirrus Logic VGA ROM - ROM_SYSTEM_BIOS(0, "d756v320r316", "D756 BIOS V3.20 R3.16") - ROMX_LOAD( "fts_biosupdated756noflashbiosepromv320_320316_149.bin", 0x00000, 0x20000, CRC(2ab60725) SHA1(333b64424c08ecbbaf47110c99ad0335da211489), ROM_BIOS(0) ) - // D674, was used in PCD-4M, PCD-4Msx, PCD-4RSXA/4RA - this is a CPU card that is plugged into an ISA backplane; OSC: 14.31818 - // Chipset: LSI HT342-B-07, LSI HT321-D, Intel B6842-V31 AWARD(c)SNI UPI V4.3, IS9412BL PC87311AVF US4823312 - CPU: 486sx soldered onto the mainboard, but a socket for a 486DX is present - RAM: SIMM30x8 - // the CPU card can accept 16 bit "piggyback" modules, e.g. an ET4000 graphics card or a MFM harddisk controller to save ISA slots - // on board: IDE, Floppy, beeper, keyboard connector, parallel, 2xserial, RTC DS12887, connectors for NMI and keylock, 4 DIP switches labelled DX2, Upgrade, 25, color - // jumper X7: skip on/off, jumper x6: drv l/h - ROM_SYSTEM_BIOS(1, "d674v320r316", "D674 BIOS V3.20 R3.16") - ROMX_LOAD( "fts_biosupdated674noflashbiosepromv320_320316_144.bin", 0x00000, 0x20000, CRC(1293d27c) SHA1(22f36c4a5a0912011ed54ff917244f412208ffc0), ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2, "d674v320r304", "D674 BIOS V3.20 R3.04") - ROMX_LOAD( "d674_27c1024_3.20.bin", 0x00000, 0x20000, CRC(dfdad89e) SHA1(6cb78d8b5c8822dc84970ba912bc66a5e7cd2fb4), ROM_BIOS(2) ) - // D802, was used in PCD-4HVL - ROM_SYSTEM_BIOS(3, "d802v320r316", "D802 BIOS V3.20 R3.34.802") - ROMX_LOAD( "fts_biosupdated802noflashbiosepromv320_320334_152.bin", 0x00000, 0x20000, CRC(fb1cd3d2) SHA1(98043c6f0299e1c56e5f266ea5f117ae456447ff), ROM_BIOS(3) ) - // D620 - ROM_SYSTEM_BIOS(4, "d620", "D620") - ROMX_LOAD( "w26361-d620-z4-01-5_award_v3.10_r2.02.bin", 0x00000, 0x20000, CRC(2708cc2a) SHA1(a399c938ffeba4cb28a22e54235f3f9c5e2892f6), ROM_BIOS(4) ) -ROM_END - - -// ***** 486 motherboards using the ALi M1487 M1489 chipset - -// Abit AB-PB4 REV.:1.2 - Chipset: ALi M1487 M1489, Winbond W83787F, W83768F - On board: Floppy, 2xser, 2xIDE, par -// ISA16: 3, PCI: 3, PISA: 1 - OSC: 14.3F5P - CPU: Socket 3 - BIOS: Award D2317569, 32pin -ROM_START( abpb4 ) // both BIOS versions end up in the Boot Block BIOS - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 10/30/95-ALI-1487/89-2A4KDA12C-5E / GREEN 486 PCI SYSTEM BIOS - ROM_SYSTEM_BIOS( 0, "pb4", "PB4") - ROMX_LOAD( "486-ab-pb4.bin", 0x00000, 0x20000, CRC(90884abc) SHA1(1ee11b026cb783b28cc4728ab896dbeac14eb954), ROM_BIOS(0)) - // 1: BIOS-String: 07/03/96-ALI-1487/89-2A4KDA1BC-F2 / GREEN PCI/ISA SYSTEM ROM - ROM_SYSTEM_BIOS( 1, "pb4pf2", "PB4P-F2") - ROMX_LOAD( "pb4p_f2.bin", 0x00000, 0x20000, CRC(9ab8d277) SHA1(10e424f5dd5c98877a5a7c9ae6205b2c442ac0e0), ROM_BIOS(1)) -ROM_END - -// EFA 486 APIO all BIOS versions boot into BootBlock BIOS -ROM_START( 486apio ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "a2", "A2") - ROMX_LOAD( "apioa2.bin", 0x00000, 0x20000, CRC(0cf343be) SHA1(3a5757c802a30fb0d8d4fd623bee02af3b91fdd7), ROM_BIOS(0)) - // 1: 07/23/96-ALI-1487/89-2A4KDE3HC-00 / N486APIO Ver 2.00 SMC665GT - ROM_SYSTEM_BIOS(1, "20sm", "2.0SM") - ROMX_LOAD( "apio2smc.bin", 0x00000, 0x20000, CRC(1ced0692) SHA1(8afca17f0d793a3266b04ce8d70a359a29de3af7), ROM_BIOS(1)) - // 2: BIOS-String: 03/05/96-ALI-1487/89-2A4KDE3JC-00 / N486APIO, Rev 2.1 - ROM_SYSTEM_BIOS(2, "ag2", "AG2") - ROMX_LOAD( "1019ag2.bin", 0x00000, 0x20000, CRC(4066124e) SHA1(7adbf528d8132122da4f950ee78931abd5d949e4), ROM_BIOS(2)) -ROM_END - -// MSI MS-4145 - Chipset: ALi M1487, M1489, W83787F, W83758F - CPU: Socket 3 - RAM: 3xSIMM72 - Cache: 8x28/32pin + TAG - ISA16: 4, PCI: 3 -// BIOS: 32pin - on board: 2xIDE, Floppy, par, 2ser -ROM_START( ms4145 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "ag56", "AG56") - ROMX_LOAD( "ag56.rom", 0x00000, 0x20000, CRC(217d7258) SHA1(bd0d484607fbcf54821822e20e4bf5fcaf456591), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "ag56p", "AG56P") - ROMX_LOAD( "ag56p.rom", 0x00000, 0x20000, CRC(f2737425) SHA1(e6058a98a7ca4c03d1c1b7d30602fe97d88bc04a), ROM_BIOS(1)) - // 2: - ROM_SYSTEM_BIOS(2, "ag56s", "AG56S") - ROMX_LOAD( "ag56s.rom", 0x00000, 0x20000, CRC(c015ed49) SHA1(4c447bab1cba9d38b99c2e36e0824809e876931e), ROM_BIOS(2)) -ROM_END - -// TMC Research Corporation PCI48AF - Chipset: ALi M1487, M1489, TMSIA 9347W/TC4069UBP, FDC37C665GT - CPU: Socket 3 - RAM: SIMM72x4, Cache: 4x32pin + TAG -// ISA16: 4, PCI: 4 - On board: 2xISA, Floppy, 2xpar, 2xser - Keyboard-BIOS: AMIKEY-2 -ROM_START( pci48af ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "af2", "AF2") - ROMX_LOAD( "pci48af2.rom", 0x00000, 0x20000, CRC(556113cc) SHA1(cbbbcaa300253e766bce5292ffdfedf72c76e287), ROM_BIOS(0)) - // 1: 03/25/96-ALI-1487/89-2A4KDM29C-00 / 486DX-AC-WBc-25/33/40/50/66/80/100/120/133-A2-ZG - boots to BootBlock BIOS - ROM_SYSTEM_BIOS(1, "afa", "AFA") - ROMX_LOAD( "pci48afa.bin", 0x00000, 0x20000, CRC(9127efb5) SHA1(cf77fcca00b6e48067caefa518bedb287f945147), ROM_BIOS(1)) - // 2: - ROM_SYSTEM_BIOS(2, "f2a", "F2A") - ROMX_LOAD( "48af-f2a.rom", 0x00000, 0x20000, CRC(1e0d8216) SHA1(c6e4342dea2b7feac6e239dc99aee65508f9c297), ROM_BIOS(2)) -ROM_END - -ROM_START( alim1489 ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: // V1.2A (with fake cache SRAM) - Chipset: ALi M1489, M1487, UM8663AF, UM8667 - BIOS: 10/10/94 AMI AD0153466 (32pin) - ISA16: 4, PCI: 3 - // On board: 2xser, Game, par, Floppy, 2xIDE - OSC: 14.31818 - ROM_SYSTEM_BIOS(0, "ali148901", "ALi M1489 #1") - ROMX_LOAD( "ali.bin", 0x00000, 0x20000, CRC(d894223b) SHA1(088a94d2425f0abc85fafa922a5c6792da608d28), ROM_BIOS(0)) - // 1: Chipset: ALi M1489 A1, M1487 B1, GoldStar Prime 3b - CPU: Am486DX4-100 - RAM: 2xSIMM72, Cache: 9x32pin, used: 5xCY7C199-15PC - // BIOS: AMI 32pin - ISA16: 4, PCI: 3 - On board: 2xIDE, Floppy, 2xser, par - ROM_SYSTEM_BIOS(1, "ali148902", "ALi M1489 #2") - ROMX_LOAD( "ali_pci486v1-hj3.bin", 0x00000, 0x20000, CRC(fca45439) SHA1(a4bad38301c9e7f780a95a07b7062f0a277a7a10), ROM_BIOS(1)) -ROM_END - - -// ***** 486 motherboards using the CONTAQ 82C596 chipset - -// MSI MS-4125 - Chipset: CONTAQ 82C596 SiS 85C206 - ISA8: 1, ISA16: 3, ISA16/VL: 2 - BIOS: AMI 486DX ISA BIOS AA65441044 (28pin) - Keyboard-BIOS: AMI/Intel P8942AHP -// BIOS-String: 40-0104-001169-00101111-111192-CTQ596-0 / AC5E 052193 -ROM_START( ms4125 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD("ms4125.bin", 0x10000, 0x10000, CRC(0e56b292) SHA1(9db26e8167b477c550d756d1ca2363283ebff3ed)) -ROM_END - -// Diamond Flower, Inc. (DFI) 486-CCV Rev B - Chipset: CONTAQ 82C596, KS83C206EQ - BIOS: 11/11/92 AMI AB8644083 (28pin) - Keyboard-BIOS: AMIKEY-2 -// BIOS-String: 40-0100-ZZ1211-00101111-111192-CONTAQ/5-0 - OSC: 14.31818MHz - ISA8: 2, ISA16: 4, ISA16/VL: 2 -ROM_START( 486ccv ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "contaq.bin", 0x10000, 0x10000, CRC(2ac46033) SHA1(a121c22ded4932e3ba8d65c2b097b898f02147c7)) -ROM_END - - -// ***** 486 motherboards using the OPTi495SLC chipset - -// QDI PX486P3 - Chipset: OPTi 82C495SLC, F82C206 - CPU: 486 - BIOS: 11/11/92 AMI (28pin) -// Keyboard-BIOS: AMIKEY - ISA8: 1, ISA16: 3, ISA16/VL: 3 (one marked MASTER/SLAVE, two marked SLAVE) -ROM_START( px486p3 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0402-428003-00101111-111192-OP495SLC-0 / PX486DX33/50P3 IVN 2.0 19/11/1993 - ROM_SYSTEM_BIOS(0, "ivn20", "IVN 2.0") - ROM_LOAD( "px486p3.bin", 0x10000, 0x10000, CRC(4d717aad) SHA1(2d84cf197845d58781f77e4d539ca994fd8733c8)) - // 1: BIOS-String: 40-0401-428003-00101111-111192-OP495SLC-0 / PX486DX33/50P3 IVN 1.0 25/06/1993 - ROM_SYSTEM_BIOS(1, "ivn10", "IVN 1.0") - ROMX_LOAD( "qdi_px486.u23", 0x10000, 0x10000, CRC(c80ecfb6) SHA1(34cc9ef68ff719cd0771297bf184efa83a805f3e), ROM_BIOS(1)) -ROM_END - -// NAT48PV-1.0 VL - Chipset:82C495SLC, Chips F82C206J - RAM: 8xSIMM30, Cache: 9xIS61C256A - OSC: 14.31818 - BIOS: AMI 486DX ISA BIOS (28pin) AA5312581 -// Keyboard-BIOS: MEGA-KB-F-WP P8042AHP - ISA8: 2, ISA16: 3, ISA16/VL: 2 -// 40-040A-001291-00101111-111192-OP495SLC-0 / 486DX-OP-WBq-25/33/50-K2-ZZ -ROM_START( nat48pv ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "amibios_aa5312581.bin", 0x10000, 0x10000, CRC(8a788c79) SHA1(050972b7a369a463d6654ec52c0804002e9bcb37)) -ROM_END - - -// ***** 486 motherboards using the OPTi OPTi 82C392, 82C493, 82C206 chipset - -// Auva-Cam-33-P2 = See-Thru Sto486Wb - CPU: 486 - ISA8: 1, ISA16: 7 - Chipset: OPTi 82C392, 82C493, 82C206 -// MR BIOS (tm) V1.30 -ROM_START( sto486wb ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "opti_82c493_486_mr_bios_v130.rom", 0x10000, 0x10000, CRC(350d5495) SHA1(4f771ef5fe627e0556fb28f8972e545a0823a74d)) -ROM_END - -// Silicon Valley Computer, Inc. 486WB6A3.B1 - Chipset: OPTi 82C493/392, F82C206 - BIOS: AMI 486 BIOS ZZ342708 - Keyboard BIOS:AMI KB-BIOS-VER-F -// CPU: Intel 80486DX-33, secondary socket - RAM: 8xSIMM30, Cache: 9xMosel MS6264A-20NC - OSC: 33.333MHz, 14.31818 - ISA8: 1, ISA16: 6, ISA16/RAM extension: 1 -ROM_START( 486wb6a3 ) // BIOS String: 40-0101-ZZ9999-00101111-060691-OPWBSX-F - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486_ami.bin", 0x10000, 0x10000, CRC(1f5e9263) SHA1(534a6ace19ba6185614e04e3bd2d0aabe1193e2c)) -ROM_END - -ROM_START( op82c392 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: 486-A4865-A4866-XX V2 1 COMP - CPU: 486DX-33 - Chipset: Opti 82C392, 82C493, Opti F82C206 - BIOS: 486DX AMI (28pin) - Keyboard-BIOS: AMI - // BIOS-String: - ECB: 1, ISA8: 2, ISA16: 5 - OSC: 14.318, 66.000000MHz - RAM: 8xSIMM30, Cache: 16 sockets +1 provided - ROM_SYSTEM_BIOS(0, "a4865", "A4865") - ROMX_LOAD( "a4865-a4866.bin", 0x10000, 0x10000, CRC(9c726164) SHA1(b6ad8565a489b9d5991eea37905be2e6fc59fa48), ROM_BIOS(0)) - // 1: Chipset: OPTi 82C392, 82C493, UMC UM82C206L - CPU: i486DX-33, FPU socket provided - OSC: 34.000MHz, 14.31818 - Keyboard-BIOS: AMI/Intel P8942AHP - // BIOS: AMI 486 BIOS Z600436 - BIOS-String: 40-0131-425004-01001111-070791-OPWB493-0 / ABC COMPUTER CO., LTD. - 40-0101-DK1343-00101111-00101111-060691-OPWBSX-0 - ISA8: 2, ISA16: 6 - ROM_SYSTEM_BIOS( 1, "82c493", "82C493") - ROMX_LOAD( "486-920087335.bin", 0x10000, 0x10000, CRC(38571ffe) SHA1(aa6048213139c88901aca9cd38251a3937b6e52d), ROM_BIOS(1)) - // 2: Chipset: OPTi 82C392, 82C493, Chips 206 - CPU: two sockets provided - RAM: 8xSIPP30, on board RAM/Cache? photo too blurry - Keyboard BIOS: Intel/AMI - // OSC: 66.666MHz, 14.31818 - ISA8: 1 (solder pads for memory slot provided), ISA16: 7 - BIOS-String: 40-0101-009999-00101111-060691-OPWBSX-0 / OPTi-WB GW486SX/DX BIOS, July 3, 1992 - ROM_SYSTEM_BIOS( 2, "060691", "06/06/91") - ROMX_LOAD( "gw486sxdx.bin", 0x10000, 0x10000, CRC(99ecd9ce) SHA1(616bc1192c0ffb9d90f8aa32d93a8badc45f9d56), ROM_BIOS(2)) -ROM_END - - -// motherboards using the OPTi 82C802A, 82C602A chipset - -// Edom MV035F - Chipset: OPTi 82C802A, 82C602A - CPU: TI 486DX2-80 - RAM: 4xSIMM30, 3xSIMM72, Cache: 4x32pin, 4x28pin, TAG -// BIOS: 28pin - Keyboard-BIOS: VIA - ISA16: 5, ISA16/VL: 3 -// From the source: "The seller claimed that it POSTed, but all the BIOS options were grayed out. I pulled and dumped the BIOS -// chip, ran it through MODBIN and found out the OEM of the board simply set all BIOS setup options to 'SHOW-ONLY'. I set all -// except PCI CONFIGURATION to 'Enabled' (since this board doesn't have any PCI slots), blanked the EPROM and burned the modified -// BIOS to it, and now I can set all CMOS setup options normally." -// BIOS-String reflects the edit: 11/17/95-OPTi-802G-2C4UKW01-00 / Computer Spirit v1.0 (Hack 1.0 by Eep386 -ROM_START( edmv035f ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "mf035fed.bin", 0x10000, 0x10000, BAD_DUMP CRC(5c1ce352) SHA1(c7944b06e4a3473bb720caa5043f4b55bccf3835)) -ROM_END - -// Octek Hippo DCA2 - Chipset: OPTi 802G - BIOS: 28pin - CPU: Socket 3 - ISA8: 2, ISA16: 3, ISA16/VL: 3 - RAM: 4xSIMM72, Octek claimed, Cache would be taken out of main RAM -ROM_START( ochipdca2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 10/27/94-OPTI-802G-2C4UKO01-00 / (2C4UKO01) EVALUATION ROM - NOT FOR SALE - ROM_SYSTEM_BIOS(0, "hv2433", "AWARD HV2433") - ROMX_LOAD( "hv2433.awa", 0x10000, 0x10000, CRC(d6179601) SHA1(8a9c7ec959f6626268e0e242760439272fc9e28c), ROM_BIOS(0)) - // 1: beep code - ROM_SYSTEM_BIOS(1, "h2433", "AMI H2433") - ROMX_LOAD( "h2433.ami", 0x10000, 0x10000, CRC(a646a191) SHA1(086ae94554e3c2b292f2e32b5cb080c15dfa3e0b), ROM_BIOS(1)) - // 2: beep code L-H-H-L - ROM_SYSTEM_BIOS(2, "mr321", "MR-BIOS 3.21") // supports AMD X5-133 - ROMX_LOAD( "095061.bin", 0x10000, 0x10000, CRC(0a58cab2) SHA1(e64d6ca0bad6eeed492260853d7d60cd2a60a222), ROM_BIOS(2)) - // 3: beep code L-H-H-L - ROM_SYSTEM_BIOS(3, "mr31", "MR-BIOS 3.1") - ROMX_LOAD( "dca2mr31.rom", 0x10000, 0x10000, CRC(43b7415f) SHA1(45df892d146b8e2594274773c93d1623207b40fc), ROM_BIOS(3)) -ROM_END - - -// Motherboards using the Opti 82C895 82C602A chipset - -// ExpertChip EXP4044 - CPU: Socket3 - Chipset: OPTi 82C895, 82C602 - RAM: 4xSIMM30, 2xSIMM72, Cache: 4x28pin, 4x32pin + TAG -// Keyboard-BIOS: MEGAKEY or Winbond W83C42 - ISA16: 3, ISA16/VL: 3 -// BIOS-String: 06/23/94-OPTI-802G-2C4UKD01-00 / EXP4044 GREEN BIOS Ver 1.1 -ROM_START( exp4044 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD("4ecw001.bin", 0x10000, 0x10000, CRC(cf186fa4) SHA1(d65cc2f2c6feaa1a537319aaef86df12b44afdec)) -ROM_END - -// Jetway J-403TG -ROM_START( jwj403tg ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: JETWAY J-403TG (VER.D2E) Chipset: OPTi 82C895, 85C602 - CPU: Socket 3 - Keyboard BIOS: AMIKEY-2 - - // RAM: 4xSIMM32, 3xSIMM72, Cache: 8xW24257AK-15, 1xW24129AK - ISA16: 5, ISA16/VLB: 3 (2xMASTER, 1xSLAVE) - ROM_SYSTEM_BIOS(0, "verd2e", "VER.D2E") // BIOS-String: 40-0101-428060-00101111-111192-UMC491C-0 - ROMX_LOAD( "ver_d2e.bin", 0x10000, 0x10000, CRC(5d3b86bb) SHA1(d7c3cfbb5b858efacc7cee872a4ef5c9666f9d06), ROM_BIOS(0)) - // 1: JETWAY J-403TG GREEN VLB ver 2.0 - Chipset: OPTi 82C895, second IC with Energy Star logo - BIOS: Award 486DX J156079 - Keyboard BIOS: VIA VT82C42N - // CPU: Socket 3 - RAM: 4xSIMM30, 3xSIMM72, Cache: 8xW24257AK-15 - ISA8: 2, ISA16: 3, ISA16/VLB: 3 - ROM_SYSTEM_BIOS(1, "greenver20", "GREEN VLB ver 2.0") // BIOS-String: 07/21/94-OPTI-802G-2C4UKJ11-00 / V1.A - ROMX_LOAD( "403tg.bin", 0x10000, 0x10000, CRC(41ebe3e8) SHA1(567d61c5912cfb5fbfc9a1b674e7edad09a2165c), ROM_BIOS(1)) - // 2: JETWAY J-403TG VLB Rev D - Chipset: OPTi 82C895, 82C602 - BIOS: AMI 486DX ISA BIOS AB5257763 - Keyboard BIOS: JETkey V5.0 - // CPU: 80486DX - RAM: 4xSIMM30, 3xSIMM72, Cache: 8x32pin DIP (used: 8xH61256-20) - ISA8: 2, ISA16: 3, ISA16/VLB: 3 - ROM_SYSTEM_BIOS(2, "revd", "Rev D") // BIOS-String: 40-P301-001276-00101110-121593-OPTi895-H - blank screen - ROMX_LOAD( "b2790126", 0x10000, 0x10000, CRC(b2790126) SHA1(dad277c91dac9daffcd1e3f3e9a1a1e59c92e72e), ROM_BIOS(2)) - // 3: MR BIOS for the 82C895 chipset - MR BIOS (r) V2.02 - ROM_SYSTEM_BIOS(3, "82c895", "82C895") - ROMX_LOAD("opt895mr.mr", 0x10000, 0x10000, CRC(516cb091) SHA1(4c5b51cd05974001da4b764b4b14987657770a45), ROM_BIOS(3)) -ROM_END - -// QDI V4P895P3/SMT V5.0 - Chipset: Opti 82C895 82C602A - CPU: Am486DX2-66 - ISA8: 1, ISA16: 3, ISA16/VL: 3 -// RAM: 4xSIMM30, 2xSIMM72, Cache: 8xUM61256FK-15 - BIOS: AMI 486DX ISA BIOS Ac0928698 (28pin in a 32pin socket) - Keyboard-BIOS: AMIKEY-2 -ROM_START( v4p895p3 ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-v4p895p3-smt.bin", 0x10000, 0x10000, CRC(683f8470) SHA1(eca1c21a8f8c57389d9fdf1cd76d2dec0928524a)) -ROM_END - -// Shuttle HOT-419 - Chipset: OPTi 92C895A, 82C602A - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 8+1 UM61256K-15 - ISA8: 2, ISA16:3, ISA16/VL: 3 -// BIOS: AMI AB0585433 (28pin) - Keyboard-BIOS: AMIKEY-2 -ROM_START( hot419 ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "072594", "07/25/94") - ROMX_LOAD( "hot419_original_bios.bin", 0x10000, 0x10000, CRC(ff882008) SHA1(1a98d61fd49a2a07ff4f12ccba55cba11e4fde23), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "419aip06", "419AIP06") - ROMX_LOAD( "419aip.rom", 0x10000, 0x10000, CRC(389ca65d) SHA1(457491c60aa45499e2cd8dad9db3bf3312977a4f), ROM_BIOS(1)) -ROM_END - -// TMC PAT48PG4-V1.20 - BIOS Version: Award 10/13/95 - Chipset: OPTi 82C895+82C602 - EPROM Label: 486 AWARD SOFTWARE 1984-1995 T1103040 -// Keyboard BIOS: AMIKEY-2 - CPU: socket for 80486 - RAM: 4xSIMM30, 2xSIMM72, Cache: 9xISSI IS61M256-15N - ISA16: 4, ISA16, VLB: 3 -ROM_START( tmpat48pg4 ) // BIOS-String: 10/13/95-OPTI-802G-2C4UKM21-00.00-00 / 486DX-OP-WOe-25/33/40/50/66/80/100/120-C7-ZG - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "award.bin", 0x10000, 0x10000, CRC(c217214b) SHA1(583820b2fe96ca4bfacf9267800afe7cc76e5ffa)) -ROM_END - - -// Motherboards using the SiS 85C461 chipset - -// Abit AB-AV4 (aka VL-BUS 486) - Chipset: SiS 85C461, HM5818A - BIOS Version: AMI 11/11/92 486DX ISA BIOS AA7247480 -// Keyboard BIOS: AMI-KB-H-WP - CPU: socket for 80486PGA, solder pads for QFP486sx - RAM: 8xSIMM30, Cache: 7xW24257AK-20, 1xEm81256B-20P, 1x71256S20TP -// ISA16: 5, ISA16/VLB: 3 - OSC: 14.31818 -ROM_START( abav4 ) // BIOS String: 40-01BB-001247-00101111-111192-SIS461 / CACHE 486 SYSTEM BIOS - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "amibios.bin", 0x10000, 0x10000, CRC(7bf8142e) SHA1(17e09eebabc0d2c393d27db38b571af3c0ccbb41)) -ROM_END - -// ASUS ISA-486SV2 - Chipset: SiS 85C461 - BIOS: AMI 486DX ISA BIOS AA7892378 28pin - Keyboard-BIOS: Intel/AMI -// BIOS-String: 40-110A-001292-00101111-111192-I486SI-0 - ISA16: 5, ISA16/VL: 2 - CPU: 486DX in a blue socket (overdrive ready) -ROM_START( a486sv2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-asus isa-486sv2.bin", 0x10000, 0x10000, CRC(de925130) SHA1(2e3db7a1d4645082290d6303a16446af2959f34a)) -ROM_END - -// GENOA TurboExpress 486 VL ASY 01-00302 - Chipset: SiS 85C407 85C461 - CPU: Socket3 - OSC: 14.31818MHz - ISA16: 4, ISA16/VL: 3 - BIOS: AMI 486DX ISA BIOS AB0562153 (28pin) -// BIOS-String: 40-0100-006156-00101111-080893-SIS461-0 / GENOA TurboExpress 486VL - 3 (Ver. C) - Keyboard-BIOS: AMIKEY -ROM_START( gete486vl ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-genoa_vlb.bin", 0x10000, 0x10000, CRC(9be0f329) SHA1(3b1adedd6aad40c623757e4976e0dcadb253f255)) -ROM_END - -// Lucky Star UCM-486V30 (aka SIS486 3-VLBUS) - BIOS/Version: AMI 01/14/1993 SUPPORT VESA, 486DX ISA BIOS AA8580239 - Keyboard BIOS: AMI MEGA-KB-H-WP -// Chipset: SIS 85C461, HM6818A - CPU: P24T socket - OSC: 14.31818 - RAM: 8xSIMM30, Cache: 9x28pin DIP -ROM_START( lsucm486v30 ) // BIOS string: 40-0100-001256-00101111-111192-SIS3486-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ucm-486v30.bin", 0x10000, 0x10000, CRC(90ec73a2) SHA1(2fc17f7eed09c2f7d0139670677cc84bbc2964de)) -ROM_END - -// SOYO 486 VESA 025D2 - Chipset: SiS 85C461, 85C407 - BIOS: AMI - Keyboard BIOS: AMI (c)1988 - CPU: i486sx-33, full 486 socket provided -// RAM: 8xSIMM30, Cache: 8x28pin - ISA8: 1, ISA16: 4, ISA16/VL: 2 - BIOS-String: 40-0100-001102-00101111-080893-SIS461 / REV MG -ROM_START( so025d2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "soyo-486-vesa.bin", 0x10000, 0x10000, CRC(da798d7b) SHA1(15a8c1e244ee29ef5c61e05659f8ec7f8eaa8ab7)) -ROM_END - -// ***** 486 motherboards using the SiS BTQ 85C401/85C402 + 85C206 chipset - -// ABIT AB-AX4 - Chipset: SIS BTQ 85C401, 85C402, 85C206 - BIOS: AMIBIOS 06/06/92 - Keyboard BIOS: AMI - CPU: socket for 80486 -// RAM: 8xSIMM30, Cache: 8xEtronTech Em51256A-20P, 1X AS7C256-20PC - ISA8: 1, ISA16: 6 - OSC: 33.333MHz, 14.31818 -ROM_START( abax4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: X0-01AA-001247-00101111-060692-SISAUTO-0 / AX4 ISA SYSTEM BIOS - ROM_SYSTEM_BIOS(0, "060692", "ABIT AB-AX4 06/06/92") - ROMX_LOAD( "486dx_dump.bin", 0x10000, 0x10000, CRC(c7af4380) SHA1(59507a0f7d929ac19c5b56334f54643127c0d2be), ROM_BIOS(0)) - // 1: BIOS-String: 30-0200-D01247-00101111-070791-SIS486 / AT486DX 33MHz BIOS - ROM_SYSTEM_BIOS(1, "070791", "ABIT AB-AX4 07/07/91") - ROMX_LOAD( "486-aa1177369.bin", 0x10000, 0x10000, CRC(530535de) SHA1(7f6e627a77ebcaec97f08e6c797d31e9321e26fc), ROM_BIOS(1)) -ROM_END - -// ASUS ISA-486 - Rev. 1.4 - Chipset: SiS BTQ 85C401/85C402 + 85C206 - BIOS/Version: AMI 486DX ISA BIOS 05/05/91 AA1258865 - CPU: Intel 80486DX-33, FPU socket for 4167 provided -// RAM: 8xSIMM30, Cache: 8x28pin DIP (4x71256 fitted) - OSC: 14.31818, 33.000MHz - DIP6: 111000 - ISA8/RAM extension: 1, ISA16: 7 - -ROM_START( a486isa ) // BIOS String: 40-0102-001292-00101111-050591-SIS-486-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "isa-486.bin", 0x10000, 0x10000, CRC(57375912) SHA1(8035b5d1cfe824a20a94571a57b86fdb4018f073)) -ROM_END - -// Mitac MBA-029 - Chipset: SIS BTQ 85C401, 85C402, 85C206 - BIOS: AMI - CPU: 486 socket - OSC: 14.34818, xxxxx (unreadable) -// RAM: 4xSIMM30, Cache: 8x28pin - ISA 8: 1 (not soldered in), ISA16: 6 -ROM_START( mba029 ) // BIOS-String: 30-0200-ZZ1594-00101111-070791-SISAUTO-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "mba-029_bios_27c512.bin", 0x10000, 0x10000, CRC(8d660697) SHA1(6b2be9ec9a2d12c9348c26ac25514af406fa752e)) -ROM_END - -// ***** 486 motherboards using the SiS 85C496/85C497 chipset - -// A-Trend ATC-1425A - Chipset: SiS 85C496, 85C497 - RAM: 4xSIMM72, Cache: 4x32pin + TAG - ISA16: 4, PCI: 3 -// on board: 2xIDE, Floppy, 2xser, par - BIOS: 32pin -ROM_START( atc1425a ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Boot block - BIOS-String: 09/07/95-SiS-496-497/A/B-2A4IBA2HC-00 / 1425 SIS 496/7 BIOS VER : 1.8N 1995/09/25 - ROM_SYSTEM_BIOS(0, "ver18n", "ver1.8N") - ROMX_LOAD( "atc-1425a_original.bin", 0x00000, 0x20000, CRC(040ebc6c) SHA1(266ed07ef13c363234c7a2a88719badeeed9dc4c), ROM_BIOS(0)) - // 1: Boot block - BIOS-String: 11/03/95-SiS-496-497/A/B-2A4IBA2HC-00 / ATC-1425A SIS496/7 BIOS VER:2.0N 11-04-95 - ROM_SYSTEM_BIOS(1, "ver20n", "ver2.0N") - ROMX_LOAD( "atc-1425a_ver2_0n.bin", 0x00000, 0x20000, CRC(0af2f6c0) SHA1(a1ce34bdee5119b9ae1d8530fcf611ca2f9d592e), ROM_BIOS(1)) -ROM_END - -// A-Trend ATC-1425B - BIOS Version: Award 4.51PG 04/18/96 - Chipset: SiS 85C496/85C497, Winbond - Keyboard BIOS: Holtek HT6542B - CPU: Socket 3 -// RAM: 4xSIMM72, Cache: 4xUM61512AK-15, 1xISSI IS61C256AH-15N - on board: 2xIDE, Floppy, par, 2xser - ISA16: 4, PCI: 3 -ROM_START( atc1425b ) // Boot block - BIOS String: 04/18/96-SiS-496-497/A/B-2A4IBA2BC-00 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "1425b231.rom", 0x00000, 0x20000, CRC(1a19f34d) SHA1(09bb5e35ef07b57942cbca933f2a0334615a687e)) -ROM_END - -// Abit AB-PI4(T) - Bios: 32pin - Keyboard-BIOS: Winbond 83C42 - CPU: Socket 3 - ISA16: 4, PCI: 3 - Chipset: SiS 85C495, 85C497 -// RAM: 4xSIMM72, Cache: 9x32pin (occupied: 4xW24512AK-20, 1xW2457AK) - On board: 2xIDE -ROM_START( abpi4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: &09/25/95-SiS-496-497/A/B-2A4IBA11C-0B / GREEN 486 PCI SYSTEM BIOS - boots into "boot block" rescue BIOS - ROM_SYSTEM_BIOS(0, "pi4092595", "AB-PI4(T) 09/25/95") - ROMX_LOAD( "pi4_0b.bin", 0x00000, 0x20000, CRC(2cd67f19) SHA1(4cf0b4ff10645371361d3782c8be06c463e70219), ROM_BIOS(0)) - // 1: 486IP-B-2-A (ABIT PI4/PI4T PCI clone) REV:2B.31 - Chipset : SiS 496/497 (NV/NU) - BIOS : AWARD 2a4ibb61 - Keyboard BIOS: JETkey V5.0G - // RAM: 4xSIMM72, Cache: 9x32pin DIP (filled: 9xUM61256FK-15 CPU: Socket 3 - on board: 2xIDE - ISA16: 4, PCI: 3 - // BIOS-String : 10/02/95-SiS-496-497/A/B-2A4IBB61C-00 - boots into "boot block" rescue BIOS - ROM_SYSTEM_BIOS(1, "486ipb2a", "486IP-B-2-A") - ROMX_LOAD( "486ip-b-2-a.bin", 0x00000, 0x20000, CRC(8b1e3094) SHA1(84e8269f310b53497e63791fd3c081d7f631b686), ROM_BIOS(1)) -ROM_END - -// Abit AB-PM4 -// BIOS-String: 09/04/95-SiS-496-497/A/B-2A4IBA13C-0C / GREEN 486 PCI SYSTEM BIOS -ROM_START( abpm4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pm4_0c.bin", 0x00000, 0x20000, CRC(eaad7812) SHA1(81670c44e30fa8b8ac0aa28a5c367819ff1ca73c)) -ROM_END - -// Abit AB-PV4 -// BIOS-String: 09/26/95-SiS-496-497/A/B-2A4IBA12C-0A / GREEN 486 PCI SYSTEM BIOS -ROM_START( abpv4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pv4v_0a.bin", 0x00000, 0x20000, CRC(91de48d5) SHA1(2e873de152870270f51b5b2c4a30f2611364e739)) -ROM_END - -// Aopen AP43 - CPU: Socket 3 - Chipset: SiS 85C496, 85C497, SMC FDC37C665GT - RAM: SIMM72x4, Cache: 9x32pin, used: 9xUM61256FK-15 -// BIOS: 32pin - Keyboard-BIOS: AMIKEY-2 - on board: IDEx2, Floppy, par, 2xser -// constant chirping -ROM_START( aoap43 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "original", "original") - ROMX_LOAD( "aopen_ap43_original.bin", 0x00000, 0x20000, CRC(65075fe4) SHA1(9b150e0b37b4ff3cbfcd8bd2286e1e575c34de02), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "updated", "updated") - ROMX_LOAD( "aopen_ap43_updated.rom", 0x00000, 0x20000, CRC(68a5595e) SHA1(94551037e9d0b3fb644726b7ba66e676aa58b81a), ROM_BIOS(1)) -ROM_END - -// ASUS PCI/I-A486S (4xSIMM72, Cache: 128/256/512KB, 1 EISA) - BIOS: 32pin -// SiS 85C496/85C497 chipset; SMC 37C665 I/O; AMIKEY-2, S3 Trio 64 on board VGA, the manual also mentions Trio 32 -ROM_START( aa486s ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 05/22/95/SiS-496-497B-PCI-A486-0-00 / #401A0-0203 - ROM_SYSTEM_BIOS(0, "v203", "ASUS PCI/I-A486S V2.03") - ROMX_LOAD( "si4a0203.awd", 0x00000, 0x20000, CRC(95fcb7c6) SHA1(c19164d67af18c774e6eb06bd1570d95a24b2856), ROM_BIOS(0)) - // 1: BIOS-String: 11/27/95-SiS-496-497B-PI-A486SC-00 / #401A0-0304 - boots into "boot block" rescue BIOS - ROM_SYSTEM_BIOS(1, "v304", "ASUS PCI/I-A486S V3.04") - ROMX_LOAD( "si4a0304.awd", 0x00000, 0x20000, CRC(a00ad907) SHA1(598d97ea29f930a9359429dc540d27bfdd0fcd20), ROM_BIOS(1)) -ROM_END - -// ASUS PVI-486SP3 (Socket 3, 2xSIMM72, Cache: 128/256/512KB, 2 IDE, 3 PCI, 4 ISA, 1 VLB) -// SiS 85C496 + 85C497; UMC UM8669F; AMIKEY-2; BIOS: 29EE010 (32pin) -ROM_START( a486sp3 ) - ROM_REGION32_LE(0x20000, "bios", 0) // Winbond W29EE011-15 - // 0: BIOS-String: 07/22/94-SATURN-P/I-4SP3-00 / #401A0-0207 - ROM_SYSTEM_BIOS(0, "v207", "ASUS PVI-486SP3 V2.07") - ROMX_LOAD( "awsi0207.bin", 0x00000, 0x20000, CRC(0cb862aa) SHA1(7ffead05c1df47ec36afba395191145279c5e789), ROM_BIOS(0)) - // 1: BIOS-String: 07/22/94-SATURN-P/I-4SP3-00 / #401A0-0207 - ROM_SYSTEM_BIOS(1, "v2737", "ASUS PVI-486SP3 V2.07 #2") - ROMX_LOAD( "awsi2737.bin", 0x00000, 0x20000, CRC(8cd9a89c) SHA1(6c68c23cc5e8ae66261e9fe931f2ce07efe767b6), ROM_BIOS(1)) - // 2: BIOS-String: 06/25/96-SiS-496-497B-PVI-4SP3C-00 / #401A0-0306 - boots to Award BootBlock BIOS V1.0 - ROM_SYSTEM_BIOS(2, "v306", "ASUS PVI-486SP3 V3.06") - ROMX_LOAD( "si4i0306.awd", 0x00000, 0x20000, CRC(fc70371a) SHA1(96b10cfa97c5d1d023687f01e8acb54f263069b2), ROM_BIOS(2)) - // 3: BIOS-String: 02/11/98-SiS-496-497B-PVI-4SP3C-00 / #401A0-0307 - boots to Award BootBlock BIOS V1.0 - ROM_SYSTEM_BIOS(3, "v307", "ASUS PVI-486SP3 V3.07") - ROMX_LOAD( "si4i0307h.bin", 0x00000, 0x20000, CRC(99473cc0) SHA1(a01d253cf434a31e0ca6f6cd2b9026ca424eb463), ROM_BIOS(3)) - // 4: BIOS-String: 08/08/95-SiS-496-497B-PVI-4SP3C-00 / #401A0-0301 - boots to Award BootBlock BIOS - ROM_SYSTEM_BIOS(4, "v301", "ASUS PVI-486SP3 V3.01") - ROMX_LOAD( "4siw003.bin", 0x00000, 0x20000, CRC(47a1d815) SHA1(370bfb895646518884a2a82881721efc3aeb04d1), ROM_BIOS(4)) - // 5: BIOS-String: 11/23/94-SiS-496-497-PVI-4SP3-00 / #401A0-0101 - ROM_SYSTEM_BIOS(5, "v10101", "ASUS PVI-486SP3 V1.01 #1") - ROMX_LOAD( "0101.bin", 0x00000, 0x20000, CRC(7862ca56) SHA1(e609585893b23db10c4ae7d2abd17cc9dda964b6), ROM_BIOS(5)) - // 6: BIOS-String: 11/23/94-SiS-496-497-PVI-4SP3-00 / #401A0-0101 - screen remains blank - ROM_SYSTEM_BIOS(6, "v10102", "ASUS PVI-486SP3 V1.01 #2") - ROMX_LOAD( "si4i0101.awd", 0x00000, 0x20000, CRC(18652037) SHA1(7460e90b0a9c825d2e47943a714049fe9e943760), ROM_BIOS(6)) - // 7: BIOS-String: 07/15/95-SiS-496-497B-PVI-4SP3C-00 / #401A0-0205 - boots to Award BootBlock BIOS - ROM_SYSTEM_BIOS(7, "v205", "ASUS PVI-486SP3 V2.05") - ROMX_LOAD( "si4i0205.awd", 0x00000, 0x20000, CRC(d90d91b0) SHA1(043151d121780ff56ce32b9a48e9bbccd324625f), ROM_BIOS(7)) - // 8: BIOS-String: 04/05/96-SiS-496-497B-PVI-4SP3C-00 / #401A0-0305 - boots to Award BootBlock BIOS - ROM_SYSTEM_BIOS(8, "v305", "ASUS PCI/I-486SP3 V3.05") - ROMX_LOAD( "si4i0305.awd", 0x00000, 0x20000, CRC(2f90e63e) SHA1(a4f16753b5a57d65fba7702ca28e44f10bd5bb6c), ROM_BIOS(8)) -ROM_END - -// Chaintech 486SPM - CPU: Socket 3 - Chipset: SiS 85C497, 85C496, UMC UM8663BF - RAM: 4xSIMM72, Cache: 8xIS61C1024-10N, W24512AK-10 -// BIOS: Award E0822859 - Keyboard-BIOS: VIA VT82C42N - on board: 2xISA, Floppy, 2xser, par - ISA16: 4, PCI: 3 -ROM_START( ch486spm ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 12/21/95-SiS-496-497/A/B-2A4IBC3IC-00 - ROM_SYSTEM_BIOS(0, "original", "original") - ROMX_LOAD( "chaintech_486spm.bin", 0x00000, 0x20000, CRC(a0c9045a) SHA1(1d0b1994574437549c13541d4b65374d94c9a648), ROM_BIOS(0)) - // 1: 12/21/95-SiS-496-497/A/B-2A4IBC3IC-00 / Chaintech 486SPM v2015 PS/2 - ROM_SYSTEM_BIOS(1, "ps2", "PS2 mouse enabled") - ROMX_LOAD( "486spm-p.bin", 0x00000, 0x20000, CRC(35b5cb76) SHA1(965b212b28a5badd8d8f4769aa9edc88e47bc925), ROM_BIOS(1)) -ROM_END - -// Chaintech 4SPI - Chipset: SiS 85C496 85C497 - BIOS Version: Award v4.50G E0671975 - Keyboard BIOS: Lance Green LT38C41 -// CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9x32pin DIP (used: 4xW24512AK-15, 1xEM51256-15PL) - On board: 2xIDE -// ISA6: 5, PCI: 3 -ROM_START( ch4spi ) // BIOS String: 02/16/95-SiS-496-497/A/B-2A4IBC31-B2 / 02/17/1995 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4spibckp.bin", 0x00000, 0x20000, CRC(29b15737) SHA1(e9cb5402eb25a100a15d5ccc520cfa76c7be99a6)) -ROM_END - -// Freetech 486F55 - Chipset: SiS 496/497 - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 128KB/256KB/512KB - ISA16: 4, PCI: 3 - -// On board: 2xser, par, 2xIDE, Floppy - BIOS: Award -ROM_START( ft486f55 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "xsf", "XS-F") - ROMX_LOAD( "55xs-f.bin", 0x00000, 0x20000, CRC(b7ee53af) SHA1(6357241ac3c317f60465bf5ad77d821a7dc68b3b), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "xsg", "XS-G") - ROMX_LOAD( "55xs-g.bin", 0x00000, 0x20000, CRC(adaa3a28) SHA1(27c36b564d11f1dc9a8c6f6d075eeaf850944c08), ROM_BIOS(1)) -ROM_END - -// Jamicon KM-S4-1 VER 1.1 - Chipset: SiS 85C496/85C497 (PR/NU revision), Winbond W837F - BIOS/Version: KM-S4-1 VER:4.2 - AWARD -// BIOS: Award PCI/PNP 486 S/N:024893105 - Keyboard BIOS: Winbond W83C42 - CPU: P24T - RAM: 4xSIMM72, Cache: 4xUM61512AK-15, 1xW24257AK-15 -// on board: 2xser, Floppy, par, 2xIDE - ISA16: 3, PCI: 3 -ROM_START( jakms41 ) // BIOS String: 10/30/95-SiS-496-497/A/B-2A4IBR22C-00 - boots into BootBlock BIOS - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "km-s4-1.bin", 0x00000, 0x20000, CRC(0271356a) SHA1(893048c3390a23810a2af14da30520fbea10ad2f)) -ROM_END - -// SOYO SY-4SAW2 - Chipset: SiS 85C497, 85C496, Winbond W83787F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 4xUM61512AK-15+W24129AK-15 -// BIOS: Award (32pin) - Keyboard-BIOS: Via VT82C42N - ISA16: 3, ISA16/VL: 1, PCI: 4 - On board: 2xser, par, 2xIDE, Floppy -// keeping the ROMs for the 4SA boards here until the differences between the boards are clear, e.g. difference between SY-4SAW and 4SA2: L2-cache -ROM_START( so4saw2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 04/15/95-SiS-496-497/A/B-2A4IBS22-00 / REV IO-A - ROM_SYSTEM_BIOS(0, "ioa", "IO-A") - ROMX_LOAD( "4sa2_bios_isa_486_488755.bin", 0x00000, 0x20000, CRC(21708d9c) SHA1(be4596507df1f5cc8a4e1baafce52b96417ac029), ROM_BIOS(0)) - // 1: BIOS-String: 08/22/95-SiS-496-497/A/B-2A4IBS2hC-00 / REV IO-B1 (4SA2, http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SA2/index.html) - ROM_SYSTEM_BIOS(1, "iob1", "IO-B1") - ROMX_LOAD( "4sa-iob1.bin", 0x00000, 0x20000, CRC(a74891b6) SHA1(974c3a854a4e83202555bcbcba191f902527b577), ROM_BIOS(1)) - // 2: BIOS-String: 07/30/97-SiS-496-497/A/B-2A4IBS2hC-00 / SA-0730 (4SA, http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SA/index.html) - ROM_SYSTEM_BIOS(2, "0730", "0730") - ROMX_LOAD( "4sa0730.bin", 0x00000, 0x20000, CRC(dea32658) SHA1(2c89500d9904f61a5426de5f1351ca8004c9920b), ROM_BIOS(2)) - // 3: BIOS-String: 07/03/96-SiS-496-497/A/B-2A4IBS29C-00 / REV WA53 (4SAW/4SAW2) - ROM_SYSTEM_BIOS(3, "wa53", "WA53") - ROMX_LOAD( "4saw53.bin", 0x00000, 0x20000, CRC(2265a9d1) SHA1(bd625f0f11e64d2620648cf14e6b6faf09df80bc), ROM_BIOS(3)) - // 4: BIOS-String: 12/05/95-SiS-496-497/A/B-2A4IBS29C-00 / REV WA3 (4SAW/4SAW2) - ROM_SYSTEM_BIOS(4, "wa3", "WA3") - ROMX_LOAD( "4saw-wa3.bin", 0x00000, 0x20000, CRC(d47e727e) SHA1(c6ba38e72575127b763a8e5ead49dbaaef85ab06), ROM_BIOS(4)) - // 5: BIOS-String: 09/11/97-SiS-496-497/A/B-2A4IBS29C-00 / REV WA0911 (4SAW/4SAW2 http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SAW/index.html) - ROM_SYSTEM_BIOS(5, "0911", "0911") - ROMX_LOAD( "4saw0911.bin", 0x00000, 0x20000, CRC(4056b35e) SHA1(bca2d2507b15800ad13bd8f8c6699b49b8e87011), ROM_BIOS(5)) - // 6: BIOS-String: 09/11/97-SiS-496-497/A/B-2A4IBS29C-00 / REV WA0911 128GB BETA ROM (4SAW) - ROM_SYSTEM_BIOS(6, "0911b", "0911b") - ROMX_LOAD( "4saw0911b.bin", 0x00000, 0x20000, CRC(000fca3e) SHA1(46ceb550ed08fb013f02e51e1d428a60e220ede6), ROM_BIOS(6)) -ROM_END - -// ZIDA Tomato board 4DPS - Chipset: SIS 85C497, SIS 85C496, Winbond W83787IF, W83768F, MX8318-01PC - CPU: 486/5x86 - BIOS: Winbond W29EE011-15 / AWARD PCI/PNP -// Keyboard-BIOS: HOLTEK HT6542B or AMIKEY-2 - ISA16: 3, PCI: 3 - OSC: 24.000 - On board: 2xIDE, Floppy, 2xCOM, 1xPRN, Mouse, GAME -// from v4.00 onward it needs FLASH instead of EPROM to update the ESCD at boot time -ROM_START( zito4dps ) // all revisions land in the Award Boot block BIOS - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 01/10/96-SiS-496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.5 (2301952A4IBZ11) - ROM_SYSTEM_BIOS( 0, "4dps01", "Tomato 4DPS #1") - ROMX_LOAD( "4siw004.bin", 0x00000, 0x20000, CRC(0c57cc33) SHA1(04ce27dc89ae15d70c14076ad4f82b50a4f1e6dd), ROM_BIOS(0)) - // 1: BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) - ROM_SYSTEM_BIOS( 1, "4dps02", "Tomato 4DPS #2") - ROMX_LOAD( "4dps02.bin", 0x00000, 0x20000, CRC(757a5ef7) SHA1(e35146f34329a6a7033b1ed9d95a77692826a060), ROM_BIOS(1)) - // 2: BIOS-String: 10/17/96-SiS-496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.71 (1710962A4IBZ11) - ROM_SYSTEM_BIOS( 2, "171", "Tomato 4DPS v1.71") - ROMX_LOAD( "4dps_170.bin", 0x00000, 0x20000, CRC(10b43a85) SHA1(d77bb2420b98c030add5de52fc90c88384b2036b), ROM_BIOS(2)) - // 3: BIOS-String: 07/08/97-SiS-496-497/A/B-2A4IBZ1AC-00 / 4DPS VER 1.72F (10072A4IBZ1A) - ROM_SYSTEM_BIOS( 3, "172f", "Tomato 4DPS v1.72f") - ROMX_LOAD( "4dps172g.bin", 0x00000, 0x20000, CRC(184eeeba) SHA1(248555567e35d4d6a0cfad5abc989e8193a72351), ROM_BIOS(3)) - // 4: BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) - ROM_SYSTEM_BIOS( 4, "400a", "Tomato 4DPS v4.00a") - ROMX_LOAD( "4dps400a.bin", 0x00000, 0x20000, CRC(494da2da) SHA1(9dcae9aa403627df03d5777c1b4de0b9f98bb24f), ROM_BIOS(4)) - // 5: BIOS-String: 01/10/96-SiS-496-497/A/B-2A4IBZ11C-00 / Tomato 4DPS v4.01 (Y2K ready) - ROM_SYSTEM_BIOS( 5, "401e", "Tomato 4DPS v4.01e") - ROMX_LOAD( "4dps401e.bin", 0x00000, 0x20000, CRC(e84b2bb2) SHA1(5dd8e801decf87af90ff90e3096819354f657b5a), ROM_BIOS(5)) - // 6: v2.11, also marked v400a - BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) - ROM_SYSTEM_BIOS( 6, "4dps03", "Tomato 4DPS #3") - ROMX_LOAD( "4dps400b.bin", 0x00000, 0x20000, CRC(5910fa95) SHA1(934845038298d2d50f5bd4b20e0a4ccd9aa74e82), ROM_BIOS(6)) - // 7: BIOS-String: 11/23/95-SiS-496-497/A/B-2A4IBZ11C-00 - ROM_SYSTEM_BIOS( 7, "4dps04", "Tomato 4DPS #4") - ROMX_LOAD( "4dps04.bin", 0x00000, 0x20000, CRC(f704be6a) SHA1(536c17c2a26e8a0f3bc3ddf6b8daa2f694905c24), ROM_BIOS(7)) - // 8: 01/10/96-SiS496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.6 (2005962A4IBZ11) - ROM_SYSTEM_BIOS( 8, "160", "Tomato 4DPS v1.6") - ROMX_LOAD( "4dps_160.bin", 0x00000, 0x20000, CRC(27d23966) SHA1(3fea7573c1897a4bd6d09e4ffc4e26372a25e43a), ROM_BIOS(8)) -ROM_END - -// Jetway J-446A - Chipset: SiS 85C497, 82C496 - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 4+1 sockets - BIOS: 32pin -// Keyboard-BIOS: HOLTEK HT6542B - ISA16: 3, PCI: 3 - On board: 2xIDE, Floppy, par, 2xser -ROM_START( jwj446a ) // BootBlock BIOS - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS( 0, "no1", "J-446A #1") - ROMX_LOAD( "j446a_original.bin", 0x00000, 0x20000, BAD_DUMP CRC(79d2e360) SHA1(8bf3befa1c869e298ec346cc784fcbc2193e3912), ROM_BIOS(0)) - // 1: 02/02/96-SiS-496-497/A/B-2A4IBJ19C-00 / V.446 RP5 2-2-1996 - ROM_SYSTEM_BIOS( 1, "no2", "J-446A #2") - ROMX_LOAD( "j446a.rom", 0x00000, 0x20000, CRC(3e3c6abd) SHA1(04952dc143baa7b51cb6fc5eb1961007ecf36aaf), ROM_BIOS(1)) -ROM_END - -// LuckyStar LS-486E - Chipset : SiS496, SiS497, SMC FDC37C665GT - CPU: AMD 486DX4-100 (Socket 3) - RAM: 4xSIMM72, Cache: 4 sockets (UM61512AK-15)+1 -// BIOS : AMIBIOS 486PCI ISA 393824, on a 27C010 type ROM chip - Keyboard-BIOS: AMIKEY-2 - ID string : 41-PH0D-001256-00101111-101094-SIS496AB-H -// On board: 2xISA, Floppy, par, 2xser - ISA16: 4, PCI: 3 -ROM_START( ls486e ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Rev:C - no display - ROM_SYSTEM_BIOS( 0, "revc01", "Rev.C #1") - ROMX_LOAD( "ls486e_revc.bin", 0x00000, 0x20000, CRC(d678a26e) SHA1(603e03171b28f73bdb6ce27b0bbae2a4cfb13517), ROM_BIOS(0)) - // 1: LS486E Rev.D SiS496/497(PR/NU) EDO Support AWARD 10/21/96 - 10/21/96-SiS-496-497/A/B-2A4IBL12C-00 - 486E 96/10/24 UMC8669 PLUG & PLAY BIOS - ROM_SYSTEM_BIOS( 1, "revd01", "Rev.D #1") // boots to BootBlock BIOS - ROMX_LOAD( "ls486-d.awa", 0x00000, 0x20000, CRC(5a51a3a3) SHA1(6712ab742676156802fdfc4d08d687c1482f2702), ROM_BIOS(1)) - // 2: Lucky Star LS486E rev.C,Winbond,SiS496/497 - BIOS Award PNP v4.50PG (486E 96/5/17 W83787) - BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 / 486E 96/5/17 W83787 - ROM_SYSTEM_BIOS( 2, "revc02", "Rev.C #2") // boots to BootBlock BIOS - ROMX_LOAD( "ls486e-c.awd", 0x00000, 0x20000, CRC(8c290f20) SHA1(33d9a96e5d6b3bd5776480f5535bb1eb1d7cff57), ROM_BIOS(2)) - //3: BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 / 486E 96/7/19 W83787 PLUG & PLAY BIOS - boots to BootBlock BIOS - ROM_SYSTEM_BIOS( 3, "revc1", "Rev.C1") // also on a Rev.C2 board - ROMX_LOAD( "ls486ec1.bin", 0x00000, 0x20000, CRC(e96d1bbc) SHA1(64d0726c4e9ecee8fddf4cc39d92aecaa8184d5c), ROM_BIOS(3)) - // 4: BootBlock BIOS - ROM_SYSTEM_BIOS( 4, "lh5", "LH5") - ROMX_LOAD( "ls-486e.bin", 0x00000, 0x20000, CRC(03ca4a97) SHA1(f9e5e2f2fabcb47960dfa91c37bf74fa93398092), ROM_BIOS(4)) - // 5: BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 - boots to BootBlock BIOS - ROM_SYSTEM_BIOS( 5, "ls486eb", "LS-486E(B)") - ROMX_LOAD( "4siw001.bin", 0x00000, 0x20000, CRC(d81d722d) SHA1(bb18324b3679b7419c230244891b626a61006486), ROM_BIOS(5)) -ROM_END - -// MSI MS-4144 - Chipset: SiS 85C497, 85C496, Winbond W83787F, W83758F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 8+1 sockets -// On board: 2xIDE, Floppy, 2xser, par - ISA16: 4, PCI: 3 -ROM_START( ms4144 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: no display - ROM_SYSTEM_BIOS(0, "af53", "AF53") - ROMX_LOAD( "ms-4144_af53.rom", 0x00000, 0x20000, CRC(931ebb7d) SHA1(fa7cf64c07a6404518e12c41c197354c7d05b2d2), ROM_BIOS(0)) - // 1: no display - ROM_SYSTEM_BIOS(1, "af54", "AF54") - ROMX_LOAD( "ms-4144_af54s.rom", 0x00000, 0x20000, CRC(1eb02779) SHA1(b18cc771fc5a820437a4daca06806188ee1a27a5), ROM_BIOS(1)) - // 2: BIOS-String: 03/20/96-SiS-496-497/A/B-2A4IBM49C-00 / WF53S 032096 - boots to BootBlock BIOS - ROM_SYSTEM_BIOS(2, "wf53", "WF53") - ROMX_LOAD( "ms-4144_wf53s.bin", 0x00000, 0x20000, CRC(df83f099) SHA1(b7dc61a2cb71754cddd06d12d3bf81ffce442c89), ROM_BIOS(2)) - // 3: BIOS-String: 02/07/96-SiS-496-497/A/B-2A4IBM49C-00 / WF54S 020896 - boots to BootBlock BIOS - ROM_SYSTEM_BIOS(3, "wf54", "WF54") - ROMX_LOAD( "ms-4144_wf54s.bin", 0x00000, 0x20000, CRC(c0ff31df) SHA1(4e138558781a220b340977d56ccbfa61a907d4f5), ROM_BIOS(3)) - // 4: no display - VER 2.1 - BIOS: AMI 486DX ISA BIOS AC8999569 (32pin)- Keyboard-BIOS: AMIKEY-2 - ROM_SYSTEM_BIOS(4, "v21", "Ver 2.1") - ROMX_LOAD( "486-pci-ms4144.bin", 0x00000, 0x20000, CRC(8bd50381) SHA1(c9853642ac0946c2b1a7e469bcfacbb3351c4067), ROM_BIOS(4)) -ROM_END - -// SOYO 30H - CPU: Socket 3 - RAM: SIMM72x4 - Cache: 256K, 512K or 1024K - ISA16: 4, PCI: 3 - on board: 2xIDE -// BIOS-String: 12/07/95-SiS-496-497/A/B-2A4IBS2AC-00 / REV B2 -ROM_START( so30h ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "30h-b2.bin", 0x00000, 0x20000, CRC(1dd22cef) SHA1(dd0ac15e7a792e8fba2f55d6a1b35256e74bcf4e)) -ROM_END - -ROM_START( sis85c496 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // Chipset: SiS 85C496/85C497 - CPU: Socket 3 - RAM: 2xSIMM72, Cache - Keyboard-BIOS: JETkey V5.0 - // ISA16: 3, PCI: 3 - BIOS: SST29EE010 (128k) AMI 486DX ISA BIOS AA2558003 - screen remains blank - ROM_LOAD( "4sim002.bin", 0x00000, 0x20000, CRC(ea898f85) SHA1(7236cd2fc985985f21979e4808cb708be8d0445f)) -ROM_END - - -// ***** 486 motherboards using the SiS 85C471 + 85C407 chipset - -// 486IG-B-2-1 - CPU: 486 - RAM: 8xSIMM30, Cache: 4x32pin, 4x28pin, TAG - Chipset: SIS85C471/407 - BIOS: AMI WIN BIOS 07/25/94 -// Keyboard-BIOS: AMIKEY - BIOS-String: 40-0002-428020-00101111-080893-SIS471B-F - ISA8: 1, ISA16: 3, ISA16/VL: 3 -ROM_START( 486igb21 ) // display remains blank - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486igb21.amw", 0x10000, 0x10000, CRC(b62cc7af) SHA1(048f80ad995a1516f97bb7544d3fb608a93893b1)) -ROM_END - -// Abit AH4/AH4T/AN4R2 ( the T model has a voltage regulator for DX4 CPUs) - CPU: Socket 3 - Chipset: SIS 85C471 / SIS 85C407 -// RAM: 4xSIMM72, Cache: 9x28pin (32pin sockets except TAG) - BIOS: AMI - Keyboard-BIOS: AMIKEY - OSC: 14.31818 - ISA8: 1, ISA16: 4, ISA16/VL: 3 -// BIOS-String: 08/30/95-SIS-85C471-2C4I9A12-02 -ROM_START( abah4 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ah4t_an4r2_02.bin", 0x10000, 0x10000, CRC(b45dc3b7) SHA1(94206ac9ed50fc37d954cc3cd1fb062fd75ea984)) -ROM_END - -// Aopen VI15G - Chipset: SiS 85C471, 85C407 - CPU: Socket 3 - RAM: 4xSocket72, Cache: 4x32pin, 4x28pin, TAG - BIOS: 28pin -// Keyboard-BIOS: AMIKEY-2 - ISA16: 4, ISA16/VL: 3 -ROM_START( aovi15g ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "072594", "07/25/94") - ROMX_LOAD( "amiwinch.bin", 0x10000, 0x10000, CRC(9ee72bef) SHA1(25f08714a384d68777d1570cf28a4db8b390257e), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "r23", "R23") - ROMX_LOAD( "vi15gr23.rom", 0x10000, 0x10000, CRC(b704f571) SHA1(485795b8756069723dac865919dc3915a3162c12), ROM_BIOS(1)) -ROM_END - -// ASUS VL/I-486SV2G (GX4) (4xSIMM72, Cache: 128/256/512/1024KB, 7 ISA, 2 VLB) -// SiS 85C471 + 85C407; AMIKEY-2 -ROM_START( a486sv2g ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 11/17/94-SIS-85C471-I486SV2G-00 / #401A0-0304 - ROM_SYSTEM_BIOS(0, "v304", "ASUS VL/I-486SV2G (GX4) V3.04") - ROMX_LOAD( "sv2g0304.bin", 0x10000, 0x10000, CRC(cceabe6f) SHA1(45d0e25603045255d1ccaf5cbddd1a9146f61529), ROM_BIOS(0)) - // 1: BIOS-String: 01/11/95-SIS-85C471-I486SV2G-00 / #401A0-0305-1 - ROM_SYSTEM_BIOS(1, "v305", "ASUS VL/I-486SV2G (GX4) V3.05") - ROMX_LOAD( "0305.001", 0x10000, 0x10000, CRC(9f2f9b75) SHA1(789807d82e39d69f948f7897f99b2fe362330dd1), ROM_BIOS(1)) - // 2: BIOS-String: 03/28/95-SIS-85C471-I486SV2G-00 / #401A0-0306 - complains about BIOS ROM checksum error - ROM_SYSTEM_BIOS(2, "v306", "ASUS VL/I-486SV2G (GX4) V3.06") - ROMX_LOAD( "asus_0306.bio", 0x10000, 0x10000, BAD_DUMP CRC(c87b7b55) SHA1(651938bcfdf6813a1e66c0e1b4812efe91740c91), ROM_BIOS(2)) - // 3: BIOS-String: 08/22/95-SIS-85C471-I486SV2G-00 / #401A0-0401 - ROM_SYSTEM_BIOS(3, "v401", "ASUS VL/I-486SV2G (GX4) V4.01") - ROMX_LOAD( "sv2g0401.bin", 0x10000, 0x10000, CRC(f544f65a) SHA1(9a5e39cfbd545a0026f959b42dbc742246205b3c), ROM_BIOS(3)) - // 4: BIOS-String: 11/03/95-SIS-85C471-I486SV2G-00 / #401A0-0402-1 - ROM_SYSTEM_BIOS(4, "v402", "ASUS VL/I-486SV2G (GX4) V4.02") - ROMX_LOAD( "sv2g0402.bin", 0x10000, 0x10000, CRC(db8fe666) SHA1(e499da86261bc6b312a6bc3d94b9465e17c5a449), ROM_BIOS(4)) - // 5: BIOS-String: 11/19/97-SIS-85C471-I486SV2GC-00 / #401A0-0402-1 - ROM_SYSTEM_BIOS(5, "v402b", "ASUS VL/I-486SV2G (GX4) V4.02 beta") - ROMX_LOAD( "0402.001.bin", 0x10000, 0x10000, CRC(4705a480) SHA1(334c3d57cb6cb157798cd189207288c731a4dd7b), ROM_BIOS(5)) -ROM_END - -// Chaintech 486SLE M106 4SLE-Z1 - Chipset: SiS 85C407 85C471 - CPU: i486DX2-66 - BIOS: Award v4.50G - Keyboard-BIOS: Lance LT48C41 -// BIOS-String: 11/09/94-SIS-85C471E-2C4I9C31-00 / 11/24/94 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.31818 -ROM_START( ch4slez1 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-chaintech_486_sle.bin", 0x10000, 0x10000, CRC(8292bdb7) SHA1(461d582ea9fee4113d3a8ac050f76c7057ead7c7)) -ROM_END - -// Gemlight GMB-486SG rev 2.2 - Chipset: SiS 85C471 85C407 - BIOS/Version: Award - Keyboard BIOS: JETkey V5.0G -// CPU: 80486DX2-66 - RAM: 4xSIMM72, Cache: 5x 28pin DIP (TI256 SA 20TP fittet), 4x32pin DIP (W24257AK-15 fitted) - ISA8: 1, ISA16: 2, ISA16/VLB: 3 -ROM_START( gmb486sg ) // BIOS-String: 01/10/95-SIS-85C471B/E/G-2C4I9G30-00 - ROM_REGION32_LE(0x20000, "bios", 0) // screen remains blank - ROM_LOAD( "gmb486sg.bin", 0x10000, 0x10000, CRC(1f199b35) SHA1(0c4b19762426a30f7121c5c17f1b25a54a5df1f0)) -ROM_END - -// Gigabyte GA-486VF REV.6 - Chipset: SiS 85C407 85C471 - CPU: Cyrix Cx486 DX 40 - BIOS: Award L4162439, 28pin - Keyboard-BIOS: Lance LT38C41 -// BIOS-String: 04/27/94-SIS-85C471-2C4I8G01-00 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.318MHz -ROM_START( ga486vf ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ga-486svf.bin", 0x10000, 0x10000, CRC(e9fb3153) SHA1(b8e307658f95c3e910728ac9316ad83e7afdb551)) -ROM_END - -// Gigabyte GA-486VS - CPU: 486 - Chipset: SiS 85C471, 85C407 - Keyboard-BIOS: Lance LT38C41 - ISA16: 3, ISA16/VL: 3 -// BIOS-String: 11/21/94-SIS-85C471B/E/G/2C4I9G01-00 / Nov 21, 1994 Rev.A -ROM_START( ga486vs ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "vs1121.rom", 0x10000, 0x10000, CRC(0afadecf) SHA1(66c0655b5c4905438603097998a98407bfa376e6)) -ROM_END - -// MSI MS-4132 G VER:1 - Chipset: SiS 85C471, 85C407, BIOS: AMI 486DX ISA BIOS 08/08/93 AB4827039 - CPU: SOCKET 3, solder pads for 8486 -// RAM: 4xSIMM30, 2xSIMM72, Cache: 5xW24257AK-15, 4xIS61C256AH-15N - ISA16: 4, ISA16/VLB: 3 (2 master, 1 slave) - OSC: 14.31818MHz -ROM_START( ms4132 ) // BIOS String: 40-0100-001169-00101111-080893-SIS471B / A75A 033194 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ms4132g.bin", 0x10000, 0x10000, CRC(23385e9d) SHA1(3637febf6e037aec9328d99877550ee9dee4c78c)) -ROM_END - -// MSI MS:4138 VER:1.3 - Chipset: SiS 85C471, 85C407 - CPU: Socket 3 - BIOS: EPROM/AMI 486DX ISA BIOS AC0250679 -// Keyboard-BIOS: Winbond W83C42 - BIOS-String: - ISA16: 4, ISA16/VL: 3 -ROM_START( ms4138 ) - ROM_REGION32_LE( 0x20000, "bios", 0) - // 0: no display - ROM_SYSTEM_BIOS( 0, "a75n", "A75N") - ROMX_LOAD( "a75n.rom", 0x10000, 0x10000, CRC(f9b2130c) SHA1(7798b68275e547e858ba162abc5cf94dd6a85f4c), ROM_BIOS(0)) - // 1: no display - ROM_SYSTEM_BIOS( 1, "msi4138", "MSI MS-4138") - ROMX_LOAD( "ms-4138.bin", 0x10000, 0x10000, CRC(5461c523) SHA1(adb9fe0afa860897d575403a810ff44c85b9f93c), ROM_BIOS(1)) - // 2: BIOS-String: 08/14/95-SIS-85C471B/E/G-2C3I9W40-00 / W753BETA 26JAN96 - ROM_SYSTEM_BIOS( 2, "w753beta", "W753BETA") - ROMX_LOAD( "w753beta.bin", 0x10000, 0x10000, CRC(4aeeba0b) SHA1(9d088c940599110ce3acea84bb881a61d42b6dcf), ROM_BIOS(2)) -ROM_END - -// DTK PKM-0038S E-2A aka Gemlight GMB-486SG - Chipset: SIS 85C471, 85C407 - BIOS/Version: 01/10/95 Award (DTK PKM0038S.P02.03.02), 28pin - Keyboard-BIOS: JETkey V5.0 -// CPU: Socket 3 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.318 -ROM_START( pkm0038s ) - ROM_REGION32_LE( 0x20000, "bios", 0) - // 0: BIOS-String: 01/10/95-SIS-85C471B/E/G-2C4I9G30-00 / (2C4I9G30) DTKPKM0038S.P2.03.02 - ROM_SYSTEM_BIOS(0, "p20302", "P2.03.02") - ROMX_LOAD( "pkm0038s.bin", 0x10000, 0x10000, BAD_DUMP CRC(f6e7dd88) SHA1(5a2986ff0e6352ade8d5b0abaa86e436dddcf226), ROM_BIOS(0)) // BIOS ROM checksum error - // 1: BIOS-String: 07/11/94-SIS-85C471E-2C4I9G30-00 / (2C4I9G30) DTKPKM0038S.P02.02.0 - ROM_SYSTEM_BIOS(1, "p2020", "P2.02.0") - ROMX_LOAD( "4siw005.bin", 0x10000, 0x10000, CRC(0b8794d3) SHA1(153b38f6815a8a3d6723eb17df7ffc37054b3194), ROM_BIOS(1)) -ROM_END - -// EFA 4DMS HL3G-L4-VI - Chipset: SIS-85C471B/E/G / SIS471E/G - CPU: Socket 3 - RAM: 2xSIMM72, Cache: 8x32pin+TAG - ISA16: 5, ISA16/VL: 3 -// BIOS: Award - BIOS-String: 12/07/95-SIS-85C471B/E/G-2C4I9E30-00 / 4DMS-HL3GC Award BIOS REV 1.05 01/12/'96 -ROM_START( 4dmshl3g ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3g105.bin", 0x00000, 0x20000, CRC(60e4841f) SHA1(60ad11e4e4a60eef858d837470a9014706e7576a)) -ROM_END - -// Soyo 025K2 - Chipset: SiS 85C471, 85C407 - BIOS: Award BIOS ISA 486 S/N 240383 - Rev G2 - 09/26/94 - Keyboard BIOS: JETkey V5.0 -// CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 8xtm11256-20, 1xAster AE88128AK-15 - ISA16: 4, ISA16/VLB: 3 (one marked MASTER) -ROM_START( so025k2 ) // BIOS-String: 09/26/94-SIS-85C471B/E/G-2C4I9S23-00 / REV .G2. - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "sy025k2.bin", 0x10000, 0x10000, CRC(a75fdf9a) SHA1(ce7a595ec3bb33acac76a72f704a58e08d54847a)) -ROM_END - -// Zida 4DVS - Chipset: SiS 85C471, 85C407 - CPU: Socket 3, RAM: 4xSIMM72, Cache: 4x28pin, 4x32pin, TAG -// ISA8: 1, ISA16: 3, ISA16/VL: 3 - Keyboard-BIOS: AMIKEY-2 -// BIOS-String: -ROM_START( zi4dvs ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: 02/09/95-SIS-85C471B/E/G-2C4I9000-00 / 12/10/95 SIS 85C471G - ROM_SYSTEM_BIOS(0, "4dvs20", "4DVS20") - ROMX_LOAD( "4dvs20.awa", 0x10000, 0x10000, CRC(831d33cb) SHA1(e5c3f01a9c93a7cf9dbcdc750e87952a5b6a5cf4), ROM_BIOS(0)) - // 1: blank screen - ROM_SYSTEM_BIOS(1, "072594", "AMI 07/25/94") - ROMX_LOAD( "4dvs-471.amw", 0x10000, 0x10000, CRC(da749314) SHA1(686321ffa59cd2259f4fe65a28b86c88cf739393), ROM_BIOS(1)) - // 2: blank screen - ROM_SYSTEM_BIOS(2, "121593", "AMI 12/15/93") - ROMX_LOAD( "486-ab8068594.bin", 0x10000, 0x10000, CRC(92eee700) SHA1(bd34360cf9a9849e0805cdb575cd7a0e007dd2f5), ROM_BIOS(2)) -ROM_END - -ROM_START( sis85c471 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: Chipset: SiS 85C407, another chip with the Energy Star/Green PC label (85C441) - CPU: 486 - BIOS: Award BIOS ISA 486 036875 - Keyboard-BIOS: Lance LT38C41 - // BIOS-String: 04/28/94-SIS-85C471-2C4I8S21-00 / REV. B - ISA16: 4, ISA16/VL: 3 (2 master) - ROM_SYSTEM_BIOS(0, "revb", "REV. B") - ROMX_LOAD("486-sis_green.bin", 0x10000, 0x10000, CRC(9d3b5022) SHA1(f11b27bb24deb2466226486cf8ba66ddbeff87d6), ROM_BIOS(0)) - // 1: Chipset: SiS 85C407 85C471 - CPU: Cyrix Cx486DX2-66 - BIOS: Award E0042537 - Keyboard-BIOS: Lance LT38C41 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - // BIOS-String: 02/07/94-SIS-85C371-2C4I8C30-00 / 02/17/94 - ROM_SYSTEM_BIOS(1, "486sl", "486SL") - ROMX_LOAD("486-sis_486sl.bin", 0x10000, 0x10000, CRC(7261263e) SHA1(d5c4ee484941bbb8ca756c5f6e53382748bbcfd6), ROM_BIOS(1)) - // 2: REV:1.2 - Chipset: SiS 85C471 P85C407 - CPU: Socket 3 - BIOS: AMI 486DX ISA BIOS AC03601316 (28pin) - Keyboard-BIOS: JETkey V5.0G - RAM: SIMM72x4, Cache: 8 sockets+1 - // ISA8: 1, ISA16: 4, ISA16/VL: 3 - ROM_SYSTEM_BIOS(2, "rev12", "REV.1.2") // no display - ROMX_LOAD("486-sis_ac0360136.bin", 0x10000, 0x10000, CRC(940e3643) SHA1(f931f5c2b39ebb6c509033984ab050ffa1ff4334), ROM_BIOS(2)) -ROM_END - - -// ***** 486 motherboards using the UMC UM8498F, UM8496F chipset - -// Aquarius MD-4DUVC VER:2.1 / Aquarius MD-4DUV VER:2.1 -ROM_START( md4duvc ) // "Memory test fail" - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: CPU: Socket 3/Overdrive - Chipset: UMC UM8496F, UM8498F - RAM: 2xSIMM72, 4xSIMM30, Cache: 9xW2457AX-15, sockets are 32pin - // ISA16: 4, ISA16/VL: 3 - BIOS: 28/32pin - ROM_SYSTEM_BIOS(0, "md4duvc", "MD-4DUVC") // BIOS-String: 01/12/94--2C4X6H01-00 / Release 01/04/95 - ROMX_LOAD( "md-4duvc.dmg", 0x10000, 0x10000, CRC(40d208bb) SHA1(c879599d2635c093fce420d1e7081631d27c621a), ROM_BIOS(0)) - // 1: Chipset: UMC UM8498F, UM8496F - BIOS/Version: 486SX/DX Award, R3.1, I194220, 1994-1995 - CPU: Socket 3 - // RAM: 4xSIMM72, Cache: 9xW24257AK-15 - ISA16: 4, ISA16/VLB: 3 - ROM_SYSTEM_BIOS(1, "md4duv", "MD-4DUV") // BIOS-String: 11/1794-UMC-498GP-2C4X6A31-00 / MB-4DUV/UVC VER 3.1 - ROMX_LOAD( "atrom.bin", 0x10000, 0x10000, CRC(ecb764f5) SHA1(f34a7671e9efc6a6cd7ff1516c0c8ecbbfcd55e0), ROM_BIOS(1)) -ROM_END - -// BIOSTAR MB-1433UIV - Chipset: BIOTEQ 83C3498, 83C3496 - CPU: Socket 3 - RAM: 3xSIMM30, 4xSIMM72, Cache: 4x32pin, 4x28pin + TAG -// ISA16: 4, ISA16/VL: 3 - BIOS: 28pin -ROM_START( mb1433uiv ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS(0, "um8496fw", "UM8496FW") - ROMX_LOAD( "um8496fw.ami", 0x10000, 0x10000, CRC(4a6dcc36) SHA1(f159f67eb662272244cd1781814ebcb5204a2625), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "w4", "W4") - ROMX_LOAD( "um498-w4.amw", 0x10000, 0x10000, CRC(12fe6697) SHA1(2506dea874728916dc37f7dad8e8caf214a28525), ROM_BIOS(1)) -ROM_END - -// PC-Chips M912 - Chipset: UM8498F, UM8496F - CPU: 486 - BIOS: AMI - ISA16: 4, ISA16/VL: 3 -ROM_START( pccm912 ) // no display - ROM_REGION32_LE( 0x20000, "bios", 0) - // 0: - ROM_SYSTEM_BIOS( 0, "072594", "07/25/94") - ROMX_LOAD( "m912.bin", 0x10000, 0x10000, CRC(7784aaf5) SHA1(f54935c5da12160251104d0273040fea22ccbc70), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS( 1, "120295", "12/02/95") - ROMX_LOAD( "m912_12-02-1995x.bin", 0x10000, 0x10000, CRC(28a4a140) SHA1(a58989ab5ad5d040ad4f25888c5b7d77f31a4d82), ROM_BIOS(1)) -ROM_END - -// Pine Technology PT-430 - Chipset: UMC UM8498F UM8496F - BIOS: AMI 486DX ISA BIOS AB8906726 28pin - Keyboard-BIOS: silkscreen 8742, but socket empty -// BIOS-String: - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.31818MHz -ROM_START( pt430 ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pt430.bin", 0x10000, 0x10000, CRC(d455c949) SHA1(c57c82ed015528f3d223f59c94ed6b8a9c323c39)) -ROM_END - -// PowerTech MB457 aka Pine PT-2068.1 - Chipset: UMC UM8498F & UMC UM8496F - CPU: Intel 80486DX4-100, solder pads for UMC U5 Green CPU -// RAM: 4xSIMM30, 1xSIMM72 - ISA8: 1, ISA16: 4 - BIOS/Version: Award 486DX J314549 -ROM_START( ptmb457 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 10/19/94-UMC-498GP-2C4X6S21-00 / REV A - ROM_SYSTEM_BIOS(0, "101994", "10/19/94") - ROMX_LOAD( "umc-mb457-1.bin", 0x10000, 0x10000, CRC(71f66fec) SHA1(c798d68eb851fc93cc8a3dd67009b47388488e51), ROM_BIOS(0)) - // 1: BIOS-String: 02/07/95-UMC-498GP-2C4X6000-00 / PT-2068.1 - ROM_SYSTEM_BIOS( 1, "020795", "02/07/95") - ROMX_LOAD( "umc-mb457-2.bin", 0x10000, 0x10000, CRC(2654aefd) SHA1(b888f4f891108a5ef268688840ff20be3a8e6aa5), ROM_BIOS(1)) -ROM_END - -// Soyo 025R2 - Chipset: UM8498F, UM8486F - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 4x28pin, 4x32pin, TAG, used: 4xUM61512AK-15, AE88128AK-15 -// BIOS: 28pin - ISA16: 4, ISA16/VL: 3 -// BIOS-String: 08/28/UMC-498GP-2C4X6S21-00 / REV B2 -ROM_START( so025r2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD("25r2-b2.bin", 0x10000, 0x10000, CRC(3b73360c) SHA1(eaaf47236154a9cc81ffda4c11086960aed0dadf)) -ROM_END - -// ID: ADI F4DXL-UC4 - Chipset: UM8498F, one unreadable - BIOS: AMI 486DX BIOS AB345213 - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72 -// Cache: 4x32pin DIP, 5x28pin DIP (used: 9xCL63C256N-20) - OSC: FM14318 - ISA16: 4, ISA16/VLB: 3 -ROM_START( f4dxluc4 ) // BIOS-String: 40-0E0-008060-00101111-12159-UM498-0 / ADI/UC4/V 1.0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486_ab345213.bin", 0x10000, 0x10000, CRC(e5b85a92) SHA1(aade1fb1463b07a616c2594293bf0215c9652511)) -ROM_END - -ROM_START( um8498f ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_DEFAULT_BIOS("498gp") - // 0: BIOS-String: 40-P101-001437-00101111-072594-GREEN-H - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 9xUM61256AK-15 - // BIOS: AMI AB9300757 - ROM_SYSTEM_BIOS(0, "v14", "V1.4") // no display - ROMX_LOAD( "4umm001.bin", 0x10000, 0x10000, CRC(a5b768b4) SHA1(904ce2814d6542b65acec0c84532946172f2296d), ROM_BIOS(0)) - // 1: - ROM_SYSTEM_BIOS(1, "um849801", "UM8498 #1") // no display - ROMX_LOAD( "um8498.ami", 0x10000, 0x10000, CRC(51f71bc7) SHA1(0986d60081d2c578a66789c0c53fe1d5919c553f),ROM_BIOS(1)) - // 2: Chipset: UM8498F + UM8496F - BIOS label: Award BIOS ISA 486 485427 - BIOS version: Award Modular BIOS v4.50G - CPU: UMC U55X 486-33F, solder pads for 80486socket - // RAM: 4xSIMM30, 2xSIMM72 - ISA8: 1, ISA16: 5 - // BIOS-String: 12/08/94-UMC-498GP-2C4X6S21-00 / REV A1 - ROM_SYSTEM_BIOS(2, "498gp", "498GP") - ROMX_LOAD( "award_bios_isa_486.bin", 0x10000, 0x10000, CRC(ce3ccaa4) SHA1(3fdc9282d9934e18e45b46b50644022fc0387f33), ROM_BIOS(2)) -ROM_END - - -// ***** 486 motherboards using the UM82C482A UM82C481A chipset - -// Elitegroup UM486/UM486sx Rev.1.4. - Chipset: UMC UM82C482A UM82C481A UM82C206F - ISA8: 2, ISA16: 6 - CPU: i486DX-50, FPU socket provided -// RAM: 8xSIMM30 in 2 banks, Cache: 8xW24256AK-25+4xCY7C164-20PC - OSC: 33.000MHz, 14.31818MHz - BIOS: AMI 486 BIOS ZZ364969 - Keyboard-BIOS: AMI KB-BIOS-VER-F -// BIOS-String: 40-0500-D01131-00101111-070791-UMCWB-0 / UM486/486SX V1.3 09-24-91 -ROM_START( um486 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-um486-um486sx.bin", 0x10000, 0x10000, CRC(0f20d193) SHA1(e9c7365b0343a815e5abc9726d128353becc18d3)) -ROM_END - -// Elitegroup UM486V-AIO - Chipset: UMC UM82C482AF, UM82C481BF, UM82C863F, UM82C865F, UM82C206F - ISA16: 4, ISA16/VL: 2 -// BIOS: AMI - CPU: 486 - On board: Floppy, 1xIDE, parallel, 2x serial -// BIOS-String: 40-0100-001131-00101111-111192-UMC480-0 / UM100 V2.1 04-26-93 -ROM_START( um486v ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "um486v.bin", 0x10000, 0x10000, CRC(eb52d3fd) SHA1(84f63904cfceca9171b5c469545068e19ae280a8)) -ROM_END - - -// ***** 486 motherboards using the UM8886BF, UM8881F chipset - -// A-Trend ATC-1415 - Chipset: UMC UM8881F/UM8886BF, OEC12C885, VT8235N - ISA8: 1, ISA16: 3, PCI: 3 -// CPU: Socket 3 - BIOS: Award C 0247007 UMC8881/6 BIS VER : 3.20 95-12-08 / M271001 (128k) -// BIOS-String: 11/24/95-UMC-881/886A-2A4X5A2HC-00 -ROM_START( atc1415 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4umw002.bin", 0x00000, 0x20000, CRC(eacaa3de) SHA1(88c828def72aeae0798ba5a4a5c31cd465545c0b)) -ROM_END - -// Biostar MB8433UUD-A (4 SIMM, 2 IDE, 3 PCI, 4 ISA) -// UMC UM8881F, UM8886BF, UM8663AF; DS12887 RTC -ROM_START( mb8433uud ) // BootBlock BIOS - ROM_REGION32_LE(0x20000, "bios", 0) // Intel Flash P28F010 - // 0: BIOS-String: 05/20/96-UMC-881E/886B-2A4X5B08C-00 / UUD960520S EVALUATION ROM - NOT FOR SALE - ROM_SYSTEM_BIOS(0, "520s", "520S") - ROMX_LOAD( "uud0520s.bin", 0x00000, 0x20000, CRC(0e347559) SHA1(060d3040b103dee051c5c2cfe8c53382acdfedad), ROM_BIOS(0)) - // 1: BIOS-String: 05/20/96-UMC-881E/886B-2A4X5B08C-00 / BIOSTAR MB-8433UUD v2014 - ROM_SYSTEM_BIOS(1, "2014", "2014") - ROMX_LOAD( "uud2014.bin", 0x00000, 0x20000, CRC(315f7519) SHA1(e0174e4982d1861c64d871a7806b793a914f2366), ROM_BIOS(1)) - // 2: BIOS-String: 12/05/95-UMC-881E/886B-2A4X5B08C-00 / UUD951222S - ROM_SYSTEM_BIOS(2, "8881d", "8881D") - ROMX_LOAD( "um8881_d.awa", 0x00000, 0x20000, CRC(a47327b9) SHA1(6b57155cf34e2c597b7621e49ae8354c05cebfde), ROM_BIOS(2)) - // 3: BIOS-String: 11/07/95-UMC-881E/886B-2A4X5B08C-0 / UUD951108A - ROM_SYSTEM_BIOS(3, "08a", "08A") - ROMX_LOAD( "8433uud.awd", 0x00000, 0x20000, CRC(17ca5c2a) SHA1(7cda78f87f35fe8574a1f2d70d548cc2bc2af05b), ROM_BIOS(3)) -ROM_END - -// Gigabyte GA-486AM/S - CPU: Socket 3 - Chipset: UMC UM8886AF, UM8881F, UM88663AF, UM8667 - RAM: 4xSIMM72, Cache: 9x32pin, occupied: 4xUM6152AK-15, 1xUM61M256K-15 -// BIOS: 32pin - OSC: 14.31818 - On board: 2xIDE, Floppy, par, 2xser - ISA16: 4, PCI: 3 -ROM_START( ga486am ) // BootBlock - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4am1107.bin", 0x00000, 0x20000, CRC(e836798d) SHA1(afd72654ed210bb19e37f9df96b9ecb75c84712a)) -ROM_END - -// PC-Chips M915i - CPU: 486 - Chipset: UM8881F, UM8886F - ISA16: 2, ISA16/VL: 2, PCI: 4 - On board: 2xIDE -ROM_START( pccm915i ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: no display - ROM_SYSTEM_BIOS(0, "9151108s", "9151108S") - ROMX_LOAD( "9151108s.rom", 0x00000, 0x20000, CRC(cba5525c) SHA1(9bdb586090f613a7172f6b46ed78e36331bf2135), ROM_BIOS(0)) - // 1: Amptron DX9200 aka PcChips M915i with Fake cache - Chipset: UMC UM8881F + UM8886BF, SECKS82C6818A - EPROM: AMD AM27C010 - // BIOS label: AMI 486DX ISA BIOS 1993 AC9051796 - BIOS Version: AMI 10/10/1995: 11-08-1995 - on board: 2xIDE - // CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9xblack blocks of plastic - OSC: 14.31818 - ISA16: 2, ISA16/VLB: 2, PCI: 4 - ROM_SYSTEM_BIOS(1, "dx9200", "Amptron DX9200") // BIOS String: 41-p400-001437-00101111-101094-486AVIP-H - ROMX_LOAD( "m915_fake_cache.bin", 0x00000, 0x20000, CRC(82a4e810) SHA1(b20a6e128d6298adf8487d190dd182a751dfccf9), ROM_BIOS(1)) -ROM_END - -// PC-Chips M919 - this motherboard showcased the issues that gave PC-Chips its bad name, it was available with fake cache, a proprietary cache socket or with fully operational cache -// Chipset: UMC UM8881F/9714-EYS and UM8886BF/9652-FXS (V3.4B/F), UMC UM8886BF/9618-FXS and UM8881F/9622-EYS (Rev. 1.5) -// http://th2chips.freeservers.com/m919/ this mentions that the BIOS requires a flashable chip -ROM_START( pccm919 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_SYSTEM_BIOS(0, "m919v1", "PC-Chips M919 v1") - ROMX_LOAD( "9190914s.rom", 0x00000, 0x20000, CRC(bb18ff2d) SHA1(530d13df21f2d483ec0dddda44fb4fe7e29ec040), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "m919v2", "PC-Chips M919 v2") - ROMX_LOAD( "9191016s.rom", 0x00000, 0x20000, CRC(2a2125a6) SHA1(753061ae6f80c0ca42d1af91aada657910feae18), ROM_BIOS(1)) -ROM_END - -// Shuttle HOT-433 - Chipset: UM8886BF, UM8881F, UM8669F, ??667 -// CPU: Cyrix 5x86-120GP - ISA16: 4, PCI: 4 - On board: PS2-Mouse, 2xser, Floppy, par, 2xIDE -// Versions 1-3 can use Flash or EPROM, Version 4 only EPROM -ROM_START( hot433 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 07/25/95-UMC-881/886A-2A4X5H21-00 / (433WIE10) UMC880A For486PCI Green_PC - ROM_SYSTEM_BIOS(0, "wie10", "WIE10") - ROMX_LOAD( "433wie10.bin", 0x00000, 0x20000, CRC(90604ef4) SHA1(61e160678d48cb5752c84090ca990e09382ae01d), ROM_BIOS(0)) - // 1: BIOS: 10/10/94 AMI (or 02/02/95 depending on where you look), 486PCI/ISA 057890 in a Winbond W29EE011-15 - no display - ROM_SYSTEM_BIOS(1, "v401", "V4.0 #1") - ROMX_LOAD( "hot433.bin", 0x00000, 0x20000, CRC(1c279c6f) SHA1(4a0e99fafc5719959fb5800a61629c3f36778240), ROM_BIOS(1)) - // 2: Original AMI BIOS for rev 1-3 w/mouse support - ROM_SYSTEM_BIOS(2, "aip16", "AIP16") - ROMX_LOAD( "433aip16.rom", 0x00000, 0x20000, CRC(a9503fc6) SHA1(0ebd936f5478477e37528e6e487c567b064248f7), ROM_BIOS(2)) - // 3: AMI BIOS for the EPROM Programmer, not flashable - ROM_SYSTEM_BIOS(3, "aue2a", "AUE2A") - ROMX_LOAD( "433aue2a.rom", 0x00000, 0x20000, CRC(35f5633f) SHA1(01148eba919985165ab9cd12b5e6f509d6d1385f), ROM_BIOS(3)) - // 4: AMI BIOS for the EPROM Programmer, not flashable - ROM_SYSTEM_BIOS(4, "aue33", "AUE33") - ROMX_LOAD( "433aue33.rom", 0x00000, 0x20000, CRC(803c4b1e) SHA1(483c799c08eed0d446384d67e9d23341499806b1), ROM_BIOS(4)) - // 5: AMI BIOS for rev 1-3. Some reports say for rev4 - ROM_SYSTEM_BIOS(5, "aus2a", "AUS2A") - ROMX_LOAD( "433aus2a.rom", 0x00000, 0x20000, CRC(766d1f3f) SHA1(1e59140bc91ab98fcadcf7bb77e222932696419f), ROM_BIOS(5)) - // 6: Latest AMI BIOS for rev 1-3 - ROM_SYSTEM_BIOS(6, "aus2c", "AUS2C") - ROMX_LOAD( "433aus2c.rom", 0x00000, 0x20000, CRC(bdc65766) SHA1(e87cc4aed14ae7fcdf6423063b0ababe65b41044), ROM_BIOS(6)) - // 7: AMI Bios for rev 1-3 w/mouse support - ROM_SYSTEM_BIOS(7, "aus26", "AUS26") - ROMX_LOAD( "433aus36.rom", 0x00000, 0x20000, CRC(8f864716) SHA1(0bf4b8114cbb406646d89eed7833556611e1fbe6), ROM_BIOS(7)) - // 8: Latest AMI BIOS for rev4 of the Shuttle HOT-433 motherboard. - ROM_SYSTEM_BIOS(8, "aus33", "AUS33") - ROMX_LOAD( "433aus33.rom", 0x00000, 0x20000, CRC(278c9cc2) SHA1(ecd348106d5118eb1e1a8c6bd25c1a4bf322f3e6), ROM_BIOS(8)) - // 9: boots to BootBlock BIOS - ROM_SYSTEM_BIOS(9, "2a4x5h21", "2A4X5H21") - ROMX_LOAD( "2a4x5h21.bin", 0x00000, 0x20000, CRC(27c47b90) SHA1(09d17bc5edcd02a0ff4a3a7e9f1072202880251a), ROM_BIOS(9)) - // 10: no display - ROM_SYSTEM_BIOS(10, "shuttle", "Shuttle HOT-433") - ROMX_LOAD("bios.bin", 0x00000, 0x20000, CRC(a5ffafac) SHA1(0ec71a82c80a96a5724ba375934c709db468dabc), ROM_BIOS(10)) -ROM_END - -// PROTECH PM486PU-S7 - Chipset: UMC 881/886A (UM8881F/UM8886AF), SMC FDC, Winbond -// BIOS Chip: TI/TMS 27C010A (128K) - CPU: i486DX-33 - On board: 2xIDE, FDC, 2xser, par - RAM: 2xSIMM72, Cache: 4xGLT721208-15 +1 TAG - ISA16: 4, PCI: 3 -// BIOS-String: 10/11/95-UMC-881/886A-2A4X5P62-00 / (PM486PU-S7) 486 WITH I/O PCI LOCAL BUS SYSTEM ... -ROM_START( pm486pu ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pm486pu-s7-2a4x5p62-00.bin", 0x00000, 0x20000, CRC(143bdc07) SHA1(e2cf2ac61fd3e4797e5d737dfec4a2b214469190)) -ROM_END - -// Pine PT-432b - Chipset: UMC UM8886BF, UM8881F, UM8663F, UM8287, UM8667 - CPU: Am486DX4-100 - RAM: 4xSIMM72, Cache: 8+1 sockets -// ISA16: 4, PCI: 3 - BIOS: AMI 486PCI ISA BIOS AA0841149 (32pin) - On board: 2xser, par, 2xIDE, Floppy -ROM_START( pt432b ) // no display - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "sr_m401-a.bin", 0x00000, 0x20000, CRC(ff8cd351) SHA1(a9c6a54f38b1b548fba4d7d42643f117441b09a6)) -ROM_END - -// TD-4IP-UMC-AIO - CPU: Socket 3 - Chipset: UMC UM8881F, UM8886BF, UM8663BF, UM8667, bq3285P - RAM: 2xSIMM72, Cache: W24257AK-15, W24512AK-20 (4) -// BIOS: Award 020175447 / 29EE010 (128k) - BIOS-String: 12/19/95-UMC-881E/886B-2A4X5CF9C-00 - ISA16: 4, PCI: 3 -ROM_START( td4ipaio ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "4ummw001.bin", 0x00000, 0x20000, CRC(4e716d77) SHA1(1b7af88c4da5ca388acbc0cb66bd26a0ae8f4931)) -ROM_END - -ROM_START( um8886 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: no display - UMC PCI 95C-0123 - Chipset: UMC UM8886AF, UM8881F, 4xUM8002, UM8663AF, UM8667 - CPU: Socket 3 - On board: 2xser, par, Floppy, 2xIDE - 4xISA16, 4xPCI - // BIOS: AMI 486 PCI ISA in M27C1001 EPROM - ROM_SYSTEM_BIOS( 0, "pci95c", "PCI 95C-0123") - ROMX_LOAD( "486-umc_pci_95c-0123.bin", 0x00000, 0x20000, CRC(9db58de4) SHA1(5441f3181fb26911d796c4bf019136aa8e4c060b), ROM_BIOS(0)) - // 1: no display - V1.1A - Chipset: UMC UM8886AF UM8881F, UM8667, UM8663AF - CPU: i486DX2-66 - On board: 2xser, 2xIDE, Floppy, par - BIOS: AMI 486DX ISA BIOS AC6288199 - ISA16: 4, PCI: 3 - ROM_SYSTEM_BIOS( 1, "pcimini", "PCI mini") - ROMX_LOAD( "486-umc-pci mini.bin", 0x00000, 0x20000, CRC(4ee12b46) SHA1(9397f67b21f11cfda57abd5ab28f93055909ee97), ROM_BIOS(1)) -ROM_END - -// Elitegroup UM8810 PAIO - Chipset: UMC UM8881F, UM8886F, UM82C865FSMC FDC37C665GT, PCI0640B - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 32pin sockets, 9xUM61256FK-15 occupied -// BIOS: 32pin - Keyboard-BIOS: AMIKEY-2 - ISA16: 4, PCI: 3 - On board: 2xIDE, Floppy, par, 2xser -ROM_START( um8810paio ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 09/27/94-UMC-881/886-2A4X5E11-00 / UM8810P-AIO V1.0 09-27-94' - ROM_SYSTEM_BIOS(0, "awd", "AWD") - ROMX_LOAD( "awd_09-27-94.bin", 0x00000, 0x20000, CRC(25c671ba) SHA1(6b7641fb0f619e233d956e7cdb4e246f3c525673), ROM_BIOS(0)) - // 1: BootBlock BIOS - ROM_SYSTEM_BIOS(1, "aw123", "AW_1-23") - ROMX_LOAD( "aw_1-23.bin", 0x00000, 0x20000, CRC(420c3a43) SHA1(e0744b0bf171d279650d1f3a731e231562fe60ae), ROM_BIOS(1)) - // 2: blank screen, possibly for update only - ROM_SYSTEM_BIOS(2, "v21", "V21") - ROMX_LOAD( "881_v21_01-27-95.rom", 0x00000, 0x20000, CRC(2443759b) SHA1(02a9e51b51c2d2d21d5ae821b6d8aa97f62c3327), ROM_BIOS(2)) - // 3: blank screen - ROM_SYSTEM_BIOS(3, "21e", "21E") - ROMX_LOAD( "881avio_01-08-96.21e", 0x00000, 0x20000, CRC(446cd0c3) SHA1(32a61c0578326d17840db37855644543b6406535), ROM_BIOS(3)) - // 4: blank screen - ROM_SYSTEM_BIOS(4, "31e", "31E") - ROMX_LOAD( "881avio_01-08-96.31e", 0x00000, 0x20000, CRC(b5ec7dca) SHA1(390f79f50de986c3874464202251398baa87f4b5), ROM_BIOS(4)) - // 5: blank screen - ROM_SYSTEM_BIOS(5, "32h", "32H") - ROMX_LOAD( "8810aio_06-27-96.32h", 0x00000, 0x20000, CRC(b7e9d590) SHA1(bfdfa64bc87f2eb0d362e87755dce70584675427), ROM_BIOS(5)) - // 6: blank screen, possibly for update only - ROM_SYSTEM_BIOS(6, "32j", "32J") - ROMX_LOAD( "8810aio_12-11-96.32j", 0x00000, 0x20000, CRC(c6baec8b) SHA1(79bccaefb75e2df071d6edd191eea74aa82dc620), ROM_BIOS(6)) - // 7: blank screen - ROM_SYSTEM_BIOS(7, "32f", "32F") - ROMX_LOAD( "881032f.rom", 0x00000, 0x20000, CRC(5c337ae6) SHA1(29bc48a3d5165afa79612baf6deb9c04c7e55b32), ROM_BIOS(7)) - // 8: blank screen - ROM_SYSTEM_BIOS(8, "v145", "V145") - ROMX_LOAD( "8810aio_v145_09-21-94.bin", 0x00000, 0x20000, CRC(a253c017) SHA1(8273defe95a13ea0a260d4a410d601f82a947ad9), ROM_BIOS(8)) - // 9: 06/23/95-UMC-881/886-2A4X5E11-00 / Version VBS1.10H UM8810 ECS (Highscreen boot logo) - ROM_SYSTEM_BIOS(9, "v110h", "V1.10H") - ROMX_LOAD( "vbs1.10h.bin", 0x00000, 0x20000, CRC(1bf29727) SHA1(77ccd34110ec0387cdcfa260332b403d0c197d17), ROM_BIOS(9)) -ROM_END - - -// ***** 486 motherboards using the UMC UM82C491F UM82C493F or clones (BIOTEQ) chipset - -// Chicony CH-491E Rev. 1.4 - Chipset: UMC UM82C491F UM82C493F - BIOS: 04/04/93 AMI AB1987679 28pin - Keyboard-BIOS: AMIKEY -// BIOS-String: 40-0102-001116-00101111-040493-UMC491F-0 / UMC 491 for 80486 AUTO - ISA16: 4, ISA16/VL: 3 -ROM_START( ch491e ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "ch491e.bin", 0x10000, 0x10000, CRC(2d24ff24) SHA1(72f35c19e907c6d0a03a49bd362c4f57cc89da1c)) -ROM_END - -// Aquarius System (ASI) MB-4D33/50NR VER:01 - Chipset: UMC UM82C491F UM82C493F - CPU: AM486DX2-66 - BIOS: Award 1060176, 28pin - Keyboard-BIOS: JETkey V5.0 -// BIOS-String: 03/09/94-UMC-491-2C4X2A30-00 / MB-4D33/50NR-02 - ISA8: 1, ISA16: 3, ISA16/VL: 3 -ROM_START( mb4d33 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-mb-4d33.bin", 0x10000, 0x10000, CRC(f1299131) SHA1(d8e2749e180135e23483e36a0a05479e64f23d8c)) -ROM_END - - // BIOS-String: 40-0100-001281-00101111-080893-UMC491F-0 / HL3SC/SM AMI BIOS VER 4.9 01/09/'95 -ROM_START( 4dmuhl3s ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "3s-49-1.rom", 0x10000, 0x10000, CRC(78a8ea39) SHA1(35e2d0103da28b93a8c1addb1f083bd6e4239d2a)) -ROM_END - -// Elitegroup ECS UC4915 A AIO - Chipset: UMC UM82C491F UM82C493F UM82C865F SMC FDC37C662QF P, PROCHIP PR 4030 - CPU: Socket 3 -// BIOS: AMI 486DX ISA BIOS AB2683223 28pin in 32pin socket - Keyboard-BIOS: Intel/AMI MEGA-KB-H-WP -// BIOS-String: 40-0401-001131-00101111-040493-UMC491C-0 / VOBIS UC4915-A V1.1 11-05-93' - ISA16: 4, ISA16/VL: 2 - OSC: 14.31818 - On board: IDE, Floppy, 2xser, par, Game -ROM_START( ec4915aio ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-ecs-uc4915-a-aio.bin", 0x10000, 0x10000, CRC(5b3429a3) SHA1(a1b3ddb6a0939d20ae66e034914ea94648ca7149)) -ROM_END - -// Elitegroup UC4913 REV:1.1 (Peacock sticker)- Chipset: UMC UM 82491F 82C493F - CPU: 486 - BIOS: AMI 486DX ISA BIOS AA8960448 (28pin) - Keyboard-BIOS: AMI/Intel -// OSC: 14.31818 - RAM: SIMM30x8, Cache: 9 sockets, 4 (UM61256CK-20)+1 (MS6264A-20NC) filled - ISA8: 2, ISA16: 3, ISA16/VL: 3 -// BIOS-String: 40-0401-001131-00101111-040493-UMC491C-0 / Peacock AG UC4913 BIOS Ver. 1.0 01.09.93 -ROM_START( ec4913 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-peacock-uc4913-aa8960338.bin", 0x10000, 0x10000, CRC(58e6753c) SHA1(077c11532572ca0399f76a7ba2d31b8c1ca75d48)) -ROM_END - -// Biostar MB-1433UCV - Chipset: BIOTEQ 82C3491, 82C3493 (check mb133340 for a 386 motherboard using the same chipset) -// CPU: 486DX2-66 - RAM: 8xSIMM30, Cache: 8+1x28pin(AS57C256-20PC) - ISA8: 1, ISA16: 3, ISA16+VL: 3 - BIOS: AMI AB0975913 - Keyboard-BIOS: JETkey V5.0 - RTC: TH6887A 9410 -ROM_START( mb1433ucv ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS-String: 40-0100-001223-00101111-040493-UMC491F-0 / MB-1333/40UCG-A, MB-1333/40UCQ-B / MB-1433-40UDV-A, MB-1433/50UCV-C, MB-6433/50UPC-A for EXT. RTC - ROM_SYSTEM_BIOS(0, "ucvd", "UCV-D") - ROMX_LOAD( "biostar_bios_mb-1433-50ucv-d_pcb_ver_2.bin", 0x10000, 0x10000, CRC(e5ff2d76) SHA1(d2abe00eb2051ec7cb9423cdb8b52e91f7e2d416), ROM_BIOS(0)) - // 1: BIOS-String: 40-0100-001223-00101111-04093-UMC491f-0 / UCV-G - ROM_SYSTEM_BIOS(1, "ucvg", "UCV-G") - ROMX_LOAD( "bioteq.rom", 0x10000, 0x10000, CRC(93321e89) SHA1(450e35787607a4b6aecd3159d6c0599a03cd42b1), ROM_BIOS(1)) -ROM_END - -// Mitac PWA-IH4077C - Chipset: UMC UM82C491F + UM82c493F - CPU: Socket 3, solder pads for PQFP CPU - RAM: 4xSIMM30, Cache: 9xUM61256AK-15 - OSC: 14.31818 -ROM_START( pwaih4077c ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS String: 04/13/94-UMC-491-2C4X2m31-00 - UMC491F 80486 BIOS...1.01.00 (3371-3372) - BIOS label: IH4077CN BIOS R1.01.00 - // BIOS Version: Award 4.50G 04/13/94 - Keyboard BIOS: VIA VT82C42N - ROM_SYSTEM_BIOS(0, "012694", "01/26/94") - ROMX_LOAD( "ih4077c-1.00.00.bin", 0x10000, 0x10000, CRC(e75cca73) SHA1(4f27d16f4f8fce9d3410821ec62780f7df669776), ROM_BIOS(0)) - // 1: BIOS-String: 04/13/94-UMC-491-2C4X2m31-00 - UMC491F 80486 BIOS...1.01.00 (3371-3372) - ROM_SYSTEM_BIOS(1, "041394", "04/13/94") - ROMX_LOAD( "4077c101.bio", 0x10000, 0x10000, CRC(b6a27c48) SHA1(18ee3b2fc4897cbaafc0e0298938ba58a3a7f84c), ROM_BIOS(1)) -ROM_END - - -// ***** motherboards using the Unichip U4800 chipset - -// Gemlight GMB-486UNP v2.1 - Chipset: Unichip U4800-VLX, SIS85C206 - CPU: solder pads for 486FQFP, i486DX2-66 - RAM: 8xSIMM30, Cache: 8xUM61256AK-15 -// BIOS: AMI 486DX ISA BIOS - ISA16: 4, ISA16/VLB: 3 -ROM_START( gmb486unp ) // BIOS String: 40-0405-428036-00101111-080893-U4800-VLX-H / screen remains blank - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "gmb-486unp.bin", 0x10000, 0x10000, CRC(17d770c7) SHA1(8655610ceaf7bd9c17d7c0a550805ae55f128660)) -ROM_END - -// UNICHIP 486 WB 4407 REV 1.0 - Chipset: KS83C206Q UNICHIP U4800-VLX - BIOS: AMI 486 ISA BIOS AA6562949, 28pin - Keyboard-BIOS: AMI 2050778 -// BIOS-String: 40-0200-001107-0010111-111192-U4800VLX-0 / 4407 UNICHIP BIOS VER 1.0 - OSC: 14.31818 - ISA16: 4, ISA16/VL: 3 -ROM_START( uniwb4407 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "unichip_486_wb_4407.bin", 0x10000, 0x10000, CRC(91237686) SHA1(7db14451cc3e00a2273a453152a817bccbdfb10e)) -ROM_END - -ROM_START( uni4800 ) - ROM_REGION32_LE(0x20000, "bios", 0) - // BIOS-String: 40-05TB-006257-00101111-060692-UNI4800-0 - ROM_LOAD( "uni4800.ami", 0x10000, 0x10000, CRC(555c4c34) SHA1(0a907d7a0ec16e9369d77a1ac1afb0e69e3d6c1a)) -ROM_END - - -// ***** 486 motherboards using the VIA VT82C495 VT82C481 chipset - -// FIC 4386-VC-V - CPU: 486 - Chipset: VIA VT82C495 VT82C481 - ISA8: 2, ISA16: 3, ISA16/VL: 2 - OSC: 33.333MHz - BIOS: AMI 486DX ISA BIOS AA6387315 (28pin) - -// BIOS-String: X0-0100-001121-00101111-021993-VIA-0 / Version 1.02 - Keyboard-BIOS: Lance LT38C41 -ROM_START( fic4386vcv ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-4386-vc.bin", 0x10000, 0x10000, CRC(659210c2) SHA1(a730a547f3af215459632160fa670fde7e9c4f9a)) -ROM_END - -// HIGHSCREEN 486 Universal Board C82C33-A VIA4386-VIO - Chipset: VIA VT82C495 VT82C481, Winbond WB3757F - CPU: AM486DX2-66 -// BIOS: Award F0599630 - Keyboard BIOS: AMI 1131 KEYBOARD BIOS PLUS - BIOS-String: Award Modular BIOS v4.20 / Version 1.143K -// On board: IDE, Floppy, 2xser, par, game - OSC: 32.0000MHz - ISA16: 6 -ROM_START( via4386vio ) // probably a FIC board - KEYBOARD ERROR OR NO KEYBOARD PRESENT - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-highscreen.bin", 0x10000, 0x10000, CRC(059b6e51) SHA1(f8ede823e41cfa6f72bd9717ec75419079f9c40b)) -ROM_END - -// FIC 4386-VC-HD - Chipset: VIA VT82C481, VT82C495 - this board can take either 386 or 486 CPUs -// Keyboard-BIOS: Lance LT38C41 - CPU: AMD AMD386DX-40, FPU: IIT 3C87-40 - ISA16: 6 -ROM_START( fic4386vchd ) - ROM_REGION32_LE(0x20000, "bios", 0) - // 0: BIOS: AMI; Version 1.04; 06/06/92 - BIOS-String: X0-0100-001121-00101111-021993-VIA-0 / Version 1.04 - ROM_SYSTEM_BIOS(0, "ami104", "AMI V1.04") - ROMX_LOAD( "3vim001.bin", 0x10000, 0x10000, CRC(668d8cab) SHA1(409b81e33ca07b0a9724dbb6ca395a3a0887aa02), ROM_BIOS(0)) - // 1: BIOS: Award F0111730 v1.15K 03/12/93-VENUS-VIA - BIOS-String: Award Modular BIOS v4.20 / Version 1.15K - ROM_SYSTEM_BIOS(1, "awav115k", "Award V1.15k") // KEYBOARD ERROR OR NO KEYBOARD PRESENT - ROMX_LOAD( "4386-vc-hd v1.15k.bin", 0x10000, 0x10000, CRC(acc5db45) SHA1(cb93322735e96614d3c54fbfcd4291ff1b3ca57c), ROM_BIOS(1)) - // 2: AWARD v4.20 F0166061 (28pin) - Keyboard-BIOS: Lance LT38C41 - CPU: 486 - BIOS-String - ROM_SYSTEM_BIOS(2, "awav110k", "Award V1.10K") // KEYBOARD ERROR OR NO KEYBOARD PRESENT - ROMX_LOAD("486-4386-vc-hd.bin", 0x10000, 0x10000, CRC(a32d30fc) SHA1(815a63e624b3145d9955aa3ce8c4c1e34fb438bb), ROM_BIOS(2)) - // 3: ID: Peacock 4386-VCHD - Chipset: VIA VT82C481, VT82C495 - CPU: AMD Am386DX-40, socket for 486 provided - // RAM: 8xSIMM30, Cache: 10x28pin sockets - BIOS: Award 386DX F0121091 PEA 2_0 - ISA16: 6 - OSC: 80.0000MHz - ROM_SYSTEM_BIOS(3, "pea20", "Pea 2_0") // BIOS-String: Award Modular BIOS V4.20 / 4386 BIOS Ver. 2.0 01.04.93 - KEYBOARD ERROR OR NO KEYBOARD PRESENT - ROMX_LOAD("386-peacock-4386-vchd.bin", 0x10000, 0x10000, CRC(1cd08629) SHA1(9a2b359ade2e93ab1d164e3e4f2cb9e8604cd43d), ROM_BIOS(3)) -ROM_END - -// FIC 486-VC-HD - BIOS Version: AMI 05/05/1991 - Chipset: VIA VT82C495 VT82C481, DS1287/1187 - EPROM Label: 486EB -// Keyboard BIOS: Lance LT38C41 - CPU: Intel 80486DX-33, solder pads for 80486 - RAM: 8xSIMM30, Cache: 10x28pin DIP (4xKM68257BP-25, 1xMCM6206CP fitted) -// OSC: 33.333MHz - ISA16: 6 -ROM_START( fic486vchd ) // BIOS ID String: 40-04C1-ZZ1124-00101111-050591-ET/486H-0 - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "486-vc-hd_doc11670.bin", 0x10000, 0x10000, CRC(607ebe18) SHA1(870080bb49bad42fb4433f9208c17ad1c7ee437d)) -ROM_END - - -// ***** 486 motherboards using the VIA VT82C505 + VT82C496G + VT82C406MV chipset - -// FIC 486-PIO-2 (4 ISA, 4 PCI) -// VIA VT82C505 (ISA/VL to PCI bridge) + VT82C496G (system chipset) + VT82C406MV (keyboard controller, RTC, CMOS), NS311/312 or NS332 I/O -ROM_START( ficpio2 ) - ROM_REGION32_LE(0x40000, "isa", ROMREGION_ERASEFF) - ROM_DEFAULT_BIOS("ficpio2c1") - // 0 - ROM_SYSTEM_BIOS(0, "ficpio2c7", "FIC 486-PIO-2 1.15C701") /* pnp, i/o core: NS 332, doesn't boot, requires cache emulation? */ - ROMX_LOAD( "115c701.awd", 0x020000, 0x20000, CRC(b0dd7975) SHA1(bfde13b0fbd141bc945d37d92faca9f4f59b716d), ROM_BIOS(0)) - // 1 - ROM_SYSTEM_BIOS(1, "ficpio2b7", "FIC 486-PIO-2 1.15B701") /* pnp, i/o core: NS 311/312, doesn't boot, requires cache emulation? */ - ROMX_LOAD( "115b701.awd", 0x020000, 0x20000, CRC(ac24abad) SHA1(01174d84ed32fb1d95cd632d09f773acb8666c83), ROM_BIOS(1)) - // 2: BIOS-String: 04/18/96-VT496G-2A4LF0IC-00 / Version 1.15C101 - ROM_SYSTEM_BIOS(2, "ficpio2c1", "FIC 486-PIO-2 1.15C101") /* non-pnp, i/o core: NS 332, working */ - ROMX_LOAD( "115c101.awd", 0x020000, 0x20000, CRC(5fadde88) SHA1(eff79692c1ecf34b6ea3f02409d14ce1f5c51bf9), ROM_BIOS(2)) - // 3: BIOS-String: 04/18/96-VT496G-2A4LF0IC-00 / Version 1.15B101 - ROM_SYSTEM_BIOS(3, "ficpio2b1", "FIC 486-PIO-2 1.15B101") /* non-pnp, i/o core: NS 311/312, working */ - ROMX_LOAD( "115b101.awd", 0x020000, 0x20000, CRC(ff69617d) SHA1(ecbfc7315dcf6bd3e5b59e3ae9258759f64fe7a0), ROM_BIOS(3)) - // 4: no display - CPU: Socket3 - On board: 2xser, par, 2xIDE, Floppy, par - BIOS: Award F4215801, 32pin - ISA16: 4, PCI: 4 - ROM_SYSTEM_BIOS(4, "ficpio2", "FIC 486-PIO-2 DOC 14580") - ROMX_LOAD( "486-pio2.bin", 0x20000, 0x20000, CRC(4609945d) SHA1(7ad446bc3b27f3f636fb5884e58b055681f081eb), ROM_BIOS(4)) -ROM_END - -// FIC 486-VIP-IO2 (3 ISA, 4 PCI) -// VIA VT82C505 + VT82C496G + VT82C406MV -// Boot block - BIOS-String: 05/28/96-VT496G-2A4L6F0IC-00 / 1.164G701 -ROM_START( ficvipio2 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "1164g701.awd", 0x00000, 0x20000, CRC(7b762683) SHA1(84debce7239c8b1978246688ae538f7c4f519d13)) -ROM_END - - -//************************************************************************** -// 80486 Desktop -//************************************************************************** - -// NEC APC IV aka - available in three different packages: Wide desktop: Year: 1986 / Chipset: CHIPS P82C201, P82A204 and P82A205 -// Portable: white/blue LCD -ROM_START( necapciv ) - ROM_REGION16_LE(0x20000, "bios", 0) - // 0: Phoenix 80286 ROM BIOS Version 1.57 / APC IV / NEC Corporation - // on board: 2xser, par, Floppy - see https://stason.org/TULARC/pc/motherboards/N/NEC-TECHNOLOGIES-INC-286-APC-IV-SERIES-G9YAN.html for settings - ROM_SYSTEM_BIOS(0, "wide157", "Wide desktop V1.57") - ROMX_LOAD( "yan7m06.bin", 0x10000, 0x8000, CRC(21deafcb) SHA1(477fb36d64a9a60f6dc572fef1095391f6da73b3), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "yan7k06.bin", 0x10001, 0x8000, CRC(97563bae) SHA1(81ea93e1cd55e284609fdff6574aa49b06cd8a7f), ROM_SKIP(1) | ROM_BIOS(0)) - // 1: Phoenix 80286 ROM BIOS Version 3.07 03 / NEC Corporation - // Narrow desktop (APC IV Powermate 1): Available with EGA (LIAI852/EVC215-001 chip) or VGA and 8Mhz/640k version and a 10Mhz/1MB version. [Ctrl]+[Alt]+[-] - // is the speed switch on the 10MHz version. - // on board: ser, par, Floppy - see http://www.uncreativelabs.de/th99/m/M-O/31487.htm for settings - ROM_SYSTEM_BIOS(1, "narrow", "Narrow desktop V3.07 03") - ROMX_LOAD( "bbx10j02.bin", 0x10000, 0x8000, CRC(5bb8c773) SHA1(21df040a92b2ee17e83955776af4ab14350d5ffd), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "bbx10g02.bin", 0x10001, 0x8000, CRC(050159ef) SHA1(b1e627f5d5ef749c51597b7be75f56bb8ff4d8af), ROM_SKIP(1) | ROM_BIOS(1)) -ROM_END - -// NCR Class 3433 - CPU: 486SX/DX 25/33, coprocessor socket provided - Chipset: NCR WPD CLEMSON 006-2001325 CQO1842 9209N -// LSI LOGIC L1A5840 006-2000654B NAR 9212Delta WG35494 GERMANY, NCR 006-2001895 WPD FALCON E CQO 2291 9218N, -// WD58C65JM, VLSI 9210AV 211411 VGA8203C4570 NCR PB 006-2001329, Dallas DS1387 -// OSC: 16.000000MHz, 1.8432MHz, 65.00000MHz, 25.175/26.322, 36.000000MHz, 50.000000MHz, 14.31818MHz, 66.66600MHz -// on board VGA: NCR 77C22 VGA-2 609-3400639 CQO1570 9210R, 8xMCM514245AJ70 -// Slots: 4xMCA, 3x32-bit external memory card, 1xSCSI host adapter - ports: PS/2 mouse, keyboard, 2xserial, parallel, floppy -ROM_START( ncr3433 ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - // 0: NCR ROM BIOS Version 82.01.00 (3433, 3434, 3432, 3437) - ROM_SYSTEM_BIOS(0, "82.01.00", "82.01.00") - ROMX_LOAD( "rbios206.bin", 0x00000, 0x20000, CRC(06e77547) SHA1(41c517b284ed6335024c2b8398504cf3eb8a09e1), ROM_BIOS(0) ) - // 1: NCR ROM BIOS Version 83.01.00 (3433, 3434, 3432, 3437) - ROM_SYSTEM_BIOS(1, "83.01.00", "83.01.00") - ROMX_LOAD( "rbios1.bin", 0x00000, 0x20000, CRC(cf793ce9) SHA1(69d531d14a86bdada8940ba2466515ebcd870d0d), ROM_BIOS(1) ) - - ROM_REGION( 0x0800, "keyboard", 0 ) - ROM_LOAD( "i8742_150-0008390_vers_3.1.bin", 0x000, 0x800, CRC(1bf17f29) SHA1(031ea1bb40756e3e5a1f01b01a53cc3a7c074338) ) -ROM_END - -// Amstrad PC9486 - Board Type - UX486VIO-A Rev. 1.0 - Chipset: UMC - UM82C481BF/UM82C482AF/UM82C206F - BIOS/Version: AMI 486DX ISA BIOS 1993 - AA9222968 -// BIOS String: 40-0100-001131-00111111-111192-UMC480-0 / Amstrad PC9486 - CPU: 80486sx-25 in Socket 3, solder pads for 486 CPU - RAM: 4xSIMM30, 1xSIMM72, Cache: 64K/128K256K -// on board VGA: Cirrus Logic CL-GD5426-80QC-A, 2xKM416C256AJ-7 - Jumpers: Parallel out/bidirectional, VGA enable/disable, SIMM type, PQFP or socket, -// 20/25/33/40/50 MHz, Parity enable/disable, - CPU type - on board: VGA, Floppy, IDE - slots: 1, for riser card -ROM_START( pc9486 ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD ( "9486_saverom.bin", 0x00000, 0x20000, CRC(cbc35a4e) SHA1(dfa614c8255a1407c9850fa4ff99a6b2a52e1a4f) ) -ROM_END - -//************************************************************************** -// 80486 Laptop/Notebook -//************************************************************************** - -// Siemens-Nixdorf PCD-4NL 486 subnotebook -// PhoenixBIOS(TM) A486 Version 1.03 -// complains about "Pointer device failure" and "Memory failure at 00100000, read AA55 expecting 002C -ROM_START( pcd4nl ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "pcd4nl.bin", 0x00000, 0x20000, CRC(8adb4900) SHA1(a01c665fed769ff815bc2e5ae30901f7e12d721b) ) -ROM_END - -// Siemens-Nixdorf PCD-4ND 486 notebook - display remains blank -// Graphics chip: WDC WD90C24A-ZZ on VESA Local Bus, 4MB on mainboard, 4MB/8MB/16MB on CF card like RAM modules -// CPU: Intel 486 SX, 486DX2, 486DX4-75 or -100, 128KB Flash-Eprom for system and video BIOS, ESS688 soundchip -ROM_START( pcd4nd ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_SYSTEM_BIOS(0, "pcd4ndno1", "pcd4ndno1") - ROMX_LOAD( "bf3m51.bin", 0x00000, 0x20000, CRC(6a2f90dd) SHA1(75704a83976e4bb02a028e761d01bd053cc0d4e7), ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "pcd4ndno2", "pcd4ndno2") - ROMX_LOAD( "bf3q42.bin", 0x00000, 0x20000, CRC(fa81cf6e) SHA1(91313a6856ca22f40710a6c9c8a65f8e340784ab), ROM_BIOS(1) ) - ROM_SYSTEM_BIOS(2, "pcd4ndno3", "pcd4ndno3") - ROMX_LOAD( "pcd-4nd_flash_28010.bin", 0x00000, 0x20000, CRC(53c0beea) SHA1(bfa17947529c51a8c9315884e156c01ddd23c0d8), ROM_BIOS(2) ) -ROM_END - -// LION 3500C notebook -ROM_START( lion3500 ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "lion3500.bin", 0x00000, 0x20000, CRC(fc409ac3) SHA1(9a7aa08b981dedffff31fda5d3496469ae2ec3a5) ) -ROM_END - -// Highscreen 486-25 aka Midwest Micro Elite TS34T-25 notebook -// integrated trackball - CPU: i486sx-25 - Chipset: Chips F82C721, Intel ?80C51SLBG, MCCS1468188F, AvaSem AV9129-08CW28, ACC Micro 2046, LT1137CS -// Video: CL-GD6410-320C-A - HD: Maxtor 2585AT -ROM_START( ts34t25 )// blank display - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "p101a002_sys_bios_62fc.u24", 0x00000, 0x20000, CRC(2ce568bc) SHA1(84dc595abf0bf1948a6479afdea4a169f40e3b1b)) - - ROM_REGION( 0x8000, "pmu", 0 ) // rom contains "PMU" string - ROM_LOAD( "s34t0003_51slbios_019f.u31", 0x00000, 0x8000, CRC(40467716) SHA1(f976f2ce13eb22e0ed164d31d6382eda489545c1)) -ROM_END - -// Highscreen Colani Blue Note -// Chipset: Cirrus Logic CL-GD6235-65QC-A, CL-PD6720-QC-A ETEQ ET6000 A, Appian ADI2, SMC FDC37C651 QF P, DIA UA0300-QA, Chips F82C206J -// Video: Dual Scan Color LCD (monochrome available) - RAM: 4MB on board, RAM expansion board - on board: trackball, ser, par, PS2, VGA -// mass storage: Floppy, IDE - expansion: 2xPCMCIA, expansion bus -ROM_START( bluenote ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "7500d_rev26_121593.bin", 0x00000, 0x20000, CRC(d564f855) SHA1(181e4097c3b4ca2e8e79f1732d4aef9edd5b4586)) -ROM_END - -// Siemens PG-750 486 EISA -// blank screen, beeps -ROM_START( pg750eisa ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD( "pg_pg750_486_eisa.bin", 0x10000, 0x10000, CRC(2e6149a9) SHA1(9fcf29a6169efa1359c7c3eff09326dd3e4001dc)) -ROM_END - - -/*************************************************************************** - Game driver(s) -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 198?, asi100b0, ibm5170, 0, atturbo, 0, at_state, init_at, "", "PC/AT (6 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 1987, ataripc4, ibm5170, 0, neat, 0, at_state, init_at, "Atari", "PC4", MACHINE_NOT_WORKING ) -COMP( 1989, atariabc286,ibm5170,0, neat, 0, at_state, init_at, "Atari", "ABC-286/30", MACHINE_NOT_WORKING ) -COMP( 1987, atturbo, ibm5170, 0, atturbo, 0, at_state, init_at, "", "PC/AT Turbo (12 MHz, MF2 Keyboard)" , MACHINE_NOT_WORKING ) -COMP( 198?, aubam12s2, ibm5170, 0, atturbo, 0, at_state, init_at, "AUVA COMPUTER, INC.", "BAM/12-S2", MACHINE_NOT_WORKING ) -COMP( 198?, bam16a0, ibm5170, 0, atturbo, 0, at_state, init_at, "AUVA", "VIP-M21502A BAM16-A0", MACHINE_NOT_WORKING ) -COMP( 198?, bay1000c, ibm5170, 0, atturbo, 0, at_state, init_at, "Mintek", "BAY-1000C V1.01", MACHINE_NOT_WORKING ) -COMP( 199?, bi025c, ibm5170, 0, atturbo, 0, at_state, init_at, "", "BI-025C HT-12 286 (HT12/A chipset)", MACHINE_NOT_WORKING ) -COMP( 1990, c286lt, ibm5170, 0, atturbo, 0, at_state, init_at, "Commodore Business Machines", "Laptop C286LT", MACHINE_NOT_WORKING ) -COMP( 199?, cdtekg2, ibm5170, 0, atturbo, 0, at_state, init_at, "CDTEK", "286 mainboard with Headland G2 chipset", MACHINE_NOT_WORKING ) -COMP( 1990, cl28612s, ibm5170, 0, atturbo, 0, at_state, init_at, "Wearnes", "CL286-12/16S (CL286-12S and CL286-16S)", MACHINE_NOT_WORKING ) -COMP( 198?, cmpa286, ibm5170, 0, atturbo, 0, at_state, init_at, "CMP enterprise CO.LTD.", "286 motherboard", MACHINE_NOT_WORKING ) -COMP( 1987, comportii ,ibm5170, 0, comportii, 0, at_state, init_at, "Compaq", "Portable II", MACHINE_NOT_WORKING ) -COMP( 1987, comportiii,ibm5170, 0, comportiii,0, at_state, init_at, "Compaq", "Portable III", MACHINE_NOT_WORKING ) -COMP( 1988, comslt286, ibm5170, 0, atturbo, 0, at_state, init_at, "Compaq", "SLT/286", MACHINE_NOT_WORKING ) -COMP( 199?, csl286, ibm5170, 0, atturbo, 0, at_state, init_at, "Commodore Business Machines", "SL 286-16", MACHINE_NOT_WORKING ) -COMP( 1988, dsys200, ibm5170, 0, atturbo, 0, at_state, init_at, "Dell Computer Corporation", "System 200", MACHINE_NOT_WORKING ) -COMP( 1989, ec1842, ibm5150, 0, ec1842, 0, at_state, init_at, "", "EC-1842", MACHINE_NOT_WORKING ) -COMP( 1993, ec1849, ibm5170, 0, ec1842, 0, at_state, init_at, "", "EC-1849", MACHINE_NOT_WORKING ) -COMP( 198?, elanht286, ibm5170, 0, ibm5162, 0, at_state, init_at, "Leanord SA", "Elan High Tech 286", MACHINE_NOT_WORKING ) -COMP( 198?, elt286b, ibm5170, 0, neat, 0, at_state, init_at, "Chaintech", "ELT-286B-160B(E)", MACHINE_NOT_WORKING ) -COMP( 198?, epsax, ibm5170, 0, ibm5162, 0, at_state, init_at, "Epson", "PC AX", MACHINE_NOT_WORKING ) -COMP( 198?, epsax2e, ibm5170, 0, atturbo, 0, at_state, init_at, "Epson", "PC AX2e", MACHINE_NOT_WORKING ) -COMP( 1989, euroat, ibm5170, 0, euroat, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "Euro AT", MACHINE_NOT_WORKING ) -COMP( 198?, ev1806, ibm5170, 0, ibm5162, 0, at_state, init_at, "Everex Systems", "EV-1806", MACHINE_NOT_WORKING ) // continuous beeps (RAM not detected?) -COMP( 198?, ev1815, ibm5170, 0, ibm5162, 0, at_state, init_at, "Everex Systems", "EV-1815", MACHINE_NOT_WORKING ) // continuous beeps (RAM not detected?) -COMP( 1986, ews286, ibm5170, 0, ews286, 0, at_state, init_at, "Ericsson", "Ericsson WS286", MACHINE_NOT_WORKING ) -COMP( 199?, headg2, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with Headland G2 chipset", MACHINE_NOT_WORKING ) -COMP( 19??, ht12a, ibm5170, 0, atturbo, 0, at_state, init_at, "", "unknown 286 AT clones (HT12/A chipset)", MACHINE_NOT_WORKING ) -COMP( 1985, ibm5162, ibm5170, 0, ibm5162, 0, at_state, init_at, "International Business Machines", "PC/XT-286 5162", MACHINE_NOT_WORKING ) -COMP( 1984, ibm5170, 0, ibm5150, ibm5170, 0, at_state, init_at, "International Business Machines", "PC/AT 5170", MACHINE_NOT_WORKING ) -COMP( 1985, ibm5170a, ibm5170, 0, ibm5170a, 0, at_state, init_at, "International Business Machines", "PC/AT 5170 8MHz", MACHINE_NOT_WORKING ) -COMP( 1989, ibm2011, ibm5170, 0, ibmps1, 0, at_vrom_fix_state, init_at, "International Business Machines", "PS/1 2011", MACHINE_NOT_WORKING ) -COMP( 1989, ibm2011rd, ibm5170, 0, ibmps1, 0, at_vrom_fix_state, init_at, "International Business Machines", "PS/1 2011 (international models with ROM DOS)", MACHINE_NOT_WORKING ) -COMP( 198?, icldrsm40, ibm5170, 0, neat, 0, at_state, init_at, "ICL", "DRS M40", MACHINE_NOT_WORKING ) -COMP( 1985, k286i, ibm5170, 0, k286i, 0, at_state, init_at, "Kaypro", "286i", MACHINE_NOT_WORKING ) -COMP( 199?, kma202f, ibm5170, 0, atturbo, 0, at_state, init_at, "", "KMA-202F-12R (Winbond chipset)", MACHINE_NOT_WORKING ) -COMP( 19??, kt216wb5, ibm5170, 0, ibm5162, 0, at_state, init_at, "KT Technology", "KT216WB5-HI Rev.2", MACHINE_NOT_WORKING ) -COMP( 198?, lm103s, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "LM-103S", MACHINE_NOT_WORKING ) -COMP( 1987, m290, ibm5170, 0, atturbo, 0, at_state, init_at, "Olivetti", "M290", MACHINE_NOT_WORKING ) -COMP( 198?, magb233, ibm5170, 0, ibm5162, 0, at_state, init_at, "Magitronic Technology", "Magitronic B233", MACHINE_NOT_WORKING ) -COMP( 198?, magb236, ibm5170, 0, ibm5162, 0, at_state, init_at, "Magitronic Technology", "Magitronic B236", MACHINE_NOT_WORKING ) -COMP( 19??, mat286, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "MAT286 Rev.D", MACHINE_NOT_WORKING ) -COMP( 199?, mb1212c, ibm5170, 0, atturbo, 0, at_state, init_at, "Biostar", "MB-1212C", MACHINE_NOT_WORKING ) -COMP( 199?, mba009, ibm5170, 0, atturbo, 0, at_state, init_at, "", "HLB-286 MBA-009", MACHINE_NOT_WORKING ) -COMP( 199?, micral45, ibm5170, 0, micral45, 0, at_state, init_at, "Bull", "Micral 45", MACHINE_NOT_WORKING ) -COMP( 199?, minisys2k, ibm5170, 0, atturbo, 0, at_state, init_at, "SIIG", "MiniSys 2000", MACHINE_NOT_WORKING ) -COMP( 198?, mkp286, ibm5170, 0, atturbo, 0, at_state, init_at, "Morse", "KP-286", MACHINE_NOT_WORKING ) -COMP( 1987, n8810m15, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M15", MACHINE_NOT_WORKING ) -COMP( 1990, n8810m16c, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 CGA version", MACHINE_NOT_WORKING ) -COMP( 1990, n8810m30, ibm5170, 0, neat, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M30", MACHINE_NOT_WORKING ) -COMP( 1986, n8810m55, ibm5170, 0, n8810m55, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M55", MACHINE_NOT_WORKING ) -COMP( 1990, n8810m16v, ibm5170, 0, atturbo, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 VGA version", MACHINE_NOT_WORKING ) -COMP( 199?, ncr3302, ibm5170, 0, neat, 0, at_state, init_at, "NCR", "Class 3302 Model 0110", MACHINE_NOT_WORKING ) -COMP( 1986, ncrpc8, ibm5170, 0, atturbo, 0, at_state, init_at, "NCR", "PC-8", MACHINE_NOT_WORKING ) -COMP( 1989, neat, ibm5170, 0, neat, 0, at_state, init_at, "", "NEAT (12 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 1986, necapciv, ibm5170, 0, atturbo, 0, at_state, init_at, "NEC", "APC IV", MACHINE_NOT_WORKING ) -//COMP( 1988, nws286, ibm5170, 0, ews286, 0, at_state, at, "Nokia Data", "Nokia Data WS286", MACHINE_NOT_WORKING ) -COMP( 198?, o286foxii, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "Fox II", MACHINE_NOT_WORKING ) -COMP( 1990, ocfoxm, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "Fox M 286", MACHINE_NOT_WORKING ) -COMP( 199?, octekg2, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "286 motherboard with Headland G2 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, olim203, ibm5170, 0, atturbo, 0, at_state, init_at, "Olivetti", "M203 motherboard", MACHINE_NOT_WORKING ) -COMP( 1988, pc30iii, ibm5170, 0, pc30iii, 0, at_state, init_at, "Commodore Business Machines", "PC 30-III", MACHINE_NOT_WORKING ) -COMP( 1988, pc40iii, ibm5170, 0, pc40iii, 0, at_state, init_at, "Commodore Business Machines", "PC 40-III", MACHINE_NOT_WORKING ) -COMP( 198?, pc45iii, ibm5170, 0, pc40iii, 0, at_state, init_at, "Commodore Business Machines", "PC 45-III", MACHINE_NOT_WORKING ) -COMP( 198?, pccm205, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M205", MACHINE_NOT_WORKING ) -COMP( 198?, pccm209, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M209", MACHINE_NOT_WORKING ) -COMP( 198?, pccm216, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M216", MACHINE_NOT_WORKING ) -COMP( 1986, pcd2, ibm5170, 0, ibm5170, 0, at_state, init_at, "Siemens", "PCD-2", MACHINE_NOT_WORKING ) -COMP( 1991, pcd204, ibm5170, 0, atturbo, 0, at_state, init_at, "Philips", "PCD204 (PCD200 series)", MACHINE_NOT_WORKING ) -COMP( 198?, pcd2m, ibm5170, 0, atturbo, 0, at_state, init_at, "Siemens", "PCD-2M", MACHINE_NOT_WORKING ) -COMP( 198?, peas286, ibm5170, 0, atturbo, 0, at_state, init_at, "Peacock Computer", "S-286 Rev A", MACHINE_NOT_WORKING ) -COMP( 1990, profpc33, ibm5170, 0, atturbo, 0, at_state, init_at, "Profex", "PC 33", MACHINE_NOT_WORKING ) -COMP( 198?, prolite286,ibm5170, 0, neat, 0, at_state, init_at, "CAF", "Prolite 286/16", MACHINE_NOT_WORKING ) -COMP( 198?, pwb7270e, ibm5170, 0, neat, 0, at_state, init_at, "Advanced Logic Research", "PWB 7270 REV E", MACHINE_NOT_WORKING ) -COMP( 199?, samdm286, ibm5170, 0, atturbo, 0, at_state, init_at, "Samsung", "Deskmaster 286-12", MACHINE_NOT_WORKING ) -COMP( 199?, sarcpc, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "80286 Standard System (SARC RC2015 chipset)", MACHINE_NOT_WORKING ) -COMP( 198?, snomi286, ibm5170, 0, atturbo, 0, at_state, init_at, "Snobol", "Mini 286", MACHINE_NOT_WORKING ) -COMP( 198?, suntac303, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with Suntac ST62C303-A chipset", MACHINE_NOT_WORKING ) -COMP( 199?, suntac6, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with 6-chip SUNTAC chipset", MACHINE_NOT_WORKING ) -COMP( 198?, td60c, ibm5170, 0, atturbo, 0, at_state, init_at, "", "TD60C", MACHINE_NOT_WORKING ) -COMP( 19??, toptek286, ibm5170, 0, ibm5162, 0, at_state, init_at, "Toptek Micro Computer", "286 Turbo", MACHINE_NOT_WORKING ) -COMP( 198?, towerat2xx,ibm5170, 0, atturbo, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "Tower AT 201, 202, 220, 240 and 260 (286,EGA)", MACHINE_NOT_WORKING ) -COMP( 198?, olyport40, ibm5170, 0, olyport40, 0, at_state, init_at, "AEG Olympia", "Olyport 40-21", MACHINE_NOT_WORKING ) -COMP( 199?, twinnet, ibm5170, 0, atturbo, 0, at_state, init_at, "Twinhead", "Netstation PC", MACHINE_NOT_WORKING ) -COMP( 198?, u3911v3, ibm5170, 0, atturbo, 0, at_state, init_at, "Uniron", "U3911-V3", MACHINE_NOT_WORKING ) -COMP( 198?, v286c, ibm5170, 0, atturbo, 0, at_state, init_at, "Victor", "V286C", MACHINE_NOT_WORKING ) -COMP( 198?, vlsi5, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with 5-chip VLSI chipset", MACHINE_NOT_WORKING ) -COMP( 1981, wpc250, ibm5170, 0, atturbo, 0, at_state, init_at, "Wang Laboratories, Inc.", "PC-250/16", MACHINE_NOT_WORKING ) -COMP( 198?, wy220001, ibm5170, 0, ibm5162, 0, at_state, init_at, "Wyse", "WYSEpc 286", MACHINE_NOT_WORKING ) -COMP( 1989, xb42639, ibm5170, 0, xb42639, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus I Motherboard 286)" , MACHINE_NOT_WORKING ) -COMP( 1990, xb42639a, ibm5170, 0, xb42639, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus II Motherboard 286)" , MACHINE_NOT_WORKING ) -COMP( 198?, zdz248, ibm5170, 0, atturbo, 0, at_state, init_at, "Zenith Data Systems", "Z-248", MACHINE_NOT_WORKING ) -COMP( 199?, 386sxvhcom,ibm5170, 0, at386sx, 0, at_state, init_at, "", "80386SX-VH-COM", MACHINE_NOT_WORKING ) -COMP( 199?, 3siud, ibm5170, 0, at386sx, 0, at_state, init_at, "", "3SIUD-1.1", MACHINE_NOT_WORKING ) -COMP( 199?, alaleolx, ibm5170, 0, at386sx, 0, at_state, init_at, "Alaris RYC", "LEOPARD LX", MACHINE_NOT_WORKING ) -COMP( 199?, alim1217, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the ALi M1217 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, anch386s, ibm5170, 0, at386sx, 0, at_state, init_at, "ANIX", "CH-386S-16/20/25G", MACHINE_NOT_WORKING ) -COMP( 199?, asc486slc, ibm5170, 0, at386sx, 0, at_state, init_at, "Computechnik", "ASC486SLC", MACHINE_NOT_WORKING ) -COMP( 1988, at386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "", "PC/AT 386SX (16 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 1990, c386sx16, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "386SX-16", MACHINE_NOT_WORKING ) -COMP( 1990, c386sx25, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "386SX-25", MACHINE_NOT_WORKING ) -COMP( 1991, c386sxlt, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "Laptop C386SX-LT", MACHINE_NOT_WORKING ) -COMP( 1988, ct386sx, ibm5170, 0, ct386sx, 0, at_state, init_at, "", "NEAT 386SX (16 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 1993, cxsxd, ibm5170, 0, at386sx, 0, at_state, init_at, "CX Technology", "CX SXD", MACHINE_NOT_WORKING ) -COMP( 199?, dfi386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Diamond Flower International", "386SX-16/20CN Rev 1.0", MACHINE_NOT_WORKING ) -COMP( 199?, dvbslan, ibm5170, 0, at386sx, 0, at_state, init_at, "Datavan", "Book-Size LAN station", MACHINE_NOT_WORKING ) -COMP( 199?, ecs8517, ibm5170, 0, at386sx, 0, at_state, init_at, "Elitegroup", "ECS 8517 v3.3", MACHINE_NOT_WORKING ) -COMP( 199?, elt386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Elitegroup", "ELT-386SX-160BE", MACHINE_NOT_WORKING ) -COMP( 198?, eltp9, ibm5170, 0, at386sx, 0, at_state, init_at, "Chaintech", "ELT-P9 / most likely ELT-386SX-160D", MACHINE_NOT_WORKING ) -COMP( 198?, epsax3, ibm5170, 0, at386sx, 0, at_state, init_at, "Epson", "PC AX3", MACHINE_NOT_WORKING ) -COMP( 19??, ht18c, ibm5170, 0, at386sx, 0, at_state, init_at, "", "unknown 386sx AT clones (HT18/C chipset)", MACHINE_NOT_WORKING ) -COMP( 199?, ibm2121, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2121", MACHINE_NOT_WORKING ) -COMP( 199?, ibm2121rd, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2121 (international models with ROM DOS)", MACHINE_NOT_WORKING ) -COMP( 199?, ibm2123, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2123", MACHINE_NOT_WORKING ) -COMP( 199?, ilm396b, ibm5170, 0, at386sx, 0, at_state, init_at, "ILON USA, INC.", "M-396B", MACHINE_NOT_WORKING ) -COMP( 198?, ktx20t02, ibm5170, 0, at386sx, 0, at_state, init_at, "Quadtel", "QTC-SXM KT X20T02/HI Rev.3", MACHINE_NOT_WORKING ) -COMP( 199?, mbc18nb, ibm5170, 0, at386sx, 0, at_state, init_at, "Sanyo", "MBC-18NB", MACHINE_NOT_WORKING ) -COMP( 1992, mbc28, ibm5170, 0, at386sx, 0, at_state, init_at, "Sanyo", "MBC-28", MACHINE_NOT_WORKING ) // Complains about missing mouse hardware -COMP( 1993, megapc, 0, 0, megapc, 0, megapc_state, init_megapc, "Amstrad plc", "MegaPC", MACHINE_NOT_WORKING ) -COMP( 199?, mmbo4088, ibm5170, 0, at386sx, 0, at_state, init_at, "", "486MMBO4088 (TI TX486SLC/E)", MACHINE_NOT_WORKING ) -COMP( 199?, mokp386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Morse", "KP 386SX V2.21", MACHINE_NOT_WORKING ) -COMP( 199?, ocpanii, ibm5170, 0, at386sx, 0, at_state, init_at, "Octek", "Panther II", MACHINE_NOT_WORKING ) -COMP( 199?, op82c283, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the OPTi 82C283 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, op82c291, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the OPTi 82C291 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, p386sx25pw,ibm5170, 0, at386sx, 0, at_state, init_at, "Prolink", "P386SX-25PW VER:2.00", MACHINE_NOT_WORKING ) -COMP( 198?, pc50ii, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "PC 50-II", MACHINE_NOT_WORKING ) -COMP( 198?, pcb303, ibm5170, 0, at386sx, 0, at_state, init_at, "Packard Bell", "PCB-303 Rev.01", MACHINE_NOT_WORKING ) -COMP( 199?, pccm396f, ibm5170, 0, at386sx, 0, at_state, init_at, "PC-Chips", "M396F", MACHINE_NOT_WORKING ) -COMP( 199?, pcd3nsl, ibm5170, 0, at386sx, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-3Nsl Notebook Computer", MACHINE_NOT_WORKING ) -COMP( 199?, pcd3nsx, ibm5170, 0, at386sx, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-3Nsx Notebook Computer", MACHINE_NOT_WORKING ) -COMP( 199?, php3239, ibm5170, 0, at386sx, 0, at_state, init_at, "Philips", "P3239", MACHINE_NOT_WORKING ) -COMP( 199?, ppm3333p, ibm5170, 0, at386sx, 0, at_state, init_at, "DTK Computer", "PPM-3333P", MACHINE_NOT_WORKING ) -COMP( 199?, pt319a, ibm5170, 0, at386sx, 0, at_state, init_at, "Pine", "PT-319A", MACHINE_NOT_WORKING ) -COMP( 199?, scamp386sx,ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the SCAMPSX chipset", MACHINE_NOT_WORKING ) -COMP( 199?, scsxaio, ibm5170, 0, at386sx, 0, at_state, init_at, "Peacock", "386sx Ver. 2.0 motherboard SCsxAIO", MACHINE_NOT_WORKING ) -COMP( 199?, sh386sx20, ibm5170, 0, at386sx, 0, at_state, init_at, "Shuttle", "386SX REV 2.0A", MACHINE_NOT_WORKING ) -COMP( 1991, t2000sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Toshiba", "T2000SX", MACHINE_NOT_WORKING ) -COMP( 199?, td70a, ibm5170, 0, at386sx, 0, at_state, init_at, "", "TD70A and TD70AN", MACHINE_NOT_WORKING ) -COMP( 199?, td70n, ibm5170, 0, at386sx, 0, at_state, init_at, "", "TD70N", MACHINE_NOT_WORKING ) -COMP( 199?, tot3200sxc,ibm5170, 0, at386sx, 0, at_state, init_at, "Toshiba", "T3200SXC", MACHINE_NOT_WORKING ) -COMP( 198?, tower386sx,ibm5170, 0, at386sx, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "386SX System 40 (VGA)", MACHINE_NOT_WORKING ) -COMP( 1992, walk386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386 SX", MACHINE_NOT_WORKING ) // screen remains blank -COMP( 198?, zeos386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "ZEOS", "386 SX-16", MACHINE_NOT_WORKING ) -COMP( 199?, 386sc, ibm5170, 0, at386, 0, at_state, init_at, "", "386 SC Rev A2", MACHINE_NOT_WORKING ) -COMP( 199?, 386sc2c, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the Symphony chipset", MACHINE_NOT_WORKING ) -COMP( 199?, 386schg, ibm5170, 0, at386, 0, at_state, init_at, "", "386-SC-HG", MACHINE_NOT_WORKING ) -COMP( 199?, 4nd04a, ibm5170, 0, at386, 0, at_state, init_at, "", "386-4N-D04A (UMC chipset)", MACHINE_NOT_WORKING ) -COMP( 199?, al486vd, ibm5170, 0, at386, 0, at_state, init_at, "Daewoo", "AL486V-D Rev:1.1", MACHINE_NOT_WORKING ) -COMP( 199?, alacou, ibm5170, 0, at386, 0, at_state, init_at, "Alaris", "Cougar", MACHINE_NOT_WORKING ) -COMP( 199?, alim1419, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the ALi M1419 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, alim1429, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the ALi M1429 A1 and M1431 A2 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, amibaby, ibm5170, 0, at386, 0, at_state, init_at, "AMI", "Mark V Baby Screamer", MACHINE_NOT_WORKING ) -COMP( 1990, aplanst, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot LANstation (Krypton Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1990, aplannb, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot LANstation (Novell Remote Boot)", MACHINE_NOT_WORKING ) -COMP( 1992, aplscar, ibm5170, 0, at486l, 0, at_state, init_at, "Apricot", "Apricot LS Pro (Caracal Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1987, apxeni, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-i 386 (Leopard Motherboard)" , MACHINE_NOT_WORKING ) -COMP( 1988, at386, ibm5170, 0, at386, 0, at_state, init_at, "", "PC/AT 386 (12 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 1988, ataripc5, ibm5170, 0, at386, 0, at_state, init_at, "Atari", "PC5", MACHINE_NOT_WORKING ) -COMP( 199?, chn333sc, ibm5170, 0, at386, 0, at_state, init_at, "Chaintech", "333SC", MACHINE_NOT_WORKING ) -COMP( 199?, comt386, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "Tower 386", MACHINE_NOT_WORKING ) -COMP( 198?, cs8230, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the CS8230 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, ctcc386mx, ibm5170, 0, at386, 0, at_state, init_at, "Caching Tech Corporation", "C386MX", MACHINE_NOT_WORKING ) -COMP( 198?, dfi386, ibm5170, 0, at386, 0, at_state, init_at, "DFI", "386-20.REV0", MACHINE_NOT_WORKING ) -COMP( 199?, dt386, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "DT386", MACHINE_NOT_WORKING ) -COMP( 1988, ecs38632, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "ECS-386/32", MACHINE_NOT_WORKING ) -COMP( 1988, ecs386a, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "ECS-386A", MACHINE_NOT_WORKING ) -COMP( 199?, ecsfx3000, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "FX-3000 REV1.0", MACHINE_NOT_WORKING ) -COMP( 1992, ecsum386, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "UM386 (Rev 1.1)", MACHINE_NOT_WORKING ) -COMP( 199?, fic4386vchd,ibm5170,0, at486, 0, at_state, init_at, "First International Computer", "4386-VC-HD", MACHINE_NOT_WORKING ) -COMP( 199?, frx386c, ibm5170, 0, at386, 0, at_state, init_at, "Micro-Express Inc.", "Forex 386 Cache", MACHINE_NOT_WORKING ) -COMP( 199?, frxc402, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards with a FOREX FRX46C402/FRX36C300/SIS85C206 chipset", MACHINE_NOT_WORKING ) -COMP( 1991, fu340, ibm5170, 0, at386, 0, at_state, init_at, "Abit", "FU340", MACHINE_NOT_WORKING ) -COMP( 199?, ges9051n, ibm5170, 0, at386, 0, at_state, init_at, "", "GES 9051N-386C VER -0.01", MACHINE_NOT_WORKING ) -COMP( 198?, gs611606a, ibm5170, 0, at386, 0, at_state, init_at, "Goldstar", "GOLDSTAR P/N 611-606A Rev 1.0A", MACHINE_NOT_WORKING ) -COMP( 198?, hot304, ibm5170, 0, at386, 0, at_state, init_at, "Shuttle Computer International", "HOT-304", MACHINE_NOT_WORKING ) -COMP( 198?, hot307h, ibm5170, 0, at386, 0, at_state, init_at, "Shuttle Computer International", "HOT-307H", MACHINE_NOT_WORKING ) -COMP( 199?, isa386u30, ibm5170, 0, at386, 0, at_state, init_at, "Asus", "ISA-386U30 REV.2.2", MACHINE_NOT_WORKING ) -COMP( 1989, isa386c, ibm5170, 0, at386, 0, at_state, init_at, "Asus", "ISA-386C", MACHINE_NOT_WORKING ) -COMP( 199?, kma300g, ibm5170, 0, at386, 0, at_state, init_at, "Arche Technologies Inc.", "KMA-300G-25", MACHINE_NOT_WORKING ) -COMP( 199?, mb133340, ibm5170, 0, at386, 0, at_state, init_at, "Biostar", "MB-1340UCQ-B", MACHINE_NOT_WORKING ) -COMP( 199?, mba032q, ibm5170, 0, at386, 0, at_state, init_at, "DTK", "MBA-032Q TK83305-4N-D-03", MACHINE_NOT_WORKING ) -COMP( 199?, megapcpl, megapc, 0, megapcpl, 0, megapc_state, init_megapcpl, "Amstrad plc", "MegaPC Plus", MACHINE_NOT_WORKING ) -COMP( 199?, megapcpla, megapc, 0, megapcpla, 0, at_vrom_fix_state, init_megapcpla, "Amstrad plc", "MegaPC Plus (WINBUS chipset)", MACHINE_NOT_WORKING ) -COMP( 199?, mokp386, ibm5170, 0, at386, 0, at_state, init_at, "Morse", "KP920121523 V2.20", MACHINE_NOT_WORKING ) -COMP( 199?, mom3v3, ibm5170, 0, at386, 0, at_state, init_at, "Morse", "M3 V3.0", MACHINE_NOT_WORKING ) -COMP( 199?, mx83c305, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the MX83C305(A)(FC)/MX83C05(A)(FC) chipset", MACHINE_NOT_WORKING ) -COMP( 1992, ocjagii, ibm5170, 0, at386, 0, at_state, init_at, "Octek", "Jaguar II", MACHINE_NOT_WORKING ) -COMP( 1992, ocjagv, ibm5170, 0, at386, 0, at_state, init_at, "Octek", "Jaguar V v1.4", MACHINE_NOT_WORKING ) -COMP( 199?, op82c381, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the OPTi 82C381 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, op82c391, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the OPTi 82C391 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, opti495slc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495SLC chipset", MACHINE_NOT_WORKING ) -COMP( 199?, opti495xlc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495XLC chipset", MACHINE_NOT_WORKING ) -COMP( 199?, op386wb, ibm5170, 0, at386, 0, at_state, init_at, "OPTi", "OPTi 386WB VER.1.0", MACHINE_NOT_WORKING ) -COMP( 199?, p386dx40, ibm5170, 0, at386, 0, at_state, init_at, "Peacock", "P386DX-40", MACHINE_NOT_WORKING ) -COMP( 1989, pc2386, ibm5170, 0, at386l, 0, at_state, init_at, "Amstrad plc", "PC2386", MACHINE_NOT_WORKING ) -COMP( 198?, pc60iii, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "PC 60-III", MACHINE_NOT_WORKING ) -COMP( 199?, pccm317, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M317", MACHINE_NOT_WORKING ) -COMP( 199?, pccm321, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M321", MACHINE_NOT_WORKING ) -COMP( 199?, pccm326, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M326", MACHINE_NOT_WORKING ) -COMP( 198?, pem2530, ibm5170, 0, at386, 0, at_state, init_at, "DTK", "PEM 2539", MACHINE_NOT_WORKING ) -COMP( 199?, pg750, ibm5170, 0, pg750, 0, at_state, init_at, "Siemens", "PG 750", MACHINE_NOT_WORKING ) -COMP( 199?, pt581392, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the Forex FRX46C402 + FRX46C411 + SiS 85C206 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, qdu386dx, ibm5170, 0, at386, 0, at_state, init_at, "", "QD-U386DX VER 1.0", MACHINE_NOT_WORKING ) -COMP( 1988, qi600, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot Qi 600 (Neptune Motherboard)", MACHINE_NOT_WORKING ) -COMP( 199?, sisrabb, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the SiS Rabbit chipset", MACHINE_NOT_WORKING ) -COMP( 199?, sm38640f, ibm5170, 0, at386, 0, at_state, init_at, "", "SM 386-40F", MACHINE_NOT_WORKING ) -COMP( 19??, smih0107, ibm5170, 0, at386, 0, at_state, init_at, "Forex Computer Company", "unknown 386 AT clone with Forex chipset", MACHINE_NOT_WORKING ) -COMP( 199?, sy012, ibm5170, 0, at386, 0, at_state, init_at, "", "SY-012 16/25 386MB VER: 5.2", MACHINE_NOT_WORKING ) -COMP( 199?, sy019hi, ibm5170, 0, at386, 0, at_state, init_at, "Soyo", "SY-019H and SY-019I", MACHINE_NOT_WORKING ) -COMP( 199?, sybaby386, ibm5170, 0, at386, 0, at_state, init_at, "Soyo", "Baby AT 386", MACHINE_NOT_WORKING ) -COMP( 199?, tam25p2, ibm5170, 0, at386, 0, at_state, init_at, "AUVA", "TAM/25-P2 M31720P", MACHINE_NOT_WORKING ) -COMP( 199?, tam3340ma0,ibm5170, 0, at386, 0, at_state, init_at, "", "TAM/33/40-MA0", MACHINE_NOT_WORKING ) -COMP( 199?, um82c481af,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the UMC UM82C481AF chipset", MACHINE_NOT_WORKING ) -COMP( 199?, um82c491f, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the UMC UM82C491F chipset", MACHINE_NOT_WORKING ) -COMP( 199?, um82c493f, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the UMC UM82C491F + UM82C493F chipset or BIOTEQ equivalents", MACHINE_NOT_WORKING ) -COMP( 199?, uni386w, ibm5170, 0, at386, 0, at_state, init_at, "UNICHIP", "386W 367C REV 1.0", MACHINE_NOT_WORKING ) -COMP( 1992, walk386dx, ibm5170, 0, at386, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386DX", MACHINE_NOT_WORKING ) // screen remains blank -COMP( 1988, xb42663, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot Qi 300 (Rev D,E & F Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1989, xb42664, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus I Motherboard 386)" , MACHINE_NOT_WORKING ) -COMP( 1990, xb42664a, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus II Motherboard 386)" , MACHINE_NOT_WORKING ) -COMP( 199?, 486apio, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "486 APIO", MACHINE_NOT_WORKING ) -COMP( 199?, 486ccv, ibm5170, 0, at486, 0, at_state, init_at, "Diamond Flower, Inc. (DFI)", "486-CCV", MACHINE_NOT_WORKING ) -COMP( 199?, 486igb21, ibm5170, 0, at486, 0, at_state, init_at, "", "486IG-B-2-1", MACHINE_NOT_WORKING ) -COMP( 199?, 486wb6a3, ibm5170, 0, at486, 0, at_state, init_at, "Silicon Valley Computer, Inc.", "486WB6A3.B1", MACHINE_NOT_WORKING ) -COMP( 199?, 4dmshl3g, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "4DMS HL3G-L4-VI", MACHINE_NOT_WORKING ) -COMP( 199?, 4dmuhl3s, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "4DMU HL3S", MACHINE_NOT_WORKING ) -COMP( 1992, a433cc, ibm5170, 0, at486, 0, at_state, init_at, "J-Bond", "A433C-C/A450C-C", MACHINE_NOT_WORKING ) -COMP( 1994, a486ap4, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PVI-486AP4", MACHINE_NOT_WORKING ) -COMP( 199?, a486isa, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486", MACHINE_NOT_WORKING ) -COMP( 199?, a486sio, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486SIO rev. 1.2", MACHINE_NOT_WORKING ) -COMP( 1994, a486sp3, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PVI-486SP3", MACHINE_NOT_WORKING ) -COMP( 1994, a486sp3g, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PCI/I-486SP3G", MACHINE_NOT_WORKING ) -COMP( 199?, a486sv2, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486SV2", MACHINE_NOT_WORKING ) -COMP( 1994, a486sv2g, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "VL/I-486SV2G", MACHINE_NOT_WORKING ) -COMP( 1994, a486sv1, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "VL/EISA-486SV1", MACHINE_NOT_WORKING ) -COMP( 1995, aa486s, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PCI/I-A486S", MACHINE_NOT_WORKING ) -COMP( 199?, abae4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "486 EISA-AE4", MACHINE_NOT_WORKING ) -COMP( 199?, abah4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AH4", MACHINE_NOT_WORKING ) -COMP( 199?, abav4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AV4", MACHINE_NOT_WORKING ) -COMP( 199?, abax4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AX4", MACHINE_NOT_WORKING ) -COMP( 199?, abpb4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PB4", MACHINE_NOT_WORKING ) -COMP( 199?, abpi4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PI4", MACHINE_NOT_WORKING ) -COMP( 199?, abpm4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PM4", MACHINE_NOT_WORKING ) -COMP( 199?, abpv4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PV4", MACHINE_NOT_WORKING ) -COMP( 199?, abpw4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PW4", MACHINE_NOT_WORKING ) -COMP( 199?, alator2, ibm5170, 0, at486, 0, at_state, init_at, "Alaris", "Tornado 2", MACHINE_NOT_WORKING ) -COMP( 199?, alim1489, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the ALi 1487/1489 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, amient2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-II", MACHINE_NOT_WORKING ) -COMP( 199?, amient3, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-III", MACHINE_NOT_WORKING ) -COMP( 199?, amient4, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-IV", MACHINE_NOT_WORKING ) -COMP( 199?, amisvpci2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager PCI-II", MACHINE_NOT_WORKING ) -COMP( 199?, amisvvlb, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB", MACHINE_NOT_WORKING ) -COMP( 199?, amisvvlb2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB-II", MACHINE_NOT_WORKING ) -COMP( 199?, amisvvlb3, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB-III", MACHINE_NOT_WORKING ) -COMP( 199?, aoap43, ibm5170, 0, at486, 0, at_state, init_at, "Aopen", "AP43", MACHINE_NOT_WORKING ) -COMP( 199?, aovi15g, ibm5170, 0, at486, 0, at_state, init_at, "Aopen", "VI15G", MACHINE_NOT_WORKING ) -COMP( 1992, aplsbon, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot LS Pro (Bonsai Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1991, aprfte, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FT//ex 486 (J3 Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1992, aprpand, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FTs (Panther Rev F 1.02.26)", MACHINE_NOT_WORKING ) -COMP( 1989, apvxft, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot VX FT server", MACHINE_NOT_WORKING ) -COMP( 1993, apxena1, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN PC (A1 Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1991, apxenls3, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN-LS (Venus IV Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1993, apxenp2, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN PC (P2 Motherboard)", MACHINE_NOT_WORKING ) -COMP( 1993, apxlsam, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN-LS II (Samurai Motherboard)", MACHINE_NOT_WORKING ) -COMP( 199?, ar4glx3, ibm5170, 0, at486, 0, at_state, init_at, "Addtech Research", "4GLX3 Green-B 4GPV3.1", MACHINE_NOT_WORKING ) -COMP( 199?, as496, ibm5170, 0, at486, 0, at_state, init_at, "Arstoria", "AS496", MACHINE_NOT_WORKING ) -COMP( 1990, at486, ibm5170, 0, at486, 0, at_state, init_at, "", "PC/AT 486 (25 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) -COMP( 199?, atc1415, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1415", MACHINE_NOT_WORKING ) -COMP( 199?, atc1425a, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1425A", MACHINE_NOT_WORKING ) -COMP( 199?, atc1425b, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1425B", MACHINE_NOT_WORKING ) -COMP( 199?, bluenote, ibm5170, 0, at486, 0, at_state, init_at, "Highscreen", "Colani Blue Note", MACHINE_NOT_WORKING ) -COMP( 199?, ch48633c, ibm5170, 0, at486, 0, at_state, init_at, "Chicony", "CH-486-33C", MACHINE_NOT_WORKING ) -COMP( 199?, ch486spm, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "486SPM", MACHINE_NOT_WORKING ) -COMP( 199?, ch491e, ibm5170, 0, at486, 0, at_state, init_at, "Chicony", "CH-491E", MACHINE_NOT_WORKING ) -COMP( 199?, ch4slez1, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "486SLE M106 4SLE-Z1", MACHINE_NOT_WORKING ) -COMP( 199?, ch4spi, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "4SPI", MACHINE_NOT_WORKING ) -COMP( 199?, comt486, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "Tower 486", MACHINE_NOT_WORKING ) -COMP( 199?, dt486, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "DT486", MACHINE_NOT_WORKING ) -COMP( 199?, ec4913, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UC4913 REV:1.1", MACHINE_NOT_WORKING ) -COMP( 199?, ec4915aio, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UC4915 A AIO", MACHINE_NOT_WORKING ) -COMP( 199?, ed486vl3h, ibm5170, 0, at486, 0, at_state, init_at, "Edom", "486VL3H", MACHINE_NOT_WORKING ) -COMP( 199?, edmv035f, ibm5170, 0, at486, 0, at_state, init_at, "Edom", "MV035F", MACHINE_NOT_WORKING ) -COMP( 199?, exp4044, ibm5170, 0, at486, 0, at_state, init_at, "ExpertChip", "EXP4044", MACHINE_NOT_WORKING ) -COMP( 199?, f4dxluc4, ibm5170, 0, at486, 0, at_state, init_at, "ADI", "F4DXL-UC4", MACHINE_NOT_WORKING ) -COMP( 199?, fic486gvt, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-GVT", MACHINE_NOT_WORKING ) -COMP( 199?, fic4386vcv,ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "4386-VC-V", MACHINE_NOT_WORKING ) -COMP( 199?, fic486kvd, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486 KVD", MACHINE_NOT_WORKING ) -COMP( 199?, fic486vchd,ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VC-HD", MACHINE_NOT_WORKING ) -COMP( 199?, ficeli6ii, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "FIC ELI6-II", MACHINE_NOT_WORKING ) -COMP( 1994, ficgiovt2, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-GIO-VT2", MACHINE_NOT_WORKING ) -COMP( 1995, ficpio2, ibm5170, 0, ficpio2, 0, at_state, init_atpci, "First International Computer", "486-PIO-2", MACHINE_NOT_WORKING ) -COMP( 1994, ficvipio, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VIP-IO", MACHINE_NOT_WORKING ) -COMP( 199?, ficvipio2, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VIP-IO2", MACHINE_NOT_WORKING ) -COMP( 1995, ft486f55, ibm5170, 0, at486, 0, at_state, init_at, "Freetech", "486FT55", MACHINE_NOT_WORKING ) -COMP( 1991, ftsserv, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FTs (Scorpion)", MACHINE_NOT_WORKING ) -COMP( 199?, ga486am, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486AM/S", MACHINE_NOT_WORKING ) -COMP( 199?, ga486vf, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486VF", MACHINE_NOT_WORKING ) -COMP( 199?, ga486vs, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486VS", MACHINE_NOT_WORKING ) -COMP( 199?, gc10a, ibm5170, 0, at486, 0, at_state, init_at, "Eagle", "EAGLEN486 GC10A", MACHINE_NOT_WORKING ) -COMP( 199?, gete486vl, ibm5170, 0, at486, 0, at_state, init_at, "GENOA", "TurboExpress 486 VL", MACHINE_NOT_WORKING ) -COMP( 199?, gmb486sg, ibm5170, 0, at486, 0, at_state, init_at, "Gemlight", "GMB-486SG v2.2", MACHINE_NOT_WORKING ) -COMP( 199?, gmb486unp, ibm5170, 0, at486, 0, at_state, init_at, "Gemlight", "GMB-486UNP v2.1", MACHINE_NOT_WORKING ) -COMP( 199?, hot409, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-409", MACHINE_NOT_WORKING ) -COMP( 199?, hot419, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-419", MACHINE_NOT_WORKING ) -COMP( 199?, hot433, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-433", MACHINE_NOT_WORKING ) -COMP( 199?, ibm2133, ibm5170, 0, at486, 0, at_state, init_at, "International Business Machines", "PS/1 2133", MACHINE_NOT_WORKING ) -COMP( 199?, jakms41, ibm5170, 0, at486, 0, at_state, init_at, "Jamicon", "KM-S4-1 VER 1.1", MACHINE_NOT_WORKING ) -COMP( 199?, jwj403tg, ibm5170, 0, at486, 0, at_state, init_at, "Jetway", "J-403TG", MACHINE_NOT_WORKING ) -COMP( 199?, jwj446a, ibm5170, 0, at486, 0, at_state, init_at, "Jetway", "J-446A", MACHINE_NOT_WORKING ) -COMP( 1993, lion3500, ibm5170, 0, at486, 0, at_state, init_at, "Lion", "3500", MACHINE_NOT_WORKING ) -COMP( 199?, ls486e, ibm5170, 0, at486, 0, at_state, init_at, "LuckyStar", "LS-486E Rev:C", MACHINE_NOT_WORKING ) -COMP( 199?, lsucm486v30,ibm5170,0, at486, 0, at_state, init_at, "Lucky Star", "UCM-486V30", MACHINE_NOT_WORKING ) -COMP( 199?, mb1433aeap,ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433/50 AEA-P - V:1", MACHINE_NOT_WORKING ) -COMP( 199?, mb1433ucv, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433UCV", MACHINE_NOT_WORKING ) -COMP( 199?, mb1433uiv, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433UIV", MACHINE_NOT_WORKING ) -COMP( 199?, mb4d33, ibm5170, 0, at486, 0, at_state, init_at, "Aquarius System (ASI)", "MB-4D33/50NR", MACHINE_NOT_WORKING ) -COMP( 199?, mb8433uud, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB8433-UUD-A", MACHINE_NOT_WORKING ) // boots to Award BootBlock BIOS -COMP( 199?, mba029, ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "MBA-029", MACHINE_NOT_WORKING ) -COMP( 199?, md4duvc, ibm5170, 0, at486, 0, at_state, init_at, "Aquarius System (ASI)", "MD-4DUV VER:2.1", MACHINE_NOT_WORKING ) -COMP( 199?, mijx30gp, ibm5170, 0, at486, 0, at_state, init_at, "Micronics", "JX30GP, Motherboard P/N: 09-00189-10 REV B1", MACHINE_NOT_WORKING ) -COMP( 199?, ms4125, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4125", MACHINE_NOT_WORKING ) -COMP( 199?, ms4132, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4132 G VER:1", MACHINE_NOT_WORKING ) -COMP( 199?, ms4134, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4134", MACHINE_NOT_WORKING ) -COMP( 199?, ms4138, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4138", MACHINE_NOT_WORKING ) -COMP( 199?, ms4144, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4144", MACHINE_NOT_WORKING ) -COMP( 199?, ms4145, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4145", MACHINE_NOT_WORKING ) -COMP( 199?, nat48pv, ibm5170, 0, at486, 0, at_state, init_at, "", "NAT48PV-1.00 VL", MACHINE_NOT_WORKING ) -COMP( 199?, ncr3433, ibm5170, 0, at486, 0, at_state, init_at, "NCR", "Class 3433", MACHINE_NOT_WORKING ) -COMP( 199?, ochawk, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hawk", MACHINE_NOT_WORKING ) -COMP( 199?, ochipcom, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo COM", MACHINE_NOT_WORKING ) -COMP( 1994, ochipdca2, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo DCA2", MACHINE_NOT_WORKING ) -COMP( 199?, ochipvlp, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo VL+", MACHINE_NOT_WORKING ) -COMP( 199?, op82c392, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the OPTi OPTi 82C392, 82C493 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, pc70iii, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "PC 70-III", MACHINE_NOT_WORKING ) -COMP( 199?, pc9486, ibm5170, 0, at486, 0, at_state, init_at, "Amstrad", "PC9486", MACHINE_NOT_WORKING ) -COMP( 199?, pccm912, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M912", MACHINE_NOT_WORKING ) -COMP( 199?, pccm915i, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M915i", MACHINE_NOT_WORKING ) -COMP( 199?, pccm919, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M919", MACHINE_NOT_WORKING ) -COMP( 1993, pcd4nd, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4ND", MACHINE_NOT_WORKING ) -COMP( 1995, pcd4nl, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4NL", MACHINE_NOT_WORKING ) -COMP( 199?, pcd4x, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4H, PCD-4M", MACHINE_NOT_WORKING ) -COMP( 199?, pci48af, ibm5170, 0, at486, 0, at_state, init_at, "TMC Research Corporation", "PCI48AF", MACHINE_NOT_WORKING ) -COMP( 199?, pck486dx, ibm5170, 0, at486, 0, at_state, init_at, "Peacock", "PCK 486 DX", MACHINE_NOT_WORKING ) -COMP( 199?, pg750eisa, ibm5170, 0, at486, 0, at_state, init_at, "Siemens", "PG-750 486 EISA", MACHINE_NOT_WORKING ) -COMP( 199?, pkm0038s, ibm5170, 0, at486, 0, at_state, init_at, "DTK", "PKM-0038S aka Gemlight GMB-486SG", MACHINE_NOT_WORKING ) -COMP( 199?, pm486pu, ibm5170, 0, at486, 0, at_state, init_at, "PROTECH", "PM486PU-S7", MACHINE_NOT_WORKING ) -COMP( 199?, pt430, ibm5170, 0, at486, 0, at_state, init_at, "Pine Technology", "PT-430", MACHINE_NOT_WORKING ) -COMP( 199?, pt432b, ibm5170, 0, at486, 0, at_state, init_at, "Pine Technology", "PT-432b aka SR-M401-A", MACHINE_NOT_WORKING ) -COMP( 199?, ptmb457, ibm5170, 0, at486, 0, at_state, init_at, "PowerTech", "MB457", MACHINE_NOT_WORKING ) -COMP( 199?, pwaih4077c,ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "PWA-IH4077C", MACHINE_NOT_WORKING ) -COMP( 199?, pwaih4077d,ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "PWA-IH4077D", MACHINE_NOT_WORKING ) -COMP( 199?, px486p3, ibm5170, 0, at486, 0, at_state, init_at, "QDI", "PX486P3", MACHINE_NOT_WORKING ) -COMP( 1990, qi900, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot Qi 900 (Scorpion Motherboard)", MACHINE_NOT_WORKING ) -COMP( 199?, sis85c471, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the SiS 85C471/85C407 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, sis85c496, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the SiS 85C496/85C497 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, sm48650usc,ibm5170, 0, at486, 0, at_state, init_at, "Vintage Sprite", "SM 486-50USC", MACHINE_NOT_WORKING ) -COMP( 199?, so025d2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025D2", MACHINE_NOT_WORKING ) -COMP( 199?, so025k2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025K2", MACHINE_NOT_WORKING ) -COMP( 199?, so025r2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025R2", MACHINE_NOT_WORKING ) -COMP( 199?, so30h, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "30H", MACHINE_NOT_WORKING ) -COMP( 199?, so4saw2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "SY-4SAW2", MACHINE_NOT_WORKING ) -COMP( 199?, sto486wb, ibm5170, 0, at486, 0, at_state, init_at, "See-Thru", "Sto486Wb aka AUVA Cam-33-P2", MACHINE_NOT_WORKING ) -COMP( 199?, td4ipaio, ibm5170, 0, at486, 0, at_state, init_at, "", "TD-4IP-UMC-AIO", MACHINE_NOT_WORKING ) -COMP( 199?, tmpat48pg4,ibm5170, 0, at486, 0, at_state, init_at, "TMC", "PAT48PG4", MACHINE_NOT_WORKING ) -COMP( 199?, tmpat48av, ibm5170, 0, at486, 0, at_state, init_at, "TMC", "PAT48AV", MACHINE_NOT_WORKING ) -COMP( 199?, ts34t25, ibm5170, 0, at486, 0, at_state, init_at, "Highscreen", "486-25", MACHINE_NOT_WORKING ) -COMP( 199?, um486, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM486/UM486sx", MACHINE_NOT_WORKING ) -COMP( 199?, um486v, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM486V-AIO", MACHINE_NOT_WORKING ) -COMP( 199?, um8810paio,ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM8810 PAIO", MACHINE_NOT_WORKING ) -COMP( 199?, um8886, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UMC UM8886/UM8881 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, um8498f, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UMC UM8498F, UM8496F chipset", MACHINE_NOT_WORKING ) -COMP( 199?, uni4800, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UNI4800 chipset", MACHINE_NOT_WORKING ) -COMP( 199?, uniwb4407, ibm5170, 0, at486, 0, at_state, init_at, "UNICHIP", "486 WB 4407 REV 1.0", MACHINE_NOT_WORKING ) -COMP( 199?, v4p895p3, ibm5170, 0, at486, 0, at_state, init_at, "QDI", "V4P895P3/SMT V5.0", MACHINE_NOT_WORKING ) -COMP( 199?, via4386vio,ibm5170, 0, at486, 0, at_state, init_at, "", "Via 4386 VIO / Highscreen universal board", MACHINE_NOT_WORKING ) -COMP( 199?, zi4dvs, ibm5170, 0, at486, 0, at_state, init_at, "ZIDA", "4DVS", MACHINE_NOT_WORKING ) -COMP( 199?, zito4dps, ibm5170, 0, at486, 0, at_state, init_at, "ZIDA", "Tomato board 4DPS", MACHINE_NOT_WORKING ) diff --git a/src/mame/at/atpci.cpp b/src/mame/at/atpci.cpp deleted file mode 100644 index b879844dd7b..00000000000 --- a/src/mame/at/atpci.cpp +++ /dev/null @@ -1,263 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol, Miodrag Milanovic, Carl - -#include "emu.h" -#include "cpu/i386/i386.h" -#include "bus/isa/isa_cards.h" -#include "bus/lpci/pci.h" -#include "bus/lpci/i82371ab.h" -#include "bus/lpci/i82371sb.h" -#include "bus/lpci/i82439tx.h" -#include "machine/at.h" -#include "machine/fdc37c93x.h" -#include "machine/pckeybrd.h" - -class at586_state : public driver_device -{ -public: - at586_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - { } - - void at586x3(machine_config &config); - void at586(machine_config &config); - void at586m55(machine_config &config); - -protected: - void at_softlists(machine_config &config); - - void boot_state_w(uint8_t data); - - void tx_config(device_t *device); - void sb_config(device_t *device); - void superio_config(device_t *device); - - void at586_io(address_map &map); - void at586_map(address_map &map); - -private: - required_device m_maincpu; -}; - -void at586_state::boot_state_w(uint8_t data) -{ - logerror("Boot state %02x\n", data); - printf("[%02X]",data); -} - -void at586_state::tx_config(device_t *device) -{ - downcast(device)->set_cpu(m_maincpu); - downcast(device)->set_region("isa"); -} - -void at586_state::sb_config(device_t *device) -{ - i82371sb_device &sb = *downcast(device); - sb.set_cpu(m_maincpu); - sb.boot_state_hook().set(":", FUNC(at586_state::boot_state_w)); - sb.smi().set_inputline(m_maincpu, INPUT_LINE_SMI); -} - - -void at586_state::superio_config(device_t *device) -{ - fdc37c93x_device &fdc = *downcast(device); - fdc.set_sysopt_pin(1); - fdc.gp20_reset().set_inputline(m_maincpu, INPUT_LINE_RESET); - fdc.gp25_gatea20().set_inputline(m_maincpu, INPUT_LINE_A20); - fdc.irq1().set(":pcibus:7:i82371sb:pic8259_master", FUNC(pic8259_device::ir1_w)); -} - - -static void isa_internal_devices(device_slot_interface &device) -{ - device.option_add("fdc37c93x", FDC37C93X); -} - -static void pci_devices(device_slot_interface &device) -{ - device.option_add_internal("i82439tx", I82439TX_LEGACY); - device.option_add_internal("i82371ab", I82371AB); - device.option_add_internal("i82371sb", I82371SB); -} - -void at586_state::at586_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).bankrw("bank10"); - map(0x000a0000, 0x000bffff).noprw(); - map(0x00800000, 0x00800bff).ram().share("nvram"); - map(0xfffe0000, 0xffffffff).rom().region("isa", 0x20000); -} - -void at586_state::at586_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); -} - -void at586_state::at_softlists(machine_config &config) -{ - /* software lists */ - SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); - SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); - SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); - SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); - SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); -} - -void at586_state::at586(machine_config &config) -{ - pentium_device &maincpu(PENTIUM(config, m_maincpu, 60000000)); - maincpu.set_addrmap(AS_PROGRAM, &at586_state::at586_map); - maincpu.set_addrmap(AS_IO, &at586_state::at586_io); - maincpu.set_irq_acknowledge_callback("pcibus:1:i82371ab:pic8259_master", FUNC(pic8259_device::inta_cb)); - - RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); - - PCI_BUS(config, "pcibus", 0).set_busnum(0); - PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); - PCI_CONNECTOR(config, "pcibus:1", pci_devices, "i82371ab", true); - - // FIXME: determine ISA bus clock - ISA16_SLOT(config, "isa1", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); - - at_softlists(config); -} - -void at586_state::at586x3(machine_config &config) -{ - pentium_device &maincpu(PENTIUM(config, m_maincpu, 60000000)); - maincpu.set_addrmap(AS_PROGRAM, &at586_state::at586_map); - maincpu.set_addrmap(AS_IO, &at586_state::at586_io); - maincpu.smiact().set("pcibus:0:i82439tx", FUNC(i82439tx_device::smi_act_w)); - maincpu.set_irq_acknowledge_callback("pcibus:1:i82371sb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); - - PCI_BUS(config, "pcibus", 0).set_busnum(0); - PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); - PCI_CONNECTOR(config, "pcibus:1", pci_devices, "i82371sb", true).set_option_machine_config("i82371sb", [this](device_t *device) { sb_config(device); }); - - // FIXME: determine ISA bus clock - ISA16_SLOT(config, "isa1", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); - - at_softlists(config); -} - -static INPUT_PORTS_START(at586m55) -INPUT_PORTS_END - -void at586_state::at586m55(machine_config &config) -{ - pentium_device &pentium(PENTIUM(config, m_maincpu, 60000000)); - pentium.set_addrmap(AS_PROGRAM, &at586_state::at586_map); - pentium.set_addrmap(AS_IO, &at586_state::at586_io); - pentium.smiact().set("pcibus:0:i82439tx", FUNC(i82439tx_device::smi_act_w)); - pentium.set_irq_acknowledge_callback("pcibus:7:i82371sb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); - - PCI_BUS(config, "pcibus", 0).set_busnum(0); - PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); - PCI_CONNECTOR(config, "pcibus:7", pci_devices, "i82371sb", true).set_option_machine_config("i82371sb", [this](device_t *device) { sb_config(device); }); - - ISA16_SLOT(config, "board4", 0, "pcibus:7:i82371sb:isabus", isa_internal_devices, "fdc37c93x", true).set_option_machine_config("fdc37c93x", [this](device_t *device) { superio_config(device); }); - ISA16_SLOT(config, "isa1", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); - - at_softlists(config); -} - -ROM_START( at586 ) - ROM_REGION32_LE(0x40000, "isa", 0) - ROM_SYSTEM_BIOS(0, "sptx", "SP-586TX") - ROMX_LOAD("sp586tx.bin", 0x20000, 0x20000, CRC(1003d72c) SHA1(ec9224ff9b0fdfd6e462cb7bbf419875414739d6), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "unisys", "Unisys 586") // probably bad dump due to need of hack in i82439tx to work - ROMX_LOAD("at586.bin", 0x20000, 0x20000, CRC(717037f5) SHA1(1d49d1b7a4a40d07d1a897b7f8c827754d76f824), ROM_BIOS(1)) - - ROM_SYSTEM_BIOS(2, "ga586t2", "Gigabyte GA-586T2") // ITE 8679 I/O - ROMX_LOAD("gb_ga586t2.bin", 0x20000, 0x20000, CRC(3a50a6e1) SHA1(dea859b4f1492d0d08aacd260ed1e83e00ebac08), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "5tx52", "Acorp 5TX52") // W83877TF I/O - ROMX_LOAD("acorp_5tx52.bin", 0x20000, 0x20000, CRC(04d69419) SHA1(983377674fef05e710c8665c14cc348c99166fb6), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "txp4", "ASUS TXP4") // W83977TF-A I/O - ROMX_LOAD("asus_txp4.bin", 0x20000, 0x20000, CRC(a1321bb1) SHA1(92e5f14d8505119f85b148a63510617ac12bcdf3), ROM_BIOS(4)) -ROM_END - -// Elitegroup SI5PI AIO Rev. 1.1 - Chipset: SiS 85C501, 85C502, 85C502, FDC37C666GT, UM82C865F, PCI0640B - CPU: Socket 4 - RAM: 4xSIMM72, Cache: 18x32pin -// BIOS: Award 32pin - Keyboard-BIOS: AMIKEY-2 - ISA16: 4, PCI: 4 - On board: 2xISA, 2xser, Floppy, par -ROM_START( ecssi5pi ) - ROM_REGION32_LE(0x40000, "isa", 0) - // BIOS-String: 11/17/94-SiS-501-503-2A5IAE11-00 / SI5PI AIO 11/18/94 - ROM_SYSTEM_BIOS(0, "111894", "11/18/94") - ROMX_LOAD("si5piaio11_isa_pci_bios_013908435.bin", 0x20000, 0x20000, CRC(c39aa47c) SHA1(6b31bdc5441c5f7a29d0ceb8989ccfed92c49900), ROM_BIOS(0)) - // BIOS-String: 12/02/94-SiS-501-503-2A5IAE11-00 / SI5PI AIO 12/02/94 - ROM_SYSTEM_BIOS(1, "120294", "12/02/94") - ROMX_LOAD("si5piaio.bin", 0x20000, 0x20000, CRC(9dfb8510) SHA1(b86cc1930dc78db3c4c9d1ed13ec60b2333db7d1), ROM_BIOS(1)) -ROM_END - - -ROM_START(at586x3) - ROM_REGION32_LE(0x40000, "isa", 0) - ROM_SYSTEM_BIOS(0, "5hx29", "5HX29") - ROMX_LOAD("5hx29.bin", 0x20000, 0x20000, CRC(07719a55) SHA1(b63993fd5186cdb4f28c117428a507cd069e1f68), ROM_BIOS(0)) - - ROM_SYSTEM_BIOS(1, "n7ns04", "Version 21/01/98, without integrated sound") // Micronics M7S-HI with SMSC FDC37C93X I/O - ROMX_LOAD("m7ns04.rom", 0x00000, 0x40000, CRC(9c1f656b) SHA1(f4a0a522d8c47b6ddb6c01fe9a34ddf5b1977f8d), ROM_BIOS(1)) - - ROM_SYSTEM_BIOS(2, "n7s04", "Version 21/01/98, with integrated sound") - ROMX_LOAD("m7s04.rom", 0x00000, 0x40000, CRC(3689f5a9) SHA1(8daacdb0dc6783d2161680564ffe83ac2515f7ef), ROM_BIOS(2)) - - ROM_SYSTEM_BIOS(3, "m7shi03", "m7shi03") // Micronics M7S-Hi - ROMX_LOAD("m7shi03.snd", 0x00000, 0x40000, CRC(3a35a939) SHA1(74af69eb5ca546b0960540e7c3ea62a532157f2a), ROM_BIOS(3)) -ROM_END - -/* FIC VT-503 (Intel TX chipset, ITE 8679 Super I/O) */ -ROM_START( ficvt503 ) - ROM_REGION32_LE(0x40000, "isa", 0) - ROM_SYSTEM_BIOS(0, "109gi13", "1.09GI13") /* 1997-10-02 */ - ROMX_LOAD("109gi13.bin", 0x20000, 0x20000, CRC(0c32af48) SHA1(2cce40a98598f1ed1f398975f7a90c8be4200667), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "109gi14", "1.09GI14") /* 1997-11-07 */ - ROMX_LOAD("109gi14.awd", 0x20000, 0x20000, CRC(588c5cc8) SHA1(710e5405850fd975b362a422bfe9bc6d6c9a36cd), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "109gi15", "1.09GI15") /* 1997-11-07 */ - ROMX_LOAD("109gi15.awd", 0x20000, 0x20000, CRC(649a3481) SHA1(e681c6ab55a67cec5978dfffa75fcddc2aa0de4d), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "109gi16", "1.09GI16") /* 2000-03-23 */ - ROMX_LOAD("109gi16.bin", 0x20000, 0x20000, CRC(a928f271) SHA1(127a83a60752cc33b3ca49774488e511ec7bac55), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "115gk140", "1.15GK140") /* 1999-03-03 */ - ROMX_LOAD("115gk140.awd", 0x20000, 0x20000, CRC(65e88956) SHA1(f94bb0732e00b5b0f18f4e349db24a289f8379c5), ROM_BIOS(4)) -ROM_END - -/* Micronics M55Hi-Plus (Intel 430HX chipset, SMSC FDC37C93X Super I/O) */ -ROM_START(m55hipl) - ROM_REGION32_LE(0x40000, "isa", 0) - ROM_SYSTEM_BIOS(0, "m55ns04", "m55ns04") // Micronics M55HI-Plus with no sound - ROMX_LOAD("m55-04ns.rom", 0x20000, 0x20000, CRC(0116b2b0) SHA1(19b0203decfd4396695334517488d488aec3ccde), ROM_BIOS(0)) - - ROM_SYSTEM_BIOS(1, "m55s04", "m55s04") // with sound - ROMX_LOAD("m55-04s.rom", 0x20000, 0x20000, CRC(34a7422e) SHA1(68753fe373c97844beff83ea75c634c77cfedb8f), ROM_BIOS(1)) - - ROM_SYSTEM_BIOS(2, "m55ns03", "m55ns03") // Micronics M55HI-Plus with no sound - ROMX_LOAD("m55ns03.rom", 0x20000, 0x20000, CRC(6a3deb49) SHA1(78bfc20e0f8699f4d153d241a757153afcde3efb), ROM_BIOS(2)) - - ROM_SYSTEM_BIOS(3, "m55hi03", "m55hi03") // with sound - ROMX_LOAD("m55hi03.rom", 0x20000, 0x20000, CRC(bd476200) SHA1(7633ba27819ad45c6253abb728b1ef0c49229743), ROM_BIOS(3)) -ROM_END - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1990, at586, ibm5170, 0, at586, 0, at586_state, empty_init, "", "PC/AT 586 (PIIX4)", MACHINE_NOT_WORKING ) -COMP( 1990, at586x3, ibm5170, 0, at586x3, 0, at586_state, empty_init, "", "PC/AT 586 (PIIX3)", MACHINE_NOT_WORKING ) -COMP( 1997, ficvt503, ibm5170, 0, at586, 0, at586_state, empty_init, "FIC", "VT-503", MACHINE_NOT_WORKING ) -COMP( 1990, m55hipl, ibm5170, 0, at586m55, at586m55, at586_state, empty_init, "Micronics", "M55Hi-Plus", MACHINE_NOT_WORKING ) -COMP( 199?, ecssi5pi, ibm5170, 0, at586, 0, at586_state, empty_init, "Elitegroup","SI5PI AIO", MACHINE_NOT_WORKING ) diff --git a/src/mame/at/ct486.cpp b/src/mame/at/ct486.cpp deleted file mode 100644 index 23a4b1dc811..00000000000 --- a/src/mame/at/ct486.cpp +++ /dev/null @@ -1,210 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Dirk Best -/*************************************************************************** - - PC/AT 486 with Chips & Technologies CS4031 chipset - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/i386/i386.h" -#include "machine/at_keybc.h" -#include "machine/cs4031.h" -#include "machine/ram.h" -#include "sound/spkrdev.h" - -#include "bus/isa/isa.h" -#include "bus/isa/isa_cards.h" -#include "bus/pc_kbd/keyboards.h" -#include "bus/pc_kbd/pc_kbdc.h" - -#include "emupal.h" -#include "softlist.h" -#include "softlist_dev.h" -#include "speaker.h" - - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -class ct486_state : public driver_device -{ -public: - ct486_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_cs4031(*this, "cs4031"), - m_isabus(*this, "isabus"), - m_speaker(*this, "speaker") - { } - - required_device m_maincpu; - required_device m_cs4031; - required_device m_isabus; - required_device m_speaker; - - virtual void machine_start() override; - - uint16_t cs4031_ior(offs_t offset); - void cs4031_iow(offs_t offset, uint16_t data); - DECLARE_WRITE_LINE_MEMBER( cs4031_hold ); - void cs4031_tc(offs_t offset, uint8_t data) { m_isabus->eop_w(offset, data); } - DECLARE_WRITE_LINE_MEMBER( cs4031_spkr ) { m_speaker->level_w(state); } - void ct486(machine_config &config); - void ct486_io(address_map &map); - void ct486_map(address_map &map); -}; - - -//************************************************************************** -// MACHINE EMULATION -//************************************************************************** - -void ct486_state::machine_start() -{ -} - -uint16_t ct486_state::cs4031_ior(offs_t offset) -{ - if (offset < 4) - return m_isabus->dack_r(offset); - else - return m_isabus->dack16_r(offset); -} - -void ct486_state::cs4031_iow(offs_t offset, uint16_t data) -{ - if (offset < 4) - m_isabus->dack_w(offset, data); - else - m_isabus->dack16_w(offset, data); -} - -WRITE_LINE_MEMBER( ct486_state::cs4031_hold ) -{ - // halt cpu - m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); - - // and acknowledge hold - m_cs4031->hlda_w(state); -} - - -//************************************************************************** -// ADDRESS MAPS -//************************************************************************** - -void ct486_state::ct486_map(address_map &map) -{ -} - -void ct486_state::ct486_io(address_map &map) -{ - map.unmap_value_high(); -} - - -//************************************************************************** -// MACHINE DRIVERS -//************************************************************************** - -void ct486_state::ct486(machine_config &config) -{ - I486(config, m_maincpu, XTAL(25'000'000)); - m_maincpu->set_addrmap(AS_PROGRAM, &ct486_state::ct486_map); - m_maincpu->set_addrmap(AS_IO, &ct486_state::ct486_io); - m_maincpu->set_irq_acknowledge_callback("cs4031", FUNC(cs4031_device::int_ack_r)); - - CS4031(config, m_cs4031, XTAL(25'000'000), "maincpu", "isa", "bios", "keybc", RAM_TAG); - // cpu connections - m_cs4031->hold().set(FUNC(ct486_state::cs4031_hold)); - m_cs4031->nmi().set_inputline("maincpu", INPUT_LINE_NMI); - m_cs4031->intr().set_inputline("maincpu", INPUT_LINE_IRQ0); - m_cs4031->cpureset().set_inputline("maincpu", INPUT_LINE_RESET); - m_cs4031->a20m().set_inputline("maincpu", INPUT_LINE_A20); - // isa dma - m_cs4031->ior().set(FUNC(ct486_state::cs4031_ior)); - m_cs4031->iow().set(FUNC(ct486_state::cs4031_iow)); - m_cs4031->tc().set(FUNC(ct486_state::cs4031_tc)); - // speaker - m_cs4031->spkr().set(FUNC(ct486_state::cs4031_spkr)); - - RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M"); - - at_kbc_device_base &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", XTAL(12'000'000))); - keybc.hot_res().set("cs4031", FUNC(cs4031_device::kbrst_w)); - keybc.gate_a20().set("cs4031", FUNC(cs4031_device::gatea20_w)); - keybc.kbd_irq().set("cs4031", FUNC(cs4031_device::irq01_w)); - keybc.kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - keybc.kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - pc_kbdc.out_clock_cb().set(keybc, FUNC(at_kbc_device_base::kbd_clk_w)); - pc_kbdc.out_data_cb().set(keybc, FUNC(at_kbc_device_base::kbd_data_w)); - - ISA16(config, m_isabus, 0); - m_isabus->set_memspace(m_maincpu, AS_PROGRAM); - m_isabus->set_iospace(m_maincpu, AS_IO); - m_isabus->iochck_callback().set(m_cs4031, FUNC(cs4031_device::iochck_w)); - m_isabus->irq2_callback().set(m_cs4031, FUNC(cs4031_device::irq09_w)); - m_isabus->irq3_callback().set(m_cs4031, FUNC(cs4031_device::irq03_w)); - m_isabus->irq4_callback().set(m_cs4031, FUNC(cs4031_device::irq04_w)); - m_isabus->irq5_callback().set(m_cs4031, FUNC(cs4031_device::irq05_w)); - m_isabus->irq6_callback().set(m_cs4031, FUNC(cs4031_device::irq06_w)); - m_isabus->irq7_callback().set(m_cs4031, FUNC(cs4031_device::irq07_w)); - m_isabus->irq10_callback().set(m_cs4031, FUNC(cs4031_device::irq10_w)); - m_isabus->irq11_callback().set(m_cs4031, FUNC(cs4031_device::irq11_w)); - m_isabus->irq12_callback().set(m_cs4031, FUNC(cs4031_device::irq12_w)); - m_isabus->irq14_callback().set(m_cs4031, FUNC(cs4031_device::irq14_w)); - m_isabus->irq15_callback().set(m_cs4031, FUNC(cs4031_device::irq15_w)); - m_isabus->drq0_callback().set(m_cs4031, FUNC(cs4031_device::dreq0_w)); - m_isabus->drq1_callback().set(m_cs4031, FUNC(cs4031_device::dreq1_w)); - m_isabus->drq2_callback().set(m_cs4031, FUNC(cs4031_device::dreq2_w)); - m_isabus->drq3_callback().set(m_cs4031, FUNC(cs4031_device::dreq3_w)); - m_isabus->drq5_callback().set(m_cs4031, FUNC(cs4031_device::dreq5_w)); - m_isabus->drq6_callback().set(m_cs4031, FUNC(cs4031_device::dreq6_w)); - m_isabus->drq7_callback().set(m_cs4031, FUNC(cs4031_device::dreq7_w)); - ISA16_SLOT(config, "board1", 0, "isabus", pc_isa16_cards, "fdcsmc", true); - ISA16_SLOT(config, "board2", 0, "isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "isabus", pc_isa16_cards, "lpt", true); - ISA16_SLOT(config, "isa1", 0, "isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "isabus", pc_isa16_cards, nullptr, false); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); - - // video hardware - PALETTE(config, "palette").set_entries(256); // todo: really needed? - - /* software lists */ - SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); - SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); - SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); - SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); - SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); -} - - -//************************************************************************** -// ROM DEFINITIONS -//************************************************************************** - -ROM_START( ct486 ) - ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) - ROM_REGION(0x100000, "bios", 0) - ROM_LOAD("chips_1.ami", 0xf0000, 0x10000, CRC(a14a7511) SHA1(b88d09be66905ed2deddc26a6f8522e7d2d6f9a8)) -ROM_END - - -//************************************************************************** -// GAME DRIVERS -//************************************************************************** - -COMP( 1993, ct486, 0, 0, ct486, 0, ct486_state, empty_init, "", "PC/AT 486 with CS4031 chipset", 0 ) diff --git a/src/mame/at/ps2.cpp b/src/mame/at/ps2.cpp deleted file mode 100644 index fa5696aacb1..00000000000 --- a/src/mame/at/ps2.cpp +++ /dev/null @@ -1,301 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol, Miodrag Milanovic, Carl - -#include "emu.h" -#include "cpu/i86/i286.h" -#include "cpu/i386/i386.h" -#include "machine/at.h" -#include "machine/ram.h" -#include "bus/isa/isa_cards.h" -#include "bus/pc_kbd/keyboards.h" -#include "bus/pc_kbd/pc_kbdc.h" -#include "softlist_dev.h" - -// According to http://nerdlypleasures.blogspot.com/2014/04/the-original-8-bit-ide-interface.html -// the IBM PS/2 Model 25-286 and Model 30-286 use a customised version of the XTA (8-bit IDE) harddisk interface - -class ps2_state : public driver_device -{ -public: - ps2_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_mb(*this, "mb"), - m_ram(*this, RAM_TAG) - { } - required_device m_maincpu; - required_device m_mb; - required_device m_ram; - - void ps2m30286(machine_config &config); - void ps2386(machine_config &config); - void ps2386sx(machine_config &config); - void at_softlists(machine_config &config); - void ps2_16_io(address_map &map); - void ps2_16_map(address_map &map); - void ps2_32_io(address_map &map); - void ps2_32_map(address_map &map); -protected: - void machine_start() override; -}; - -void ps2_state::at_softlists(machine_config &config) -{ - /* software lists */ - SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); - SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); - SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); - SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); - SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); -} - -void ps2_state::ps2_16_map(address_map &map) -{ - map.unmap_value_high(); - map(0x000000, 0x09ffff).bankrw("bank10"); - map(0x0e0000, 0x0fffff).rom().region("bios", 0); - map(0xfe0000, 0xffffff).rom().region("bios", 0); -} - -void ps2_state::ps2_32_map(address_map &map) -{ - map.unmap_value_high(); - map(0x00000000, 0x0009ffff).bankrw("bank10"); - map(0x000e0000, 0x000fffff).rom().region("bios", 0); - map(0xfffe0000, 0xffffffff).rom().region("bios", 0); -} - -void ps2_state::ps2_16_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); -} - -void ps2_state::ps2_32_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); -} - -void ps2_state::machine_start() -{ - address_space& space = m_maincpu->space(AS_PROGRAM); - - /* managed RAM */ - membank("bank10")->set_base(m_ram->pointer()); - - if (m_ram->size() > 0xa0000) - { - offs_t ram_limit = 0x100000 + m_ram->size() - 0xa0000; - space.install_ram(0x100000, ram_limit - 1, m_ram->pointer() + 0xa0000); - } -} - -void ps2_state::ps2m30286(machine_config &config) -{ - /* basic machine hardware */ - i80286_cpu_device &maincpu(I80286(config, m_maincpu, 10000000)); - maincpu.set_addrmap(AS_PROGRAM, &ps2_state::ps2_16_map); - maincpu.set_addrmap(AS_IO, &ps2_state::ps2_16_io); - maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); - - AT_MB(config, m_mb); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - - at_softlists(config); - - // FIXME: determine ISA bus clock - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "vga", true); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "fdc", false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, "ide", false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, "comat", false); - - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); - kbd.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - kbd.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, RAM_TAG).set_default_size("1664K").set_extra_options("2M,4M,8M,15M"); -} - -void ps2_state::ps2386(machine_config &config) -{ - I386(config, m_maincpu, 12000000); - m_maincpu->set_addrmap(AS_PROGRAM, &ps2_state::ps2_32_map); - m_maincpu->set_addrmap(AS_IO, &ps2_state::ps2_32_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); - - AT_MB(config, m_mb); - m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - config.set_maximum_quantum(attotime::from_hz(60)); - at_softlists(config); - - // on board devices - ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock - ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); - ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); - ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); - // ISA cards - ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); - ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); - - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); - kbd.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); - kbd.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); - - /* internal ram */ - RAM(config, RAM_TAG).set_default_size("1664K").set_extra_options("2M,4M,8M,15M,16M,32M,64M,128M,256M"); -} - -void ps2_state::ps2386sx(machine_config &config) -{ - ps2386(config); - I386SX(config.replace(), m_maincpu, 12000000); - m_maincpu->set_addrmap(AS_PROGRAM, &ps2_state::ps2_16_map); - m_maincpu->set_addrmap(AS_IO, &ps2_state::ps2_16_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); -} - -ROM_START( i8530286 ) - ROM_REGION16_LE(0x20000, "bios", 0) - // saved from running machine - ROM_LOAD16_BYTE("ps2m30.0", 0x00000, 0x10000, CRC(9965a634) SHA1(c237b1760f8a4561ec47dc70fe2e9df664e56596)) - ROM_LOAD16_BYTE("ps2m30.1", 0x00001, 0x10000, CRC(1448d3cb) SHA1(13fa26d895ce084278cd5ab1208fc16c80115ebe)) -ROM_END - -/* - -8530-H31 (Model 30/286) -====================== - P/N Date -33F5381A EC C01446 1990 - -*/ -ROM_START( i8530h31 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD( "33f5381a.bin", 0x00000, 0x20000, CRC(ff57057d) SHA1(d7f1777077a8df43c3c14d175b9709bd3969c4b1)) -ROM_END - -/* -8535-043 (Model 35SX) -=================== - P/N Checksum Date -04G2021 C26C 1991 ODD -04G2022 9B94 1991 EVEN -*/ -ROM_START( i8535043 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "04g2021.bin", 0x00001, 0x10000, CRC(4069b2eb) SHA1(9855c84c81d1f07e1da66b1ca45c1c10c0717a90)) - ROM_LOAD16_BYTE( "04g2022.bin", 0x00000, 0x10000, CRC(35c1af65) SHA1(7d2445cc463969c808fdd78e0a27a03db5dfc698)) -ROM_END - -/* -8550-021 (Model 50) -=================== - Code Date Internal -90X7420 4/12/87 --> 90X6815 -90X7423 8/12/87 --> 90X6816 -90X7426 8/12/87 --> 90X6817 -90X7429 18/12/87 --> 90X6818 - -Same ROMs used by : (According to http://www.ibmmuseum.com/ohlandl/8565/8560.html) - -IBM Personal System/2 Model 60 (8560-041 and 8560-071) -IBM Personal System/2 Model 65 SX (8565-061 and 8565-121) - -*/ -ROM_START( i8550021 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "90x7423.zm14", 0x00000, 0x8000, CRC(2c1633e0) SHA1(1af7faa526585a7cfb69e71d90a75e1f1c541586)) - ROM_LOAD16_BYTE( "90x7426.zm16", 0x00001, 0x8000, CRC(e7c762ce) SHA1(228f67dc915d84519da7fc1a59b7f9254278f3a0)) - ROM_LOAD16_BYTE( "90x7420.zm13", 0x10000, 0x8000, CRC(19a57cc1) SHA1(5b31ba66cd3690e651a450619a32b7210769945d)) - ROM_LOAD16_BYTE( "90x7429.zm18", 0x10001, 0x8000, CRC(6f0120f6) SHA1(e112c291ac3d9f6507c93ac49ad26f9fd2245fd2)) - - ROM_REGION( 0x800, "keyboard", 0 ) - ROM_LOAD( "72x8455.zm82", 0x000, 0x800, CRC(7da223d3) SHA1(54c52ff6c6a2310f79b2c7e6d1259be9de868f0e) ) -ROM_END - -/* -8550-061 (Model 50Z) -=================== - P/N Date -AMI 8935MKN 15F8365 S63512 1988 -AMI 8948MML 15F8366 S63512 1988 - -http://ps-2.kev009.com:8081/ohlandl/8550/8550z_Planar.html - - -*/ -ROM_START( i8550061 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "15f8365.zm5", 0x00001, 0x10000, CRC(35aa3ecf) SHA1(a122531092a9cb08600b276da9c9c3ce385aab7b)) - ROM_LOAD16_BYTE( "15f8366.zm6", 0x00000, 0x10000, CRC(11bf564d) SHA1(0dda6a7ca9294cfaab5bdf4c05973be13b2766fc)) -ROM_END - -/* -8555-X61 (Model 55SX) -=================== - Code Date Internal -ODD 33F8145 13/03/90 --> 33F8153 -EVEN 33F8146 31/01/90 --> 33F8152 - -8555-081 (Model 55SX) -=================== - Code Date Internal -ODD AMI 9205MEN 92F0627 EC32680 88 --> 33F8153 -EVEN AMI 9203MGS 92F0626 EC32680 88 --> 33F8152 - -*/ -ROM_START( i8555081 ) - ROM_REGION16_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE("33f8145.zm40", 0x00001, 0x10000, CRC(0895894c) SHA1(7cee77828867ad1bdbe0ac223bc25d23c65b28a0)) - ROM_LOAD16_BYTE("33f8146.zm41", 0x00000, 0x10000, CRC(c6020680) SHA1(b25a64e4b2dca07c567648401100e04e89bbcddb)) -ROM_END - -/* -8580-071 (Model 80) -=================== - Code Date Internal -AMI 8924MBW 90X8548 1987 --> 72X7551 -AMI 8924MBL 90X8549 1987 --> 72X7554 -AMI 8924MBG 90X8550 1987 --> 72X7557 -AMI 8921MBK 90X8551 1987 --> 72X7560 -*/ -ROM_START( i8580071 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD32_BYTE( "90x8548.bin", 0x00000, 0x8000, CRC(1f13eea5) SHA1(0bf53ad86f47db3825a713ea2e4ef23715cc4f79)) - ROM_LOAD32_BYTE( "90x8549.bin", 0x00001, 0x8000, CRC(9e0f4a99) SHA1(b8600f04159ed281a57416274390ba9302be541b)) - ROM_LOAD32_BYTE( "90x8550.bin", 0x00002, 0x8000, CRC(cb21df96) SHA1(0c2765f6becfa3f9171c4f13f7b74d19c4c9acc2)) - ROM_LOAD32_BYTE( "90x8551.bin", 0x00003, 0x8000, CRC(3d7e9868) SHA1(2928fe0e48a573cc2c0c41bd7f7188a54a908229)) -ROM_END - -/* -8580-111 (Model 80) -=================== - Code Date Internal -AMI 8934MDL 15F6637 1987 --> 15F6597 -AMI 8944MDI 15F6639 1987 --> 15F6600 -*/ -ROM_START( i8580111 ) - ROM_REGION32_LE(0x20000, "bios", 0) - ROM_LOAD16_BYTE( "15f6637.bin", 0x00000, 0x10000, CRC(76c36d1a) SHA1(c68d52a2e5fbd303225ebb006f91869b29ef700a)) - ROM_LOAD16_BYTE( "15f6639.bin", 0x00001, 0x10000, CRC(82cf0f7d) SHA1(13bb39225757b89749af70e881af0228673dbe0c)) -ROM_END - -COMP( 1990, i8530h31, 0, ibm5170, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8530-H31 (Model 30/286)", MACHINE_NOT_WORKING ) -COMP( 1988, i8530286, i8530h31, 0, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 Model 30-286", MACHINE_NOT_WORKING ) -COMP( 198?, i8535043, 0, ibm5170, ps2386sx, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8535-043 (Model 35SX)", MACHINE_NOT_WORKING ) -COMP( 198?, i8550021, i8550061, 0, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8550-021 (Model 50)", MACHINE_NOT_WORKING ) -COMP( 198?, i8550061, 0, ibm5170, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8550-061 (Model 50Z)", MACHINE_NOT_WORKING ) -COMP( 1989, i8555081, 0, ibm5170, ps2386sx, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8555-081 (Model 55SX)", MACHINE_NOT_WORKING ) -COMP( 198?, i8580071, 0, ibm5170, ps2386, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8580-071 (Model 80)", MACHINE_NOT_WORKING ) -COMP( 198?, i8580111, 0, ibm5170, ps2386, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8580-111 (Model 80)", MACHINE_NOT_WORKING ) diff --git a/src/mame/chess/README.md b/src/mame/chess/README.md new file mode 100644 index 00000000000..bf53b940518 --- /dev/null +++ b/src/mame/chess/README.md @@ -0,0 +1,3 @@ +# **src/mame/chess** # + +Generic folder for chesscomputer drivers, where the number of drivers is too small to place them in specific company folders. \ No newline at end of file diff --git a/src/mame/chess/ave_arb.cpp b/src/mame/chess/ave_arb.cpp new file mode 100644 index 00000000000..0a15c61933c --- /dev/null +++ b/src/mame/chess/ave_arb.cpp @@ -0,0 +1,365 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + +AVE Micro Systems ARB chess computer driver, in some regions redistributed +by Chafitz, and in Germany by Sandy Electronic. + +Auto Response Board (ARB) overview: +- R6502P CPU @ 2MHz(4MHz XTAL), R6522P VIA +- 2KB RAM(4*2114), cartridge port +- magnetic chessboard, 8*8+12 leds +- PCB label AV001C01 REV A + +The electronic magnetic chessboard is the first of its kind. AVE later licensed +it to Fidelity (see fidel_elite.cpp). +ARB is a romless system, the program ROM is on a cartridge. + +Known chess modules (*denotes not dumped yet): +- Sargon 2.5 +- *Grand Master Series 3 +- *Grand Master Series 3.5 +- Grand Master Series 4.0 + +Other games: +- Avelan (checkers) + +Newer modules included button label stickers for OPTIONS, Verify, Take Back, Clear. + +Around 2012, Steve Braid(aka Trilobyte/Steve UK) started manufacturing ARB V2 boards +without a module slot. CPU and VIA were replaced with new WDC 14MHz-rated chips, +running at 16MHz. + +TODO: +- verify gms40 module memory layout +- gms40 and avelan rom labels + +******************************************************************************/ + +#include "emu.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "cpu/m6502/m6502.h" +#include "cpu/m6502/w65c02s.h" +#include "video/pwm.h" +#include "machine/sensorboard.h" +#include "machine/6522via.h" +#include "machine/nvram.h" +#include "sound/dac.h" + +#include "speaker.h" +#include "softlist_dev.h" + +// internal artwork +#include "ave_arb.lh" // clickable + + +namespace { + +class arb_state : public driver_device +{ +public: + arb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), + m_via(*this, "via"), + m_extram(*this, "extram", 0x800, ENDIANNESS_LITTLE), + m_dac(*this, "dac"), + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) + { } + + // halt button is tied to NMI, reset button to RESET(but only if halt button is held) + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { update_reset(); } + DECLARE_INPUT_CHANGED_MEMBER(halt_button) { m_maincpu->set_input_line(M6502_NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE); update_reset(); } + void update_reset(); + + // machine configs + void arb(machine_config &config); + void v2(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_board; + required_device m_via; + memory_share_creator m_extram; + required_device m_dac; + optional_device m_cart; + required_ioport_array<2> m_inputs; + + // address maps + void main_map(address_map &map); + void v2_map(address_map &map); + + // sensorboard + void init_board(int state); + bool m_altboard = false; + + // cartridge + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u8 cartridge_r(offs_t offset); + u32 m_cart_mask; + + // I/O handlers + void update_display(); + void leds_w(u8 data); + void control_w(u8 data); + u8 input_r(); + + u16 m_inp_mux = 0; + u16 m_led_select = 0; + u8 m_led_group = 0; + u8 m_led_latch = 0; + u16 m_led_data = 0; +}; + +void arb_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_led_group)); + save_item(NAME(m_led_latch)); + save_item(NAME(m_led_data)); +} + +void arb_state::update_reset() +{ + bool state = m_inputs[1]->read() == 3; + + // RESET goes to 6502+6522 + m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); + if (state) + m_via->reset(); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +// sensorboard + +void arb_state::init_board(int state) +{ + // different board setup for checkers + if (m_altboard) + for (int i = 0; i < 12; i++) + { + m_board->write_piece((i % 4) * 2 + ((i / 4) & 1), i / 4, 13); // white + m_board->write_piece((i % 4) * 2 + (~(i / 4) & 1), i / 4 + 5, 14); // black + } + else + m_board->preset_chess(state); +} + + +// cartridge + +DEVICE_IMAGE_LOAD_MEMBER(arb_state::cart_load) +{ + u32 size = m_cart->common_get_size("rom"); + m_cart_mask = ((1 << (31 - count_leading_zeros_32(size))) - 1) & 0x7fff; + + m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); + + // extra ram (optional) + if (image.get_feature("ram")) + m_maincpu->space(AS_PROGRAM).install_ram(0x0800, 0x0fff, 0x1000, m_extram); + + m_altboard = bool(image.get_feature("altboard")); + + return image_init_result::PASS; +} + +u8 arb_state::cartridge_r(offs_t offset) +{ + return m_cart->read_rom(offset & m_cart_mask); +} + + +// R6522 ports + +void arb_state::update_display() +{ + // 12 led column data lines via 3 7475 + u16 mask = 0; + mask |= (m_led_group & 1) ? 0xf00 : 0; + mask |= (m_led_group & 2) ? 0x0ff : 0; + + m_led_data = (m_led_data & ~mask) | ((m_led_latch << 8 | m_led_latch) & mask); + m_display->matrix(m_led_select | 0x200, m_led_data); +} + +void arb_state::leds_w(u8 data) +{ + // PA0-PA7: led latch input + m_led_latch = ~data & 0xff; + update_display(); +} + +void arb_state::control_w(u8 data) +{ + // PB0-PB3: 74145 A-D + // 74145 0-8: input mux, led row select + m_inp_mux = data & 0xf; + m_led_select = 1 << (data & 0xf) & 0x1ff; + + // PB4,PB5: led group select + m_led_group = data >> 4 & 3; + update_display(); + + // PB7: speaker out + m_dac->write(BIT(data, 7)); +} + +u8 arb_state::input_r() +{ + u8 data = 0; + + // PA0-PA7: multiplexed inputs + if (m_inp_mux < 8) + data = m_board->read_file(m_inp_mux); + else if (m_inp_mux < 9) + data = m_inputs[m_inp_mux - 8]->read(); + + return ~data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void arb_state::main_map(address_map &map) +{ + // external slot is A0-A14, potential bus conflict with RAM/VIA + map(0x0000, 0x7fff).mirror(0x8000).r(FUNC(arb_state::cartridge_r)); + map(0x0000, 0x07ff).mirror(0x1000).ram().share("nvram"); + map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); +} + +void arb_state::v2_map(address_map &map) +{ + map(0x0000, 0x7fff).ram().share("nvram"); // BS62LV256 + map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); + map(0xa000, 0xffff).rom(); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( arb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_7) PORT_NAME("Hint / Black") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_6) PORT_NAME("Variable / Clear / White / 6") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_5) PORT_NAME("Monitor / Take Back / King / 5") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_4) PORT_NAME("Self Play / Verify / Queen / 4") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_3) PORT_NAME("Change Board / Rook / 3") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_NAME("Change Color / Bishop / 2") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_1) PORT_NAME("Change Level / Knight / 1") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_0) PORT_NAME("New Game / Options / Pawn / 0") + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, reset_button, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_F1) PORT_NAME("Halt") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, halt_button, 0) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void arb_state::v2(machine_config &config) +{ + /* basic machine hardware */ + W65C02S(config, m_maincpu, 16_MHz_XTAL); // W65C02S6TPG-14 + m_maincpu->set_addrmap(AS_PROGRAM, &arb_state::v2_map); + + W65C22S(config, m_via, 16_MHz_XTAL); // W65C22S6TPG-14 + m_via->writepa_handler().set(FUNC(arb_state::leds_w)); + m_via->writepb_handler().set(FUNC(arb_state::control_w)); + m_via->readpa_handler().set(FUNC(arb_state::input_r)); + m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); + m_board->init_cb().set(FUNC(arb_state::init_board)); + m_board->set_spawnpoints(12+2); // +2 checkers pieces + m_board->set_delay(attotime::from_msec(100)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9+1, 12); + config.set_default_layout(layout_ave_arb); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + +void arb_state::arb(machine_config &config) +{ + v2(config); + + /* basic machine hardware */ + M6502(config.replace(), m_maincpu, 4_MHz_XTAL/2); // R6502P + m_maincpu->set_addrmap(AS_PROGRAM, &arb_state::main_map); + + MOS6522(config.replace(), m_via, 4_MHz_XTAL/4); // R6522P + m_via->writepa_handler().set(FUNC(arb_state::leds_w)); + m_via->writepb_handler().set(FUNC(arb_state::control_w)); + m_via->readpa_handler().set(FUNC(arb_state::input_r)); + m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); + + /* cartridge */ + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "arb"); + m_cart->set_device_load(FUNC(arb_state::cart_load)); + m_cart->set_must_be_loaded(true); + + SOFTWARE_LIST(config, "cart_list").set_original("arb"); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( arb ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + // none here, it's in the module slot +ROM_END + +ROM_START( arbv2 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "sargon_4.0", 0x0000, 0x10000, CRC(c519c9e8) SHA1(d7597d50c0f4f9aa6d990c8d3b485e39cb44ff06) ) // AT27C512R +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ +CONS( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/cking_master.cpp b/src/mame/chess/cking_master.cpp new file mode 100644 index 00000000000..764d46bc4e3 --- /dev/null +++ b/src/mame/chess/cking_master.cpp @@ -0,0 +1,260 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + +Chess King Master (yes, it's plainly named "Master") +According to the manual, the chess engine is Cyrus (by Richard Lang). + +Hardware notes: +- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer +- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement +- simple I/O via 2*74373 and a 74145 +- 8*8 chessboard buttons, 32+1 border leds, piezo + +TODO: +- 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible + (wait state is similar to MSX) but I can't be bothered, better solution + is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. + +******************************************************************************/ + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "machine/bankdev.h" +#include "machine/clock.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "ck_master.lh" // clickable + + +namespace { + +class master_state : public driver_device +{ +public: + master_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), + m_dac(*this, "dac"), + m_mainmap(*this, "mainmap"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine configs + void master(machine_config &config); + + void init_master(); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_board; + required_device m_dac; + required_device m_mainmap; + required_ioport_array<2> m_inputs; + + // address maps + void main_map(address_map &map); + void main_trampoline(address_map &map); + u8 main_trampoline_r(offs_t offset); + void main_trampoline_w(offs_t offset, u8 data); + + // I/O handlers + u8 input_r(); + void control_w(u8 data); + + u16 m_inp_mux = 0; +}; + +void master_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +// TTL/generic + +void master_state::control_w(u8 data) +{ + // d0-d3: 74145 A-D + // 74145 0-9: input mux, led select + m_inp_mux = data & 0xf; + u16 sel = 1 << m_inp_mux & 0x3ff; + + // d4,d5: led data + m_display->matrix(sel & 0x1ff, data >> 4 & 3); + + // d6,d7: speaker +/- + m_dac->write(data >> 6 & 3); +} + +u8 master_state::input_r() +{ + u8 data = 0; + + // d0-d7: multiplexed inputs + // read chessboard sensors + if (m_inp_mux < 8) + data = m_board->read_file(m_inp_mux, true); + + // read other buttons + else if (m_inp_mux < 10) + data = m_inputs[m_inp_mux - 8]->read(); + + return ~data; +} + +void master_state::init_master() +{ + u8 *rom = memregion("maincpu")->base(); + const u32 len = memregion("maincpu")->bytes(); + + // descramble data lines + for (int i = 0; i < len; i++) + rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2); + + // descramble address lines + std::vector buf(len); + memcpy(&buf[0], rom, len); + for (int i = 0; i < len; i++) + rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)]; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void master_state::main_map(address_map &map) +{ + map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 + map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(master_state::input_r), FUNC(master_state::control_w)); // A13 + map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14 +} + +// PCB design is prone to bus conflicts, but should be fine if software obeys +void master_state::main_trampoline_w(offs_t offset, u8 data) +{ + if (offset & 0x2000) + m_mainmap->write8((offset & 0x3fff) | 0x8000, data); + if (offset & 0x4000) + m_mainmap->write8((offset & 0x7fff) | 0x8000, data); +} + +u8 master_state::main_trampoline_r(offs_t offset) +{ + u8 data = 0xff; + if (~offset & 0x8000) + data &= m_mainmap->read8(offset); + if (offset & 0x2000) + data &= m_mainmap->read8((offset & 0x3fff) | 0x8000); + if (offset & 0x4000) + data &= m_mainmap->read8((offset & 0x7fff) | 0x8000); + + return data; +} + +void master_state::main_trampoline(address_map &map) +{ + map(0x0000, 0xffff).rw(FUNC(master_state::main_trampoline_r), FUNC(master_state::main_trampoline_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( master ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void master_state::master(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 8_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline); + ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16); + + auto &irq_clock(CLOCK(config, "irq_clock", 418)); // 555 timer (22nF, 150K, 1K5), measured 418Hz + irq_clock.set_pulse_width(attotime::from_nsec(22870)); // active for 22.87us + irq_clock.signal_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(9, 2); + config.set_default_layout(layout_ck_master); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.125); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( ckmaster ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("d2764c-3.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // no custom label +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/compuchess.cpp b/src/mame/chess/compuchess.cpp new file mode 100644 index 00000000000..d22fec8e350 --- /dev/null +++ b/src/mame/chess/compuchess.cpp @@ -0,0 +1,507 @@ +// license:BSD-3-Clause +// copyright-holders:Peter Trauner, Wilbert Pol, hap +// thanks-to:Sean Riddle, Berger +/****************************************************************************** + +DCS CompuChess / Novag Chess Champion MK I +Initial driver version by PeT mess@utanet.at 2000,2001. +Driver largely rewritten over the years. + +To start playing, enter difficulty level (1-6), then when it says "bP", press A +for new game, B for empty board, or C for continue. + +TODO: +- cncchess sound is wrong, it should be a long dual-tone alarm sound + +BTANB: +- cmpchess/cmpchess2 accepts illegal moves (Conic fixed that) +- digits may flash briefly after entering a command, eg. the "b" or "P" digit + after setting board preset, this happens on the real device + +=============================================================================== + +DataCash Systems's CompuChess released mid-1977. One of the first chess +computers, the first one being Fidelity Chess Challenger (fidel_cc1.cpp) + +Hardware notes: +- PCB label: CompuChess 1, STAID INC, REV A, 7-77 +- Fairchild 3850PK, 2MHz XTAL +- Fairchild 3853PK +- 2KB ROM, 256 bytes RAM(2*D2101AL-4) +- 4-digit 7seg led display, no sound + +CompuChess 2nd edition is on the same PCB, but with a 3.57MHz XTAL(!), a 3850PC, +and Mostek MK3853N. The MCU speed was also confirmed with move calculation time. + +2nd edition added 3 new game modes: E for "Game of Knights", F for "Amazon Queen", +and G for "Survival". + +=============================================================================== + +The game underneath CompuChess is better known as Novag's MK I, it was an +unlicensed clone. The ROM is identical. DCS sued JS&A / Novag Industries for +copyright infringement and somehow didn't manage to win the case. + +Unlike CompuChess, MK I was a large success, we can assume that it kickstarted +Novag's chess computer generation. It was also distributed as "Computer Chess" +by JS&A, in the same housing as MK I. + +MCU frequency is with an LC circuit. The first version was around 5% faster than +CompuChess, the JS&A version was measured 2.18MHz on average. The 2nd version was +much faster, judging from move calculation time: around 3.5MHz(give or take 0.2). + +1st (slow) version: +- Novag MK I with Boris Spassky photo on the box +- JS&A Computer Chess + +2nd (fast) version: +- Novag MK I with Karpov photo on the box, later advertised with message + "Neu: Mit Quick-Electronic für Schnelle Gegenzüge" +- Waddingtons Videomaster Chess Champion + +MK I hardware description: +- An F8 3850 CPU accompanied by a 3853 memory interface + Variations seen: + - MOSTEK MK 3853N 7915 Philippines (static memory interface for F8) + - MOSTEK MK 3850N-3 7917 Philipines (Fairchild F8 CPU) + - 3850PK F7901 SINGAPORE (Fairchild F8 CPU) + - 3853PK F7851 SINGAPORE (static memory interface for F8) +- 2KB 2316 compatible ROM + Variations seen: + - Signetics 7916E C48091 82S210-1 COPYRIGHT + - RO-3-8316A 8316A-4480 7904 TAIWAN +- 2 x 2111 256x4 SRAM to provide 256 bytes of RAM + Variations seen: + - AM9111 BPC / P2111A-4 7851 +- 16 keys placed in a 4 x 4 matrix +- Power on switch +- L/S switch. This switch is directly tied to the RESET pin of the F8 CPU. + This allows the user to reset the CPU without destroying the RAM contents. +- A 4 character 11 segment digit display using a 15 pin interface. Of the 15 + pins 3 pins are not connected, so three segments are never used and this + leaves a standard 7 segments display with a dot in the lower right. +- The digit display is driven by two other components: + - SN75492N MALAYSIA 7840B + - ULN2033A 7847 +- Hardware addressing is controlled by a HBF4001AE. +- No speaker. + +=============================================================================== + +Conic Computer Chess (aka Master I in Germany) is also based on DCS CompuChess, +this time the 2nd edition. Conic have done a few changes, not enough to hide that +they 'borrowed' code. They also added a piezo circuit. + +Hardware notes: +- Fairchild 3850PK CPU @ 2MHz (LC circuit), 3853PK +- 2KB ROM (3216), 256 bytes RAM (2*2111A) +- 555, 4001, 4011 for display blinking and beeper + +"bP" buttons are F, G, H (instead of A, B, C) + +******************************************************************************/ + +#include "emu.h" +#include "cpu/f8/f8.h" +#include "machine/f3853.h" +#include "machine/timer.h" +#include "sound/beep.h" +#include "video/pwm.h" +#include "speaker.h" + +// internal artwork +#include "cmpchess.lh" // clickable +#include "novag_mk1.lh" // clickable +#include "conic_cchess.lh" // clickable + + +namespace { + +class cmpchess_state : public driver_device +{ +public: + cmpchess_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_beeper_off(*this, "beeper_off"), + m_beeper(*this, "beeper"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); } + DECLARE_INPUT_CHANGED_MEMBER(change_cpu_freq) { update_cpu_freq(newval); } + + // machine configs + void cmpchess(machine_config &config); + void cmpchess2(machine_config &config); + void mk1(machine_config &config); + void cncchess(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + optional_device m_beeper_off; + optional_device m_beeper; + required_ioport_array<4> m_inputs; + + // address maps + void main_map(address_map &map); + void main_io(address_map &map); + void cncchess_map(address_map &map); + void cncchess_io(address_map &map); + + TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } + TIMER_DEVICE_CALLBACK_MEMBER(blink) { m_blink = !m_blink; update_display(); } + void update_display(); + void update_reset(ioport_value state); + void update_cpu_freq(ioport_value state); + + // I/O handlers + void input_w(u8 data); + u8 input_r(); + void digit_select_w(u8 data); + void digit_data_w(u8 data); + u8 digit_data_r(); + u8 beeper_r(offs_t offset); + + void input_digit_select_w(u8 data) { input_w(data); digit_select_w(data); } + void input_digit_data_w(u8 data) { input_w(data); digit_data_w(data); } + + u8 m_inp_mux = 0; + u8 m_digit_select = 0; + u8 m_digit_data = 0; + bool m_blink = false; +}; + +void cmpchess_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_digit_select)); + save_item(NAME(m_digit_data)); + save_item(NAME(m_blink)); +} + +void cmpchess_state::machine_reset() +{ + if (ioport("FAKE") != nullptr) + update_cpu_freq(ioport("FAKE")->read()); + + update_reset(ioport("RESET")->read()); +} + +void cmpchess_state::update_reset(ioport_value state) +{ + // reset switch is tied to F3850 RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); + + // clear display + if (state) + m_display->clear(); +} + +void cmpchess_state::update_cpu_freq(ioport_value state) +{ + // 2 MK I versions, 2nd one was a lot faster + const u32 freq = state ? 3500000 : 2250000; + m_maincpu->set_unscaled_clock(freq); + subdevice("smi")->set_unscaled_clock(freq); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void cmpchess_state::update_display() +{ + // display panel goes into automated blink mode if DP segment is held high, + // and DP segment itself by default only appears to be active if no other segments are + u8 dmask = (m_digit_data == 1) ? 0x80 : 0x7f; + u8 bmask = (m_blink && m_digit_data & 1) ? 0 : 0xff; + u8 bstate = m_digit_data & bmask & 1; // DP state for ignoring dmask + + u8 digit_data = bitswap<8>(m_digit_data,0,2,1,3,4,5,6,7) & dmask & bmask; + m_display->matrix(m_digit_select, bstate << 8 | digit_data); +} + +void cmpchess_state::digit_data_w(u8 data) +{ + // digit segment data + m_digit_data = data; + update_display(); +} + +u8 cmpchess_state::digit_data_r() +{ + return m_digit_data; +} + +void cmpchess_state::digit_select_w(u8 data) +{ + // d0-d3: digit select (active low) + m_digit_select = ~data & 0xf; + update_display(); +} + +void cmpchess_state::input_w(u8 data) +{ + // input matrix is shared with either digit_data_w, or digit_select_w + m_inp_mux = data; +} + +u8 cmpchess_state::input_r() +{ + u8 data = m_inp_mux; + + // d0-d3: multiplexed inputs from d4-d7 + for (int i = 0; i < 4; i++) + if (m_inp_mux & m_inputs[i]->read() << 4) + data |= 1 << i; + + // d4-d7: multiplexed inputs from d0-d3 + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read() << 4; + + return data; +} + +u8 cmpchess_state::beeper_r(offs_t offset) +{ + // cncchess: trigger beeper + if (!machine().side_effects_disabled()) + { + m_beeper->set_state(1); + m_beeper_off->adjust(attotime::from_msec(50)); // wrong, see TODO + } + + return m_maincpu->space(AS_PROGRAM).read_byte(offset); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void cmpchess_state::main_map(address_map &map) +{ + map.global_mask(0x0fff); + map(0x0000, 0x07ff).rom(); + map(0x0800, 0x08ff).mirror(0x0700).ram(); +} + +void cmpchess_state::main_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(cmpchess_state::input_r), FUNC(cmpchess_state::input_digit_data_w)); + map(0x01, 0x01).w(FUNC(cmpchess_state::digit_select_w)); + map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write)); +} + +void cmpchess_state::cncchess_map(address_map &map) +{ + map(0x0000, 0x07ff).rom(); + map(0x1800, 0x18ff).ram(); + map(0x8000, 0xffff).r(FUNC(cmpchess_state::beeper_r)); +} + +void cmpchess_state::cncchess_io(address_map &map) +{ + map(0x00, 0x00).rw(FUNC(cmpchess_state::digit_data_r), FUNC(cmpchess_state::digit_data_w)); + map(0x01, 0x01).rw(FUNC(cmpchess_state::input_r), FUNC(cmpchess_state::input_digit_select_w)); + map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cmpchess ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("D / Play") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / White Bishop") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / White Queen") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / White King") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_M) PORT_NAME("H / md") // more data + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("G / White Pawn") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / White Rook") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / White Knight") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / fp") // find piece(position) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Black Bishop") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Black Queen") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Black King") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / ep") // enter piece(position) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Black Pawn") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Black Rook") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Black Knight") + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("Reset Switch") +INPUT_PORTS_END + +static INPUT_PORTS_START( mk1 ) + PORT_INCLUDE( cmpchess ) + + PORT_MODIFY("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("L.S. Switch") + + PORT_START("FAKE") + PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, change_cpu_freq, 0) // factory set + PORT_CONFSETTING( 0x00, "2.25MHz (Spassky packaging)" ) + PORT_CONFSETTING( 0x01, "3.5MHz (Karpov packaging)" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( cncchess ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Black Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Black Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Black Rook") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Black Pawn") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("8 / IP") // insert piece (same as ep) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_S) PORT_NAME("7 / SP") // search piece (same as fp) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Black King") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Black Queen") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("D / White Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / White Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / White Rook") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / White Pawn") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("H / GO") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_M) PORT_NAME("G / MD") // more data + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / White King") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / White Queen") + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("Reset") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void cmpchess_state::cmpchess(machine_config &config) +{ + /* basic machine hardware */ + F8(config, m_maincpu, 2_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &cmpchess_state::main_map); + m_maincpu->set_addrmap(AS_IO, &cmpchess_state::main_io); + m_maincpu->set_irq_acknowledge_callback("smi", FUNC(f3853_device::int_acknowledge)); + + f3853_device &smi(F3853(config, "smi", 2_MHz_XTAL)); + smi.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 8+1); + m_display->set_segmask(0xf, 0xff); + config.set_default_layout(layout_cmpchess); + + const attotime blink_period = attotime::from_msec(200); // approximation + TIMER(config, "blink_display").configure_periodic(FUNC(cmpchess_state::blink), blink_period); +} + +void cmpchess_state::cmpchess2(machine_config &config) +{ + cmpchess(config); + + /* basic machine hardware */ + m_maincpu->set_clock(3.579545_MHz_XTAL); + subdevice("smi")->set_clock(3.579545_MHz_XTAL); +} + +void cmpchess_state::mk1(machine_config &config) +{ + cmpchess(config); + + /* basic machine hardware */ + m_maincpu->set_clock(2250000); // see notes + subdevice("smi")->set_clock(2250000); + + config.set_default_layout(layout_novag_mk1); +} + +void cmpchess_state::cncchess(machine_config &config) +{ + cmpchess2(config); + + /* basic machine hardware */ + m_maincpu->set_clock(2000000); // LC circuit, measured 2MHz + m_maincpu->set_addrmap(AS_PROGRAM, &cmpchess_state::cncchess_map); + m_maincpu->set_addrmap(AS_IO, &cmpchess_state::cncchess_io); + + subdevice("smi")->set_clock(2000000); + + config.set_default_layout(layout_conic_cchess); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + BEEP(config, m_beeper, 2000); // wrong, see TODO + m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25); + TIMER(config, "beeper_off").configure_generic(FUNC(cmpchess_state::beeper_off)); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( cmpchess ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("32014-4950_cmcsi_staid.u3", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) ) +ROM_END + +ROM_START( cmpchess2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("8316a-4952_cmc2_staid.u3", 0x0000, 0x0800, CRC(aee49c5f) SHA1(8a10f74207f2646164cc0deed81bd082143ac38a) ) +ROM_END + + +ROM_START( ccmk1 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("82c210-1", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) ) +ROM_END + + +ROM_START( cncchess ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD("c48170.u1", 0x0000, 0x0800, CRC(5beace32) SHA1(9df924037614831a86b73eb3a16bbc80c63257a2) ) // 2316B +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1977, cmpchess, 0, 0, cmpchess, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka CompuChess I +CONS( 1978, cmpchess2, 0, 0, cmpchess2, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess: The Second Edition", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, cncchess, 0, 0, cncchess, cncchess, cmpchess_state, empty_init, "Conic", "Computer Chess (Conic, model 7011)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/conchess.cpp b/src/mame/chess/conchess.cpp new file mode 100644 index 00000000000..5ec9a2db77f --- /dev/null +++ b/src/mame/chess/conchess.cpp @@ -0,0 +1,344 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + +Conchess, a series of modular chess computers by Consumenta Computer. +Hardware development by Loproc (Germany), manufactured at Wallharn Electronics +(Ireland). The core people involved were Ulf Rathsman for the chess engine, +and Johan Enroth. After Consumenta went under in 1983, the Conchess brand was +continued by Systemhuset, Enroth's company. + +TODO: +- dump/add princhess module +- dump/add plymate original 2MHz module +- dump/add concplyv library module (L/L16 don't work, manual says it has its own add-on) +- concplyv unmapped reads/writes +- verify irq/beeper for concplyv, though it is probably correct +- official rom labels for concply5, concply8 + +------------------------------------------------------------------------------- + +Hardware notes: + +Chess boards released were Escorter, Ambassador, and Monarch, each should be the +same hardware, they just differ in size and material. +- TTL, 2 module slots +- 16+64 leds, 16 buttons, reed sensors for magnet chesspieces + +All chess modules appear to be on similar PCBs, with room a 6502/65C02, +and 8 ROM/RAM chips. + +For the newer programs, higher clocked versions were also available, the CPU speed +was labeled on a sticker on the module (eg. A2/5.5MHz). A German redistributor +named them "S"(speed) or "T"(top speed). + +A0 (untitled standard pack-in module): +- SY6502A @ 2MHz (4MHz XTAL) +- 3*8KB ROM, 4KB RAM(2*TMM2016P) +- TTL, beeper + +note: XTAL goes to 4020, 4020 /2 goes to CPU clock, and other dividers to +IRQ and beeper. On A0, IRQ is active for ~31.2us. + +A1(P) + A0(M) (Princhess, aka Glasgow) +- dual-module, each module has its own 6502 - need verification, more likely + 2nd module has no CPU (according to the manual, A0 is modified and won't + work stand-alone) + +A2(C) (Plymate, aka Amsterdam) +- R65C02P4 @ 5.5MHz (11MHz XTAL) (5.5MHz version) +- 32KB ROM, rest similar to A0 + +A3 (Plymate Victoria) +- W65C02S8P-14(14? probably replaced chip from a repair) @ 6.144MHz (12.288MHz XTAL) +- 32KB ROM, rest similar to A0 + +Library modules: +- L: small PCB, PCB label: CCL L-2, 8KB EPROM no label +- L16: 2*8KB EPROM (have no photo of PCB) + +******************************************************************************/ + +#include "emu.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "cpu/m6502/m6502.h" +#include "cpu/m6502/m65c02.h" +#include "cpu/m6502/r65c02.h" +#include "machine/sensorboard.h" +#include "sound/beep.h" +#include "video/pwm.h" + +#include "softlist_dev.h" +#include "speaker.h" + +// internal artwork +#include "conchess.lh" // clickable + + +namespace { + +class conchess_state : public driver_device +{ +public: + conchess_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), + m_beeper(*this, "beeper"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine configs + void concstd(machine_config &config); + void concply5(machine_config &config); + void concply8(machine_config &config); + void concplyv(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_board; + required_device m_beeper; + required_ioport_array<2> m_inputs; + + // address maps + void main_map(address_map &map); + + // I/O handlers + void clear_irq(); + u8 input_r(); + void leds_w(offs_t offset, u8 data); + void sound_w(u8 data); + + u8 m_inp_mux = 0; +}; + +void conchess_state::machine_start() +{ + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void conchess_state::clear_irq() +{ + m_maincpu->set_input_line(0, CLEAR_LINE); +} + +u8 conchess_state::input_r() +{ + clear_irq(); + + u8 data = 0; + + // read side panel buttons + if (m_inp_mux == 0 || m_inp_mux == 9) + data = m_inputs[m_inp_mux & 1]->read(); + + // read chessboard sensors + else + data = m_board->read_file((m_inp_mux - 1) ^ 7); + + return ~data; +} + +void conchess_state::leds_w(offs_t offset, u8 data) +{ + clear_irq(); + + // a0-a3: CD4028B to led select/input mux + m_inp_mux = offset; + if (m_inp_mux & 8) + m_inp_mux &= 9; + + // d0-d7: led data + m_display->matrix(1 << m_inp_mux, data); +} + +void conchess_state::sound_w(u8 data) +{ + // d7: enable beeper + m_beeper->set_state(BIT(data, 7)); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void conchess_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).ram(); + map(0x1000, 0x1000).mirror(0x07ff).r(FUNC(conchess_state::input_r)); + map(0x1000, 0x100f).mirror(0x07f0).w(FUNC(conchess_state::leds_w)); + map(0x1800, 0x1800).mirror(0x07ff).w(FUNC(conchess_state::sound_w)); + map(0x4000, 0x7fff).r("cartslot", FUNC(generic_slot_device::read_rom)); + map(0x8000, 0xffff).rom(); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( conchess ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("O. (Clear)") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Stop") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Dice Symbol (Alternate)") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("?-Sign (Analyze)") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Section Sign (Referee)") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("4-Way Arrow (Piece)") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("2-Way Arrow (Level)") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME(". (Continue)") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("White") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Black") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void conchess_state::concstd(machine_config &config) +{ + /* basic machine hardware */ + M6502(config, m_maincpu, 4_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); + + const attotime irq_period = attotime::from_hz(4_MHz_XTAL / 0x2000); + m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "conchess_cart"); + SOFTWARE_LIST(config, "cart_list").set_original("conchess_standard"); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + config.set_default_layout(layout_conchess); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 4_MHz_XTAL / 0x400); + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void conchess_state::concply5(machine_config &config) +{ + concstd(config); + + /* basic machine hardware */ + R65C02(config.replace(), m_maincpu, 11_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); + + const attotime irq_period = attotime::from_hz(11_MHz_XTAL / 0x4000); + m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); + + SOFTWARE_LIST(config.replace(), "cart_list").set_original("conchess_plymate"); + + /* sound hardware */ + BEEP(config.replace(), m_beeper, 11_MHz_XTAL / 0x800); + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void conchess_state::concply8(machine_config &config) +{ + concply5(config); + + /* basic machine hardware */ + R65C02(config.replace(), m_maincpu, 16_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); + + const attotime irq_period = attotime::from_hz(16_MHz_XTAL / 0x4000); + m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); + + /* sound hardware */ + BEEP(config.replace(), m_beeper, 16_MHz_XTAL / 0x1000); + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void conchess_state::concplyv(machine_config &config) +{ + concstd(config); + + /* basic machine hardware */ + M65C02(config.replace(), m_maincpu, 12.288_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); + + const attotime irq_period = attotime::from_hz(12.288_MHz_XTAL / 0x4000); + m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); + + SOFTWARE_LIST(config.replace(), "cart_list").set_original("conchess_victoria"); + + /* sound hardware */ + BEEP(config.replace(), m_beeper, 12.288_MHz_XTAL / 0x1000); + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( concstd ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD("c87011.b3", 0xa000, 0x2000, CRC(915e414c) SHA1(80c94712d1c79fa469576c37b80ab66f77c77cc4) ) + ROM_LOAD("c87010.b2", 0xc000, 0x2000, CRC(088c8737) SHA1(9f841b3c47de9ef1da8ce98c0a33a919cba873c6) ) + ROM_LOAD("c87009.b1", 0xe000, 0x2000, CRC(e1c648e2) SHA1(725a6ac1c69f788a7bba0573e5609b55b12899ac) ) +ROM_END + +ROM_START( concply5 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("plymate_5.5mhz.bin", 0x8000, 0x8000, CRC(9a9d1ec1) SHA1(75dbd1f96502775ed304f6b085d958f1b07d08f9) ) +ROM_END + +ROM_START( concply8 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("plymate_8mhz.bin", 0x8000, 0x8000, CRC(85005b73) SHA1(edbc18d07552cab5951d8a6b738b2eacd73331c1) ) +ROM_END + +ROM_START( concplyv ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("cc8-f.a2", 0x8000, 0x8000, CRC(5b0a1d09) SHA1(07cbc970a8dfbca386396ce5d5cc8ce77ad4ee1b) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ +CONS( 1982, concstd, 0, 0, concstd, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1985, concply5, 0, 0, concply5, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate 5.5MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1985, concply8, concply5, 0, concply8, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate 8.0MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, concplyv, 0, 0, concplyv, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/conic_cchess2.cpp b/src/mame/chess/conic_cchess2.cpp new file mode 100644 index 00000000000..f2613fee8a9 --- /dev/null +++ b/src/mame/chess/conic_cchess2.cpp @@ -0,0 +1,285 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:bataais +/****************************************************************************** + +Conic Computer Chess (model 07012), also sold under the same name by +Hanimex (model HMG 1200) and Westrak (model CC 1). It's also known as +Tracer Chess, this title is from an advertisement flyer, the actual chess +computer was simply named Computer Chess. + +The chessboard sensors aren't buttons or magnets, but 64 jacks. There is +a metal plug under each chesspiece. From MAME's perspective, it works the +same as a magnet sensorboard. + +After the player's move, the user needs to press Enter. This does not apply +to the computer's move. + +Hardware notes: +- Synertek 6504 @ ~1MHz +- 2*Motorola MC6821P PIA +- 4KB ROM(AMI), 1KB RAM(2*Synertek 1024x4) +- beeper, 8*8 leds, plug board + +BTANB: +- Learn button still works when in modify-mode + +******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6502/m6504.h" +#include "machine/6821pia.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +#include "conic_cchess2.lh" // clickable + + +namespace { + +class cchess2_state : public driver_device +{ +public: + cchess2_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_pia(*this, "pia%u", 0), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine configs + void cncchess2(machine_config &config); + + // assume that RESET button is tied to 6504 reset pin + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device_array m_pia; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<8> m_inputs; + + // address maps + void main_map(address_map &map); + + // I/O handlers + void update_display(); + void update_dac(); + void pia0_pa_w(u8 data); + void pia0_pb_w(u8 data); + u8 pia1_pa_r(); + u8 pia1_pb_r(); + void pia1_pb_w(u8 data); + + u8 m_inp_mux = 0; + u8 m_led_data = 0; + int m_dac_on = 0; +}; + +void cchess2_state::machine_start() +{ + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); + save_item(NAME(m_dac_on)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void cchess2_state::update_display() +{ + m_display->matrix(m_inp_mux, m_led_data); +} + +void cchess2_state::update_dac() +{ + m_dac->write(m_dac_on & BIT(m_inp_mux, 1)); +} + +void cchess2_state::pia0_pa_w(u8 data) +{ + // d0-d7: input mux/led select + // d1: dac data + m_inp_mux = data; + update_display(); + update_dac(); +} + +void cchess2_state::pia0_pb_w(u8 data) +{ + // d0-d7: led data + m_led_data = data; + update_display(); +} + +u8 cchess2_state::pia1_pa_r() +{ + u8 data = 0; + + // d0-d7: chessboard sensors + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_rank(i); + + return ~data; +} + +u8 cchess2_state::pia1_pb_r() +{ + u8 data = 0; + + // d0-d3: multiplexed inputs + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return data; +} + +void cchess2_state::pia1_pb_w(u8 data) +{ + // d7: dac on + m_dac_on = BIT(data, 7); + update_dac(); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void cchess2_state::main_map(address_map &map) +{ + map.global_mask(0x1fff); + map(0x0000, 0x03ff).ram(); + map(0x0a00, 0x0a03).mirror(0x00fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x0c00, 0x0c03).mirror(0x00fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); + map(0x1000, 0x1fff).rom(); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cncchess2 ) + PORT_START("IN.0") + PORT_BIT(0x03, IP_ACTIVE_HIGH, IPT_UNUSED) + PORT_CONFNAME( 0x0c, 0x08, "Mode" ) + PORT_CONFSETTING( 0x04, "Modify" ) + PORT_CONFSETTING( 0x08, "Play" ) + + PORT_START("IN.1") + PORT_CONFNAME( 0x03, 0x02, "Color" ) + PORT_CONFSETTING( 0x01, "Black" ) // from the bottom + PORT_CONFSETTING( 0x02, "White" ) + PORT_BIT(0x0c, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.2") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.3") + PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Learn") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6 / White King") + + PORT_START("IN.5") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5 / White Queen") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4 / White Rook") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3 / White Bishop") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2 / White Knight") + + PORT_START("IN.6") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1 / White Pawn") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7 / Black Pawn") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8 / Black Knight") + + PORT_START("IN.7") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9 / Black Bishop") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10 / Black Rook") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("11 / Black Queen") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("12 / Black King") + + PORT_START("RESET") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, cchess2_state, reset_button, 0) PORT_NAME("Reset") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void cchess2_state::cncchess2(machine_config &config) +{ + // basic machine hardware + M6504(config, m_maincpu, 1000000); // approximation, no XTAL + m_maincpu->set_addrmap(AS_PROGRAM, &cchess2_state::main_map); + + PIA6821(config, m_pia[0], 0); + m_pia[0]->writepa_handler().set(FUNC(cchess2_state::pia0_pa_w)); + m_pia[0]->writepb_handler().set(FUNC(cchess2_state::pia0_pb_w)); + + PIA6821(config, m_pia[1], 0); + m_pia[1]->readpa_handler().set(FUNC(cchess2_state::pia1_pa_r)); + m_pia[1]->readpb_handler().set(FUNC(cchess2_state::pia1_pb_r)); + m_pia[1]->writepb_handler().set(FUNC(cchess2_state::pia1_pb_w)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + config.set_default_layout(layout_conic_cchess2); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( cncchess2 ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD("c11485.u2", 0x1000, 0x1000, CRC(b179d536) SHA1(0b1f9c247a4a3e2ccbf8d3ae5efa62b8938f572f) ) // AMI 2332 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, cncchess2, 0, 0, cncchess2, cncchess2, cchess2_state, empty_init, "Conic", "Computer Chess (Conic, model 7012)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/conic_cchess3.cpp b/src/mame/chess/conic_cchess3.cpp new file mode 100644 index 00000000000..f269e3472e9 --- /dev/null +++ b/src/mame/chess/conic_cchess3.cpp @@ -0,0 +1,161 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Berger +/****************************************************************************** + +Conic Computer Chess (model 07013), more commonly known as Conic "Korchnoi". + +The interface is similar to the previous model (07012), where the user needs +to press Enter after their move. + +Hardware notes: +- Synertek 6502A @ 2MHz +- OKI MSM5840H-41RS @ 3.57MHz (2KB internal ROM) +- 2*4KB ROM(AMI), 1KB RAM(2*2114) +- beeper, 8*8+4 leds, magnets chessboard + +TODO: +- It does not work, MSM5840 is unemulated, and the internal ROM is not dumped. + MCU handles inputs, leds, sound, and it communicates with maincpu after + triggering an IRQ. + +******************************************************************************/ + +#include "emu.h" + +#include "cpu/m6502/m6502.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" + +#include "speaker.h" + +// internal artwork +//#include "conic_cchess3.lh" // clickable + + +namespace { + +class cchess3_state : public driver_device +{ +public: + cchess3_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac") + { } + + // machine configs + void cncchess3(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + + void main_map(address_map &map); + + // I/O handlers + void main_comm_w(u8 data); + u8 main_comm_r(); +}; + +void cchess3_state::machine_start() +{ +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void cchess3_state::main_comm_w(u8 data) +{ +} + +u8 cchess3_state::main_comm_r() +{ + return 0; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void cchess3_state::main_map(address_map &map) +{ + map.global_mask(0x3fff); + map(0x0000, 0x03ff).ram(); + map(0x1000, 0x1000).rw(FUNC(cchess3_state::main_comm_r), FUNC(cchess3_state::main_comm_w)); + map(0x2000, 0x3fff).rom(); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( cncchess3 ) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void cchess3_state::cncchess3(machine_config &config) +{ + // basic machine hardware + M6502(config, m_maincpu, 2_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &cchess3_state::main_map); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8+1, 8); + //config.set_default_layout(layout_conic_cchess3); + + // sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( cncchess3 ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD("ci07013-1", 0x2000, 0x1000, CRC(3251a529) SHA1(729b22d7653761ff0951ce1da58fdfcd474a700d) ) // AMI 2332 + ROM_LOAD("ci07013-2", 0x3000, 0x1000, CRC(0f38dcef) SHA1(f8fb7e12b41753fe52dd2eb2edb843211b5ca7c1) ) // " + + ROM_REGION( 0x0800, "mcu", 0 ) + ROM_LOAD("msm5840h-41rs", 0x0000, 0x0800, NO_DUMP ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, cncchess3, 0, 0, cncchess3, cncchess3, cchess3_state, empty_init, "Conic", "Computer Chess (Conic, model 7013)", MACHINE_SUPPORTS_SAVE | MACHINE_IS_SKELETON ) diff --git a/src/mame/chess/regence.cpp b/src/mame/chess/regence.cpp new file mode 100644 index 00000000000..d03f75fe4c0 --- /dev/null +++ b/src/mame/chess/regence.cpp @@ -0,0 +1,217 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + +La Régence, French chess computer by "France Double R". German distribution +by Sandy Electronic, who sub-titled it TSB 4 (Turniersensorbrett). + +The chess engine is Richard Lang's Cyrus. + +Hardware notes: +- PCB label: FRANCE DOUBLE R, MADE IN FRANCE +- Sharp LH0080A Z80A @ 4 MHz (8MHz XTAL) +- 3*4KB ROM, sockets support up to 48KB ROM +- 2KB RAM (MSM5128-15RS), 3 sockets, only middle one used +- TTL, piezo, 8*8+4 LEDs, magnetic sensors + +******************************************************************************/ + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "video/pwm.h" +#include "speaker.h" + +// internal artwork +#include "regence.lh" // clickable + + +namespace { + +class regence_state : public driver_device +{ +public: + regence_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_board(*this, "board"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + // machine configs + void regence(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_display; + required_device m_board; + required_device m_dac; + required_ioport_array<2> m_inputs; + + // address maps + void main_map(address_map &map); + + // I/O handlers + void update_display(); + void control_w(u8 data); + void leds_w(u8 data); + u8 input_r(); + + u8 m_inp_mux = 0; + u8 m_led_data = 0; +}; + +void regence_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void regence_state::update_display() +{ + m_display->matrix(1 << m_inp_mux, m_led_data); +} + +void regence_state::control_w(u8 data) +{ + // d0-d3: input mux/led select + m_inp_mux = data & 0xf; + update_display(); + + // d7: speaker out + m_dac->write(BIT(data, 7)); + + // other: ? +} + +void regence_state::leds_w(u8 data) +{ + // d0-d7: led data + m_led_data = data; + update_display(); +} + +u8 regence_state::input_r() +{ + u8 data = 0; + + // d0-d7: multiplexed inputs + // read chessboard sensors + if (m_inp_mux < 8) + data = m_board->read_file(m_inp_mux, true); + + // read other buttons + else if (m_inp_mux < 10) + data = m_inputs[m_inp_mux - 8]->read(); + + return data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void regence_state::main_map(address_map &map) +{ + map(0x0000, 0x0fff).rom(); + map(0x4000, 0x4fff).rom(); + map(0x8000, 0x8fff).rom(); + map(0xd000, 0xd7ff).ram(); + map(0xf000, 0xf000).rw(FUNC(regence_state::input_r), FUNC(regence_state::control_w)); + map(0xf800, 0xf800).w(FUNC(regence_state::leds_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( regence ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Changement de Position (Set Up)") // Veränderung + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME(u8"Retour en Arrière (Take Back)") // Zug Zurück + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Nouvelle Partie (New Game)") // Neues Spiel (press after setup) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Son (Sound)") // Ton + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Niveau (Level)") // Stufe + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_H) PORT_NAME("Marche/Arret (Move/Halt)") // Zug-Halt + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Noir (Black)") // Schwarz + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Blanc (White)") // Weiss + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void regence_state::regence(machine_config &config) +{ + /* basic machine hardware */ + Z80(config, m_maincpu, 8_MHz_XTAL/2); + m_maincpu->set_addrmap(AS_PROGRAM, ®ence_state::main_map); + + m_maincpu->set_periodic_int(FUNC(regence_state::irq0_line_hold), attotime::from_hz(448)); // from 555, measured + + SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(10, 8); + config.set_default_layout(layout_regence); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( regence ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD("arc0.ic13", 0x0000, 0x1000, CRC(ac6a0a67) SHA1(52b115c7cd372dfbad14b00854aa4f6f75a937d3) ) // M5L2732K + ROM_LOAD("arc1.ic12", 0x4000, 0x1000, CRC(5c2fb0c7) SHA1(811ab3d7cefcf872741eb2265115080aaf913f0f) ) // " + ROM_LOAD("arc2.ic11", 0x8000, 0x1000, CRC(e4c39dbd) SHA1(b6a6d1d39f73a2ff1ade6205bdf180be13e84df3) ) // " +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ +CONS( 1982, regence, 0, 0, regence, regence, regence_state, empty_init, "France Double R", u8"La Régence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/chess/tasc.cpp b/src/mame/chess/tasc.cpp new file mode 100644 index 00000000000..e0e698396ee --- /dev/null +++ b/src/mame/chess/tasc.cpp @@ -0,0 +1,381 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Sandro Ronco +/****************************************************************************** + +Tasc ChessSystem + +Commonly known as Tasc R30, it's basically a dedicated ChessMachine. +The King chess engines are also compatible with Tasc's The ChessMachine software +on PC, however the prototype Gideon 3.1(internally: 2.1, Rebel 2.01) is not. + +WARNING: Don't configure more than 512KB RAM for R30 The King 2.50, it will still +be playable but will actually use less than 512KB RAM and become weaker. + +The King 2.23 version was not sold to consumers. It has an opening book meant +for chesscomputer competitions. +For more information, see: http://chesseval.com/ChessEvalJournal/R30v223.htm + +R30 hardware notes: +- ARM6 CPU(P60ARM/CG) @ 30MHz +- 256KB system ROM (2*27C010) +- 512KB program RAM (4*MT5C1008), 128KB permanent RAM (KM681000ALP-7L) +- Toshiba LCD drivers (3*T7778A, T7900, T6963C), TC5565AFL-15 +- SB20 or SB30 "SmartBoard" chessboard with piece recognition + +R40 hardware notes: +- ARM6 CPU(VY86C061PSTC) @ 40MHz +- +512KB extra RAM piggybacked +- rest same as R30 + +Documentation for the Toshiba chips is hard to find, but similar chips exist: +T7778 is equivalent to T6A39, T7900 is equivalent to T6A40. + +EPROMs are interchangeable between R30 and R40, with some limitations with +The King 2.50 (see below). + +Regarding RAM: The King 2.2x will work fine with RAM expanded up to 8MB. +The King 2.50 appears to be protected against RAM upgrades though, and will +limit itself to 128KB if it detects a non-default amount of RAM. Gideon doesn't +use RAM above 128KB either, perhaps the R30 prototype only had 128KB RAM. + +references: +- https://www.schach-computer.info/wiki/index.php?title=Tasc_R30 +- https://www.schach-computer.info/wiki/index.php?title=Tasc_R40 +- https://www.schach-computer.info/wiki/index.php?title=Tasc_SmartBoard +- https://www.miclangschach.de/index.php?n=Main.TascR30 + +notes: +- holding LEFT+RIGHT on boot load the QC TestMode +- holding UP+DOWN on boot load the TestMode + +TODO: +- bootrom disable timer shouldn't be needed, real ARM has already fetched the next opcode +- more accurate dynamic cpu clock divider (same problem as in saitek_risc2500.cpp), + sound pitch is correct now though +- does the R40 version have the same clock divider value? + +******************************************************************************/ + +#include "emu.h" + +#include "cpu/arm/arm.h" +#include "machine/nvram.h" +#include "machine/ram.h" +#include "machine/smartboard.h" +#include "machine/timer.h" +#include "sound/spkrdev.h" +#include "video/t6963c.h" + +#include "speaker.h" + +// internal artwork +#include "tascr30.lh" + + +namespace { + +class tasc_state : public driver_device +{ +public: + tasc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_ram(*this, "ram"), + m_nvram(*this, "nvram", 0x20000, ENDIANNESS_LITTLE), + m_lcd(*this, "lcd"), + m_smartboard(*this, "smartboard"), + m_speaker(*this, "speaker"), + m_disable_bootrom(*this, "disable_bootrom"), + m_inputs(*this, "IN.%u", 0U), + m_out_leds(*this, "pled%u", 0U) + { } + + void tasc(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(switch_cpu_freq) { set_cpu_freq(); } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } + +private: + // devices/pointers + required_device m_maincpu; + required_region_ptr m_rom; + required_device m_ram; + memory_share_creator m_nvram; + required_device m_lcd; + required_device m_smartboard; + required_device m_speaker; + required_device m_disable_bootrom; + required_ioport_array<4> m_inputs; + output_finder<2> m_out_leds; + + void main_map(address_map &map); + + // I/O handlers + u32 input_r(); + u32 rom_r(offs_t offset); + void control_w(offs_t offset, u32 data, u32 mem_mask = ~0); + + u8 nvram_r(offs_t offset) { return m_nvram[offset]; } + void nvram_w(offs_t offset, u8 data) { m_nvram[offset] = data; } + + void set_cpu_freq(); + void install_bootrom(bool enable); + TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } + bool m_bootrom_enabled = false; + + u32 m_control = 0; + u32 m_prev_pc = 0; + u64 m_prev_cycle = 0; +}; + +void tasc_state::machine_start() +{ + m_out_leds.resolve(); + + save_item(NAME(m_bootrom_enabled)); + save_item(NAME(m_control)); + save_item(NAME(m_prev_pc)); + save_item(NAME(m_prev_cycle)); +} + +void tasc_state::machine_reset() +{ + install_bootrom(true); + set_cpu_freq(); + + m_prev_pc = m_maincpu->pc(); + m_prev_cycle = m_maincpu->total_cycles(); +} + +void tasc_state::set_cpu_freq() +{ + // R30 is 30MHz, R40 is 40MHz + m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? 40_MHz_XTAL : 30_MHz_XTAL); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void tasc_state::install_bootrom(bool enable) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + program.unmap_readwrite(0, std::max(m_rom.bytes(), size_t(m_ram->size())) - 1); + + // bootrom bankswitch + if (enable) + program.install_read_handler(0, m_rom.bytes() - 1, read32sm_delegate(*this, FUNC(tasc_state::rom_r))); + else + program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); + + m_bootrom_enabled = enable; +} + +u32 tasc_state::input_r() +{ + if (!machine().side_effects_disabled()) + { + // disconnect bootrom from the bus after next opcode + if (m_bootrom_enabled && !m_disable_bootrom->enabled()) + m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(10)); + + m_maincpu->set_input_line(ARM_FIRQ_LINE, CLEAR_LINE); + } + + // read chessboard + u32 data = m_smartboard->data_r(); + + // read keypad + for (int i = 0; i < 4; i++) + { + if (BIT(m_control, i)) + data |= (m_inputs[i]->read() << 24); + } + + return data; +} + +void tasc_state::control_w(offs_t offset, u32 data, u32 mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + if (BIT(data, 27)) + m_lcd->write(BIT(data, 26), data & 0xff); + + m_smartboard->data0_w(BIT(data, 30)); + m_smartboard->data1_w(BIT(data, 31)); + } + else + { + m_out_leds[0] = BIT(data, 0); + m_out_leds[1] = BIT(data, 1); + m_speaker->level_w((data >> 2) & 3); + } + + COMBINE_DATA(&m_control); +} + +u32 tasc_state::rom_r(offs_t offset) +{ + if (!machine().side_effects_disabled()) + { + // handle dynamic cpu clock divider when accessing rom + s64 diff = m_maincpu->total_cycles() - m_prev_cycle; + u32 pc = m_maincpu->pc(); + + if (diff > 0) + { + static constexpr int arm_branch_cycles = 3; + static constexpr int arm_max_cycles = 17; // datablock transfer + static constexpr int divider = -7 + 1; + + // this takes care of almost all cases, otherwise, total cycles taken can't be determined + if (diff <= arm_branch_cycles || (diff <= arm_max_cycles && (pc - m_prev_pc) == 4 && (pc & ~0x02000000) == (offset * 4))) + m_maincpu->adjust_icount(divider * (int)diff); + else + m_maincpu->adjust_icount(divider); + } + + m_prev_cycle = m_maincpu->total_cycles(); + m_prev_pc = pc; + } + + return m_rom[offset]; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void tasc_state::main_map(address_map &map) +{ + map(0x01000000, 0x01000003).rw(FUNC(tasc_state::input_r), FUNC(tasc_state::control_w)); + map(0x02000000, 0x0203ffff).r(FUNC(tasc_state::rom_r)); + map(0x03000000, 0x0307ffff).rw(FUNC(tasc_state::nvram_r), FUNC(tasc_state::nvram_w)).umask32(0x000000ff); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( tasc ) + PORT_START("IN.0") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("PLAY") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.1") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACK") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.2") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MENU") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Left Clock") + + PORT_START("IN.3") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENTER") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Right Clock") + + PORT_START("FAKE") + PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, tasc_state, switch_cpu_freq, 0) + PORT_CONFSETTING( 0x00, "30MHz (R30)" ) + PORT_CONFSETTING( 0x01, "40MHz (R40)" ) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void tasc_state::tasc(machine_config &config) +{ + /* basic machine hardware */ + ARM(config, m_maincpu, 30_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &tasc_state::main_map); + m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); + + const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL / 128); // 256Hz + m_maincpu->set_periodic_int(FUNC(tasc_state::irq1_line_assert), irq_period); + + TIMER(config, "disable_bootrom").configure_generic(FUNC(tasc_state::disable_bootrom)); + + RAM(config, m_ram).set_extra_options("512K, 1M, 2M, 4M, 8M"); // see driver notes + m_ram->set_default_size("512K"); + m_ram->set_default_value(0); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + TASC_SB30(config, m_smartboard); + subdevice("smartboard:board")->set_nvram_enable(true); + + /* video hardware */ + LM24014H(config, m_lcd, 0); + m_lcd->set_fs(1); // font size 6x8 + + config.set_default_layout(layout_tascr30); + + /* sound hardware */ + SPEAKER(config, "mono").front_center(); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); + m_speaker->set_levels(4, speaker_levels); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( tascr30 ) // system version V1.01 (17-Mar-95), program version 2.50 (26-Feb-95) + ROM_REGION32_LE( 0x40000, "maincpu", 0 ) + ROM_LOAD32_WORD("r30_lo_1.01_king_2.5", 0x00000, 0x20000, CRC(9711c158) SHA1(87c60d2097cb437482df11916543f6ef7f18b0d3) ) + ROM_LOAD32_WORD_SWAP("r30_hi_1.01_king_2.5", 0x00002, 0x20000, CRC(df913abf) SHA1(1bc2ea4b6514bf9fec18f52c264f1440ba7c8c01) ) +ROM_END + +ROM_START( tascr30a ) // system version V0.31 (3-May-93), program version 2.20 (23-Apr-93) + ROM_REGION32_LE( 0x40000, "maincpu", 0 ) + ROM_LOAD32_WORD("0.31_l", 0x00000, 0x20000, CRC(d30f81fe) SHA1(81957c7266bedec66b2c14b97008c4261bd67828) ) + ROM_LOAD32_WORD_SWAP("0.31_h", 0x00002, 0x20000, CRC(aeac3b46) SHA1(a757e0086636dfd3bf78e61cee46c7d92b39d3b9) ) +ROM_END + +ROM_START( tascr30b ) // system version V0.31 (3-May-93), program version 2.23 (16-May-93) + ROM_REGION32_LE( 0x40000, "maincpu", 0 ) + ROM_LOAD32_WORD("r30_v2.23_lo", 0x00000, 0x20000, CRC(37251b1a) SHA1(4be768e861002b20ba59a18329f488dba0a0c9bf) ) + ROM_LOAD32_WORD_SWAP("r30_v2.23_hi", 0x00002, 0x20000, CRC(e546be93) SHA1(943ae65cf97ec4389b9730c6006e805935333072) ) +ROM_END + +ROM_START( tascr30g ) // system version V0.31 (3-May-93), program version 2.1 (3-Feb-93) + ROM_REGION32_LE( 0x40000, "maincpu", 0 ) + ROM_LOAD32_WORD("r30_gideon_l", 0x00000, 0x20000, CRC(7041d051) SHA1(266843f375a8621320fc2cd1300775fb7a505c6e) ) + ROM_LOAD32_WORD_SWAP("r30_gideon_h", 0x00002, 0x20000, CRC(7345ee08) SHA1(9cad608bd32d804468b23196151be0a5f8cee214) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1995, tascr30, 0, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.50)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1993, tascr30a, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.20)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1993, tascr30b, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.23, TM version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // competed in several chesscomputer tournaments +CONS( 1993, tascr30g, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (Gideon 3.1, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // made in 1993, later released in 2012 diff --git a/src/mame/handheld/README.md b/src/mame/handheld/README.md new file mode 100644 index 00000000000..57b08ccc30b --- /dev/null +++ b/src/mame/handheld/README.md @@ -0,0 +1,4 @@ +# **src/mame/handheld** # + +Generic folder for handheld/tabletop drivers, where the number of drivers is too small to place them in specific company folders. +This also includes the hh_ collection drivers and their subclasses. \ No newline at end of file diff --git a/src/mame/handheld/hh_cop400.cpp b/src/mame/handheld/hh_cop400.cpp new file mode 100644 index 00000000000..587d1575207 --- /dev/null +++ b/src/mame/handheld/hh_cop400.cpp @@ -0,0 +1,2506 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +National Semiconductor COPS(COP400 MCU series) handhelds or other simple +devices, mostly LED electronic games/toys. + +TODO: +- why does h2hbaskbc(and clones) need a workaround on writing L pins? +- plus1: which sensor position is which colour? +- vidchal: Add screen and gun cursor with brightness detection callback, + and softwarelist for the video tapes. We'd also need a VHS player device. + The emulated lightgun itself appears to be working fine(eg. add a 30hz + timer to IN.3 to score +100) +- solution release year, most chips on the PCB were from 1984, but this one + was dumped from a licensed product branded for the VWR company, so it + could be later than the initial release + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/cop400/cop400.h" +#include "video/pwm.h" +#include "machine/timer.h" +#include "sound/spkrdev.h" +#include "sound/dac.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "bship82.lh" // clickable +#include "ctstein.lh" // clickable +#include "einvaderc.lh" +#include "funjacks.lh" // clickable +#include "funrlgl.lh" // clickable +#include "funtag.lh" // clickable +#include "h2hbaskbc.lh" +#include "h2hhockeyc.lh" +#include "h2hsoccerc.lh" +#include "lafootb.lh" +#include "lchicken.lh" // clickable +#include "lightfgt.lh" // clickable +#include "mbaskb2.lh" +#include "mdallas.lh" +#include "msoccer2.lh" +#include "qkracer.lh" +#include "scat.lh" +#include "unkeinv.lh" +#include "vidchal.lh" + +//#include "hh_cop400_test.lh" // common test-layout - use external artwork + + +class hh_cop400_state : public driver_device +{ +public: + hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_l = 0; // MCU port L write data + u8 m_g = 0; // MCU port G write data + u8 m_d = 0; // MCU port D write data + int m_so = 0; // MCU SO line state + int m_sk = 0; // MCU SK line state + u16 m_inp_mux = ~0; // multiplexed inputs mask + + u16 read_inputs(int columns, u16 colmask = ~0); +}; + + +// machine start/reset + +void hh_cop400_state::machine_start() +{ + // register for savestates + save_item(NAME(m_l)); + save_item(NAME(m_g)); + save_item(NAME(m_d)); + save_item(NAME(m_so)); + save_item(NAME(m_sk)); + save_item(NAME(m_inp_mux)); +} + +void hh_cop400_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_cop400_state::read_inputs(int columns, u16 colmask) +{ + // active low + u16 ret = ~0 & colmask; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (~m_inp_mux >> i & 1) + ret &= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button) +{ + // when an input is directly wired to MCU reset pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Castle Toy Einstein + * COP421 MCU label ~/927 COP421-NEZ/N + * 4 lamps, 1-bit sound + + This is a Simon clone, the tones are not harmonic. Two models exist, each + with a different batteries setup, assume they're same otherwise. + +***************************************************************************/ + +class ctstein_state : public hh_cop400_state +{ +public: + ctstein_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void ctstein(machine_config &config); + +private: + void write_g(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void ctstein_state::write_g(u8 data) +{ + // G0-G2: input mux + m_inp_mux = data & 7; +} + +void ctstein_state::write_l(u8 data) +{ + // L0-L3: button lamps + m_display->matrix(1, data & 0xf); +} + +u8 ctstein_state::read_l() +{ + // L4-L7: multiplexed inputs + return read_inputs(3, 0xf) << 4 | 0xf; +} + +// config + +static INPUT_PORTS_START( ctstein ) + PORT_START("IN.0") // G0 port L + PORT_CONFNAME( 0x0f, 0x01^0x0f, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01^0x0f, "1" ) + PORT_CONFSETTING( 0x02^0x0f, "2" ) + PORT_CONFSETTING( 0x04^0x0f, "3" ) + PORT_CONFSETTING( 0x08^0x0f, "4" ) + + PORT_START("IN.1") // G1 port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SELECT ) PORT_NAME("Best Score") + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Red Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Green Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Blue Button") +INPUT_PORTS_END + +void ctstein_state::ctstein(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_g().set(FUNC(ctstein_state::write_g)); + m_maincpu->write_l().set(FUNC(ctstein_state::write_l)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ctstein); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ctstein ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Basketball/Hockey/Soccer (model 2150/2160/2170) + * COP420 MCU label COP420L-NEZ/N + * 2-digit 7seg display, 41 other leds, 1-bit sound + + 3 Head to Head games were released using this MCU/ROM. They play very much + the same, only differing on game time. The PCB is pre-configured on G1+IN2 + and IN3 to select the game. + + An earlier revision of this runs on TMS1000, see hh_tms1k.cpp driver. Model + numbers are the same. From the outside, an easy way to spot the difference is + the Start/Display button: TMS1000 version button label is D, COP420 one is a *. + The COP420 version also plays much slower. + +***************************************************************************/ + +class h2hbaskbc_state : public hh_cop400_state +{ +public: + h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void h2hsoccerc(machine_config &config); + void h2hbaskbc(machine_config &config); + void h2hhockeyc(machine_config &config); + +private: + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); +}; + +// handlers + +void h2hbaskbc_state::write_d(u8 data) +{ + // D: led select + m_d = data & 0xf; +} + +void h2hbaskbc_state::write_g(u8 data) +{ + // G: led select, input mux + m_inp_mux = data; + m_g = data & 0xf; +} + +void h2hbaskbc_state::write_l(u8 data) +{ + // D2,D3 double as multiplexer + u16 mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00); + u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask; + + // D2+G0,G1 are 7segs + // L0-L6: digit segments A-G, L0-L4: led data + m_display->matrix(sel, data); +} + +u8 h2hbaskbc_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(4, 7) | (m_inputs[4]->read() & 8); +} + +// config + +static INPUT_PORTS_START( h2hbaskbc ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start/Display") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // factory set + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x04, "Factory Test" ) + PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN.4") // IN3 (factory set) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hhockeyc ) + PORT_INCLUDE( h2hbaskbc ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hsoccerc ) + PORT_INCLUDE( h2hhockeyc ) + + PORT_MODIFY("IN.1") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) +INPUT_PORTS_END + +void h2hbaskbc_state::h2hbaskbc(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 1000000); // approximation - RC osc. R=43K, C=101pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(h2hbaskbc_state::write_d)); + m_maincpu->write_g().set(FUNC(h2hbaskbc_state::write_g)); + m_maincpu->write_l().set(FUNC(h2hbaskbc_state::write_l)); + m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_h2hbaskbc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void h2hbaskbc_state::h2hhockeyc(machine_config &config) +{ + h2hbaskbc(config); + config.set_default_layout(layout_h2hhockeyc); +} + +void h2hbaskbc_state::h2hsoccerc(machine_config &config) +{ + h2hbaskbc(config); + config.set_default_layout(layout_h2hsoccerc); +} + +// roms + +ROM_START( h2hbaskbc ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) ) +ROM_END + +#define rom_h2hhockeyc rom_h2hbaskbc // dumped from Basketball +#define rom_h2hsoccerc rom_h2hbaskbc // " + + + + + +/*************************************************************************** + + Entex Space Invader + * COP444L MCU label /B138 COPL444-HRZ/N INV II (die label HRZ COP 444L/A) + * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + The first version was on TMS1100 (see hh_tms1k.c), this is the reprogrammed + second release with a gray case instead of black. + +***************************************************************************/ + +class einvaderc_state : public hh_cop400_state +{ +public: + einvaderc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void einvaderc(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + DECLARE_WRITE_LINE_MEMBER(write_sk); + DECLARE_WRITE_LINE_MEMBER(write_so); + void write_l(u8 data); +}; + +// handlers + +void einvaderc_state::update_display() +{ + u8 l = bitswap<8>(m_l,7,6,0,1,2,3,4,5); + u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff; + + m_display->matrix(grid, l); +} + +void einvaderc_state::write_d(u8 data) +{ + // D: led grid 0-3 (D0-D2 are 7segs) + m_d = data; + update_display(); +} + +void einvaderc_state::write_g(u8 data) +{ + // G: led grid 4-7 + m_g = data; + update_display(); +} + +WRITE_LINE_MEMBER(einvaderc_state::write_sk) +{ + // SK: speaker out + led grid 8 + m_speaker->level_w(state); + m_sk = state; + update_display(); +} + +WRITE_LINE_MEMBER(einvaderc_state::write_so) +{ + // SO: led grid 9 + m_so = state; + update_display(); +} + +void einvaderc_state::write_l(u8 data) +{ + // L: led state/segment + m_l = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( einvaderc ) + PORT_START("IN.0") // port IN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "Amateur" ) + PORT_CONFSETTING( 0x00, "Professional" ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) +INPUT_PORTS_END + +void einvaderc_state::einvaderc(machine_config &config) +{ + // basic machine hardware + COP444L(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->read_in().set_ioport("IN.0"); + m_maincpu->write_d().set(FUNC(einvaderc_state::write_d)); + m_maincpu->write_g().set(FUNC(einvaderc_state::write_g)); + m_maincpu->write_sk().set(FUNC(einvaderc_state::write_sk)); + m_maincpu->write_so().set(FUNC(einvaderc_state::write_so)); + m_maincpu->write_l().set(FUNC(einvaderc_state::write_l)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(919, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_einvaderc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvaderc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) ) + + ROM_REGION( 82104, "mask", 0) + ROM_LOAD( "einvaderc.svg", 0, 82104, CRC(0013227f) SHA1(44a3ac48c947369231f010559331ad16fcbef7be) ) +ROM_END + + + + + +/*************************************************************************** + + Gordon Barlow Design electronic Space Invaders game (unreleased, from patent US4345764) + * COP421 (likely a development chip) + * 36+9 LEDs, 1-bit sound + + This game is presumedly unreleased. The title is unknown, the patent simply names + it "Hand-held electronic game". There is no mass-manufacture company assigned + to it either. The game seems unfinished(no scorekeeping, some bugs), and the design + is very complex. Player ship and bullets are on a moving "wand", a 2-way mirror + makes it appear on the same plane as the enemies and barriers. + +***************************************************************************/ + +class unkeinv_state : public hh_cop400_state +{ +public: + unkeinv_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void unkeinv(machine_config &config); + +private: + void update_display(); + void write_g(u8 data); + void write_d(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void unkeinv_state::update_display() +{ + m_display->matrix(m_g << 4 | m_d, m_l); +} + +void unkeinv_state::write_g(u8 data) +{ + // G0,G1: led select part + // G2,G3: input mux + m_g = ~data & 0xf; + update_display(); +} + +void unkeinv_state::write_d(u8 data) +{ + // D0-D3: led select part + m_d = ~data & 0xf; + update_display(); +} + +void unkeinv_state::write_l(u8 data) +{ + // L0-L7: led data + m_l = ~data & 0xff; + update_display(); +} + +u8 unkeinv_state::read_l() +{ + u8 ret = 0xff; + + // L0-L5+G2: positional odd + // L0-L5+G3: positional even + u8 pos = m_inputs[1]->read(); + if (m_g & 4 && pos & 1) + ret ^= (1 << (pos >> 1)); + if (m_g & 8 && ~pos & 1) + ret ^= (1 << (pos >> 1)); + + // L7+G3: fire button + if (m_g & 8 && m_inputs[0]->read()) + ret ^= 0x80; + + return ret & ~m_l; +} + +// config + +static INPUT_PORTS_START( unkeinv ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") + PORT_BIT( 0x0f, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(12) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) +INPUT_PORTS_END + +void unkeinv_state::unkeinv(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // frequency guessed + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_g().set(FUNC(unkeinv_state::write_g)); + m_maincpu->write_d().set(FUNC(unkeinv_state::write_d)); + m_maincpu->write_l().set(FUNC(unkeinv_state::write_l)); + m_maincpu->read_l().set(FUNC(unkeinv_state::read_l)); + m_maincpu->read_l_tristate().set_constant(0xff); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 8); + config.set_default_layout(layout_unkeinv); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( unkeinv ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality +ROM_END + + + + + +/*************************************************************************** + + LJN I Took a Lickin' From a Chicken + * COP421 MCU label ~/005 COP421-NJC/N + * 11 leds, 1-bit sound, motor to a chicken on a spring + + This toy includes 4 games: Tic Tac Toe, Chicken Sez, and Total Recall I/II. + + known releases: + - USA: I Took a Lickin' From a Chicken, published by LJN + - Japan: Professor Chicken's Genius Classroom 「にわとり博士の天才教室」, published by Bandai + (not sure if it's the same ROM, or just licensed the outer shell) + +***************************************************************************/ + +class lchicken_state : public hh_cop400_state +{ +public: + lchicken_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag), + m_motor_pos_out(*this, "motor_pos"), + m_motor_on_out(*this, "motor_on") + { } + + void lchicken(machine_config &config); + + DECLARE_READ_LINE_MEMBER(motor_switch_r); + +protected: + virtual void machine_start() override; + +private: + output_finder<> m_motor_pos_out; + output_finder<> m_motor_on_out; + + u8 m_motor_pos = 0; + TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); + + void write_l(u8 data); + void write_d(u8 data); + void write_g(u8 data); + u8 read_g(); +}; + +void lchicken_state::machine_start() +{ + hh_cop400_state::machine_start(); + + m_motor_pos_out.resolve(); + m_motor_on_out.resolve(); + + // register for savestates + save_item(NAME(m_motor_pos)); +} + +// handlers + +READ_LINE_MEMBER(lchicken_state::motor_switch_r) +{ + return m_motor_pos > 0xe8; // approximation +} + +TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick) +{ + if (~m_inp_mux & 8) + { + m_motor_pos++; + m_motor_pos_out = 100 * (m_motor_pos / (float)0x100); + } +} + +void lchicken_state::write_l(u8 data) +{ + // L0-L3: led data + // L4-L6: led select + // L7: N/C + m_display->matrix(data >> 4 & 7, ~data & 0xf); +} + +void lchicken_state::write_d(u8 data) +{ + // D0-D3: input mux + // D3: motor on + m_inp_mux = data & 0xf; + m_motor_on_out = ~data >> 3 & 1; +} + +void lchicken_state::write_g(u8 data) +{ + m_g = data; +} + +u8 lchicken_state::read_g() +{ + // G0-G3: multiplexed inputs + return read_inputs(4, m_g); +} + +// config + +static INPUT_PORTS_START( lchicken ) + PORT_START("IN.0") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(lchicken_state, motor_switch_r) +INPUT_PORTS_END + +void lchicken_state::lchicken(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(lchicken_state::write_l)); + m_maincpu->write_d().set(FUNC(lchicken_state::write_d)); + m_maincpu->write_g().set(FUNC(lchicken_state::write_g)); + m_maincpu->read_g().set(FUNC(lchicken_state::read_g)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); + + TIMER(config, "chicken_motor").configure_periodic(FUNC(lchicken_state::motor_sim_tick), attotime::from_msec(6000/0x100)); // ~6sec for a full rotation + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 4); + config.set_default_layout(layout_lchicken); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lchicken ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Jacks (model 1603) + * COP410L MCU die bonded directly to PCB (die label COP410L/B NGS) + * 8 LEDs, 1-bit sound + +***************************************************************************/ + +class funjacks_state : public hh_cop400_state +{ +public: + funjacks_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funjacks(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_g(); +}; + +// handlers + +void funjacks_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funjacks_state::write_d(u8 data) +{ + // D: led grid + input mux + m_inp_mux = data; + m_d = ~data & 0xf; + update_display(); +} + +void funjacks_state::write_l(u8 data) +{ + // L0,L1: led state + m_l = data & 3; + update_display(); +} + +void funjacks_state::write_g(u8 data) +{ + // G1: speaker out + m_speaker->level_w(data >> 1 & 1); + m_g = data; +} + +u8 funjacks_state::read_l() +{ + // L4,L5: multiplexed inputs + return read_inputs(3, 0x30) | m_l; +} + +u8 funjacks_state::read_g() +{ + // G1: speaker out state + // G2,G3: inputs + return m_inputs[3]->read() | (m_g & 2); +} + +// config + +static INPUT_PORTS_START( funjacks ) + PORT_START("IN.0") // D0 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) + + PORT_START("IN.1") // D1 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) + + PORT_START("IN.2") // D2 port L + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // positioned at 1 o'clock on panel, increment clockwise + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) + + PORT_START("IN.3") // port G + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speaker + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void funjacks_state::funjacks(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=56pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funjacks_state::write_d)); + m_maincpu->write_l().set(FUNC(funjacks_state::write_l)); + m_maincpu->write_g().set(FUNC(funjacks_state::write_g)); + m_maincpu->read_l().set(FUNC(funjacks_state::read_l)); + m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 2); + config.set_default_layout(layout_funjacks); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funjacks ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Red Light Green Light (model 1604) + * COP410L MCU die bonded directly to PCB (die label COP410L/B NHZ) + * 14 LEDs, 1-bit sound + + known releases: + - USA: Funtronics: Red Light Green Light, published by Mattel + - USA(rerelease): Funtronics: Hot Wheels Drag Race, published by Mattel + +***************************************************************************/ + +class funrlgl_state : public hh_cop400_state +{ +public: + funrlgl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funrlgl(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); +}; + +// handlers + +void funrlgl_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funrlgl_state::write_d(u8 data) +{ + // D: led grid + m_d = ~data & 0xf; + update_display(); +} + +void funrlgl_state::write_l(u8 data) +{ + // L0-L3: led state + // L4-L7: N/C + m_l = ~data & 0xf; + update_display(); +} + +void funrlgl_state::write_g(u8 data) +{ + // G3: speaker out + m_speaker->level_w(data >> 3 & 1); +} + +// config + +static INPUT_PORTS_START( funrlgl ) + PORT_START("IN.0") // port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, 0) +INPUT_PORTS_END + +void funrlgl_state::funrlgl(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 800000); // approximation - RC osc. R=51K, C=91pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funrlgl_state::write_d)); + m_maincpu->write_l().set(FUNC(funrlgl_state::write_l)); + m_maincpu->read_l_tristate().set_constant(0xff); + m_maincpu->write_g().set(FUNC(funrlgl_state::write_g)); + m_maincpu->read_g().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 4); + m_display->set_bri_levels(0.005, 0.1); // top led is brighter + config.set_default_layout(layout_funrlgl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funrlgl ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Funtronics: Tag (model 1497) + * COP410L MCU die bonded directly to PCB (die label COP410L/B GTJ) + * 7 LEDs, 7 buttons, 1-bit sound + +***************************************************************************/ + +class funtag_state : public hh_cop400_state +{ +public: + funtag_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void funtag(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_g(); +}; + +// handlers + +void funtag_state::update_display() +{ + m_display->matrix(m_d, m_l); +} + +void funtag_state::write_d(u8 data) +{ + // D: led grid + input mux + m_inp_mux = data; + m_d = ~data & 0xf; + update_display(); +} + +void funtag_state::write_l(u8 data) +{ + // L0,L1: led state + m_l = data & 3; + update_display(); +} + +void funtag_state::write_g(u8 data) +{ + // G2: speaker out + m_speaker->level_w(data >> 2 & 1); +} + +u8 funtag_state::read_l() +{ + // L2: difficulty switch + return m_inputs[4]->read() | 8; +} + +u8 funtag_state::read_g() +{ + // G0,G1: multiplexed inputs + // G3: start button + return read_inputs(3, 3) | m_inputs[3]->read() | 4; +} + +// config + +static INPUT_PORTS_START( funtag ) + PORT_START("IN.0") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) + + PORT_START("IN.1") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) + + PORT_START("IN.2") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) + + PORT_START("IN.3") // port G + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START ) + + PORT_START("IN.4") // port L + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void funtag_state::funtag(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=47K, C=91pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(funtag_state::write_d)); + m_maincpu->write_l().set(FUNC(funtag_state::write_l)); + m_maincpu->write_g().set(FUNC(funtag_state::write_g)); + m_maincpu->read_l().set(FUNC(funtag_state::read_l)); + m_maincpu->read_g().set(FUNC(funtag_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 2); + config.set_default_layout(layout_funtag); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( funtag ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_gtj", 0x0000, 0x0200, CRC(ce565da6) SHA1(34e5f39e32f220007d353c93787c1a6d117592c1) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Basketball 2 (model 1645), Soccer 2 (model 1642) + * PCB label: MA6037/38 + * dual COP420L MCUs, dies bonded to PCB (see romdefs for rom serials) + * 4001, die also bonded to PCB + * 2-digit 7seg display, 36 other leds, 1-bit sound + + The clock generator was measured ~527kHz for mbaskb2, ~483kHz for msoccer2, + meaning that the internal divider is 8. Main MCU SK connects to the other + MCU CKO pin, probably for syncing serial I/O. + + These two are on the same hardware, see patents US4341383 and US4372556 + for detailed descriptions of the games. + +***************************************************************************/ + +class mbaskb2_state : public hh_cop400_state +{ +public: + mbaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag), + m_subcpu(*this, "subcpu"), + m_on_timer(*this, "on_timer") + { } + + void mbaskb2(machine_config &config); + void msoccer2(machine_config &config); + + DECLARE_CUSTOM_INPUT_MEMBER(switch_r); + +protected: + virtual void machine_reset() override; + +private: + required_device m_subcpu; + required_device m_on_timer; + + void update_display(); + void shared_write_l(u8 data); + void main_write_g(u8 data); + void sub_write_g(u8 data); + void sub_write_d(u8 data); + u8 sub_read_in(); +}; + +void mbaskb2_state::machine_reset() +{ + hh_cop400_state::machine_reset(); + m_on_timer->adjust(attotime::from_msec(5)); +} + +// handlers + +void mbaskb2_state::update_display() +{ + m_display->matrix(~(m_d << 4 | m_g), m_l); +} + +void mbaskb2_state::shared_write_l(u8 data) +{ + // L: led data (though it's unlikely that maincpu will write valid led data to it) + m_l = m_maincpu->l_r() | m_subcpu->l_r(); + update_display(); +} + +void mbaskb2_state::main_write_g(u8 data) +{ + // G1: speaker out + m_speaker->level_w(data >> 1 & 1); +} + +void mbaskb2_state::sub_write_g(u8 data) +{ + // G: led select (low), input mux + m_g = m_inp_mux = data & 0xf; + update_display(); +} + +void mbaskb2_state::sub_write_d(u8 data) +{ + // D: led select (high) + m_d = data & 0xf; + update_display(); +} + +u8 mbaskb2_state::sub_read_in() +{ + // IN: multiplexed inputs + return read_inputs(3, 0xf); +} + +// config + +CUSTOM_INPUT_MEMBER(mbaskb2_state::switch_r) +{ + // The power switch is off-1-2, and the game relies on power-on starting at 1, + // otherwise msoccer2 boots up to what looks like a factory test mode. + return (m_inputs[3]->read() & 1) | (m_on_timer->enabled() ? 1 : 0); +} + +static INPUT_PORTS_START( mbaskb2 ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Shoot") + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Defense: Man") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Defense: Zone") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Defense: Press") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mbaskb2_state, switch_r) + + PORT_START("IN.3") + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( msoccer2 ) + PORT_INCLUDE( mbaskb2 ) + + PORT_MODIFY("IN.2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Low/High Kick") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Teammate") +INPUT_PORTS_END + +void mbaskb2_state::mbaskb2(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 500000); // approximation + m_maincpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed + m_maincpu->write_g().set(FUNC(mbaskb2_state::main_write_g)); + m_maincpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); + m_maincpu->read_l().set(m_subcpu, FUNC(cop400_cpu_device::l_r)); + m_maincpu->read_l_tristate().set_constant(0x80); + m_maincpu->read_si().set(m_subcpu, FUNC(cop400_cpu_device::so_r)); + + COP420(config, m_subcpu, 500000); // same as maincpu + m_subcpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed + m_subcpu->write_d().set(FUNC(mbaskb2_state::sub_write_d)); + m_subcpu->write_g().set(FUNC(mbaskb2_state::sub_write_g)); + m_subcpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); + m_subcpu->read_l().set(m_maincpu, FUNC(cop400_cpu_device::l_r)); + m_subcpu->read_l_tristate().set_constant(0x80); + m_subcpu->read_in().set(FUNC(mbaskb2_state::sub_read_in)); + m_subcpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); + m_subcpu->read_cko().set(m_maincpu, FUNC(cop400_cpu_device::sk_r)); + + config.set_perfect_quantum(m_maincpu); + + TIMER(config, "on_timer").configure_generic(nullptr); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(0xc0, 0x7f); + m_display->set_bri_levels(0.008, 0.04); // offense is brighter + config.set_default_layout(layout_mbaskb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void mbaskb2_state::msoccer2(machine_config &config) +{ + mbaskb2(config); + config.set_default_layout(layout_msoccer2); +} + +// roms + +ROM_START( mbaskb2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l_nmp", 0x0000, 0x0400, CRC(afc44378) SHA1(e96435bd1d0b2bea5140efdfe21f4684f2525075) ) + + ROM_REGION( 0x0400, "subcpu", 0 ) + ROM_LOAD( "cop420l_nmq", 0x0000, 0x0400, CRC(70943f6f) SHA1(3f711d8b7c7c5dd13c68bf1ef980d2f784b748f4) ) +ROM_END + +ROM_START( msoccer2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420l_nnm", 0x0000, 0x0400, CRC(c9169aca) SHA1(525486e8a18ec6132e53f9be582b2667172230a9) ) + + ROM_REGION( 0x0400, "subcpu", 0 ) + ROM_LOAD( "cop420l_nnk", 0x0000, 0x0400, CRC(a84dd5f4) SHA1(5d269816248319a2bca1708d5022af455d52682d) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Look Alive! Football (model 1998) + * COP421L MCU die bonded directly to PCB (rom serial HCJ) + * 2 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + For a detailed description, see patent US4582323. 1st-person view versions + for Baseball and Basketball were also announced, but not released. + +***************************************************************************/ + +class lafootb_state : public hh_cop400_state +{ +public: + lafootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void lafootb(machine_config &config); + +private: + void update_display(); + void write_l(u8 data); + void write_d(u8 data); + u8 read_g(); +}; + +// handlers + +void lafootb_state::update_display() +{ + m_display->matrix(~m_d, m_l); +} + +void lafootb_state::write_l(u8 data) +{ + // L: led data + m_l = data; + update_display(); +} + +void lafootb_state::write_d(u8 data) +{ + // D: led select, D2,D3: input mux + m_d = data & 0xf; + m_inp_mux = data >> 2 & 3; + update_display(); +} + +u8 lafootb_state::read_g() +{ + // G: multiplexed inputs + return read_inputs(2, 7) | (m_inputs[2]->read() & 8); +} + +// config + +static INPUT_PORTS_START( lafootb ) + PORT_START("IN.0") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Right / Home") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick / Yards to go") + + PORT_START("IN.1") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Left / Visitors") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Up / Time") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass / Status") + + PORT_START("IN.2") // G3 + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void lafootb_state::lafootb(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 900000); // approximation - RC osc. R=51K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(lafootb_state::write_l)); + m_maincpu->write_d().set(FUNC(lafootb_state::write_d)); + m_maincpu->read_g().set(FUNC(lafootb_state::read_g)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1920, 864); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0x4, 0x7f); + m_display->set_segmask(0x8, 0xff); // right digit has dp + m_display->set_bri_levels(0.005); + config.set_default_layout(layout_lafootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lafootb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421l_hcj", 0x0000, 0x0400, CRC(a9cc1e94) SHA1(7a39f5a5f10b8a2bd72da3ff3f3fcfaad35ead5f) ) + + ROM_REGION( 38608, "mask", 0) + ROM_LOAD( "lafootb.svg", 0, 38608, CRC(35387445) SHA1(7cd9db170820fc84d47545c3db8d991b2c5f4f7f) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Dalla$ (J.R. handheld) + * COP444 MCU label COP444L-HYN/N + * 8-digit 7seg display, 1-bit sound + + This is a board game, only the handheld device is emulated here. + +***************************************************************************/ + +class mdallas_state : public hh_cop400_state +{ +public: + mdallas_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void mdallas(machine_config &config); + +private: + void update_display(); + void write_l(u8 data); + void write_d(u8 data); + void write_g(u8 data); + u8 read_in(); +}; + +// handlers + +void mdallas_state::update_display() +{ + m_display->matrix(~(m_d << 4 | m_g), m_l); +} + +void mdallas_state::write_l(u8 data) +{ + // L: digit segment data + m_l = data; + update_display(); +} + +void mdallas_state::write_d(u8 data) +{ + // D: select digit, input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); + m_d = data & 0xf; + update_display(); +} + +void mdallas_state::write_g(u8 data) +{ + // G: select digit, input mux low + m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); + m_g = data & 0xf; + update_display(); +} + +u8 mdallas_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(6, 0xf); +} + +// config + +/* physical button layout and labels are like this: + + < ON> [YES] [NO] [NEXT] + [] + [7] [8] [9] [STATUS] + [4] [5] [6] [ASSETS] + [1] [2] [3] [START] + [CLEAR] [0] [MOVE] [ENTER] +*/ + +static INPUT_PORTS_START( mdallas ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Start") + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Assets") + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Status") + + PORT_START("IN.4") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("West") // W + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Next") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("East") // E + + PORT_START("IN.5") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("No") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Yes") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("South") // S + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("North") // N +INPUT_PORTS_END + +void mdallas_state::mdallas(machine_config &config) +{ + // basic machine hardware + COP444L(config, m_maincpu, 900000); // approximation - RC osc. R=57K, C=101pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_l().set(FUNC(mdallas_state::write_l)); + m_maincpu->write_d().set(FUNC(mdallas_state::write_d)); + m_maincpu->write_g().set(FUNC(mdallas_state::write_g)); + m_maincpu->read_in().set(FUNC(mdallas_state::read_in)); + m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_mdallas); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mdallas ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cop444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Plus One + * COP410L MCU in 8-pin DIP, label ~/029 MM 57405 (die label COP410L/B NNE) + * orientation sensor(4 directions), 1-bit sound + + This is a board game, each player needs to rotate a triangular pyramid + shaped piece the same as the previous player, plus 1. + +***************************************************************************/ + +class plus1_state : public hh_cop400_state +{ +public: + plus1_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void plus1(machine_config &config); + +private: + void write_d(u8 data); + void write_l(u8 data); + u8 read_l(); +}; + +// handlers + +void plus1_state::write_d(u8 data) +{ + // D0?: speaker out + m_speaker->level_w(data & 1); +} + +void plus1_state::write_l(u8 data) +{ + m_l = data; +} + +u8 plus1_state::read_l() +{ + // L: IN.1, mask with output + return m_inputs[1]->read() & m_l; +} + +// config + +static INPUT_PORTS_START( plus1 ) + PORT_START("IN.0") // port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Sensor Position 3") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sensor Position 1") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port L + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Sensor Position 4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sensor Position 2") + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void plus1_state::plus1(machine_config &config) +{ + // basic machine hardware + COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=51K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(plus1_state::write_d)); + m_maincpu->read_g().set_ioport("IN.0"); + m_maincpu->write_l().set(FUNC(plus1_state::write_l)); + m_maincpu->read_l().set(FUNC(plus1_state::read_l)); + + // no visual feedback! + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( plus1 ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Lightfight + * COP421L MCU label /B119 COP421L-HLA/N + * LED matrix, 1-bit sound + + Xbox-shaped electronic game for 2 or more players, with long diagonal buttons + next to each outer LED. The main object of the game is to pinpoint a light + by pressing 2 buttons. To start, press a skill-level button(P2 button 7/8/9) + after selecting a game mode(P1 button 6-10). + + The game variations are: + 1: LightFight + 2: NightFight + 3: RiteSite + 4: QuiteBrite + 5: RightLight + +***************************************************************************/ + +class lightfgt_state : public hh_cop400_state +{ +public: + lightfgt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void lightfgt(machine_config &config); + +private: + void update_display(); + DECLARE_WRITE_LINE_MEMBER(write_so); + void write_d(u8 data); + void write_l(u8 data); + u8 read_g(); +}; + +// handlers + +void lightfgt_state::update_display() +{ + u8 grid = (m_so | m_d << 1) ^ 0x1f; + m_display->matrix(grid, m_l); +} + +WRITE_LINE_MEMBER(lightfgt_state::write_so) +{ + // SO: led grid 0 (and input mux) + m_so = state; + update_display(); +} + +void lightfgt_state::write_d(u8 data) +{ + // D: led grid 1-4 (and input mux) + m_d = data; + update_display(); +} + +void lightfgt_state::write_l(u8 data) +{ + // L0-L4: led state + // L5-L7: N/C + m_l = data & 0x1f; + update_display(); +} + +u8 lightfgt_state::read_g() +{ + // G: multiplexed inputs + m_inp_mux = m_d << 1 | m_so; + return read_inputs(5, 0xf); +} + +// config + +static INPUT_PORTS_START( lightfgt ) + PORT_START("IN.0") // SO port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) // note: button 1 is on the left side from player perspective + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_COCKTAIL + + PORT_START("IN.1") // D0 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_COCKTAIL + + PORT_START("IN.2") // D1 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_COCKTAIL + + PORT_START("IN.3") // D2 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_COCKTAIL + + PORT_START("IN.4") // D3 port G + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_COCKTAIL +INPUT_PORTS_END + +void lightfgt_state::lightfgt(machine_config &config) +{ + // basic machine hardware + COP421(config, m_maincpu, 950000); // approximation - RC osc. R=82K, C=56pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_so().set(FUNC(lightfgt_state::write_so)); + m_maincpu->write_d().set(FUNC(lightfgt_state::write_d)); + m_maincpu->write_l().set(FUNC(lightfgt_state::write_l)); + m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 5); + config.set_default_layout(layout_lightfgt); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( lightfgt ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1982 version) + * COP420 MCU label COP420-JWE/N + + see hh_tms1k.cpp bship driver for more information + +***************************************************************************/ + +class bship82_state : public hh_cop400_state +{ +public: + bship82_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void bship82(machine_config &config); + +private: + void write_d(u8 data); + void write_g(u8 data); + u8 read_l(); + u8 read_in(); + DECLARE_WRITE_LINE_MEMBER(write_so); +}; + +// handlers + +void bship82_state::write_d(u8 data) +{ + // D: input mux + m_inp_mux = data; +} + +void bship82_state::write_g(u8 data) +{ + // G0-G2: speaker out via 3.9K, 2.2K, 1.0K resistor + // G3: enable speaker + m_speaker->level_w((data & 8) ? (data & 7) : 0); +} + +u8 bship82_state::read_l() +{ + // L: multiplexed inputs + return read_inputs(4, 0xff); +} + +u8 bship82_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(4, 0xf00) >> 8; +} + +WRITE_LINE_MEMBER(bship82_state::write_so) +{ + // SO: led + m_display->matrix(1, state); +} + +// config + +static INPUT_PORTS_START( bship82 ) + PORT_START("IN.0") // D0 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // D1 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") + + PORT_START("IN.2") // D2 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") // CLE + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 A") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 B") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 C") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 D") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 E") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 F") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 G") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 H") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 I") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 J") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // D3 ports L,IN + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") // CM + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 1") + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 2") + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 3") + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 4") + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 5") + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 6") + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 7") + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 8") + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 9") + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 10") + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Fire") + + PORT_START("IN.4") // SI + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch +INPUT_PORTS_END + +void bship82_state::bship82(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 750000); // approximation - RC osc. R=14K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(bship82_state::write_d)); + m_maincpu->write_g().set(FUNC(bship82_state::write_g)); + m_maincpu->read_l().set(FUNC(bship82_state::read_l)); + m_maincpu->read_in().set(FUNC(bship82_state::read_in)); + m_maincpu->write_so().set(FUNC(bship82_state::write_so)); + m_maincpu->read_si().set_ioport("IN.4"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship82); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/7.0, 2.0/7.0, 3.0/7.0, 4.0/7.0, 5.0/7.0, 6.0/7.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bship82 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Racer (COP420 version) + * COP420 MCU label COP420-NPG/N + * 8-digit 7seg led display(1 custom digit), 1 green led, no sound + + This is the COP420 version, they removed support for the link cable. + The first release was on a MM5799 MCU, see hh_cops1.cpp. + +***************************************************************************/ + +class qkracer_state : public hh_cop400_state +{ +public: + qkracer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void qkracer(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); + DECLARE_WRITE_LINE_MEMBER(write_sk); +}; + +// handlers + +void qkracer_state::update_display() +{ + m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l); +} + +void qkracer_state::write_d(u8 data) +{ + // D: select digit, D3: input mux low bit + m_inp_mux = (m_inp_mux & ~1) | (data >> 3 & 1); + m_d = data & 0xf; + update_display(); +} + +void qkracer_state::write_g(u8 data) +{ + // G: select digit, input mux + m_inp_mux = (m_inp_mux & 1) | (data << 1 & 0x1e); + m_g = data & 0xf; + update_display(); +} + +void qkracer_state::write_l(u8 data) +{ + // L0-L6: digit segment data + m_l = data & 0x7f; + update_display(); +} + +u8 qkracer_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(5, 0xf); +} + +WRITE_LINE_MEMBER(qkracer_state::write_sk) +{ + // SK: green led + m_sk = state; + update_display(); +} + +// config + +static INPUT_PORTS_START( qkracer ) + PORT_START("IN.0") // D3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") + + PORT_START("IN.1") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.2") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void qkracer_state::qkracer(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 950000); // approximation - RC osc. R=47K, C=100pF + m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(qkracer_state::write_d)); + m_maincpu->write_g().set(FUNC(qkracer_state::write_g)); + m_maincpu->write_l().set(FUNC(qkracer_state::write_l)); + m_maincpu->read_in().set(FUNC(qkracer_state::read_in)); + m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0xdf, 0x7f); + m_display->set_segmask(0x20, 0x41); // equals sign + config.set_default_layout(layout_qkracer); + + // no sound! +} + +// roms + +ROM_START( qkracer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor Cops Pocket Assistant (CPA) + * COP444 MCU label COP444L-JXY/N + * 8-digit 7seg display, 1-bit sound + + It's a programmable COP400 series MCU simulator, on a COP400 series MCU. + Note that this MCU doesn't have executable RAM, so it truly is a simulator. + The hardware/PCB and the green clamshell are identical to Mattel Dalla$. + +***************************************************************************/ + +// handlers: see mdallas_state + +// config + +static INPUT_PORTS_START( copspa ) + PORT_START("IN.0") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / CLRA") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / LQID") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / COMP") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / CAB") + + PORT_START("IN.1") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / RC") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / SC") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / ASC") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / CBA") + + PORT_START("IN.2") // G2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / SKC") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / SKE") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_NAME("A / JP") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_NAME("B / JSR") + + PORT_START("IN.3") // G3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_NAME("C / LBI") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_NAME("D / SMB") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_NAME("E / RMB") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_NAME("F / SKMB") + + PORT_START("IN.4") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_NAME("Prog") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("SS / AISC") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("Run / STII") + + PORT_START("IN.5") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_NAME("Exec / LD") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_NAME("Reset / X") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_NAME("Modify / XIS") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_NAME("Disp / XDS") +INPUT_PORTS_END + +// roms + +ROM_START( copspa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cop444l-jxy_n", 0x0000, 0x0800, CRC(8e5da5d2) SHA1(d557a5ede206fa0dff7b549acef9e0ef48e48c8a) ) +ROM_END + + + + + +/*************************************************************************** + + SCAT specialist calculators + * COP404LSN-5 MCU (no internal ROM) + * 2KB EPROM (ETC2716Q) + * 8-digit 7seg led display + + SCAT = aka South Carolina(SC) Applied Technology, Inc. + + Known products, assumed to be all on the same hardware: + - The Dimension (aka Feet & Inch Calculator) + - The Solution + - Metalmate + + CKI was measured ~1.469MHz, but D0 was measured ~77.44Hz so that means real + clock speed is a bit higher than CKI measurement, and the clock divider is 32. + +***************************************************************************/ + +class scat_state : public hh_cop400_state +{ +public: + scat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void scat(machine_config &config); + +private: + void main_map(address_map &map); + + void update_display(); + void write_d(u8 data); + void write_g(u8 data); + void write_l(u8 data); + u8 read_in(); +}; + +// handlers + +void scat_state::update_display() +{ + m_display->matrix(~(m_d | m_g << 4), bitswap<8>(m_l,0,1,2,3,4,5,6,7)); +} + +void scat_state::write_d(u8 data) +{ + // D: select digit, input mux (low) + m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); + m_d = data & 0xf; + update_display(); +} + +void scat_state::write_g(u8 data) +{ + // G: select digit, input mux (high) + m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); + m_g = data & 0xf; + update_display(); +} + +void scat_state::write_l(u8 data) +{ + // L: digit segment data + m_l = data; + update_display(); +} + +u8 scat_state::read_in() +{ + // IN: multiplexed inputs + return read_inputs(6, 0xf); +} + +void scat_state::main_map(address_map &map) +{ + map(0x0000, 0x07ff).rom(); +} + +// config + +static INPUT_PORTS_START( solution ) + PORT_START("IN.0") // D0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / Enter") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / ppm") + + PORT_START("IN.1") // D1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Atoms / Mole") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Atomic Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / %") + + PORT_START("IN.2") // D2 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Density Wntd.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Orig. Density") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Eq. Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / Normal") + + PORT_START("IN.3") // D3 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Conc. Wntd.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Orig. Conc.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Fmla. Wt.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / Molar") + + PORT_START("IN.4") // G0 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Milli.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Micro.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Gram") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Liter") + + PORT_START("IN.5") // G1 port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Known Vol.") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Known Wt.") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Dil. Wntd.") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") +INPUT_PORTS_END + +void scat_state::scat(machine_config &config) +{ + // basic machine hardware + COP404L(config, m_maincpu, 1500000); // R/C OSC via MM74C14N + m_maincpu->set_config(COP400_CKI_DIVISOR_32, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->set_addrmap(AS_PROGRAM, &scat_state::main_map); + m_maincpu->write_d().set(FUNC(scat_state::write_d)); + m_maincpu->write_g().set(FUNC(scat_state::write_g)); + m_maincpu->write_l().set(FUNC(scat_state::write_l)); + m_maincpu->read_in().set(FUNC(scat_state::read_in)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_scat); + + // no sound! +} + +// roms + +ROM_START( solution ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "etc2716q", 0x0000, 0x0800, CRC(cf990f88) SHA1(6d505fdc94028cbdf6445df9e9451156a9d5f372) ) // no custom label +ROM_END + + + + + +/*************************************************************************** + + Select Merchandise Video Challenger + * COP420 MCU label COP420-TDX/N + * 6-digit 7seg led display, 3 other leds, 4-bit sound + + This is a lightgun with scorekeeping. The "games" themselves were released + on VHS tapes. To determine scoring, the lightgun detects strobe lighting + from objects in the video. + + known releases: + - Japan: Video Challenger, published by Takara + - UK: Video Challenger, published by Bandai + - Canada: Video Challenger, published by Irwin + +***************************************************************************/ + +class vidchal_state : public hh_cop400_state +{ +public: + vidchal_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cop400_state(mconfig, type, tag) + { } + + void vidchal(machine_config &config); + +private: + void update_display(); + void write_d(u8 data); + void write_l(u8 data); + DECLARE_WRITE_LINE_MEMBER(write_sk); +}; + +// handlers + +void vidchal_state::update_display() +{ + m_display->matrix(m_d | m_sk << 6, m_l); +} + +void vidchal_state::write_d(u8 data) +{ + // D: CD4028BE to digit select + m_d = 1 << data & 0x3f; + update_display(); +} + +void vidchal_state::write_l(u8 data) +{ + // L: digit segment data + m_l = bitswap<8>(data,0,3,1,5,4,7,2,6); + update_display(); +} + +WRITE_LINE_MEMBER(vidchal_state::write_sk) +{ + // SK: hit led + m_sk = state; + update_display(); +} + +// config + +static INPUT_PORTS_START( vidchal ) + PORT_START("IN.0") // port IN + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Light Sensor") +INPUT_PORTS_END + +void vidchal_state::vidchal(machine_config &config) +{ + // basic machine hardware + COP420(config, m_maincpu, 900000); // approximation + m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_maincpu->write_d().set(FUNC(vidchal_state::write_d)); + m_maincpu->write_g().set("dac", FUNC(dac_byte_interface::data_w)); + m_maincpu->write_l().set(FUNC(vidchal_state::write_l)); + m_maincpu->read_in().set_ioport("IN.0"); + m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6+1, 8); + m_display->set_segmask(0x3f, 0xff); + config.set_default_layout(layout_vidchal); + + // sound hardware + SPEAKER(config, "mono").front_center(); + DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC +} + +// roms + +ROM_START( vidchal ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, einvaderc_state, empty_init, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, unkeinv, 0, 0, unkeinv, unkeinv, unkeinv_state, empty_init, "Gordon Barlow Design", "unknown electronic Space Invaders game (patent)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) + +CONS( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, mbaskb2, 0, 0, mbaskb2, mbaskb2, mbaskb2_state, empty_init, "Mattel Electronics", "Basketball 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, msoccer2, 0, 0, msoccer2, msoccer2, mbaskb2_state, empty_init, "Mattel Electronics", "Soccer 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, lafootb, 0, 0, lafootb, lafootb, lafootb_state, empty_init, "Mattel Electronics", "Look Alive! Football", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, mdallas, 0, 0, mdallas, mdallas, mdallas_state, empty_init, "Mattel Electronics", "Dalla$ (J.R. handheld)", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** +CONS( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight - The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, bship82, bship, 0, bship82, bship82, bship82_state, empty_init, "Milton Bradley", "Electronic Battleship (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1979, qkracer, 0, 0, qkracer, qkracer, qkracer_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "Cops Pocket Assistant", MACHINE_SUPPORTS_SAVE ) + +COMP( 1984, solution, 0, 0, scat, solution, scat_state, empty_init, "SCAT", "The Solution", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1987, vidchal, 0, 0, vidchal, vidchal, vidchal_state, empty_init, "Select Merchandise", "Video Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_cops1.cpp b/src/mame/handheld/hh_cops1.cpp new file mode 100644 index 00000000000..62134295653 --- /dev/null +++ b/src/mame/handheld/hh_cops1.cpp @@ -0,0 +1,850 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +National Semiconductor COPS(MM57 MCU series) handhelds + +MCU die label for MM5799 games says MM4799, but they are in fact MM5799. + +ROM source notes when dumped from another publisher, but confident it's the same: +- cambrp: Radio Shack EC-4001 Programmable + +TODO: +- qkracerm link cable (already tested locally and it works, so driver notes + and MCU serial emulation are good enough) + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/cops1/mm5799.h" +#include "machine/ds8874.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "cambrp.lh" +#include "mbaskb.lh" +#include "mhockey.lh" +#include "mhockeya.lh" +#include "msoccer.lh" +#include "qkracerm.lh" +#include "qkspeller.lh" + +//#include "hh_cops1_test.lh" // common test-layout - use external artwork + + +class hh_cops1_state : public driver_device +{ +public: + hh_cops1_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<9> m_inputs; // max 9 + + u16 m_inp_mux = 0; + u16 m_grid = 0; + + // MCU output pin state + u8 m_s = 0; + u8 m_do = 0; + u8 m_f = 0; + int m_blk = false; + + u8 read_inputs(int columns); +}; + + +// machine start/reset + +void hh_cops1_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_s)); + save_item(NAME(m_do)); + save_item(NAME(m_f)); + save_item(NAME(m_blk)); +} + +void hh_cops1_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_cops1_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Mattel Basketball (model 2437) + * PCB label: MA 6017/18/19 + * MM5799 MCU die bonded directly to PCB (die label MM4799 C NCX) + * 4001 and 74154, also bonded to PCB + * 2-digit 7seg led display, 21 leds, 2-bit sound + + Mattel Soccer (model 2678) + * MCU die label MM4799 C NDC + * same hardware as Basketball + + Mattel Hockey (model 2946) + * MCU die label MM4799 C NFR + * same hardware as Basketball + + Judging from videos online, there are two versions of Basketball. One where + the display shows "12" at power-on(as on MAME), and one that shows "15". + + There's also an older version of Hockey, it has the same ROM as Soccer. + This version wasn't sold in the USA. It is commonly known as the Canadian + version, though it was also released in Europe and Japan. + +***************************************************************************/ + +class mbaskb_state : public hh_cops1_state +{ +public: + mbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag) + { } + + void mbaskb(machine_config &config); + void msoccer(machine_config &config); + void mhockey(machine_config &config); + void mhockeya(machine_config &config); + +private: + void update_display(); + void write_do(u8 data); + void write_blk(int state); + void write_s(u8 data); + void write_f(u8 data); + u8 read_f(); +}; + +// handlers + +void mbaskb_state::update_display() +{ + // DO4321: 74154 CBAD + u8 d = (m_do >> 1 & 7) | (m_do << 3 & 8); + u16 sel = m_blk ? (1 << d) : 0; + + // 74154 output 2,6: speaker out + u8 spk = bitswap<2>(sel, 6,2); + m_speaker->level_w(spk); + + // 74154 output 3-5,10-13: digit/led select + u8 dsp = bitswap<7>(sel, 11,4,12,5,13,3,10); + m_display->matrix((m_f << 5 & 0x80) | dsp, m_s); +} + +void mbaskb_state::write_do(u8 data) +{ + // DO: 74154 inputs + m_do = data; + update_display(); +} + +void mbaskb_state::write_blk(int state) +{ + // BLK: 74154 enable + m_blk = state; + update_display(); +} + +void mbaskb_state::write_s(u8 data) +{ + // Sa-Sg: digit segment/led data + m_s = data; + update_display(); +} + +void mbaskb_state::write_f(u8 data) +{ + // F3: led data + m_f = data; + update_display(); +} + +u8 mbaskb_state::read_f() +{ + // F1: difficulty switch + // F2: N/C or tied high + return m_inputs[2]->read() | (m_f & 2); +} + +// config + +static INPUT_PORTS_START( mbaskb ) + PORT_START("IN.0") // port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // INB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // both buttons + + PORT_START("IN.2") // F1 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( mhockeya ) + PORT_INCLUDE( mbaskb ) + + PORT_MODIFY("IN.2") // F2 + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_CUSTOM ) // tied high to select Hockey +INPUT_PORTS_END + +void mbaskb_state::mbaskb(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 370000); // approximation + m_maincpu->write_do().set(FUNC(mbaskb_state::write_do)); + m_maincpu->write_blk().set(FUNC(mbaskb_state::write_blk)); + m_maincpu->write_s().set(FUNC(mbaskb_state::write_s)); + m_maincpu->write_f().set(FUNC(mbaskb_state::write_f)); + m_maincpu->read_f().set(FUNC(mbaskb_state::read_f)); + m_maincpu->read_k().set_ioport("IN.0"); + m_maincpu->read_inb().set_ioport("IN.1"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(3, 0x7f); + m_display->set_bri_levels(0.015, 0.2); // ball led is brighter + config.set_default_layout(layout_mbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void mbaskb_state::msoccer(machine_config &config) +{ + mbaskb(config); + config.set_default_layout(layout_msoccer); + + m_display->set_bri_levels(0.005, 0.05, 0.2); // goalie is darker +} + +void mbaskb_state::mhockey(machine_config &config) +{ + mbaskb(config); + config.set_default_layout(layout_mhockey); +} + +void mbaskb_state::mhockeya(machine_config &config) +{ + msoccer(config); + config.set_default_layout(layout_mhockeya); +} + +// roms + +ROM_START( mbaskb ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ncx", 0x0000, 0x0200, CRC(d0e5fce1) SHA1(04708c043a763bf92d765095e9551388a1d967e8) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( msoccer ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( mhockeya ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + +ROM_START( mhockey ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_nfr", 0x0000, 0x0200, CRC(979e5c5b) SHA1(e6c81572f47d93f4c13472f477aac67e05841976) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Racer (MM5799 version) + * MM5799 MCU die bonded directly to PCB (die label MM4799 C DUZ) + * DS8874 LED driver, die bonded to PCB as well + * 8-digit 7seg led display(1 custom digit), 1 green led, no sound + * optional link cable to compete with another player (see patent US4051605) + + This is the first version of QuizKid Racer, the 2nd release is on a + COP420 MCU, see hh_cop400.cpp. + +***************************************************************************/ + +class qkracerm_state : public hh_cops1_state +{ +public: + qkracerm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void qkracerm(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + u8 read_f(); + u8 read_k(); + int read_si(); +}; + +// handlers + +void qkracerm_state::update_display() +{ + m_display->matrix(m_grid, m_s); +} + +void qkracerm_state::ds8874_output_w(u16 data) +{ + // DS8874 outputs: digit select, input mux + m_grid = ~data; + m_inp_mux = m_grid >> 3; + update_display(); +} + +void qkracerm_state::write_do(u8 data) +{ + // DO1: DS8874 CP + // DO4: DS8874 _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 3)); +} + +void qkracerm_state::write_s(u8 data) +{ + // Sa-Sg: digit segment data + // Sp: link data out + m_s = data; + update_display(); +} + +u8 qkracerm_state::read_f() +{ + // F1: N/C + // F2: link cable detected + // F3: link data in + return m_maincpu->f_output_r() & 1; +} + +u8 qkracerm_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +int qkracerm_state::read_si() +{ + // SI: link master(1)/slave(0) + return 0; +} + +// config + +static INPUT_PORTS_START( qkracerm ) + PORT_START("IN.0") // DS8874 OUT 4 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") + + PORT_START("IN.1") // DS8874 OUT 5 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.2") // DS8874 OUT 6 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // DS8874 OUT 7 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // DS8874 OUT 8 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void qkracerm_state::qkracerm(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 220000); // approximation + m_maincpu->set_option_ram_d12(true); + m_maincpu->set_option_lb_10(5); + m_maincpu->write_do().set(FUNC(qkracerm_state::write_do)); + m_maincpu->write_s().set(FUNC(qkracerm_state::write_s)); + m_maincpu->read_f().set(FUNC(qkracerm_state::read_f)); + m_maincpu->read_k().set(FUNC(qkracerm_state::read_k)); + m_maincpu->read_si().set(FUNC(qkracerm_state::read_si)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(qkracerm_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0xdf, 0x7f); + m_display->set_segmask(0x20, 0x41); // equals sign + config.set_default_layout(layout_qkracerm); + + // no sound! +} + +// roms + +ROM_START( qkracerm ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_duz", 0x0000, 0x0200, CRC(8b484d2a) SHA1(809e902a11e23bed010ac795ab8dc50e5c1869dc) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_qkracerm_output.pla", 0, 254, CRC(f095fc51) SHA1(e3321d5cc4ecef363df7ef94f47e860c7a6d8c7e) ) +ROM_END + + + + + +/*************************************************************************** + + National Semiconductor QuizKid Speller + * MM5799 MCU die bonded directly to PCB (die label MM4799 C NDF) + * 2-digit 7seg led display, green led, red led, no sound + + The manual included 99 pictures for matching the words, with increased + difficulty. For example 10 = owl, 90 = kangaroo. + + Modes: + - Spell: match numbered picture with word + - Learn: same as Spell, but only the 1st letter + - Game: player 1 enters word, player 2 needs to guess it + +***************************************************************************/ + +class qkspeller_state : public hh_cops1_state +{ +public: + qkspeller_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag) + { } + + void qkspeller(machine_config &config); + +private: + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + void write_f(u8 data); + u8 read_f(); + u8 read_k(); +}; + +// handlers + +void qkspeller_state::update_display() +{ + m_display->matrix((m_f << 1 & 0xc) | (m_do & 3), m_inp_mux); +} + +void qkspeller_state::write_do(u8 data) +{ + // DO1,DO2: digit select + m_do = data; + update_display(); +} + +void qkspeller_state::write_s(u8 data) +{ + // S: digit segment data, input mux + m_inp_mux = data; + update_display(); +} + +void qkspeller_state::write_f(u8 data) +{ + // F2,F3: led data + m_f = data; + update_display(); +} + +u8 qkspeller_state::read_f() +{ + // F1: 3-pos switch (GND, floating, Vcc) + if (m_inputs[8]->read() == 2) + return m_f; + else + return (m_inputs[8]->read() & 1) | (m_f & ~1); +} + +u8 qkspeller_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +static INPUT_PORTS_START( qkspeller ) + PORT_START("IN.0") // Sa port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + + PORT_START("IN.1") // Sb port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + + PORT_START("IN.2") // Sc port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + + PORT_START("IN.3") // Sd port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + + PORT_START("IN.4") // Se port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_NAME("Erase") + + PORT_START("IN.5") // Sf port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // Sg port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.7") // Sp port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Start") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Next") + + PORT_START("IN.8") // F1 + PORT_CONFNAME( 0x03, 0x00, "Mode" ) + PORT_CONFSETTING( 0x00, "Spell" ) + PORT_CONFSETTING( 0x02, "Learn" ) + PORT_CONFSETTING( 0x01, "Game" ) + + PORT_START("TEST.0") // INB test pad + PORT_CONFNAME( 0x01, 0x00, "Factory Test 1" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("TEST.1") // DO3 test pad + PORT_CONFNAME( 0x01, 0x00, "Factory Test 2" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) +INPUT_PORTS_END + +void qkspeller_state::qkspeller(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 220000); // approximation + m_maincpu->write_do().set(FUNC(qkspeller_state::write_do)); + m_maincpu->write_s().set(FUNC(qkspeller_state::write_s)); + m_maincpu->write_f().set(FUNC(qkspeller_state::write_f)); + m_maincpu->read_f().set(FUNC(qkspeller_state::read_f)); + m_maincpu->read_k().set(FUNC(qkspeller_state::read_k)); + m_maincpu->read_inb().set_ioport("TEST.0"); + m_maincpu->read_do3().set_ioport("TEST.1"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_qkspeller); + + // no sound! +} + +// roms + +ROM_START( qkspeller ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm4799_c_ndf", 0x0000, 0x0200, CRC(0f497a12) SHA1(78eb79dcc414ed2a955450ffb3be431ecc2edb0c) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) +ROM_END + + + + + +/*************************************************************************** + + Sinclair Radionics Cambridge Programmable + * MM5799 MCU (label MM5799NBP/N, die label MM4799 C NBP) + * DS8874 LED driver, 9-digit 7seg led display + + It's a programmable pocket calculator, up to 36 steps. 2 MCU revisions + are known: MM5799EHY and MM5799NBP. + + 4 program libraries were available: + - Vol. 1: General / Finance / Statistics + - Vol. 2: Mathematics + - Vol. 3: Physics & Engineering + - Vol. 4: Electronics + + Paste example: CCSS200SR 2-32+.12131*.5=.5.201=50.200 CSS200C + Now enter a value under 70, followed by RUN, to calculate its factorial. + + known releases: + - World: Cambridge Programmable, published by Sinclair Radionics + - USA: EC-4001 Programmable, published by Tandy Corporation, Radio Shack brand + +***************************************************************************/ + +class cambrp_state : public hh_cops1_state +{ +public: + cambrp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_cops1_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void cambrp(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_do(u8 data); + void write_s(u8 data); + u8 read_f(); + u8 read_k(); +}; + +// handlers + +void cambrp_state::update_display() +{ + m_display->matrix(m_grid, m_s); +} + +void cambrp_state::ds8874_output_w(u16 data) +{ + // DS8874 outputs: digit select, input mux + m_grid = ~data; + m_inp_mux = m_grid >> 2; + update_display(); +} + +void cambrp_state::write_do(u8 data) +{ + // DO1: DS8874 CP + // DO4: DS8874 _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 3)); +} + +void cambrp_state::write_s(u8 data) +{ + // S: digit segment data + // (DS8874 low battery out also connects to Sp) + m_s = data; + update_display(); +} + +u8 cambrp_state::read_f() +{ + // F2: K3, other: N/C + return (~read_inputs(6) >> 1 & 2) | (m_maincpu->f_output_r() & ~2); +} + +u8 cambrp_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( cambrp ) + PORT_START("IN.0") // DS8874 OUT 3 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / stop / +/-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / () / R>D") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('=') PORT_NAME("= / -") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("Up/Downshift") + + PORT_START("IN.1") // DS8874 OUT 4 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / " UTF8_SQUAREROOT "x / go if neg") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / sin / arcsin") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') PORT_NAME("- / -x / F") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR('C') PORT_NAME("C/CE / step") + + PORT_START("IN.2") // DS8874 OUT 5 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / sto / go to") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / cos / arccos") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') PORT_NAME(u8"÷ / 1/x / G") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("RUN / learn") + + PORT_START("IN.3") // DS8874 OUT 6 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / ChN/# / D>R") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / tan / arctan") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') PORT_NAME("+ / 2x / E") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // DS8874 OUT 7 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / ln x / e" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_NAME("./EE/_ / Downshift / A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') PORT_NAME("× / x" UTF8_POW_2 " / .") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // DS8874 OUT 8 port K + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / rcl / MEx") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cambrp_state::cambrp(machine_config &config) +{ + // basic machine hardware + MM5799(config, m_maincpu, 200000); // approximation + m_maincpu->set_option_ram_d12(true); + m_maincpu->set_option_lb_10(4); + m_maincpu->write_do().set(FUNC(cambrp_state::write_do)); + m_maincpu->write_s().set(FUNC(cambrp_state::write_s)); + m_maincpu->read_f().set(FUNC(cambrp_state::read_f)); + m_maincpu->read_k().set(FUNC(cambrp_state::read_k)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(cambrp_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_cambrp); + + // no sound! +} + +// roms + +ROM_START( cambrp ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm5799nbp_n", 0x0000, 0x0200, CRC(f4e9063b) SHA1(04b7bf24e994cd453584d233405621f8110feded) ) + ROM_CONTINUE( 0x0400, 0x0400 ) + + ROM_REGION( 254, "maincpu:opla", 0 ) + ROM_LOAD( "mm5799_cambrp_output.pla", 0, 254, CRC(eb882256) SHA1(acd77c066a7b7d18c3ea10f137a45ab83d1c53e1) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1978, mbaskb, 0, 0, mbaskb, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Basketball (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, msoccer, 0, 0, msoccer, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Soccer (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mhockey, 0, 0, mhockey, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, US version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mhockeya, mhockey, 0, mhockeya, mhockeya, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, export version)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1977, qkracerm, qkracer, 0, qkracerm, qkracerm, qkracerm_state, empty_init, "National Semiconductor", "QuizKid Racer (MM5799 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NODEVICE_LAN ) +CONS( 1978, qkspeller, 0, 0, qkspeller, qkspeller, qkspeller_state, empty_init, "National Semiconductor", "QuizKid Speller", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** + +COMP( 1977, cambrp, 0, 0, cambrp, cambrp, cambrp_state, empty_init, "Sinclair Radionics", "Cambridge Programmable", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_hmcs40.cpp b/src/mame/handheld/hh_hmcs40.cpp new file mode 100644 index 00000000000..347d603f2fb --- /dev/null +++ b/src/mame/handheld/hh_hmcs40.cpp @@ -0,0 +1,5345 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/*************************************************************************** + +Hitachi HMCS40 MCU tabletops/handhelds or other simple devices, +most of them are VFD electronic games/toys. + +known chips: + + serial device etc. +---------------------------------------------------------------- + @A07 HD38750 1979, Bambino Knock-Em Out Boxing (ET-06B) + @A08 HD38750 1979, Bambino Dribble Away Basketball (ET-05) + @A45 HD38750 1981, VTech Invaders + *A56 HD38750 1981, Actronics(Hanzawa) Twinvader (small brown version) + *A58 HD38750 1981, Actronics(Hanzawa) Challenge Racer/Ludotronic(Hanzawa) Grand Prix Turbo + *A62 HD38750 1982, Actronics(Hanzawa) Pack'n Maze + @A67 HD38750 1982, Romtec Pucki & Monsters (ET-803) + + @A04 HD38800 1980, Gakken Heiankyo Alien + A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp + *A20 HD38800 1981, Entex Super Space Invader 2 + @A25 HD38800 1981, Coleco Alien Attack + @A27 HD38800 1981, Bandai Packri Monster + @A31 HD38800 1981, Entex Select-A-Game cartridge: Space Invader 2 -> sag.cpp - also used in 2nd version of Super Space Invader 2! + A36 HD38800 1981, Entex Select-A-Game cartridge: Pac-Man 2 -> " + A37 HD38800 1981, Entex Select-A-Game cartridge: Baseball 4 -> " + A38 HD38800 1981, Entex Select-A-Game cartridge: Pinball -> " + *A41 HD38800 1982, Gakken Puck Monster + *A42 HD38800 1981, Akai GX-77 + *A51 HD38800 1981, Actronics(Hanzawa) Twinvader (larger white version) + @A70 HD38800 1982, Coleco Galaxian + @A73 HD38800 1982, Mattel Star Hawk (PT-317B) + @A77 HD38800 1982, Bandai Frisky Tom (PT-327A) + @A88 HD38800 1982, Tomy Tron (THN-02) + @B01 HD38800 1982, Gakken Crazy Kong + @B19 HD38800 1982, Bandai Zaxxon + @B23 HD38800 1982, Tomy Kingman (THF-01II) + @B24 HD38800 1982, Actronics(Hanzawa) Wanted G-Man + @B29 HD38800 1984, Tomy Bombman + *B31 HD38800 1983, Romtec Frog Prince (ET-806) + *B35 HD38800 1983, Bandai Gundam vs Gelgoog Zaku + @B42 HD38800 1983, Bandai Kiteyo Parman + @B43 HD38800 1983, Bandai Dokodemo Dorayaki Doraemon (PT-412) + @B48 HD38800 1983, Bandai Toukon Juohmaru + @B52 HD38800 1983, Bandai Ultraman Monster Battle (PT-424) + + @A09 HD38820 1980, Mattel World Championship Baseball + @A13 HD38820 1981, Entex Galaxian 2 + @A23 HD38820 1981, Entex Pac Man 2 + @A28 HD38820 1981, Coleco Pac-Man (ver 1) + @A29 HD38820 1981, Coleco Pac-Man (ver 2) + @A32 HD38820 1982, Gakken Super Cobra + *A38 HD38820 1982, Entex Crazy Climber + @A42 HD38820 1982, Entex Stargate + @A43 HD38820 1982, Entex Turtles + @A45 HD38820 1982, Coleco Donkey Kong + @A49 HD38820 1983, Bandai Zackman + @L53 HD38820 1983, Gakken Defender + @A61 HD38820 1983, Coleco Ms. Pac-Man + *A62 HD38820 1983, Coleco Zaxxon + @A63 HD38820 1983, Bandai Pengo + @A65 HD38820 1983, Bandai Burger Time (PT-389) + @A69 HD38820 1983, Gakken Dig Dug + @A70 HD38820 1983, Parker Brothers Q*Bert + @A75 HD38820 1983, Bandai Go Go Dynaman + @A85 HD38820 1984, Bandai Machine Man (PT-438) + @A88 HD38820 1984, Bandai Pair Match (PT-460) (1/2) + @A89 HD38820 1984, Bandai Pair Match (PT-460) (2/2) + + A34 HD44801 1981, SciSys Mini Chess -> saitek_minichess.cpp + A50 HD44801 1981, CXG Sensor Computachess -> cxg_scptchess.cpp + A75 HD44801 1982, Alpha 8201 protection MCU -> machine/alpha8201.* + *A85 HD44801 1982, SciSys Travel Sensor / Travel Mate / Chesspartner 5000/6000 + *A92 HD44801 1982, SciSys Play Bridge Computer + B35 HD44801 1983, Alpha 8302 protection MCU (see 8201) + B42 HD44801 1983, Alpha 8303 protection MCU (see 8201) + *B43 HD44801 1983, Alpha 8304 protection MCU (see 8201) + C57 HD44801 1985, Alpha 8505 protection MCU (see 8201) + C89 HD44801 1985, CXG Portachess (1985 version) -> cxg_scptchess.cpp + + *A86 HD44820 1983, Chess King Pocket Micro + *B63 HD44820 1985, CXG Pocket Chess (12 buttons) + + *A13 HD44840 1982, CXG Computachess II + *A14 HD44840 1982, CXG Computachess II / Advanced Portachess + + *B55 HD44860 1987, Saitek Pro Bridge 100 + + *A04 HD44868 1984, SciSys Rapier + *A07 HD44868 1984, Chess King Pocket Micro Deluxe + *A12 HD44868 1985, SciSys MK 10 / Pocket Chess + *A14 HD44868 1985, SciSys Kasparov Plus + + (* means undumped unless noted, @ denotes it's in this driver) + +============================================================================ + +ROM source notes when dumped from another model, but confident it's the same: +- gckong: CGL Super Kong +- ggdman: Bandai Kampf der Monster +- ghalien: CGL Earth Invaders +- kingman: Tandy Kingman +- wantgman: Ludotronic Operation 'Z' +- zackman: Tandy Zackman + +TODO: +- cgalaxn discrete sound (alien attacking sound effect) +- gckong glitchy jump on 1st level (rarely happens), caused by MCU stack overflow. + It can be tested by jumping up repeatedly at the start position under the ladder, + if the glitch happens there, you can jump onto the 2nd floor. +- epacman2 booting the game in demo mode, pacman should take the shortest route to + the upper-left power pill: mcu cycle/interrupt timing related +- kevtris's HMCS40 ROM dumps are incomplete, missing MCU factory test code from + the 2nd half of the ROM, none of the games access it though and it's impossible + to execute unless the chip is in testmode. +- Though very uncommon when compared to games with LED/lamp display, some + games may manipulate VFD plate brightness by strobing it longer/shorter, + eg. cgalaxn when a ship explodes. +- bzaxxon 3D effect is difficult to simulate +- improve/redo SVG for: bzaxxon, bbtime +- add SVG for: ggdman, ktparman, tkjmaru, gdefender, bombman, wantgman, puckimon +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/hmcs40/hmcs40.h" +#include "cpu/cop400/cop400.h" +#include "video/pwm.h" +#include "machine/gen_latch.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork (complete) +#include "pairmtch.lh" + +// internal artwork (bezel overlay) +#include "bambball.lh" +#include "gckong.lh" +#include "mwcbaseb.lh" +#include "msthawk.lh" +#include "packmon.lh" + +#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_hmcs40_state : public driver_device +{ +public: + hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<7> m_inputs; // max 7 + + // misc common + u8 m_r[8] = { }; // MCU R ports write data (optional) + u16 m_d = 0; // MCU D port write data (optional) + u8 m_int[2] = { }; // MCU INT0/1 pins state + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u64 m_plate = 0; // VFD current column data + + u16 read_inputs(int columns); + void refresh_interrupts(void); + void set_interrupt(int line, int state); +}; + + +// machine start/reset + +void hh_hmcs40_state::machine_start() +{ + // register for savestates + save_item(NAME(m_r)); + save_item(NAME(m_int)); + save_item(NAME(m_d)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_hmcs40_state::machine_reset() +{ + refresh_interrupts(); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_hmcs40_state::read_inputs(int columns) +{ + u16 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + +// interrupt handling + +void hh_hmcs40_state::refresh_interrupts() +{ + for (int i = 0; i < 2; i++) + m_maincpu->set_input_line(i, m_int[i] ? ASSERT_LINE : CLEAR_LINE); +} + +void hh_hmcs40_state::set_interrupt(int line, int state) +{ + line = line ? 1 : 0; + state = state ? 1 : 0; + + if (state != m_int[line]) + { + if (machine().phase() >= machine_phase::RESET) + m_maincpu->set_input_line(line, state ? ASSERT_LINE : CLEAR_LINE); + m_int[line] = state; + } +} + +INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line) +{ + set_interrupt((int)param, newval); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Actronics / Hanzawa Wanted G-Man + * Hitachi HD38800B24 MCU + * cyan/red VFD display + + known releases: + - World: Wanted G-Man, published by Actronics + - France: Operation 'Z', published by Ludotronic + +***************************************************************************/ + +class wantgman_state : public hh_hmcs40_state +{ +public: + wantgman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void wantgman(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void wantgman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void wantgman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void wantgman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D6: input mux + m_inp_mux = data >> 1 & 0x3f; + + // D1-D9,D13,D14: vfd grid + m_grid = (data >> 1 & 0x1ff) | (data >> 4 & 0x600); + update_display(); +} + +u16 wantgman_state::input_r() +{ + // D15: multiplexed inputs + return read_inputs(6) & 0x8000; +} + +// config + +static INPUT_PORTS_START( wantgman ) + PORT_START("IN.0") // D1 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D2 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // D3 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.3") // D4 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.4") // D5 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Skill / Start / Jump") + + PORT_START("IN.5") // D6 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Demo") +INPUT_PORTS_END + +void wantgman_state::wantgman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(wantgman_state::plate_w)); + m_maincpu->write_d().set(FUNC(wantgman_state::grid_w)); + m_maincpu->read_d().set(FUNC(wantgman_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 16); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( wantgman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b24", 0x0000, 0x1000, CRC(ad1dfb26) SHA1(f2ef0ec98116a8a38e97299e3e3b2b0129d78c04) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "wantgman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Dribble Away Basketball (manufactured in Japan) + * PCB label Emix Corp. ET-05 + * Hitachi HD38750A08 MCU + * cyan VFD display Emix-106, with bezel overlay + +***************************************************************************/ + +class bambball_state : public hh_hmcs40_state +{ +public: + bambball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bambball(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void bambball_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x(,D0-D3): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); + m_display->matrix(m_grid, plate); +} + +void bambball_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D10: input mux + m_inp_mux = data >> 7 & 0xf; + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D3: more plates (update display there) + plate_w(3 + 1, data & 0xf); +} + +u8 bambball_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( bambball ) + PORT_START("IN.0") // D7 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dribble Low") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Dribble Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Dribble High") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Shoot") + + PORT_START("IN.1") // D8 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // D9 port R0x + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Display") + + PORT_START("IN.3") // D10 port R0x + PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void bambball_state::bambball(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(bambball_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bambball_state::plate_w)); + m_maincpu->write_d().set(FUNC(bambball_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 478); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + config.set_default_layout(layout_bambball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bambball ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 281988, "screen", 0) + ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Knock-Em Out Boxing + * PCB label Emix Corp. ET-06B + * Hitachi HD38750A07 MCU + * cyan VFD display Emix-103, with blue or green color overlay + +***************************************************************************/ + +class bmboxing_state : public hh_hmcs40_state +{ +public: + bmboxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bmboxing(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void bmboxing_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u32 plate = bitswap<16>(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8); + m_display->matrix(grid, plate); +} + +void bmboxing_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x: vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmboxing_state::grid_w(u16 data) +{ + // D13: speaker out + m_speaker->level_w(data >> 13 & 1); + + // D9-D12: input mux + m_inp_mux = data >> 9 & 0xf; + + // D4-D12: vfd grid + m_grid = data >> 4 & 0x1ff; + update_display(); +} + +u8 bmboxing_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + * left = P2 side * * right = P1 side * + + [ BACK ] [ HIGH ] (players sw) [ HIGH ] [ BACK ] + 1<--->2 [START/ + [NORMAL] [MEDIUM] RESET] [MEDIUM] [NORMAL] + 1<---OFF--->2 + [ DUCK ] [ LOW ] (skill lvl sw) [ LOW ] [ DUCK ] +*/ + +static INPUT_PORTS_START( bmboxing ) + PORT_START("IN.0") // D9 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Punch High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Punch Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P1 Punch Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D10 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Position Normal") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Position Back") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P1 Position Ducking") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // D11 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Punch High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Punch Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P2 Punch Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D12 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Position Normal") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Position Back") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P2 Position Ducking") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // port D + PORT_CONFNAME( 0x0001, 0x0000, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0001, "2" ) + PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0002, "2" ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bmboxing_state::bmboxing(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(bmboxing_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bmboxing_state::plate_w)); + m_maincpu->write_d().set(FUNC(bmboxing_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.4"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 529); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmboxing ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 257144, "screen", 0) + ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Frisky Tom (manufactured in Japan) + * PCB label Kaken Corp., PT-327A + * Hitachi HD38800A77 MCU + * cyan/red/green VFD display Futaba DM-43ZK 2E + +***************************************************************************/ + +class bfriskyt_state : public hh_hmcs40_state +{ +public: + bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bfriskyt(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bfriskyt_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21); + m_display->matrix(grid, plate); +} + +void bfriskyt_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bfriskyt_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D5: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x3f0000); + update_display(); +} + +void bfriskyt_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bfriskyt ) + PORT_START("IN.0") // D11 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) + + PORT_START("IN.5") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void bfriskyt_state::bfriskyt(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bfriskyt_state::plate_w)); + m_maincpu->write_d().set(FUNC(bfriskyt_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 675); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 22); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bfriskyt ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 413577, "screen", 0) + ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Packri Monster (manufactured in Japan) + * PCB label DM-21ZA2 + * Hitachi HD38800A27 MCU + * cyan/red/green VFD display Futaba DM-21ZK 2B, with bezel overlay + + known releases: + - Japan: FL Packri Monster, published by Bandai + - USA(World?): Packri Monster, published by Bandai + - USA/Canada: Hungry Monster, published by Tandy + - other: Gobble Man/Ogre Monster, published by Tandy + +***************************************************************************/ + +class packmon_state : public hh_hmcs40_state +{ +public: + packmon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void packmon(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void packmon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + u32 plate = bitswap<24>(m_plate,23,22,21,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7); + m_display->matrix(grid, plate); +} + +void packmon_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D11-D15: input mux + m_inp_mux = data >> 11 & 0x1f; + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3: plate 9-12 (update display there) + plate_w(4, data & 0xf); +} + +u16 packmon_state::input_r() +{ + // D5: multiplexed inputs + return read_inputs(5) & 0x20; +} + +// config + +static INPUT_PORTS_START( packmon ) + PORT_START("IN.0") // D11 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START ) + + PORT_START("IN.1") // D12 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D13 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // D14 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.4") // D15 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) +INPUT_PORTS_END + +void packmon_state::packmon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(packmon_state::plate_w)); + m_maincpu->write_d().set(FUNC(packmon_state::grid_w)); + m_maincpu->read_d().set(FUNC(packmon_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 680); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + config.set_default_layout(layout_packmon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( packmon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 224386, "screen", 0) + ROM_LOAD( "packmon.svg", 0, 224386, CRC(b2ee5b6b) SHA1(e53b4d5a4118cc5fbec4656580c2aab76af8f8d7) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Zaxxon (manufactured in Japan, licensed from Sega) + * PCB label FL Zaxxon + * Hitachi HD38800B19 MCU + * cyan/red/blue VFD display NEC FIP11BM24T no. 4-8, half of it reflected + with a one-way mirror to give the illusion of a 3D display + +***************************************************************************/ + +class bzaxxon_state : public hh_hmcs40_state +{ +public: + bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bzaxxon(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bzaxxon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); + u32 plate = bitswap<24>(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; + m_display->matrix(grid, plate); +} + +void bzaxxon_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D10: input mux + u8 inp_mux = data >> 7 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0-D2: plate 7-9 (update display there) + plate_w(4, data & 7); +} + +void bzaxxon_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( bzaxxon ) + PORT_START("IN.0") // D7 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.1") // D8 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.2") // D9 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.3") // D10 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.5") // port D + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bzaxxon_state::bzaxxon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 450000); // approximation + m_maincpu->write_r<0>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bzaxxon_state::plate_w)); + m_maincpu->write_d().set(FUNC(bzaxxon_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(613, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bzaxxon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 521080, "screen", 0) + ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Zackman "The Pit, FL Exploration of Space" (manufactured in Japan) + * Hitachi QFP HD38820A49 MCU + * cyan/red/yellow VFD display Futaba DM-53Z 3E, with color overlay + + known releases: + - World: Zackman, published by Bandai + - USA: Zackman, published by Tandy + +***************************************************************************/ + +class zackman_state : public hh_hmcs40_state +{ +public: + zackman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void zackman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void zackman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D0,D1): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<32>(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12); + m_display->matrix(grid, plate); +} + +void zackman_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D11-D14: input mux + u8 inp_mux = data >> 11 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0,D1: plate 12,13 (update display there) + plate_w(7, data & 3); +} + +void zackman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( zackman ) + PORT_START("IN.0") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void zackman_state::zackman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(zackman_state::plate_w)); + m_maincpu->write_d().set(FUNC(zackman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(487, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( zackman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 910689, "screen", 0) + ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Pengo (manufactured in Japan, licensed from Sega) + * PCB label FL Pengo(in katakana) + * Hitachi QFP HD38820A63 MCU + * cyan/red/blue VFD display Futaba DM-68ZK 3D DM-63 + +***************************************************************************/ + +class bpengo_state : public hh_hmcs40_state +{ +public: + bpengo_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bpengo(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bpengo_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<32>(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bpengo_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bpengo_state::grid_w(u16 data) +{ + // D10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D0-D7: vfd grid + m_grid = data & 0xff; + update_display(); +} + +void bpengo_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( bpengo ) + PORT_START("IN.0") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) + + PORT_START("IN.5") // port D + PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0800, DEF_STR( On ) ) + PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bpengo_state::bpengo(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(bpengo_state::plate_w)); + m_maincpu->write_d().set(FUNC(bpengo_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 759); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 25); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bpengo ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 565069, "screen", 0) + ROM_LOAD( "bpengo.svg", 0, 565069, CRC(fb25ffeb) SHA1(fb4db5120f1e35e39c7fb2da4af3aa63417efaf1) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Burger Time (manufactured in Japan, licensed from Data East) + * PCB label Kaken Corp. PT-389 Burger Time + * Hitachi QFP HD38820A65 MCU + * cyan/red/green VFD display NEC FIP6AM25T no. 21-21 + +***************************************************************************/ + +class bbtime_state : public hh_hmcs40_state +{ +public: + bbtime_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bbtime(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bbtime_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); + u32 plate = bitswap<32>(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; + m_display->matrix(grid, plate); +} + +void bbtime_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bbtime_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(data >> 3 & 1); + + // D10-D14: input mux + u8 inp_mux = data >> 10 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D4-D9: vfd grid + m_grid = data >> 4 & 0x3f; + update_display(); +} + +void bbtime_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bbtime ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) + + PORT_START("IN.5") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void bbtime_state::bbtime(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(bbtime_state::plate_w)); + m_maincpu->write_d().set(FUNC(bbtime_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(379, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6, 28); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bbtime ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 461605, "screen", 0) + ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Kiteyo Parman + * Hitachi HD38800B42 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class ktparman_state : public hh_hmcs40_state +{ +public: + ktparman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ktparman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void ktparman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void ktparman_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(data >> 3 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D2: vfd plate (update display there) + plate_w(4, data & 7); +} + +// config + +static INPUT_PORTS_START( ktparman ) + PORT_START("IN.0") // port D + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void ktparman_state::ktparman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ktparman_state::plate_w)); + m_maincpu->write_d().set(FUNC(ktparman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 19); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ktparman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b42", 0x0000, 0x1000, CRC(ba1f7939) SHA1(1038d33923fcc87b5dd95954d5f964064a10ff9d) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "ktparman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Dokodemo Dorayaki Doraemon (FL LSI Game Push Up) (manufactured in Japan) + * PCB label Kaken Corp PT-412 FL-Doreamon(in katakana) + * Hitachi HD38800B43 MCU + * cyan/red/blue VFD display Futaba DM-71 + +***************************************************************************/ + +class bdoramon_state : public hh_hmcs40_state +{ +public: + bdoramon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bdoramon(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bdoramon_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); + u32 plate = bitswap<24>(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bdoramon_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D3: plate 15-18 (update display there) + plate_w(4, data & 0xf); +} + +// config + +static INPUT_PORTS_START( bdoramon ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) + + PORT_START("IN.2") // port D + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // port R2x + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void bdoramon_state::bdoramon(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->read_r<2>().set_ioport("IN.3"); + m_maincpu->write_r<3>().set(FUNC(bdoramon_state::plate_w)); + m_maincpu->write_d().set(FUNC(bdoramon_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.2"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 668); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bdoramon ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 624751, "screen", 0) + ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Toukon Juohmaru + * Hitachi HD38800B48 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class tkjmaru_state : public hh_hmcs40_state +{ +public: + tkjmaru_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void tkjmaru(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void tkjmaru_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void tkjmaru_state::grid_w(u16 data) +{ + // D4-D7: input mux + m_inp_mux = data >> 4 & 0xf; + + // D10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // D11-D15: vfd grid + m_grid = data >> 11 & 0x1f; + + // D0: vfd plate (update display there) + plate_w(4, data & 1); +} + +u16 tkjmaru_state::input_r() +{ + // D3: multiplexed inputs, D8,D9: fixed inputs + return read_inputs(4) | m_inputs[4]->read(); +} + +// config + +static INPUT_PORTS_START( tkjmaru ) + PORT_START("IN.0") // D4 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D5 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // D6 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.3") // D7 line D3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.4") // D8,D9 + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x200, 0x000, "Factory Test" ) + PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x200, DEF_STR( On ) ) +INPUT_PORTS_END + +void tkjmaru_state::tkjmaru(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(tkjmaru_state::plate_w)); + m_maincpu->write_d().set(FUNC(tkjmaru_state::grid_w)); + m_maincpu->read_d().set(FUNC(tkjmaru_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 17); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tkjmaru ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b48", 0x0000, 0x1000, CRC(249f357d) SHA1(0b5dad187a035db622790eb092b7be1ca7c57d97) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "tkjmaru.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Ultraman Monster Battle (FL LSI Game Push Up) (manufactured in Japan) + * PCB label Kaken Corp. PT-424 FL Ultra Man + * Hitachi HD38800B52 MCU + * cyan/red/blue VFD display NEC FIP8BM25T no. 21-8 2 + +***************************************************************************/ + +class bultrman_state : public hh_hmcs40_state +{ +public: + bultrman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bultrman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bultrman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D2): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2); + m_display->matrix(grid, plate); +} + +void bultrman_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D2: plate 15-17 (update display there) + plate_w(4, data & 7); +} + +// config + +static INPUT_PORTS_START( bultrman ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_CONFNAME( 0x0010, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0010, DEF_STR( On ) ) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bultrman_state::bultrman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 350000); // approximation + m_maincpu->write_r<0>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bultrman_state::plate_w)); + m_maincpu->write_d().set(FUNC(bultrman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 673); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bultrman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 405717, "screen", 0) + ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Go Go Dynaman + * Hitachi HD38820A75 MCU + * cyan/red/blue VFD display + + known releases: + - Japan: Go Go Dynaman, published by Bandai + - Germany: Kampf der Monster, published by Bandai + +***************************************************************************/ + +class ggdman_state : public hh_hmcs40_state +{ +public: + ggdman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ggdman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void ggdman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ggdman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R5x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ggdman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D6-D9: input mux + u8 inp_mux = data >> 6 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D11-D15: vfd grid + m_grid = data >> 11 & 0x1f; + update_display(); +} + +void ggdman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( ggdman ) + PORT_START("IN.0") // D6 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.1") // D7 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.2") // D8 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.3") // D9 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void ggdman_state::ggdman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(ggdman_state::plate_w)); + m_maincpu->write_d().set(FUNC(ggdman_state::grid_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 24); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ggdman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a75", 0x0000, 0x1000, CRC(14a9c064) SHA1(253a5decbf4219c1b457280e301b82388694e49f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "ggdman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Machine Man (FL Flat Type) (manufactured in Japan) + * PCB label Kaken PT-438 + * Hitachi QFP HD38820A85 MCU + * cyan/red/green VFD display NEC FIP5CM33T no. 4 21 + +***************************************************************************/ + +class machiman_state : public hh_hmcs40_state +{ +public: + machiman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void machiman(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void machiman_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18); + m_display->matrix(m_grid, plate); +} + +void machiman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x,R6012: vfd plate + int shift = (offset == 6) ? 16 : offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void machiman_state::grid_w(u16 data) +{ + // D13: speaker out + m_speaker->level_w(data >> 13 & 1); + + // D0-D4: vfd grid + m_grid = data & 0x1f; + update_display(); +} + +// config + +static INPUT_PORTS_START( machiman ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_BIT( 0x3fff, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY +INPUT_PORTS_END + +void machiman_state::machiman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(machiman_state::plate_w)); + m_maincpu->write_d().set(FUNC(machiman_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1534, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(5, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( machiman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 374097, "screen", 0) + ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Pair Match (manufactured in Japan) + * PCB label Kaken Corp. PT-460 + * Hitachi QFP HD38820A88 MCU(main), HD38820A89(audio) + * cyan/red VFD display + + This is a memory game, the difference is instead of pictures, the player + needs to match sound effects. It has an extra MCU for sound. The case is + shaped like a glossy black pyramid. Star Trek fans will recognize it as + a prop used in TNG Ten Forward. + +***************************************************************************/ + +class pairmtch_state : public hh_hmcs40_state +{ +public: + pairmtch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_audiocpu(*this, "audiocpu"), + m_soundlatch(*this, "soundlatch%u", 0) + { } + + void pairmtch(machine_config &config); + +private: + required_device m_audiocpu; + required_device_array m_soundlatch; + + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); + + void sound_w(u8 data); + void sound2_w(u8 data); + void speaker_w(u16 data); +}; + +// handlers: maincpu side + +void pairmtch_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void pairmtch_state::plate_w(offs_t offset, u8 data) +{ + // R2x,R3x,R6x: vfd plate + int shift = (offset == 6) ? 8 : (offset-2) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void pairmtch_state::grid_w(u16 data) +{ + // D7: sound reset (to audiocpu reset line) + m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); + + // D9: sound start (to audiocpu INT0) + m_audiocpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); + + // D10,D15: input mux + m_inp_mux = (data >> 10 & 1) | (data >> 14 & 2); + + // D0-D5: vfd grid + m_grid = data & 0x3f; + update_display(); +} + +u8 pairmtch_state::input_r() +{ + // R4x: multiplexed inputs + return read_inputs(2); +} + +void pairmtch_state::sound_w(u8 data) +{ + // R5x: soundlatch (to audiocpu R2x) + m_soundlatch[0]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); +} + +// handlers: audiocpu side + +void pairmtch_state::sound2_w(u8 data) +{ + // R2x: soundlatch (to maincpu R5x) + m_soundlatch[1]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); +} + +void pairmtch_state::speaker_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1: sound ack (to maincpu INT0) + m_maincpu->set_input_line(0, (data & 2) ? ASSERT_LINE : CLEAR_LINE); +} + +// config + +static INPUT_PORTS_START( pairmtch ) + PORT_START("IN.0") // D10 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.1") // D15 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // port D + PORT_CONFNAME( 0x0040, 0x0000, "Factory Test" ) + PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x0040, DEF_STR( On ) ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_CONFNAME( 0x0800, 0x0800, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x0800, "1" ) + PORT_CONFSETTING( 0x0000, "2" ) + PORT_CONFNAME( 0x3000, 0x2000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x2000, "1" ) + PORT_CONFSETTING( 0x1000, "2" ) + PORT_CONFSETTING( 0x0000, "3" ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x86bf, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pairmtch_state::pairmtch(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<2>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->read_r<4>().set(FUNC(pairmtch_state::input_r)); + m_maincpu->write_r<5>().set(FUNC(pairmtch_state::sound_w)); + m_maincpu->read_r<5>().set(m_soundlatch[1], FUNC(generic_latch_8_device::read)); + m_maincpu->write_r<6>().set(FUNC(pairmtch_state::plate_w)); + m_maincpu->write_d().set(FUNC(pairmtch_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.2"); + + HD38820(config, m_audiocpu, 400000); // approximation + m_audiocpu->write_r<2>().set(FUNC(pairmtch_state::sound2_w)); + m_audiocpu->read_r<2>().set(m_soundlatch[0], FUNC(generic_latch_8_device::read)); + m_audiocpu->write_d().set(FUNC(pairmtch_state::speaker_w)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 12); + config.set_default_layout(layout_pairmtch); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); + + GENERIC_LATCH_8(config, m_soundlatch[0]); + GENERIC_LATCH_8(config, m_soundlatch[1]); +} + +// roms + +ROM_START( pairmtch ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Alien Attack (manufactured in Taiwan) + * Hitachi HD38800A25 MCU + * cyan/red VFD display Futaba DM-19Z 1J + + It looks like Coleco took Gakken's Heiankyo Alien and turned it into a more + action-oriented game. + +***************************************************************************/ + +class alnattck_state : public hh_hmcs40_state +{ +public: + alnattck_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void alnattck(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void alnattck_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15); + m_display->matrix(m_grid, plate); +} + +void alnattck_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D7-D13: input mux + m_inp_mux = data >> 7 & 0x7f; + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3: plate 16-19 (update display there) + plate_w(4, data & 0xf); +} + +u16 alnattck_state::input_r() +{ + // D5: multiplexed inputs + return read_inputs(7) & 0x20; +} + +// config + +static INPUT_PORTS_START( alnattck ) + PORT_START("IN.0") // D7 line D5 + PORT_CONFNAME( 0x20, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x20, "2" ) + + PORT_START("IN.1") // D8 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D9 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // D10 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.4") // D11 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.5") // D12 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Move") + + PORT_START("IN.6") // D13 line D5 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Fire") +INPUT_PORTS_END + +void alnattck_state::alnattck(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(alnattck_state::plate_w)); + m_maincpu->write_d().set(FUNC(alnattck_state::grid_w)); + m_maincpu->read_d().set(FUNC(alnattck_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 700); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alnattck ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 564271, "screen", 0) + ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Donkey Kong (manufactured in Taiwan, licensed from Nintendo) + * PCB label Coleco Rev C 75790 DK + * Hitachi QFP HD38820A45 MCU + * RC circuit for speaker volume decay + * cyan/red VFD display Futaba DM-47ZK 2K, with color overlay + +***************************************************************************/ + +class cdkong_state : public hh_hmcs40_state +{ +public: + cdkong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void cdkong(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void cdkong_state::machine_start() +{ + hh_hmcs40_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void cdkong_state::speaker_update() +{ + if (m_r[1] & 8) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.02; +} + +void cdkong_state::update_display() +{ + u32 plate = bitswap<32>(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; + m_display->matrix(m_grid, plate); +} + +void cdkong_state::plate_w(offs_t offset, u8 data) +{ + // R13: speaker on + m_r[offset] = data; + speaker_update(); + + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void cdkong_state::grid_w(u16 data) +{ + // D3: speaker out + m_speaker->level_w(BIT(data, 3)); + + // D4-D14: vfd grid + m_grid = data >> 4 & 0x7ff; + update_display(); +} + +// config + +static INPUT_PORTS_START( cdkong ) + PORT_START("IN.0") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.1") // port D + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cdkong_state::cdkong(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cdkong_state::plate_w)); + m_maincpu->write_d().set(FUNC(cdkong_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(605, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( cdkong ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359199, "screen", 0) + ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Galaxian (manufactured in Taiwan) + * PCB label Coleco Rev A 75718 + * Hitachi HD38800A70 MCU + * discrete sound (when alien attacks) + * cyan/red VFD display Futaba DM-36Z 2H, with color overlay + + Select game mode on start: + - P1 Left: Galaxian (default game) + - P1 Right: Midway's Attackers + - P2 Left: Head-to-Head Galaxian (2-player mode, short) + - P2 Right: Head-to-Head Galaxian (2-player mode, long) + +***************************************************************************/ + +class cgalaxn_state : public hh_hmcs40_state +{ +public: + cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cgalaxn(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(player_switch); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cgalaxn_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3); + u16 plate = bitswap<16>(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13); + m_display->matrix(grid, plate); +} + +INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch) +{ + // 2-player switch directly enables plate 14 + m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000); + update_display(); +} + +void cgalaxn_state::grid_w(offs_t offset, u8 data) +{ + // R10,R11: input mux + if (offset == 1) + m_inp_mux = data & 3; + + // R1x-R3x: vfd grid + int shift = (offset - 1) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void cgalaxn_state::plate_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1: start alien attack whine sound effect (edge triggered) + + // D2-D15: vfd plate + m_plate = (m_plate & 0x4000) | (data >> 2 & 0x3fff); + update_display(); +} + +u8 cgalaxn_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( cgalaxn ) + PORT_START("IN.0") // R10 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // R11 port R0x + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, cgalaxn_state, player_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.3") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void cgalaxn_state::cgalaxn(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cgalaxn_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_r<2>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_r<3>().set(FUNC(cgalaxn_state::grid_w)); + m_maincpu->write_d().set(FUNC(cgalaxn_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(526, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 15); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cgalaxn ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 712204, "screen", 0) + ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Pac-Man (manufactured in Taiwan, licensed from Midway) + * PCB label Coleco 75690 + * Hitachi QFP HD38820A28/29 MCU + * cyan/red VFD display Futaba DM-34Z 2A, with color overlay + + known releases: + - USA: Pac-Man, by Coleco (name-license from Midway) + - Japan: Super Puck Monster, published by Gakken + + Select game mode on start: + - P1 Right: Pac-Man (default game) + - P1 Left: Head-to-Head Pac-Man (2-player mode) + - P1 Up: Eat & Run + - P1 Down: Demo + + BTANB: 1st version doesn't show the whole maze on power-on + +***************************************************************************/ + +class cpacman_state : public hh_hmcs40_state +{ +public: + cpacman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cpacman(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cpacman_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x(,D1,D2): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); + u32 plate = bitswap<32>(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7); + m_display->matrix(grid, plate); +} + +void cpacman_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D13-D15: input mux + m_inp_mux = data >> 13 & 7; + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D1,D2: plate 8,14 (update display there) + plate_w(6 + 1, data >> 1 & 3); +} + +u8 cpacman_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cpacman ) + PORT_START("IN.0") // D13 port R0x + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D14 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + + PORT_START("IN.2") // D15 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) +INPUT_PORTS_END + +void cpacman_state::cpacman(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cpacman_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cpacman_state::plate_w)); + m_maincpu->write_d().set(FUNC(cpacman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(484, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 27); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cpacman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359765, "screen", 0) + ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) +ROM_END + +ROM_START( cpacmanr1 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 359765, "screen", 0) + ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Ms. Pac-Man (manufactured in Taiwan, licensed from Midway) + * PCB label Coleco 911171 + * Hitachi QFP HD38820A61 MCU + * cyan/red VFD display Futaba DM-60Z 3I, with color overlay + + Select game mode on start: + - P1 Left: Ms. Pac-Man (default game) + - P1 Down: Head-to-Head Ms. Pac-Man (2-player mode) + - P1 Up: Demo + + BTANB: in demo-mode, she hardly ever walks to the upper two rows + +***************************************************************************/ + +class cmspacmn_state : public hh_hmcs40_state +{ +public: + cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void cmspacmn(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void cmspacmn_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x(,D0,D1): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); + u32 plate = bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; + m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate); +} + +void cmspacmn_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D13-D15: input mux + m_inp_mux = data >> 13 & 7; + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0,D1: more plates (update display there) + plate_w(6 + 1, data & 3); +} + +u8 cmspacmn_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cmspacmn ) + PORT_START("IN.0") // D13 port R0x + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // D14 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + + PORT_START("IN.2") // D15 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) +INPUT_PORTS_END + +void cmspacmn_state::cmspacmn(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(cmspacmn_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(cmspacmn_state::plate_w)); + m_maincpu->write_d().set(FUNC(cmspacmn_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(481, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 33); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cmspacmn ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 849327, "screen", 0) + ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Galaxian 2 (manufactured in Japan) + * PCB labels ENTEX GALAXIAN PB-118/116/097 80-210137/135/114 + * Hitachi QFP HD38820A13 MCU + * cyan/red/green VFD display Futaba DM-20 + + known releases: + - USA: Galaxian 2, published by Entex + - UK: Astro Invader, published by Hales/Entex + +***************************************************************************/ + +class egalaxn2_state : public hh_hmcs40_state +{ +public: + egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void egalaxn2(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u8 input_r(); +}; + +// handlers + +void egalaxn2_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); + u32 plate = bitswap<24>(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); + m_display->matrix(grid, plate); +} + +void egalaxn2_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D4: input mux + m_inp_mux = data >> 1 & 0xf; + + // D1-D15: vfd grid + m_grid = data >> 1 & 0x7fff; + update_display(); +} + +void egalaxn2_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R6x: vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +u8 egalaxn2_state::input_r() +{ + // R0x: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( egalaxn2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) // for Demo mode: need to hold down Fire button at power-on + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) +INPUT_PORTS_END + +void egalaxn2_state::egalaxn2(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set(FUNC(egalaxn2_state::input_r)); + m_maincpu->write_r<1>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(egalaxn2_state::plate_w)); + m_maincpu->write_d().set(FUNC(egalaxn2_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(505, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(15, 24); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( egalaxn2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 507945, "screen", 0) + ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Pac Man 2 (manufactured in Japan) + * PCB labels ENTEX PAC-MAN PB-093/094 80-210149/50/51 + * Hitachi QFP HD38820A23 MCU + * cyan/red VFD display Futaba DM-28Z 1G(cyan Pac-Man) or DM-28 1K(orange Pac-Man) + + 2 VFD revisions are known, the difference is Pac-Man's color: cyan or red. + +***************************************************************************/ + +class epacman2_state : public egalaxn2_state +{ +public: + epacman2_state(const machine_config &mconfig, device_type type, const char *tag) : + egalaxn2_state(mconfig, type, tag) + { } + + void epacman2(machine_config &config); +}; + +// handlers are identical to Galaxian 2, so we can use those + +// config + +static INPUT_PORTS_START( epacman2 ) + PORT_START("IN.0") // D1 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // D2 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // D3 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Skill Control") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Demo Light Test") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // D4 port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "0 (Demo)" ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void epacman2_state::epacman2(machine_config &config) +{ + egalaxn2(config); + + // video hardware + screen_device *screen = subdevice("screen"); + screen->set_size(505, 1080); + screen->set_visarea_full(); +} + +// roms + +ROM_START( epacman2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 262480, "screen", 0) + ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) ) +ROM_END + +ROM_START( epacman2r ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 262483, "screen", 0) + ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Super Space Invader 2 (black version) + * Hitachi HD38800A31 MCU + * cyan/red VFD display + + This version has the same MCU as the Select-A-Game cartridge. Maybe from + surplus inventory after that console was discontinued?. It was also sold + as "Super Alien Invader 2". + + Hold down the fire button at boot for demo mode to work. + +***************************************************************************/ + +class einvader2_state : public hh_hmcs40_state +{ +public: + einvader2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void einvader2(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void einvader2_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void einvader2_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void einvader2_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D3,D5,D6: input mux + m_inp_mux = (data >> 3 & 1) | (data >> 4 & 6); + + // D1-D12: vfd grid + m_grid = data >> 1 & 0xfff; + update_display(); +} + +u16 einvader2_state::input_r() +{ + // D13-D15: multiplexed inputs + return read_inputs(3) << 13; +} + +// config + +static INPUT_PORTS_START( einvader2 ) + PORT_START("IN.0") // D3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x01) // 1 player + + PORT_START("IN.1") // D5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x00) // demo + + PORT_START("IN.2") // D6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + + PORT_START("FAKE") // shared D3/D5 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "Demo" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) +INPUT_PORTS_END + +void einvader2_state::einvader2(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 450000); // approximation + m_maincpu->write_r<0>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(einvader2_state::plate_w)); + m_maincpu->write_d().set(FUNC(einvader2_state::grid_w)); + m_maincpu->read_d().set(FUNC(einvader2_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(469, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 14); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvader2 ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, CRC(10e39521) SHA1(41d86696e518ea071e75ed37d5dc63c0408c262e) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 217430, "screen", 0) + ROM_LOAD( "einvader2.svg", 0, 217430, CRC(b082d9a3) SHA1(67f7e0314c69ba146751ea12cf490805b8660489) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Turtles (manufactured in Japan) + * PCB label 560359 + * Hitachi QFP HD38820A43 MCU + * COP411L sub MCU, label COP411L-KED/N + * cyan/red/green VFD display NEC FIP15BM32T + +***************************************************************************/ + +class eturtles_state : public hh_hmcs40_state +{ +public: + eturtles_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag), + m_audiocpu(*this, "audiocpu") + { } + + void eturtles(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int(); } + +protected: + virtual void machine_start() override; + + required_device m_audiocpu; + + void update_int(); + virtual void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + + DECLARE_WRITE_LINE_MEMBER(speaker_w); + void cop_irq_w(u8 data); + u8 cop_latch_r(); + u8 cop_ack_r(); + + u8 m_cop_irq = 0; +}; + +void eturtles_state::machine_start() +{ + hh_hmcs40_state::machine_start(); + save_item(NAME(m_cop_irq)); +} + +// handlers: maincpu side + +void eturtles_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); + u32 plate = bitswap<32>(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); + m_display->matrix(grid, plate | (grid >> 5 & 8)); // grid 8 also forces plate 3 high +} + +void eturtles_state::plate_w(offs_t offset, u8 data) +{ + m_r[offset] = data; + + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void eturtles_state::grid_w(u16 data) +{ + m_d = data; + + // D1-D6: input mux + u8 inp_mux = data >> 1 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int(); + } + + // D1-D15: vfd grid + m_grid = data >> 1 & 0x7fff; + update_display(); +} + +void eturtles_state::update_int() +{ + // INT0/1 on multiplexed inputs, and from COP D0 + u8 inp = read_inputs(6); + set_interrupt(0, (inp & 1) | m_cop_irq); + set_interrupt(1, inp & 2); +} + +// handlers: COP side + +WRITE_LINE_MEMBER(eturtles_state::speaker_w) +{ + // SK: speaker out + m_speaker->level_w(!state); +} + +void eturtles_state::cop_irq_w(u8 data) +{ + // D0: maincpu INT0 (active low) + m_cop_irq = ~data & 1; + update_int(); +} + +u8 eturtles_state::cop_latch_r() +{ + // L0-L3: soundlatch from maincpu R0x + return m_r[0]; +} + +u8 eturtles_state::cop_ack_r() +{ + // G0: ack from maincpu D0 + return m_d & 1; +} + +// config + +static INPUT_PORTS_START( eturtles ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.5") // D6 INT0/1 + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x02, "0 (Demo)" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +void eturtles_state::eturtles(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(eturtles_state::plate_w)); + m_maincpu->write_d().set(FUNC(eturtles_state::grid_w)); + + COP411(config, m_audiocpu, 215000); // approximation + m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_audiocpu->write_sk().set(FUNC(eturtles_state::speaker_w)); + m_audiocpu->write_d().set(FUNC(eturtles_state::cop_irq_w)); + m_audiocpu->read_l().set(FUNC(eturtles_state::cop_latch_r)); + m_audiocpu->read_g().set(FUNC(eturtles_state::cop_ack_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(484, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(15, 30); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( eturtles ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) ) + + ROM_REGION( 1027626, "screen", 0) + ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Stargate (manufactured in Japan) + * PCB label 5603521/31 + * Hitachi QFP HD38820A42 MCU + * COP411L sub MCU, label ~/B8236 COP411L-KEC/N + * cyan/red/green VFD display NEC FIP15AM32T (EL628-003) no. 2-421, with partial color overlay + +***************************************************************************/ + +class estargte_state : public eturtles_state +{ +public: + estargte_state(const machine_config &mconfig, device_type type, const char *tag) : + eturtles_state(mconfig, type, tag) + { } + + void estargte(machine_config &config); + +private: + virtual void update_display() override; + u8 cop_data_r(); +}; + +// handlers (most of it is in eturtles_state above) + +void estargte_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); + u32 plate = bitswap<32>(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); + m_display->matrix(grid, plate); +} + +u8 estargte_state::cop_data_r() +{ + // L0-L3: soundlatch from maincpu R0x + // L7: ack from maincpu D0 + return m_r[0] | (m_d << 7 & 0x80); +} + +// config + +static INPUT_PORTS_START( estargte ) + PORT_START("IN.0") // D1 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Inviso") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Smart Bomb") + + PORT_START("IN.1") // D2 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Change Direction") + + PORT_START("IN.2") // D3 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + + PORT_START("IN.3") // D4 INT0/1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Thrust") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // D5 INT0/1 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x00, "0 (Demo)" ) // yes, same value as 1-player, hold the Inviso button at boot to enter demo mode + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.5") // D6 INT0/1 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void estargte_state::estargte(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(estargte_state::plate_w)); + m_maincpu->write_d().set(FUNC(estargte_state::grid_w)); + + COP411(config, m_audiocpu, 190000); // approximation + m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed + m_audiocpu->write_sk().set(FUNC(estargte_state::speaker_w)); + m_audiocpu->write_d().set(FUNC(estargte_state::cop_irq_w)); + m_audiocpu->read_l().set(FUNC(estargte_state::cop_data_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 854); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(14, 29); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( estargte ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 0x0200, "audiocpu", 0 ) + ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) ) + + ROM_REGION( 462214, "screen", 0) + ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Heiankyo Alien (manufactured in Japan) + * Hitachi HD38800A04 MCU + * cyan/red VFD display Futaba DM-11Z 1H + + known releases: + - Japan: Heiankyo Alien, published by Gakken + - USA: Earth Invaders, published by CGL + +***************************************************************************/ + +class ghalien_state : public hh_hmcs40_state +{ +public: + ghalien_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void ghalien(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void ghalien_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D10-D13): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + u32 plate = bitswap<24>(m_plate,23,22,21,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18); + m_display->matrix(grid, plate); +} + +void ghalien_state::grid_w(u16 data) +{ + // D14: speaker out + m_speaker->level_w(data >> 14 & 1); + + // D0-D6: input mux + m_inp_mux = data & 0x7f; + + // D0-D9: vfd grid + m_grid = data & 0x3ff; + + // D10-D13: more plates (update display there) + plate_w(4, data >> 10 & 0xf); +} + +u16 ghalien_state::input_r() +{ + // D15: multiplexed inputs + return read_inputs(7) & 0x8000; +} + +// config + +static INPUT_PORTS_START( ghalien ) + PORT_START("IN.0") // D0 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // D1 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // D2 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.3") // D3 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.4") // D4 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dig") + + PORT_START("IN.5") // D5 line D15 + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bury") + + PORT_START("IN.6") // D6 line D15 + PORT_CONFNAME( 0x8000, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "Amateur" ) + PORT_CONFSETTING( 0x8000, "Professional" ) +INPUT_PORTS_END + +void ghalien_state::ghalien(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(ghalien_state::plate_w)); + m_maincpu->write_d().set(FUNC(ghalien_state::grid_w)); + m_maincpu->read_d().set(FUNC(ghalien_state::input_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 699); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ghalien ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 462749, "screen", 0) + ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Crazy Kong (manufactured in Japan) + * PCB label ZENY 5603601 + * Hitachi HD38800B01 MCU + * cyan/red/blue VFD display Futaba DM-54Z 2H, with bezel overlay + + known releases: + - Japan: Crazy Kong, published by Gakken + - USA: Super Kong, published by CGL + +***************************************************************************/ + +class gckong_state : public hh_hmcs40_state +{ +public: + gckong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gckong(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gckong_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x(,D0,D1): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); + u32 plate = bitswap<32>(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; + m_display->matrix(grid, plate); +} + +void gckong_state::grid_w(u16 data) +{ + // D2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // D5-D8: input mux + u8 inp_mux = data >> 5 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D5-D15: vfd grid + m_grid = data >> 5 & 0x7ff; + + // D0,D1: more plates (update display there) + plate_w(4, data & 3); +} + +void gckong_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( gckong ) + PORT_START("IN.0") // D5 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.1") // D6 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.2") // D7 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.3") // D8 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) + + PORT_START("IN.5") // port D + PORT_CONFNAME( 0x0010, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "A" ) + PORT_CONFSETTING( 0x0010, "B" ) + PORT_BIT( 0xffef, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gckong_state::gckong(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gckong_state::plate_w)); + m_maincpu->write_d().set(FUNC(gckong_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.5"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(479, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(11, 32); + config.set_default_layout(layout_gckong); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gckong ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 346588, "screen", 0) + ROM_LOAD( "gckong.svg", 0, 346588, CRC(317af984) SHA1(ff6323526d1f5e46eccf8fa8d979175895be75de) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Super Cobra + * PCB label SUPER COBRA 3000N + * Hitachi QFP HD38820A32 MCU + * cyan/red/green VFD display + + known releases: + - World: Super Cobra, published by Gakken + - USA: Cobra Super Copter, published by Tandy + + There are 2 versions, a green one and a white one. They have the same MCU, + though the VFD has color differences and is more compact. + + BTANB(green version): 1 rocket seems out of place at the top-right area + +***************************************************************************/ + +class gscobra_state : public hh_hmcs40_state +{ +public: + gscobra_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gscobra(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gscobra_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D1-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + m_display->matrix(m_grid, m_plate); +} + +void gscobra_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D10-D15: input mux + u8 inp_mux = data >> 10 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D1-D3: more plates (update display there) + plate_w(7, data >> 1 & 7); +} + +void gscobra_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(6)); +} + +// config + +static INPUT_PORTS_START( gscobra ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) + + PORT_START("IN.5") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) +INPUT_PORTS_END + +void gscobra_state::gscobra(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gscobra_state::plate_w)); + m_maincpu->write_d().set(FUNC(gscobra_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 852); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 31); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gscobra ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a32", 0x0000, 0x1000, CRC(7bbd130f) SHA1(91dd280e4108fad7ba99191355364bd3217b9d17) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 232919, "screen", 0) + ROM_LOAD( "gscobra.svg", 0, 232919, CRC(5ceb4bfc) SHA1(77c9a45569d780838ebe75818acb2d2ced4bda00) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Defender + * Hitachi HD38820L53 MCU (SDIP) + * cyan/red/green VFD display + +***************************************************************************/ + +class gdefender_state : public hh_hmcs40_state +{ +public: + gdefender_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gdefender(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_display(); + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + u16 input_r(); +}; + +// handlers + +void gdefender_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void gdefender_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void gdefender_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D3-D15: vfd grid + m_grid = data >> 3 & 0x1fff; + update_display(); +} + +u16 gdefender_state::input_r() +{ + // D1: multiplexed inputs + return read_inputs(4) & 2; +} + +void gdefender_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4) & 1); +} + +// config + +static INPUT_PORTS_START( gdefender ) + PORT_START("IN.0") // D11 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.1") // D12 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Warp") + + PORT_START("IN.2") // D13 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) PORT_NAME("Missile / Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") + + PORT_START("IN.3") // D14 INT1/D1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gdefender_state::gdefender(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gdefender_state::plate_w)); + m_maincpu->write_d().set(FUNC(gdefender_state::grid_w)); + m_maincpu->read_d().set(FUNC(gdefender_state::input_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(13, 28); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gdefender ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820l53", 0x0000, 0x1000, CRC(fe52bbb4) SHA1(e0250954c3801af9841306c2e1fdf57f3b9edffa) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "gdefender.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Dig Dug (manufactured in Japan) + * PCB label Gakken DIG-DAG KS-004283(A/B) + * Hitachi QFP HD38820A69 MCU + * cyan/red/green VFD display Futaba DM-69Z 3F, with color overlay + +***************************************************************************/ + +class gdigdug_state : public hh_hmcs40_state +{ +public: + gdigdug_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void gdigdug(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void gdigdug_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D0-D3): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<32>(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16); + m_display->matrix(m_grid, plate); +} + +void gdigdug_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D3: more plates (update display there) + plate_w(7, data & 0xf); +} + +void gdigdug_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( gdigdug ) + PORT_START("IN.0") // D11 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) + + PORT_START("IN.5") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void gdigdug_state::gdigdug(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(gdigdug_state::plate_w)); + m_maincpu->write_d().set(FUNC(gdigdug_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(476, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 32); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gdigdug ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 807990, "screen", 0) + ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel World Championship Baseball (model 3201) + * PCB label MEL-001 Baseball Rev. B + * Hitachi QFP HD38820A09 MCU + * cyan/red/green VFD display Futaba DM-24ZK 1G, with etched overlay + + It was patented under US4372557. To start the game in 2-player mode, simply + turn the game on. For 1-player, turn the game on while holding the 1-key + and use the visitor's side keypad to play offsense. + +***************************************************************************/ + +class mwcbaseb_state : public hh_hmcs40_state +{ +public: + mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void mwcbaseb(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + void speaker_w(u8 data); + u8 input_r(); +}; + +// handlers + +void mwcbaseb_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + m_display->matrix(grid, m_plate); +} + +void mwcbaseb_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x,R6x: vfd plate + int shift = (offset == 6) ? 12 : (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void mwcbaseb_state::grid_w(u16 data) +{ + // D9-D15: input mux + m_inp_mux = data >> 9 & 0x7f; + + // D0-D7: vfd grid + m_grid = data & 0xff; + update_display(); +} + +void mwcbaseb_state::speaker_w(u8 data) +{ + // R50,R51+R52(tied together): speaker out + m_speaker->level_w(data & 7); +} + +u8 mwcbaseb_state::input_r() +{ + // R4x: multiplexed inputs + return read_inputs(7); +} + +// config + +/* physical button layout and labels are like this: + + (visitor team side) (home team side) + COMP PITCH [SCORE] [INNING] + [1] [2] [3] [1] [2] [3] + NEW PITCHER PINCH HITTER NEW PITCHER PINCH HITTER + + [4] [5] [6] [4] [5] [6] + BACKWARD (pitch) FORWARD BACKWARD (pitch) FORWARD + + [7] [8] [9] [7] [8] [9] + + BUNT NORMAL HR SWING BUNT NORMAL HR SWING + [CLEAR] [0] [ENTER] [CLEAR] [0] [ENTER] + SLOW CURVE FAST SLOW CURVE FAST +*/ + +static INPUT_PORTS_START( mwcbaseb ) // P1 = left/visitor, P2 = right/home + PORT_START("IN.0") // D9 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("P2 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("P2 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("P2 1") + + PORT_START("IN.1") // D10 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P2 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 5") + + PORT_START("IN.2") // D11 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 9") + + PORT_START("IN.3") // D12 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Inning") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Score") + + PORT_START("IN.4") // D13 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P1 Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + + PORT_START("IN.5") // D14 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + + PORT_START("IN.6") // D15 port R4x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") +INPUT_PORTS_END + +void mwcbaseb_state::mwcbaseb(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<1>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->read_r<4>().set(FUNC(mwcbaseb_state::input_r)); + m_maincpu->write_r<5>().set(FUNC(mwcbaseb_state::speaker_w)); + m_maincpu->write_r<6>().set(FUNC(mwcbaseb_state::plate_w)); + m_maincpu->write_d().set(FUNC(mwcbaseb_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 478); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 16); + m_display->set_bri_levels(0.001); // cyan elements strobed very briefly? + config.set_default_layout(layout_mwcbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); + static const double speaker_levels[] = { 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, -1.0, -0.5 }; + m_speaker->set_levels(8, speaker_levels); +} + +// roms + +ROM_START( mwcbaseb ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 178441, "screen", 0) + ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Star Hawk (manufactured in Japan) + * PCB label Kaken, PT-317B + * Hitachi HD38800A73 MCU + * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel + + Before release, it was advertised as "Space Battle"(a Mattel Intellivision game). + Kaken was a subsidiary of Bandai. Star Hawk shell design is the same as Bandai's + games from the same era. It's likely that this was made under contract exclusively + for Mattel. There is no indication that this game was released in Japan by Bandai. + +***************************************************************************/ + +class msthawk_state : public hh_hmcs40_state +{ +public: + msthawk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void msthawk(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void msthawk_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void msthawk_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void msthawk_state::grid_w(u16 data) +{ + // D5: speaker out + m_speaker->level_w(data >> 5 & 1); + + // D10-D15: input mux + u8 inp_mux = data >> 10 & 0x3f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D4: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); + update_display(); +} + +void msthawk_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(6)); +} + +// config + +static INPUT_PORTS_START( msthawk ) + PORT_START("IN.0") // D10 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) PORT_NAME("Score") + + PORT_START("IN.1") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) PORT_NAME("Land") + + PORT_START("IN.2") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.3") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.4") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.5") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) + + PORT_START("IN.6") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) PORT_NAME("Fire") +INPUT_PORTS_END + +void msthawk_state::msthawk(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w)); + m_maincpu->write_d().set(FUNC(msthawk_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 696); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 21); + config.set_default_layout(layout_msthawk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( msthawk ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 191888, "screen", 0) + ROM_LOAD( "msthawk.svg", 0, 191888, CRC(a607fc0f) SHA1(282a412f6462128e09ee8bd18d682dda01297611) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Q*Bert + * PCB label 13662 REV-4 + * Hitachi QFP HD38820A70 MCU + * cyan/red/green/darkgreen VFD display Itron CP5137 + +***************************************************************************/ + +class pbqbert_state : public hh_hmcs40_state +{ +public: + pbqbert_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void pbqbert(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void pbqbert_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R6x(,D8): vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u32 plate = bitswap<32>(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; + m_display->matrix(m_grid, plate); +} + +void pbqbert_state::grid_w(u16 data) +{ + // D14: speaker out + m_speaker->level_w(data >> 14 & 1); + + // D0-D7: vfd grid + m_grid = data & 0xff; + + // D8: plate 25 (update display there) + plate_w(7, data >> 8 & 1); +} + +// config + +static INPUT_PORTS_START( pbqbert ) + PORT_START("IN.0") // port D + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // up-left + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) // up-right + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // down-right + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) // down-left + PORT_BIT( 0xe1ff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pbqbert_state::pbqbert(machine_config &config) +{ + // basic machine hardware + HD38820(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<4>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<5>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_r<6>().set(FUNC(pbqbert_state::plate_w)); + m_maincpu->write_d().set(FUNC(pbqbert_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.0"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(603, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 30); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( pbqbert ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 456567, "screen", 0) + ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) ) +ROM_END + + + + + +/*************************************************************************** + + Romtec Pucki & Monsters + * Hitachi HD38750A67 MCU + * cyan/red/green VFD display + +***************************************************************************/ + +class puckimon_state : public hh_hmcs40_state +{ +public: + puckimon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void puckimon(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(u16 data); +}; + +// handlers + +void puckimon_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void puckimon_state::grid_w(offs_t offset, u8 data) +{ + // R1x-R3x: vfd grid + int shift = (offset - 1) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // R13: vfd plate + if (offset == 1) + m_plate = (m_plate & 0x7fff) | (data << 12 & 0x8000); + update_display(); +} + +void puckimon_state::plate_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D1-D15: vfd plate + m_plate = (m_plate & 0x8000) | (data >> 1 & 0x7fff); + update_display(); + +} + +// config + +static INPUT_PORTS_START( puckimon ) + PORT_START("IN.0") // port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void puckimon_state::puckimon(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 400000); // approximation + m_maincpu->read_r<0>().set_ioport("IN.0").invert(); + m_maincpu->write_r<1>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_r<2>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_r<3>().set(FUNC(puckimon_state::grid_w)); + m_maincpu->write_d().set(FUNC(puckimon_state::plate_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 16); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( puckimon ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a67", 0x0000, 0x0800, CRC(8b493783) SHA1(6c37e67de5d59889abf8a155654f130218cfc12e) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "puckimon.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Tron (manufactured in Japan) + * PCB label THN-02 2E114E07 + * Hitachi HD38800A88 MCU + * cyan/red/green VFD display NEC FIP10AM24T no. 2-8 1 + +***************************************************************************/ + +class tmtron_state : public hh_hmcs40_state +{ +public: + tmtron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void tmtron(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } + +private: + void update_int1(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void tmtron_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0); + u32 plate = bitswap<24>(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15); + m_display->matrix(grid, plate); +} + +void tmtron_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtron_state::grid_w(u16 data) +{ + // D4: speaker out + m_speaker->level_w(data >> 4 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int1(); + } + + // D6-D15: vfd grid + m_grid = data >> 6 & 0x3ff; + + // D0-D3,D5: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x2f0000); + update_display(); +} + +void tmtron_state::update_int1() +{ + // INT1 on multiplexed inputs + set_interrupt(1, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( tmtron ) + PORT_START("IN.0") // D12 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) + + PORT_START("IN.4") // INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) +INPUT_PORTS_END + +void tmtron_state::tmtron(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(tmtron_state::plate_w)); + m_maincpu->write_d().set(FUNC(tmtron_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 662); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 23); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmtron ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 384174, "screen", 0) + ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Kingman (manufactured in Japan) + * PCB label THF-01II 2E138E01/2E128E02 + * Hitachi HD38800B23 MCU + * cyan/red/blue VFD display Futaba DM-65ZK 3A + + known releases: + - World: Kingman, published by Tomy + - USA: Kingman, published by Tandy + +***************************************************************************/ + +class kingman_state : public hh_hmcs40_state +{ +public: + kingman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void kingman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void kingman_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u32 plate = bitswap<24>(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12); + m_display->matrix(grid, plate); +} + +void kingman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void kingman_state::grid_w(u16 data) +{ + // D6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // D12-D15: input mux + u8 inp_mux = data >> 12 & 0xf; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D0-D4: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); + update_display(); +} + +void kingman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(4)); +} + +// config + +static INPUT_PORTS_START( kingman ) + PORT_START("IN.0") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.1") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.2") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.3") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) + + PORT_START("IN.4") // INT1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) +INPUT_PORTS_END + +void kingman_state::kingman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(kingman_state::plate_w)); + m_maincpu->write_d().set(FUNC(kingman_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(374, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 23); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( kingman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 396320, "screen", 0) + ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Bombman (Portable 6000 series) + * Hitachi HD38800B29 MCU + * cyan/red/blue VFD display + +***************************************************************************/ + +class bombman_state : public hh_hmcs40_state +{ +public: + bombman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void bombman(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } + +private: + void update_int0(); + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void bombman_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void bombman_state::plate_w(offs_t offset, u8 data) +{ + // R0x-R3x: vfd plate + int shift = offset * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bombman_state::grid_w(u16 data) +{ + // D7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // D11-D15: input mux + u8 inp_mux = data >> 11 & 0x1f; + if (inp_mux != m_inp_mux) + { + m_inp_mux = inp_mux; + update_int0(); + } + + // D8-D15: vfd grid + m_grid = data >> 8 & 0xff; + + // D0-D4: more plates + m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); + update_display(); +} + +void bombman_state::update_int0() +{ + // INT0 on multiplexed inputs + set_interrupt(0, read_inputs(5)); +} + +// config + +static INPUT_PORTS_START( bombman ) + PORT_START("IN.0") // D11 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.1") // D12 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.2") // D13 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.3") // D14 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) + + PORT_START("IN.4") // D15 INT0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) +INPUT_PORTS_END + +void bombman_state::bombman(machine_config &config) +{ + // basic machine hardware + HD38800(config, m_maincpu, 400000); // approximation + m_maincpu->write_r<0>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<1>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(bombman_state::plate_w)); + m_maincpu->write_d().set(FUNC(bombman_state::grid_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 21); + config.set_default_layout(layout_hh_hmcs40_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bombman ) + ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38800b29", 0x0000, 0x1000, CRC(f99ebd3f) SHA1(5016d4e35efa1353d26e60f98d8a027773d571a0) ) + ROM_CONTINUE( 0x1e80, 0x0100 ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "bombman.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + VTech Invaders (manufactured in Taiwan) + * Hitachi HD38750A45 MCU + * cyan/red VFD display Futaba DM-26Z 1G, with bezel + + known releases: + - USA: Invaders/Sonic Invader, published by VTech + - UK: Cosmic Invader, published by Grandstand + - UK: Galactic Invaders, published by Prinztronic + +***************************************************************************/ + +class vinvader_state : public hh_hmcs40_state +{ +public: + vinvader_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_hmcs40_state(mconfig, type, tag) + { } + + void vinvader(machine_config &config); + +private: + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); +}; + +// handlers + +void vinvader_state::plate_w(offs_t offset, u8 data) +{ + // R1x-R3x(,D4-D6): vfd plate + int shift = (offset - 1) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // update display + u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); + m_display->matrix(m_grid, plate); +} + +void vinvader_state::grid_w(u16 data) +{ + // D0: speaker out + m_speaker->level_w(data & 1); + + // D7-D15: vfd grid + m_grid = data >> 7 & 0x1ff; + + // D4-D6: more plates (update display there) + plate_w(3 + 1, data >> 4 & 7); +} + +// config + +static INPUT_PORTS_START( vinvader ) + PORT_START("IN.0") // port R0x + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port D + PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x0000, "1" ) + PORT_CONFSETTING( 0x0002, "2" ) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0xfff5, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void vinvader_state::vinvader(machine_config &config) +{ + // basic machine hardware + HD38750(config, m_maincpu, 300000); // approximation + m_maincpu->read_r<0>().set_ioport("IN.0"); + m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_r<2>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_r<3>().set(FUNC(vinvader_state::plate_w)); + m_maincpu->write_d().set(FUNC(vinvader_state::grid_w)); + m_maincpu->read_d().set_ioport("IN.1"); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(233, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( vinvader ) + ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "hd38750a45", 0x0000, 0x0800, CRC(32de6056) SHA1(70238c6c40c3d513f8eced1cb81bdd4dbe12f16c) ) + ROM_CONTINUE( 0x0f00, 0x0080 ) + + ROM_REGION( 166379, "screen", 0) + ROM_LOAD( "vinvader.svg", 0, 166379, CRC(b75c448e) SHA1(40d546f9fbdb446883e3ab0e3f678f1be8105159) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1982, wantgman, 0, 0, wantgman, wantgman, wantgman_state, empty_init, "Actronics / Hanzawa", "Wanted G-Man", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1979, bambball, 0, 0, bambball, bambball, bambball_state, empty_init, "Bambino", "Dribble Away Basketball", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_init, "Bambino", "Knock-Em Out Boxing", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, bfriskyt, 0, 0, bfriskyt, bfriskyt, bfriskyt_state, empty_init, "Bandai", "Frisky Tom (Bandai)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, packmon, 0, 0, packmon, packmon, packmon_state, empty_init, "Bandai", "Packri Monster", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, bzaxxon, 0, 0, bzaxxon, bzaxxon, bzaxxon_state, empty_init, "Bandai", "Zaxxon (Bandai)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, zackman, 0, 0, zackman, zackman, zackman_state, empty_init, "Bandai", "Zackman", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, bpengo, 0, 0, bpengo, bpengo, bpengo_state, empty_init, "Bandai", "Pengo (Bandai)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, bbtime, 0, 0, bbtime, bbtime, bbtime_state, empty_init, "Bandai", "Burger Time (Bandai)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, ktparman, 0, 0, ktparman, ktparman, ktparman_state, empty_init, "Bandai", "Kiteyo Parman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1983, bdoramon, 0, 0, bdoramon, bdoramon, bdoramon_state, empty_init, "Bandai", "Dokodemo Dorayaki Doraemon", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, tkjmaru, 0, 0, tkjmaru, tkjmaru, tkjmaru_state, empty_init, "Bandai", "Toukon Juohmaru", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1983, bultrman, 0, 0, bultrman, bultrman, bultrman_state, empty_init, "Bandai", "Ultraman Monster Battle", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, ggdman, 0, 0, ggdman, ggdman, ggdman_state, empty_init, "Bandai", "Go Go Dynaman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_init, "Bandai", "Machine Man", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, cmspacmn_state, empty_init, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, epacman2, 0, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, einvader2, 0, 0, einvader2, einvader2, einvader2_state, empty_init, "Entex", "Super Space Invader 2 (Entex, black version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, eturtles, 0, 0, eturtles, eturtles, eturtles_state, empty_init, "Entex", "Turtles (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, gscobra, 0, 0, gscobra, gscobra, gscobra_state, empty_init, "Gakken", "Super Cobra (Gakken, green version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1983, gdefender, 0, 0, gdefender, gdefender, gdefender_state, empty_init, "Gakken", "Defender (Gakken)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1983, gdigdug, 0, 0, gdigdug, gdigdug, gdigdug_state, empty_init, "Gakken", "Dig Dug (Gakken)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, mwcbaseb, 0, 0, mwcbaseb, mwcbaseb, mwcbaseb_state, empty_init, "Mattel Electronics", "World Championship Baseball", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel Electronics", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, pbqbert_state, empty_init, "Parker Brothers", "Q*Bert (Parker Brothers)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, puckimon, 0, 0, puckimon, puckimon, puckimon_state, empty_init, "Romtec", "Pucki & Monsters", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1982, tmtron, 0, 0, tmtron, tmtron, tmtron_state, empty_init, "Tomy", "Tron (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, kingman, 0, 0, kingman, kingman, kingman_state, empty_init, "Tomy", "Kingman", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, bombman, 0, 0, bombman, bombman, bombman_state, empty_init, "Tomy", "Bombman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1981, vinvader, 0, 0, vinvader, vinvader, vinvader_state, empty_init, "VTech", "Invaders (VTech)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_melps4.cpp b/src/mame/handheld/hh_melps4.cpp new file mode 100644 index 00000000000..060ddba845b --- /dev/null +++ b/src/mame/handheld/hh_melps4.cpp @@ -0,0 +1,381 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/*************************************************************************** + +Mitsubishi MELPS 4 MCU tabletops/handhelds or other simple devices, +most of them are VFD electronic games/toys. + +TODO: +- dump/add Gakken version of Frogger +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/melps4/m58846.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +//#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_melps4_state : public driver_device +{ +public: + hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<4> m_inputs; // max 4 + + // misc common + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u32 m_plate = 0; // VFD current column data + + u8 read_inputs(int columns); +}; + + +// machine start/reset + +void hh_melps4_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_melps4_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_melps4_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button) +{ + // for when reset button is directly tied to MCU reset pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Coleco Frogger (manufactured in Japan, licensed from Sega) + * PCB label Coleco Frogger Code No. 01-81543, KS-003282 Japan + * Mitsubishi M58846-701P MCU + * cyan/red/green VFD display Itron CP5090GLR R1B, with partial color overlay + + Gakken / Konami Frogger + * PCB label Konami Gakken KH-8201D + * Mitsubishi M58846-700P MCU (Konami logo on it) + * cyan/red/green VFD display, with partial color overlay + +***************************************************************************/ + +class cfrogger_state : public hh_melps4_state +{ +public: + cfrogger_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_melps4_state(mconfig, type, tag) + { } + + void cfrogger(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + DECLARE_WRITE_LINE_MEMBER(speaker_w); + u16 input_r(); +}; + +// handlers + +void cfrogger_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11); + u16 plate = bitswap<16>(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8); + m_display->matrix(grid, plate); +} + +void cfrogger_state::plate_w(offs_t offset, u8 data) +{ + // F0,F1: input mux + if (offset == MELPS4_PORTF) + m_inp_mux = data & 3; + + // Sx,Fx,Gx: vfd plate + int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit + int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; + m_plate = (m_plate & ~(mask << shift)) | (data << shift); + update_display(); +} + +void cfrogger_state::grid_w(u16 data) +{ + // D0-D11: vfd grid + m_grid = data; + update_display(); +} + +WRITE_LINE_MEMBER(cfrogger_state::speaker_w) +{ + // T: speaker out + m_speaker->level_w(state); +} + +u16 cfrogger_state::input_r() +{ + // K0,K1: multiplexed inputs + // K2: N/C + // K3: fixed input + return (m_inputs[2]->read() & 8) | (read_inputs(2) & 3); +} + +// config + +static INPUT_PORTS_START( cfrogger ) + PORT_START("IN.0") // F0 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // F1 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + + PORT_START("IN.2") // K3 + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) +INPUT_PORTS_END + +void cfrogger_state::cfrogger(machine_config &config) +{ + // basic machine hardware + M58846(config, m_maincpu, 600_kHz_XTAL); + m_maincpu->read_k().set(FUNC(cfrogger_state::input_r)); + m_maincpu->write_s().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_f().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_g().set(FUNC(cfrogger_state::plate_w)); + m_maincpu->write_d().set(FUNC(cfrogger_state::grid_w)); + m_maincpu->write_t().set(FUNC(cfrogger_state::speaker_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(500, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cfrogger ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) ) + + ROM_REGION( 786255, "screen", 0) + ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken / Konami Jungler (manufactured in Japan) + * PCB label Konami Gakken GR503 + * Mitsubishi M58846-702P MCU + * cyan/red/green VFD display Itron CP5143GLR SGA, with light-yellow color overlay + +***************************************************************************/ + +class gjungler_state : public hh_melps4_state +{ +public: + gjungler_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_melps4_state(mconfig, type, tag) + { } + + void gjungler(machine_config &config); + +private: + void update_display(); + void plate_w(offs_t offset, u8 data); + void grid_w(u16 data); + DECLARE_WRITE_LINE_MEMBER(speaker_w); + u16 input_r(); +}; + +// handlers + +void gjungler_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000; + m_display->matrix(grid, plate); +} + +void gjungler_state::plate_w(offs_t offset, u8 data) +{ + // G0,G1: input mux + if (offset == MELPS4_PORTG) + m_inp_mux = data & 3; + + // Sx,Fx,Gx,U: vfd plate + int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit + int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; + m_plate = (m_plate & ~(mask << shift)) | (data << shift); + update_display(); +} + +void gjungler_state::grid_w(u16 data) +{ + // D0-D11: vfd grid + m_grid = data; + update_display(); +} + +WRITE_LINE_MEMBER(gjungler_state::speaker_w) +{ + // T: speaker out + m_speaker->level_w(state); +} + +u16 gjungler_state::input_r() +{ + // K0,K1: multiplexed inputs + // K2,K3: fixed inputs + return (m_inputs[2]->read() & 0xc) | (read_inputs(2) & 3); +} + +// config + +static INPUT_PORTS_START( gjungler ) + PORT_START("IN.0") // G0 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.1") // G1 port K0,K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.2") // K2,K3 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x08, 0x00, "Game Mode" ) + PORT_CONFSETTING( 0x00, "A" ) + PORT_CONFSETTING( 0x08, "B" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) +INPUT_PORTS_END + +void gjungler_state::gjungler(machine_config &config) +{ + // basic machine hardware + M58846(config, m_maincpu, 600_kHz_XTAL); + m_maincpu->read_k().set(FUNC(gjungler_state::input_r)); + m_maincpu->write_s().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_f().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_g().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_u().set(FUNC(gjungler_state::plate_w)); + m_maincpu->write_d().set(FUNC(gjungler_state::grid_w)); + m_maincpu->write_t().set(FUNC(gjungler_state::speaker_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(481, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gjungler ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m58846-702p", 0x0000, 0x1000, CRC(94ab7060) SHA1(3389bc115d1df8d01a30611fa9e95a900d32b29b) ) + + ROM_REGION( 419696, "screen", 0) + ROM_LOAD( "gjungler.svg", 0, 419696, CRC(c5f6d1f2) SHA1(5032f35326ca689c8e329f760e380cdc9f5dff86) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1982, cfrogger, 0, 0, cfrogger, cfrogger, cfrogger_state, empty_init, "Coleco / Konami", "Frogger (Coleco)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, gjungler, 0, 0, gjungler, gjungler, gjungler_state, empty_init, "Gakken / Konami", "Jungler (Gakken)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_pic16.cpp b/src/mame/handheld/hh_pic16.cpp new file mode 100644 index 00000000000..3a35e746c8c --- /dev/null +++ b/src/mame/handheld/hh_pic16.cpp @@ -0,0 +1,1965 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +GI PIC 16xx-driven dedicated handhelds or other simple devices. + +known chips: + + serial device etc. +----------------------------------------------------------- + *020 1650 19??, GI Economega IV TV PPL Tuning System Control + *021 1650 1978, GI AY-3-8910 demo board + @024 1655 1979, Toytronic? Football + @033 1655A 1979, Toytronic Football (newer) + @036 1655A 1979, Ideal Maniac + @043 1655A 1979, Caprice Pro-Action Baseball + @049 1655A 1980, Kingsford Match Me(?)/Mini Match Me + @051 1655A 1979, Kmart Dr. Dunk/Tandy Electronic Basketball + @053 1655A 1979, Atari Touch Me + @0?? 1655A 1979, Tiger Half Court Computer Basketball/Sears Electronic Basketball (custom label) + @061 1655A 1980, Lakeside Le Boom + @078 1655A 1980, Ideal Flash + *081 1655A 1981, Ramtex Space Invaders/Block Buster + *085 1655A 1980, VTech Soccer 2/Grandstand Match of the Day Soccer + @094 1655A 1980, GAF Melody Madness + @110 1650A 1979, Tiger/Tandy Rocket Pinball + *123 1655A? 1980, Kingsford Match Me/Mini Match Me + @133 1650A 1981, U.S. Games Programmable Baseball/Tandy 2-Player Baseball + @144 1650A 1981, U.S. Games/Tandy 2-Player Football + *192 1650 19??, phone dialer (have dump) + *255 1655 19??, talking clock (have dump) + *518 1650A 19??, GI Teleview Control Chip (features differ per program) + *519 1650A 19??, " + *532 1650A 19??, " + *533 1650A 19??, " + *536 1650 1982, GI Teleview Autodialer/Terminal Identifier + + (* means undumped unless noted, @ denotes it's in this driver) + +ROM source notes when dumped from another publisher, but confident it's the same: +- drdunk: Tandy Electronic Basketball +- flash: Radio Shack Sound Effects Chassis +- hccbaskb: Sears Electronic Basketball +- us2pfball: Tandy 2-Player Football +- uspbball: Tandy 2-Player Baseball + +TODO: +- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.) +- ttfball: discrete sound part, for volume gating? +- what's the relation between drdunk and hccbaskb? Probably made by the same + Hong Kong subcontractor? I presume Toytronic. +- uspbball and pabball internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/pic16c5x/pic16c5x.h" +#include "video/pwm.h" +#include "machine/clock.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "drdunk.lh" +#include "flash.lh" // clickable +#include "hccbaskb.lh" +#include "leboom.lh" // clickable +#include "maniac.lh" // clickable +#include "melodym.lh" // clickable +#include "matchme.lh" // clickable +#include "rockpin.lh" +#include "touchme.lh" // clickable +#include "ttfball.lh" +#include "us2pfball.lh" + +#include "hh_pic16_test.lh" // common test-layout - use external artwork + + +class hh_pic16_state : public driver_device +{ +public: + hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_a = 0; // MCU port A write data + u8 m_b = 0; // " B + u8 m_c = 0; // " C + u8 m_d = 0; // " D + u16 m_inp_mux = ~0; // multiplexed inputs mask + + u16 read_inputs(int columns, u16 colmask = ~0); + u8 read_rotated_inputs(int columns, u8 rowmask = ~0); +}; + + +// machine start/reset + +void hh_pic16_state::machine_start() +{ + // register for savestates + save_item(NAME(m_a)); + save_item(NAME(m_b)); + save_item(NAME(m_c)); + save_item(NAME(m_d)); + save_item(NAME(m_inp_mux)); +} + +void hh_pic16_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u16 hh_pic16_state::read_inputs(int columns, u16 colmask) +{ + // active low + u16 ret = ~0 & colmask; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (~m_inp_mux >> i & 1) + ret &= m_inputs[i]->read(); + + return ret; +} + +u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask) +{ + u8 ret = 0; + u16 colmask = (1 << columns) - 1; + + // read selected input columns + for (int i = 0; i < 8; i++) + if (1 << i & rowmask && ~m_inputs[i]->read() & ~m_inp_mux & colmask) + ret |= 1 << i; + + // active low + return ~ret & rowmask; +} + +INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button) +{ + // when an input is directly wired to MCU MCLR pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Atari Touch Me + * PIC 1655A-053 + * 2 7seg LEDs + 4 other LEDs, 1-bit sound + + This is the handheld version of the 1974 arcade game. + + known revisions: + - Model BH-100 GI C013233 Rev 2 Atari W 1979: PIC 1655A-053 + - Model BH-100 C013150 Rev 6 Atari 1979: AMI C10745 (custom ASIC) + +***************************************************************************/ + +class touchme_state : public hh_pic16_state +{ +public: + touchme_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void touchme(machine_config &config); + +private: + void update_display(); + void update_speaker(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void touchme_state::update_display() +{ + m_display->matrix(~m_b & 0x7b, m_c); +} + +void touchme_state::update_speaker() +{ + m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); +} + +u8 touchme_state::read_a() +{ + // A: multiplexed inputs + return read_inputs(3, 0xf); +} + +void touchme_state::write_b(u8 data) +{ + // B0-B2: input mux + m_inp_mux = data & 7; + + // B0,B1: digit select + // B3-B6: leds + m_b = data; + update_display(); + + // B7: speaker lead 1 + update_speaker(); +} + +void touchme_state::write_c(u8 data) +{ + // C0-C6: digit segments + m_c = data; + update_display(); + + // C7: speaker lead 2 + update_speaker(); +} + +// config + +static INPUT_PORTS_START( touchme ) + PORT_START("IN.0") // B0 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("High") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Skill") + + PORT_START("IN.1") // B1 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green Button") + + PORT_START("IN.2") // B2 port A + PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select" ) + PORT_CONFSETTING( 0x01^0x07, "1" ) + PORT_CONFSETTING( 0x02^0x07, "2" ) + PORT_CONFSETTING( 0x04^0x07, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void touchme_state::touchme(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 300000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->read_a().set(FUNC(touchme_state::read_a)); + m_maincpu->write_b().set(FUNC(touchme_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(touchme_state::write_c)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 300000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_touchme); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( touchme ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) ) +ROM_END + + + + + +/*************************************************************************** + + Caprice Pro-Action Baseball (manufactured by Calfax) + * PIC 1655A-043 + * 1 7seg LED + 36 other LEDs, CD4028, 1-bit sound + +***************************************************************************/ + +class pabball_state : public hh_pic16_state +{ +public: + pabball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void pabball(machine_config &config); + +private: + void update_display(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void pabball_state::update_display() +{ + // CD4028 BCD to decimal decoder + // CD4028 0-8: led select, 9: 7seg + u16 sel = m_c & 0xf; + if (sel & 8) sel &= 9; + sel = 1 << sel; + + m_display->matrix(sel, m_b); +} + +void pabball_state::write_b(u8 data) +{ + // B: led data + m_b = ~data; + update_display(); +} + +void pabball_state::write_c(u8 data) +{ + // C2: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 2 & 1); + + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C3: CD4028 A-D + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( pabball ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Straight") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port C + PORT_BIT( 0xcf, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Hit") + PORT_CONFNAME( 0x20, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x20, "2" ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, 0) PORT_NAME("P1 Reset") +INPUT_PORTS_END + +void pabball_state::pabball(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1200000); // approximation - RC osc. R=18K, C=27pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(pabball_state::write_b)); + m_maincpu->read_c().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(pabball_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x200, 0xff); + config.set_default_layout(layout_hh_pic16_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( pabball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) ) +ROM_END + + + + + +/*************************************************************************** + + GAF Melody Madness + * PIC 1655A-094 + * 2 lamps under tube, 1-bit sound + + Melody Madness is a tabletop music memory game, shaped like a jukebox. + It can also be played as a simple electronic piano. + +***************************************************************************/ + +class melodym_state : public hh_pic16_state +{ +public: + melodym_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void melodym(machine_config &config); + +private: + void write_b(u8 data); + u8 read_c(); + void write_c(u8 data); +}; + +// handlers + +void melodym_state::write_b(u8 data) +{ + // B2-B6: input mux + m_inp_mux = data >> 2 & 0x1f; +} + +u8 melodym_state::read_c() +{ + // C0-C4: multiplexed inputs + return read_inputs(5, 0x1f) | 0xe0; +} + +void melodym_state::write_c(u8 data) +{ + // C6: both lamps + m_display->matrix(1, ~data >> 6 & 1); + + // C7: speaker out + m_speaker->level_w(~data >> 7 & 1); +} + +// config + +static INPUT_PORTS_START( melodym ) + PORT_START("IN.0") // B2 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") + + PORT_START("IN.1") // B3 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 6") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 8") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 9") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Button 10") + + PORT_START("IN.2") // B4 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 11") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 12") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // there is no button 13 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 14") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Button 15") + + PORT_START("IN.3") // B5 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 16") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 17") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 18") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 19") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button 20") + + PORT_START("IN.4") // B6 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Button 21") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Button 22") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Button 23") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Button 24") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Button 25") + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Novice") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Whiz") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Pro") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Note") +INPUT_PORTS_END + +void melodym_state::melodym(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation + m_maincpu->read_a().set_ioport("IN.5"); + m_maincpu->write_b().set(FUNC(melodym_state::write_b)); + m_maincpu->read_c().set(FUNC(melodym_state::read_c)); + m_maincpu->write_c().set(FUNC(melodym_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + m_display->set_bri_levels(0.9); + config.set_default_layout(layout_melodym); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( melodym ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Maniac, by Ralph Baer + * PIC 1655A-036 + * 2 7seg LEDs, 1-bit sound + + Maniac is a reflex game for 2-4 players. There are 4 challenges: + 1: Musical Maniac: Press the button as soon as the music stops. + 2: Sounds Abound: Count the number of tones in the song, then press the button + after the same amount of beeps. + 3: Look Twice: Press the button after the game repeats the first pattern. + 4: Your Time Is Up: Press the button after estimating the duration of the tone. + +***************************************************************************/ + +class maniac_state : public hh_pic16_state +{ +public: + maniac_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void maniac(machine_config &config); + +private: + void update_display(); + void update_speaker(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void maniac_state::update_display() +{ + m_display->write_row(0, ~m_b & 0x7f); + m_display->write_row(1, ~m_c & 0x7f); +} + +void maniac_state::update_speaker() +{ + m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); +} + +void maniac_state::write_b(u8 data) +{ + // B0-B6: left 7seg + m_b = data; + update_display(); + + // B7: speaker lead 1 + update_speaker(); +} + +void maniac_state::write_c(u8 data) +{ + // C0-C6: right 7seg + m_c = data; + update_display(); + + // C7: speaker lead 2 + update_speaker(); +} + +// config + +static INPUT_PORTS_START( maniac ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // top button, increment clockwise + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) +INPUT_PORTS_END + +void maniac_state::maniac(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation - RC osc. R=~13.4K, C=470pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(maniac_state::write_b)); + m_maincpu->write_c().set(FUNC(maniac_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_maniac); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( maniac ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Flash + * PCB label 25-600321, REV C, TCI-A3H / 94HB + * PIC 1655A-078 + * 2 7seg LEDs + 8 other LEDs, 1-bit sound with volume decay + + Flash is a wall-mounted game, players throw beanbags to activate the buttons. + It's described in patent US4333657 as an electronic dart game. + + BTANB: In games 4 and 5 it's easy to lock up the program by pressing the + buttons repeatedly and causing a score overflow. Although that wouldn't be + possible by properly throwing beanbags at it. This bug is warned about in + the manual. + + This could also be purchased as a bare PCB from Radio Shack under the Archer + brand, catalog number 277-1013. It was named "Sound Effects Chassis" but + clearly it's nothing like that. The instruction leaflet that came with the + PCB says to attach a speaker and a 9V power source. It actually takes 5V, + 9V would break it. The only thing it has to say about the game itself is + "Your module will produce blinking lights and several different sounds." + +***************************************************************************/ + +class flash_state : public hh_pic16_state +{ +public: + flash_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void flash(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + void update_display(); + void write_b(u8 data); + u8 read_c(); + void write_c(u8 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void flash_state::machine_start() +{ + hh_pic16_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void flash_state::speaker_update() +{ + if (~m_b & 0x40) + m_speaker_volume = 50.0; + + // it takes a bit before it actually starts fading + m_volume->flt_volume_set_volume(std::min(m_speaker_volume, 1.0)); +} + +TIMER_DEVICE_CALLBACK_MEMBER(flash_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.0075; +} + +void flash_state::update_display() +{ + m_display->matrix(~m_b >> 4 & 3, (~m_c >> 1 & 0x7f) | (~m_b << 7 & 0x780)); +} + +void flash_state::write_b(u8 data) +{ + // B0-B3: led data + // B4,B5: led select + m_b = data; + update_display(); + + // B7: speaker out + m_speaker->level_w(BIT(data, 7)); + + // B6: speaker on + speaker_update(); +} + +u8 flash_state::read_c() +{ + // C1-C7: buttons + return (m_c & 1) ? 0xff : m_inputs[1]->read(); +} + +void flash_state::write_c(u8 data) +{ + // C0: enable buttons + // C1-C7: digit segments + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( flash ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // top button, increment clockwise + PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.1") // port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) +INPUT_PORTS_END + +void flash_state::flash(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1050000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_b().set(FUNC(flash_state::write_b)); + m_maincpu->read_c().set(FUNC(flash_state::read_c)); + m_maincpu->write_c().set(FUNC(flash_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 7+4); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_flash); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(flash_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( flash ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-078", 0x0000, 0x0400, CRC(bf780733) SHA1(57ac4620d87492280ab8cf69c148f98e38ecedc4) ) +ROM_END + + + + + +/*************************************************************************** + + Kingsford Match Me + * PIC 1655A-049 + * 8 lamps, 1-bit sound + + Known releases: + - USA(1): Match Me/Mini Match Me, published by Kingsford + - USA(2): Me Too, published by Talbot + - Hong Kong: Gotcha!/Encore/Follow Me, published by Toytronic + + Match Me is the tabletop version, Mini Match Me is the handheld. + The original is probably by Toytronic, Kingsford's version being licensed from them. + + Known revisions: + - PIC 1655A-049 (this one, dumped from a Mini Match Me) + - PIC 1655A-123 (seen in Match Me and Mini Match Me) + +***************************************************************************/ + +class matchme_state : public hh_pic16_state +{ +public: + matchme_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void matchme(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void write_b(u8 data); + void write_c(u8 data); + u8 read_c(); +}; + +void matchme_state::machine_reset() +{ + hh_pic16_state::machine_reset(); + set_clock(); +} + +// handlers + +void matchme_state::set_clock() +{ + // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a + // 10pF cap to speed it up by about 7.5%. + m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 1300000 : 1200000); +} + +void matchme_state::write_b(u8 data) +{ + // B0-B7: lamps + m_display->matrix(1, data); +} + +u8 matchme_state::read_c() +{ + // C0-C3: multiplexed inputs from C4-C6 + m_inp_mux = m_c >> 4 & 7; + u8 lo = read_inputs(3, 0xf); + + // C4-C6: multiplexed inputs from C0-C3 + m_inp_mux = m_c & 0xf; + u8 hi = read_rotated_inputs(4, 7); + + return lo | hi << 4 | 0x80; +} + +void matchme_state::write_c(u8 data) +{ + // C0-C6: input mux + m_c = data; + + // C7: speaker out + RTCC pin + m_speaker->level_w(data >> 7 & 1); + m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 7 & 1); +} + +// config + +static INPUT_PORTS_START( matchme ) + PORT_START("IN.0") // C4 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // purple + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pink + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // yellow + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // blue + + PORT_START("IN.1") // C5 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) // red + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) // cyan + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) // orange + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) // green + + PORT_START("IN.2") // C6 port C + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x03) // Last/Auto + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Long") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.3") // port A + PORT_CONFNAME( 0x07, 0x00^0x07, "Game" ) + PORT_CONFSETTING( 0x00^0x07, "1" ) + PORT_CONFSETTING( 0x01^0x07, "2" ) + PORT_CONFSETTING( 0x02^0x07, "3" ) + PORT_CONFSETTING( 0x04^0x07, "4" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "Amateur" ) // AM + PORT_CONFSETTING( 0x00, "Professional" ) // PRO + + PORT_START("IN.4") // another fake + PORT_CONFNAME( 0x01, 0x00, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, matchme_state, speed_switch, 0) + PORT_CONFSETTING( 0x00, DEF_STR( Low ) ) + PORT_CONFSETTING( 0x01, DEF_STR( High ) ) + + PORT_START("FAKE") // Last/Auto are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Last") + PORT_CONFNAME( 0x02, 0x02, "Music" ) + PORT_CONFSETTING( 0x02, "Manual" ) + PORT_CONFSETTING( 0x00, "Auto" ) +INPUT_PORTS_END + +void matchme_state::matchme(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1200000); // see set_clock + m_maincpu->read_a().set_ioport("IN.3"); + m_maincpu->write_b().set(FUNC(matchme_state::write_b)); + m_maincpu->read_c().set(FUNC(matchme_state::read_c)); + m_maincpu->write_c().set(FUNC(matchme_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 8); + config.set_default_layout(layout_matchme); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( matchme ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) ) +ROM_END + + + + + +/*************************************************************************** + + Kmart Dr. Dunk (manufactured in Hong Kong) + * PIC 1655A-51 + * 2 7seg LEDs + 21 other LEDs, 1-bit sound + + It is a clone of Mattel Basketball, but at lower speed. + The ROM is nearly identical to hccbaskb, the housing/overlay is similar to + U.S. Games/Tandy Trick Shot Basketball. + + known releases: + - USA(1): Dr. Dunk, published by Kmart + - USA(2): Electronic Basketball (model 60-2146), published by Tandy + +***************************************************************************/ + +class drdunk_state : public hh_pic16_state +{ +public: + drdunk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void drdunk(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void drdunk_state::update_display() +{ + m_display->matrix(m_b, m_c); +} + +u8 drdunk_state::read_a() +{ + // A2: skill switch, A3: multiplexed inputs + return m_inputs[5]->read() | read_inputs(5, 8) | 3; +} + +void drdunk_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0-B4: input mux + m_inp_mux = ~data & 0x1f; + + // B0-B3: led select + // B4,B5: digit select + m_b = data; + update_display(); +} + +void drdunk_state::write_c(u8 data) +{ + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C6: led data + m_c = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( drdunk ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // B2 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // B4 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START("IN.5") // port A2 + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void drdunk_state::drdunk(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=18K, C=47pF + m_maincpu->read_a().set(FUNC(drdunk_state::read_a)); + m_maincpu->write_b().set(FUNC(drdunk_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(drdunk_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 7); + m_display->set_segmask(0x30, 0x7f); + m_display->set_bri_levels(0.01, 0.2); // player led is brighter + config.set_default_layout(layout_drdunk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( drdunk ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) ) +ROM_END + + + + + +/*************************************************************************** + + Lakeside Le Boom + * PIC 1655A-061 + * 1 led, 1-bit sound with RC circuit for volume decay + + This is a tabletop timebomb defusion game. It's shaped like an aerial bomb, + colored black on USA version, yellow on dual-language Canadian version. + The game starts 'ticking' when the player opens the keypad door. To begin, + select the game mode, rows(keypad size), and fuse duration. + + Game modes as described on the box: + 1: Eliminate the buttons one by one in the order set out by the computer. Press + one twice and you'll be sorry! + 2: For 2 or more players. Take turns pressing the buttons, remember which ones. + Press a button a second time and watch out, it's all over. + 3: The computer picks one secret button that stops the fuse. You must press it + on your 5th turn. Listen to the clues and you'll do fine. + 4: The computer picks a secret combination. Find it first by listening to the + clues. Find the right order and you'll get it to fizzle out. + +***************************************************************************/ + +class leboom_state : public hh_pic16_state +{ +public: + leboom_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag), + m_volume(*this, "volume") + { } + + void leboom(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void leboom_state::machine_start() +{ + hh_pic16_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +void leboom_state::speaker_update() +{ + if (~m_c & 0x80) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(leboom_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.005; +} + +u8 leboom_state::read_a() +{ + // A: multiplexed inputs + return read_inputs(6, 0xf); +} + +void leboom_state::write_b(u8 data) +{ + // B0-B5: input mux + m_inp_mux = data & 0x3f; +} + +void leboom_state::write_c(u8 data) +{ + // C4: single led + m_display->matrix(1, BIT(data, 4)); + + // C6: speaker out + m_speaker->level_w(BIT(data, 6)); + + // C7: speaker on + m_c = data; + speaker_update(); +} + +// config + +static INPUT_PORTS_START( leboom ) + PORT_START("IN.0") // B0 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Red Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Red Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Red Button 4") + + PORT_START("IN.1") // B1 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Red-Red Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Red-Green Button") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Red-Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Red-Blue Button") + + PORT_START("IN.2") // B2 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Shortest") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Short") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Long") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Longest") + + PORT_START("IN.3") // B3 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Yellow Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Yellow Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Yellow Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Yellow Button 4") + + PORT_START("IN.4") // B4 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Blue Button 1") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Blue Button 2") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Blue Button 3") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Blue Button 4") + + PORT_START("IN.5") // B5 port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Blue Button 5") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Blue Button 6") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Blue Button 7") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Blue Button 8") +INPUT_PORTS_END + +void leboom_state::leboom(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 1000000); // approximation + m_maincpu->read_a().set(FUNC(leboom_state::read_a)); + m_maincpu->write_b().set(FUNC(leboom_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(leboom_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_leboom); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(leboom_state::speaker_decay_sim), attotime::from_msec(5)); +} + +// roms + +ROM_START( leboom ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Rocket Pinball (model 7-460) + * PIC 1650A-110, 69-11397 + * 3 7seg LEDs + 44 other LEDs, 1-bit sound + + known releases: + - Hong Kong(1): Rocket Pinball, published by Tiger + - Hong Kong(2): Spaceship Pinball, published by Toytronic + - USA(1): Rocket Pinball (model 60-2140), published by Tandy + - USA(2): Cosmic Pinball (model 49-65456), published by Sears + +***************************************************************************/ + +class rockpin_state : public hh_pic16_state +{ +public: + rockpin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void rockpin(machine_config &config); + +private: + void update_display(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void rockpin_state::update_display() +{ + // 3 7seg leds from ports A and B + m_display->matrix_partial(0, 3, m_a, m_b); + + // 44 leds from ports C and D + m_display->matrix_partial(3, 6, m_d, m_c); +} + +void rockpin_state::write_a(u8 data) +{ + // A3,A4: speaker out + m_speaker->level_w(data >> 3 & 3); + + // A0-A2: select digit + m_a = ~data & 7; + update_display(); +} + +void rockpin_state::write_b(u8 data) +{ + // B0-B6: digit segments + m_b = data & 0x7f; + update_display(); +} + +void rockpin_state::write_c(u8 data) +{ + // C0-C7: led data + m_c = ~data; + update_display(); +} + +void rockpin_state::write_d(u8 data) +{ + // D0-D5: led select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( rockpin ) + PORT_START("IN.0") // port A + PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Ball") +INPUT_PORTS_END + +void rockpin_state::rockpin(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_a().set(FUNC(rockpin_state::write_a)); + m_maincpu->read_b().set_constant(0xff); + m_maincpu->write_b().set(FUNC(rockpin_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(rockpin_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(rockpin_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 450000/4).signal_handler().set_inputline(m_maincpu, PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3+6, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_rockpin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( rockpin ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Half Court Computer Basketball (model 7-470) + * PIC 1655A(no serial), 69-11557 + * 2 7seg LEDs + 26 other LEDs, 1-bit sound + + known releases: + - Hong Kong: Half Court Computer Basketball, published by Tiger + - USA: Electronic Basketball (model 49-65453), published by Sears + +***************************************************************************/ + +class hccbaskb_state : public hh_pic16_state +{ +public: + hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void hccbaskb(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void hccbaskb_state::update_display() +{ + m_display->matrix(m_b, m_c); +} + +u8 hccbaskb_state::read_a() +{ + // A2: skill switch, A3: multiplexed inputs + return m_inputs[5]->read() | read_inputs(5, 8) | 3; +} + +void hccbaskb_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0-B4: input mux + m_inp_mux = ~data & 0x1f; + + // B7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // B0-B4: led select + // B5,B6: digit select + m_b = data; + update_display(); +} + +void hccbaskb_state::write_c(u8 data) +{ + // C0-C6: led data + m_c = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( hccbaskb ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // B2 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // B4 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START("IN.5") // port A2 + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void hccbaskb_state::hccbaskb(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=15K, C=47pF + m_maincpu->read_a().set(FUNC(hccbaskb_state::read_a)); + m_maincpu->write_b().set(FUNC(hccbaskb_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(hccbaskb_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x60, 0x7f); + m_display->set_bri_levels(0.01, 0.2); // player led is brighter + config.set_default_layout(layout_hccbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( hccbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) ) +ROM_END + + + + + +/*************************************************************************** + + Toytronic Football (set 1) + * PIC 1655A-033 + * 4511 7seg BCD decoder, 7 7seg LEDs + 27 other LEDs, 1-bit sound + + (no brand) Football (set 2) + * PIC 1655-024 + * rest same as above, 1 less button + + Hello and welcome to another Mattel Football clone, there are so many of these. + The 1655-024 one came from an unbranded handheld, but comparison suggests that + it's the 'prequel' of 1655A-033. + + The 1655-024 version looks and sounds the same as Conic "Electronic Football". + +***************************************************************************/ + +class ttfball_state : public hh_pic16_state +{ +public: + ttfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void ttfball(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_b(u8 data); + void write_c(u8 data); +}; + +// handlers + +void ttfball_state::update_display() +{ + // C0-C2: led data + // C0-C3: 4511 A-D, C4: digit segment DP + // C5: select digits or led matrix + const u8 _4511_map[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0,0,0,0,0,0 }; + u16 led_data = (m_c & 0x20) ? (_4511_map[m_c & 0xf] | (~m_c << 3 & 0x80)) : (~m_c << 8 & 0x700); + + m_display->matrix(m_b | (m_c << 1 & 0x100), led_data); +} + +u8 ttfball_state::read_a() +{ + // A3: multiplexed inputs, A0-A2: other inputs + return m_inputs[5]->read() | read_inputs(5, 8); +} + +void ttfball_state::write_b(u8 data) +{ + // B0: RTCC pin + m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); + + // B0,B1,B3,B7: input mux low + m_inp_mux = (m_inp_mux & 0x10) | (~data & 3) | (~data >> 1 & 4) | (~data >> 4 & 8); + + // B0-B7: led select (see above) + m_b = data; + update_display(); +} + +void ttfball_state::write_c(u8 data) +{ + // C6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // C7: input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); + + // C0-C7: led data/select (see above) + m_c = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( ttfball ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.2") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.3") // B7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.4") // C7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick") + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +static INPUT_PORTS_START( ttfballa ) + PORT_START("IN.0") // B0 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.1") // B1 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Forward") + + PORT_START("IN.2") // B3 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.3") // B7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.4") // C7 port A3 + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IN.5") // port A + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void ttfball_state::ttfball(machine_config &config) +{ + // basic machine hardware + PIC1655(config, m_maincpu, 600000); // approximation - RC osc. R=27K(set 1) or 33K(set 2), C=68pF + m_maincpu->read_a().set(FUNC(ttfball_state::read_a)); + m_maincpu->write_b().set(FUNC(ttfball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(ttfball_state::write_c)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x7f, 0xff); + m_display->set_bri_levels(0.003, 0.03); // player led is brighter + config.set_default_layout(layout_ttfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ttfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) ) +ROM_END + +ROM_START( ttfballa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Programmable Baseball + * PIC 1650A-133 + * 3 7seg LEDs + 36 other LEDs, 1-bit sound + + known releases: + - USA(1): Programmable Baseball, published by U.S. Games + - USA(2): Electronic 2-Player Baseball (model 60-2157), published by Tandy + +***************************************************************************/ + +class uspbball_state : public hh_pic16_state +{ +public: + uspbball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void uspbball(machine_config &config); + +private: + void update_display(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void uspbball_state::update_display() +{ + m_display->matrix(m_d, m_c << 8 | m_b); +} + +void uspbball_state::write_a(u8 data) +{ + // A0: speaker out + m_speaker->level_w(data & 1); +} + +void uspbball_state::write_b(u8 data) +{ + // B: digit segment data + m_b = bitswap<8>(data,0,1,2,3,4,5,6,7); + update_display(); +} + +void uspbball_state::write_c(u8 data) +{ + // C: led data + m_c = ~data; + update_display(); +} + +void uspbball_state::write_d(u8 data) +{ + // D0-D2: digit select + // D3-D5: led select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( uspbball ) + PORT_START("IN.0") // port A + PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Fast") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Change Up/Fielder") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + + PORT_START("IN.1") // port D + PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_CONFNAME( 0x80, 0x80, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x80, "1" ) + PORT_CONFSETTING( 0x00, "2" ) +INPUT_PORTS_END + +void uspbball_state::uspbball(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 900000); // approximation - RC osc. R=22K, C=47pF + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_a().set(FUNC(uspbball_state::write_a)); + m_maincpu->read_b().set_constant(0xff); + m_maincpu->write_b().set(FUNC(uspbball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(uspbball_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(uspbball_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 900000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6, 16); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_hh_pic16_test); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( uspbball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Electronic 2-Player Football + * PIC 1650A-144 + * 8 7seg LEDs + 2 other LEDs, 1-bit sound + + known releases: + - USA(1): Electronic 2-Player Football, published by U.S. Games + - USA(2): Electronic 2-Player Football (model 60-2156), published by Tandy + +***************************************************************************/ + +class us2pfball_state : public hh_pic16_state +{ +public: + us2pfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pic16_state(mconfig, type, tag) + { } + + void us2pfball(machine_config &config); + +private: + void update_display(); + u8 read_a(); + void write_a(u8 data); + void write_b(u8 data); + void write_c(u8 data); + void write_d(u8 data); +}; + +// handlers + +void us2pfball_state::update_display() +{ + m_display->matrix(m_d | (m_a << 6 & 0x300), m_c); +} + +u8 us2pfball_state::read_a() +{ + // A0,A1: multiplexed inputs, A4-A7: other inputs + return read_inputs(4, 3) | (m_inputs[4]->read() & 0xf0) | 0x0c; +} + +void us2pfball_state::write_a(u8 data) +{ + // A2,A3: leds + m_a = data; + update_display(); +} + +void us2pfball_state::write_b(u8 data) +{ + // B0-B3: input mux + m_inp_mux = data & 0xf; +} + +void us2pfball_state::write_c(u8 data) +{ + // C7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // C0-C6: digit segments + m_c = data; + update_display(); +} + +void us2pfball_state::write_d(u8 data) +{ + // D0-D7: digit select + m_d = ~data; + update_display(); +} + +// config + +static INPUT_PORTS_START( us2pfball ) + PORT_START("IN.0") // B0 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.1") // B1 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.2") // B2 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.3") // B3 port A low + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY + + PORT_START("IN.4") // port A high + PORT_CONFNAME( 0x10, 0x10, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x10, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x20, "1" ) // college + PORT_CONFSETTING( 0x00, "2" ) // pro + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") // K/P + + PORT_START("IN.5") // port B + PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Status/Score") // S +INPUT_PORTS_END + +void us2pfball_state::us2pfball(machine_config &config) +{ + // basic machine hardware + PIC1650(config, m_maincpu, 800000); // approximation - RC osc. R=39K, C=75pF + m_maincpu->read_a().set(FUNC(us2pfball_state::read_a)); + m_maincpu->write_a().set(FUNC(us2pfball_state::write_a)); + m_maincpu->read_b().set_ioport("IN.5"); + m_maincpu->write_b().set(FUNC(us2pfball_state::write_b)); + m_maincpu->read_c().set_constant(0xff); + m_maincpu->write_c().set(FUNC(us2pfball_state::write_c)); + m_maincpu->read_d().set_constant(0xff); + m_maincpu->write_d().set(FUNC(us2pfball_state::write_d)); + + // PIC CLKOUT, tied to RTCC + CLOCK(config, "clock", 800000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0xff, 0x7f); + m_display->set_bri_levels(0.01, 0.17); // player led is brighter + config.set_default_layout(layout_us2pfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( us2pfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Caprice / Calfax", "Pro-Action Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) + +CONS( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, drdunk, 0, 0, drdunk, drdunk, drdunk_state, empty_init, "Kmart", "Dr. Dunk", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, rockpin, 0, 0, rockpin, rockpin, rockpin_state, empty_init, "Tiger Electronics", "Rocket Pinball", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, hccbaskb, 0, 0, hccbaskb, hccbaskb, hccbaskb_state, empty_init, "Tiger Electronics", "Half Court Computer Basketball", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, ttfball, 0, 0, ttfball, ttfball, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +CONS( 1979, ttfballa, ttfball, 0, ttfball, ttfballa, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 2)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1981, uspbball, 0, 0, uspbball, uspbball, uspbball_state, empty_init, "U.S. Games", "Programmable Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) +CONS( 1981, us2pfball, 0, 0, us2pfball, us2pfball, us2pfball_state, empty_init, "U.S. Games", "Electronic 2-Player Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_pps41.cpp b/src/mame/handheld/hh_pps41.cpp new file mode 100644 index 00000000000..2521f355b0d --- /dev/null +++ b/src/mame/handheld/hh_pps41.cpp @@ -0,0 +1,1617 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +Rockwell PPS-4/1 MCU series handhelds + +ROM source notes when dumped from another publisher, but confident it's the same: +- memoquiz: Mattel Mind Boggler + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/pps41/mm75.h" +#include "cpu/pps41/mm76.h" +#include "cpu/pps41/mm78.h" +#include "cpu/pps41/mm78la.h" +#include "video/pwm.h" +#include "sound/beep.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "brainbaf.lh" +#include "dunksunk.lh" +#include "ftri1.lh" +#include "horocomp.lh" +#include "mastmind.lh" +#include "memoquiz.lh" +#include "mfootb2.lh" +#include "mwcfootb.lh" +#include "rdqa.lh" +#include "scrabsen.lh" +#include "smastmind.lh" + +//#include "hh_pps41_test.lh" // common test-layout - use external artwork + + +class hh_pps41_state : public driver_device +{ +public: + hh_pps41_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override { update_int(); } + virtual void device_post_load() override { update_int(); } + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<11> m_inputs; // max 11 + + u16 m_inp_mux = 0; + u32 m_grid = 0; + u32 m_plate = 0; + + // MCU output pin state + u16 m_d = 0; + u16 m_r = 0; + + u8 read_inputs(int columns); + virtual void update_int() { ; } +}; + + +// machine start + +void hh_pps41_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); + save_item(NAME(m_d)); + save_item(NAME(m_r)); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_pps41_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +INPUT_CHANGED_MEMBER(hh_pps41_state::reset_button) +{ + // when an input is directly wired to MCU PO pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Fonas Tri-1 + * PCB label: CASSIA CA010-F + * MM78 MCU variant with 40 pins (no label, die label A7859) + * 4 7seg leds, 41 other leds, 1-bit sound + + The game only uses 1.5KB ROM and seems it doesn't use all the RAM either, + as if it was programmed for MM77L. + + Hold all 4 buttons at boot (not counting RESET) for a led test. + Cassia was Eric White/Ken Cohen's company, later named CXG, known for + their chess computers. + +***************************************************************************/ + +class ftri1_state : public hh_pps41_state +{ +public: + ftri1_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void ftri1(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); +}; + +// handlers + +void ftri1_state::update_display() +{ + m_display->matrix(m_d, bitswap<8>(~m_r, 0,7,6,5,4,3,2,1)); +} + +void ftri1_state::write_d(u16 data) +{ + // DIO0-DIO8: digit/led select + m_d = data; + update_display(); + + // DIO9: speaker out + m_speaker->level_w(BIT(data, 9)); +} + +void ftri1_state::write_r(u16 data) +{ + // RIO1-RIO8: digit/led data + m_r = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( ftri1 ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0c, 0x04, "Game Select" ) + PORT_CONFSETTING( 0x08, "Star Chase" ) + PORT_CONFSETTING( 0x04, "All Star Baseball" ) + PORT_CONFSETTING( 0x00, "Batting Champs" ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Score / S1 H") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Steal / S1 V") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pitch / S2 H") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Swing / S2 V") + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pps41_state, reset_button, 0) PORT_CODE(KEYCODE_F1) PORT_NAME("Game Reset") +INPUT_PORTS_END + +void ftri1_state::ftri1(machine_config &config) +{ + // basic machine hardware + MM78(config, m_maincpu, 300000); // approximation - VC osc. R=68K + m_maincpu->write_d().set(FUNC(ftri1_state::write_d)); + m_maincpu->write_r().set(FUNC(ftri1_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1e0, 0x7f); + config.set_default_layout(layout_ftri1); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ftri1 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "a7859", 0x0000, 0x0800, CRC(3c957f1d) SHA1(42db81a78bbef971a84e61a26d91f7411980d79c) ) +ROM_END + + + + + +/*************************************************************************** + + Invicta Electronic Master Mind + * MM75 MCU (label MM75 A7525-11, die label A7525) + * 9-digit 7seg VFD display (Futaba 9-ST) + + Invicta Super-Sonic Electronic Master Mind + * MM75 MCU (label A7539-12, die label A7539) + * same base hardware, added beeper + + Invicta Plastics is the owner of the Mastermind game rights. The back of the + Master Mind unit says (C) 1977, but this electronic handheld version came + out in 1979. Or maybe there's an older revision. + +***************************************************************************/ + +class mastmind_state : public hh_pps41_state +{ +public: + mastmind_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag), + m_beeper(*this, "beeper") + { } + + void mastmind(machine_config &config); + void smastmind(machine_config &config); + +private: + optional_device m_beeper; + + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void mastmind_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void mastmind_state::write_d(u16 data) +{ + // DIO0-DIO7: digit select (DIO7 N/C on mastmind) + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8: beeper on smastmind + if (m_beeper) + m_beeper->set_state(BIT(data, 8)); +} + +void mastmind_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 mastmind_state::read_p() +{ + // PI1-PI4: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( mastmind ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Try") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fail") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test on mastmind? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") +INPUT_PORTS_END + +void mastmind_state::mastmind(machine_config &config) +{ + // basic machine hardware + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mastmind_state::write_d)); + m_maincpu->write_r().set(FUNC(mastmind_state::write_r)); + m_maincpu->read_p().set(FUNC(mastmind_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_mastmind); + + // no sound! +} + +void mastmind_state::smastmind(machine_config &config) +{ + mastmind(config); + + config.set_default_layout(layout_smastmind); + + // sound hardware + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 2400); // approximation + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mastmind ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "mm75_a7525-11", 0x0000, 0x0200, CRC(39dbdd50) SHA1(72fa5781e9df62d91d57437ded2931fab8253c3c) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) +ROM_END + +ROM_START( smastmind ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a7539-12", 0x0000, 0x0200, CRC(b63c453f) SHA1(f47a540fd90eed7514ed03864be2121f641c1154) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_smastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) +ROM_END + + + + + +/*************************************************************************** + + Kmart Dunk 'n Sunk (manufactured in Hong Kong) + * MM76EL MCU (label GE-E 1V2280, die label B8617) + * 4 7seg leds, 31 other leds, 1-bit sound + + It's by the same Hong Kong company that did Kmart Dr. Dunk/Tandy Electronic + Basketball (PIC16 MCU), Grandstand Pocket Match of the Day (MOS MPS765x MCU) + among others. + + known releases: + - USA(1): Dunk 'n Sunk, published by Kmart + - USA(2): Electronic Basketball / Submarine Warfare, published by U.S. Games + +***************************************************************************/ + +class dunksunk_state : public hh_pps41_state +{ +public: + dunksunk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void dunksunk(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { update_int(); } + DECLARE_INPUT_CHANGED_MEMBER(game_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); +}; + +// handlers + +void dunksunk_state::update_int() +{ + // 2 of the switches are tied to MCU interrupt pins + m_maincpu->set_input_line(0, (m_inputs[1]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); + m_maincpu->set_input_line(1, (m_inputs[2]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void dunksunk_state::update_display() +{ + m_display->matrix(m_d >> 1, ~m_r); +} + +void dunksunk_state::write_d(u16 data) +{ + // DIO0: speaker out + m_speaker->level_w(data & 1); + + // DIO1-DIO5: led select + // DIO6-DIO9: digit select + m_d = data; + update_display(); +} + +void dunksunk_state::write_r(u16 data) +{ + // RIO1-RIO7: led data + m_r = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( dunksunk ) + PORT_START("IN.0") // PI + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x03, EQUALS, 0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, difficulty_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // INT0 + PORT_CONFSETTING( 0x01, "2" ) // PI4 + PORT_CONFSETTING( 0x03, "3" ) + + PORT_START("IN.2") // INT1 + PORT_CONFNAME( 0x01, 0x01, "Game Select" ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, game_switch, 0) + PORT_CONFSETTING( 0x01, "Basketball" ) + PORT_CONFSETTING( 0x00, "Submarine Chase" ) +INPUT_PORTS_END + +void dunksunk_state::dunksunk(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 390000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(dunksunk_state::write_d)); + m_maincpu->write_r().set(FUNC(dunksunk_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1e0, 0x7f); + m_display->set_bri_levels(0.015, 0.2); // player led is brighter + config.set_default_layout(layout_dunksunk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( dunksunk ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "ge-e_1v2280", 0x0000, 0x0400, CRC(90f17191) SHA1(80c3708af99c9db7afe17254fa4df2080aa9f145) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_dunksunk_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) +ROM_END + + + + + +/*************************************************************************** + + M.E.M. Belgium Memoquiz + * PCB label: MEMOQUIZ MO3 + * MM75 MCU (label M7505 A7505-12, die label A7505) + * 9-digit 7seg VFD display, no sound + + It's a Mastermind game, not as straightforward as Invicta's version. + To start, press the "?" button to generate a new code, then try to guess it, + confirming with the "=" button. CD reveals the answer, PE is for player entry. + + known releases: + - Europe: Memoquiz, published by M.E.M. Belgium + - UK: Memoquiz, published by Polymark + - USA: Mind Boggler (model 2626), published by Mattel + +***************************************************************************/ + +class memoquiz_state : public hh_pps41_state +{ +public: + memoquiz_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void memoquiz(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(digits_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void memoquiz_state::update_int() +{ + // digits switch is tied to MCU interrupt pins + u8 inp = m_inputs[4]->read(); + m_maincpu->set_input_line(0, (inp & 1) ? CLEAR_LINE : ASSERT_LINE); + m_maincpu->set_input_line(1, (inp & 2) ? ASSERT_LINE : CLEAR_LINE); +} + +void memoquiz_state::update_display() +{ + m_display->matrix(m_inp_mux, (m_inp_mux << 2 & 0x80) | (~m_r & 0x7f)); +} + +void memoquiz_state::write_d(u16 data) +{ + // DIO0-DIO7: digit select, DIO5 is also DP segment + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8: N/C, looks like they planned to add sound, but didn't +} + +void memoquiz_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 memoquiz_state::read_p() +{ + // PI1-PI4: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( memoquiz ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("AC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("PE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CD") + + PORT_START("IN.4") + PORT_CONFNAME( 0x03, 0x01, "Digits" ) PORT_CHANGED_MEMBER(DEVICE_SELF, memoquiz_state, digits_switch, 0) + PORT_CONFSETTING( 0x01, "3" ) // INT0, Vdd when closed, pulled to GND when open + PORT_CONFSETTING( 0x02, "4" ) // INT1, GND when closed, pulled to Vdd when open + PORT_CONFSETTING( 0x00, "5" ) +INPUT_PORTS_END + +void memoquiz_state::memoquiz(machine_config &config) +{ + // basic machine hardware + MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(memoquiz_state::write_d)); + m_maincpu->write_r().set(FUNC(memoquiz_state::write_r)); + m_maincpu->read_p().set(FUNC(memoquiz_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_memoquiz); + + // no sound! +} + +// roms + +ROM_START( memoquiz ) + ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "m7505_a7505-12", 0x0000, 0x0200, CRC(47223508) SHA1(97b62e0c453ae2e65d48e039ad65857dae2d4d76) ) + ROM_CONTINUE( 0x0380, 0x0080 ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_memoquiz_output.pla", 0, 314, CRC(a5799b50) SHA1(9b4923b37c9ba8221ecece5a3370c605a880a453) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Football 2 (model 1050) + * PCB label: MATTEL, 1050-4369D + * MM77LA MCU (label B8000-12, die label B8000) + * 7 7seg leds, 30 other leds, 2-bit sound + + Through its production run, it was released as "Football 2" and "Football II". + +***************************************************************************/ + +class mfootb2_state : public hh_pps41_state +{ +public: + mfootb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void mfootb2(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + void write_spk(u8 data); +}; + +// handlers + +void mfootb2_state::update_display() +{ + m_display->matrix(m_d, (m_r << 1 & 0x700) | (m_d >> 4 & 0x80) | (m_r & 0x7f)); +} + +void mfootb2_state::write_d(u16 data) +{ + // DIO0-DIO2, DIO6-DIO9: digit select + // DIO3-DIO5: led select + // DIO10: 4th digit DP + m_d = data; + update_display(); +} + +void mfootb2_state::write_r(u16 data) +{ + // RO01-RO10: led data + m_r = data; + update_display(); +} + +void mfootb2_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +static INPUT_PORTS_START( mfootb2 ) + PORT_START("IN.0") // PI + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.1") // DIO11 + PORT_CONFNAME( 0x400, 0x000, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x000, "1" ) // PRO 1 + PORT_CONFSETTING( 0x400, "2" ) // PRO 2 +INPUT_PORTS_END + +void mfootb2_state::mfootb2(machine_config &config) +{ + // basic machine hardware + MM77LA(config, m_maincpu, 380000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mfootb2_state::write_d)); + m_maincpu->read_d().set_ioport("IN.1"); + m_maincpu->write_r().set(FUNC(mfootb2_state::write_r)); + m_maincpu->read_p().set_ioport("IN.0"); + m_maincpu->write_spk().set(FUNC(mfootb2_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 11); + m_display->set_segmask(0x3c7, 0x7f); + m_display->set_segmask(0x002, 0xff); // only one digit has DP + m_display->set_bri_levels(0.015, 0.2); // ball led is brighter + config.set_default_layout(layout_mfootb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( mfootb2 ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b8000-12", 0x0000, 0x0600, CRC(5b65fc38) SHA1(4fafc9deb5609b16f09b18b7346ea96ffe8bf9e0) ) + + ROM_REGION( 317, "maincpu:opla", 0 ) + ROM_LOAD( "mm77la_mfootb2_output.pla", 0, 317, CRC(11c0bbfa) SHA1(939a0a6adeace8ca0f9e17290306a2e7ced21db3) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Brain Baffler (model 1080) + * PCB label: OLYMPOS KOREA, CM04-D102-001 REV D + * MM78LA MCU (label MM95 B9000-12, die label B9000) + * 8-digit 14seg LED display, 2-bit sound + + It includes 8 word games, most of them are meant for 2 players. + +***************************************************************************/ + +class brainbaf_state : public hh_pps41_state +{ +public: + brainbaf_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void brainbaf(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); + void write_spk(u8 data); +}; + +// handlers + +void brainbaf_state::update_display() +{ + m_display->matrix(m_inp_mux, bitswap<14>(m_r, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); +} + +void brainbaf_state::write_d(u16 data) +{ + // DIO0-DIO9: input mux + // DIO0-DIO7: digit select + m_inp_mux = data; + update_display(); +} + +void brainbaf_state::write_r(u16 data) +{ + // RO01-RO14: digit segment data + m_r = data; + update_display(); +} + +u8 brainbaf_state::read_p() +{ + // PI5-PI8: multiplexed inputs + return read_inputs(10) << 4; +} + +void brainbaf_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +static INPUT_PORTS_START( brainbaf ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J-0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_NAME("Player / Bonus R") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Player / Bonus L") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Game") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C-3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_NAME("Go") + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D-4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Entry") + + PORT_START("IN.5") // DIO5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E-5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + + PORT_START("IN.6") // DIO6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_NAME("Refresh") + + PORT_START("IN.7") // DIO7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G-7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_NAME("Buy") + + PORT_START("IN.8") // DIO8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H-8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_NAME("Give-Up") + + PORT_START("IN.9") // DIO9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I-9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CODE(KEYCODE_F11) PORT_NAME("Stop") // both STOP keys + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_NAME("Score") +INPUT_PORTS_END + +void brainbaf_state::brainbaf(machine_config &config) +{ + // basic machine hardware + MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K + m_maincpu->write_d().set(FUNC(brainbaf_state::write_d)); + m_maincpu->write_r().set(FUNC(brainbaf_state::write_r)); + m_maincpu->read_p().set(FUNC(brainbaf_state::read_p)); + m_maincpu->write_spk().set(FUNC(brainbaf_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_brainbaf); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( brainbaf ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm95_b9000-12", 0x0000, 0x0800, CRC(f7a4829c) SHA1(12f789d8264a969777764d31ea67067cc330a73c) ) + + ROM_REGION( 605, "maincpu:opla", 0 ) + ROM_LOAD( "mm78la_brainbaf_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Horoscope Computer (model 1081) + * PCB label: DET. CM05-D102-001 REV D + * MM78LA MCU (label MM95 B9001-13, die label B9001) + * 8-digit 14seg LED display, 2-bit sound + + This is not a toy, but a fortune forecast. Date format is mm-dd-yy, it is + valid only from June 1 1979 until December 31 1987 + +***************************************************************************/ + +class horocomp_state : public hh_pps41_state +{ +public: + horocomp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void horocomp(machine_config &config); + +private: + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); + void write_spk(u8 data); +}; + +// handlers + +void horocomp_state::update_display() +{ + // 14seg display is upside-down + u16 flip = m_r << 7 | m_r >> 7; + m_display->matrix(m_inp_mux, bitswap<14>(flip, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); +} + +void horocomp_state::write_d(u16 data) +{ + // DIO0-DIO9: input mux + // DIO0-DIO7: digit select + m_inp_mux = data; + update_display(); +} + +void horocomp_state::write_r(u16 data) +{ + // RO01-RO14: digit segment data + m_r = data; + update_display(); +} + +u8 horocomp_state::read_p() +{ + // PI4: mode switch + // PI5-PI8: multiplexed inputs + return read_inputs(10) << 4 | (m_inputs[10]->read() & 8); +} + +void horocomp_state::write_spk(u8 data) +{ + // SPK: speaker out + m_speaker->level_w(data); +} + +// config + +/* physical button layout and labels are like this: + + CAP. + AQU. [ ] SAG. + [ ] 9 [ ] + PIS. 8 SCO. + [ ] 7[ ] + +ARI.[ ]0 6[ ]LIB. + + [ ]1 5[ ] [ ] [ ] [ ] [ ] + TAU. 2 4 VIR. LOVE CAREER TRAVEL MONEY + [ ] 3 [ ] + GEM. [ ] LEO [ ] [ ] [ ] [ ] + CAN. FRIENDS SPIRIT FAMILY CREATIVE +*/ + +static INPUT_PORTS_START( horocomp ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Love") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Friends") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Aries") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Career") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Spirit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Taurus") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Travel") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Family") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Gemini") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Money") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Creative") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Cancer") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Leo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Aquarius / Reset") + + PORT_START("IN.5") // DIO5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Virgo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Pisces") + + PORT_START("IN.6") // DIO6 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Libra") + + PORT_START("IN.7") // DIO7 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Scorpio") + + PORT_START("IN.8") // DIO8 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Sagittarius") + + PORT_START("IN.9") // DIO9 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Capricorn") + + PORT_START("IN.10") // PI4 + PORT_CONFNAME( 0x08, 0x00, "Mode" ) + PORT_CONFSETTING( 0x08, "C" ) // compatibility + PORT_CONFSETTING( 0x00, "P" ) // personal +INPUT_PORTS_END + +void horocomp_state::horocomp(machine_config &config) +{ + // basic machine hardware + MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K + m_maincpu->write_d().set(FUNC(horocomp_state::write_d)); + m_maincpu->write_r().set(FUNC(horocomp_state::write_r)); + m_maincpu->read_p().set(FUNC(horocomp_state::read_p)); + m_maincpu->write_spk().set(FUNC(horocomp_state::write_spk)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_horocomp); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( horocomp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm95_b9001-13", 0x0000, 0x0800, CRC(d284a837) SHA1(02092db2a29b4bb7e9f86286601b67b2e9556476) ) + + ROM_REGION( 605, "maincpu:opla", 0 ) + ROM_LOAD( "mm78la_horocomp_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel World Championship Football (model 3202) + * MM78 MCU (MM78L pinout) (label MM78 A78C6-12, die label A78C6) + * MM78 MCU (MM78L pinout) (label MM78 A78C7-12, die label A78C7) + * 8-digit 7seg VFD, cyan/red/green VFD Itron CP5023, 1-bit sound + + It was patented under US4422639. Like the Baseball counterpart (mwcbaseb in + hh_hmcs40.cpp), this handheld is a complex game. + +***************************************************************************/ + +class mwcfootb_state : public hh_pps41_state +{ +public: + mwcfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag), + m_subcpu(*this, "subcpu") + { } + + void mwcfootb(machine_config &config); + +private: + required_device m_subcpu; + + void update_display(); + + void main_write_d(u16 data); + u16 main_read_d(); + void main_write_r(u16 data); + u8 main_read_p(); + + void sub_write_d(u16 data); + void sub_write_r(u16 data); +}; + +// handlers + +void mwcfootb_state::update_display() +{ + m_display->matrix(m_grid, bitswap<19>(m_plate, 19,18,17,16, 11,10,9,8,15,14,13,12, 2,3,1,0,6,5,4)); +} + +// maincpu side + +void mwcfootb_state::main_write_d(u16 data) +{ + // DIO0-DIO7: vfd grid + // DIO0-DIO2: input mux + m_grid = m_inp_mux = data; + update_display(); + + // DIO8: subcpu INT0 + m_subcpu->set_input_line(0, (data & 0x100) ? ASSERT_LINE : CLEAR_LINE); +} + +u16 mwcfootb_state::main_read_d() +{ + // DIO9: subcpu DIO9 + return m_subcpu->d_output_r() & 0x200; +} + +void mwcfootb_state::main_write_r(u16 data) +{ + // RIO1-RIO7: vfd plate 0-6 + m_plate = (m_plate & 0xfff00) | (~data & 0x7f); + update_display(); + + // RIO8: speaker out + m_speaker->level_w(BIT(~data, 7)); +} + +u8 mwcfootb_state::main_read_p() +{ + // PI1-PI8: multiplexed inputs + return ~read_inputs(3); +} + +// subcpu side + +void mwcfootb_state::sub_write_d(u16 data) +{ + // DIO0-DIO3: vfd plate 15-18 + m_plate = (m_plate & 0x0ffff) | (data << 16 & 0xf0000); + update_display(); + + // DIO9: maincpu INT0 (+DIO9) + m_maincpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); +} + +void mwcfootb_state::sub_write_r(u16 data) +{ + // RIO1-RIO8: vfd plate 7-14 + m_plate = (m_plate & 0xf00ff) | (~data << 8 & 0xff00); + update_display(); +} + +// config + +/* physical button layout and labels are like this: + + (home team side) (visitor team side) + [1] RECEIVERS [2] [1] RECEIVERS [2] + + [1] [1] + [4] [PAUSE] [2] [4] [PAUSE] [2] + [3] [3] + DOWN QUARTER + [ENTER] YDS. TO GO TIME LEFT POSITION SCORE [ENTER] + [KICK] [TIME] [ ] [ ] [ ] [ ] [TIME] [KICK] + + [^] [^] + [<] [P/C] [>] [<] [P/C] [>] + [v] [v] +*/ + +static INPUT_PORTS_START( mwcfootb ) // P1 = left/home, P2 = right/visitor + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("Position") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 P/C/Pause") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Quarter Time Left") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Down / Yards To Go") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Kick") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 P/C/Pause") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Time") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Enter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Time") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Enter") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 1") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Left/4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Right/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Down/3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Up/1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Left/4") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Right/2") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Down/3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Up/1") +INPUT_PORTS_END + +void mwcfootb_state::mwcfootb(machine_config &config) +{ + // basic machine hardware + MM78(config, m_maincpu, 360000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(mwcfootb_state::main_write_d)); + m_maincpu->read_d().set(FUNC(mwcfootb_state::main_read_d)); + m_maincpu->write_r().set(FUNC(mwcfootb_state::main_write_r)); + m_maincpu->read_p().set(FUNC(mwcfootb_state::main_read_p)); + m_maincpu->read_sdi().set(m_subcpu, FUNC(pps41_base_device::sdo_r)); + m_maincpu->write_ssc().set(m_subcpu, FUNC(pps41_base_device::ssc_w)); + + MM78(config, m_subcpu, 360000); // osc. from maincpu + m_subcpu->write_d().set(FUNC(mwcfootb_state::sub_write_d)); + m_subcpu->write_r().set(FUNC(mwcfootb_state::sub_write_r)); + m_subcpu->read_sdi().set(m_maincpu, FUNC(pps41_base_device::sdo_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 571); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + m_display->set_segmask(0x7f, 0x7f); + config.set_default_layout(layout_mwcfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mwcfootb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mm78_a78c6-12", 0x0000, 0x0800, CRC(91cf0d9b) SHA1(8d778b441eb26fcff50e8532c142f368c0dd5818) ) + + ROM_REGION( 0x0800, "subcpu", 0 ) + ROM_LOAD( "mm78_a78c7-12", 0x0000, 0x0800, CRC(b991d06e) SHA1(1f801b5cd7214f7378ae3f19799b84a9dc5bba4e) ) + + ROM_REGION( 248486, "screen", 0) + ROM_LOAD( "mwcfootb.svg", 0, 248486, CRC(03d17b85) SHA1(c877316c0c7923432235655d810fea8d714a4b31) ) +ROM_END + + + + + +/*************************************************************************** + + Selchow & Righter Scrabble Sensor + * MM76EL MCU (label B8610-11, die label B8610) + * 16 leds, 1-bit sound + + The game concept is similar to Mastermind. Enter a word (or press AUTO.) + to start the game, then try to guess it. + +***************************************************************************/ + +class scrabsen_state : public hh_pps41_state +{ +public: + scrabsen_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void scrabsen(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void scrabsen_state::update_int() +{ + // players switch is tied to MCU INT0 + m_maincpu->set_input_line(0, (m_inputs[5]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void scrabsen_state::update_display() +{ + m_display->matrix(m_inp_mux >> 6 & 3, ~m_r); +} + +void scrabsen_state::write_d(u16 data) +{ + // DIO0-DIO4: input mux + // DIO6,DIO7: led select + m_inp_mux = data; + update_display(); + + // DIO8: speaker out + m_speaker->level_w(BIT(data, 8)); +} + +void scrabsen_state::write_r(u16 data) +{ + // RIO1-RIO8: led data + m_r = data; + update_display(); +} + +u8 scrabsen_state::read_p() +{ + // PI1-PI7: multiplexed inputs + return ~read_inputs(5); +} + +// config + +static INPUT_PORTS_START( scrabsen ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("Space") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME("Auto.") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + + PORT_START("IN.4") // DIO4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + + PORT_START("IN.5") // INT0 + PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, scrabsen_state, players_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) // single + PORT_CONFSETTING( 0x00, "2" ) // double +INPUT_PORTS_END + +void scrabsen_state::scrabsen(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 380000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(scrabsen_state::write_d)); + m_maincpu->write_r().set(FUNC(scrabsen_state::write_r)); + m_maincpu->read_p().set(FUNC(scrabsen_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 8); + config.set_default_layout(layout_scrabsen); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( scrabsen ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "b8610-11", 0x0000, 0x0400, CRC(97c8a466) SHA1(ed5d2cddd2761ed6e3ddc47d97b2ed19a2aaeee9) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) // unused + ROM_LOAD( "mm76_scrabsen_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) +ROM_END + + + + + +/*************************************************************************** + + Selchow & Righter Reader's Digest Q&A + * MM76EL MCU (label MM76EL B8654-11, die label B8654) + * 9-digit 7seg LED display(4 unused), 2-bit sound + + The game requires question books. The player inputs a 3-digit code and + answers 20 multiple-choice questions from the page. + +***************************************************************************/ + +class rdqa_state : public hh_pps41_state +{ +public: + rdqa_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_pps41_state(mconfig, type, tag) + { } + + void rdqa(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } + +private: + virtual void update_int() override; + void update_display(); + void write_d(u16 data); + void write_r(u16 data); + u8 read_p(); +}; + +// handlers + +void rdqa_state::update_int() +{ + // players switch is tied to MCU INT0 + m_maincpu->set_input_line(0, (m_inputs[4]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); +} + +void rdqa_state::update_display() +{ + m_display->matrix(m_inp_mux, ~m_r); +} + +void rdqa_state::write_d(u16 data) +{ + // DIO0-DIO4: digit select + // DIO0-DIO3: input mux + m_inp_mux = data; + update_display(); + + // DIO8,DIO9: speaker out + m_speaker->level_w(data >> 8 & 3); +} + +void rdqa_state::write_r(u16 data) +{ + // RIO1-RIO7: digit segment data + m_r = data; + update_display(); +} + +u8 rdqa_state::read_p() +{ + // PI1-PI5: multiplexed inputs + return ~read_inputs(4); +} + +// config + +static INPUT_PORTS_START( rdqa ) + PORT_START("IN.0") // DIO0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") + + PORT_START("IN.1") // DIO1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") + + PORT_START("IN.2") // DIO2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") + + PORT_START("IN.3") // DIO3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.4") // INT0 + PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rdqa_state, players_switch, 0) + PORT_CONFSETTING( 0x01, "1" ) // single + PORT_CONFSETTING( 0x00, "2" ) // double +INPUT_PORTS_END + +void rdqa_state::rdqa(machine_config &config) +{ + // basic machine hardware + MM76EL(config, m_maincpu, 400000); // approximation - VC osc. R=56K + m_maincpu->write_d().set(FUNC(rdqa_state::write_d)); + m_maincpu->write_r().set(FUNC(rdqa_state::write_r)); + m_maincpu->read_p().set(FUNC(rdqa_state::read_p)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(5, 7); + m_display->set_segmask(0x1f, 0x7f); + config.set_default_layout(layout_rdqa); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + +// roms + +ROM_START( rdqa ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mm76el_b8654-11", 0x0000, 0x0400, CRC(95c00eee) SHA1(1537626df03a7131d83a555e557a4528e093a22a) ) + + ROM_REGION( 314, "maincpu:opla", 0 ) + ROM_LOAD( "mm76_rdqa_output.pla", 0, 314, CRC(e024b2d3) SHA1(fc3121e70f22151cf8f3411f9fcbac88002ae330) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1979, smastmind, 0, 0, smastmind, mastmind, mastmind_state, empty_init, "Invicta", "Super-Sonic Electronic Master Mind", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, dunksunk, 0, 0, dunksunk, dunksunk, dunksunk_state, empty_init, "Kmart", "Dunk 'n Sunk", MACHINE_SUPPORTS_SAVE ) + +CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, mfootb2, 0, 0, mfootb2, mfootb2, mfootb2_state, empty_init, "Mattel Electronics", "Football 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, brainbaf, 0, 0, brainbaf, brainbaf, brainbaf_state, empty_init, "Mattel Electronics", "Brain Baffler", MACHINE_SUPPORTS_SAVE ) +COMP( 1979, horocomp, 0, 0, horocomp, horocomp, horocomp_state, empty_init, "Mattel Electronics", "Horoscope Computer", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel Electronics", "World Championship Football", MACHINE_SUPPORTS_SAVE ) + +CONS( 1978, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, rdqa, 0, 0, rdqa, rdqa, rdqa_state, empty_init, "Selchow & Righter", "Reader's Digest Q&A - Computer Question & Answer Game", MACHINE_SUPPORTS_SAVE ) // *** + +// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_rw5000.cpp b/src/mame/handheld/hh_rw5000.cpp new file mode 100644 index 00000000000..0424ccad720 --- /dev/null +++ b/src/mame/handheld/hh_rw5000.cpp @@ -0,0 +1,1109 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + +Rockwell A/B5000 MCU series handhelds (before PPS-4/1) +Mostly calculators on these MCUs, but also Mattel's first couple of handhelds. + +ROM source notes when dumped from another model, but confident it's the same: +- rw18r: Rockwell 8R +- rw24k: Rockwell 14RD-II +- misatk: Mattel Space Alert + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/rw5000/a5000.h" +#include "cpu/rw5000/a5500.h" +#include "cpu/rw5000/a5900.h" +#include "cpu/rw5000/b5000.h" +#include "cpu/rw5000/b5500.h" +#include "cpu/rw5000/b6000.h" +#include "cpu/rw5000/b6100.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + +#include "speaker.h" + +// internal artwork +#include "autorace.lh" +#include "gravity.lh" +#include "mbaseb.lh" +#include "mfootb.lh" +#include "misatk.lh" +#include "rw10r.lh" +#include "rw24k.lh" +#include "rw30r.lh" + +//#include "hh_rw5000_test.lh" // common test-layout - use external artwork + + +class hh_rw5000_state : public driver_device +{ +public: + hh_rw5000_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(power_button); + template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } + template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<9> m_inputs; // max 9 + + u16 m_inp_mux = 0; + + // MCU output pin state + u16 m_str = 0; + u16 m_seg = 0; + + u8 read_inputs(int columns); + void switch_change(int sel, u32 mask, bool next); +}; + + +// machine start/reset + +void hh_rw5000_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_str)); + save_item(NAME(m_seg)); +} + +void hh_rw5000_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_rw5000_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +void hh_rw5000_state::switch_change(int sel, u32 mask, bool next) +{ + // config switches (for direct control) + ioport_field *inp = m_inputs[sel]->field(mask); + + if (next && inp->has_next_setting()) + inp->select_next_setting(); + else if (!next && inp->has_previous_setting()) + inp->select_previous_setting(); +} + +INPUT_CHANGED_MEMBER(hh_rw5000_state::power_button) +{ + // power button or switch + bool power = (param) ? (bool(param - 1)) : !newval; + + if (!power && m_display != nullptr) + m_display->clear(); + m_maincpu->set_input_line(INPUT_LINE_RESET, power ? CLEAR_LINE : ASSERT_LINE); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Mattel Auto Race (model 9879) + * B6000 MCU (label B6000CA, die label B6000-B) + * 2-digit 7seg display, 21 other leds, 1-bit sound + + This is Mattel's first electronic handheld game, also the first CPU-based + handheld game overall. Hardware design (even the MCU) and programming + was done at Rockwell. + + A European version was released as "Ski Slalom", except it's upside-down. + +***************************************************************************/ + +class autorace_state : public hh_rw5000_state +{ +public: + autorace_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void autorace(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void autorace_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void autorace_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( autorace ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " + PORT_CONFNAME( 0x0c, 0x0c, "Gear" ) + PORT_CONFSETTING( 0x0c, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x00, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("POWER") // power switch + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Start / Reset") + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_prev<0>, 0x0c) PORT_NAME("Gear Switch Down") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_next<0>, 0x0c) PORT_NAME("Gear Switch Up") +INPUT_PORTS_END + +void autorace_state::autorace(machine_config &config) +{ + // basic machine hardware + B6000(config, m_maincpu, 160000); // approximation + m_maincpu->write_str().set(FUNC(autorace_state::write_str)); + m_maincpu->write_seg().set(FUNC(autorace_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.02, 0.2); // player led is brighter + config.set_default_layout(layout_autorace); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( autorace ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "b6000ca", 0x000, 0x200, CRC(a112c928) SHA1(aa5d0b46a08e2460081d4148cf254dc5ec53817e) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Missile Attack (model 2048) / Space Alert (model 2448) + * B6000 MCU (label B6001CA/EA, die label B6001) + * 2-digit 7seg display, 21 other leds, 1-bit sound + + The initial release was called Missile Attack, it didn't sell well (Mattel + blamed it on NBC for refusing to air their commercial). They changed the + title/setting and rereleased it as "Space Alert" (aka "Battlestar Galactica: + Space Alert"). In 1980, they advertised another rerelease, this time as + "Flash Gordon", but that didn't come out. + +***************************************************************************/ + +class misatk_state : public hh_rw5000_state +{ +public: + misatk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void misatk(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void misatk_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void misatk_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( misatk ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + + PORT_START("POWER") // power switch + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Arm / Off") +INPUT_PORTS_END + +void misatk_state::misatk(machine_config &config) +{ + // basic machine hardware + B6000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(misatk_state::write_str)); + m_maincpu->write_seg().set(FUNC(misatk_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.015, 0.15); // player led is brighter + config.set_default_layout(layout_misatk); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( misatk ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "b6001ea", 0x000, 0x200, CRC(56564b79) SHA1(6f33f57ea312cb2018fb59f72eaff3a9642e74a2) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Football (model 2024) + * B6100 MCU (label B6100EB/-15, die label B6100 A) + * 7-digit 7seg display, 27 other leds, 1-bit sound + + When Football II came out, they renamed this one to Football I. + +***************************************************************************/ + +class mfootb_state : public hh_rw5000_state +{ +public: + mfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void mfootb(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(score_button) { update_display(); } + +private: + void update_display(); + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void mfootb_state::update_display() +{ + // 4th digit DP is from the SCORE button + u8 dp = (m_inputs[1]->read() & 2) ? 0x80 : 0; + m_display->matrix(m_str, (m_seg << 1 & 0x700) | dp | (m_seg & 0x7f)); +} + +void mfootb_state::write_str(u16 data) +{ + m_str = data; + update_display(); +} + +void mfootb_state::write_seg(u16 data) +{ + m_seg = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( mfootb ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // PRO 1 + PORT_CONFSETTING( 0x00, "2" ) // PRO 2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") PORT_CHANGED_MEMBER(DEVICE_SELF, mfootb_state, score_button, 0) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void mfootb_state::mfootb(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 280000); // approximation + m_maincpu->write_str().set(FUNC(mfootb_state::write_str)); + m_maincpu->write_seg().set(FUNC(mfootb_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x7f, 0x7f); + m_display->set_segmask(0x08, 0xff); // only one digit has DP + m_display->set_bri_levels(0.02, 0.2); // player led is brighter + config.set_default_layout(layout_mfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mfootb ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6100eb", 0x000, 0x300, CRC(5b27620f) SHA1(667ff6cabced89ef4ad848b73d66a06526edc5e6) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Baseball (model 2942) + * B6100 MCU (label B6101-12, die label B6101 A) + * 4-digit 7seg display, 28 other leds, 1-bit sound + +***************************************************************************/ + +class mbaseb_state : public hh_rw5000_state +{ +public: + mbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void mbaseb(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void mbaseb_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void mbaseb_state::write_seg(u16 data) +{ + m_display->write_mx(bitswap<10>(data,7,8,9,6,5,4,3,2,1,0)); +} + +// config + +static INPUT_PORTS_START( mbaseb ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pitch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // PRO 1 + PORT_CONFSETTING( 0x00, "2" ) // PRO 2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Run") + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void mbaseb_state::mbaseb(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 280000); // approximation + m_maincpu->write_str().set(FUNC(mbaseb_state::write_str)); + m_maincpu->write_seg().set(FUNC(mbaseb_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 10); + m_display->set_segmask(0x170, 0x7f); + m_display->set_segmask(0x110, 0xff); // 2 digits have DP + config.set_default_layout(layout_mbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mbaseb ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6101-12", 0x000, 0x300, CRC(7720ddcc) SHA1(cd43126db7c6262f659f325aa58420e1a8a1a659) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Gravity (model 8291) + * B6100 MCU (label B6102-11, die label B6102 A) + * 3-digit 7seg display, 27 other leds, 1-bit sound + + It was advertised as "Catastrophe", but went unreleased. It got sold later + as "Gravity", with a less catastrophic setting. + + The game is basically 3 mini games in 1: + - Juggling (Rumbling Rocks in Catastrophe) + - Coin Drop (Quake Shock in Catastrophe) + - Docking (Meteorite Shower in Catstrophe) + +***************************************************************************/ + +class gravity_state : public hh_rw5000_state +{ +public: + gravity_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void gravity(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); +}; + +// handlers + +void gravity_state::write_str(u16 data) +{ + m_display->write_my(data); +} + +void gravity_state::write_seg(u16 data) +{ + m_display->write_mx(data); +} + +// config + +static INPUT_PORTS_START( gravity ) + PORT_START("IN.0") // KB + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // DIN + PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) +INPUT_PORTS_END + +void gravity_state::gravity(machine_config &config) +{ + // basic machine hardware + B6100(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(gravity_state::write_str)); + m_maincpu->write_seg().set(FUNC(gravity_state::write_seg)); + m_maincpu->read_kb().set_ioport("IN.0"); + m_maincpu->read_din().set_ioport("IN.1"); + m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 10); + m_display->set_segmask(0x1c0, 0x7f); + config.set_default_layout(layout_gravity); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gravity ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b6102-11", 0x000, 0x300, CRC(532f332e) SHA1(593224d3a2a5b6022f0d73b6e6fb9093d2d54f68) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 10R + * A5000 MCU (label A5000PA, die label A5000) + * 8-digit 7seg LED display + + Rockwell 12R "Square Root" + * A5000 MCU (label A5001, die label A5001) + * rest is same as 10R + + 12R supports square root by pressing × after ÷ (or the other way around). + +***************************************************************************/ + +class rw10r_state : public hh_rw5000_state +{ +public: + rw10r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw10r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw10r_state::write_str(u16 data) +{ + // STR0-STR7: digit select + // STR4-STR7: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw10r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw10r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( rw10r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") +INPUT_PORTS_END + +void rw10r_state::rw10r(machine_config &config) +{ + // basic machine hardware + A5000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw10r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw10r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw10r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_rw10r); +} + +// roms + +ROM_START( rw10r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5000pa", 0x000, 0x0c0, CRC(db6cbbea) SHA1(3757f303a84e412e8763c4ec2170c9badc172454) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + +ROM_START( rw12r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5001", 0x000, 0x0c0, CRC(4337a46b) SHA1(70f4683eac0afa31a6cd9dd44fdf1b6680575f67) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 8R "Automatic Percent", Rockwell 18R "Memory" + * B5000 MCU (label B5000CC, die label B5000) + * 8-digit 7seg LED display + + This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by + Tandy (Radio Shack) as EC-220. + + 8R/9TR doesn't have the memory store/recall buttons. + +***************************************************************************/ + +class rw18r_state : public hh_rw5000_state +{ +public: + rw18r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw18r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw18r_state::write_str(u16 data) +{ + // STR0-STR7: digit select + // STR4-STR8: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw18r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw18r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( rw18r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.4") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("STO") // unpopulated on 8R + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("RCL") // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void rw18r_state::rw18r(machine_config &config) +{ + // basic machine hardware + B5000(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw18r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw18r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw18r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_rw10r); +} + +// roms + +ROM_START( rw18r ) + ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b5000cc", 0x000, 0x0c0, CRC(ace32614) SHA1(23cf11acf2e73ce2dfc165cb87f86fab15f69ff7) ) + ROM_CONTINUE( 0x100, 0x100 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 30R "Slide Rule Memory" + * B5500 MCU (label B5500PA, die label B5500) + * 9-digit 7seg LED display + + Rockwell 31R "Slide Rule Memory" + * A5500 MCU (label A5502PA, die label A5500) + * rest is same as 30R + + 30R and 31R have the exact same functionality, even though they are on + different MCUs. There's also a 30R version on an A4600 MCU. + +***************************************************************************/ + +class rw30r_state : public hh_rw5000_state +{ +public: + rw30r_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw30r(machine_config &config); + void rw31r(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw30r_state::write_str(u16 data) +{ + // STR0-STR8: digit select + // STR4-STR8: input mux + m_display->write_my(data); + m_inp_mux = data >> 4; +} + +void rw30r_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw30r_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( rw30r ) + PORT_START("IN.0") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(". / +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F / CF") // function + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / M+") + + PORT_START("IN.1") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / M-") + + PORT_START("IN.2") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / x" UTF8_POW_2) + + PORT_START("IN.3") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / 1/x") + + PORT_START("IN.4") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("C / MC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("X\xe2\x86\x94Y / X\xe2\x86\x94M") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% / " UTF8_SQUAREROOT "x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / MR") +INPUT_PORTS_END + +void rw30r_state::rw30r(machine_config &config) +{ + // basic machine hardware + B5500(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_rw30r); +} + +void rw30r_state::rw31r(machine_config &config) +{ + rw30r(config); + + // basic machine hardware + A5500(config.replace(), m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); +} + +// roms + +ROM_START( rw30r ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "b5500pa", 0x000, 0x280, CRC(937dd695) SHA1(bc286209943f49e9acccbf319b87c6ec24386894) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + +ROM_START( rw31r ) + ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "a5502pa", 0x000, 0x280, CRC(6ee0b30a) SHA1(42e5d1e29bdef4b4faaafee3592cacc0e66b982f) ) + ROM_CONTINUE( 0x380, 0x080 ) +ROM_END + + + + + +/*************************************************************************** + + Rockwell 24K aka "the 24K" (see below for more) + * A5900 MCU (label A5901CA/A5903CB, die label A59__) + * 9-digit 7seg VFD + + This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and + probably also in 14RD, 24RD, 22K. + + 14RD has 6 less buttons than 24RD, the non-II versions have LED(s) instead + of a 9th digit for minus sign and memory status. 24K has an extra button + for register exchange. The difference between 24K and 24K II is unknown. + +***************************************************************************/ + +class rw24k_state : public hh_rw5000_state +{ +public: + rw24k_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_rw5000_state(mconfig, type, tag) + { } + + void rw24k(machine_config &config); + +private: + void write_str(u16 data); + void write_seg(u16 data); + u8 read_kb(); +}; + +// handlers + +void rw24k_state::write_str(u16 data) +{ + // STR0-STR8: digit select, input mux + m_display->write_my(data); + m_inp_mux = data; +} + +void rw24k_state::write_seg(u16 data) +{ + // SEG0-SEG7: digit segment data + m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); +} + +u8 rw24k_state::read_kb() +{ + // KB: multiplexed inputs + return read_inputs(9); +} + +// config + +static INPUT_PORTS_START( rw24k ) + PORT_START("IN.0") // STR0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // unpopulated on 14RD + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("M+") // " + + PORT_START("IN.1") // STR1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M-") // " + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // STR2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // STR3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("MC") // " + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("MR") // " + + PORT_START("IN.4") // STR4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.5") // STR5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.6") // STR6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + + PORT_START("IN.7") // STR7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + + PORT_START("IN.8") // STR8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("\xe2\x86\x94") // register exchange - unpopulated on 14RD/24RD + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void rw24k_state::rw24k(machine_config &config) +{ + // basic machine hardware + A5900(config, m_maincpu, 250000); // approximation + m_maincpu->write_str().set(FUNC(rw24k_state::write_str)); + m_maincpu->write_seg().set(FUNC(rw24k_state::write_seg)); + m_maincpu->read_kb().set(FUNC(rw24k_state::read_kb)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_rw24k); +} + +// roms + +ROM_START( rw24k ) + ROM_REGION( 0x200, "maincpu", 0 ) + ROM_LOAD( "a5901ca", 0x000, 0x200, CRC(00de7764) SHA1(0f24add4b6d2660aad63ddd4d0003d59a0e39df6) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1976, autorace, 0, 0, autorace, autorace, autorace_state, empty_init, "Mattel Electronics", "Auto Race", MACHINE_SUPPORTS_SAVE ) +CONS( 1977, misatk, 0, 0, misatk, misatk, misatk_state, empty_init, "Mattel Electronics", "Missile Attack / Space Alert", MACHINE_SUPPORTS_SAVE ) +CONS( 1977, mfootb, 0, 0, mfootb, mfootb, mfootb_state, empty_init, "Mattel Electronics", "Football (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1978, mbaseb, 0, 0, mbaseb, mbaseb, mbaseb_state, empty_init, "Mattel Electronics", "Baseball (Mattel)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gravity, 0, 0, gravity, gravity, gravity_state, empty_init, "Mattel Electronics", "Gravity (Mattel)", MACHINE_SUPPORTS_SAVE ) + +COMP( 1974, rw10r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "10R (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw12r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "12R: Square Root", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw18r, 0, 0, rw18r, rw18r, rw18r_state, empty_init, "Rockwell", "18R: Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1974, rw30r, 0, 0, rw30r, rw30r, rw30r_state, empty_init, "Rockwell", "30R: Slide Rule Memory (B5500 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, rw31r, rw30r, 0, rw31r, rw30r, rw30r_state, empty_init, "Rockwell", "31R: Slide Rule Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, rw24k, 0, 0, rw24k, rw24k, rw24k_state, empty_init, "Rockwell", "24K (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/handheld/hh_sm510.cpp b/src/mame/handheld/hh_sm510.cpp new file mode 100644 index 00000000000..298bbdec48d --- /dev/null +++ b/src/mame/handheld/hh_sm510.cpp @@ -0,0 +1,10093 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Henrik Algestam +// thanks-to:Sean Riddle, Igor, Lee Robson, Milan Galcik +/*************************************************************************** + +Sharp SM5xx family handhelds. +List of child drivers: +- rzone: Tiger R-Zone + +The LCD screen graphics are provided internally with an SVG file. +MAME external artwork is recommended for the backgrounds inlays. + +Most of these LCD games are meant to stay powered on 24/7. There is no +RTC or NVRAM. Quitting MAME is akin to removing the handheld's battery. +Use -autosave to at least make them remember the highscores. + +TODO: +- improve display decay simulation? but SVG doesn't support setting brightness + per segment, adding pwm_display_device right now has no added value +- add nstarfox sound effect chip emulation +- add svg screen for nsmb3, nsmw +- confirm gnw_bfight rom (assumed to be the same as gnw_bfightn) +- confirm gnw_climber rom (assumed to be the same as gnw_climbern) +- confirm gnw_smb rom (assumed to be the same as gnw_smbn) +- Currently there is no accurate way to dump the SM511/SM512 melody ROM + electronically. For the ones that weren't decapped, they were read by + playing back all melody data and reconstructing it to ROM. Visual(decap) + verification is wanted for: bassmate, gnw_bfightn, gnw_bjack, gnw_bsweep, + gnw_climbern, gnw_dkcirc, gnw_dkhockey, gnw_dkjrp, gnw_dkong3, gnw_gcliff, + gnw_mariocmt, gnw_mariocmta, gnw_mariotj, gnw_mbaway, gnw_mmousep, + gnw_pinball, gnw_popeyep, gnw_sbuster, gnw_snoopyp, gnw_zelda + +**************************************************************************** + +Misc Nintendo Game & Watch notes: + +Trivia: Most of the Nintendo G&W have built-in cheats, likely kept in by +Nintendo to test the game. These were not accessible to users of course, +but for the sake of fun they're available on MAME. + +BTANB: On some of the earlier G&W games, eg. gnw_fire, gnw_mmouse, gnw_pchute, +gnw_popeye, the controls still work after game over, this happens on the real +thing too. + +Game list (* denotes not emulated yet) + +Serial Series MCU Title +--------------------------------------------- +AC-01 s SM5A Ball (aka Toss-Up) +FL-02 s SM5A Flagman (aka Flag Man) +MT-03 s SM5A Vermin (aka The Exterminator) +RC-04 s SM5A Fire (aka Fireman Fireman) +IP-05 s SM5A Judge +MH-06 g SM5A Manhole +CN-07 g SM5A Helmet (aka Headache) +LN-08 g SM5A Lion +PR-21 ws SM5A Parachute +OC-22 ws SM5A Octopus +PP-23 ws SM5A Popeye +FP-24 ws SM5A Chef +MC-25 ws SM5A Mickey Mouse +EG-26 ws SM5A Egg (same ROM as MC-25, but LCD differs) +FR-27 ws SM5A Fire +TL-28 ws SM510 Turtle Bridge +ID-29 ws SM510 Fire Attack +SP-30 ws SM510 Snoopy Tennis +OP-51 ms SM510 Oil Panic +DK-52 ms SM510 Donkey Kong +DM-53 ms SM510 Mickey & Donald +GH-54 ms SM510 Green House +JR-55 ms SM510 Donkey Kong II +MW-56 ms SM510 Mario Bros. +LP-57 ms SM510 Rain Shower +TC-58 ms SM510 Life Boat +PB-59 ms SM511 Pinball +BJ-60 ms SM512 Black Jack +MG-61 ms SM510 Squish +BD-62 ms SM512 Bomb Sweeper +JB-63 ms SM511 Safe Buster +MV-64 ms SM512 Gold Cliff +ZL-65 ms SM512 Zelda +CJ-71* tt SM511? Donkey Kong Jr. +CM-72 tt SM511 Mario's Cement Factory +SM-73* tt SM511? Snoopy +PG-74* tt SM511? Popeye +SM-91 p SM511 Snoopy (assume same ROM & LCD as tabletop version) +PG-92 p SM511 Popeye " +CJ-93 p SM511 Donkey Kong Jr. " +TB-94 p SM511 Mario's Bombs Away +DC-95 p SM511 Mickey Mouse +MK-96 p SM511 Donkey Kong Circus (same ROM as DC-95, LCD is different) +DJ-101 nws SM510 Donkey Kong Jr. +ML-102 nws SM510 Mario's Cement Factory +NH-103 nws SM510 Manhole +TF-104 nws SM510 Tropical Fish +YM-105 nws SM511 Super Mario Bros. +DR-106 nws SM511 Climber +BF-107 nws SM511 Balloon Fight +MB-108 nws SM511 Mario The Juggler +BU-201 sc SM510 Spitball Sparky +UD-202 sc SM510 Crab Grab +BX-301 mvs SM511 Boxing (aka Punch Out) +AK-302 mvs SM511 Donkey Kong 3 +HK-303 mvs SM511 Donkey Kong Hockey +YM-801 cs SM511 Super Mario Bros. (assume same ROM as nws version) +DR-802 cs SM511 Climber " +BF-803 cs SM511 Balloon Fight " +YM-901-S* x SM511 Super Mario Bros. " + +RGW-001 (2010 Ball remake) is on different hardware, ATmega169PV MCU. +The "Mini Classics" keychains are by Stadlbauer, not Nintendo. +The "Game Watch" wristwatches are by Nelsonic, not Nintendo. + +Bassmate Computer (BM-501) is on identical hardware as G&W Multi Screen, +but it's not part of the game series. + +**************************************************************************** + +Regarding Электроника (Elektronika, translated: Electronics): It is not +actually a company. It was a USSR brand name for consumer electronics, +produced by factories belonging to the Ministry of Electronic Industry +(Minelektronprom, МЭП). + +The LCD games were produced by: Angstrem, Mikron, Voschod (Russia), Billur +(Azerbaijan), Kamerton, Evistor (Belarus), Severodonetsk Instrument-Making +Plant (Ukraine), PO Proton and more. Their most popular LCD game (Nu, pogodi!), +is known to be initially produced by Evistor. + +Most of the games are marked "bootleg" in MAME, because the ROM contents are +a 1:1 copy of Nintendo Game & Watch games. Known G&W cloned by Elektronika: +Fire(FR-27), Octopus, Chef, Egg/Mickey Mouse, Donkey Kong Jr.(CJ-93), +Spitball Sparky. + +The MCUs used were not imported from Sharp, but cloned by USSR, renamed to +КБ1013ВК1-2 for SM5A and КБ1013ВК4-2 for SM510. + +***************************************************************************/ + +#include "emu.h" +#include "hh_sm510.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "gnw_dualv.lh" +#include "gnw_dualh.lh" + +//#include "hh_sm510_test.lh" // common test-layout - use external artwork +#include "hh_sm500_test.lh" // " + + +// machine start/reset + +void hh_sm510_state::machine_start() +{ + // resolve handlers + m_out_x.resolve(); + + // determine number of input lines (set it in the subclass constructor if different) + if (m_inp_lines == 0 && m_inp_fixed < 0) + { + for (; m_inputs[m_inp_lines] != nullptr; m_inp_lines++) { ; } + + // when last input line is fixed(GND) + if (m_inp_fixed == -2) + { + m_inp_lines--; + m_inp_fixed = m_inp_lines; + } + } + + // 1kHz display decay ticks + m_display_decay_timer = timer_alloc(FUNC(hh_sm510_state::display_decay_tick), this); + m_display_decay_timer->adjust(attotime::from_hz(1024), 0, attotime::from_hz(1024)); + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_inp_lines)); + save_item(NAME(m_inp_fixed)); + save_item(NAME(m_speaker_data)); + save_item(NAME(m_s)); + save_item(NAME(m_r)); + + save_item(NAME(m_display_x_len)); + save_item(NAME(m_display_y_len)); + save_item(NAME(m_display_z_len)); + save_item(NAME(m_display_state)); + save_item(NAME(m_display_decay)); + save_item(NAME(m_decay_pivot)); + save_item(NAME(m_decay_len)); +} + +void hh_sm510_state::machine_reset() +{ +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// lcd panel - on lcd handhelds, usually not a generic x/y screen device +// deflicker here, especially needed for SM500/SM5A with the active shift register + +TIMER_CALLBACK_MEMBER(hh_sm510_state::display_decay_tick) +{ + u8 z_mask = (1 << m_display_z_len) - 1; + u8 zx_len = 1 << (m_display_x_len + m_display_z_len); + + for (int zx = 0; zx < zx_len; zx++) + { + for (int y = 0; y < m_display_y_len; y++) + { + // delay lcd segment on/off state + if (m_display_state[zx] >> y & 1) + { + if (m_display_decay[y][zx] < (m_decay_pivot + m_decay_len)) + m_display_decay[y][zx]++; + } + else if (m_display_decay[y][zx] > 0) + m_display_decay[y][zx]--; + u8 active_state = (m_display_decay[y][zx] < m_decay_pivot) ? 0 : 1; + + // SM510 series: output to x.y.z, where: + // x = group a/b/bs/c (0/1/2/3) + // y = segment 1-16 (0-15) + // z = common H1-H4 (0-3) + + // SM500/SM530 series: output to x.y.z, where: + // x = O group (0-*) + // y = O segment 1-4 (0-3) + // z = common H1/H2 (0/1) + m_out_x[zx >> m_display_z_len][y][zx & z_mask] = active_state; + } + } +} + +void hh_sm510_state::set_display_size(u8 x, u8 y, u8 z) +{ + // x = groups(in bits) + // y = number of segments per group + // z = commons(in bits) + m_display_x_len = x; + m_display_y_len = y; + m_display_z_len = z; +} + +void hh_sm510_state::sm510_lcd_segment_w(offs_t offset, u16 data) +{ + set_display_size(2, 16, 2); + m_display_state[offset] = data; +} + +void hh_sm510_state::sm500_lcd_segment_w(offs_t offset, u16 data) +{ + set_display_size(4, 4, 1); + m_display_state[offset] = data; +} + + +// generic input handlers - usually S output is input mux, and K input for buttons + +u8 hh_sm510_state::read_inputs(int columns, int fixed) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + if (fixed >= 0) + ret |= m_inputs[fixed]->read(); + + return ret; +} + +void hh_sm510_state::update_k_line() +{ + // this is necessary because the MCU can wake up on K input activity + m_maincpu->set_input_line(0, input_r() ? ASSERT_LINE : CLEAR_LINE); +} + +INPUT_CHANGED_MEMBER(hh_sm510_state::input_changed) +{ + update_k_line(); +} + +void hh_sm510_state::input_w(u8 data) +{ + m_inp_mux = data; + update_k_line(); +} + +u8 hh_sm510_state::input_r() +{ + return read_inputs(m_inp_lines, m_inp_fixed); +} + +INPUT_CHANGED_MEMBER(hh_sm510_state::acl_button) +{ + // ACL button is directly tied to MCU ACL pin + m_maincpu->set_input_line(SM510_INPUT_LINE_ACL, newval ? ASSERT_LINE : CLEAR_LINE); +} + + +// other generic output handlers + +void hh_sm510_state::piezo_r1_w(u8 data) +{ + // R1 to piezo (SM511 R pin is melody output) + m_speaker->level_w(data & 1); +} + +void hh_sm510_state::piezo_r2_w(u8 data) +{ + // R2 to piezo + m_speaker->level_w(data >> 1 & 1); +} + +void hh_sm510_state::piezo_input_w(u8 data) +{ + // R1 to piezo, other to input mux + piezo_r1_w(data & 1); + input_w(data >> 1); +} + +void hh_sm510_state::piezo2bit_r1_w(u8 data) +{ + // R1(+S1) to piezo + m_speaker_data = (m_speaker_data & ~1) | (data & 1); + m_speaker->level_w(m_speaker_data); +} + +void hh_sm510_state::piezo2bit_input_w(u8 data) +{ + // S1(+R1) to piezo, other to input mux + m_speaker_data = (m_speaker_data & ~2) | (data << 1 & 2); + m_speaker->level_w(m_speaker_data); + input_w(data >> 1); +} + + + +/*************************************************************************** + + Common Machine Configurations + +***************************************************************************/ + +// building blocks + +void hh_sm510_state::mcfg_cpu_common(machine_config &config) +{ + m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r)); + m_maincpu->read_ba().set([this] () { return m_io_ba.read_safe(1); }); + m_maincpu->read_b().set([this] () { return m_io_b.read_safe(1); }); +} + +void hh_sm510_state::mcfg_cpu_sm5a(machine_config &config) +{ + SM5A(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); +} + +void hh_sm510_state::mcfg_cpu_kb1013vk12(machine_config &config) +{ + KB1013VK12(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); +} + +void hh_sm510_state::mcfg_cpu_sm510(machine_config &config) +{ + SM510(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->set_r_mask_option(2); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm511(machine_config &config) +{ + SM511(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm512(machine_config &config) +{ + SM512(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_cpu_sm530(machine_config &config) +{ + SM530(config, m_maincpu); + mcfg_cpu_common(config); + m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); + m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); +} + +void hh_sm510_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) +{ + screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(width, height); + screen.set_visarea_full(); +} + +void hh_sm510_state::mcfg_sound_r1(machine_config &config) +{ + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w)); +} + + +// common presets + +void hh_sm510_state::sm5a_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm5a(config); + mcfg_sound_r1(config); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::kb1013vk12_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_kb1013vk12(config); + mcfg_sound_r1(config); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm510_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm510(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm511_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm511(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + +void hh_sm510_state::sm530_common(machine_config &config, u16 width, u16 height) +{ + mcfg_cpu_sm530(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, width, height); +} + + +// deviations + +// multi-screen + +void hh_sm510_state::sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight) +{ + mcfg_cpu_sm510(config); + mcfg_sound_r1(config); + mcfg_svg_screen(config, leftwidth, leftheight, "screen_left"); + mcfg_svg_screen(config, rightwidth, rightheight, "screen_right"); + + config.set_default_layout(layout_gnw_dualh); +} + +void hh_sm510_state::dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_sound_r1(config); + mcfg_svg_screen(config, topwidth, topheight, "screen_top"); + mcfg_svg_screen(config, botwidth, botheight, "screen_bottom"); + + config.set_default_layout(layout_gnw_dualv); +} + +void hh_sm510_state::sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm510(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + +void hh_sm510_state::sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm511(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + +void hh_sm510_state::sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) +{ + mcfg_cpu_sm512(config); + dualv_common(config, topwidth, topheight, botwidth, botheight); +} + + +// Tiger (SM510 R mask is direct, BA/B pins always connected) + +void hh_sm510_state::sm510_tiger(machine_config &config, u16 width, u16 height) +{ + sm510_common(config, width, height); + + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->read_ba().set_ioport("BA"); + m_maincpu->read_b().set_ioport("B"); +} + +void hh_sm510_state::sm511_tiger1bit(machine_config &config, u16 width, u16 height) +{ + sm511_common(config, width, height); + + m_maincpu->read_ba().set_ioport("BA"); + m_maincpu->read_b().set_ioport("B"); +} + +void hh_sm510_state::sm511_tiger2bit(machine_config &config, u16 width, u16 height) +{ + sm511_tiger1bit(config, width, height); + + m_maincpu->write_s().set(FUNC(hh_sm510_state::piezo2bit_input_w)); + m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo2bit_r1_w)); + + // R via 120K resistor, S1 via 39K resistor (eg. tsonic, tsonic2, tbatmana) + static const double speaker_levels[] = { 0.0, 1.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(4, speaker_levels); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Nintendo Game & Watch: Ball (model AC-01) + * PCB label AC-01 + * Sharp SM5A label AC-01 5009 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as Toss-Up by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_ball_state : public hh_sm510_state +{ +public: + gnw_ball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_ball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ball ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_ball_state::gnw_ball(machine_config &config) +{ + sm5a_common(config, 1671, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ball ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ac-01", 0x0000, 0x0740, CRC(ac94e6e4) SHA1(8270cb61f9fbff252eafec411b4c67f0171f8687) ) + + ROM_REGION( 71748, "screen", 0) + ROM_LOAD( "gnw_ball.svg", 0, 71748, CRC(7c116eaf) SHA1(578882af492b8a9f1eb72e06a547c8b574255fb9) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Flagman (model FL-02) + * PCB label FL-02 + * Sharp SM5A label FL-02 2005 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as Flag Man by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_flagman_state : public hh_sm510_state +{ +public: + gnw_flagman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_flagman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_flagman ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("4") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_flagman_state::gnw_flagman(machine_config &config) +{ + sm5a_common(config, 1511, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_flagman ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fl-02", 0x0000, 0x0740, CRC(cc7a99e4) SHA1(d03d9a6b278bc11df7839708831241b5fa805f69) ) + + ROM_REGION( 56163, "screen", 0) + ROM_LOAD( "gnw_flagman.svg", 0, 56163, CRC(3aa97c65) SHA1(a363e71d371e5c85835cb3a0679760d0aedc75d5) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Vermin (model MT-03) + * PCB label MT-03 + * Sharp SM5A label MT-03 5012 (no decap) + * lcd screen with custom segments, 1-bit sound + + In the USA, it was distributed as The Exterminator by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_vermin_state : public hh_sm510_state +{ +public: + gnw_vermin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_vermin(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_vermin ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_vermin_state::gnw_vermin(machine_config &config) +{ + sm5a_common(config, 1650, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_vermin ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mt-03", 0x0000, 0x0740, CRC(f8493177) SHA1(d629432ef8e9fbd7bbdc3fbeb45d9bd70d9d571b) ) + + ROM_REGION( 105603, "screen", 0) + ROM_LOAD( "gnw_vermin.svg", 0, 105603, CRC(1bd59ef4) SHA1(099120105e80d4753838ea513ffa784c4690cf5f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire (model RC-04) + * PCB label RC-04 + * Sharp SM5A label RC-04 5103 (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the silver version, there's also a wide screen version. + + In the USA, it was distributed as Fireman Fireman by Mego under their Time-Out series. + +***************************************************************************/ + +class gnw_fires_state : public hh_sm510_state +{ +public: + gnw_fires_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void gnw_fires(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fires ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_fires_state::gnw_fires(machine_config &config) +{ + sm5a_common(config, 1646, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fires ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "rc-04", 0x0000, 0x0740, CRC(154ef27d) SHA1(fb65826dfd405ad05fe0f5f947c213214bbd61c0) ) + + ROM_REGION( 102678, "screen", 0) + ROM_LOAD( "gnw_fires.svg", 0, 102678, CRC(4f61f2f8) SHA1(2873629f0e36d3170bc284fa031a9c6181021495) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Judge (model IP-05) + * PCB label IP-05 + * Sharp SM5A label IP-05 5010, or IP-15 5012 (no decap) + * lcd screen with custom segments, 1-bit sound + + The first (green) issue of the game contains a bug where the players are + scored differently when wrongly dodging a win. This issue is fixed in the + second (purple) issue. + +***************************************************************************/ + +class gnw_judge_state : public hh_sm510_state +{ +public: + gnw_judge_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_judge(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_judge ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Dodge") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Hit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Dodge") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Hit") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") // 2-Player + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") // 1-Player + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Increase Computer's Operation Time (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_judge_state::gnw_judge(machine_config &config) +{ + sm5a_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_judge ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ip-15", 0x0000, 0x0740, CRC(f6ed6f62) SHA1(97bc1b5c383fb4077d982cfdc5a7d7603a0b5e2f) ) + + ROM_REGION( 105108, "screen", 0) + ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) +ROM_END + +ROM_START( gnw_judgeo ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ip-05", 0x0000, 0x0740, CRC(1b28a834) SHA1(cb8dbbf678ba22c4484d18cc1a6b99c1d34d1951) ) + + ROM_REGION( 105108, "screen", 0) + ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Manhole (model MH-06) + * PCB label MH-06 + * Sharp SM5A label MH-06 5104 (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the Gold Series version, there's also a new wide screen version + (NH-103) + +***************************************************************************/ + +class gnw_manholeg_state : public hh_sm510_state +{ +public: + gnw_manholeg_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_manholeg(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_manholeg ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_manholeg_state::gnw_manholeg(machine_config &config) +{ + sm5a_common(config, 1667, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_manholeg ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mh-06", 0x0000, 0x0740, CRC(ae52c425) SHA1(8da8a714ecbdde7d0f257b52a5014993675a5f3f) ) + + ROM_REGION( 125607, "screen", 0) + ROM_LOAD( "gnw_manholeg.svg", 0, 125607, CRC(4b281ff2) SHA1(18f212ab5738756e0841d6afa401a03f7aaddf7b) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Helmet (model CN-07) + * PCB label CN-07 + * Sharp SM5A label CN-07 5102, or CN-17 21ZA (no decap) + * lcd screen with custom segments, 1-bit sound + + In the UK, it was distributed as Headache by CGL. + + MCU label CN-07 is the first version, CN-17 is a bugfix release. + +***************************************************************************/ + +class gnw_helmet_state : public hh_sm510_state +{ +public: + gnw_helmet_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_helmet(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_helmet ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_helmet_state::gnw_helmet(machine_config &config) +{ + sm5a_common(config, 1657, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_helmet ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "cn-17", 0x0000, 0x0740, CRC(6d251e2e) SHA1(c61f591514de36fb2270038a6505945564c9f90e) ) + + ROM_REGION( 109404, "screen", 0) + ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) +ROM_END + +ROM_START( gnw_helmeto ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "cn-07", 0x0000, 0x0740, CRC(30c8bc90) SHA1(f5ac0fe7a09ee1ad6f6e4bd096b4be20f65d73db) ) + + ROM_REGION( 109404, "screen", 0) + ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Lion (model LN-08) + * PCB label LN-08 + * Sharp SM5A label LN-08 519A (no decap) + * lcd screen with custom segments, 1-bit sound + + BTANB: The game doesn't support simultaneous button presses for the controls, + it's the same as in eg. gnw_mmouse but in this game it doesn't make much sense + with the 2 separate guys. More likely a bad game design choice than bug. + +***************************************************************************/ + +class gnw_lion_state : public hh_sm510_state +{ +public: + gnw_lion_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_lion(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_lion ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Increase Speed (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_lion_state::gnw_lion(machine_config &config) +{ + sm5a_common(config, 1646, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_lion ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ln-08", 0x0000, 0x0740, CRC(9677681d) SHA1(6f7c960e04b63f1b7d926b598413f4c818b8fe53) ) + + ROM_REGION( 155863, "screen", 0) + ROM_LOAD( "gnw_lion.svg", 0, 155863, CRC(b5a5a4dc) SHA1(49d894d6e1d1fb35cd11f08c7ce30518be89dd0f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Parachute (model PR-21) + * PCB label PR-21Y + * Sharp SM5A label PR-21 52XC (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_pchute_state : public hh_sm510_state +{ +public: + gnw_pchute_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_pchute(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_pchute ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_pchute_state::gnw_pchute(machine_config &config) +{ + sm5a_common(config, 1602, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_pchute ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "pr-21", 0x0000, 0x0740, CRC(392b545e) SHA1(e71940cd4cee07ba1e62c1c7d9e9b19410e7232d) ) + + ROM_REGION( 169640, "screen", 0) + ROM_LOAD( "gnw_pchute.svg", 0, 169640, CRC(f30a0b31) SHA1(676989a418ae0dfe6bb1b097640422219c930453) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Octopus (model OC-22) + * PCB label OC-22Y A + * Sharp SM5A label OC-22 204A (no decap) + * lcd screen with custom segments, 1-bit sound + + Also cloned in 1989 by Elektronika(USSR) as Тайны океана (Tayny okeana, export + version: Mysteries of the Ocean), ROM is identical, graphics as well except + for the AM/PM/GAME segments. + +***************************************************************************/ + +class gnw_octopus_state : public hh_sm510_state +{ +public: + gnw_octopus_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_octopus(machine_config &config); + void taynyoke(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_octopus ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_octopus_state::gnw_octopus(machine_config &config) +{ + sm5a_common(config, 1586, 1080); // R mask option confirmed +} + +void gnw_octopus_state::taynyoke(machine_config &config) +{ + kb1013vk12_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_octopus ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "oc-22", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) + + ROM_REGION( 119827, "screen", 0) + ROM_LOAD( "gnw_octopus.svg", 0, 119827, CRC(efbdaa65) SHA1(42c746bef282176d59f57ddf7328f8d034f4ca02) ) +ROM_END + +ROM_START( taynyoke ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-03.bin", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) + + ROM_REGION( 93910, "screen", 0) + ROM_LOAD( "taynyoke.svg", 0, 93910, CRC(da7a835e) SHA1(1fe427a60bbf78fdf29ea401ec86b225098b68bb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Popeye (model PP-23) + * PCB label PP-23 Y + * Sharp SM5A label PP-23 52YD (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the wide screen version, there's also tabletop and panorama versions. + +***************************************************************************/ + +class gnw_popeye_state : public hh_sm510_state +{ +public: + gnw_popeye_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_popeye(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_popeye ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_popeye_state::gnw_popeye(machine_config &config) +{ + sm5a_common(config, 1604, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_popeye ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "pp-23", 0x0000, 0x0740, CRC(49987769) SHA1(ad90659a3ce7169a4df16367c5307435d9f9d956) ) + + ROM_REGION( 218587, "screen", 0) + ROM_LOAD( "gnw_popeye.svg", 0, 218587, CRC(4740bcd5) SHA1(a46ab455f2dd41caabd6c85cfa7dfde70805f157) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Chef (model FP-24) + * PCB label FP-24 + * Sharp SM5A label FP-24 51YB (die label CMS646, ROM ID 74) + * lcd screen with custom segments, 1-bit sound + + In 1989, Elektronika(USSR) released a clone: Весёлый повар (Vesyolyy povar, + export version: Merry Cook). This game shares the same ROM, though the graphics + are slightly different. + +***************************************************************************/ + +class gnw_chef_state : public hh_sm510_state +{ +public: + gnw_chef_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void vespovar(machine_config &config); + void gnw_chef(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_chef ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_chef_state::gnw_chef(machine_config &config) +{ + sm5a_common(config, 1666, 1080); // assuming same R mask option as merry cook +} + +void gnw_chef_state::vespovar(machine_config & config) +{ + kb1013vk12_common(config, 1679, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_chef ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fp-24", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) + + ROM_REGION( 199518, "screen", 0) + ROM_LOAD( "gnw_chef.svg", 0, 199518, CRC(ecc18d28) SHA1(1c0b7dfff71faa4d4395c19a84454870e403f927) ) +ROM_END + +ROM_START( vespovar ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-04.bin", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) + + ROM_REGION( 144128, "screen", 0) + ROM_LOAD( "vespovar.svg", 0, 144128, CRC(dcd1c073) SHA1(e15bf643f17b7ead37407c985e053e6434683d7c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey Mouse (model MC-25), Egg (model EG-26) + * PCB label MC-25 EG-26 (yes, both listed) + * Sharp SM5A label MC-25 51YD (Mickey Mouse), MC-25 519D (Egg) (no decap) + * lcd screen with custom segments, 1-bit sound + + MC-25 and EG-26 are the same game, it's assumed that the latter was for + regions where Nintendo wasn't able to license from Disney. + + In 1984, Электроника (Elektronika, USSR) released an unlicensed clone: + Ну, погоди! (Nu, pogodi!). This was followed by several other titles that + were the same under the hood, only differing in graphics. They also made a + slightly modified version, adding a new game mode (by pressing A+B) where the + player/CPU roles are reversed. This version is known as Разведчики космоса + (Razvedchiki kosmosa, export version: Explorers of Space). + + The following Mickey Mouse Elektronika clones are emulated in MAME: + + Model Title Transliteration Export version Note + --------------------------------------------------------------------------------- + ИМ-02 Ну, погоди! Nu, pogodi! - - + ИМ-10 Хоккей Hockey (Khokkey) Ice Hockey Export version manufactured by PO Proton + ИМ-13 Разведчики космоса Razvedchiki kosmosa Explorers of Space Modified ROM (see note above) + ИМ-16 Охота Okhota Fowling - + ИМ-19 Биатлон Biathlon (Biatlon) - - + ИМ-22 Весёлые футболисты Vesyolye futbolisty Monkey Goalkeeper - + ИМ-32 Кот-рыболов Kot-rybolov - - + ИМ-33 Квака-задавака Kvaka-zadavaka Frogling - + ИМ-49 Ночные воришки Nochnye vorishki Night Burglars - + ИМ-50 Космический полёт Kosmicheskiy polyot Space Flight The Model ID is the same as Весёлая арифметика (Vesyolaya arithmetika, export version: Amusing Arithmetic) (not emulated in MAME) + ИМ-51 Морская атака Morskaya ataka - - + ИМ-53 Атака астероидов Ataka asteroidov - Graphics are very similar to ИМ-50 + - Цирк Circus (Tsirk) - Unknown Model ID + +***************************************************************************/ + +class gnw_mmouse_state : public hh_sm510_state +{ +public: + gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mmouse(machine_config &config); + void gnw_egg(machine_config &config); + void nupogodi(machine_config &config); + void ehockey(machine_config &config); + void rkosmosa(machine_config &config); + void okhota(machine_config &config); + void biathlon(machine_config &config); + void vfutbol(machine_config &config); + void krybolov(machine_config &config); + void kvakazad(machine_config &config); + void nochnyev(machine_config &config); + void kosmicpt(machine_config &config); + void morataka(machine_config &config); + void atakaast(machine_config &config); + void ecircus(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mmouse ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( rkosmosa ) + PORT_INCLUDE( gnw_mmouse ) + + PORT_MODIFY("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void gnw_mmouse_state::gnw_mmouse(machine_config &config) +{ + sm5a_common(config, 1684, 1080); // R mask option confirmed +} + +void gnw_mmouse_state::gnw_egg(machine_config &config) +{ + sm5a_common(config, 1690, 1080); // R mask option confirmed +} + +void gnw_mmouse_state::nupogodi(machine_config &config) +{ + kb1013vk12_common(config, 1715, 1080); // R mask option ? +} + +void gnw_mmouse_state::ehockey(machine_config &config) +{ + kb1013vk12_common(config, 1782, 1080); // R mask option ? +} + +void gnw_mmouse_state::rkosmosa(machine_config &config) +{ + kb1013vk12_common(config, 1646, 1080); // R mask option ? +} + +void gnw_mmouse_state::okhota(machine_config &config) +{ + kb1013vk12_common(config, 1632, 1080); // R mask option ? +} + +void gnw_mmouse_state::biathlon(machine_config &config) +{ + kb1013vk12_common(config, 1633, 1080); // R mask option ? +} + +void gnw_mmouse_state::vfutbol(machine_config &config) +{ + kb1013vk12_common(config, 1655, 1080); // R mask option ? +} + +void gnw_mmouse_state::krybolov(machine_config &config) +{ + kb1013vk12_common(config, 1638, 1080); // R mask option ? +} + +void gnw_mmouse_state::kvakazad(machine_config &config) +{ + kb1013vk12_common(config, 1660, 1080); // R mask option ? +} + +void gnw_mmouse_state::nochnyev(machine_config &config) +{ + kb1013vk12_common(config, 1641, 1080); // R mask option ? +} + +void gnw_mmouse_state::kosmicpt(machine_config &config) +{ + kb1013vk12_common(config, 1658, 1080); // R mask option ? +} + +void gnw_mmouse_state::morataka(machine_config &config) +{ + kb1013vk12_common(config, 1648, 1080); // R mask option ? +} + +void gnw_mmouse_state::atakaast(machine_config &config) +{ + kb1013vk12_common(config, 1620, 1080); // R mask option ? +} + +void gnw_mmouse_state::ecircus(machine_config &config) +{ + kb1013vk12_common(config, 1657, 1080); // R mask option ? +} + +// roms + +ROM_START( gnw_mmouse ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 181706, "screen", 0) + ROM_LOAD( "gnw_mmouse.svg", 0, 181706, CRC(60cdc76a) SHA1(09755abd16222c1a0fe6c7ebb902706440d3e369) ) +ROM_END + +ROM_START( gnw_egg ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 193119, "screen", 0) + ROM_LOAD( "gnw_egg.svg", 0, 193119, CRC(1e469fe5) SHA1(bc80114337feefca590e48c823e8488f6b63f896) ) +ROM_END + +ROM_START( nupogodi ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-02.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 154233, "screen", 0) + ROM_LOAD( "nupogodi.svg", 0, 154233, CRC(42cfb84a) SHA1(249ca7ec78066b57f9a18e48ada64712c944e461) ) +ROM_END + +ROM_START( ehockey ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-10.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 94977, "screen", 0) + ROM_LOAD( "ehockey.svg", 0, 94977, CRC(98cf43b0) SHA1(4353505709612344cd3b597c3b4e9f6b441ddb66) ) +ROM_END + +ROM_START( rkosmosa ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-13.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) ) + + ROM_REGION( 81420, "screen", 0) + ROM_LOAD( "rkosmosa.svg", 0, 81420, CRC(dc6632be) SHA1(0906d933f4cda39ee1e57b502651a821e61e95ef) ) +ROM_END + +ROM_START( okhota ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-16.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 117838, "screen", 0) + ROM_LOAD( "okhota.svg", 0, 117838, CRC(7de707c6) SHA1(c876ea16bd8af033086e2e20860d2e1d09296d59) ) +ROM_END + +ROM_START( biathlon ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-19.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 116377, "screen", 0) + ROM_LOAD( "biathlon.svg", 0, 116377, CRC(fadf729e) SHA1(671f9496e2bfe7b4800ee7bad039485e19958428) ) +ROM_END + +ROM_START( vfutbol ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-22.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 131901, "screen", 0) + ROM_LOAD( "vfutbol.svg", 0, 131901, CRC(85811308) SHA1(288aa41bade08c61e0d346b9c1109179564e34ed) ) +ROM_END + +ROM_START( krybolov ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-32.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 132804, "screen", 0) + ROM_LOAD( "krybolov.svg", 0, 132804, CRC(4e3e70d3) SHA1(18f1300afa601deb6ac01dcf7dca88187b7940a3) ) +ROM_END + +ROM_START( kvakazad ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-33.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 131961, "screen", 0) + ROM_LOAD( "kvakazad.svg", 0, 131961, CRC(37b27420) SHA1(25d9e273f056c10e3a5bc4476ce980bfdb8095e1) ) +ROM_END + +ROM_START( nochnyev ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-49.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 136498, "screen", 0) + ROM_LOAD( "nochnyev.svg", 0, 136498, CRC(24a287cd) SHA1(2d14aa9b55b42c634df141fe4037ae286549b17b) ) +ROM_END + +ROM_START( kosmicpt ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-50.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 110214, "screen", 0) + ROM_LOAD( "kosmicpt.svg", 0, 110214, CRC(ccef6d27) SHA1(71f3cf49a5797ed9296f1e86ec4575ffefab67dd) ) +ROM_END + +ROM_START( morataka ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-51.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 105057, "screen", 0) + ROM_LOAD( "morataka.svg", 0, 105057, CRC(c235c56c) SHA1(b6ef74ba7826221683243e23513270d0f0f2cfda) ) +ROM_END + +ROM_START( atakaast ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-53.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 105570, "screen", 0) + ROM_LOAD( "atakaast.svg", 0, 105570, CRC(3d79aacc) SHA1(bc25969f4d6fa75b320130c920ac0bdc8fb44cbd) ) +ROM_END + +ROM_START( ecircus ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "ecircus.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) + + ROM_REGION( 124643, "screen", 0) + ROM_LOAD( "ecircus.svg", 0, 124643, CRC(079f25db) SHA1(defa784c80e01ce6affbb424930674114275bea1) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire (model FR-27) + * PCB label FR-27 + * Sharp SM5A label FR-27 523B (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the wide screen version, there's also a silver version. Doing a + hex-compare between the two, this one seems to be a complete rewrite. + FR-27 is the last G&W on SM5A, they were followed with SM51x. + + In 1989 Elektronika(USSR) released a clone: Космический мост (Kosmicheskiy most, + export version: Space Bridge). This game shares the same ROM, though the + graphics are different. + +***************************************************************************/ + +class gnw_fire_state : public hh_sm510_state +{ +public: + gnw_fire_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kosmicmt(machine_config &config); + void gnw_fire(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fire ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // lcd test? + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_fire_state::gnw_fire(machine_config &config) +{ + sm5a_common(config, 1624, 1080); // R mask option confirmed +} + +void gnw_fire_state::kosmicmt(machine_config & config) +{ + kb1013vk12_common(config, 1673, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fire ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "fr-27", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) + + ROM_REGION( 163920, "screen", 0) + ROM_LOAD( "gnw_fire.svg", 0, 163920, CRC(be8a9f05) SHA1(644d8bed6228fa7e2f541b60fcfc1a0d97df0df6) ) +ROM_END + +ROM_START( kosmicmt ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-09.bin", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) + + ROM_REGION( 124578, "screen", 0) + ROM_LOAD( "kosmicmt.svg", 0, 124578, CRC(913324ef) SHA1(6e72f7f517da754075af11283d71fc8d24ac0529) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Turtle Bridge (model TL-28) + * PCB label TL-28 + * Sharp SM510 label TL-28 523C (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_tbridge_state : public hh_sm510_state +{ +public: + gnw_tbridge_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: unwanted segments light up + m_decay_pivot = 25; + m_decay_len = 25; + } + + void gnw_tbridge(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_tbridge ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_tbridge_state::gnw_tbridge(machine_config &config) +{ + sm510_common(config, 1587, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_tbridge ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tl-28", 0x0000, 0x1000, CRC(284e7224) SHA1(b50d7f3a527ffe50771ef55fdf8214929bfa2253) ) + + ROM_REGION( 242944, "screen", 0) + ROM_LOAD( "gnw_tbridge.svg", 0, 242944, CRC(bf66cb38) SHA1(3f19d1e6584062944e56107d47ebe26335d50f42) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Fire Attack (model ID-29) + * PCB label ID-29 + * Sharp SM510 label ID-29 524B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_fireatk_state : public hh_sm510_state +{ +public: + gnw_fireatk_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_fireatk(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_fireatk ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_fireatk_state::gnw_fireatk(machine_config &config) +{ + sm510_common(config, 1655, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_fireatk ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "id-29", 0x0000, 0x1000, CRC(5f6e8042) SHA1(63afc3acd8a2a996095fa8ba2dfccd48e5214478) ) + + ROM_REGION( 267914, "screen", 0) + ROM_LOAD( "gnw_fireatk.svg", 0, 267914, CRC(f9eea340) SHA1(1fbc224dac447fe3902920ee3f1afc11150b5962) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Snoopy Tennis (model SP-30) + * PCB label SP-30 + * Sharp SM510 label SP-30 525B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_stennis_state : public hh_sm510_state +{ +public: + gnw_stennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_stennis(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_stennis ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_stennis_state::gnw_stennis(machine_config &config) +{ + sm510_common(config, 1581, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_stennis ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "sp-30", 0x0000, 0x1000, CRC(ba1d9504) SHA1(ff601765d88564b1570a59f5b1a4005c7b0fd66c) ) + + ROM_REGION( 228125, "screen", 0) + ROM_LOAD( "gnw_stennis.svg", 0, 228125, CRC(1134ef9a) SHA1(6f35a4d610c952663761f7ccb74c6650752cac77) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Oil Panic (model OP-51) + * PCB label OP-51A + * Sharp SM510 label OP-51 28ZB (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_opanic_state : public hh_sm510_state +{ +public: + gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_opanic(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_opanic ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_opanic_state::gnw_opanic(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1292/2, 1920/2, 1230/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_opanic ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) ) + + ROM_REGION( 79771, "screen_top", 0) + ROM_LOAD( "gnw_opanic_top.svg", 0, 79771, CRC(0e1e6485) SHA1(15d5ec48cad65759a50ed624e4161a8f2513f704) ) + + ROM_REGION( 112962, "screen_bottom", 0) + ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112962, CRC(ae4f4f1f) SHA1(97907bea3ca92759a0ea889e80d60d25a701027a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong (model DK-52) + * PCB label DK-52C + * Sharp SM510 label DK-52 52ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong_state : public hh_sm510_state +{ +public: + gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong_state::gnw_dkong(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1266/2, 1920/2, 1266/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkong ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) ) + + ROM_REGION( 176843, "screen_top", 0) + ROM_LOAD( "gnw_dkong_top.svg", 0, 176843, CRC(16c16b84) SHA1(fa2e54c04366a30b51de024296b9f94c1cb76d68) ) + + ROM_REGION( 145516, "screen_bottom", 0) + ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145516, CRC(2b711e9d) SHA1(0e263020cbe0e8b88bb68e3176630639b518935e) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey & Donald (model DM-53) + * PCB label DM-53 + * Sharp SM510 label DM-53 52ZC (die label CMS54C, CMS565) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mickdon_state : public hh_sm510_state +{ +public: + gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mickdon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mickdon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mickdon_state::gnw_mickdon(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1281/2, 1920/2, 1236/2); // R mask option confirmed + + m_maincpu->write_r().set(FUNC(gnw_mickdon_state::piezo_r2_w)); +} + +// roms + +ROM_START( gnw_mickdon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) + + ROM_REGION( 126477, "screen_top", 0) + ROM_LOAD( "gnw_mickdon_top.svg", 0, 126477, CRC(11e02fce) SHA1(fe2700711c73940a9488a6d223db4c4e92df4188) ) + + ROM_REGION( 122915, "screen_bottom", 0) + ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122915, CRC(b8cf63c2) SHA1(2406c9826f94a345ca9641e51fb26088f434960c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Green House (model GH-54) + * PCB label GH-54 + * Sharp SM510 label GH-54 52ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + + After the 20,000,000th G&W, Nintendo made a special edition of Green House + (still model GH-54), with the box art showing all the released games so far. + +***************************************************************************/ + +class gnw_ghouse_state : public hh_sm510_state +{ +public: + gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_ghouse(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ghouse ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Spray + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_ghouse_state::gnw_ghouse(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1303/2, 1920/2, 1274/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ghouse ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) ) + + ROM_REGION( 159258, "screen_top", 0) + ROM_LOAD( "gnw_ghouse_top.svg", 0, 159258, CRC(308c9c86) SHA1(e83d114e702b6da3cba4e45bd48edfe9882afac1) ) + + ROM_REGION( 149922, "screen_bottom", 0) + ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149922, CRC(c07c6bb8) SHA1(7a0d6f38ecdbfcd09ab967417fa9d06b5c5c21e4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong II (model JR-55) + * PCB label JR-55 + * Sharp SM510 label JR-55 53YC (die label CMS54C, KMS560) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong2_state : public hh_sm510_state +{ +public: + gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong2_state::gnw_dkong2(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1241/2, 1920/2, 1237/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkong2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) ) + + ROM_REGION( 267462, "screen_top", 0) + ROM_LOAD( "gnw_dkong2_top.svg", 0, 267462, CRC(41bb5414) SHA1(20c7af7c64e12273320029eecc5a33ec65d15bc5) ) + + ROM_REGION( 390601, "screen_bottom", 0) + ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390601, CRC(3f85bb01) SHA1(8964f02e8372f5d8dd5e8edfe0b79dae31b59b3a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario Bros. (model MW-56) + * PCB label MW-56-M-I (left), MW-56-S (right) + * Sharp SM510 label MW-56 533C (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mario_state : public hh_sm510_state +{ +public: + gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mario(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mario ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mario_state::gnw_mario(machine_config &config) +{ + sm510_dualh(config, 2258/2, 1440/2, 2261/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_mario ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) ) + + ROM_REGION( 154916, "screen_left", 0) + ROM_LOAD( "gnw_mario_left.svg", 0, 154916, CRC(8ea82355) SHA1(ad286039a215dfa0f02bb1caf875d55dedb9b71e) ) + + ROM_REGION( 202902, "screen_right", 0) + ROM_LOAD( "gnw_mario_right.svg", 0, 202902, CRC(cfe8c0ba) SHA1(87cd54a8104e9bb4f266b137b043e32a0c1d9772) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Rain Shower (model LP-57) + * PCB labels: LP-57-M-I (left), LP-57-S (right) + * Sharp SM510 label LP-57 538A (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_rshower_state : public hh_sm510_state +{ +public: + gnw_rshower_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_rshower(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_rshower ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // L/R + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_rshower_state::gnw_rshower(machine_config &config) +{ + sm510_dualh(config, 2126/2, 1440/2, 2146/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_rshower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "lp-57", 0x0000, 0x1000, CRC(51a2c5c4) SHA1(d60542e6785ba7b6a44153a66c739787cf670816) ) + + ROM_REGION( 135868, "screen_left", 0) + ROM_LOAD( "gnw_rshower_left.svg", 0, 135868, CRC(806493f1) SHA1(0287fba2c2962aced8156c2ebc4f299c4703acf2) ) + + ROM_REGION( 140445, "screen_right", 0) + ROM_LOAD( "gnw_rshower_right.svg", 0, 140445, CRC(bead097a) SHA1(a3929e0043ff5132fb4cf7a41edece96926f50d2) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Life Boat (model TC-58) + * PCB labels: TC-58-M (left), TC-58-S (right) + * Sharp SM510 label TC-58 281D (no decap) + * horizontal dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_lboat_state : public hh_sm510_state +{ +public: + gnw_lboat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_lboat(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_lboat ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_lboat_state::gnw_lboat(machine_config &config) +{ + sm510_dualh(config, 2116/2, 1440/2, 2057/2, 1440/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_lboat ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tc-58", 0x0000, 0x1000, CRC(1f88f6a2) SHA1(22fd62127dda43a0ada2fe89b0518eec8cbe2a25) ) + + ROM_REGION( 156441, "screen_left", 0) + ROM_LOAD( "gnw_lboat_left.svg", 0, 156441, CRC(a1727890) SHA1(b1dd24f99496d215a3083a138fc3fff923303d34) ) + + ROM_REGION( 155258, "screen_right", 0) + ROM_LOAD( "gnw_lboat_right.svg", 0, 155258, CRC(76619ad3) SHA1(b44d57e2f4a2cecf98e402adf802d16c5934d301) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Pinball (model PB-59) + * PCB label PB-59 + * Sharp SM511 label PB-59 53ZD (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_pinball_state : public hh_sm510_state +{ +public: + gnw_pinball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_pinball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_pinball ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB -- this one multiplies scoring factor + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_pinball_state::gnw_pinball(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1271/2, 1920/2, 1286/2); +} + +// roms + +ROM_START( gnw_pinball ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "pb-59.program", 0x0000, 0x1000, CRC(d29dab34) SHA1(69ac9ee63eda67360c21627b7d625093709b5cd9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "pb-59.melody", 0x000, 0x100, BAD_DUMP CRC(5c9ccb55) SHA1(1bada6caf3609f969421087219e6635f4c135282) ) // decap needed for verification + + ROM_REGION( 83191, "screen_top", 0) + ROM_LOAD( "gnw_pinball_top.svg", 0, 83191, CRC(abe3edd9) SHA1(b32327b81b788896150e709ab8dc4a2155ae0995) ) + + ROM_REGION( 63618, "screen_bottom", 0) + ROM_LOAD( "gnw_pinball_bottom.svg", 0, 63618, CRC(1db44191) SHA1(73f73d246630d0b9efeb8dc72f37a2b88f735ceb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Black Jack (model BJ-60) + * PCB label BJ-60 + * Sharp SM512 label BJ-60 564D (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_bjack_state : public hh_sm510_state +{ +public: + gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bjack(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bjack ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Double Down") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x10 / Hit") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x1 / Stand") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Enter") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void gnw_bjack_state::gnw_bjack(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1290/2, 1920/2, 1297/2); +} + +// roms + +ROM_START( gnw_bjack ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // decap needed for verification + + ROM_REGION( 75366, "screen_top", 0) + ROM_LOAD( "gnw_bjack_top.svg", 0, 75366, CRC(d36fb4e4) SHA1(7f2a0256d78eb01e757208ead0fd52ee63ce8efa) ) + + ROM_REGION( 112599, "screen_bottom", 0) + ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112599, CRC(04880ae1) SHA1(60f3723f81965fe4891f25a3522351872f338389) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Squish (model MG-61) + * PCB label MG-61 + * Sharp SM510 label MG-61 8841B (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_squish_state : public hh_sm510_state +{ +public: + gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: unwanted segments light up + m_decay_pivot = 17; + } + + void gnw_squish(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_squish ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Bonus Life (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_squish_state::gnw_squish(machine_config &config) +{ + sm510_dualv(config, 1920/2, 1285/2, 1920/2, 1287/2); // R mask option confirmed +} + +// roms + +ROM_START( gnw_squish ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) ) + + ROM_REGION( 70456, "screen_top", 0) + ROM_LOAD( "gnw_squish_top.svg", 0, 70456, CRC(8d10b94e) SHA1(33854e7ea8f02adceb597c9ba259aa553953e698) ) + + ROM_REGION( 279739, "screen_bottom", 0) + ROM_LOAD( "gnw_squish_bottom.svg", 0, 279739, CRC(7f4bd704) SHA1(e625910101896cf3a6d41e28ccda77f902f71c7a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Bomb Sweeper (model BD-62) + * PCB label BD-62 + * Sharp SM512 label BD-62 8727 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_bsweep_state : public hh_sm510_state +{ +public: + gnw_bsweep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bsweep(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bsweep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Controller keys skips level when activated + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_bsweep_state::gnw_bsweep(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1291/2, 1920/2, 1239/2); +} + +// roms + +ROM_START( gnw_bsweep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bd-62.program", 0x0000, 0x1000, CRC(f3ac66ea) SHA1(3fbf444ade5bc96cf0073ca72f1d583cb0f48fc5) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bd-62.melody", 0x000, 0x100, BAD_DUMP CRC(addc0368) SHA1(fc488bdf1c2ea5ca84cc66762126bb5874659d8f) ) // decap needed for verification + + ROM_REGION( 218174, "screen_top", 0) + ROM_LOAD( "gnw_bsweep_top.svg", 0, 218174, CRC(b2c8e895) SHA1(9f7d5973a5f920845c83d30f7ebbbec93232c41e) ) + + ROM_REGION( 277420, "screen_bottom", 0) + ROM_LOAD( "gnw_bsweep_bottom.svg", 0, 277420, CRC(8a9786cb) SHA1(48390a77b0e436ec7d7e8835923faef787e163d4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Safe Buster (model JB-63) + * PCB label JB-63 + * Sharp SM511 label JB-63 8841 B (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_sbuster_state : public hh_sm510_state +{ +public: + gnw_sbuster_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_sbuster(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_sbuster ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_sbuster_state::gnw_sbuster(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1246/2, 1920/2, 1269/2); +} + +// roms + +ROM_START( gnw_sbuster ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "jb-63.program", 0x0000, 0x1000, CRC(231d358d) SHA1(c748788da125e77b9d0fe1228f64de71f41af42b) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "jb-63.melody", 0x000, 0x100, BAD_DUMP CRC(28cb2914) SHA1(52d34265611f786b597653193752d16563dd5e82) ) // decap needed for verification + + ROM_REGION( 221903, "screen_top", 0) + ROM_LOAD( "gnw_sbuster_top.svg", 0, 221903, CRC(adb9b67f) SHA1(902998ead1a13d3c26854393283ab622e1fd3f70) ) + + ROM_REGION( 282593, "screen_bottom", 0) + ROM_LOAD( "gnw_sbuster_bottom.svg", 0, 282593, CRC(12542c5e) SHA1(fb05b8f4a2cbeeb566ae111cd27ff486c1478d7b) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Gold Cliff (model MV-64) + * PCB label MV-64 + * Sharp SM512 label MV-64 9027 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_gcliff_state : public hh_sm510_state +{ +public: + gnw_gcliff_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_gcliff(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_gcliff ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Left or right skips level when activated + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_gcliff_state::gnw_gcliff(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1257/2, 1920/2, 1239/2); +} + +// roms + +ROM_START( gnw_gcliff ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mv-64.program", 0x0000, 0x1000, CRC(2448a3bf) SHA1(bfb1a1b500321f8ee0b6f07ef8503e64fe6d37c0) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mv-64.melody", 0x000, 0x100, BAD_DUMP CRC(cb938709) SHA1(516dcc8a1edffe02f50d349389caac0676de1eba) ) // decap needed for verification + + ROM_REGION( 530731, "screen_top", 0) + ROM_LOAD( "gnw_gcliff_top.svg", 0, 530731, CRC(3bb60d8f) SHA1(e7dac1fcbe7b682c9d988443c1446e5ad28d3baa) ) + + ROM_REGION( 519321, "screen_bottom", 0) + ROM_LOAD( "gnw_gcliff_bottom.svg", 0, 519321, CRC(1117041e) SHA1(0f87167614c1ba65915fa7205a6bb44778e443a8) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Zelda (model ZL-65) + * PCB label ZL-65 + * Sharp SM512 label ZL-65 8935 A (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_zelda_state : public hh_sm510_state +{ +public: + gnw_zelda_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_zelda(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_zelda ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Water of Life + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " -- Invincibility when playing on bottom screen only + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_zelda_state::gnw_zelda(machine_config &config) +{ + sm512_dualv(config, 1920/2, 1346/2, 1920/2, 1291/2); +} + +// roms + +ROM_START( gnw_zelda ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "zl-65.program", 0x0000, 0x1000, CRC(b96aa64e) SHA1(d1f0c64104eb3ecbf370674d5078a3a85b2b7227) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "zl-65.melody", 0x000, 0x100, BAD_DUMP CRC(3a281b0f) SHA1(7a236775557939050bbcd6f9d0a598d219a032f2) ) // decap needed for verification + + ROM_REGION( 283029, "screen_top", 0) + ROM_LOAD( "gnw_zelda_top.svg", 0, 283029, CRC(aaab1d7e) SHA1(fe01e8a92e6dcf457da87afe6bf39fcf511da9db) ) + + ROM_REGION( 424886, "screen_bottom", 0) + ROM_LOAD( "gnw_zelda_bottom.svg", 0, 424886, CRC(09f00d09) SHA1(33045028bd7e0df4e976e79dc180028c6886359a) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Cement Factory (model CM-72) + * PCB labels: CM-72 M (main board) + CM-72 C (joystick controller board) + CM-72 S (buttons controller board) + * Sharp SM511 label CM-72 534A, or CM-72A 536C (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the tabletop version. There's also a new wide screen version which is + a different game. Unlike the other tabletop games, there is no panorama version. + There are two known versions, distinguished by the startup jingle. The first + version sounds like Queen's "Another One Bites the Dust". + +***************************************************************************/ + +class gnw_mariocmt_state : public hh_sm510_state +{ +public: + gnw_mariocmt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariocmt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariocmt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariocmt_state::gnw_mariocmt(machine_config &config) +{ + sm511_common(config, 1920, 1046); +} + +// roms + +ROM_START( gnw_mariocmt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cm-72.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cm-72.melody", 0x000, 0x100, BAD_DUMP CRC(db4f0fc1) SHA1(e386df3e3e88fa36a73bcd0649feb904180493c8) ) // decap needed for verification + + ROM_REGION( 293317, "screen", 0) + ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) +ROM_END + +ROM_START( gnw_mariocmta ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cm-72a.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cm-72a.melody", 0x000, 0x100, BAD_DUMP CRC(b6d72560) SHA1(9d7c23f94b7f894ba1b7881f68824949702a37f2) ) // decap needed for verification + + ROM_REGION( 293317, "screen", 0) + ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Snoopy (model SM-91) + * PCB labels: SM-91 M (main board), SM-91C (controller board) + * Sharp SM511 label SM-91 538A (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD. + +***************************************************************************/ + +class gnw_snoopyp_state : public hh_sm510_state +{ +public: + gnw_snoopyp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_snoopyp(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_snoopyp ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_snoopyp_state::gnw_snoopyp(machine_config &config) +{ + sm511_common(config, 1920, 1020); +} + +// roms + +ROM_START( gnw_snoopyp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "sm-91.program", 0x0000, 0x1000, CRC(893bd7e3) SHA1(94e218f464b2ec8c81bd4c0f13f3a3049c4effe9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "sm-91.melody", 0x000, 0x100, BAD_DUMP CRC(09360aaf) SHA1(906eff1d2eaf7ff040d833b4513a995e7026279b) ) // decap needed for verification + + ROM_REGION( 353488, "screen", 0) + ROM_LOAD( "gnw_snoopyp.svg", 0, 353488, CRC(30cfa42e) SHA1(2abe74299db7241c66f9631b01d0ea336ec411ad) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Popeye (model PG-92) + * PCB labels: PG-92 M (main board), SM-91C (controller board) + * Sharp SM511 label PG-92 538A (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD, and a new wide screen version which is + a different game. + + The PCB design for the controller board is shared with the panorama version + of Snoopy (SM-91). + +***************************************************************************/ + +class gnw_popeyep_state : public hh_sm510_state +{ +public: + gnw_popeyep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_popeyep(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_popeyep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Punch + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives and Stronger Punch (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_popeyep_state::gnw_popeyep(machine_config &config) +{ + sm511_common(config, 1920, 1043); +} + +// roms + +ROM_START( gnw_popeyep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "pg-92.program", 0x0000, 0x1000, CRC(f9a2f181) SHA1(f97969abe63285964ef9585660e82590014bbece) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "pg-92.melody", 0x000, 0x100, BAD_DUMP CRC(ce2a0e03) SHA1(cb7e4c64639579349aa944e4bfff7b05cf49ce0e) ) // decap needed for verification + + ROM_REGION( 541218, "screen", 0) + ROM_LOAD( "gnw_popeyep.svg", 0, 541218, CRC(ad93aa24) SHA1(b02c1fec1d8388878b5f21887f19aa5007b8ae43) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong Jr. (model CJ-93) + * PCB labels: CJ-93 M (main board), CJ-93C (controller board) + * Sharp SM511 label CJ-93 539D (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version. There's also a tabletop version which is + assumed to use the same ROM/LCD, and a new wide screen version which is + a different game. + + The tabletop version was also licensed to Coleco. + +***************************************************************************/ + +class gnw_dkjrp_state : public hh_sm510_state +{ +public: + gnw_dkjrp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkjrp(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkjrp ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkjrp_state::gnw_dkjrp(machine_config &config) +{ + sm511_common(config, 1920, 1049); +} + +// roms + +ROM_START( gnw_dkjrp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cj-93.program", 0x0000, 0x1000, CRC(a2cd5a91) SHA1(33f6fd1530e5522491851f16d7c9f928b2dbdc3b) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "cj-93.melody", 0x000, 0x100, BAD_DUMP CRC(99fbf76a) SHA1(15ba1af51bebc316146eb9a0a3d58d28f644d45f) ) // decap needed for verification + + ROM_REGION( 340751, "screen", 0) + ROM_LOAD( "gnw_dkjrp.svg", 0, 340751, CRC(eb3cb98b) SHA1(5b148557d3ade2e2050ddde879a6cc05e119b446) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Bombs Away (model TB-94) + * PCB labels: TB-94 M (main board), SM-91C (controller board) + * Sharp SM511 label TB-94 537C (no decap) + * inverted lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mbaway_state : public hh_sm510_state +{ +public: + gnw_mbaway_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mbaway(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mbaway ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Up/Down + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mbaway_state::gnw_mbaway(machine_config &config) +{ + sm511_common(config, 1920, 1031); +} + +// roms + +ROM_START( gnw_mbaway ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tb-94.program", 0x0000, 0x1000, CRC(11d18a48) SHA1(afccfa19dace7c4fcc15a84ecfcfb9d7ae3861e4) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "tb-94.melody", 0x000, 0x100, BAD_DUMP CRC(60d98353) SHA1(8789d7cd39111fe01848a89748ab91731de5caef) ) // decap needed for verification + + ROM_REGION( 514643, "screen", 0) + ROM_LOAD( "gnw_mbaway.svg", 0, 514643, CRC(2ec2f18b) SHA1(8e2fd20615d867aac97e443fb977513ff98138b4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mickey Mouse (model DC-95), + Nintendo Game & Watch: Donkey Kong Circus (model MK-96) + * PCB labels: DC-95M (main board), DC-95C (controller board) + * Sharp SM511 + - label DC-95 284C (Mickey Mouse) (no decap) + - label DC-95 541D (Donkey Kong Circus) (no decap) + * inverted lcd screen with custom segments, 1-bit sound + + This is the panorama version of Mickey Mouse. There's also a wide screen + version which is a different game. + + DC-95 and MK-96 are the same game, it's assumed that the latter was for + regions where Nintendo wasn't able to license from Disney. + +***************************************************************************/ + +class gnw_mmousep_state : public hh_sm510_state +{ +public: + gnw_mmousep_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mmousep(machine_config &config); + void gnw_dkcirc(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mmousep ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mmousep_state::gnw_mmousep(machine_config &config) +{ + sm511_common(config, 1920, 1122); +} + +void gnw_mmousep_state::gnw_dkcirc(machine_config &config) +{ + sm511_common(config, 1920, 1107); +} + +// roms + +ROM_START( gnw_mmousep ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dc-95.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dc-95.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification + + ROM_REGION( 275609, "screen", 0) + ROM_LOAD( "gnw_mmousep.svg", 0, 275609, CRC(bac13689) SHA1(3ddcb4416bc5b8615b2854434ef78acac204a583) ) +ROM_END + +ROM_START( gnw_dkcirc ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk-96.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mk-96.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification + + ROM_REGION( 367718, "screen", 0) + ROM_LOAD( "gnw_dkcirc.svg", 0, 367718, CRC(f8571437) SHA1(bc000267deab83dfd460aea5c4102a23ac51f169) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Donkey Kong Jr. (model DJ-101) + * Sharp SM510 label DJ-101 52ZA (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a tabletop version that + plays more like the arcade game. + +***************************************************************************/ + +class gnw_dkjr_state : public hh_sm510_state +{ +public: + gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkjr(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkjr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkjr_state::gnw_dkjr(machine_config &config) +{ + sm510_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_dkjr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) ) + + ROM_REGION( 281202, "screen", 0) + ROM_LOAD( "gnw_dkjr.svg", 0, 281202, CRC(f8b18d58) SHA1(fa8321b3d8f81685da763d66fc148d339e6bcd55) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario's Cement Factory (model ML-102) + * Sharp SM510 label ML-102 298D (die label CMS54C, KMS577) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a tabletop version. + +***************************************************************************/ + +class gnw_mariocm_state : public hh_sm510_state +{ +public: + gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariocm(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariocm ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariocm_state::gnw_mariocm(machine_config &config) +{ + sm510_common(config, 1647, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_mariocm ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) ) + + ROM_REGION( 302983, "screen", 0) + ROM_LOAD( "gnw_mariocm.svg", 0, 302983, CRC(32ed7941) SHA1(ce7c5ae7a179ec9bcd17db7d7a27780801f7c1cb) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Manhole (model NH-103) + * PCB label NH-103 + * Sharp SM510 label NH-103 538A (no decap) + * lcd screen with custom segments, 1-bit sound + + This is the new wide screen version, there's also a Gold Series version + (MH-06). The two games are using different MCU types so this version seems + to be a complete rewrite. + +***************************************************************************/ + +class gnw_manhole_state : public hh_sm510_state +{ +public: + gnw_manhole_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_manhole(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_manhole ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_manhole_state::gnw_manhole(machine_config &config) +{ + sm510_common(config, 1560, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_manhole ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "nh-103", 0x0000, 0x1000, CRC(ec03acf7) SHA1(b74ae672d8f8a155b2ea4ecee9afbaed95ec0ceb) ) + + ROM_REGION( 223414, "screen", 0) + ROM_LOAD( "gnw_manhole.svg", 0, 223414, CRC(774d806b) SHA1(acb730d8e397eb29988a353e0a9db8ae69913117) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Tropical Fish (model TF-104) + * PCB label TF-104 + * Sharp SM510 label TF-104 8739A (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_tfish_state : public hh_sm510_state +{ +public: + gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_tfish(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_tfish ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_tfish_state::gnw_tfish(machine_config &config) +{ + sm510_common(config, 1572, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_tfish ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) ) + + ROM_REGION( 257396, "screen", 0) + ROM_LOAD( "gnw_tfish.svg", 0, 257396, CRC(6f457a30) SHA1(0b748c9573ff96b99f4fa0adb17d218e89b56d3f) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Super Mario Bros. (model: see below) + * PCB label YM-801 (Crystal Screen), YM-105 (New Wide Screen) + * Sharp SM511 + - label YM-801 8034A (crystal screen) (not dumped yet) + - label YM-105 9024B (new wide screen version) (die label ?) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model YM-801), rereleased on + New Wide Screen in 1988 (model YM-105). It was also a prize in a Nintendo + game contest in 1987 (model YM-901-S). In YM-801, Mario looks like the + ones in ML-102 and MW-56. In YM-901-S and YM-105 he looks more detailed. + Until further proof, it's assumed that the ROM is the same for each model. + +***************************************************************************/ + +class gnw_smb_state : public hh_sm510_state +{ +public: + gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_smb(machine_config &config); + void gnw_smbn(machine_config & config); +}; + +// config + +static INPUT_PORTS_START( gnw_smb ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_smb_state::gnw_smb(machine_config &config) +{ + sm511_common(config, 1768, 1080); +} + +void gnw_smb_state::gnw_smbn(machine_config &config) +{ + sm511_common(config, 1677, 1080); +} + +// roms + +ROM_START( gnw_smb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ym-801.program", 0x0000, 0x1000, BAD_DUMP CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ym-801.melody", 0x000, 0x100, BAD_DUMP CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) // dumped from NWS version + + ROM_REGION( 342106, "screen", 0) + ROM_LOAD( "gnw_smb.svg", 0, 342106, CRC(243224ac) SHA1(9b7f41abe4e340e32893ff1ef6e4d696deadc637) ) +ROM_END + +ROM_START( gnw_smbn ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) + + ROM_REGION( 648313, "screen", 0) + ROM_LOAD( "gnw_smbn.svg", 0, 648313, CRC(5808c793) SHA1(06b90993eb9db2a1909509f99ebf00e27c20dcad) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Climber Crystal Screen (model DR-802), + Nintendo Game & Watch: Climber New Wide Screen (model DR-106) + * PCB label DR-802 (Crystal Screen), DR-106 (New Wide Screen) + * Sharp SM511 + - label DR-802 8626A (crystal screen) (not dumped yet) + - label DR-106 9038B (new wide screen version) (no decap) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model DR-802), rereleased on + New Wide Screen in 1988 (model DR-106). The graphic LCD elements look the same + in both versions but the display aspect ratio and the graphical background is + slightly different. Until further proof, it's assumed that the ROM is the same + for both models. + +***************************************************************************/ + +class gnw_climber_state : public hh_sm510_state +{ +public: + gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_climber(machine_config &config); + void gnw_climbern(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_climber ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_climber_state::gnw_climber(machine_config &config) +{ + sm511_common(config, 1756, 1080); +} + +void gnw_climber_state::gnw_climbern(machine_config &config) +{ + sm511_common(config, 1677, 1080); +} + +// roms + +ROM_START( gnw_climber ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dr-802.program", 0x0000, 0x1000, BAD_DUMP CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dr-802.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // dumped from NWS version + + ROM_REGION( 564868, "screen", 0) + ROM_LOAD( "gnw_climber.svg", 0, 564868, CRC(a50ebd1c) SHA1(51047db960c8f110c1b681347cf8efd1d6263b85) ) +ROM_END + +ROM_START( gnw_climbern ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // decap needed for verification + + ROM_REGION( 542453, "screen", 0) + ROM_LOAD( "gnw_climbern.svg", 0, 542453, CRC(2ded966e) SHA1(7e9c99d372b6e547b9b3e789dca9dee60455a427) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Balloon Fight Crystal Screen (model BF-803), + Nintendo Game & Watch: Balloon Fight New Wide Screen (model BF-107) + * PCB labels + - DR-802-2 (Crystal Screen) + - DR-106 (new wide screen version) + * Sharp SM511 + - label BF-803 8646A (crystal screen) (not dumped yet) + - label BF-107 9031B (new wide screen version) (no decap) + * lcd screen with custom segments, 1-bit sound + + First released in 1986 on Crystal Screen (model BF-803), rereleased on + New Wide Screen in 1988 (model BF-107). The graphic LCD elements look the same + in both versions but the graphical background is slightly different. + Until further proof, it's assumed that the ROM is the same for both models. + + The PCB design for the different editions seems to be shared with the + corresponding editions of Climber. + +***************************************************************************/ + +class gnw_bfight_state : public hh_sm510_state +{ +public: + gnw_bfight_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_bfight(machine_config &config); + void gnw_bfightn(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_bfight ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Eject + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_bfight_state::gnw_bfight(machine_config &config) +{ + sm511_common(config, 1771, 1080); +} + +void gnw_bfight_state::gnw_bfightn(machine_config &config) +{ + sm511_common(config, 1549, 1080); +} + +// roms + +ROM_START( gnw_bfight ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bf-803.program", 0x0000, 0x1000, BAD_DUMP CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) // dumped from NWS version + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bf-803.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // dumped from NWS version + + ROM_REGION( 586453, "screen", 0) + ROM_LOAD( "gnw_bfight.svg", 0, 586453, CRC(40d81b65) SHA1(96ed909647229cfde6d733ba10d54ace29e5618a) ) +ROM_END + +ROM_START( gnw_bfightn ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // decap needed for verification + + ROM_REGION( 558496, "screen", 0) + ROM_LOAD( "gnw_bfightn.svg", 0, 558496, CRC(c488000e) SHA1(f9a042799a1489f83b07a91827b8b421238a67e8) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Mario The Juggler (model MB-108) + * PCB label MB-108 + * Sharp SM511 label MB-108 9209B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_mariotj_state : public hh_sm510_state +{ +public: + gnw_mariotj_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_mariotj(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_mariotj ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_mariotj_state::gnw_mariotj(machine_config &config) +{ + sm511_common(config, 1630, 1080); +} + +// roms + +ROM_START( gnw_mariotj ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb-108.program", 0x0000, 0x1000, CRC(f7118bb4) SHA1(c3117fd009e4686a149f85fb65786ddffc091eeb) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "mb-108.melody", 0x000, 0x100, BAD_DUMP CRC(d8cc1f74) SHA1(4bbb470ef01777b0c1dbd7b84dc560da6d3b87e7) ) // decap needed for verification + + ROM_REGION( 210391, "screen", 0) + ROM_LOAD( "gnw_mariotj.svg", 0, 210391, CRC(8f1e6118) SHA1(4ecad443142330470384659af1e8dd59bca519e4) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Spitball Sparky (model BU-201) + * PCB label BU-201 + * Sharp SM510 label BU-201 542A (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_ssparky_state : public hh_sm510_state +{ +public: + gnw_ssparky_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_ssparky(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_ssparky ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Shooter + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_ssparky_state::gnw_ssparky(machine_config &config) +{ + sm510_common(config, 627, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_ssparky ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bu-201", 0x0000, 0x1000, CRC(ae0d28e7) SHA1(1427cca1f3aaf3ef6fc3499171a5220428d9894f) ) + + ROM_REGION( 136929, "screen", 0) + ROM_LOAD( "gnw_ssparky.svg", 0, 136929, CRC(66e5d586) SHA1(b666f675abb8edef65ff402e8bc9a5213b630851) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Game & Watch: Crab Grab (model UD-202) + * PCB label UD-202 + * Sharp SM510 label UD-202 542B (no decap) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_cgrab_state : public hh_sm510_state +{ +public: + gnw_cgrab_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_cgrab(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_cgrab ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Do not release crabs (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_cgrab_state::gnw_cgrab(machine_config &config) +{ + sm510_common(config, 609, 1080); // R mask option confirmed +} + +// roms + +ROM_START( gnw_cgrab ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ud-202", 0x0000, 0x1000, CRC(65e97963) SHA1(f6d589fac337e2c4acdaa8f1281912feabc54198) ) + + ROM_REGION( 354770, "screen", 0) + ROM_LOAD( "gnw_cgrab.svg", 0, 354770, CRC(d61478aa) SHA1(8dd44cfb3720740150defdfbebe0bd52a3b3a377) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Boxing (model BX-301) + * Sharp SM511 label BX-301 287C (die label KMS73B, KMS744) + * wide lcd screen with custom segments, 1-bit sound + + Also known as Punch-Out!! in the USA. + +***************************************************************************/ + +class gnw_boxing_state : public hh_sm510_state +{ +public: + gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_boxing(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( microvs_shared ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( gnw_boxing ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "P2 Decrease Health (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Health (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_boxing_state::gnw_boxing(machine_config &config) +{ + sm511_common(config, 1920, 524); +} + +// roms + +ROM_START( gnw_boxing ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) ) + + ROM_REGION( 265217, "screen", 0) + ROM_LOAD( "gnw_boxing.svg", 0, 265217, CRC(306c733e) SHA1(8c80df1295ff0889e16ef9a14e45b27a6ebaa9a2) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Donkey Kong 3 (model AK-302) + * PCB label AK-302M + * Sharp SM511 label AK-302 299D (no decap) + * wide lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkong3_state : public hh_sm510_state +{ +public: + gnw_dkong3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkong3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkong3 ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkong3_state::gnw_dkong3(machine_config &config) +{ + sm511_common(config, 1920, 563); +} + +// roms + +ROM_START( gnw_dkong3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ak-302.program", 0x0000, 0x1000, CRC(ed59c15e) SHA1(94f6ce23677d2150c9f86c4b1954f5f531693b21) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "ak-302.melody", 0x000, 0x100, BAD_DUMP CRC(8b8f3d55) SHA1(54ebdeff4dd56a8bc2cd39bca1deada14bb90cce) ) // decap needed for verification + + ROM_REGION( 292480, "screen", 0) + ROM_LOAD( "gnw_dkong3.svg", 0, 292480, CRC(980d2486) SHA1(8578bdf4a3814401d9a79867252ee09ed7df253c) ) +ROM_END + + + + + +/*************************************************************************** + + Nintendo Micro Vs. System: Donkey Kong Hockey (model HK-303) + * PCB label HK-303M + * Sharp SM511 label HK-303 57XD (no decap) + * wide lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class gnw_dkhockey_state : public hh_sm510_state +{ +public: + gnw_dkhockey_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void gnw_dkhockey(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gnw_dkhockey ) + PORT_INCLUDE( microvs_shared ) + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Any Goal Scores 10 Points (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "P2 Goals Scores No Points (Cheat)") // " + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void gnw_dkhockey_state::gnw_dkhockey(machine_config &config) +{ + sm511_common(config, 1920, 579); +} + +// roms + +ROM_START( gnw_dkhockey ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "hk-303.program", 0x0000, 0x1000, CRC(dc73eec7) SHA1(daaca286de326321335fd26d9b435b444787f609) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "hk-303.melody", 0x000, 0x100, BAD_DUMP CRC(3f61032c) SHA1(b0fd9077fb5e59ca2787c828c78c35116c48c245) ) // decap needed for verification + + ROM_REGION( 263239, "screen", 0) + ROM_LOAD( "gnw_dkhockey.svg", 0, 263239, CRC(3a576c12) SHA1(9a7ca67c35fcfb5858227f3ef2a6027c877c64d3) ) +ROM_END + + + + + +/*************************************************************************** + + Telko Bassmate Computer (model BM-501) + * PCB label BM-501 + * Sharp SM511 label BM-501 556AA (no decap) + * vertical dual lcd screens with custom segments, 1-bit sound + + The Bassmate Computer was produced for Telko by Nintendo as an OEM product + and sold under different brands, i.e. Telko, KMV and Probe 2000. + + The hardware is identical as G&W Multi Screen, but it's not part of the game + series. + +***************************************************************************/ + +class bassmate_state : public hh_sm510_state +{ +public: + bassmate_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void bassmate(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( bassmate ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Compute") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Wind") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Cover") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time of Day") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Temp F") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Clarity") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Structure") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Depth(ft)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Season") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("BA") + PORT_CONFNAME( 0x01, 0x01, "Skip Compute Animation (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +void bassmate_state::bassmate(machine_config &config) +{ + sm511_dualv(config, 1920/2, 1253/2, 1920/2, 1273/2); +} + +// roms + +ROM_START( bassmate ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "bm-501.program", 0x0000, 0x1000, CRC(9bdd0501) SHA1(986b3b84184a987ae383c325700df21d8915f0e2) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "bm-501.melody", 0x000, 0x100, BAD_DUMP CRC(fbe15600) SHA1(8be64792fffe5b8913a55b9b2624dd57dc238be7) ) // decap needed for verification + + ROM_REGION( 42305, "screen_top", 0) + ROM_LOAD( "bassmate_top.svg", 0, 42305, CRC(0cc056fe) SHA1(4d0e5b115adf513f5b3148ca7e39e0acbafd925c) ) + + ROM_REGION( 19775, "screen_bottom", 0) + ROM_LOAD( "bassmate_bottom.svg", 0, 19775, CRC(9561d52d) SHA1(903ef3944810c0efdc02f46a619891c1ef17c483) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Double Dribble + * Sharp SM510 under epoxy (die label CMS54C, KMS584) + * lcd screen with custom segments, 1-bit sound + + BTANB: At the basket, the ball goes missing sometimes for 1 frame, or + may show 2 balls at the same time. It's the same on the real handheld. + BTANB: players flicker (increasing LCD delay won't improve it much) + Another BTANB? If a period is over at the same time a defender on the + 2nd column grabs the ball, his arm won't be erased until it's redrawn. + +***************************************************************************/ + +class kdribble_state : public hh_sm510_state +{ +public: + kdribble_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kdribble(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kdribble ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Level Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kdribble_state::kdribble(machine_config &config) +{ + sm510_common(config, 1524, 1080); // R mask option confirmed +} + +// roms + +ROM_START( kdribble ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) ) + + ROM_REGION( 450349, "screen", 0) + ROM_LOAD( "kdribble.svg", 0, 450349, CRC(0ea4153e) SHA1(b5deb398bb9f5e56e5bbcbe477d54528fb989487) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Top Gun + * PCB label BH003 + * Sharp SM510 under epoxy (die label CMS54C, KMS598) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ktopgun_state : public hh_sm510_state +{ +public: + ktopgun_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void ktopgun(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ktopgun ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void ktopgun_state::ktopgun(machine_config &config) +{ + sm510_common(config, 1515, 1080); // R mask option confirmed +} + +// roms + +ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) + + ROM_REGION( 425839, "screen", 0) + ROM_LOAD( "ktopgun.svg", 0, 425839, CRC(f0eb200f) SHA1(cbdc7cfaf1785b393c806dabd1a355d325bddc3f) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Contra + * PCB label BH002 + * Sharp SM511 under epoxy (die label KMS73B, KMS773) + * lcd screen with custom segments, 1-bit sound + + Contra handheld is titled simply "C" in the USA. + +***************************************************************************/ + +class kcontra_state : public hh_sm510_state +{ +public: + kcontra_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: score digit flickers + m_decay_len = 20; + } + + void kcontra(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kcontra ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kcontra_state::kcontra(machine_config &config) +{ + sm511_common(config, 1505, 1080); +} + +// roms + +ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) ) + + ROM_REGION( 721055, "screen", 0) + ROM_LOAD( "kcontra.svg", 0, 721055, CRC(f1ce8d19) SHA1(7d8f2fac40605a3fd6f1386c945a53412b2f2b15) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Teenage Mutant Ninja Turtles + * PCB label BH005 + * Sharp SM511 under epoxy (die label KMS73B, KMS774) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ktmnt_state : public hh_sm510_state +{ +public: + ktmnt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void ktmnt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ktmnt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void ktmnt_state::ktmnt(machine_config &config) +{ + sm511_common(config, 1505, 1080); +} + +// roms + +ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) ) + + ROM_REGION( 610309, "screen", 0) + ROM_LOAD( "ktmnt.svg", 0, 610309, CRC(9f48c50d) SHA1(917c0ed8e83d949e5115c897cacda8d60e42d74d) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Gradius + * PCB label BH004 + * Sharp SM511 under epoxy (die label KMS73B, KMS774) + * lcd screen with custom segments, 1-bit sound + + Known in Japan as Nemesis. + +***************************************************************************/ + +class kgradius_state : public hh_sm510_state +{ +public: + kgradius_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kgradius(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kgradius ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kgradius_state::kgradius(machine_config &config) +{ + sm511_common(config, 1420, 1080); +} + +// roms + +ROM_START( kgradius ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) ) + + ROM_REGION( 638136, "screen", 0) + ROM_LOAD( "kgradius.svg", 0, 638136, CRC(85dd296e) SHA1(bd75d0c08387a69bbcf4fd100252846499a261b3) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Lone Ranger + * PCB label BH009 + * Sharp SM511 under epoxy (die label KMS73B, KMS781) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kloneran_state : public hh_sm510_state +{ +public: + kloneran_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kloneran(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kloneran ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kloneran_state::kloneran(machine_config &config) +{ + sm511_common(config, 1497, 1080); +} + +// roms + +ROM_START( kloneran ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) ) + + ROM_REGION( 633161, "screen", 0) + ROM_LOAD( "kloneran.svg", 0, 633161, CRC(1fb937ff) SHA1(9e5841dc67e50b789f0161693ebbd75f79915980) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Blades of Steel + * PCB label BH011 + * Sharp SM511 under epoxy (die label KMS73B, KMS782) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kblades_state : public hh_sm510_state +{ +public: + kblades_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 25; + } + + void kblades(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kblades ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kblades_state::kblades(machine_config &config) +{ + sm511_common(config, 1516, 1080); +} + +// roms + +ROM_START( kblades ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) ) + + ROM_REGION( 455154, "screen", 0) + ROM_LOAD( "kblades.svg", 0, 455154, CRC(f17ec8ba) SHA1(ed999ef4b3f0ae94c243219ea8ea1eedd7179c26) ) +ROM_END + + + + + +/*************************************************************************** + + Konami NFL Football + * Sharp SM511 under epoxy (die label KMS73B, KMS786) + * lcd screen with custom segments, 1-bit sound + + This is the 1989 version. It was rereleased in 1992, assumed to be the same + game underneath. + +***************************************************************************/ + +class knfl_state : public hh_sm510_state +{ +public: + knfl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 35; + } + + void knfl(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( knfl ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void knfl_state::knfl(machine_config &config) +{ + sm511_common(config, 1449, 1080); +} + +// roms + +ROM_START( knfl ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) ) + + ROM_REGION( 571173, "screen", 0) + ROM_LOAD( "knfl.svg", 0, 571173, CRC(406c5bed) SHA1(1f3a704f091b78c89c06108ba11310f4072cc178) ) +ROM_END + + + + + +/*************************************************************************** + + Konami The Adventures of Bayou Billy + * Sharp SM511 under epoxy (die label KMS73B, KMS788) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kbilly_state : public hh_sm510_state +{ +public: + kbilly_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kbilly(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kbilly ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kbilly_state::kbilly(machine_config &config) +{ + sm511_common(config, 1490, 1080); +} + +// roms + +ROM_START( kbilly ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) ) + + ROM_REGION( 598317, "screen", 0) + ROM_LOAD( "kbilly.svg", 0, 598317, CRC(fec67ddf) SHA1(3e5f520733e8b720966028ed6a72062be5381f27) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Bucky O'Hare + * Sharp SM511 under epoxy (die label KMS73B, N58) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kbucky_state : public hh_sm510_state +{ +public: + kbucky_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void kbucky(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kbucky ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kbucky_state::kbucky(machine_config &config) +{ + sm511_common(config, 1490, 1080); +} + +// roms + +ROM_START( kbucky ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) ) + + ROM_REGION( 727879, "screen", 0) + ROM_LOAD( "kbucky.svg", 0, 727879, CRC(64cde7e6) SHA1(60c0120c7955a694bb07eb013e42c7a71757ab9f) ) +ROM_END + + + + + +/*************************************************************************** + + Konami Garfield + * Sharp SM511 under epoxy (die label KMS73B, N62) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class kgarfld_state : public hh_sm510_state +{ +public: + kgarfld_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + // increase lcd decay: too much overall flicker + m_decay_len = 30; + } + + void kgarfld(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( kgarfld ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") +INPUT_PORTS_END + +void kgarfld_state::kgarfld(machine_config &config) +{ + sm511_common(config, 1500, 1080); +} + +// roms + +ROM_START( kgarfld ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) ) + + ROM_REGION( 581147, "screen", 0) + ROM_LOAD( "kgarfld.svg", 0, 581147, CRC(ef2e5a61) SHA1(fbf0236cd0d4228403823d2623c6fd2d68349f7a) ) +ROM_END + + + + + +/*************************************************************************** + + Nelsonic Game Watches on SM530*, wristwatch with an LCD game on it. + *: Older games are on a different MCU, several seen with OKI MSM5055. + Newer ones: to be investigated, maybe SM5x. + + Hardware notes: + * Sharp SM530 under epoxy (die label KAS600 + ROM serial, see romdefs) + * lcd screen with custom segments, 1-bit sound + + Currently emulated in generic driver: + - Super Mario Bros. 3 + - Super Mario World (aka Super Mario Bros. 4) + + Different hardware: + - Star Fox (extra sound effect chip) + +***************************************************************************/ + +class gamewatch_state : public hh_sm510_state +{ +public: + gamewatch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void nsmb3(machine_config &config); + void nsmw(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( gamewatch ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // mode + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // set + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY +INPUT_PORTS_END + +void gamewatch_state::nsmb3(machine_config &config) +{ + sm530_common(config, 1000, 1000); + config.set_default_layout(layout_hh_sm500_test); +} + +void gamewatch_state::nsmw(machine_config &config) +{ + sm530_common(config, 1000, 1000); + config.set_default_layout(layout_hh_sm500_test); +} + +// roms + +ROM_START( nsmb3 ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "633.program", 0x000, 0x800, CRC(a981b540) SHA1(1271d15e6168d73852f8ade9ade4d5f3b1838bf5) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "633.melody", 0x000, 0x100, CRC(98340c46) SHA1(94b5865fc669b7f6487845647866c06f4f581f63) ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "nsmb3.svg", 0, 100000, NO_DUMP ) +ROM_END + +ROM_START( nsmw ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "636.program", 0x000, 0x800, CRC(56a705fa) SHA1(384ba68e597c7901cc9db2eb991cb80049113503) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "636.melody", 0x000, 0x100, CRC(5df99e13) SHA1(98d5f78b5bcf59a232ccb5c61210568948c4501b) ) + + ROM_REGION( 100000, "screen", 0) + ROM_LOAD( "nsmw.svg", 0, 100000, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Nelsonic Star Fox (Game Watch) + * Sharp SM530 under epoxy (die label KAS600, 643) + * sound effect chip under epoxy (die label HMC, HA1152_001A) + * lcd screen with custom segments, 1-bit sound + + Two versions are known, with different shape/button layout, but assumed + to be the exact same game. + + The HMC sound effect chip is very similar (possibly the same one) as found + in electronic toys such as the Executor keychain. There are 8 sound effects + in the ROM, only 3 are used in Star Fox. + +***************************************************************************/ + +class nstarfox_state : public hh_sm510_state +{ +public: + nstarfox_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void nstarfox(machine_config &config); + +private: + void sound_w(u8 data); +}; + +// handlers + +void nstarfox_state::sound_w(u8 data) +{ + // S2-S4: falling edge starts sound effect +} + +// config + +static INPUT_PORTS_START( nstarfox ) + PORT_INCLUDE( gamewatch ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // laser + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // bomb +INPUT_PORTS_END + +void nstarfox_state::nstarfox(machine_config &config) +{ + sm530_common(config, 1176, 1080); + m_maincpu->write_s().set(FUNC(nstarfox_state::sound_w)); +} + +// roms + +ROM_START( nstarfox ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "643.program", 0x000, 0x800, CRC(ac1f5c68) SHA1(165cefeba9abc8725e55d15fdc218b07857d4cfe) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "643.melody", 0x000, 0x100, CRC(6684f6b7) SHA1(32056467f796cb2e3c9f05c364419e7935fd1361) ) + + ROM_REGION( 0x80, "sfx", 0) + ROM_LOAD( "ha1152_001a", 0x00, 0x80, CRC(fba00b7c) SHA1(5dfb15eee3c57bbca80f485f68442e5f7c6bc5e4) ) + + ROM_REGION( 155284, "screen", 0) + ROM_LOAD( "nstarfox.svg", 0, 155284, CRC(843c0fa2) SHA1(bed08fcc8e9fd20624052d91db90923897a1cf7c) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Gauntlet (model 7-778), Robin Hood (model 7-861) + * Sharp SM510 under epoxy (die label CMS54C, KMS583) + * lcd screen with custom segments, 1-bit sound + + known releases (Gauntlet): + - World: Gauntlet, published by Tiger + - Japan: Gauntlet, published by Sega + - UK: Gauntlet, published by Grandstand + + Robin Hood is the same MCU/ROM, different LCD. + +***************************************************************************/ + +class tgaunt_state : public hh_sm510_state +{ +public: + tgaunt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobhood(machine_config &config); + void tgaunt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgaunt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Bomb") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Key") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( trobhood ) + PORT_INCLUDE( tgaunt ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Money") +INPUT_PORTS_END + +void tgaunt_state::tgaunt(machine_config &config) +{ + sm510_tiger(config, 1425, 1080); +} + +void tgaunt_state::trobhood(machine_config &config) +{ + sm510_tiger(config, 1468, 1080); +} + +// roms + +ROM_START( tgaunt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) + + ROM_REGION( 713071, "screen", 0) + ROM_LOAD( "tgaunt.svg", 0, 713071, CRC(b2dfb31b) SHA1(3e57c6aaa665e2874e6e7e051245a81ab7a917b3) ) +ROM_END + +ROM_START( trobhood ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) + + ROM_REGION( 704816, "screen", 0) + ROM_LOAD( "trobhood.svg", 0, 704816, CRC(f4b94f32) SHA1(8f68a7f4240489d42934d3875f82456aceabfb48) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Double Dragon (model 7-780) + * Sharp SM510 under epoxy (die label CMS54C, KMS570, 593) + * lcd screen with custom segments, 1-bit sound + + BTANB: On the baddie in the background throwing dynamite, the sparks + above his head are the same segment as the body, not the arm. + +***************************************************************************/ + +class tddragon_state : public hh_sm510_state +{ +public: + tddragon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tddragon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tddragon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sway") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tddragon_state::tddragon(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); // R mask option confirmed +} + +// roms + +ROM_START( tddragon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) ) + + ROM_REGION( 511477, "screen", 0) + ROM_LOAD( "tddragon.svg", 0, 511477, CRC(d3046671) SHA1(15fd328e28362402eab1094851dddd8e20a0bcec) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Karnov (model 7-783) + * Sharp SM510 under epoxy (die label CMS54C, KMS582) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tkarnov_state : public hh_sm510_state +{ +public: + tkarnov_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tkarnov(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tkarnov ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire-Ball") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Boomerang") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tkarnov_state::tkarnov(machine_config &config) +{ + sm510_tiger(config, 1477, 1080); +} + +// roms + +ROM_START( tkarnov ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) ) + + ROM_REGION( 527432, "screen", 0) + ROM_LOAD( "tkarnov.svg", 0, 527432, CRC(9317066c) SHA1(087cfde97e106c6fd8c52d3a1138e6bde2ad9289) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Vindicators (model 7-786) + * Sharp SM510 under epoxy (die label CMS54C, KMS595) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tvindictr_state : public hh_sm510_state +{ +public: + tvindictr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tvindictr(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tvindictr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tvindictr_state::tvindictr(machine_config &config) +{ + sm510_tiger(config, 1459, 1080); +} + +// roms + +ROM_START( tvindictr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) ) + + ROM_REGION( 314205, "screen", 0) + ROM_LOAD( "tvindictr.svg", 0, 314205, CRC(fefe9f31) SHA1(3c8e7ab2cd81de72740b2948def07a2fc000a78a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Ninja Gaiden (model 7-787) + * Sharp SM510 under epoxy (die label M82) + * lcd screen with custom segments, 1 led, 1-bit sound + +***************************************************************************/ + +class tgaiden_state : public hh_sm510_state +{ +public: + tgaiden_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag), + m_led_out(*this, "led") + { + inp_fixed_last(); + } + + void tgaiden(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // R2 connects to a single LED behind the screen + void led_w(u8 data) { m_led_out = data >> 1 & 1; } + output_finder<> m_led_out; +}; + +void tgaiden_state::machine_start() +{ + hh_sm510_state::machine_start(); + m_led_out.resolve(); +} + +// config + +static INPUT_PORTS_START( tgaiden ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgaiden_state::tgaiden(machine_config &config) +{ + sm510_tiger(config, 1476, 1080); + m_maincpu->write_r().append(FUNC(tgaiden_state::led_w)); +} + +// roms + +ROM_START( tgaiden ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) ) + + ROM_REGION( 588916, "screen", 0) + ROM_LOAD( "tgaiden.svg", 0, 588916, CRC(5845c630) SHA1(c4b0d4d85e4b58a051920b6b34668847049c57a7) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman (model 7-799) + * Sharp SM510 under epoxy (die label CMS54C, KMS597) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbatman_state : public hh_sm510_state +{ +public: + tbatman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatman ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatman_state::tbatman(machine_config &config) +{ + sm510_tiger(config, 1442, 1080); +} + +// roms + +ROM_START( tbatman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) ) + + ROM_REGION( 551931, "screen", 0) + ROM_LOAD( "tbatman.svg", 0, 551931, CRC(95ae104b) SHA1(0508f925f29b2152b41c478447e63c74fce718ad) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Space Harrier II (model 7-814) + * Sharp SM510 under epoxy (die label M91) + * lcd screen with custom segments, 1-bit sound + + known releases: + - World: Space Harrier II, published by Tiger + - Japan: Space Harrier, published by Sega + +***************************************************************************/ + +class tsharr2_state : public hh_sm510_state +{ +public: + tsharr2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsharr2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsharr2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsharr2_state::tsharr2(machine_config &config) +{ + sm510_tiger(config, 1493, 1080); // R mask option confirmed +} + +// roms + +ROM_START( tsharr2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) ) + + ROM_REGION( 555177, "screen", 0) + ROM_LOAD( "tsharr2.svg", 0, 555177, CRC(842f8f7e) SHA1(2c523531059acdfa3a0cebac9d8f84f1971e1086) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Strider (model 7-815) + * Sharp SM510 under epoxy (die label M92) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tstrider_state : public hh_sm510_state +{ +public: + tstrider_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tstrider(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tstrider ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Weapon") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tstrider_state::tstrider(machine_config &config) +{ + sm510_tiger(config, 1479, 1080); +} + +// roms + +ROM_START( tstrider ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) ) + + ROM_REGION( 554858, "screen", 0) + ROM_LOAD( "tstrider.svg", 0, 554858, CRC(12767799) SHA1(9d67a96affee18dacaf3d49d89f60940c33492aa) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Golden Axe (model 7-817) + * Sharp SM510 under epoxy (die label M94) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tgoldnaxe_state : public hh_sm510_state +{ +public: + tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tgoldnaxe(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgoldnaxe ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Magic") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgoldnaxe_state::tgoldnaxe(machine_config &config) +{ + sm510_tiger(config, 1456, 1080); +} + +// roms + +ROM_START( tgoldnaxe ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) ) + + ROM_REGION( 605525, "screen", 0) + ROM_LOAD( "tgoldnaxe.svg", 0, 605525, CRC(9c1097c5) SHA1(bf9c2a1f4ae98ebe5eb9d381b0729588a150fa27) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Robocop 2 (model 7-830), The Rocketeer (model 7-864) + * Sharp SM510 under epoxy (die label M96) + * lcd screen with custom segments, 1-bit sound + + The Rocketeer is the same MCU/ROM, different LCD. + +***************************************************************************/ + +class trobocop2_state : public hh_sm510_state +{ +public: + trobocop2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobocop2(machine_config &config); + void trockteer(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trobocop2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +static INPUT_PORTS_START( trockteer ) + PORT_INCLUDE( trobocop2 ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Up/Rocket Pack") + + PORT_MODIFY("IN.3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Right") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Left") +INPUT_PORTS_END + +void trobocop2_state::trobocop2(machine_config &config) +{ + sm510_tiger(config, 1487, 1080); +} + +void trobocop2_state::trockteer(machine_config &config) +{ + sm510_tiger(config, 1463, 1080); +} + +// roms + +ROM_START( trobocop2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) + + ROM_REGION( 463572, "screen", 0) + ROM_LOAD( "trobocop2.svg", 0, 463572, CRC(0218c1d9) SHA1(2932825ca03e008e5c2993882d363ae00df43f26) ) +ROM_END + +ROM_START( trockteer ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) + + ROM_REGION( 558128, "screen", 0) + ROM_LOAD( "trockteer.svg", 0, 558128, CRC(70ff1f46) SHA1(5cd94655654614206ed11844ba31650edb51eb22) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Altered Beast (model 7-831) + * Sharp SM510 under epoxy (die label M88) + * lcd screen with custom segments, 1-bit sound + + known releases: + - World: Altered Beast, published by Tiger + - Japan: Juuouki, published by Sega + +***************************************************************************/ + +class taltbeast_state : public hh_sm510_state +{ +public: + taltbeast_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void taltbeast(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( taltbeast ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick/Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void taltbeast_state::taltbeast(machine_config &config) +{ + sm510_tiger(config, 1455, 1080); // R mask option confirmed +} + +// roms + +ROM_START( taltbeast ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) ) + + ROM_REGION( 667931, "screen", 0) + ROM_LOAD( "taltbeast.svg", 0, 667931, CRC(a642d5f7) SHA1(ad005deaa35189e59317a07d860403adeef51aad) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Street Fighter 2010 - The Final Fight (model 7-837) + * Sharp SM510 under epoxy (die label MA2) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsf2010_state : public hh_sm510_state +{ +public: + tsf2010_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsf2010(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsf2010 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select Planet") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsf2010_state::tsf2010(machine_config &config) +{ + sm510_tiger(config, 1465, 1080); +} + +// roms + +ROM_START( tsf2010 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) ) + + ROM_REGION( 595191, "screen", 0) + ROM_LOAD( "tsf2010.svg", 0, 595191, CRC(78f96bad) SHA1(4389580e3d47dda0243b01625427013eb7ec4336) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Swamp Thing (model 7-851) + * Sharp SM510 under epoxy (die label MB0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tswampt_state : public hh_sm510_state +{ +public: + tswampt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tswampt(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tswampt ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tswampt_state::tswampt(machine_config &config) +{ + sm510_tiger(config, 1450, 1080); +} + +// roms + +ROM_START( tswampt ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) ) + + ROM_REGION( 578544, "screen", 0) + ROM_LOAD( "tswampt.svg", 0, 578544, CRC(921e2b43) SHA1(176426fe9bf4855256e0ff7804ca48e619fa0cf3) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Spider-Man (model 7-853) + * Sharp SM510 under epoxy (die label MA5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tspidman_state : public hh_sm510_state +{ +public: + tspidman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tspidman(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tspidman ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right/Kick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up/Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left/Rescue") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tspidman_state::tspidman(machine_config &config) +{ + sm510_tiger(config, 1440, 1080); +} + +// roms + +ROM_START( tspidman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) ) + + ROM_REGION( 605375, "screen", 0) + ROM_LOAD( "tspidman.svg", 0, 605375, CRC(6c032ce4) SHA1(69043096e28709821ddc26ef05f60f353fc3e35d) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger X-Men (model 7-854) + * Sharp SM510 under epoxy (die label MA7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class txmen_state : public hh_sm510_state +{ +public: + txmen_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void txmen(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( txmen ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Claws") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void txmen_state::txmen(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( txmen ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) ) + + ROM_REGION( 543273, "screen", 0) + ROM_LOAD( "txmen.svg", 0, 543273, CRC(039b37bb) SHA1(bd57cba8f380185beda2eb5ea7b5d1f25c8d447b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Double Dragon 3 - The Rosetta Stone (model 7-858) + * Sharp SM510 under epoxy (die label MA6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tddragon3_state : public hh_sm510_state +{ +public: + tddragon3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tddragon3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tddragon3 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tddragon3_state::tddragon3(machine_config &config) +{ + sm510_tiger(config, 1514, 1080); +} + +// roms + +ROM_START( tddragon3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) ) + + ROM_REGION( 615734, "screen", 0) + ROM_LOAD( "tddragon3.svg", 0, 615734, CRC(4c94d574) SHA1(e2717db6c0279da4813550f0035a23bdaaa8b7bb) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Flash (model 7-859) + * Sharp SM510 under epoxy (die label MB5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tflash_state : public hh_sm510_state +{ +public: + tflash_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tflash(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tflash ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Brake") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Run") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tie") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tflash_state::tflash(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tflash ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) ) + + ROM_REGION( 587863, "screen", 0) + ROM_LOAD( "tflash.svg", 0, 587863, CRC(8ddb9391) SHA1(fa8b4610a914de8ae95123c4273a12cdb4353a39) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger MC Hammer: U Can't Touch This (model 7-863) + * Sharp SM511 under epoxy (die label N63) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tmchammer_state : public hh_sm510_state +{ +public: + tmchammer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tmchammer(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tmchammer ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Up") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Up/Jump") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Right") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Left") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Down") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tmchammer_state::tmchammer(machine_config &config) +{ + sm511_tiger1bit(config, 1471, 1080); +} + +// roms + +ROM_START( tmchammer ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) ) + + ROM_REGION( 456487, "screen", 0) + ROM_LOAD( "tmchammer.svg", 0, 456487, CRC(1cd10ff3) SHA1(092396c56adae7f872c3b5916ef3ecf67ab30161) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Battletoads (model 7-868) + * Sharp SM510 under epoxy (die label MB3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbtoads_state : public hh_sm510_state +{ +public: + tbtoads_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbtoads(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbtoads ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbtoads_state::tbtoads(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( tbtoads ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) ) + + ROM_REGION( 694417, "screen", 0) + ROM_LOAD( "tbtoads.svg", 0, 694417, CRC(c0fbc25d) SHA1(def54ab2f10123246f7809fc3caf3e9d26800f87) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Hook (model 7-869) + * Sharp SM510 under epoxy (die label MB7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thook_state : public hh_sm510_state +{ +public: + thook_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thook(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thook ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Up") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Down/Dodge") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thook_state::thook(machine_config &config) +{ + sm510_tiger(config, 1489, 1080); +} + +// roms + +ROM_START( thook ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) ) + + ROM_REGION( 680544, "screen", 0) + ROM_LOAD( "thook.svg", 0, 680544, CRC(bddefb9b) SHA1(438b0fe6f4c0196952bd179075498d6bd19c3e48) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Back to the Future (model 7-809) + * Sharp SM510 under epoxy (die label MC3) + * lcd screen with custom segments, 1-bit sound + + This game is from 1992, even though the model number suggests otherwise. + Perhaps Tiger filled unused model numbers before switching to 78-xxx. + +***************************************************************************/ + +class tbttf_state : public hh_sm510_state +{ +public: + tbttf_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbttf(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbttf ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Repair") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbttf_state::tbttf(machine_config &config) +{ + sm510_tiger(config, 1466, 1080); +} + +// roms + +ROM_START( tbttf ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) ) + + ROM_REGION( 667741, "screen", 0) + ROM_LOAD( "tbttf.svg", 0, 667741, CRC(1a57e35a) SHA1(9b622e08cc44e3d48b71a283cd07b89fbcc6faa4) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Addams Family (model 7-829) + * Sharp SM510 under epoxy (die label MC2) + * lcd screen with custom segments, 1-bit sound + + Like Back to the Future, this game is newer than the model number suggests. + +***************************************************************************/ + +class taddams_state : public hh_sm510_state +{ +public: + taddams_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void taddams(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( taddams ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Take") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void taddams_state::taddams(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( taddams ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) ) + + ROM_REGION( 554703, "screen", 0) + ROM_LOAD( "taddams.svg", 0, 554703, CRC(85f15123) SHA1(088dbfbe760b782988bbfe6d29d89b8427844992) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Home Alone (model 78-502) + * Sharp SM510 under epoxy (die label MC7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thalone_state : public hh_sm510_state +{ +public: + thalone_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thalone(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thalone ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thalone_state::thalone(machine_config &config) +{ + sm510_tiger(config, 1448, 1080); +} + +// roms + +ROM_START( thalone ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) ) + + ROM_REGION( 494279, "screen", 0) + ROM_LOAD( "thalone.svg", 0, 494279, CRC(2479d88d) SHA1(061413d6e0893106b335ca42cf0260f45c7dacc7) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger X-Men - Project X (model 78-504) + * Sharp SM510 under epoxy (die label MD3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class txmenpx_state : public hh_sm510_state +{ +public: + txmenpx_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void txmenpx(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( txmenpx ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Move") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void txmenpx_state::txmenpx(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( txmenpx ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) ) + + ROM_REGION( 572583, "screen", 0) + ROM_LOAD( "txmenpx.svg", 0, 572583, CRC(b98f3134) SHA1(78ac7cd32b36f214b5e6eada725378ccbca91987) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Home Alone 2 - Lost in New York (model 78-506) + * Sharp SM510 under epoxy (die label MD7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class thalone2_state : public hh_sm510_state +{ +public: + thalone2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void thalone2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( thalone2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb/Pick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void thalone2_state::thalone2(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( thalone2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) ) + + ROM_REGION( 748928, "screen", 0) + ROM_LOAD( "thalone2.svg", 0, 748928, CRC(d42ec743) SHA1(7df9654b7f700662f29ca7cabe25ac78b2c4b04b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sonic The Hedgehog (model 78-513) + * Sharp SM511 under epoxy (die label KMS73B, N71) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tsonic_state : public hh_sm510_state +{ +public: + tsonic_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsonic(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsonic ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump Up + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Super Sonic Spin + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsonic_state::tsonic(machine_config &config) +{ + sm511_tiger2bit(config, 1517, 1080); +} + +// roms + +ROM_START( tsonic ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) ) + + ROM_REGION( 541491, "screen", 0) + ROM_LOAD( "tsonic.svg", 0, 541491, CRC(ac6bff26) SHA1(fa944958eb64e8283d35951ff105cead28e6ab8a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Robocop 3 (model 78-514) + * Sharp SM510 under epoxy (die label MC6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class trobocop3_state : public hh_sm510_state +{ +public: + trobocop3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void trobocop3(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trobocop3 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Fly") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trobocop3_state::trobocop3(machine_config &config) +{ + sm510_tiger(config, 1464, 1080); +} + +// roms + +ROM_START( trobocop3 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) ) + + ROM_REGION( 612142, "screen", 0) + ROM_LOAD( "trobocop3.svg", 0, 612142, CRC(b55c1440) SHA1(e8f692deecf489be22be570510175b750d65d5c5) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Incredible Crash Dummies (model 78-516) + * Sharp SM510 under epoxy (die label ME0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tdummies_state : public hh_sm510_state +{ +public: + tdummies_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tdummies(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tdummies ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Crash") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tdummies_state::tdummies(machine_config &config) +{ + sm510_tiger(config, 1441, 1080); +} + +// roms + +ROM_START( tdummies ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) ) + + ROM_REGION( 525535, "screen", 0) + ROM_LOAD( "tdummies.svg", 0, 525535, CRC(b0db8655) SHA1(937b3edd9c0949b9f7d01ef8920ac63b61e64909) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Street Fighter II (model 78-522) + * Sharp SM510 under epoxy (die label ME1) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsfight2_state : public hh_sm510_state +{ +public: + tsfight2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsfight2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsfight2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Special Move") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsfight2_state::tsfight2(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tsfight2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) ) + + ROM_REGION( 630444, "screen", 0) + ROM_LOAD( "tsfight2.svg", 0, 630444, CRC(42b82c9b) SHA1(8e18d0cfd629478973f2c857105daad70eae46d9) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Wayne's World (model 78-523) + * Sharp SM510 under epoxy (die label ME7) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class twworld_state : public hh_sm510_state +{ +public: + twworld_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void twworld(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( twworld ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("High Five") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Cassandra") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void twworld_state::twworld(machine_config &config) +{ + sm510_tiger(config, 1429, 1080); +} + +// roms + +ROM_START( twworld ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) ) + + ROM_REGION( 527901, "screen", 0) + ROM_LOAD( "twworld.svg", 0, 527901, CRC(515fede8) SHA1(e9c5adfb02b860fb97968957f282e685b1a4e3bc) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Jurassic Park (model 78-524) + * Sharp SM510 under epoxy (die label MF4) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tjpark_state : public hh_sm510_state +{ +public: + tjpark_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tjpark(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tjpark ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Climb") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing/Power") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Forward") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tjpark_state::tjpark(machine_config &config) +{ + sm510_tiger(config, 1454, 1080); +} + +// roms + +ROM_START( tjpark ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) ) + + ROM_REGION( 812619, "screen", 0) + ROM_LOAD( "tjpark.svg", 0, 812619, CRC(04d85ec6) SHA1(97f67bb496d985b62dc094f6f1d6b5597a4df895) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sonic The Hedgehog 2 (model 78-527) + * Sharp SM511 under epoxy (die label N86) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tsonic2_state : public hh_sm510_state +{ +public: + tsonic2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsonic2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsonic2 ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsonic2_state::tsonic2(machine_config &config) +{ + sm511_tiger2bit(config, 1475, 1080); +} + +// roms + +ROM_START( tsonic2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) ) + + ROM_REGION( 667927, "screen", 0) + ROM_LOAD( "tsonic2.svg", 0, 667927, CRC(d2c52e67) SHA1(24ffbc8fae606dcd2f60a4d95fe1dcfd261c3576) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Super Double Dragon (model 78-528) + * Sharp SM510 under epoxy (die label MF5) + * lcd screen with custom segments, 1-bit sound + + BTANB: The player char right arm muscle is part of the right kick segment. + They probably meant to use it for the right punch segment, but this is + how it shows on the LCD. + +***************************************************************************/ + +class tsddragon_state : public hh_sm510_state +{ +public: + tsddragon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsddragon(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsddragon ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Special Technique") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsddragon_state::tsddragon(machine_config &config) +{ + sm510_tiger(config, 1503, 1080); +} + +// roms + +ROM_START( tsddragon ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) ) + + ROM_REGION( 753572, "screen", 0) + ROM_LOAD( "tsddragon.svg", 0, 753572, CRC(0759388b) SHA1(4e4acb1b97845e529522ba21de846ce1dc74357d) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Dennis the Menace (model 78-532) + * Sharp SM510 under epoxy (die label MF9) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tdennis_state : public hh_sm510_state +{ +public: + tdennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tdennis(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tdennis ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Left") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tdennis_state::tdennis(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( tdennis ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) ) + + ROM_REGION( 754896, "screen", 0) + ROM_LOAD( "tdennis.svg", 0, 754896, CRC(6e7512c3) SHA1(b84ef988051a6a883f3435a779ea67e544d50dae) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Nightmare Before Christmas (model 78-537) + * Sharp SM510 under epoxy (die label MG0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tnmarebc_state : public hh_sm510_state +{ +public: + tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tnmarebc(machine_config &config); + +private: + virtual void input_w(u8 data) override; +}; + +// handlers + +void tnmarebc_state::input_w(u8 data) +{ + // S5 and S6 tied together + hh_sm510_state::input_w((data & 0x1f) | (data >> 1 & 0x10)); +} + +// config + +static INPUT_PORTS_START( tnmarebc ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5/S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tnmarebc_state::tnmarebc(machine_config &config) +{ + sm510_tiger(config, 1456, 1080); +} + +// roms + +ROM_START( tnmarebc ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) ) + + ROM_REGION( 631351, "screen", 0) + ROM_LOAD( "tnmarebc.svg", 0, 631351, CRC(140e278b) SHA1(f0d2b6e6ee2328f54255532ad03d5d505ebbb23b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Transformers - Generation 2 (model 78-541) + * Sharp SM510 under epoxy (die label MG2) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class ttransf2_state : public hh_sm510_state +{ +public: + ttransf2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void ttransf2(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( ttransf2 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Transform") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void ttransf2_state::ttransf2(machine_config &config) +{ + sm510_tiger(config, 1476, 1080); +} + +// roms + +ROM_START( ttransf2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) ) + + ROM_REGION( 727708, "screen", 0) + ROM_LOAD( "ttransf2.svg", 0, 727708, CRC(bd527f23) SHA1(9ce35bbfe1ea61c431eccaf32274faa4181587da) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Operation: Aliens (model 78-552) + * Sharp SM510 under epoxy (die label MJ1) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class topaliens_state : public hh_sm510_state +{ +public: + topaliens_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void topaliens(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( topaliens ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void topaliens_state::topaliens(machine_config &config) +{ + sm510_tiger(config, 1450, 1080); +} + +// roms + +ROM_START( topaliens ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) ) + + ROM_REGION( 1214917, "screen", 0) + ROM_LOAD( "topaliens.svg", 0, 1214917, CRC(cbd57ab4) SHA1(efac0833f421212a81a8fc9b35c97369375aa1a9) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Mortal Kombat (model 78-553) + * Sharp SM510 under epoxy (die label MG6) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tmkombat_state : public hh_sm510_state +{ +public: + tmkombat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tmkombat(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tmkombat ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch High") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick High") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Low") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Low") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tmkombat_state::tmkombat(machine_config &config) +{ + sm510_tiger(config, 1468, 1080); +} + +// roms + +ROM_START( tmkombat ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) ) + + ROM_REGION( 841871, "screen", 0) + ROM_LOAD( "tmkombat.svg", 0, 841871, CRC(3bd5a963) SHA1(4d093f34c64caf60233e156fe160d8fceb15b6c6) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger The Shadow (model 78-559) + * Sharp SM510 under epoxy (die label MJ5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tshadow_state : public hh_sm510_state +{ +public: + tshadow_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tshadow(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tshadow ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shadow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tshadow_state::tshadow(machine_config &config) +{ + sm510_tiger(config, 1484, 1080); +} + +// roms + +ROM_START( tshadow ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) ) + + ROM_REGION( 946494, "screen", 0) + ROM_LOAD( "tshadow.svg", 0, 946494, CRC(e62de82e) SHA1(94fcef33066e97266efcd0d91b60229859088b36) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Skeleton Warriors - The Dark Crusade (model 78-569) + * Sharp SM510 under epoxy (die label MK0) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tskelwarr_state : public hh_sm510_state +{ +public: + tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tskelwarr(machine_config &); +}; + +// config + +static INPUT_PORTS_START( tskelwarr ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tskelwarr_state::tskelwarr(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tskelwarr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) ) + + ROM_REGION( 1125043, "screen", 0) + ROM_LOAD( "tskelwarr.svg", 0, 1125043, CRC(ee086073) SHA1(70e06a7fe8a1a8b8fee483c08522996da9917501) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman Forever - Double Dose of Doom (model 78-572) + * Sharp SM510 under epoxy (die label MK3) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tbatfor_state : public hh_sm510_state +{ +public: + tbatfor_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatfor(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatfor ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Grappling Gun") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Help") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Batarang") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatfor_state::tbatfor(machine_config &config) +{ + sm510_tiger(config, 1493, 1080); +} + +// roms + +ROM_START( tbatfor ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) ) + + ROM_REGION( 902412, "screen", 0) + ROM_LOAD( "tbatfor.svg", 0, 902412, CRC(d92d799e) SHA1(fa8b4198099748570a9cc9772c81aa583ac7ea72) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Judge Dredd (model 78-581) + * Sharp SM510 under epoxy (die label MK5) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tjdredd_state : public hh_sm510_state +{ +public: + tjdredd_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tjdredd(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tjdredd ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tjdredd_state::tjdredd(machine_config &config) +{ + sm510_tiger(config, 1444, 1080); +} + +// roms + +ROM_START( tjdredd ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) ) + + ROM_REGION( 1051637, "screen", 0) + ROM_LOAD( "tjdredd.svg", 0, 1051637, CRC(0f3541c6) SHA1(9838e2ae5806a48be595f53e6096b7c150b91651) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Apollo 13 (model 78-591) + * Sharp SM510 under epoxy (die label 10 07) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tapollo13_state : public hh_sm510_state +{ +public: + tapollo13_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tapollo13(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tapollo13 ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Parachute") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Capture") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tapollo13_state::tapollo13(machine_config &config) +{ + sm510_tiger(config, 1467, 1080); +} + +// roms + +ROM_START( tapollo13 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) ) + + ROM_REGION( 643219, "screen", 0) + ROM_LOAD( "tapollo13.svg", 0, 643219, CRC(f4b94141) SHA1(d67367212f2be1685de0f3acaebaae0dc67734c4) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger 007: GoldenEye (model 78-594) + * Sharp SM510 under epoxy (die label 10 06) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tgoldeye_state : public hh_sm510_state +{ +public: + tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tgoldeye(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tgoldeye ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Q") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tgoldeye_state::tgoldeye(machine_config &config) +{ + sm510_tiger(config, 1461, 1080); +} + +// roms + +ROM_START( tgoldeye ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) ) + + ROM_REGION( 938956, "screen", 0) + ROM_LOAD( "tgoldeye.svg", 0, 938956, CRC(c4ad9836) SHA1(23555bd5fdaebed190ce02054a8ee681c88a8afb) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Kazaam (model 78-613) + * Sharp SM510 under epoxy (die label KMS10, 18) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tkazaam_state : public hh_sm510_state +{ +public: + tkazaam_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tkazaam(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tkazaam ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Rescue") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Back") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tkazaam_state::tkazaam(machine_config &config) +{ + sm510_tiger(config, 1452, 1080); // no external XTAL +} + +// roms + +ROM_START( tkazaam ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_18", 0x0000, 0x1000, CRC(aa796372) SHA1(fdaea736e1df46c19fca08ed981e9659e038d15a) ) + + ROM_REGION( 929109, "screen", 0) + ROM_LOAD( "tkazaam.svg", 0, 929109, CRC(5eb178d4) SHA1(bcf64df4f342d16d5fd3d4cb503fceb1e5485591) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Space Jam (model 78-621) + * Sharp SM510 under epoxy (die label KMS10, 23) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tsjam_state : public hh_sm510_state +{ +public: + tsjam_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tsjam(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tsjam ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Block") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tune/Steal") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tsjam_state::tsjam(machine_config &config) +{ + sm510_tiger(config, 1421, 1080); // no external XTAL +} + +// roms + +ROM_START( tsjam ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) ) + + ROM_REGION( 1046158, "screen", 0) + ROM_LOAD( "tsjam.svg", 0, 1046158, CRC(29187365) SHA1(f277a064e6ecd6219c930736a0bdf56196279b42) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Independence Day (model 78-624) + * Sharp SM510 under epoxy (die label 10 16) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class tinday_state : public hh_sm510_state +{ +public: + tinday_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tinday(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tinday ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alert") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Velocity") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tinday_state::tinday(machine_config &config) +{ + sm510_tiger(config, 1463, 1080); +} + +// roms + +ROM_START( tinday ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) ) + + ROM_REGION( 1162716, "screen", 0) + ROM_LOAD( "tinday.svg", 0, 1162716, CRC(97056e62) SHA1(0348f0aca5d9b8e24f83c7e73b5e31f419fe60df) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Batman: The Animated Series (model 72-505) + * Sharp SM511 under epoxy (die label N81) + * lcd screen with custom segments, 2-bit sound + +***************************************************************************/ + +class tbatmana_state : public hh_sm510_state +{ +public: + tbatmana_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { + inp_fixed_last(); + } + + void tbatmana(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( tbatmana ) + PORT_START("IN.0") // S2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fast") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S5 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw/Attack") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // S6 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // GND! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void tbatmana_state::tbatmana(machine_config &config) +{ + sm511_tiger2bit(config, 1478, 1080); +} + +// roms + +ROM_START( tbatmana ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) ) + + ROM_REGION( 618872, "screen", 0) + ROM_LOAD( "tbatmana.svg", 0, 618872, CRC(8c721273) SHA1(d8c52441466943254bffcd6449af47a9fad6296b) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica Shuttle Voyage (MG-8) + * Sharp SM510 label 0019 238E TRONICA (no decap) + * lcd screen with custom segments, 1-bit sound + + Even though the serial is MG-8, the back of the game says 1983, newer than MG-9? + Thief in Garden (model TG-18) is the exact same MCU, but different graphics. + +***************************************************************************/ + +class trshutvoy_state : public hh_sm510_state +{ +public: + trshutvoy_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trshutvoy(machine_config &config); + void tigarden(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trshutvoy ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // S6 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F + + PORT_START("IN.7") // S8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") + + PORT_START("FAKE") // Up/Sound are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") +INPUT_PORTS_END + +void trshutvoy_state::trshutvoy(machine_config &config) +{ + sm510_common(config, 1496, 1080); // R mask option confirmed +} + +void trshutvoy_state::tigarden(machine_config &config) +{ + sm510_common(config, 1515, 1080); +} + +// roms + +ROM_START( trshutvoy ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) + + ROM_REGION( 221748, "screen", 0) + ROM_LOAD( "trshutvoy.svg", 0, 221748, CRC(9e630b4e) SHA1(7e2a3a82519f29f7b1b92930604e010b5b9fdb06) ) +ROM_END + +ROM_START( tigarden ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) + + ROM_REGION( 409134, "screen", 0) + ROM_LOAD( "tigarden.svg", 0, 409134, CRC(628f4aee) SHA1(5fa4843be61b52660a932e0d1efad403cf12de88) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica: Space Rescue (model MG-9), Thunder Ball (model FR-23) + * PCB labels: SPACE RESCUE MG-9 080492 (MG-9) + SPACE RESCUE MG-9 210982 (FR-23) + * Sharp SM510 labels (no decap): 0015 224B TRONICA (MG-9) + 0015 236D TRONICA (FR-23) + * lcd screen with custom segments, 1-bit sound + +***************************************************************************/ + +class trsrescue_state : public hh_sm510_state +{ +public: + trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trsrescue(machine_config &config); + void trthuball(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( trsrescue ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + + PORT_START("B") + PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trsrescue_state::trsrescue(machine_config &config) +{ + sm510_common(config, 1533, 1080); // R mask option confirmed +} + +void trsrescue_state::trthuball(machine_config &config) +{ + sm510_common(config, 1599, 1080); // R mask option confirmed +} + +// roms + +ROM_START( trsrescue ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) + + ROM_REGION( 178760, "screen", 0) + ROM_LOAD( "trsrescue.svg", 0, 178760, CRC(40756fd3) SHA1(9762ebbe4753a3194d7f0844c91addb8e1f8930b) ) +ROM_END + +ROM_START( trthuball ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "0015_236d", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) + + ROM_REGION( 175018, "screen", 0) + ROM_LOAD( "trthuball.svg", 0, 175018, CRC(3404cc1d) SHA1(4cebe3c742c6947c6fddb8a84ae2f7d0cea1b527) ) +ROM_END + + + + + +/*************************************************************************** + + Tronica: Space Mission (model SM-11), Spider (model SG-21) + * PCB labels: SPACE MISSION SM-11 250582 (SM-11) + SPACE MISSION SM-11 220982 (SG-21) + * Sharp SM5A labels (no decap): 0126 228B TRONICA (SM-11) + 0126 22YC TRONICA (SG-21) + * lcd screen with custom segments, 1-bit sound + + SM-11 and SG-21 are the exact same MCU, but with different graphics. + + In 1983, Tronica released a second revision of SG-21 with different graphic + overlays. This version can be distinguished by having the year 1983 labeled + on the backside of the unit. + +***************************************************************************/ + +class trspacmis_state : public hh_sm510_state +{ +public: + trspacmis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void trspacmis(machine_config &config); + void trspider(machine_config & config); +}; + +// config + +static INPUT_PORTS_START( trspacmis ) + PORT_START("IN.0") // R2 + PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test? + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? + + PORT_START("IN.1") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("BA") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("B") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void trspacmis_state::trspacmis(machine_config &config) +{ + sm5a_common(config, 1601, 1080); // R mask option confirmed +} + +void trspacmis_state::trspider(machine_config &config) +{ + sm5a_common(config, 1597, 1080); // R mask option confirmed +} + +// roms + +ROM_START( trspacmis ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "0126_228b", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) + + ROM_REGION( 106675, "screen", 0) + ROM_LOAD( "trspacmis.svg", 0, 106675, CRC(45d7b798) SHA1(db08fef21462507a115547ecf8eac38260a0c868) ) +ROM_END + +ROM_START( trspider ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "0126_22yc", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) + + ROM_REGION( 130534, "screen", 0) + ROM_LOAD( "trspider.svg", 0, 130534, CRC(d3f00245) SHA1(348c47dbe87ce8537c9b1c91d0d8bbf0809546e8) ) +ROM_END + + + + + +/*************************************************************************** + + Elektronika Автослалом (Autoslalom) (model ИМ-23) + * KB1013VK1-2 MCU + * lcd screen with custom segments, 1-bit sound + + This is not an unlicensed clone, but doing a hex compare with MC-25 + still shows around 30% similarity so clearly they used that as a base. + +***************************************************************************/ + +class auslalom_state : public hh_sm510_state +{ +public: + auslalom_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void auslalom(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( auslalom ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Запуск (Start)") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Скорость (Speed)") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") +INPUT_PORTS_END + +void auslalom_state::auslalom(machine_config &config) +{ + kb1013vk12_common(config, 1732, 1080); // R mask option ? +} + +// roms + +ROM_START( auslalom ) + ROM_REGION( 0x800, "maincpu", 0 ) + ROM_LOAD( "im-23.bin", 0x0000, 0x0740, CRC(3b6e726f) SHA1(eabd04722811d1cc6519db9386b14a535f5aa865) ) + + ROM_REGION( 117520, "screen", 0) + ROM_LOAD( "auslalom.svg", 0, 117520, CRC(2f90fd4c) SHA1(f0de58b1fe2f7c18fc219f9f9a94c227ca1245e4) ) +ROM_END + + + + + +/*************************************************************************** + + VTech Electronic Number Muncher + * Sharp SM511 under epoxy (die label 772) + * lcd screen with custom segments(no background), 1-bit sound + +***************************************************************************/ + +class nummunch_state : public hh_sm510_state +{ +public: + nummunch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag) + { } + + void nummunch(machine_config &config); +}; + +// config + +static INPUT_PORTS_START( nummunch ) + PORT_START("IN.0") // S1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // S2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CHANGED_CB(input_changed) PORT_NAME("Calc. / Clear") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // S3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CHANGED_CB(input_changed) PORT_NAME("Count") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHANGED_CB(input_changed) PORT_NAME("Quiz") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // S4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose +") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose -") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ÷") + + PORT_START("IN.4") // S5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CHANGED_CB(input_changed) PORT_NAME("Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHANGED_CB(input_changed) PORT_NAME("Right") + + PORT_START("IN.5") // S6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") + + PORT_START("IN.6") // S7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") + + PORT_START("IN.7") // S8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") + + PORT_START("ACL") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) +INPUT_PORTS_END + +void nummunch_state::nummunch(machine_config &config) +{ + sm511_common(config, 1920, 875); +} + +// roms + +ROM_START( nummunch ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "772.program", 0x0000, 0x1000, CRC(2f7ff516) SHA1(132e7c5c4d69170953b2e51731992d6d6ba829f9) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "772.melody", 0x000, 0x100, CRC(96fe463a) SHA1(dcef5eee15a3f6d21e0db1b8ae3fbddc81633fc8) ) + + ROM_REGION( 140704, "screen", 0) + ROM_LOAD( "nummunch.svg", 0, 140704, CRC(050301d7) SHA1(3671d0e1b0cc788d74df0c6adb57a01729f66d7c) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT COMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS + +// Nintendo G&W: Silver/Gold (initial series is uncategorized, "Silver" was made up later) +CONS( 1980, gnw_ball, 0, 0, gnw_ball, gnw_ball, gnw_ball_state, empty_init, "Nintendo", "Game & Watch: Ball", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_flagman, 0, 0, gnw_flagman, gnw_flagman, gnw_flagman_state, empty_init, "Nintendo", "Game & Watch: Flagman", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_vermin, 0, 0, gnw_vermin, gnw_vermin, gnw_vermin_state, empty_init, "Nintendo", "Game & Watch: Vermin", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_fires, 0, 0, gnw_fires, gnw_fires, gnw_fires_state, empty_init, "Nintendo", "Game & Watch: Fire (Silver)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, gnw_judge, 0, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (purple version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gnw_judgeo, gnw_judge, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (green version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, gnw_manholeg, 0, 0, gnw_manholeg, gnw_manholeg, gnw_manholeg_state, empty_init, "Nintendo", "Game & Watch: Manhole (Gold)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_helmet, 0, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-17)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_helmeto, gnw_helmet, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-07)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_lion, 0, 0, gnw_lion, gnw_lion, gnw_lion_state, empty_init, "Nintendo", "Game & Watch: Lion", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Wide Screen +CONS( 1981, gnw_pchute, 0, 0, gnw_pchute, gnw_pchute, gnw_pchute_state, empty_init, "Nintendo", "Game & Watch: Parachute", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_octopus, 0, 0, gnw_octopus, gnw_octopus, gnw_octopus_state, empty_init, "Nintendo", "Game & Watch: Octopus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_popeye, 0, 0, gnw_popeye, gnw_popeye, gnw_popeye_state, empty_init, "Nintendo", "Game & Watch: Popeye (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_chef, 0, 0, gnw_chef, gnw_chef, gnw_chef_state, empty_init, "Nintendo", "Game & Watch: Chef", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_mmouse, 0, 0, gnw_mmouse, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_egg, gnw_mmouse, 0, gnw_egg, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Egg", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1981, gnw_fire, 0, 0, gnw_fire, gnw_fire, gnw_fire_state, empty_init, "Nintendo", "Game & Watch: Fire (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_tbridge, 0, 0, gnw_tbridge, gnw_tbridge, gnw_tbridge_state, empty_init, "Nintendo", "Game & Watch: Turtle Bridge", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_fireatk, 0, 0, gnw_fireatk, gnw_fireatk, gnw_fireatk_state, empty_init, "Nintendo", "Game & Watch: Fire Attack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_stennis, 0, 0, gnw_stennis, gnw_stennis, gnw_stennis_state, empty_init, "Nintendo", "Game & Watch: Snoopy Tennis", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Multi Screen +CONS( 1982, gnw_opanic, 0, 0, gnw_opanic, gnw_opanic, gnw_opanic_state, empty_init, "Nintendo", "Game & Watch: Oil Panic", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_dkong, 0, 0, gnw_dkong, gnw_dkong, gnw_dkong_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_mickdon, 0, 0, gnw_mickdon, gnw_mickdon, gnw_mickdon_state, empty_init, "Nintendo", "Game & Watch: Mickey & Donald", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, gnw_ghouse, 0, 0, gnw_ghouse, gnw_ghouse, gnw_ghouse_state, empty_init, "Nintendo", "Game & Watch: Green House", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_dkong2, 0, 0, gnw_dkong2, gnw_dkong2, gnw_dkong2_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mario, 0, 0, gnw_mario, gnw_mario, gnw_mario_state, empty_init, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_rshower, 0, 0, gnw_rshower, gnw_rshower, gnw_rshower_state, empty_init, "Nintendo", "Game & Watch: Rain Shower", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_lboat, 0, 0, gnw_lboat, gnw_lboat, gnw_lboat_state, empty_init, "Nintendo", "Game & Watch: Life Boat", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_pinball, 0, 0, gnw_pinball, gnw_pinball, gnw_pinball_state, empty_init, "Nintendo", "Game & Watch: Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1985, gnw_bjack, 0, 0, gnw_bjack, gnw_bjack, gnw_bjack_state, empty_init, "Nintendo", "Game & Watch: Black Jack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_squish, 0, 0, gnw_squish, gnw_squish, gnw_squish_state, empty_init, "Nintendo", "Game & Watch: Squish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1987, gnw_bsweep, 0, 0, gnw_bsweep, gnw_bsweep, gnw_bsweep_state, empty_init, "Nintendo", "Game & Watch: Bomb Sweeper", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_sbuster, 0, 0, gnw_sbuster, gnw_sbuster, gnw_sbuster_state, empty_init, "Nintendo", "Game & Watch: Safe Buster", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_gcliff, 0, 0, gnw_gcliff, gnw_gcliff, gnw_gcliff_state, empty_init, "Nintendo", "Game & Watch: Gold Cliff", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, gnw_zelda, 0, 0, gnw_zelda, gnw_zelda, gnw_zelda_state, empty_init, "Nintendo", "Game & Watch: Zelda", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: New Wide Screen / Crystal Screen +CONS( 1982, gnw_dkjr, 0, 0, gnw_dkjr, gnw_dkjr, gnw_dkjr_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mariocm, 0, 0, gnw_mariocm, gnw_mariocm, gnw_mariocm_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_manhole, 0, 0, gnw_manhole, gnw_manhole, gnw_manhole_state, empty_init, "Nintendo", "Game & Watch: Manhole (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1985, gnw_tfish, 0, 0, gnw_tfish, gnw_tfish, gnw_tfish_state, empty_init, "Nintendo", "Game & Watch: Tropical Fish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_smb, 0, 0, gnw_smb, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_smbn, gnw_smb, 0, gnw_smbn, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_climber, 0, 0, gnw_climber, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_climbern, gnw_climber, 0, gnw_climbern, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1986, gnw_bfight, 0, 0, gnw_bfight, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, gnw_bfightn, gnw_bfight, 0, gnw_bfightn, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, gnw_mariotj, 0, 0, gnw_mariotj, gnw_mariotj, gnw_mariotj_state, empty_init, "Nintendo", "Game & Watch: Mario The Juggler", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Table Top / Panorama Screen (the first Table Top releases in Japan were called "Color Screen") +CONS( 1983, gnw_mariocmt, 0, 0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // "Another one bites the dust" startup jingle +CONS( 1983, gnw_mariocmta,gnw_mariocmt,0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72A)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // Plays an alternate jingle when starting a game +CONS( 1983, gnw_snoopyp, 0, 0, gnw_snoopyp, gnw_snoopyp, gnw_snoopyp_state, empty_init, "Nintendo", "Game & Watch: Snoopy (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_popeyep, 0, 0, gnw_popeyep, gnw_popeyep, gnw_popeyep_state, empty_init, "Nintendo", "Game & Watch: Popeye (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_dkjrp, 0, 0, gnw_dkjrp, gnw_dkjrp, gnw_dkjrp_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, gnw_mbaway, 0, 0, gnw_mbaway, gnw_mbaway, gnw_mbaway_state, empty_init, "Nintendo", "Game & Watch: Mario's Bombs Away", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_mmousep, 0, 0, gnw_mmousep, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkcirc, gnw_mmousep, 0, gnw_dkcirc, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Circus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Super Color +CONS( 1984, gnw_ssparky, 0, 0, gnw_ssparky, gnw_ssparky, gnw_ssparky_state, empty_init, "Nintendo", "Game & Watch: Spitball Sparky", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_cgrab, 0, 0, gnw_cgrab, gnw_cgrab, gnw_cgrab_state, empty_init, "Nintendo", "Game & Watch: Crab Grab", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W: Micro Vs. System (actually, no official Game & Watch logo anywhere) +CONS( 1984, gnw_boxing, 0, 0, gnw_boxing, gnw_boxing, gnw_boxing_state, empty_init, "Nintendo", "Micro Vs. System: Boxing", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkong3, 0, 0, gnw_dkong3, gnw_dkong3, gnw_dkong3_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong 3", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, gnw_dkhockey, 0, 0, gnw_dkhockey, gnw_dkhockey, gnw_dkhockey_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong Hockey", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nintendo G&W hardware licensed to other companies (not part of G&W series) +CONS( 1984, bassmate, 0, 0, bassmate, bassmate, bassmate_state, empty_init, "Telko / Nintendo", "Bassmate Computer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Elektronika (mostly G&W clones) +CONS( 1988, taynyoke, gnw_octopus, 0, taynyoke, gnw_octopus, gnw_octopus_state, empty_init, "bootleg (Elektronika)", "Tayny okeana", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, vespovar, gnw_chef, 0, vespovar, gnw_chef, gnw_chef_state, empty_init, "bootleg (Elektronika)", "Vesyolyy povar", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1984, nupogodi, gnw_mmouse, 0, nupogodi, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nu, pogodi!", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1988, ehockey, gnw_mmouse, 0, ehockey, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Hockey (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, rkosmosa, gnw_mmouse, 0, rkosmosa, rkosmosa, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Razvedchiki kosmosa", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, okhota, gnw_mmouse, 0, okhota, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Okhota", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, biathlon, gnw_mmouse, 0, biathlon, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Biathlon", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, vfutbol, gnw_mmouse, 0, vfutbol, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Vesyolye futbolisty", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, krybolov, gnw_mmouse, 0, krybolov, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kot-rybolov (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kvakazad, gnw_mmouse, 0, kvakazad, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kvaka-zadavaka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, nochnyev, gnw_mmouse, 0, nochnyev, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nochnye vorishki", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, kosmicpt, gnw_mmouse, 0, kosmicpt, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy polyot", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, morataka, gnw_mmouse, 0, morataka, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Morskaja ataka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, atakaast, gnw_mmouse, 0, atakaast, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Ataka asteroidov", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 19??, ecircus, gnw_mmouse, 0, ecircus, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Circus (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kosmicmt, gnw_fire, 0, kosmicmt, gnw_fire, gnw_fire_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy most", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, auslalom, 0, 0, auslalom, auslalom, auslalom_state, empty_init, "Elektronika", "Autoslalom", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Konami +CONS( 1989, kdribble, 0, 0, kdribble, kdribble, kdribble_state, empty_init, "Konami", "Double Dribble (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, ktopgun_state, empty_init, "Konami", "Top Gun (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kcontra, 0, 0, kcontra, kcontra, kcontra_state, empty_init, "Konami", "Contra (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, ktmnt_state, empty_init, "Konami", "Teenage Mutant Ninja Turtles (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kgradius, 0, 0, kgradius, kgradius, kgradius_state, empty_init, "Konami", "Gradius (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kloneran, 0, 0, kloneran, kloneran, kloneran_state, empty_init, "Konami", "Lone Ranger (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kblades, 0, 0, kblades, kblades, kblades_state, empty_init, "Konami", "Blades of Steel (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, knfl, 0, 0, knfl, knfl, knfl_state, empty_init, "Konami", "NFL Football (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, kbilly, 0, 0, kbilly, kbilly, kbilly_state, empty_init, "Konami", "The Adventures of Bayou Billy (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, kbucky, 0, 0, kbucky, kbucky, kbucky_state, empty_init, "Konami", "Bucky O'Hare (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, kgarfld, 0, 0, kgarfld, kgarfld, kgarfld_state, empty_init, "Konami", "Garfield (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Nelsonic Game Watch series +CONS( 1990, nsmb3, 0, 0, nsmb3, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario Bros. 3 (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +CONS( 1991, nsmw, 0, 0, nsmw, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario World (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +CONS( 1993, nstarfox, 0, 0, nstarfox, nstarfox, nstarfox_state, empty_init, "Nelsonic (licensed from Nintendo)", "Star Fox (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_IMPERFECT_SOUND ) + +// Tiger 7-xxx/78-xxx models +CONS( 1989, tgaunt, 0, 0, tgaunt, tgaunt, tgaunt_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Gauntlet (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, trobhood, tgaunt, 0, trobhood, trobhood, tgaunt_state, empty_init, "Tiger Electronics", "Robin Hood (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tddragon, 0, 0, tddragon, tddragon, tddragon_state, empty_init, "Tiger Electronics (licensed from Technos/Tradewest)", "Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tkarnov, 0, 0, tkarnov, tkarnov, tkarnov_state, empty_init, "Tiger Electronics (licensed from Data East)", "Karnov (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tvindictr, 0, 0, tvindictr, tvindictr, tvindictr_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Vindicators (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tgaiden, 0, 0, tgaiden, tgaiden, tgaiden_state, empty_init, "Tiger Electronics (licensed from Tecmo)", "Ninja Gaiden (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1989, tbatman, 0, 0, tbatman, tbatman, tbatman_state, empty_init, "Tiger Electronics", "Batman (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tsharr2, 0, 0, tsharr2, tsharr2, tsharr2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Space Harrier II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tstrider, 0, 0, tstrider, tstrider, tstrider_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Strider (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tgoldnaxe, 0, 0, tgoldnaxe, tgoldnaxe, tgoldnaxe_state, empty_init, "Tiger Electronics (licensed from Sega)", "Golden Axe (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, trobocop2, 0, 0, trobocop2, trobocop2, trobocop2_state, empty_init, "Tiger Electronics", "Robocop 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, trockteer, trobocop2, 0, trockteer, trockteer, trobocop2_state, empty_init, "Tiger Electronics", "The Rocketeer (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, taltbeast, 0, 0, taltbeast, taltbeast, taltbeast_state, empty_init, "Tiger Electronics (licensed from Sega)", "Altered Beast (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1990, tsf2010, 0, 0, tsf2010, tsf2010, tsf2010_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter 2010 - The Final Fight (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tswampt, 0, 0, tswampt, tswampt, tswampt_state, empty_init, "Tiger Electronics", "Swamp Thing (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tspidman, 0, 0, tspidman, tspidman, tspidman_state, empty_init, "Tiger Electronics", "Spider-Man (Tiger, 1991 version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, txmen, 0, 0, txmen, txmen, txmen_state, empty_init, "Tiger Electronics", "X-Men (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tddragon3, 0, 0, tddragon3, tddragon3, tddragon3_state, empty_init, "Tiger Electronics (licensed from Technos)", "Double Dragon 3 - The Rosetta Stone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tflash, 0, 0, tflash, tflash, tflash_state, empty_init, "Tiger Electronics", "The Flash (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tmchammer, 0, 0, tmchammer, tmchammer, tmchammer_state, empty_init, "Tiger Electronics", "MC Hammer: U Can't Touch This (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, tbtoads, 0, 0, tbtoads, tbtoads, tbtoads_state, empty_init, "Tiger Electronics (licensed from Rare/Tradewest)", "Battletoads (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1991, thook, 0, 0, thook, thook, thook_state, empty_init, "Tiger Electronics", "Hook (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, tbttf, 0, 0, tbttf, tbttf, tbttf_state, empty_init, "Tiger Electronics", "Back to the Future (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, taddams, 0, 0, taddams, taddams, taddams_state, empty_init, "Tiger Electronics", "The Addams Family (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, thalone, 0, 0, thalone, thalone, thalone_state, empty_init, "Tiger Electronics", "Home Alone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, txmenpx, 0, 0, txmenpx, txmenpx, txmenpx_state, empty_init, "Tiger Electronics", "X-Men - Project X (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, thalone2, 0, 0, thalone2, thalone2, thalone2_state, empty_init, "Tiger Electronics", "Home Alone 2 - Lost in New York (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, tsonic, 0, 0, tsonic, tsonic, tsonic_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, trobocop3, 0, 0, trobocop3, trobocop3, trobocop3_state, empty_init, "Tiger Electronics", "Robocop 3 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tdummies, 0, 0, tdummies, tdummies, tdummies_state, empty_init, "Tiger Electronics", "The Incredible Crash Dummies (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsfight2, 0, 0, tsfight2, tsfight2, tsfight2_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1992, twworld, 0, 0, twworld, twworld, twworld_state, empty_init, "Tiger Electronics", "Wayne's World (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tjpark, 0, 0, tjpark, tjpark, tjpark_state, empty_init, "Tiger Electronics", "Jurassic Park (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsonic2, 0, 0, tsonic2, tsonic2, tsonic2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tsddragon, 0, 0, tsddragon, tsddragon, tsddragon_state, empty_init, "Tiger Electronics (licensed from Technos)", "Super Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tdennis, 0, 0, tdennis, tdennis, tdennis_state, empty_init, "Tiger Electronics", "Dennis the Menace (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tnmarebc, 0, 0, tnmarebc, tnmarebc, tnmarebc_state, empty_init, "Tiger Electronics", "Nightmare Before Christmas (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: title has no "The" +CONS( 1993, ttransf2, 0, 0, ttransf2, ttransf2, ttransf2_state, empty_init, "Tiger Electronics", "Transformers - Generation 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, topaliens, 0, 0, topaliens, topaliens, topaliens_state, empty_init, "Tiger Electronics", "Operation: Aliens (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1993, tmkombat, 0, 0, tmkombat, tmkombat, tmkombat_state, empty_init, "Tiger Electronics (licensed from Midway)", "Mortal Kombat (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, tshadow, 0, 0, tshadow, tshadow, tshadow_state, empty_init, "Tiger Electronics", "The Shadow (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1994, tskelwarr, 0, 0, tskelwarr, tskelwarr, tskelwarr_state, empty_init, "Tiger Electronics", "Skeleton Warriors - The Dark Crusade (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tbatfor, 0, 0, tbatfor, tbatfor, tbatfor_state, empty_init, "Tiger Electronics", "Batman Forever - Double Dose of Doom (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tjdredd, 0, 0, tjdredd, tjdredd, tjdredd_state, empty_init, "Tiger Electronics", "Judge Dredd (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tapollo13, 0, 0, tapollo13, tapollo13, tapollo13_state, empty_init, "Tiger Electronics", "Apollo 13 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1995, tgoldeye, 0, 0, tgoldeye, tgoldeye, tgoldeye_state, empty_init, "Tiger Electronics", "007: GoldenEye (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tkazaam, 0, 0, tkazaam, tkazaam, tkazaam_state, empty_init, "Tiger Electronics", "Kazaam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tsjam, 0, 0, tsjam, tsjam, tsjam_state, empty_init, "Tiger Electronics", "Space Jam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Tiger 72-xxx models +CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// Tronica Game Clock series +CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1983, trthuball, trsrescue, 0, trthuball, trsrescue, trsrescue_state, empty_init, "Tronica", "Thunder Ball (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, trspider, trspacmis, 0, trspider, trspacmis, trspacmis_state, empty_init, "Tronica", "Spider (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +// misc +CONS( 1989, nummunch, 0, 0, nummunch, nummunch, nummunch_state, empty_init, "VTech", "Electronic Number Muncher", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_sm510.h b/src/mame/handheld/hh_sm510.h new file mode 100644 index 00000000000..ad9041ae226 --- /dev/null +++ b/src/mame/handheld/hh_sm510.h @@ -0,0 +1,116 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + Sharp SM5xx family handhelds. + +*/ + +#ifndef MAME_INCLUDES_HH_SM510_H +#define MAME_INCLUDES_HH_SM510_H + +#pragma once + +#include "cpu/sm510/sm510.h" +#include "cpu/sm510/sm511.h" +#include "cpu/sm510/sm530.h" +#include "cpu/sm510/sm5a.h" +#include "sound/spkrdev.h" + + +#define PORT_CHANGED_CB(x) \ + PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, x, 0) + + +class hh_sm510_state : public driver_device +{ +public: + hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), + m_io_ba(*this, "BA"), + m_io_b(*this, "B"), + m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U) + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); + virtual DECLARE_INPUT_CHANGED_MEMBER(acl_button); + +protected: + // devices + required_device m_maincpu; + optional_device m_speaker; + optional_ioport_array<8+1> m_inputs; // max 8 + optional_ioport m_io_ba, m_io_b; + output_finder<16, 16, 4> m_out_x; + + // misc common + u16 m_inp_mux = 0; // multiplexed inputs mask + int m_inp_lines = 0; // number of input mux columns + int m_inp_fixed = -1; // input column fixed to GND/Vdd (-1 means none) + u8 m_speaker_data = 0; // speaker output data(if more than 1 bit) + u8 m_s = 0; // MCU S output pins + u8 m_r = 0; // MCU R output pins + + void inp_fixed_last() { m_inp_fixed = -2; } // last input line to GND + u8 read_inputs(int columns, int fixed = -1); + + virtual void update_k_line(); + virtual void sm510_lcd_segment_w(offs_t offset, u16 data); + virtual void sm500_lcd_segment_w(offs_t offset, u16 data); + virtual u8 input_r(); + virtual void input_w(u8 data); + virtual void piezo_r1_w(u8 data); + virtual void piezo_r2_w(u8 data); + virtual void piezo_input_w(u8 data); + virtual void piezo2bit_r1_w(u8 data); + virtual void piezo2bit_input_w(u8 data); + + // display common + int m_decay_pivot = 8; // lcd segment off-to-on delay in 1kHz ticks (affects input lag) + int m_decay_len = 17; // lcd segment on-to-off delay in 1kHz ticks (lcd persistence) + u8 m_display_x_len = 0; // lcd number of groups + u8 m_display_y_len = 0; // lcd number of segments + u8 m_display_z_len = 0; // lcd number of commons + u32 m_display_state[0x20] = { }; // lcd segment data (max. 5-bit offset) + u8 m_display_decay[0x20][0x20] = { }; // (internal use) + + void set_display_size(u8 x, u8 y, u8 z); + TIMER_CALLBACK_MEMBER(display_decay_tick); + emu_timer *m_display_decay_timer = nullptr; + + virtual void machine_start() override; + virtual void machine_reset() override; + + // machine configs + void mcfg_cpu_common(machine_config &config); + void mcfg_cpu_sm5a(machine_config &config); + void mcfg_cpu_kb1013vk12(machine_config &config); + void mcfg_cpu_sm510(machine_config &config); + void mcfg_cpu_sm511(machine_config &config); + void mcfg_cpu_sm512(machine_config &config); + void mcfg_cpu_sm530(machine_config &config); + void mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag = "screen"); + void mcfg_sound_r1(machine_config &config); + + void sm5a_common(machine_config &config, u16 width, u16 height); + void kb1013vk12_common(machine_config &config, u16 width, u16 height); + void sm510_common(machine_config &config, u16 width, u16 height); + void sm511_common(machine_config &config, u16 width, u16 height); + //void sm512_common(machine_config &config, u16 width, u16 height); + void sm530_common(machine_config &config, u16 width, u16 height); + + void sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight); + void dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); + void sm510_tiger(machine_config &config, u16 width, u16 height); + void sm511_tiger1bit(machine_config &config, u16 width, u16 height); + void sm511_tiger2bit(machine_config &config, u16 width, u16 height); +}; + + +#endif // MAME_INCLUDES_HH_SM510_H diff --git a/src/mame/handheld/hh_tms1k.cpp b/src/mame/handheld/hh_tms1k.cpp new file mode 100644 index 00000000000..4ad3d0b2c72 --- /dev/null +++ b/src/mame/handheld/hh_tms1k.cpp @@ -0,0 +1,14465 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle, Kevin Horton +/*************************************************************************** + +This driver is a collection of simple dedicated handheld and tabletop +toys based around the TMS1000 MCU series. Anything more complex or clearly +part of a series is (or will be) in its own driver, see: +- eva: Chrysler EVA-11 (and EVA-24) +- microvsn: Milton Bradley Microvision +- sag: Entex Select-A-Game Machine + +(contd.) hh_tms1k child drivers: +- tispellb: TI Spelling B series gen. 1 +- tispeak: TI Speak & Spell series gen. 1 + +About the approximated MCU frequency everywhere: The RC osc. is not that +stable on most of these handhelds. When comparing multiple video recordings +of the same game, it shows(and sounds) that the frequency range can differ +up to 50kHz. This is probably exaggerated due to components getting worn out +after many decades. TMS1000 RC curve is documented in the data manual, but +not for newer ones (rev. E or TMS1400 MCUs). TMS0970/0980 osc. is on-die. + +ROM source notes when dumped from another publisher, but confident it's the same: +- arrball: Tandy Zingo +- bcheetah: Fundimensions Incredible Brain Buggy +- cmsport: Conic Basketball +- cnbaskb: Cardinal Electronic Basketball +- cnfball: Elecsonic Football +- copycat: Sears Follow Me +- ditto: Tandy Electronic Pocket Repeat +- fxmcr165: Tandy Science Fair Microcomputer Trainer +- ginv1000: Tandy Cosmic 1000 Fire Away +- gjackpot: Entex Electronic Jackpot: Gin Rummy & Black Jack +- gpoker: Entex Electronic Poker +- matchnum: LJN Electronic Concentration +- palmf31: Toshiba BC-8018B +- ti1250: Texas Instruments TI-1200 +- ti25503: Texas Instruments TI-1265 +- ti5100: loose 1979 TMS1073NL chip + +TODO: +- Verify output PLA and microinstructions PLA for MCUs that have been dumped + electronically (mpla is usually the default, opla is often custom). +- unknown MCU clocks for some, especially if no YouTube videos are found +- Fake-press ON button when emulation starts for machines that have it on the + button matrix (doesn't look like any relies on it though). +- t7in1ss: in 2-player mode, game select and skill select can be configured after + selecting a game? Possibly BTANB, players are expected to quickly press the + "First Up" button after the alarm sound. +- bship discrete sound, netlist is documented +- finish bshipb SN76477 sound +- redo internal artwork for the baseball games (embedded SVG for diamond shapes) +- improve elecbowl driver +- tithermos temperature sensor comparator (right now just the digital clock works) +- is alphie(patent) the same as the final version? +- is starwbcp the same as MP3438? (starwbc is MP3438A) + +============================================================================ + +Let's use this driver for a list of known devices and their serials, +excluding most of TI's own products(they normally didn't use "MP" codes). +For TI's calculators, a comprehensive list of MCU serials is available +on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm + + serial device etc. +-------------------------------------------------------------------- + @CP0904A TMS0970 1977, Milton Bradley Comp IV + @MP0905B TMS0970 1977, Parker Brothers Codename Sector + *MP0057 TMS1000 1978, APH Student Speech+ (same ROM contents as TSI Speech+?) + @MP0154 TMS1000 1979, Fonas 2 Player Baseball + @MP0158 TMS1000 1979, Entex Soccer (6003) + @MP0163 TMS1000 1979, A-One LSI Match Number/LJN Electronic Concentration + @MP0166 TMS1000 1980, A-One Arrange Ball/LJN Computer Impulse/Tandy Zingo (model 60-2123) + @MP0168 TMS1000 1979, Conic Multisport/Tandy Sports Arena (model 60-2158) + @MP0170 TMS1000 1979, Conic Football + *MP0220 TMS1000 1980, Tomy Teacher + @MP0230 TMS1000 1980, Entex Blast It (6015) + @MP0271 TMS1000 1982, Radio Shack Monkey See + @MP0907 TMS1000 1979, Conic Basketball (101-006) + @MP0908 TMS1000 1979, Conic Electronic I.Q. + *MP0910 TMS1000 1979, Conic Basketball (101-003) + @MP0914 TMS1000 1979, Entex Baseball 1 + @MP0915 TMS1000 1979, Bandai System Control Car: Cheetah/The Incredible Brain Buggy + @MP0919 TMS1000 1979, Tiger Copy Cat (model 7-520) + @MP0920 TMS1000 1979, Entex Space Battle (6004) + @MP0923 TMS1000 1979, Entex Baseball 2 (6002) + *MP1022 TMS1100 1979, Texas Instruments unknown thermostat + @MP1030 TMS1100 1980, APF Mathemagician + *MP1072 TMS1100 198?, unknown device, Germany (have decap) + @MP1133 TMS1470 1979, Kosmos Astro + @MP1180 TMS1100 1980, Tomy Power House Pinball + @MP1181 TMS1100 1979, Conic Football 2 + @MP1183 TMS1100 1980, E.R.S. Superbowl XV Football/Tandy Championship Football (model 60-2151) + @MP1185 TMS1100 1979, Fonas 3 in 1: Football, Basketball, Soccer + @MP1193 TMS1100 1980, Tandy Championship Football (model 60-2150) + @MP1204 TMS1100 1980, Entex Baseball 3 (6007) + *MP1209 TMS1100 1980, U.S. Games Space Cruiser/Strategy Football + @MP1211 TMS1100 1980, Entex Space Invader (6012) + @MP1215 TMS1100 1980, Tiger Playmaker + @MP1218 TMS1100 1980, Entex Basketball 2 (6010) + @MP1219 TMS1100 1980, U.S. Games Super Sports-4 + @MP1221 TMS1100 1980, Entex Raise The Devil (6011) + @MP1228 TMS1100 1980, Entex Musical Marvin (6014) + @MP1231 TMS1100 1984, Tandy 3 in 1 Sports Arena (model 60-2178) + @MP1296 TMS1100 1982, Entex Black Knight Pinball (6081) + @MP1311 TMS1100 1981, Bandai TC7: Air Traffic Control + @MP1312 TMS1100 1983, Gakken FX-Micom R-165/Radio Shack Science Fair Microcomputer Trainer + *MP1359 TMS1100? 1985, Capsela CRC2000 + @MP1525 TMS1170 1980, Coleco Head to Head: Electronic Baseball + @MP1604 TMS1370 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000 + @MP1801 TMS1700 1981, Tiger Ditto/Tandy Pocket Repeat (model 60-2152) + @MP2105 TMS1370 1979, Gakken/Entex Poker (6005) + @MP2110 TMS1370 1980, Gakken Invader/Tandy Fire Away + @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away + @MP2726 TMS1040 1979, Tomy Break Up + *MP2788 TMS1070? 1980, Bandai Flight Time (? note: VFD-capable) + @MP3005 TMS1730 1989, Tiger Copy Cat (model 7-522) + @MP3200 TMS1000 1978, Parker Brothers Electronic Master Mind + @MP3201 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750A) + *MP3206 TMS1000 1979, Concept 2000 Mr. Mus-I-Cal + @MP3208 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750B) + @MP3226 TMS1000 1978, Milton Bradley Simon (Rev A) + *MP3232 TMS1000 1979, Fonas 2 Player Baseball (no "MP" on chip label) + @MP3260 TMS1000 1979, Electroplay Quickfire + @MP3300 TMS1000 1979, Milton Bradley Simon (Rev F) + @MP3301A TMS1000 1979, Milton Bradley Big Trak + *MP3312 TMS1000 1980, Nathan Mega 10000 + @MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball + @MP3321A TMS1000 1979, Coleco Head to Head: Electronic Hockey + @MP3352 TMS1200 1979, Tiger Sub Wars (model 7-490) + @M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?) + *M32018 TMS1000 1990, unknown device (have decap/dump) + M32045B TMS1000 1983, Chrysler Electronic Voice Alert (11-function) -> eva.cpp + @MP3403 TMS1100 1978, Marx Electronic Bowling + @MP3404 TMS1100 1978, Parker Brothers Merlin + @MP3405 TMS1100 1979, Coleco Amaze-A-Tron + *MP3407 TMS1100 1979, General Electric The Great Awakening (model 7-4880) + @MP3415 TMS1100 1978, Coleco Electronic Quarterback + @MP3435 TMS1100 1979, Coleco Zodiac + @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command + MP3450A TMS1100 1979, Microvision cartridge: Block Buster + MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike + MP3455 TMS1100 1980, Microvision cartridge: Pinball + MP3457 TMS1100 1979, Microvision cartridge: Mindbuster + @MP3460 TMS1100 1979, Coleco Head to Head: Electronic Football + MP3474 TMS1100 1979, Microvision cartridge: Vegas Slots + MP3475 TMS1100 1979, Microvision cartridge: Bowling + @MP3476 TMS1100 1979, Milton Bradley Super Simon + MP3479 TMS1100 1980, Microvision cartridge: Baseball + MP3481 TMS1100 1979, Microvision cartridge: Connect Four + @MP3489 TMS1100 1980, Kenner Live Action Football + @MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer + *MP3493 TMS1100 1980, Milton Bradley OMNI Entertainment System (1/2) + *MP3494 TMS1100 1980, Milton Bradley OMNI Entertainment System (2/2) + MP3496 TMS1100 1980, Microvision cartridge: Sea Duel + M34009 TMS1100 1981, Microvision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..) + @M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game + *M34014 TMS1100 1981, Coleco Bowlatronic + M34017 TMS1100 1981, Microvision cartridge: Cosmic Hunter + @M34018 TMS1100 1981, Coleco Head to Head: Electronic Boxing + @M34038 TMS1100 1982, Parker Brothers Lost Treasure + M34047 TMS1100 1982, Microvision cartridge: Super Blockbuster + @M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania + *M34137 TMS1100? 1985, Technasonic Weight Talker + @MP4486A TMS1000C 1983, Vulcan XL 25 + *MP6061 TMS0970 1979, Texas Instruments Electronic Digital Thermostat (from patent, the one in MAME didn't have a label) + @MP6100A TMS0980 1979, Ideal Electronic Detective + @MP6101B TMS0980 1979, Parker Brothers Stop Thief + *MP6354 ? 1982, Tsukuda The Dracula (? note: 40-pin, VFD-capable) + *MP6361 ? 1983, Defender Strikes (? note: VFD-capable) + @MP7302 TMS1400 1980, Tiger Deluxe Football with Instant Replay + @MP7304 TMS1400 1982, Tiger 7 in 1 Sports Stadium (model 7-555) + @MP7313 TMS1400 1980, Parker Brothers Bank Shot + @MP7314 TMS1400 1980, Parker Brothers Split Second + MP7324 TMS1400 1985, Tiger K28/Coleco Talking Teacher -> tispeak.cpp + @MP7332 TMS1400 1981, Milton Bradley Dark Tower + @MP7334 TMS1400 1981, Coleco Total Control 4 + @MP7351 TMS1400 1982, Parker Brothers Master Merlin + @MP7551 TMS1670 1980, Entex Color Football 4 (6009) + @MPF553 TMS1670 1980, Gakken/Entex Jackpot: Gin Rummy & Black Jack (6008) (note: assume F to be a misprint) + MP7573 TMS1670 1981, Entex Select-A-Game cartridge: Football 4 -> sag.cpp + *M30026 TMS2370 1983, Yaesu FT-757 Display Unit part + *M95041 TMS2670 1983, Tsukuda Game Pachinko (have decap, missing MCU emulation) + + inconsistent: + + @TMS1007 TMS1000 1976, TSI Speech+ (S14002-A) + @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) + + (* means undumped unless noted, @ denotes it's in this driver) + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "machine/clock.h" +#include "machine/ds8874.h" +#include "machine/timer.h" +#include "machine/tmc0999.h" +#include "machine/tms1024.h" +#include "sound/beep.h" +#include "sound/flt_vol.h" +#include "sound/s14001a.h" +#include "sound/sn76477.h" +#include "video/hlcd0515.h" +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" + +#include "softlist_dev.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "t7in1ss.lh" +#include "alphie.lh" +#include "amaztron.lh" // clickable +#include "arcmania.lh" // clickable +#include "arrball.lh" +#include "astro.lh" +#include "bankshot.lh" +#include "bcheetah.lh" +#include "bigtrak.lh" +#include "blastit.lh" +#include "bship.lh" // clickable +#include "cmsport.lh" +#include "cnbaskb.lh" +#include "cnfball.lh" +#include "cnfball2.lh" +#include "cnsector.lh" // clickable +#include "comp4.lh" // clickable +#include "copycat.lh" // clickable +#include "copycatm2.lh" // clickable +#include "dataman.lh" +#include "ditto.lh" // clickable +#include "dxfootb.lh" +#include "cqback.lh" +#include "ebball.lh" +#include "ebball2.lh" +#include "ebball3.lh" +#include "ebaskb2.lh" +#include "ebknight.lh" +#include "efootb4.lh" +#include "einvader.lh" +#include "elecbowl.lh" +#include "elecdet.lh" +#include "eleciq.lh" // clickable +#include "esbattle.lh" +#include "esoccer.lh" +#include "f2pbball.lh" +#include "f3in1.lh" +#include "fxmcr165.lh" // clickable +#include "gjackpot.lh" +#include "gpoker.lh" +#include "h2hbaseb.lh" +#include "h2hbaskb.lh" +#include "h2hboxing.lh" +#include "h2hfootb.lh" +#include "h2hhockey.lh" +#include "horseran.lh" +#include "liveafb.lh" +#include "lostreas.lh" // clickable +#include "matchnum.lh" // clickable +#include "mathmagi.lh" +#include "mathmarv.lh" +#include "mbdtower.lh" // clickable +#include "mdndclab.lh" // clickable +#include "merlin.lh" // clickable +#include "mmarvin.lh" // clickable +#include "mmerlin.lh" // clickable +#include "monkeysee.lh" +#include "palmf31.lh" +#include "palmmd8.lh" +#include "pbmastm.lh" +#include "phpball.lh" +#include "playmaker.lh" +#include "qfire.lh" // clickable +#include "quizwizc.lh" +#include "raisedvl.lh" +#include "simon.lh" // clickable +#include "speechp.lh" +#include "splitsec.lh" +#include "ssimon.lh" // clickable +#include "ssports4.lh" +#include "starwbc.lh" // clickable +#include "stopthief.lh" // clickable +#include "subwars.lh" +#include "t3in1sa.lh" +#include "tandy12.lh" // clickable +#include "tbreakup.lh" +#include "tc4.lh" +#include "tc7atc.lh" +#include "tcfball.lh" +#include "tcfballa.lh" +#include "ti1250.lh" +#include "ti1270.lh" +#include "ti1680.lh" +#include "ti25503.lh" +#include "ti30.lh" +#include "ti5100.lh" +#include "timaze.lh" +#include "tisr16.lh" +#include "tithermos.lh" +#include "wizatron.lh" +#include "xl25.lh" // clickable +#include "zodiac.lh" // clickable + +//#include "hh_tms1k_test.lh" // common test-layout - use external artwork + + +// machine_start/reset + +void hh_tms1k_state::machine_start() +{ + // resolve handlers + m_out_power.resolve(); + + // register for savestates + save_item(NAME(m_o)); + save_item(NAME(m_r)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_power_on)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_tms1k_state::machine_reset() +{ + set_power(true); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_tms1k_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + +u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) +{ + u8 ret = 0; + u16 colmask = (1 << columns) - 1; + + // read selected input columns + for (int i = 0; i < 8; i++) + if (1 << i & rowmask && m_inputs[i]->read() & m_inp_mux & colmask) + ret |= 1 << i; + + return ret; +} + +void hh_tms1k_state::switch_change(int sel, u32 mask, bool next) +{ + // config switches (for direct control) + ioport_field *inp = m_inputs[sel]->field(mask); + + if (next && inp->has_next_setting()) + inp->select_next_setting(); + else if (!next && inp->has_previous_setting()) + inp->select_previous_setting(); +} + +INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button) +{ + // when an input is directly wired to MCU INIT pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + +INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) +{ + set_power((bool)param); + m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); +} + +WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off) +{ + // devices with a TMS0980 can auto power-off + if (state) + power_off(); +} + +void hh_tms1k_state::power_off() +{ + set_power(false); + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); +} + +void hh_tms1k_state::set_power(bool state) +{ + m_power_on = state; + m_out_power = state ? 1 : 0; +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + A-One LSI Match Number + * PCB label PT-204 "Pair Card" + * TMS1000NLL MP0163 (die label 1000B, MP0163) + * 2x2-digit 7seg LED displays + 3 LEDs, 1-bit sound + + A-One was a subsidiary of Bandai? The PCB serial PT-xxx is same, and the font + used on the boxes for "A-One LSI" is same as "Bandai Electronics" from early-80s. + + known releases: + - Japan: Match Number, published by A-One (white case, Queen playing card bezel) + - USA: Electronic Concentration, published by LJN (black case, rainbow pattern bezel) + - UK: Electronic Concentration, published by Peter Pan Playthings (same as USA version) + +***************************************************************************/ + +class matchnum_state : public hh_tms1k_state +{ +public: + matchnum_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void matchnum(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void matchnum_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void matchnum_state::write_r(u16 data) +{ + // R3-R5,R8-R10: input mux + m_inp_mux = (data >> 3 & 7) | (data >> 5 & 0x38); + + // R6,R7: speaker out + m_speaker->level_w(data >> 6 & 3); + + // R0-R3: digit/led select + m_r = data; + update_display(); +} + +void matchnum_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: led data + m_o = data; + update_display(); +} + +u8 matchnum_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( matchnum ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Change") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") + + PORT_START("IN.5") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") +INPUT_PORTS_END + +void matchnum_state::matchnum(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(matchnum_state::read_k)); + m_maincpu->r().set(FUNC(matchnum_state::write_r)); + m_maincpu->o().set(FUNC(matchnum_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 8); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_matchnum); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( matchnum ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) ) +ROM_END + + + + + +/*************************************************************************** + + A-One LSI Arrange Ball + * PCB label Kaken, PT-249 + * TMS1000NLL MP0166 (die label 1000B, MP0166) + * 2-digit 7seg LED display + 22 LEDs, 1-bit sound + + known releases: + - Japan/World: Arrange Ball, published by A-One (black case) + - USA(1): Zingo (model 60-2123), published by Tandy (red case) + - USA(2): Computer Impulse, published by LJN (white case) + - Germany: Fixball, unknown publisher, same as LJN version + +***************************************************************************/ + +class arrball_state : public hh_tms1k_state +{ +public: + arrball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void arrball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void arrball_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void arrball_state::write_r(u16 data) +{ + // R8: input mux (always set) + m_inp_mux = data >> 8 & 1; + + // R9,R10: speaker out + m_speaker->level_w(data >> 9 & 3); + + // R0-R6: digit/led select + m_r = data; + update_display(); +} + +void arrball_state::write_o(u16 data) +{ + // O0-O6: digit segments/led data + m_o = data; + update_display(); +} + +u8 arrball_state::read_k() +{ + // K: multiplexed inputs (actually just 1) + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( arrball ) + PORT_START("IN.0") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shot") // pressed when START lights up + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stop") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Speed" ) + PORT_CONFSETTING( 0x00, "Slow" ) + PORT_CONFSETTING( 0x08, "Fast" ) +INPUT_PORTS_END + +void arrball_state::arrball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(arrball_state::read_k)); + m_maincpu->r().set(FUNC(arrball_state::write_r)); + m_maincpu->o().set(FUNC(arrball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x10, 0x7f); + m_display->set_segmask(0x20, 0x06); // left digit only segments B and C + config.set_default_layout(layout_arrball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( arrball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) ) +ROM_END + + + + + +/*************************************************************************** + + APF Mathemagician + * TMS1100 MCU, label MP1030 (no decap) + * 2 x DS8870N - Hex LED Digit Driver + * 2 x DS8861N - MOS-to-LED 5-Segment Driver + * 10-digit 7seg LED display(2 custom ones) + 4 LEDs, no sound + + This is a tabletop educational calculator. It came with plastic overlays + for playing different kind of games. Refer to the manual on how to use it. + In short, to start from scratch, press [SEL]. By default the device is in + calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT], + one of the games is started. + + 1) Number Machine + 2) Countin' On + 3) Walk The Plank + 4) Gooey Gumdrop + 5) Football + 6) Lunar Lander + +***************************************************************************/ + +class mathmagi_state : public hh_tms1k_state +{ +public: + mathmagi_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void mathmagi(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void mathmagi_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void mathmagi_state::write_r(u16 data) +{ + // R3,R5-R7,R9,R10: input mux + m_inp_mux = (data >> 3 & 1) | (data >> 4 & 0xe) | (data >> 5 & 0x30); + + // R0-R7: 7seg leds + // R8: custom math symbols digit + // R9: custom equals digit + // R10: misc lamps + m_r = data; + update_display(); +} + +void mathmagi_state::write_o(u16 data) +{ + // O1-O7: led/digit segment data + // O0: N/C + m_o = data; + update_display(); +} + +u8 mathmagi_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* physical button layout and labels are like this: + + ON ONE [SEL] [NXT] [?] [/] + | | [7] [8] [9] [x] + OFF TWO [4] [5] [6] [-] + PLAYERS [1] [2] [3] [+] + [0] [_] [r] [=] +*/ + +static INPUT_PORTS_START( mathmagi ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.1") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // R10 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 mathmagi_output_pla[0x20] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 + 0x7f, 0x6f, 0x53, 0x50, 0x08, 0x79, 0x40, 0x00, // 8, 9, questionmark, r, underscore?, E, -(negative), empty + 0x00, 0x40, 0x08, 0x7c, 0x02, 0x42, 0x06, 0x6e, // empty, led4/-, led3, b, led2, +, ×, y + 0x01, 0x41, 0x09, 0, 0, 0x5c, 0, 0x3d // led1, ÷, =, ?, ?, o, ?, G +}; + +void mathmagi_state::mathmagi(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 175000); // approximation - RC osc. R=68K, C=82pF + m_maincpu->set_output_pla(mathmagi_output_pla); + m_maincpu->k().set(FUNC(mathmagi_state::read_k)); + m_maincpu->r().set(FUNC(mathmagi_state::write_r)); + m_maincpu->o().set(FUNC(mathmagi_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 7); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_mathmagi); + + // no sound! +} + +// roms + +ROM_START( mathmagi ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Bandai System Control Car: Cheetah 「システムコントロールカー チーター」 + * TMS1000NLL MP0915 (die label 1000B, MP0915) + * 2 motors (one for back axis, one for steering), no sound + + It's a programmable buggy, like Big Track but much simpler. To add a command + step in program-mode, press a direction key and one of the time delay number + keys at the same time. To run the program(max 24 steps), switch to run-mode + and press the go-key. + + known releases: + - Japan: System Control Car: Cheetah, published by Bandai + - USA: The Incredible Brain Buggy, published by Fundimensions + - UK: The Incredible Brain Buggy, published by Palitoy (same as USA version) + +***************************************************************************/ + +class bcheetah_state : public hh_tms1k_state +{ +public: + bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_motor1(*this, "motor1"), + m_motor2_left(*this, "motor2_left"), + m_motor2_right(*this, "motor2_right") + { } + + void bcheetah(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + output_finder<> m_motor1; + output_finder<> m_motor2_left; + output_finder<> m_motor2_right; +}; + +void bcheetah_state::machine_start() +{ + hh_tms1k_state::machine_start(); + m_motor1.resolve(); + m_motor2_left.resolve(); + m_motor2_right.resolve(); +} + +// handlers + +void bcheetah_state::write_r(u16 data) +{ + // R0-R4: input mux + // R5,R6: tied to K4?? + m_inp_mux = data & 0x1f; +} + +void bcheetah_state::write_o(u16 data) +{ + // O1: back motor (drive) + // O0: front motor steer left + // O2: front motor steer right + // O3: GND, other: N/C + m_motor1 = data >> 1 & 1; + m_motor2_left = data & 1; + m_motor2_right = data >> 2 & 1; +} + +u8 bcheetah_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( bcheetah ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, "Mode") + PORT_CONFSETTING( 0x02, "Program" ) + PORT_CONFSETTING( 0x00, "Run" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") +INPUT_PORTS_END + +void bcheetah_state::bcheetah(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 100000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(bcheetah_state::read_k)); + m_maincpu->r().set(FUNC(bcheetah_state::write_r)); + m_maincpu->o().set(FUNC(bcheetah_state::write_o)); + + config.set_default_layout(layout_bcheetah); + + // no sound! +} + +// roms + +ROM_START( bcheetah ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai TC7: Air Traffic Control + * TMS1100 MCU, label MP1311 (die label 1100E, MP1311) + * 4-digit 7seg LED display, 40 other LEDs, 1-bit sound + + It is a very complicated game, refer to the manual on how to play. + +***************************************************************************/ + +class tc7atc_state : public hh_tms1k_state +{ +public: + tc7atc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tc7atc(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tc7atc_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void tc7atc_state::write_r(u16 data) +{ + // R5: speaker out + m_speaker->level_w(BIT(data, 5)); + + // R0-R4: input mux, led select + // R6-R9: digit select + m_inp_mux = m_r = data; + update_display(); +} + +void tc7atc_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 tc7atc_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( tc7atc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("High Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hazard") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("West") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("East") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Arrive") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Depart") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Flight Path A / Level 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Flight Path B / Level 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Flight Path C / Level 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Flight Path D / Level 4") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Altitude Descend") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Altitude Ascend") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Air Speed Decrease") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Air Speed Increase") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("10%") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("20%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("40%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("80%") +INPUT_PORTS_END + +void tc7atc_state::tc7atc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=68K, C=47pF + m_maincpu->k().set(FUNC(tc7atc_state::read_k)); + m_maincpu->r().set(FUNC(tc7atc_state::write_r)); + m_maincpu->o().set(FUNC(tc7atc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3c0, 0x7f); + config.set_default_layout(layout_tc7atc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tc7atc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1311", 0x0000, 0x0800, CRC(704f5e1b) SHA1(765dce31798640480eab7576550c5378d6351b65) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_tc7atc_output.pla", 0, 365, CRC(0e6e3096) SHA1(375beb43657af0cc3070e581b42e501878c0eaaa) ) +ROM_END + + + + + +/*************************************************************************** + + Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B, + Triumph-Adler 81 SN, Silver-Reed 8J, more + * TMS1040 MCU label TMS1045NL (die label 1040A, 1045) + * 9-digit cyan VFD display (leftmost may be custom) + + TMS1045NL is a versatile calculator chip for 3rd party manufacturers, used + by Canon, Toshiba, and several smaller companies. It doesn't look like it + was used in any TI calculator. It was up to the manufacturer to choose which + functions(keys) to leave out. + +***************************************************************************/ + +class palmf31_state : public hh_tms1k_state +{ +public: + palmf31_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void palmf31(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void palmf31_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void palmf31_state::write_r(u16 data) +{ + // R0-R8: select digit, input mux + m_r = m_inp_mux = data; + update_display(); +} + +void palmf31_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 palmf31_state::read_k() +{ + // K: multiplexed inputs, one of the columns is K2+K8 + u8 data = read_inputs(9); + if (data & 1) + data = (data & 0xe) | 0xa; + + // switches are on K1 + if (m_inp_mux & m_inputs[9]->read()) + data |= 1; + + return data; +} + +// config + +static INPUT_PORTS_START( palmf31 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M+") // add to memory + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("M-") // subtract from memory + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("RV") // reverse + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as M+ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as sqrt + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("1/x") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("RM/CM") // combined function (press twice) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("C") // clear (all) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(UTF8_LEFT) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("CI") // clear indicator + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("CI/C") // combined function (press twice) + + PORT_START("IN.9") // K1 + PORT_CONFNAME( 0x1f, 0x00, "DP" ) // display point + PORT_CONFSETTING( 0x02, "+" ) + PORT_CONFSETTING( 0x01, "0" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x10, "4" ) + PORT_CONFSETTING( 0x00, "F" ) + PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_CONFNAME( 0x100, 0x000, "AM" ) // accumulate memory + PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x100, DEF_STR( On ) ) +INPUT_PORTS_END + +void palmf31_state::palmf31(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(palmf31_state::read_k)); + m_maincpu->o().set(FUNC(palmf31_state::write_o)); + m_maincpu->r().set(FUNC(palmf31_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_palmf31); + + // no sound! +} + +// roms + +ROM_START( palmf31 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1045nl", 0x0000, 0x0400, CRC(0c42d43e) SHA1(b76d404623e3abfd0b237ee1c0b46e83f96ceb78) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_palmf31_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_palmf31_output.pla", 0, 365, CRC(bc295ea6) SHA1(7e7c9ed0c1e5e37173dd8f297473516c410bca8c) ) +ROM_END + + + + + +/*************************************************************************** + + Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810 + * TMS1070 MCU label TMC1079 (die label 1070B, 1079A) + * 2-line cyan VFD display, each 9-digit 7seg + 1 custom (label 20-ST-22) + * PCB label Canon EHI-0115-03 + + The only difference between MD-8 and MD 810 is the form factor. The latter + is a tabletop calculator. + +***************************************************************************/ + +class palmmd8_state : public hh_tms1k_state +{ +public: + palmmd8_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void palmmd8(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void palmmd8_state::update_display() +{ + // M-digit is on in memory mode, upper row is off in single mode + u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0; + u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00; + + // R10 selects display row + u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); + m_display->matrix((sel & mask) | m, m_o); +} + +void palmmd8_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void palmmd8_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = bitswap<8>(data,0,4,5,6,7,1,2,3); + update_display(); +} + +u8 palmmd8_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( palmmd8 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M+") // add to memory + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") // reverse + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CI/C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.10") // R10 + PORT_CONFNAME( 0x31, 0x20, "Mode" ) // bit 4 indicates M-digit on/off, bit 5 indicates upper row filament on/off + PORT_CONFSETTING( 0x31, "Memory" ) + PORT_CONFSETTING( 0x01, "Single" ) + PORT_CONFSETTING( 0x20, "Process" ) + PORT_CONFNAME( 0x02, 0x00, "AM" ) // accumulate memory + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x02, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void palmmd8_state::palmmd8(machine_config &config) +{ + // basic machine hardware + TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf + m_maincpu->k().set(FUNC(palmmd8_state::read_k)); + m_maincpu->o().set(FUNC(palmmd8_state::write_o)); + m_maincpu->r().set(FUNC(palmmd8_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(21, 8); + m_display->set_segmask(0xfffff, 0xff); + config.set_default_layout(layout_palmmd8); + + // no sound! +} + +// roms + +ROM_START( palmmd8 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_palmmd8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Amaze-A-Tron, by Ralph Baer + * TMS1100 MCU, label MP3405 (die label same) + * 2-digit 7seg LED display + 2 LEDs(one red, one green), 1-bit sound + * 5*5 pressure-sensitive playing board(buttons), 4 game pieces + + This is an electronic board game with a selection of 8 maze games, + most of them for 2 players. + +***************************************************************************/ + +class amaztron_state : public hh_tms1k_state +{ +public: + amaztron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void amaztron(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void amaztron_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void amaztron_state::write_r(u16 data) +{ + // R0-R5: input mux + m_inp_mux = data & 0x3f; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R6,R7: leds + // R8,R9: select digit + m_r = data >> 6 & 0xf; + update_display(); +} + +void amaztron_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 amaztron_state::read_k() +{ + // K: multiplexed inputs + u8 k = read_inputs(6); + + // the 5th column is tied to K4+K8 + if (k & 0x10) k |= 0xc; + return k & 0xf; +} + +// config + +static INPUT_PORTS_START( amaztron ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Game Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Game Start") + PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void amaztron_state::amaztron(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=33K?, C=100pF + m_maincpu->k().set(FUNC(amaztron_state::read_k)); + m_maincpu->r().set(FUNC(amaztron_state::write_r)); + m_maincpu->o().set(FUNC(amaztron_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xc, 0x7f); + config.set_default_layout(layout_amaztron); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( amaztron ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Zodiac - The Astrology Computer (model 2110) + * TMS1100 MP3435 (no decap) + * 8-digit 7seg display, 12 other LEDs, 1-bit sound + + As the name suggests, this is an astrologic calculator. Refer to the + (very extensive) manual on how to use it. + +***************************************************************************/ + +class zodiac_state : public hh_tms1k_state +{ +public: + zodiac_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void zodiac(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void zodiac_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void zodiac_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R4,R8: input mux + m_inp_mux = (data & 0x1f) | (data >> 3 & 0x20); + + // R0-R7: digit select + // R8,R9: led select + m_r = data & 0x3ff; + update_display(); +} + +void zodiac_state::write_o(u16 data) +{ + // O0-O7: digit segment/led data + m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); + update_display(); +} + +u8 zodiac_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* The physical button layout and labels are like this: + + [P] [A] + [ 1 ] [ 2 ] [ 3 ] + [L] [ 4 ] [ 5 ] [ 6 ] [D] + [ 7 ] [ 8 ] [ 9 ] + [J] [ 0 ] [CLR] [ENT] [E] + + [.__.__.__.] + OFF H P A + +Despite that this layout features a typical digital keypad and distances +the letter buttons from it, the 8-character encoding for date input uses +letters and digits in combination. This fact and the use of the P key are +why the digit buttons are mapped here as keyboard inputs rather than as a +keypad. + +*/ + +static INPUT_PORTS_START( zodiac ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8) + + PORT_START("IN.5") // R8 + PORT_CONFNAME( 0x03, 0x01, "Mode") + PORT_CONFSETTING( 0x01, "Horoscope" ) + PORT_CONFSETTING( 0x02, "Preview" ) + PORT_CONFSETTING( 0x00, "Answer" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void zodiac_state::zodiac(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 500000); // approximation - RC osc. R=18K, C=100pF + m_maincpu->k().set(FUNC(zodiac_state::read_k)); + m_maincpu->r().set(FUNC(zodiac_state::write_r)); + m_maincpu->o().set(FUNC(zodiac_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0xff, 0x7f); + config.set_default_layout(layout_zodiac); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( zodiac ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_zodiac_output.bin", 0, 0x20, CRC(d35d64cb) SHA1(315e7ca9a18a06ff7dc0b95c6f119e093b15a41f) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Electronic Quarterback (model 2120) + * TMS1100NLL MP3415 (die label same) + * 9-digit LED grid, 1-bit sound + + known releases: + - USA(1): Electronic Quarterback, published by Coleco + - USA(2): Electronic Touchdown, published by Sears + +***************************************************************************/ + +class cqback_state : public hh_tms1k_state +{ +public: + cqback_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cqback(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cqback_state::update_display() +{ + // R9 selects between segments B/C or A'/D' + u16 seg = m_o; + if (m_r & 0x200) + seg = (m_o << 7 & 0x300) | (m_o & 0xf9); + + m_display->matrix(m_r & 0x1ff, seg); +} + +void cqback_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R0-R9: select digit/segment + m_r = data; + update_display(); +} + +void cqback_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cqback_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(5); +} + +// config + +static INPUT_PORTS_START( cqback ) + PORT_START("IN.0") // K1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick/Pass") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") + + PORT_START("IN.1") // K2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.3") // K8 + PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x01, DEF_STR( On ) ) // TP1-TP2 +INPUT_PORTS_END + +void cqback_state::cqback(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(cqback_state::read_k)); + m_maincpu->r().set(FUNC(cqback_state::write_r)); + m_maincpu->o().set(FUNC(cqback_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x1ff, 0xff); + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_cqback); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cqback ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Football (model 2140) + * TMS1100NLLE (rev. E!) MP3460 (die label same) + * 2*SN75492N LED display drivers, 9-digit LED grid, 1-bit sound + + LED electronic football game. To distinguish between offense and defense, + offense blips appear brighter. The hardware is similar to cqback. + + known releases: + - USA(1): Head to Head: Electronic Football, published by Coleco + - USA(2): Team Play Football, published by Sears + +***************************************************************************/ + +class h2hfootb_state : public hh_tms1k_state +{ +public: + h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hfootb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void h2hfootb_state::update_display() +{ + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 1 & 0x100)); +} + +void h2hfootb_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R8: input mux + m_inp_mux = data & 0x1ff; + + // R0-R8: select led + // R9: led between digits + m_r = data; + update_display(); +} + +void h2hfootb_state::write_o(u16 data) +{ + // O0-O7: digit segments A-G,A' + m_o = data; + update_display(); +} + +u8 h2hfootb_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(9); +} + +// config + +static INPUT_PORTS_START( h2hfootb ) + PORT_START("IN.0") // K1 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.1") // K2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("P1 Play Selector") // pass + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + + PORT_START("IN.3") // K8 + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick/Pass") + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY +INPUT_PORTS_END + +void h2hfootb_state::h2hfootb(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=39K, C=100pF + m_maincpu->k().set(FUNC(h2hfootb_state::read_k)); + m_maincpu->r().set(FUNC(h2hfootb_state::write_r)); + m_maincpu->o().set(FUNC(h2hfootb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1ff, 0x7f); + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_h2hfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hfootb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Basketball (model 2150) + * TMS1000NLL MP3320A (die label 1000E MP3320A) + * 2-digit 7seg LED display, LED grid display, 1-bit sound + + Coleco Head to Head: Electronic Hockey (model 2160) + * TMS1000NLL E MP3321A (die label 1000E MP3321A) + * same PCB/hardware as above + + Unlike the COP420 version(see hh_cop400.cpp driver), each game has its own MCU. + To begin play, press start while holding left/right. + +***************************************************************************/ + +class h2hbaskb_state : public hh_tms1k_state +{ +public: + h2hbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_cap_empty_timer(*this, "cap_empty") + { } + + void h2hbaskb(machine_config &config); + void h2hhockey(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_cap_empty_timer; + TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback); + bool m_cap_state = false; + attotime m_cap_charge = attotime::zero; + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void h2hbaskb_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_cap_state)); + save_item(NAME(m_cap_charge)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(h2hbaskb_state::cap_empty_callback) +{ + if (~m_r & 0x200) + m_cap_state = false; +} + +void h2hbaskb_state::update_display() +{ + // R6,R7 are commons for R0-R5 + u16 sel = 0; + if (m_r & 0x40) sel |= (m_r & 0x3f); + if (m_r & 0x80) sel |= (m_r & 0x3f) << 6; + + m_display->matrix(sel, m_o); +} + +void h2hbaskb_state::write_r(u16 data) +{ + // R0-R3: input mux + m_inp_mux = (data & 0xf); + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R9: K8 and 15uF cap to V- (used as timer) + // rising edge, remember the time + if (data & ~m_r & 0x200) + { + m_cap_state = true; + m_cap_charge = machine().time(); + } + // falling edge, determine how long K8 should stay up + if (~data & m_r & 0x200) + { + const attotime full = attotime::from_usec(1300); // approx. charge time + const int factor = 27; // approx. factor for charge/discharge to logic 0 + + attotime charge = machine().time() - m_cap_charge; + if (charge > full) + charge = full; + + m_cap_empty_timer->adjust(charge * factor); + } + + // R0-R7: led select + m_r = data; + update_display(); +} + +void h2hbaskb_state::write_o(u16 data) +{ + // O1-O7: led data + m_o = data >> 1 & 0x7f; + update_display(); +} + +u8 h2hbaskb_state::read_k() +{ + // K1-K4: multiplexed inputs, K8: R9 and capacitor + return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0); +} + +// config + +static INPUT_PORTS_START( h2hbaskb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start/Display") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( h2hhockey ) + PORT_INCLUDE( h2hbaskb ) + + PORT_MODIFY("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") +INPUT_PORTS_END + +void h2hbaskb_state::h2hbaskb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=100pF + m_maincpu->k().set(FUNC(h2hbaskb_state::read_k)); + m_maincpu->r().set(FUNC(h2hbaskb_state::write_r)); + m_maincpu->o().set(FUNC(h2hbaskb_state::write_o)); + + TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(6+6, 7); + m_display->set_segmask(0xc0, 0x7f); + config.set_default_layout(layout_h2hbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void h2hbaskb_state::h2hhockey(machine_config &config) +{ + h2hbaskb(config); + config.set_default_layout(layout_h2hhockey); +} + +// roms + +ROM_START( h2hbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3320a", 0x0000, 0x0400, CRC(39a63f43) SHA1(14a765e42a39f8d3a465c990e09dd651e595a1c5) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_h2hbaskb_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) +ROM_END + +ROM_START( h2hhockey ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Baseball (model 2180) + * PCB labels Coleco rev C 73891/2 + * TMS1170NLN MP1525-N2 (die label MP1525) + * 9-digit cyan VFD display, and other LEDs behind bezel, 1-bit sound + + known releases: + - USA: Head to Head: Electronic Baseball, published by Coleco + - Japan: Computer Baseball, published by Tsukuda + +***************************************************************************/ + +class h2hbaseb_state : public hh_tms1k_state +{ +public: + h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hbaseb(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void h2hbaseb_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void h2hbaseb_state::set_clock() +{ + // MCU clock is from an RC circuit with C=47pF, and R value is depending on + // skill switch: R=51K(1) or 43K(2) + m_maincpu->set_unscaled_clock((m_inputs[5]->read() & 1) ? 400000 : 350000); +} + +void h2hbaseb_state::update_display() +{ + m_display->matrix((m_r & 0xff) | (m_r >> 1 & 0x100), (m_r & 0x100) | m_o); +} + +void h2hbaseb_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R4-R7: input mux + m_inp_mux = data >> 4 & 0xf; + + // R0-R7,R9: select vfd digit/led + // R8: led state + m_r = data; + update_display(); +} + +void h2hbaseb_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + // O7: N/C + m_o = data; + update_display(); +} + +u8 h2hbaseb_state::read_k() +{ + // K: multiplexed inputs (note: K8(Vss row) is always on) + return m_inputs[4]->read() | read_inputs(4); +} + +// config + +static INPUT_PORTS_START( h2hbaseb ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("N") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("B") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("S") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Curve") // these two buttons appear twice on the board + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Pitch") // " + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // Vss! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Swing") + + PORT_START("IN.5") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, h2hbaseb_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) +INPUT_PORTS_END + +void h2hbaseb_state::h2hbaseb(machine_config &config) +{ + // basic machine hardware + TMS1170(config, m_maincpu, 350000); // see set_clock + m_maincpu->k().set(FUNC(h2hbaseb_state::read_k)); + m_maincpu->r().set(FUNC(h2hbaseb_state::write_r)); + m_maincpu->o().set(FUNC(h2hbaseb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_h2hbaseb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hbaseb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Head to Head: Electronic Boxing (model 2190) + * TMS1100NLL M34018-N2 (die label M34018) + * 2-digit 7seg LED display, LED grid display, 1-bit sound + + This appears to be the last game of Coleco's Head to Head series. + +***************************************************************************/ + +class h2hboxing_state : public hh_tms1k_state +{ +public: + h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void h2hboxing(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void h2hboxing_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void h2hboxing_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R0-R7: select led + // R9,R10: select digit + m_r = data & ~0x100; + update_display(); +} + +void h2hboxing_state::write_o(u16 data) +{ + // O0-O7: digit segments/led data + m_o = data; + update_display(); +} + +u8 h2hboxing_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( h2hboxing ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punch / Pro") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Block / Amateur") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Punch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Block") +INPUT_PORTS_END + +void h2hboxing_state::h2hboxing(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=100pF + m_maincpu->k().set(FUNC(h2hboxing_state::read_k)); + m_maincpu->r().set(FUNC(h2hboxing_state::write_r)); + m_maincpu->o().set(FUNC(h2hboxing_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_segmask(0x600, 0x7f); + config.set_default_layout(layout_h2hboxing); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( h2hboxing ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Quiz Wiz Challenger + * TMS1000NLL M32001-N2 (die label 1000E, M32001) + * 4 7seg LEDs, 17 other LEDs, 1-bit sound + + This is a 4-player version of Quiz Wiz, a multiple choice quiz game. + According to the manual, Quiz Wiz cartridges are compatible with it. + The question books are needed to play, as well as optional game pieces. + + Cartridge pinout: + 1 R4 + 2 R6 + 3 R7 + 4 K1 + 5 N/C + 6 R8 + 7 R5 + 8 R9 + + The cartridge connects one or more of the R pins to K1. Together with the + question numbers, the game generates a pseudo-random answerlist. + +***************************************************************************/ + +class quizwizc_state : public hh_tms1k_state +{ +public: + quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void quizwizc(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u16 m_pinout = 0x07; // cartridge R pins + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void quizwizc_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_pinout)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge pinout K1 to R connections + const char *pinout = image.get_feature("pinout"); + m_pinout = pinout ? strtoul(pinout, nullptr, 2) & 0xe7 : 0; + m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4; + + if (m_pinout == 0) + { + image.seterror(image_error::INVALIDIMAGE, "Invalid cartridge pinout"); + return image_init_result::FAIL; + } + + return image_init_result::PASS; +} + +void quizwizc_state::update_display() +{ + // note: O7 is on VSS + m_display->matrix(m_r | 0x400, m_o); +} + +void quizwizc_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R5: input mux + // R4-R9: to cartridge slot + m_inp_mux = data & 0x3f; + + // R0-R3: led select + // R6-R9: digit select + m_r = data; + update_display(); +} + +void quizwizc_state::write_o(u16 data) +{ + // O0-O7: led/digit segment data + m_o = bitswap<8>(data,7,0,1,2,3,4,5,6); + update_display(); +} + +u8 quizwizc_state::read_k() +{ + // K: multiplexed inputs + // K1: cartridge pin 4 (pin 5 N/C) + return read_inputs(6) | ((m_r & m_pinout) ? 1 : 0); +} + +// config + +static INPUT_PORTS_START( quizwizc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // A (player 1 at bottom, increment counter-clockwise) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // B + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // C + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) // D + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Go") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Slow Forward") + + PORT_START("IN.5") // R5 + PORT_CONFNAME( 0x02, 0x00, "Game Select" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void quizwizc_state::quizwizc(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=100pF + m_maincpu->k().set(FUNC(quizwizc_state::read_k)); + m_maincpu->r().set(FUNC(quizwizc_state::write_r)); + m_maincpu->o().set(FUNC(quizwizc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10+1, 8); + m_display->set_segmask(0x3c0, 0x7f); + config.set_default_layout(layout_quizwizc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "quizwiz_cart")); + cartslot.set_must_be_loaded(true); + cartslot.set_device_load(FUNC(quizwizc_state::cart_load)); + SOFTWARE_LIST(config, "cart_list").set_original("quizwiz"); +} + +// roms + +ROM_START( quizwizc ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) ) +ROM_END + + + + + +/*************************************************************************** + + Coleco Total Control 4 + * TMS1400NLL MP7334-N2 (die label MP7334) + * 2x2-digit 7seg LED display + 4 LEDs, LED grid display, 1-bit sound + + This is a head to head electronic tabletop LED-display sports console. + One cartridge(Football) was included with the console, the other three were + sold in a pack. Gameplay has emphasis on strategy, read the official manual + on how to play. MAME external artwork is needed for the switchable overlays. + + Cartridge pinout: + 1 N/C + 2 9V+ + 3 power switch + 4 K8 + 5 K4 + 6 K2 + 7 K1 + 8 R9 + + The cartridge connects pin 8 with one of the K-pins. + +***************************************************************************/ + +class tc4_state : public hh_tms1k_state +{ +public: + tc4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tc4(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u8 m_pinout = 0xf; // cartridge K pins + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void tc4_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_pinout)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge pinout R9 to K connections + const char *pinout = image.get_feature("pinout"); + m_pinout = pinout ? strtoul(pinout, nullptr, 0) & 0xf : 0xf; + + return image_init_result::PASS; +} + +void tc4_state::update_display() +{ + // note: R6 is an extra column + m_display->matrix(m_r, (m_o | (m_r << 2 & 0x100))); +} + +void tc4_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R5: input mux + // R9: to cartridge slot + m_inp_mux = data & 0x3f; + + // R0-R4: select led + // R6: led 8 state + // R5,R7-R9: select digit + m_r = data; + update_display(); +} + +void tc4_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 tc4_state::read_k() +{ + // K: multiplexed inputs, cartridge pins from R9 + return read_inputs(6) | ((m_r & 0x200) ? m_pinout : 0); +} + +// config + +static INPUT_PORTS_START( tc4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pass/Shoot Button 3") // right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass/Shoot Button 1") // left + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass/Shoot Button 2") // middle + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 D/K Button") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 3") // right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 1") // left + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 2") // middle + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button") +INPUT_PORTS_END + +void tc4_state::tc4(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 450000); // approximation - RC osc. R=27.3K, C=100pF + m_maincpu->k().set(FUNC(tc4_state::read_k)); + m_maincpu->r().set(FUNC(tc4_state::write_r)); + m_maincpu->o().set(FUNC(tc4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x3a0, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_tc4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "tc4_cart")); + cartslot.set_must_be_loaded(true); // system won't power on without cartridge + cartslot.set_device_load(FUNC(tc4_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("tc4"); +} + +// roms + +ROM_START( tc4 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Basketball + * PCB label CONIC 101-006 + * TMS1000NLL MP0907 (die label 1000B MP0907) + * DS8871N, 2 7seg LEDs, 30 other LEDs, 1-bit sound + + There are 3 known versions of Conic Basketball: MP0910(101-003) and + MP0907(101-006) are nearly identical. MP0168 is found in Conic Multisport. + + known releases: + - Hong Kong: Electronic Basketball, published by Conic + - USA: Electronic Basketball, published by Cardinal + +***************************************************************************/ + +class cnbaskb_state : public hh_tms1k_state +{ +public: + cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnbaskb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnbaskb_state::update_display() +{ + m_display->matrix(m_r & 0x1fc, m_o); +} + +void cnbaskb_state::write_r(u16 data) +{ + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0,R1: input mux + // R10 is also tied to K1 (locks up at boot if it's not handled) + m_inp_mux = (data >> 8 & 4) | (data & 3); + + // R2-R6: led select + // R7,R8: digit select + m_r = data; + update_display(); +} + +void cnbaskb_state::write_o(u16 data) +{ + // O0-O6: led/digit segment data + // O7: N/C + m_o = data; + update_display(); +} + +u8 cnbaskb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cnbaskb ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x01, "2" ) // professional + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cnbaskb_state::cnbaskb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(cnbaskb_state::read_k)); + m_maincpu->r().set(FUNC(cnbaskb_state::write_r)); + m_maincpu->o().set(FUNC(cnbaskb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x180, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cnbaskb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnbaskb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Multisport + * PCB label CONIC 101-027(1979), or CONIC 101-021 REV A(1980, with DS8871N) + * TMS1000 MP0168 (die label same) + * 2 7seg LEDs, 33 other LEDs, 1-bit sound + + This handheld includes 3 games: Basketball, Ice Hockey, Soccer. + MAME external artwork is needed for the switchable overlays. + + known releases: + - Hong Kong: Electronic Multisport, published by Conic + - Hong Kong: Basketball/Ice Hockey/Soccer, published by Conic (3 separate handhelds) + - USA(1): Electronic Multisport, published by Innocron + - USA(2): Sports Arena, published by Tandy (model 60-2158) + +***************************************************************************/ + +class cmsport_state : public hh_tms1k_state +{ +public: + cmsport_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cmsport(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cmsport_state::update_display() +{ + m_display->matrix(m_r & ~0x80, m_o); +} + +void cmsport_state::write_r(u16 data) +{ + // R7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // R0,R9,R10: input mux + m_inp_mux = (data & 1) | (data >> 8 & 6); + + // R0-R4,R8: led select + // R5,R6: digit select + m_r = data; + update_display(); +} + +void cmsport_state::write_o(u16 data) +{ + // O0-O7: led/digit segment data + m_o = data; + update_display(); +} + +u8 cmsport_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cmsport ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x05, 0x01, "Game Select" ) + PORT_CONFSETTING( 0x01, "Basketball" ) + PORT_CONFSETTING( 0x00, "Soccer" ) + PORT_CONFSETTING( 0x04, "Ice Hockey" ) + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void cmsport_state::cmsport(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(cmsport_state::read_k)); + m_maincpu->r().set(FUNC(cmsport_state::write_r)); + m_maincpu->o().set(FUNC(cmsport_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x60, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cmsport); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cmsport ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Football + * TMS1000 MP0170 (die label same) + * DS8874N, 3*9 LED array, 7 7seg LEDs, 1-bit sound + + This is a clone of Mattel Football. Apparently Mattel tried to keep imports + of infringing games from going through customs. Conic (Hong Kong) answered + by distributing the game under subsidiary brands - see list below. + + known releases: + - Hong Kong: Electronic Football, published by Conic + - USA(1): Football, published by E.R.S.(Electronic Readout Systems) + - USA(2): Football, published by ELECsonic + - USA(3): Football, no brand! + + Another hardware revision of this game uses a PIC16 MCU. + +***************************************************************************/ + +class cnfball_state : public hh_tms1k_state +{ +public: + cnfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_ds8874(*this, "ds8874") + { } + + void cnfball(machine_config &config); + +private: + required_device m_ds8874; + void ds8874_output_w(u16 data); + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnfball_state::update_display() +{ + m_display->matrix(~m_grid, m_o | (m_r << 6 & 0x700)); +} + +void cnfball_state::ds8874_output_w(u16 data) +{ + m_grid = data; + update_display(); +} + +void cnfball_state::write_r(u16 data) +{ + // R5,R8: N/C + // R6,R7: speaker out + m_speaker->level_w(data >> 6 & 3); + + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R0: DS8874N CP (note: it goes back to K8 too, game relies on it) + // R1: DS8874N _DATA + m_ds8874->cp_w(BIT(data, 0)); + m_ds8874->data_w(BIT(data, 1)); + + // R2-R4: led data + m_r = data; + update_display(); +} + +void cnfball_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cnfball_state::read_k() +{ + // K: multiplexed inputs, K8 also tied to DS8874N CP(R0) + return read_inputs(2) | (m_r << 3 & 8); +} + +// config + +static INPUT_PORTS_START( cnfball ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) // college + PORT_CONFSETTING( 0x00, "2" ) // professional +INPUT_PORTS_END + +void cnfball_state::cnfball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(cnfball_state::read_k)); + m_maincpu->r().set(FUNC(cnfball_state::write_r)); + m_maincpu->o().set(FUNC(cnfball_state::write_o)); + + // video hardware + DS8874(config, m_ds8874).write_output().set(FUNC(cnfball_state::ds8874_output_w)); + PWM_DISPLAY(config, m_display).set_size(9, 8+3); + m_display->set_segmask(0xc3, 0x7f); + m_display->set_segmask(0x38, 0xff); // only the middle 3 7segs have DP + m_display->set_bri_levels(0.01, 0.1); // player led is brighter + config.set_default_layout(layout_cnfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnfball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic Football II + * TMS1100 MP1181 (no decap) + * 9-digit LED grid, 1-bit sound + + This is a clone of Coleco's Quarterback, similar at hardware-level too. + Unlike the other LED Football games, this one looks like it doesn't make + the offense(player) leds brighter. + + known releases: + - Hong Kong: Electronic Football II, published by Conic + - USA: Electronic Football II, published by Tandy + +***************************************************************************/ + +class cnfball2_state : public hh_tms1k_state +{ +public: + cnfball2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnfball2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnfball2_state::update_display() +{ + // R1 selects between segments B/C or A'/D' + u16 seg = m_o; + if (~m_r & 2) + seg = (m_o << 7 & 0x300) | (m_o & 0xf9); + + m_display->matrix(m_r >> 2 & 0x1ff, seg); +} + +void cnfball2_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R8-R10: input mux + m_inp_mux = data >> 8 & 7; + + // R1-R10: select digit/segment + m_r = data; + update_display(); +} + +void cnfball2_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 cnfball2_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( cnfball2 ) + PORT_START("IN.0") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x00, "Factory Test" ) + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x02, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass/run + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // college + PORT_CONFSETTING( 0x08, "2" ) // professional + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void cnfball2_state::cnfball2(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(cnfball2_state::read_k)); + m_maincpu->r().set(FUNC(cnfball2_state::write_r)); + m_maincpu->o().set(FUNC(cnfball2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 11); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_cnfball2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( cnfball2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump, 2nd half unused + ROM_LOAD16_BYTE( "tms1100_cnfball2_output.bin", 0, 0x20, CRC(c51d7404) SHA1(3a00c69b52b7d0dd12ccd66428130592c7e06240) ) +ROM_END + + + + + +/*************************************************************************** + + Conic Electronic I.Q. + * PCB labels: main: CONIC 101-037 (other side: HG-15, 11*00198*00), button PCB: + CONIC 102-001, led PCB: CONIC 100-003 REV A itac + * TMS1000NLL MP0908 (die label 1000B, MP0908) + * 2 7seg LEDs, 30 other LEDs, 1-bit sound + + This is a peg solitaire game, with random start position. + + known releases: + - Hong Kong: Electronic I.Q., published by Conic + - UK: Solitaire, published by Grandstand + +***************************************************************************/ + +class eleciq_state : public hh_tms1k_state +{ +public: + eleciq_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void eleciq(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void eleciq_state::update_display() +{ + m_display->matrix(m_r & ~1, m_o); +} + +void eleciq_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R1-R6,R9: input mux + m_inp_mux = (data >> 1 & 0x3f) | (data >> 3 & 0x40); + + // R1-R6: led select + // R7,R8: digit select + m_r = data; + update_display(); +} + +void eleciq_state::write_o(u16 data) +{ + // O0-O6: led/digit segment data + // O7: N/C + m_o = data; + update_display(); +} + +u8 eleciq_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +static INPUT_PORTS_START( eleciq ) + PORT_START("IN.0") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Up-Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Up") + + PORT_START("IN.1") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button B") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Up-Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Down") + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Down-Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Left") + + PORT_START("IN.3") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button D") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Down-Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Right") + + PORT_START("IN.4") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button E") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button F") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R9 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x01, "2" ) // professional + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) +INPUT_PORTS_END + +void eleciq_state::eleciq(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=50pF + m_maincpu->k().set(FUNC(eleciq_state::read_k)); + m_maincpu->r().set(FUNC(eleciq_state::write_r)); + m_maincpu->o().set(FUNC(eleciq_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x180, 0x7f); + config.set_default_layout(layout_eleciq); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( eleciq ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) ) +ROM_END + + + + + +/*************************************************************************** + + Electroplay Quickfire + * TMS1000NLL MP3260 (die label same) + * 2 7seg LEDs, 5 lamps, 3 lightsensors, lightgun + + To play it in MAME, either use the clickable artwork with -mouse, or set + button 1 to "Z or X or C" and each lightsensor to one of those keys. + Although the game seems mostly playable without having to use the gun trigger + +***************************************************************************/ + +class qfire_state : public hh_tms1k_state +{ +public: + qfire_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void qfire(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void qfire_state::write_r(u16 data) +{ + // R1,R2,R5: input mux + m_inp_mux = (data >> 1 & 3) | (data >> 3 & 4); + + // R3,R4,R6-R8: leds (direct) + m_display->write_row(2, (data >> 3 & 3) | (data >> 4 & 0x1c)); + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); +} + +void qfire_state::write_o(u16 data) +{ + // O0: 1st digit "1" + // O1-O7: 2nd digit segments + m_display->write_row(0, (data & 1) ? 6 : 0); + m_display->write_row(1, data >> 1 & 0x7f); +} + +u8 qfire_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( qfire ) + PORT_START("IN.0") // R1 + PORT_CONFNAME( 0x0f, 0x00, "Game" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x02, "4" ) + PORT_CONFSETTING( 0x01, "5" ) + PORT_CONFSETTING( 0x06, "6" ) + + PORT_START("IN.1") // R2 + PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "A" ) + PORT_CONFSETTING( 0x02, "B" ) + PORT_CONFSETTING( 0x01, "C" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // lightgun trigger, also turns on lightgun lamp +INPUT_PORTS_END + +void qfire_state::qfire(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(qfire_state::read_k)); + m_maincpu->r().set(FUNC(qfire_state::write_r)); + m_maincpu->o().set(FUNC(qfire_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_qfire); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( qfire ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3260", 0x0000, 0x0400, CRC(f6e28376) SHA1(6129584c55a1629b458694cdc97edccb77ab00ba) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_qfire_output.pla", 0, 365, CRC(8f7668a9) SHA1(c8faeff0f88bfea8f032ce5bc583f049e8930c11) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Soccer + * TMS1000NL MP0158 (die label 1000B, MP0158) + * 2 7seg LEDs, 30 other LEDs, 1-bit sound + + known releases: + - USA: Electronic Soccer, 2 versions (leds on green bezel, or leds under bezel) + - Germany: Fussball, with skill switch + +***************************************************************************/ + +class esoccer_state : public hh_tms1k_state +{ +public: + esoccer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void esoccer(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void esoccer_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void esoccer_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void esoccer_state::write_o(u16 data) +{ + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 esoccer_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( esoccer ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R2 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // Auto + PORT_CONFSETTING( 0x02, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL +INPUT_PORTS_END + +void esoccer_state::esoccer(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 475000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(esoccer_state::read_k)); + m_maincpu->r().set(FUNC(esoccer_state::write_r)); + m_maincpu->o().set(FUNC(esoccer_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x300, 0x7f); + m_display->set_bri_levels(0.008, 0.08); // player led is brighter + config.set_default_layout(layout_esoccer); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( esoccer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball (1) + * TMS1000NLP MP0914 (die label MP0914A) + * 1 7seg LED, and other LEDs behind bezel, 1-bit sound + + This is a handheld LED baseball game. One player controls the batter, the CPU + or other player controls the pitcher. Pitcher throw buttons are on a 'joypad' + obtained from a compartment in the back. Player scores are supposed to be + written down manually, the game doesn't save scores or innings (this annoyance + was resolved in the sequel). For more information, refer to the official manual. + + The overlay graphic is known to have 2 versions: one where the field players + are denoted by words ("left", "center", "short", etc), and an alternate one + with little guys drawn next to the LEDs. + + led translation table: led LDzz from game PCB = MAME y.x: + + 0 = - 10 = 1.2 20 = 4.2 30 = 6.0 + 1 = 2.3 11 = 0.4 21 = 4.1 31 = 6.1 + 2 = 0.0 12 = 1.5 22 = 4.0 32 = 6.2 + 3 = 0.1 13 = 2.2 23 = 4.3 33 = 7.0 + 4 = 0.2 14 = 3.3 24 = 5.3 34 = 7.1 + 5 = 1.0 15 = 3.2 25 = 5.2 + 6 = 1.3 16 = 2.1 26 = 5.1 + 7 = 1.1 17 = 3.1 27 = 5.0 + 8 = 0.3 18 = 3.0 28 = 7.2 + 9 = 1.4 19 = 2.0 29 = 7.3 + +***************************************************************************/ + +class ebball_state : public hh_tms1k_state +{ +public: + ebball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebball_state::update_display() +{ + m_display->matrix(m_r, ~m_o); +} + +void ebball_state::write_r(u16 data) +{ + // R1-R5: input mux + m_inp_mux = data >> 1 & 0x1f; + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0-R7: led select + // R8: digit select + m_r = data; + update_display(); +} + +void ebball_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 ebball_state::read_k() +{ + // K: multiplexed inputs (note: K8(Vss row) is always on) + return m_inputs[5]->read() | read_inputs(5); +} + +// config + +static INPUT_PORTS_START( ebball ) + PORT_START("IN.0") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Change Sides") + PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // Vss! + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") +INPUT_PORTS_END + +void ebball_state::ebball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=47pF + m_maincpu->k().set(FUNC(ebball_state::read_k)); + m_maincpu->r().set(FUNC(ebball_state::write_r)); + m_maincpu->o().set(FUNC(ebball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x100, 0x7f); + config.set_default_layout(layout_ebball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball 2 + * PCB label ZENY + * TMS1000 MCU, MP0923 (die label same) + * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + The Japanese version was published by Gakken, black case instead of white. + + The sequel to Entex Baseball, this version keeps up with score and innings. + As its predecessor, the pitcher controls are on a separate joypad. + + led translation table: led zz from game PCB = MAME y.x: + + 00 = - 10 = 9.4 20 = 7.4 30 = 5.0 + 01 = 5.3 11 = 9.3 21 = 7.5 31 = 5.1 + 02 = 0.7 12 = 9.2 22 = 8.0 32 = 5.2 + 03 = 1.7 13 = 6.2 23 = 8.1 33 = 4.0 + 04 = 2.7 14 = 7.0 24 = 8.2 34 = 4.1 + 05 = 9.7 15 = 7.1 25 = 8.3 35 = 3.1 + 06 = 9.0 16 = 6.1 26 = 8.4 36 = 3.0 + 07 = 9.5 17 = 7.2 27 = 8.5 37 = 3.3 + 08 = 6.3 18 = 7.3 28 = 4.2 38 = 3.2 + 09 = 9.1 19 = 6.0 29 = 4.3 + +***************************************************************************/ + +class ebball2_state : public hh_tms1k_state +{ +public: + ebball2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebball2_state::update_display() +{ + m_display->matrix(m_r ^ 0x7f, ~m_o); +} + +void ebball2_state::write_r(u16 data) +{ + // R3-R6: input mux + m_inp_mux = data >> 3 & 0xf; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R2: digit select + // R3-R9: led select + m_r = data; + update_display(); +} + +void ebball2_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 ebball2_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( ebball2 ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ebball2_state::ebball2(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ebball2_state::read_k)); + m_maincpu->r().set(FUNC(ebball2_state::write_r)); + m_maincpu->o().set(FUNC(ebball2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_ebball2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball2 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Baseball 3 + * PCB label ZENY + * TMS1100NLL 6007 MP1204 (rev. E!) (die label MP1204) + * 2*SN75492N LED display driver + * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + This is another improvement over Entex Baseball, where gameplay is a bit more + varied. Like the others, the pitcher controls are on a separate joypad. + + led translation table: led zz from game PCB = MAME y.x: + note: unlabeled panel leds are listed here as Sz, Bz, Oz, Iz, z left-to-right + + 00 = - 10 = 7.5 20 = 7.2 + 01 = 6.0 11 = 6.5 21 = 8.4 + 02 = 6.1 12 = 5.5 22 = 8.5 + 03 = 6.2 13 = 5.2 23 = 9.0 + 04 = 6.3 14 = 8.0 24 = 9.2 + 05 = 7.3 15 = 8.1 25 = 9.1 + 06 = 5.3 16 = 5.1 26 = 9.3 + 07 = 7.4 17 = 8.2 27 = 9.5 + 08 = 6.4 18 = 8.3 28 = 9.4 + 09 = 5.4 19 = 5.0 + + S1,S2: 4.0,4.1 + B1-B3: 3.0-3.2 + O1,O2: 4.2,4.3 + I1-I6: 2.0-2.5, I7-I9: 3.3-3.5 + +***************************************************************************/ + +class ebball3_state : public hh_tms1k_state +{ +public: + ebball3_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebball3(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void ebball3_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void ebball3_state::set_clock() +{ + // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz, + // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed + // it up to around ~440kHz. + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 440000 : 340000); +} + +void ebball3_state::update_display() +{ + m_display->matrix_partial(0, 10, m_r, m_o); + + // R0,R1 are normal 7segs + // R4,R7 contain segments(only F and B) for the two other digits + m_display->write_row(10, (m_display->read_row(4) & 0x20) | (m_display->read_row(7) & 0x02)); + m_display->write_row(11, ((m_display->read_row(4) & 0x10) | (m_display->read_row(7) & 0x01)) << 1); +} + +void ebball3_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1, digit select + // R2-R9: led select + m_r = data; + update_display(); +} + +void ebball3_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 ebball3_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +/* physical button layout and labels are like this: + + main device (batter side): remote pitcher: + + MAN + PRO | [FAST BALL] [CHANGE UP] [CURVE] [SLIDER] + | OFF| + o o [STEAL DEFENSE] [KNUCKLER] + AM AUTO + + [BUNT] [BATTER] [STEAL] +*/ + +static INPUT_PORTS_START( ebball3 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Steal Defense") + + PORT_START("IN.2") // R2 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // AUTO + PORT_CONFSETTING( 0x00, "2" ) // MAN + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Bunt") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, ebball3_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // AM + PORT_CONFSETTING( 0x01, "2" ) // PRO +INPUT_PORTS_END + +void ebball3_state::ebball3(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 340000); // see set_clock + m_maincpu->k().set(FUNC(ebball3_state::read_k)); + m_maincpu->r().set(FUNC(ebball3_state::write_r)); + m_maincpu->o().set(FUNC(ebball3_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10+2, 7); + m_display->set_segmask(3, 0x7f); + m_display->set_segmask(0xc00, 0x22); + config.set_default_layout(layout_ebball3); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebball3 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Space Battle + * TMS1000 EN-6004 MP0920 (die label 1000B, MP0920) + * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + The Japanese version was published by Gakken, same name. + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 1.1 20 = 2.3 30 = 5.2 + 1 = 0.0 11 = 1.2 21 = 3.0 31 = 5.3 + 2 = 0.1 12 = 1.3 22 = 3.1 32 = 6.0 + 3 = 0.2 13 = 1.4 23 = 3.2 33 = 6.1 + 4 = 0.3 14 = 1.5 24 = 3.3 34 = 6.2 + 5 = 0.4 15 = 1.6 25 = 4.0 35 = 7.0 + 6 = 0.5 16 = 1.7 26 = 4.1 36 = 7.1 + 7 = 0.6 17 = 2.0 27 = 4.2 + 8 = 0.7 18 = 2.1 28 = 5.0 + 9 = 1.0 19 = 2.2 29 = 5.1 + +***************************************************************************/ + +class esbattle_state : public hh_tms1k_state +{ +public: + esbattle_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void esbattle(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void esbattle_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void esbattle_state::write_r(u16 data) +{ + // R0,R1: input mux + m_inp_mux = data & 3; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void esbattle_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 esbattle_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( esbattle ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual +INPUT_PORTS_END + +void esbattle_state::esbattle(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(esbattle_state::read_k)); + m_maincpu->r().set(FUNC(esbattle_state::write_r)); + m_maincpu->o().set(FUNC(esbattle_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x300, 0x7f); + config.set_default_layout(layout_esbattle); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( esbattle ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Blast It + * TMS1000 MP0230 (die label 1000B, MP0230) + * 3 7seg LEDs, 49 other LEDs (both under an overlay mask), 1-bit sound + +***************************************************************************/ + +class blastit_state : public hh_tms1k_state +{ +public: + blastit_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void blastit(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void blastit_state::update_display() +{ + m_display->matrix(m_r >> 1, m_o); +} + +void blastit_state::write_r(u16 data) +{ + // R3: input mux + m_inp_mux = data >> 3 & 1; + + // R0: speaker out + m_speaker->level_w(data & 1); + + // R1-R7: led select + // R8-R10: digit select + m_r = data; + update_display(); +} + +void blastit_state::write_o(u16 data) +{ + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 blastit_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( blastit ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x08, "1" ) // AM + PORT_CONFSETTING( 0x00, "2" ) // PRO +INPUT_PORTS_END + +void blastit_state::blastit(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=33pF + m_maincpu->k().set(FUNC(blastit_state::read_k)); + m_maincpu->r().set(FUNC(blastit_state::write_r)); + m_maincpu->o().set(FUNC(blastit_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x380, 0x7f); + m_display->set_bri_levels(0.01, 0.115); // ball/paddle is slightly brighter + config.set_default_layout(layout_blastit); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( blastit ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0230", 0x0000, 0x0400, CRC(1eb5f473) SHA1(76cd8c0e04368aa2150d428018643e1d0b9adda0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_blastit_output.pla", 0, 365, CRC(fa8081df) SHA1(99706d5ad58a76d47446576fac18964e602171c8) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Space Invader + * TMS1100 MP1211 (die label same) + * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound + + There are two versions of this game: the first release(this one) is on + TMS1100, the second more widespread release runs on a COP400. There are + also differences with the overlay mask. + +***************************************************************************/ + +class einvader_state : public hh_tms1k_state +{ +public: + einvader_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + void einvader(machine_config &config); + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); +}; + +void einvader_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void einvader_state::set_clock() +{ + // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz, + // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed + // it up to around ~400kHz. + m_maincpu->set_unscaled_clock((m_inputs[0]->read() & 8) ? 400000 : 320000); +} + +void einvader_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void einvader_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R6: led select + // R7-R9: digit select + m_r = data; + update_display(); +} + +void einvader_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +// config + +static INPUT_PORTS_START( einvader ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, einvader_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void einvader_state::einvader(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 320000); // see set_clock + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(einvader_state::write_r)); + m_maincpu->o().set(FUNC(einvader_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(945, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x380, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // ufo/player explosion is brighter + config.set_default_layout(layout_einvader); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( einvader ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) ) + + ROM_REGION( 45196, "mask", 0) + ROM_LOAD( "einvader.svg", 0, 45196, CRC(35a1c744) SHA1(6beb9767454b9bc8f2ccf9fee25e7be209eefd22) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Color Football 4 + * TMS1670 6009 MP7551 (die label MP7551) + * 9-digit cyan VFD display, 60 red and green LEDs behind mask, 1-bit sound + + Another version exist, one with a LED(red) 7seg display. + +***************************************************************************/ + +class efootb4_state : public hh_tms1k_state +{ +public: + efootb4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void efootb4(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void efootb4_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void efootb4_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R0-R9: led select + // R10-R15: digit select + m_r = data; + update_display(); +} + +void efootb4_state::write_o(u16 data) +{ + // O7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // O0-O6: led state + m_o = data; + update_display(); +} + +u8 efootb4_state::read_k() +{ + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( efootb4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // 2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // 4 + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // 2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // 3 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // 4 + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Run") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Run") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // amateur + PORT_CONFSETTING( 0x02, "2" ) // professional + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Status") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void efootb4_state::efootb4(machine_config &config) +{ + // basic machine hardware + TMS1670(config, m_maincpu, 400000); // approximation - RC osc. R=42K, C=47pF + m_maincpu->k().set(FUNC(efootb4_state::read_k)); + m_maincpu->r().set(FUNC(efootb4_state::write_r)); + m_maincpu->o().set(FUNC(efootb4_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1920, 904); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(16, 7); + m_display->set_segmask(0xfc00, 0x7f); + config.set_default_layout(layout_efootb4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( efootb4 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) ) + + ROM_REGION( 67472, "mask", 0) + ROM_LOAD( "efootb4.svg", 0, 67472, CRC(ba0abcda) SHA1(6066e4cbae5404e4db17fae0153808b044adc823) ) +ROM_END + + + + + +/*************************************************************************** + + Entex (Electronic) Basketball 2 + * TMS1100 6010 MP1218 (die label MP1218) + * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + led translation table: led zz from game PCB = MAME y.x: + + 11 = 9.0 21 = 9.1 31 = 9.2 41 = 9.3 51 = 9.5 + 12 = 8.0 22 = 8.1 32 = 8.2 42 = 8.3 52 = 8.5 + 13 = 7.0 23 = 7.1 33 = 7.2 43 = 7.3 53 = 8.4 + 14 = 6.0 24 = 6.1 34 = 6.2 44 = 6.3 54 = 7.5 + 15 = 5.0 25 = 5.1 35 = 5.2 45 = 5.3 55 = 7.4 + 16 = 4.0 26 = 4.1 36 = 4.2 46 = 4.3 56 = 6.5 + + A = 9.4 + B = 6.4 + +***************************************************************************/ + +class ebaskb2_state : public hh_tms1k_state +{ +public: + ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ebaskb2(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ebaskb2_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void ebaskb2_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R6-R9: input mux + m_inp_mux = data >> 6 & 0xf; + + // R0-R3: digit select + // R4-R9: led select + m_r = data; + update_display(); +} + +void ebaskb2_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data; + update_display(); +} + +u8 ebaskb2_state::read_k() +{ + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( ebaskb2 ) + PORT_START("IN.0") // R6 + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) // amateur + PORT_CONFSETTING( 0x00, "2" ) // professional + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) // Auto + PORT_CONFSETTING( 0x00, "2" ) // Manual + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + + PORT_START("IN.1") // R7 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Shoot") + + PORT_START("IN.2") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.3") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY +INPUT_PORTS_END + +void ebaskb2_state::ebaskb2(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 360000); // approximation - RC osc. R=33K, C=82pF + m_maincpu->k().set(FUNC(ebaskb2_state::read_k)); + m_maincpu->r().set(FUNC(ebaskb2_state::write_r)); + m_maincpu->o().set(FUNC(ebaskb2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0xf, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // ball carrier led is brighter + config.set_default_layout(layout_ebaskb2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ebaskb2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) ) +ROM_END + + + + + +/*************************************************************************** + + Entex Raise The Devil + * TMS1100 MP1221 (die label same) + * 4 7seg LEDs(rightmost one unused), and other LEDs behind bezel, 1-bit sound + + Entex Black Knight (licensed handheld version of Williams' pinball game) + * TMS1100 MP1296 (no decap) + * same hardware as Raise The Devil + + raisedvl led translation table: led zz from game PCB = MAME y.x: + (no led labels on ebknight PCB) + + 0 = - 10 = 4.4 20 = 5.3 30 = 9.5 40 = 9.2 + 1 = 3.0 11 = 4.5 21 = 5.4 31 = 8.5 41 = 9.3 + 2 = 3.1 12 = - 22 = - 32 = 6.5 42 = 9.0 + 3 = 3.2 13 = 5.0 23 = 6.0 33 = 7.4 43 = 9.1 + 4 = 3.3 14 = 5.1 24 = 6.1 34 = 7.0 + 5 = 3.4 15 = 5.2 25 = 6.2 35 = 7.1 + 6 = 4.0 16 = - 26 = 6.3 36 = 8.0 + 7 = 4.1 17 = 7.2 27 = 6.4 37 = 8.1 + 8 = 4.2 18 = 7.3 28 = 8.4 38 = 8.2 + 9 = 4.3 19 = - 29 = 9.4 39 = 8.3 + + NOTE!: MAME external artwork is required + +***************************************************************************/ + +class raisedvl_state : public hh_tms1k_state +{ +public: + raisedvl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void raisedvl(machine_config &config); + void ebknight(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void raisedvl_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void raisedvl_state::set_clock() +{ + // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills + // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one. + // 0: R=47K -> ~350kHz + // 2,3: R=35K8 -> ~425kHz (combined) + // 4: R=32K -> ~465kHz (combined) + u8 inp = m_inputs[1]->read(); + m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000)); +} + +void raisedvl_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void raisedvl_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1: input mux + m_inp_mux = data & 3; + + // R0-R2: digit select + // R3-R9: led select + m_r = data; + update_display(); +} + +void raisedvl_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 raisedvl_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2) & 0xf; +} + +// config + +static INPUT_PORTS_START( raisedvl ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 (only bit 0) + PORT_CONFNAME( 0x31, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, raisedvl_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x10, "2" ) + PORT_CONFSETTING( 0x11, "3" ) + PORT_CONFSETTING( 0x21, "4" ) +INPUT_PORTS_END + +void raisedvl_state::raisedvl(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // see set_clock + m_maincpu->k().set(FUNC(raisedvl_state::read_k)); + m_maincpu->r().set(FUNC(raisedvl_state::write_r)); + m_maincpu->o().set(FUNC(raisedvl_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_raisedvl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void raisedvl_state::ebknight(machine_config &config) +{ + raisedvl(config); + config.set_default_layout(layout_ebknight); +} + +// roms + +ROM_START( raisedvl ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) +ROM_END + +ROM_START( ebknight ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1296", 0x0000, 0x0800, CRC(bc57a46a) SHA1(f60843779f49a8bd28291df3390086e54b9e3f40) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified, taken from raisedvl + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ebknight_output.pla", 0, 365, BAD_DUMP CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) // " +ROM_END + + + + + +/*************************************************************************** + + Entex Musical Marvin + * TMS1100 MP1228 (no decap) + * 1 7seg LED, 8 other leds, 1-bit sound with volume decay + * dials for speed, tone (volume decay), volume (also off/on switch) + + The design patent was assigned to Hanzawa (Japan), so it's probably + manufactured by them. + +***************************************************************************/ + +class mmarvin_state : public hh_tms1k_state +{ +public: + mmarvin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_volume(*this, "volume"), + m_speed_timer(*this, "speed") + { } + + void mmarvin(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_volume; + required_device m_speed_timer; + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; +}; + +void mmarvin_state::machine_start() +{ + hh_tms1k_state::machine_start(); + save_item(NAME(m_speaker_volume)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(mmarvin_state::speaker_decay_sim) +{ + m_volume->flt_volume_set_volume(m_speaker_volume); + + // volume decays when speaker is off, decay scale is determined by tone dial + double step = (1.01 - 1.003) / 255.0; // approximation + m_speaker_volume /= 1.01 - (double)(u8)m_inputs[5]->read() * step; +} + +void mmarvin_state::update_display() +{ + u8 digit = bitswap<7>(m_o,6,2,1,0,5,4,3); // 7seg is upside-down + m_display->matrix(m_r, (m_o << 1 & 0x100) | (m_r & 0x80) | digit); +} + +void mmarvin_state::write_r(u16 data) +{ + // R2-R5: input mux + m_inp_mux = data >> 2 & 0xf; + + // R6: trigger speed dial timer + if (m_r & 0x40 && ~data & 0x40) + { + double step = (2100 - 130) / 255.0; // duration range is around 0.13s to 2.1s + m_speed_timer->adjust(attotime::from_msec(2100 - (u8)m_inputs[4]->read() * step)); + } + + // R10: speaker out + m_speaker->level_w(BIT(m_r, 10)); + + // R9: trigger speaker on + if (m_r & 0x200 && ~data & 0x200) + m_volume->flt_volume_set_volume(m_speaker_volume = 1.0); + + // R0,R1: digit/led select + // R7: digit DP + m_r = data; + update_display(); +} + +void mmarvin_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 mmarvin_state::read_k() +{ + // K1-K4: multiplexed inputs + // K8: speed dial state + return (read_inputs(4) & 7) | (m_speed_timer->enabled() ? 0 : 8); +} + +// config + +static INPUT_PORTS_START( mmarvin ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Mode") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button Do 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button Re") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button Mi") + + PORT_START("IN.2") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button Fa") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button Sol") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Button La") + + PORT_START("IN.3") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Button Ti") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Button Do 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Space") + + PORT_START("IN.4") + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(1) PORT_NAME("Speed Dial") + + PORT_START("IN.5") + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(2) PORT_NAME("Tone Dial") +INPUT_PORTS_END + +void mmarvin_state::mmarvin(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=51K, C=47pF + m_maincpu->k().set(FUNC(mmarvin_state::read_k)); + m_maincpu->r().set(FUNC(mmarvin_state::write_r)); + m_maincpu->o().set(FUNC(mmarvin_state::write_o)); + + TIMER(config, "speed").configure_generic(nullptr); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2, 9); + m_display->set_segmask(1, 0xff); + config.set_default_layout(layout_mmarvin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(mmarvin_state::speaker_decay_sim), attotime::from_msec(1)); +} + +// roms + +ROM_START( mmarvin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1228", 0x0000, 0x0800, CRC(68ce3ab6) SHA1(15f7fb3f438116bf6128f11c981bdc0852d5a4ec) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_mmarvin_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_mmarvin_output.bin", 0, 0x20, CRC(a274951f) SHA1(7e91ddd42c132942a32351649eaf1107b5b0285c) ) +ROM_END + + + + + +/*************************************************************************** + + Fonas 2 Player Baseball + * PCB label CA-014 (probably Cassia) + * TMS1000NLL MP0154 (die label 1000B, MP0154) + * 4 7seg LEDs, 37 other LEDs, 1-bit sound + + known releases: + - World: 2 Player Baseball, published by Fonas + - USA: 2 Player Baseball, published by Sears + - Canada: 2 Player Baseball, published by Talbot Electronics + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 2.2 20 = 4.0 30 = 4.4 + 1 = 2.3 11 = 3.3 21 = 2.7 31 = 3.7 + 2 = 0.4 12 = 1.2 22 = 0.0 32 = 4.3 + 3 = 3.2 13 = 2.4 23 = 4.1 33 = 4.6 + 4 = 0.5 14 = 1.0 24 = 3.1 34 = 3.5 + 5 = 0.3 15 = 2.1 25 = 0.2 35 = 4.5 + 6 = 3.4 16 = 1.1 26 = 0.1 + 7 = 1.3 17 = 4.7 27 = 4.2 + 8 = 1.4 18 = 2.0 28 = 3.0 + 9 = 1.7 19 = 0.7 29 = 1.5 + +***************************************************************************/ + +class f2pbball_state : public hh_tms1k_state +{ +public: + f2pbball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void f2pbball(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void f2pbball_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void f2pbball_state::write_r(u16 data) +{ + // R4,R9,R10: input mux + m_inp_mux = (data >> 4 & 1) | (data >> 8 & 6); + + // R9,R10(ANDed together): speaker out + m_speaker->level_w(data >> 10 & data >> 9 & 1); + + // R0-R4: led select + // R5-R8: digit select + m_r = data; + update_display(); +} + +void f2pbball_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); + update_display(); +} + +u8 f2pbball_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( f2pbball ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pick Off") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "Practice" ) // middle switch + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.1") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pitch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Swing") + + PORT_START("IN.2") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast") + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) +INPUT_PORTS_END + +void f2pbball_state::f2pbball(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=51K, C=39pF + m_maincpu->k().set(FUNC(f2pbball_state::read_k)); + m_maincpu->r().set(FUNC(f2pbball_state::write_r)); + m_maincpu->o().set(FUNC(f2pbball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1e0, 0x7f); + config.set_default_layout(layout_f2pbball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( f2pbball ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) ) +ROM_END + + + + + +/*************************************************************************** + + Fonas 3 in 1: Football, Basketball, Soccer + * PCB label HP-801 + * TMS1100NLL MP1185 + * 4 7seg LEDs, 40 other LEDs, 1-bit sound + + It's not known if this game has an official title. The current one is + taken from the handheld front side. + MAME external artwork is needed for the switchable overlays. + +***************************************************************************/ + +class f3in1_state : public hh_tms1k_state +{ +public: + f3in1_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void f3in1(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void f3in1_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void f3in1_state::set_clock() +{ + // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG) + m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 400000 : 300000); +} + +void f3in1_state::update_display() +{ + m_display->matrix(m_r & ~0x20, m_o); +} + +void f3in1_state::write_r(u16 data) +{ + // R0-R2,R4: input mux + m_inp_mux = (data & 7) | (data >> 1 & 8); + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R4: led select + // R6-R9: digit select + m_r = data; + update_display(); +} + +void f3in1_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 f3in1_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( f3in1 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("K Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("D Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0e, 0x02, "Game Select" ) + PORT_CONFSETTING( 0x02, "Football" ) + PORT_CONFSETTING( 0x04, "Basketball" ) + PORT_CONFSETTING( 0x08, "Soccer" ) + + PORT_START("IN.4") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, f3in1_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "1" ) // REG + PORT_CONFSETTING( 0x01, "2" ) // PROF +INPUT_PORTS_END + +void f3in1_state::f3in1(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // see set_clock + m_maincpu->k().set(FUNC(f3in1_state::read_k)); + m_maincpu->r().set(FUNC(f3in1_state::write_r)); + m_maincpu->o().set(FUNC(f3in1_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3c0, 0x7f); + m_display->set_bri_levels(0.003, 0.05); // player led is brighter + config.set_default_layout(layout_f3in1); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( f3in1 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1185", 0x0000, 0x0800, CRC(53f7b28d) SHA1(2249890e3a259095193b4331ca88c29ccd81eefe) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_f3in1_output.pla", 0, 365, CRC(51d947bc) SHA1(f766397d84f038be96e83d40989195c98ddcb1d9) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Poker + * PCB label POKER. gakken + * TMS1370 MP2105 (die label same) + * 11-digit cyan VFD display Itron FG1114B, oscillator sound + + known releases: + - Japan: Poker, published by Gakken + - USA: Electronic Poker, published by Entex + +***************************************************************************/ + +class gpoker_state : public hh_tms1k_state +{ +public: + gpoker_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_beeper(*this, "beeper") + { } + + void gpoker(machine_config &config); + +protected: + required_device m_beeper; + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void gpoker_state::update_display() +{ + u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; + m_display->matrix(m_r & 0x7ff, segs | (m_r >> 3 & 0xf00)); +} + +void gpoker_state::write_r(u16 data) +{ + // R15: enable beeper + m_beeper->set_state(data >> 15 & 1); + + // R0-R6: input mux + m_inp_mux = data & 0x7f; + + // R0-R10: select digit + // R11-R14: card symbols + m_r = data; + update_display(); +} + +void gpoker_state::write_o(u16 data) +{ + // O0-O7: digit segments A-G,H + m_o = data; + update_display(); +} + +u8 gpoker_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +/* physical button layout and labels are like this: + + [7] [8] [9] [DL] | (on/off switch) + [4] [5] [6] [BT] + [1] [2] [3] [CA] [CE] + [0] [GO] [T] [AC] +*/ + +static INPUT_PORTS_START( gpoker ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x06, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear All") // AC + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Call") // CA + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT + + PORT_START("FAKE") // 9/DL are electronically the same button + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL +INPUT_PORTS_END + +void gpoker_state::gpoker(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(gpoker_state::read_k)); + m_maincpu->r().set(FUNC(gpoker_state::write_r)); + m_maincpu->o().set(FUNC(gpoker_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 14); + m_display->set_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal + config.set_default_layout(layout_gpoker); + + // sound hardware + SPEAKER(config, "mono").front_center(); + BEEP(config, m_beeper, 2400); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K + m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( gpoker ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Jackpot: Gin Rummy & Black Jack + * PCB label gakken + * TMS1670 MPF553 (die label same) + * 11-digit cyan VFD display Itron FG1114B, oscillator sound + + known releases: + - Japan: Jackpot(?), published by Gakken + - USA: Electronic Jackpot: Gin Rummy & Black Jack, published by Entex + +***************************************************************************/ + +class gjackpot_state : public gpoker_state +{ +public: + gjackpot_state(const machine_config &mconfig, device_type type, const char *tag) : + gpoker_state(mconfig, type, tag) + { } + + void gjackpot(machine_config &config); + +private: + virtual void write_r(u16 data) override; +}; + +// handlers + +void gjackpot_state::write_r(u16 data) +{ + // same as gpoker, only input mux msb is R10 instead of R6 + gpoker_state::write_r(data); + m_inp_mux = (data & 0x3f) | (data >> 4 & 0x40); +} + +// config + +/* physical button layout and labels are like this: + (note: on dual-function buttons, upper label=Gin, lower label=Black Jack) + + BJ --o GIN + OFF + [7] [8] [9] [DL] + + [4] [5] [6] [ [KN + DB] SP] + [1] [2] [3] [DS] [DR] + BT] HT] + [10/0] [T] [MD [CH [AC] + GO] ST] +*/ + +static INPUT_PORTS_START( gjackpot ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10/0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Draw/Hit") // DR/HT + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Knock/Split") // KN/SP + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Display/Bet") // DS/BT + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Meld/Go") // MD/GO + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Double") // DB + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Change/Stand") // CH/ST + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE + PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R10 + PORT_CONFNAME( 0x06, 0x04, "Game Select" ) + PORT_CONFSETTING( 0x04, "Gin Rummy" ) + PORT_CONFSETTING( 0x02, "Black Jack" ) + PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void gjackpot_state::gjackpot(machine_config &config) +{ + gpoker(config); + + // basic machine hardware + TMS1670(config.replace(), m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(gjackpot_state::read_k)); + m_maincpu->r().set(FUNC(gjackpot_state::write_r)); + m_maincpu->o().set(FUNC(gjackpot_state::write_o)); + + config.set_default_layout(layout_gjackpot); +} + +// roms + +ROM_START( gjackpot ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Invader + * PCB label GAKKEN, INVADER, KS-00779 + * TMS1370 MP2110 + * cyan VFD display Itron? CP5008A, 1-bit sound + + known releases: + - World: Invader, published by Gakken + - USA(1): Galaxy Invader, published by CGL + - USA(2): Fire Away, published by Tandy + - USA(3): Electron Blaster, published by Vanity Fair + + On the real thing, the joystick is "sticky"(it doesn't autocenter when you let go). + There's also a version with a cyan/red VFD, possibly the same ROM. + +***************************************************************************/ + +class ginv_state : public hh_tms1k_state +{ +public: + ginv_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ginv(machine_config &config); + +private: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ginv_state::write_r(u16 data) +{ + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R15: speaker out + m_speaker->level_w(data >> 15 & 1); + + // R0-R8: VFD grid + // R11-R14: VFD plate + m_grid = data & 0x1ff; + m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); + update_display(); +} + +void ginv_state::write_o(u16 data) +{ + // O0-O7: VFD plate + m_plate = (m_plate & ~0xff) | data; + update_display(); +} + +u8 ginv_state::read_k() +{ + // K1-K4: multiplexed inputs (K8 is fire button) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +static INPUT_PORTS_START( ginv ) + PORT_START("IN.0") // R9 + PORT_CONFNAME( 0x07, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x05, EQUALS, 0x00) // joystick centered + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) +INPUT_PORTS_END + +void ginv_state::ginv(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ginv_state::read_k)); + m_maincpu->r().set(FUNC(ginv_state::write_r)); + m_maincpu->o().set(FUNC(ginv_state::write_o)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(236, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ginv ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2110", 0x0000, 0x0800, CRC(f09c5588) SHA1(06eb8ed512eaf5367ea30c2b633219e105ddfd14) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ginv_output.pla", 0, 365, CRC(6e33a24e) SHA1(cdf7ecf12ddd3863e6301e20fe80f9737db429e5) ) + + ROM_REGION( 142959, "screen", 0) + ROM_LOAD( "ginv.svg", 0, 142959, CRC(b0dc9bac) SHA1(18f8cc51a432d14f08fdf766275222f3ed184d89) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Invader 1000 + * TMS1370 MP2139 (die label 1170 MP2139) + * cyan/red VFD display Futaba DM-25Z 2D, 1-bit sound + + known releases: + - World: Galaxy Invader 1000, published by Gakken + - Japan: Invader 1000, published by Gakken + - USA(1): Galaxy Invader 1000, published by CGL + - USA(2): Cosmic 1000 Fire Away, published by Tandy + +***************************************************************************/ + +class ginv1000_state : public hh_tms1k_state +{ +public: + ginv1000_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ginv1000(machine_config &config); + +private: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv1000_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7); + u16 plate = bitswap<16>(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0); + m_display->matrix(grid, plate); +} + +void ginv1000_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R8,R15: input mux + m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2); + + // R1-R10: VFD grid + // R11-R14: VFD plate + m_grid = data >> 1 & 0x3ff; + m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); + update_display(); +} + +void ginv1000_state::write_o(u16 data) +{ + // O0-O7: VFD plate + m_plate = (m_plate & ~0xff) | data; + update_display(); +} + +u8 ginv1000_state::read_k() +{ + // K1,K2: multiplexed inputs (K8 is fire button) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +static INPUT_PORTS_START( ginv1000 ) + PORT_START("IN.0") // R8 + PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFSETTING( 0x02, "3" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R15 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) +INPUT_PORTS_END + +void ginv1000_state::ginv1000(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(ginv1000_state::read_k)); + m_maincpu->r().set(FUNC(ginv1000_state::write_r)); + m_maincpu->o().set(FUNC(ginv1000_state::write_o)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(226, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ginv1000 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) ) + + ROM_REGION( 227224, "screen", 0) + ROM_LOAD( "ginv1000.svg", 0, 227224, CRC(f220711a) SHA1(729ad85fb9d9853a77c45b5ed072f10ede7649c4) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken Invader 2000 + * TMS1370(28 pins) MP1604 (die label 1370A MP1604) + * TMS1024 I/O expander + * cyan/red/green VFD display, 1-bit sound + + known releases: + - World: Invader 2000, published by Gakken + - USA(1): Galaxy Invader 10000, published by CGL + - USA(2): Cosmic 3000 Fire Away, published by Tandy + +***************************************************************************/ + +class ginv2000_state : public hh_tms1k_state +{ +public: + ginv2000_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_expander(*this, "expander") + { } + + void ginv2000(machine_config &config); + +private: + required_device m_expander; + void expander_w(offs_t offset, u8 data); + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ginv2000_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void ginv2000_state::expander_w(offs_t offset, u8 data) +{ + // TMS1024 port 4-7: VFD plate + int shift = (offset - tms1024_device::PORT4) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ginv2000_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R11,R12: input mux + m_inp_mux = data >> 11 & 3; + + // R11,R12: TMS1024 S1,S0 (S2 forced high) + // R13: TMS1024 STD + m_expander->write_s((data >> 12 & 1) | (data >> 10 & 2) | 4); + m_expander->write_std(data >> 13 & 1); + + // R1-R10: VFD grid + m_grid = data >> 1 & 0x3ff; + update_display(); +} + +void ginv2000_state::write_o(u16 data) +{ + // O4-O7: TMS1024 H1-H4 + m_expander->write_h(data >> 4 & 0xf); +} + +u8 ginv2000_state::read_k() +{ + // K1,K2: multiplexed inputs (K8 is fire button) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +static INPUT_PORTS_START( ginv2000 ) + PORT_START("IN.0") // R11 + PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R12 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) +INPUT_PORTS_END + +void ginv2000_state::ginv2000(machine_config &config) +{ + // basic machine hardware + TMS1370(config, m_maincpu, 425000); // approximation - RC osc. R=36K, C=47pF + m_maincpu->k().set(FUNC(ginv2000_state::read_k)); + m_maincpu->r().set(FUNC(ginv2000_state::write_r)); + m_maincpu->o().set(FUNC(ginv2000_state::write_o)); + + TMS1024(config, m_expander).set_ms(1); // MS tied high + m_expander->write_port4_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port5_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port6_callback().set(FUNC(ginv2000_state::expander_w)); + m_expander->write_port7_callback().set(FUNC(ginv2000_state::expander_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(364, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ginv2000 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1604", 0x0000, 0x0800, CRC(f1646d0b) SHA1(65601931d81e3eef7bf22a08de5a146910ce8137) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_ginv2000_output.pla", 0, 365, CRC(520bb003) SHA1(1640ae54f8dcc257e0ad0cbe0281b38fcbd8da35) ) + + ROM_REGION( 374443, "screen", 0) + ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) ) +ROM_END + + + + + +/*************************************************************************** + + Gakken FX-Micom R-165 + * TMS1100 MCU, label MP1312 (die label MP1312A) + * 1 7seg led, 6 other leds, 1-bit sound + + This is a simple educational home computer. Refer to the extensive manual + for more information. It was published later in the USA by Tandy(Radio Shack), + under their Science Fair series. Another 25 years later, Gakken re-released + the R-165 as GMC-4, obviously on modern hardware, but fully compatible. + + known releases: + - Japan: FX-Micom R-165, published by Gakken + - USA: Science Fair Microcomputer Trainer, published by Tandy. Of note is + the complete redesign of the case, adding more adjustable wiring + +***************************************************************************/ + +class fxmcr165_state : public hh_tms1k_state +{ +public: + fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void fxmcr165(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void fxmcr165_state::update_display() +{ + // 7seg digit from O0-O6 + m_display->write_row(0, bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f); + + // leds from R4-R10 + m_display->write_row(1, m_r >> 4 & 0x7f); +} + +void fxmcr165_state::write_r(u16 data) +{ + // R0-R3: input mux low + m_inp_mux = (m_inp_mux & 0x10) | (data & 0xf); + + // R7: speaker out + m_speaker->level_w(data >> 7 & 1); + + // R4-R10: led data (direct) + m_r = data; + update_display(); +} + +void fxmcr165_state::write_o(u16 data) +{ + // O7: input mux high + m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); + + // O0-O6: digit segments (direct) + m_o = data; + update_display(); +} + +u8 fxmcr165_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + [C] [D] [E] [F] [ADR SET] + [8] [9] [A] [B] [INCR] + [4] [5] [6] [7] [RUN] + [0] [1] [2] [3] [RESET] +*/ + +static INPUT_PORTS_START( fxmcr165 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") + + PORT_START("IN.4") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Reset") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Run") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Increment") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Address Set") +INPUT_PORTS_END + +void fxmcr165_state::fxmcr165(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->k().set(FUNC(fxmcr165_state::read_k)); + m_maincpu->r().set(FUNC(fxmcr165_state::write_r)); + m_maincpu->o().set(FUNC(fxmcr165_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1+1, 7); + m_display->set_segmask(1, 0x7f); + config.set_default_layout(layout_fxmcr165); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( fxmcr165 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) ) +ROM_END + + + + + +/*************************************************************************** + + Ideal Electronic Detective + * TMS0980NLL MP6100A (die label 0980B-00) + * 10-digit 7seg LED display, 2-level sound + + hardware (and concept) is very similar to Parker Brothers Stop Thief + + This is an electronic board game. It requires game cards with suspect info, + and good old pen and paper to record game progress. To start the game, enter + difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the + manual for more information. + +***************************************************************************/ + +class elecdet_state : public hh_tms1k_state +{ +public: + elecdet_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void elecdet(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void elecdet_state::write_r(u16 data) +{ + // R7,R8: speaker out + m_speaker->level_w((m_o & 0x80) ? (data >> 7 & 3) : 0); + + // R0-R6: select digit + m_display->matrix(data, bitswap<8>(m_o,7,5,2,1,4,0,6,3)); +} + +void elecdet_state::write_o(u16 data) +{ + // O0,O1,O4,O6: input mux + m_inp_mux = (data & 3) | (data >> 2 & 4) | (data >> 3 & 8); + + // O0-O6: digit segments A-G + // O7: speaker on -> write_r + m_o = data; +} + +u8 elecdet_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[4]->read() | read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + [1] [2] [3] [SUSPECT] + [4] [5] [6] [PRIVATE QUESTION] + [7] [8] [9] [I ACCUSE] + [0] [ENTER] + [ON] [OFF] [END TURN] +*/ + +static INPUT_PORTS_START( elecdet ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.3") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.4") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void elecdet_state::elecdet(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 425000); // approximation + m_maincpu->k().set(FUNC(elecdet_state::read_k)); + m_maincpu->r().set(FUNC(elecdet_state::write_r)); + m_maincpu->o().set(FUNC(elecdet_state::write_o)); + m_maincpu->power_off().set(FUNC(elecdet_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 7); + m_display->set_segmask(0x7f, 0x7f); + config.set_default_layout(layout_elecdet); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 0.5, 0.5, 1.0}; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( elecdet ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + Kenner Star Wars - Electronic Battle Command + * TMS1100 MCU, label MP3438A (die label 1100B, MP3438A) + * 4x4 LED grid display + 2 separate LEDs and 2-digit 7segs, 1-bit sound + + This is a small tabletop space-dogfighting game. To start the game, + press BASIC/INTER/ADV and enter P#(number of players), then + START TURN. Refer to the official manual for more information. + +***************************************************************************/ + +class starwbc_state : public hh_tms1k_state +{ +public: + starwbc_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void starwbc(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void starwbc_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void starwbc_state::write_r(u16 data) +{ + // R0,R1,R3,R5,R7: input mux + m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10); + + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0,R2,R4: led select + // R6,R8: digit select + m_r = data & 0x155; + update_display(); +} + +void starwbc_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = (data << 4 & 0xf0) | (data >> 4 & 0x0f); + update_display(); +} + +u8 starwbc_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + (reconnnaissance=yellow) (tactical reaction=green) + [MAGNA] [ENEMY] [EM] [BS] [SCR] + + [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE] + [ADV] [P#] [<] [^] [>] [v] + (game=blue) (maneuvers=red) +*/ + +static INPUT_PORTS_START( starwbc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn") + + PORT_START("IN.2") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up") + + PORT_START("IN.3") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") +INPUT_PORTS_END + +void starwbc_state::starwbc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=51K, C=47pF + m_maincpu->k().set(FUNC(starwbc_state::read_k)); + m_maincpu->r().set(FUNC(starwbc_state::write_r)); + m_maincpu->o().set(FUNC(starwbc_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x140, 0x7f); + config.set_default_layout(layout_starwbc); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( starwbc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) +ROM_END + +ROM_START( starwbcp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) +ROM_END + + + + + +/*************************************************************************** + + Kenner Live Action Football + * TMS1100NLL MCU, label MP3489-N2 (die label 1100E, MP3489) + * 6-digit 7seg LED display, other LEDs under overlay, 1-bit sound + + The LEDs are inside reflective domes, with an overlay mask on top of that. + It is done with an SVG screen on MAME. In reality, the display is not as + sharp or as evenly lit as MAME suggests it to be. + + It has a 1-bit roller controller. Half of the axis connects to the input + (eg. 1 rising edge per full rotation), so there's no difference between + rotating left or right. + +***************************************************************************/ + +class liveafb_state : public hh_tms1k_state +{ +public: + liveafb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void liveafb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void liveafb_state::update_display() +{ + u8 d = (~m_r & 0x100) ? (m_r & 0x3f) : 0; // digit select + u8 l = (m_r & 0x100) ? (m_r & 0xf) : 0; // led select + m_display->matrix(d | l << 6 | BIT(m_r, 6) << 10 | BIT(m_r, 8, 3) << 11, m_o | (m_r << 4 & 0x300)); +} + +void liveafb_state::write_r(u16 data) +{ + // R0-R3: input mux + m_inp_mux = data & 0xf; + + // R7(+R8): speaker out + m_speaker->level_w(BIT(data, 7) & BIT(data, 8)); + + // R8: enable digit or led select + // R0-R3: led select + // R0-R5: digit select + // R4,R5: led data high + // R6,R8-R10: direct leds + m_r = data & ~0x80; + update_display(); +} + +void liveafb_state::write_o(u16 data) +{ + // O0-O7: led data low + m_o = data; + update_display(); +} + +u8 liveafb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( liveafb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("ROLLER", 0x7f, LESSTHAN, 0x40) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Tackle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punt") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Field Goal") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Skill / Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Action") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("ROLLER") + PORT_BIT( 0x7f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) +INPUT_PORTS_END + +void liveafb_state::liveafb(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(liveafb_state::read_k)); + m_maincpu->r().set(FUNC(liveafb_state::write_r)); + m_maincpu->o().set(FUNC(liveafb_state::write_o)); + + // video hardware + screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); + mask.set_refresh_hz(60); + mask.set_size(1834, 1080); + mask.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6+4+4, 8+2); + m_display->set_segmask(0x3f, 0x7f); + m_display->set_segmask(0x20, 0xff); // only one digit has DP + config.set_default_layout(layout_liveafb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( liveafb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3489", 0x0000, 0x0800, CRC(1fe05ab3) SHA1(a8d7dfed61a6397b7af1d3fcf17b26d5d917b4f0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_liveafb_output.pla", 0, 365, CRC(a7bc9384) SHA1(fab458de394eeddbf5ba0830853a915e51f909c6) ) + + ROM_REGION( 162058, "mask", 0) + ROM_LOAD( "liveafb.svg", 0, 162058, CRC(046078d0) SHA1(68a5775f4f9a1258c06b76839e1cfdab69b61920) ) +ROM_END + + + + + +/*************************************************************************** + + Kosmos Astro + * TMS1470NLHL MP1133 (die label TMS1400 MP1133) + * 9-digit 7seg VFD display + 8 LEDs(4 green, 4 yellow), no sound + + This is an astrological calculator, and also supports 4-function + calculations. Refer to the official manual on how to use this device. + +***************************************************************************/ + +class astro_state : public hh_tms1k_state +{ +public: + astro_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void astro(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void astro_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void astro_state::write_r(u16 data) +{ + // R0-R7: input mux + m_inp_mux = data & 0xff; + + // R0-R9: led select + m_r = data; + update_display(); +} + +void astro_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 astro_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +static INPUT_PORTS_START( astro ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE"/Sun") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY"/Mercury") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-/Venus") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+/Mars") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=/Astro") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("B1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("B2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, "Mode" ) + PORT_CONFSETTING( 0x00, "Calculator" ) + PORT_CONFSETTING( 0x08, "Astro" ) +INPUT_PORTS_END + +void astro_state::astro(machine_config &config) +{ + // basic machine hardware + TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=4.7K, C=33pF + m_maincpu->k().set(FUNC(astro_state::read_k)); + m_maincpu->r().set(FUNC(astro_state::write_r)); + m_maincpu->o().set(FUNC(astro_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3ff, 0xff); + config.set_default_layout(layout_astro); + + // no sound! +} + +// roms + +ROM_START( astro ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) ) +ROM_END + + + + + +/*************************************************************************** + + Marx Series 300 Electronic Bowling Game + * TMS1100NLL MP3403 DBS 7836 SINGAPORE (no decap) + * 4*SN75492 quad segment driver, 2*SN74259 8-line demultiplexer, + 2*CD4043 quad r/s input latch + * 5 7seg LEDs, 15 lamps(10 lamps projected to bowling pins reflection), + 1bit-sound with crude volume control + * edge connector to sensors(switches trigger when ball rolls over) + and other inputs + + lamp translation table: SN74259.u5(mux 1) goes to MAME output 5.x, + SN74259.u6(mux 2) goes to MAME output 6.*. u1-u3 are SN75492 ICs, + where other: u1 A2 is N/C, u3 A1 is from O2 and goes to digits seg C. + + u5 Q0 -> u1 A4 -> L2 (pin #2) u6 Q0 -> u3 A4 -> L1 (pin #1) + u5 Q1 -> u1 A5 -> L4 (pin #4) u6 Q1 -> u3 A5 -> L5 (pin #5) + u5 Q2 -> u1 A6 -> L7 (pin #7) u6 Q2 -> u2 A3 -> L11 (player 1) + u5 Q3 -> u1 A1 -> L8 (pin #8) u6 Q3 -> u2 A2 -> L12 (player 2) + u5 Q4 -> u3 A2 -> L3 (pin #3) u6 Q4 -> u2 A1 -> L15 (?) + u5 Q5 -> u2 A6 -> L6 (pin #6) u6 Q5 -> u3 A6 -> L14 (?) + u5 Q6 -> u2 A5 -> L10 (pin #10) u6 Q6 -> u1 A3 -> L13 (spare) + u5 Q7 -> u2 A4 -> L9 (pin #9) u6 Q7 -> u3 A3 -> digit 4 B+C + +***************************************************************************/ + +class elecbowl_state : public hh_tms1k_state +{ +public: + elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void elecbowl(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void elecbowl_state::update_display() +{ + // standard 7segs + m_display->matrix_partial(0, 4, m_r >> 4, m_o); + + // lamp muxes + u8 sel = m_o & 7; + u8 state = m_r >> 1 & 1; + if (~m_r & 1) + m_display->write_element(5, sel, state); + if (~m_r & 4) + m_display->write_element(6, sel, state); + + // digit 4 is from mux2 Q7 + m_display->write_row(4, m_display->read_element(6, 7) ? 6 : 0); +} + +void elecbowl_state::write_r(u16 data) +{ + // R5-R7,R10: input mux + m_inp_mux = (data >> 5 & 7) | (data >> 7 & 8); + + // R9: speaker out + // R3,R8: speaker volume.. + m_speaker->level_w(data >> 9 & 1); + + // R4-R7: select digit + // R0,R2: lamp mux1,2 _enable + // R1: lamp muxes state + m_r = data; + update_display(); +} + +void elecbowl_state::write_o(u16 data) +{ + //if (data & 0x80) printf("%X ",data&0x7f); + + // O0-O2: lamp muxes select + // O0-O6: digit segments A-G + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 elecbowl_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( elecbowl ) + PORT_START("IN.0") // R5 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) + + PORT_START("IN.1") // R6 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // reset/test? + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // reset/test? + + PORT_START("IN.2") // R7 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) + + PORT_START("IN.3") // R10 + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw? +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 elecbowl_output_pla[0x20] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9 + 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // ? + 0, 1, 2, 3, 4, 5, 6, 7, // lamp muxes select + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f // ? +}; + +void elecbowl_state::elecbowl(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->set_output_pla(elecbowl_output_pla); + m_maincpu->k().set(FUNC(elecbowl_state::read_k)); + m_maincpu->r().set(FUNC(elecbowl_state::write_r)); + m_maincpu->o().set(FUNC(elecbowl_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7, 8); + m_display->set_segmask(0xf, 0x7f); + m_display->set_segmask(0x10, 0x06); // 1 + config.set_default_layout(layout_elecbowl); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( elecbowl ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Thoroughbred Horse Race Analyzer + * PCB label 1670-4619D + * TMS1100NLL MP3491-N2 (die label 1100E MP3491) + * HLCD0569, 67-segment LCD panel, no sound + + This handheld is not a toy, read the manual for more information. In short, + it is a device for predicting the winning chance of a gambling horserace. + + It was rereleased in 1994 in China/Canada by AHTI(Advanced Handicapping + Technologies, Inc.), on a Hitachi HD613901. + +***************************************************************************/ + +class horseran_state : public hh_tms1k_state +{ +public: + horseran_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_lcd(*this, "lcd") + { } + + void horseran(machine_config &config); + +private: + required_device m_lcd; + + void lcd_output_w(offs_t offset, u32 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void horseran_state::lcd_output_w(offs_t offset, u32 data) +{ + // only 3 rows used + if (offset > 2) + return; + + // update lcd segments + m_display->matrix_partial(0, 3, 1 << offset, data); + + // col5-11 and col13-19 are 7segs + for (int i = 0; i < 2; i++) + m_display->write_row(3 + (offset << 1 | i), bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f); +} + +void horseran_state::write_r(u16 data) +{ + // R0: HLCD0569 clock + // R1: HLCD0569 data in + // R2: HLCD0569 _CS + m_lcd->cs_w(data >> 2 & 1); + m_lcd->data_w(data >> 1 & 1); + m_lcd->clock_w(data & 1); + + // R3-R10: input mux + m_inp_mux = data >> 3 & 0xff; +} + +u8 horseran_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(8); +} + +// config + +/* physical button layout and labels are like this: + + [PURSE] [DIST.] [P. POSN.] [DAYS] [R.S.L.] [7] [8] [9] + [RACES] [WINS] [PLACES] [SHOWS] [EARNINGS] [4] [5] [6] + [DISTANCE] [L.E.B. 1st] [L.E.B. 2nd] [L.E.B. 3rd] [FIN. POSN.] [1] [2] [3] + [L.E.B. Fin] [SPD. RTG.] [SPD. RTG.] [ANALYZE] [NEXT] [C/H] [C/E] [0] + + R.S.L. = Races Since (Last) Layoff + L.E.B. = Last Race / Lengths Back +*/ + +static INPUT_PORTS_START( horseran ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Next") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Final Position") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Earnings") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("R.S.L.") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Analyze") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("L.E.B. 3rd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Shows") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Days") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Speed Rating (right)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("L.E.B. 2nd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Places") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Post Position") + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Speed Rating (left)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("L.E.B. 1st") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wins") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Distance (L.E.B.)") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("L.E.B. Finish") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Distance") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Races") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Purse") + + PORT_START("IN.5") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.6") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("C/E") // Clear Entry + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.7") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("C/H") // Clear Horse Information + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") +INPUT_PORTS_END + +void horseran_state::horseran(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF + m_maincpu->k().set(FUNC(horseran_state::read_k)); + m_maincpu->r().set(FUNC(horseran_state::write_r)); + + // video hardware + HLCD0569(config, m_lcd, 1100); // C=0.022uF + m_lcd->write_cols().set(FUNC(horseran_state::lcd_output_w)); + + PWM_DISPLAY(config, m_display).set_size(3+6, 24); + m_display->set_segmask(0x3f<<3, 0x7f); + config.set_default_layout(layout_horseran); + + // no sound! +} + +// roms + +ROM_START( horseran ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Dungeons & Dragons - Computer Labyrinth Game + * TMS1100 M34012-N2LL (die label M34012) + * 72 buttons, no LEDs, 1-bit sound + + This is an electronic board game. It requires markers and wall pieces to play. + Refer to the official manual for more information. + +***************************************************************************/ + +class mdndclab_state : public hh_tms1k_state +{ +public: + mdndclab_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void mdndclab(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void mdndclab_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: input mux part + m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x3ff00); +} + +void mdndclab_state::write_o(u16 data) +{ + // O0-O7: input mux part + m_inp_mux = (m_inp_mux & ~0xff) | data; +} + +u8 mdndclab_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(18); +} + +// config + +static INPUT_PORTS_START( mdndclab ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.6") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.7") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.8") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Wall / Door") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Illegal Move / Warrior Moves") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Warrior 1 / Winner") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Warrior 2 / Treasure") + + PORT_START("IN.9") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.10") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.11") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.12") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.13") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.14") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.15") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.16") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") + + PORT_START("IN.17") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Switch Key") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Next Turn / Level 1/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Dragon Flying / Defeat Tune") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Dragon Attacks / Dragon Wakes") +INPUT_PORTS_END + +void mdndclab_state::mdndclab(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 475000); // approximation - RC osc. R=27K, C=100pF + m_maincpu->k().set(FUNC(mdndclab_state::read_k)); + m_maincpu->r().set(FUNC(mdndclab_state::write_r)); + m_maincpu->o().set(FUNC(mdndclab_state::write_o)); + + config.set_default_layout(layout_mdndclab); // playing board + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mdndclab ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Comp IV + * TMC0904NL CP0904A (die label 4A0970D-04A) + * 10 LEDs behind bezel, no sound + + This is small tabletop Mastermind game; a code-breaking game where the player + needs to find out the correct sequence of colours (numbers in our case). + Press the R key to start, followed by a set of unique numbers and E. + Refer to the official manual for more information. + + known releases: + - USA: Comp IV (two versions, different case), published by MB + - Europe: Logic 5, published by MB + - Japan: Pythaligoras, published by Takara + +***************************************************************************/ + +class comp4_state : public hh_tms1k_state +{ +public: + comp4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void comp4(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void comp4_state::write_r(u16 data) +{ + // leds: + // R4 R9 + // R10! R8 + // R2 R7 + // R1 R6 + // R0 R5 + m_display->matrix(m_o, data); +} + +void comp4_state::write_o(u16 data) +{ + // O1-O3: input mux + m_inp_mux = data >> 1 & 7; + + // O0: leds common + // other bits: N/C + m_o = data; +} + +u8 comp4_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( comp4 ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("R") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("E") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") +INPUT_PORTS_END + +void comp4_state::comp4(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(comp4_state::read_k)); + m_maincpu->r().set(FUNC(comp4_state::write_r)); + m_maincpu->o().set(FUNC(comp4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_comp4); + + // no sound! +} + +// roms + +ROM_START( comp4 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1977 version, model 4750A) + * PCB label 4750A + * TMS1000NL MP3201 (die label 1000C, MP3201) + * LM324N, MC14016CP/TP4016AN, NE555P, discrete sound + * 4 sliding buttons, light bulb + + This is a 2-player electronic board game. It still needs game pieces like the + original Battleship board game. + + It went through at least 5 hardware revisions (not counting Talking Battleship): + 1977: model 4750A, TMS1000 discrete sound, see notes above + 1977: model 4750B, TMS1000 SN76477 sound, see notes at bshipb (driver below this) + 1979: model 4750C: cost-reduced single-chip design, lesser quality game board. + The chip is assumed to be custom, no MCU: 28-pin DIP, label 4750, SCUS 0462 + 1982: similar custom single-chip hardware, chip label MB4750 SCUS 0562 + 1982: back to MCU, COP420 instead of choosing TI, emulated in hh_cop400.cpp + +***************************************************************************/ + +class bship_state : public hh_tms1k_state +{ +public: + bship_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void bship(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bship_state::write_r(u16 data) +{ + // R0-R10: input mux + m_inp_mux = data; +} + +void bship_state::write_o(u16 data) +{ + // O4: explosion light bulb + m_display->matrix(1, data >> 4 & 1); + + // other: sound +} + +u8 bship_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[11]->read() | read_inputs(11); +} + +// config + +static INPUT_PORTS_START( bship ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 A") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 B") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 C") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 D") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 E") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 F") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 G") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 H") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 I") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 J") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch + + PORT_START("IN.11") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") +INPUT_PORTS_END + +void bship_state::bship(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set(FUNC(bship_state::read_k)); + m_maincpu->r().set(FUNC(bship_state::write_r)); + m_maincpu->o().set(FUNC(bship_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship); + + // sound hardware + // TODO +} + +// roms + +ROM_START( bship ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Battleship (1977 version, model 4750B) + * PCB label MB 4750B + * TMS1000NLL MP3208 (die label 1000C, MP3208) + * SN75494N (acting as inverters), SN76477 sound + * 4 sliding buttons, light bulb + + This is the 2nd version. The sound hardware was changed to a SN76477. + +***************************************************************************/ + +class bshipb_state : public hh_tms1k_state +{ +public: + bshipb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_sn(*this, "sn76477") + { } + + void bshipb(machine_config &config); + +private: + required_device m_sn; + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bshipb_state::write_r(u16 data) +{ + // R0-R10: input mux + m_inp_mux = data; + + // R4: 75494 to R12 33K to SN76477 pin 20 + m_sn->slf_res_w((data & 0x10) ? RES_INF : RES_K(33)); +} + +void bshipb_state::write_o(u16 data) +{ + //printf("%X ", m_maincpu->debug_peek_o_index() & 0xf); + + // O0: SN76477 pin 9 + m_sn->enable_w(data & 1); + + // O1: 75494 to R4 100K to SN76477 pin 18 + // O2: 75494 to R3 150K to SN76477 pin 18 + double o12 = RES_INF; + switch (~data >> 1 & 3) + { + case 0: o12 = RES_INF; break; + case 1: o12 = RES_K(100); break; + case 2: o12 = RES_K(150); break; + case 3: o12 = RES_2_PARALLEL(RES_K(100), RES_K(150)); break; + } + m_sn->vco_res_w(o12); + + // O2,O6: (TODO) to SN76477 pin 21 + //m_sn->slf_cap_w(x); + + // O4: SN76477 pin 22 + m_sn->vco_w(data >> 4 & 1); + + // O5: R11 27K to SN76477 pin 23 + m_sn->one_shot_cap_w((data & 0x20) ? RES_K(27) : 0); + + // O6: SN76477 pin 25 + m_sn->mixer_b_w(data >> 6 & 1); + + // O7: 75494 to light bulb + m_display->matrix(1, data >> 7 & 1); +} + +u8 bshipb_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[11]->read() | read_inputs(11); +} + +// config + +// buttons are same as bship set + +void bshipb_state::bshipb(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set(FUNC(bshipb_state::read_k)); + m_maincpu->r().set(FUNC(bshipb_state::write_r)); + m_maincpu->o().set(FUNC(bshipb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 1); + config.set_default_layout(layout_bship); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SN76477(config, m_sn); + m_sn->set_noise_params(RES_K(47), RES_K(100), CAP_P(47)); // R18, R17, C8 + m_sn->set_decay_res(RES_M(3.3)); // R16 + m_sn->set_attack_params(CAP_U(0.47), RES_K(15)); // C7, R20 + m_sn->set_amp_res(RES_K(100)); // R19 + m_sn->set_feedback_res(RES_K(39)); // R7 + m_sn->set_vco_params(5.0 * RES_VOLTAGE_DIVIDER(RES_K(47), RES_K(33)), CAP_U(0.01), RES_K(270)); // R15/R14, C5, switchable R5/R3/R4 + m_sn->set_pitch_voltage(5.0); + m_sn->set_slf_params(CAP_U(22), RES_K(750)); // switchable C4, switchable R13/R12 + m_sn->set_oneshot_params(0, RES_INF); // NC, switchable R11 + m_sn->set_vco_mode(0); // switchable + m_sn->set_mixer_params(0, 0, 0); // switchable, GND, GND + m_sn->set_envelope_params(1, 0); // Vreg, GND + m_sn->set_enable(0); // switchable + m_sn->add_route(ALL_OUTPUTS, "mono", 0.35); +} + +// roms + +ROM_START( bshipb ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Simon (model 4850), created by Ralph Baer + * TMS1000 (die label MP3226), or MP3300 (die label 1000C, MP3300) + * DS75494 Hex digit LED driver, 4 big lamps, 1-bit sound + + known revisions: + - 1978: Rev A: TMS1000(no label) + - 198?: Rev B: MB4850 SCUS0640(16-pin custom ASIC), PCB label REV.B, + cost-reduced, same hardware as Pocket Simon + - 1979: Rev F: TMS1000(MP3300), PCB label 4850 Rev F + + The semi-sequel Super Simon uses a TMS1100 (see next minidriver). + +***************************************************************************/ + +class simon_state : public hh_tms1k_state +{ +public: + simon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void simon(machine_config &config); + +private: + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void simon_state::write_r(u16 data) +{ + // R4-R8 go through an 75494 IC first: + // R4 -> 75494 IN6 -> green lamp + // R5 -> 75494 IN3 -> red lamp + // R6 -> 75494 IN5 -> yellow lamp + // R7 -> 75494 IN2 -> blue lamp + m_display->matrix(1, data >> 4); + + // R8 -> 75494 IN0 -> speaker out + m_speaker->level_w(data >> 8 & 1); + + // R0-R2,R9: input mux + // R3: GND + // other bits: N/C + m_inp_mux = (data & 7) | (data >> 6 & 8); +} + +u8 simon_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( simon ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x07, 0x02, "Game Select") + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Green Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Blue Button") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R9 + PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x01, "4" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x07) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x07) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) +INPUT_PORTS_END + +void simon_state::simon(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(simon_state::read_k)); + m_maincpu->r().set(FUNC(simon_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_simon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( simon ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) +ROM_END + +ROM_START( simonf ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Super Simon + * TMS1100 MP3476NLL (die label MP3476) + * 8 big lamps(2 turn on at same time), 1-bit sound + + The semi-squel to Simon, not as popular. It includes more game variations + and a 2-player head-to-head mode. + +***************************************************************************/ + +class ssimon_state : public hh_tms1k_state +{ +public: + ssimon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ssimon(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void write_r(u16 data); + u8 read_k(); +}; + +void ssimon_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void ssimon_state::set_clock() +{ + // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch: + // 0 Simple: R=51K -> ~200kHz + // 1 Normal: R=37K -> ~275kHz + // 2 Super: R=22K -> ~400kHz + u8 inp = m_inputs[6]->read(); + m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000)); +} + +void ssimon_state::write_r(u16 data) +{ + // R0-R3,R9,R10: input mux + m_inp_mux = (data & 0xf) | (data >> 5 & 0x30); + + // R4: yellow lamps + // R5: green lamps + // R6: blue lamps + // R7: red lamps + m_display->matrix(1, data >> 4); + + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); +} + +u8 ssimon_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ssimon ) + PORT_START("IN.0") // R0 + PORT_CONFNAME( 0x0f, 0x01, "Game Select") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x00, "5" ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Green Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Blue Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Red Button") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Decision") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Green Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Blue Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Red Button") + + PORT_START("IN.4") // R9 + PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Head-to-Head" ) // this sets R10 K2, see below + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFSETTING( 0x08, "3" ) + PORT_CONFSETTING( 0x01, "4" ) + + PORT_START("IN.5") // R10 + PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.4", 0x0f, EQUALS, 0x00) + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // fake + PORT_CONFNAME( 0x03, 0x01, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ssimon_state, speed_switch, 0) + PORT_CONFSETTING( 0x00, "Simple" ) + PORT_CONFSETTING( 0x01, "Normal" ) + PORT_CONFSETTING( 0x02, "Super" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x0f) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x0f) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<4>, 0x0f) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<4>, 0x0f) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<6>, 0x03) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03) +INPUT_PORTS_END + +void ssimon_state::ssimon(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 275000); // see set_clock + m_maincpu->k().set(FUNC(ssimon_state::read_k)); + m_maincpu->r().set(FUNC(ssimon_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ssimon); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssimon ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) // unused + ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Big Trak + * TMS1000NLL MP3301A or MP3301ANLL E (rev. E!) (die label 1000E MP3301) + * SN75494N Hex digit LED driver, 1 lamp, 3-level sound + * gearbox with magnetic clutch, 1 IR led+sensor, 2 motors(middle wheels) + * 24-button keypad, ext in/out ports + + Big Trak is a programmable toy car, up to 16 steps. Supported commands include + driving and turning, firing a photon cannon(hey, have some imagination!), + and I/O ports. The output port was used for powering the dump truck accessory. + + The In command was canceled midst production, it is basically a nop. Newer + releases and the European version removed the button completely. + +***************************************************************************/ + +class bigtrak_state : public hh_tms1k_state +{ +public: + bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_left_motor_forward(*this, "left_motor_forward"), + m_left_motor_reverse(*this, "left_motor_reverse"), + m_right_motor_forward(*this, "right_motor_forward"), + m_right_motor_reverse(*this, "right_motor_reverse"), + m_ext_out(*this, "ext_out") + { } + + void bigtrak(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); + + int m_gearbox_pos = 0; + bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } + TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); + + output_finder<> m_left_motor_forward; + output_finder<> m_left_motor_reverse; + output_finder<> m_right_motor_forward; + output_finder<> m_right_motor_reverse; + output_finder<> m_ext_out; +}; + +void bigtrak_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // resolve handlers + m_left_motor_forward.resolve(); + m_left_motor_reverse.resolve(); + m_right_motor_forward.resolve(); + m_right_motor_reverse.resolve(); + m_ext_out.resolve(); + + // register for savestates + save_item(NAME(m_gearbox_pos)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(bigtrak_state::gearbox_sim_tick) +{ + // the last gear in the gearbox has 12 evenly spaced holes, it is located + // between an IR emitter and receiver + static const int speed = 17; + if (m_gearbox_pos >= speed) + m_gearbox_pos = -speed; + + if (m_o & 0x1e) + m_gearbox_pos++; +} + +void bigtrak_state::write_r(u16 data) +{ + // R0-R5,R8: input mux (keypad, ext in enable) + m_inp_mux = (data & 0x3f) | (data >> 2 & 0x40); + + // R6: N/C + // R7: IR led on + // R9: lamp on + m_display->matrix(1, (data >> 7 & 1) | (data >> 8 & 2)); + + // (O0,O7,)R10(tied together): speaker out + m_speaker->level_w((m_o & 1) | (m_o >> 6 & 2) | (data >> 8 & 4)); + m_r = data; +} + +void bigtrak_state::write_o(u16 data) +{ + // O1: left motor forward + // O2: left motor reverse + // O3: right motor reverse + // O4: right motor reverse + // O5: ext out + // O6: N/C + m_left_motor_forward = data >> 1 & 1; + m_left_motor_reverse = data >> 2 & 1; + m_right_motor_forward = data >> 3 & 1; + m_right_motor_reverse = data >> 4 & 1; + m_ext_out = data >> 5 & 1; + + // O0,O7(,R10)(tied together): speaker out + m_speaker->level_w((data & 1) | (data >> 6 & 2) | (m_r >> 8 & 4)); + m_o = data; +} + +u8 bigtrak_state::read_k() +{ + // K: multiplexed inputs + // K8: IR sensor + return read_inputs(7) | (sensor_state() ? 8 : 0); +} + +// config + +/* physical button layout and labels are like this: + + USA version: UK version: + + [^] [CLR] [^] [CM] + [<] [HOLD] [>] [FIRE] [<] [P] [>] [\|/] + [v] [CLS] [v] [CE] + [7] [8] [9] [RPT] [7] [8] [9] [x2] + [4] [5] [6] [TEST] [4] [5] [6] [TEST] + [1] [2] [3] [CK] [1] [2] [3] [checkmark] + [IN] [0] [OUT] [GO] [0] [OUT] [GO] +*/ + +static INPUT_PORTS_START( bigtrak ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hold") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear Memory") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Backward") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Last Step") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Test") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Check") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("In") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Out") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.6") // R8 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("Input Port") + PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bigtrak_state::bigtrak(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=83K, C=100pF + m_maincpu->k().set(FUNC(bigtrak_state::read_k)); + m_maincpu->r().set(FUNC(bigtrak_state::write_r)); + m_maincpu->o().set(FUNC(bigtrak_state::write_o)); + + TIMER(config, "gearbox").configure_periodic(FUNC(bigtrak_state::gearbox_sim_tick), attotime::from_msec(1)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 2); + config.set_default_layout(layout_bigtrak); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bigtrak ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Dark Tower + * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label MP7332) + (assume same ROM contents between revisions) + * SN75494N MOS-to-LED digit driver + * motorized rotating reel + lightsensor, 1bit-sound + + This is a board game, it obviously requires game pieces and the board. + The emulated part is the centerpiece, a black tower with a rotating card + panel and LED digits for displaying health, amount of gold, etc. As far + as MAME is concerned, the game works fine. + + To start up the game, first press [MOVE], the machine now does a self-test. + Then select level and number of players and the game will start. Read the + official manual on how to play the game. + +***************************************************************************/ + +class mbdtower_state : public hh_tms1k_state +{ +public: + mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_motor_pos_out(*this, "motor_pos"), + m_card_pos_out(*this, "card_pos"), + m_motor_on_out(*this, "motor_on") + { } + + void mbdtower(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + void update_display(); + bool sensor_led_on() { return m_display->element_on(0, 0); } + + output_finder<> m_motor_pos_out; + output_finder<> m_card_pos_out; + output_finder<> m_motor_on_out; + + int m_motor_pos = 0; + int m_motor_pos_prev = -1; + int m_motor_decay = 0; + bool m_motor_on = false; + bool m_sensor_blind = false; + + TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void mbdtower_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + m_motor_pos_out.resolve(); + m_card_pos_out.resolve(); + m_motor_on_out.resolve(); + + // register for savestates + save_item(NAME(m_motor_pos)); + /* save_item(NAME(m_motor_pos_prev)); */ // don't save! + save_item(NAME(m_motor_decay)); + save_item(NAME(m_motor_on)); + save_item(NAME(m_sensor_blind)); +} + +// handlers + +TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) +{ + // it rotates counter-clockwise (when viewed from above) + if (m_motor_on) + { + m_motor_pos = (m_motor_pos - 1) & 0x7f; + + // give it some time to spin out when it's turned off + if (m_r & 0x200) + m_motor_decay += (m_motor_decay < 4); + else if (m_motor_decay > 0) + m_motor_decay--; + else + m_motor_on = false; + } + + // 8 evenly spaced holes in the rotation disc for the sensor to 'see' through. + // The first hole is much bigger, enabling the game to determine the position. + if ((m_motor_pos & 0xf) < 4 || m_motor_pos < 0xc) + m_sensor_blind = false; + else + m_sensor_blind = true; + + // on change, output info + if (m_motor_pos != m_motor_pos_prev) + m_motor_pos_out = 100 * (m_motor_pos / (float)0x80); + + /* 3 display cards per hole, like this: + + (0) <---- display increments this way <---- (7) + + CURSED VICTORY WIZARD DRAGON GOLD KEY SCOUT WARRIOR (void) + LOST WARRIORS BAZAAR CLOSED SWORD SILVER KEY HEALER FOOD (void) + PLAGUE BRIGANDS KEY MISSING PEGASUS BRASS KEY GOLD BEAST (void) + */ + int card_pos = m_motor_pos >> 4 & 7; + if (card_pos != (m_motor_pos_prev >> 4 & 7)) + m_card_pos_out = card_pos; + + m_motor_pos_prev = m_motor_pos; +} + +void mbdtower_state::update_display() +{ + // update current state + if (~m_r & 0x10) + { + u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; + m_display->write_row(2, (m_o & 0x80) ? o : 0); + m_display->write_row(1, (m_o & 0x80) ? 0 : o); + m_display->write_row(0, (m_r >> 8 & 1) | (m_r >> 4 & 0xe)); + } + else + { + // display items turned off + m_display->clear(); + } +} + +void mbdtower_state::write_r(u16 data) +{ + // R0-R2: input mux + m_inp_mux = data & 7; + + // R9: motor on + if ((m_r ^ data) & 0x200) + m_motor_on_out = data >> 9 & 1; + if (data & 0x200) + m_motor_on = true; + + // R3: N/C + // R4: 75494 /EN (speaker, lamps, digit select go through that IC) + // R5-R7: tower lamps + // R8: rotation sensor led + m_r = data; + update_display(); + + // R10: speaker out + m_speaker->level_w(~data >> 4 & data >> 10 & 1); +} + +void mbdtower_state::write_o(u16 data) +{ + // O0-O6: led segments A-G + // O7: digit select + m_o = data; + update_display(); +} + +u8 mbdtower_state::read_k() +{ + // K: multiplexed inputs + // K8: rotation sensor + return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0); +} + +// config + +/* physical button layout and labels are like this: + + (green) (l.blue) (red) + [YES/ [REPEAT] [NO/ + BUY] END] + + (yellow) (blue) (white) + [HAGGLE] [BAZAAR] [CLEAR] + + (blue) (blue) (blue) + [TOMB/ [MOVE] [SANCTUARY/ + RUIN] CITADEL] + + (orange) (blue) (d.yellow) + [DARK [FRONTIER] [INVENTORY] + TOWER] +*/ + +static INPUT_PORTS_START( mbdtower ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") +INPUT_PORTS_END + +void mbdtower_state::mbdtower(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=43K, C=56pF + m_maincpu->k().set(FUNC(mbdtower_state::read_k)); + m_maincpu->r().set(FUNC(mbdtower_state::write_r)); + m_maincpu->o().set(FUNC(mbdtower_state::write_o)); + + TIMER(config, "tower_motor").configure_periodic(FUNC(mbdtower_state::motor_sim_tick), attotime::from_msec(3500/0x80)); // ~3.5sec for a full rotation + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(6, 0x7f); + config.set_default_layout(layout_mbdtower); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mbdtower ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) +ROM_END + + + + + +/*************************************************************************** + + Milton Bradley Electronic Arcade Mania + * TMS1100 M34078A-N2LL (die label 1100G, M34078A) + * 9 LEDs, 3-bit sound + + This is a board game. The mini arcade machine is the emulated part here. + External artwork is needed for the game overlays. + +***************************************************************************/ + +class arcmania_state : public hh_tms1k_state +{ +public: + arcmania_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void arcmania(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void arcmania_state::write_r(u16 data) +{ + // R1-R9: leds + m_display->matrix(1, data >> 1); +} + +void arcmania_state::write_o(u16 data) +{ + // O0-O2(tied together): speaker out + m_speaker->level_w(data & 7); + + // O3,O4,O6: input mux + m_inp_mux = (data >> 3 & 3) | (data >> 4 & 4); + + // O5: power off when low (turn back on with button row 1) + if (~data & 0x20) + power_off(); +} + +u8 arcmania_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +/* physical button layout and labels are like this: + + (orange) (orange) (orange) + [1] [2] [3] + + (red) (yellow) (blue) + [RUN] [SNEAK + AMUK] ATTACK] + + (green) (yellow) (purple) + [Alien [Rattler] + Raiders] +*/ + +static INPUT_PORTS_START( arcmania ) + PORT_START("IN.0") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Alien Raiders") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Yellow Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Rattler") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Run Amuk") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Yellow Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Sneak Attack") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // O6 (also O5 to power) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void arcmania_state::arcmania(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=100pF + m_maincpu->k().set(FUNC(arcmania_state::read_k)); + m_maincpu->r().set(FUNC(arcmania_state::write_r)); + m_maincpu->o().set(FUNC(arcmania_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 9); + config.set_default_layout(layout_arcmania); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( arcmania ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Code Name: Sector, by Bob Doyle + * TMS0970 MCU, MP0905BNL ZA0379 (die label 0970F-05B) + * 6-digit 7seg LED display + 4 LEDs for compass, no sound + + This is a tabletop submarine pursuit game. A grid board and small toy + boats are used to remember your locations (a Paint app should be ok too). + Refer to the official manual for more information, it is not a simple game. + +***************************************************************************/ + +class cnsector_state : public hh_tms1k_state +{ +public: + cnsector_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void cnsector(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void cnsector_state::write_r(u16 data) +{ + // R0-R5: select digit + // R6-R9: direction leds + m_display->matrix(data, m_o); +} + +void cnsector_state::write_o(u16 data) +{ + // O0-O4: input mux + m_inp_mux = data & 0x1f; + + // O0-O7: digit segments + m_o = data; +} + +u8 cnsector_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + COMBAT INFORMATION CENTER + [NEXT SHIP] [RECALL] [MOVE SHIP] + + [LEFT] [RIGHT] o [SLOWER] [FASTER] + STEERING EVASIVE SUB SPEED o (on/off switch) + NAVIGATIONAL PROGRAMMING | + + [RANGE] [AIM] [FIRE] o [TEACH MODE] + SONAR CONTROL SUB FINDER +*/ + +static INPUT_PORTS_START( cnsector ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode") +INPUT_PORTS_END + +void cnsector_state::cnsector(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(cnsector_state::read_k)); + m_maincpu->r().set(FUNC(cnsector_state::write_r)); + m_maincpu->o().set(FUNC(cnsector_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 8); + m_display->set_segmask(0x3f, 0xff); + config.set_default_layout(layout_cnsector); + + // no sound! +} + +// roms + +ROM_START( cnsector ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Merlin handheld game, by Bob Doyle + * TMS1100NLL MP3404 or MP3404A-N2 + * 11 LEDs behind buttons, 3-level sound + + Also published in Japan by Tomy as "Dr. Smith", white case instead of red. + The one with dark-blue case is the rare sequel Master Merlin, see below. + More sequels followed too, but on other hardware. + + To start a game, press NEW GAME, followed by a number: + 1: Tic-Tac-Toe + 2: Music Machine + 3: Echo + 4: Blackjack 13 + 5: Magic Square + 6: Mindbender + + Refer to the official manual for more information on the games. + +***************************************************************************/ + +class merlin_state : public hh_tms1k_state +{ +public: + merlin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void merlin(machine_config &config); + +protected: + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void merlin_state::write_r(u16 data) +{ + /* leds: + + R0 + R1 R2 R3 + R4 R5 R6 + R7 R8 R9 + R10 + */ + m_display->matrix(1, data); +} + +void merlin_state::write_o(u16 data) +{ + // O4-O6(tied together): speaker out + m_speaker->level_w(data >> 4 & 7); + + // O0-O3: input mux + // O7: N/C + m_inp_mux = data & 0xf; +} + +u8 merlin_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( merlin ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Same Game") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game") +INPUT_PORTS_END + +void merlin_state::merlin(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF + m_maincpu->k().set(FUNC(merlin_state::read_k)); + m_maincpu->r().set(FUNC(merlin_state::write_r)); + m_maincpu->o().set(FUNC(merlin_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_merlin); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; + m_speaker->set_levels(8, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( merlin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3404a", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) +ROM_END + +ROM_START( merlina ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(9362d9f9) SHA1(266d2a4a98cc33944a4fc7ed073ba9321bba8e05) ) // 1 bit different + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Master Merlin + * TMS1400 MP7351-N2LL (die label 1400CR MP7351) + * 11 LEDs behind buttons, 3-level sound + + The TMS1400CR MCU has the same pinout as a standard TMS1100. The hardware + outside of the MCU is exactly the same as Merlin. + + The included minigames are: + 1: Three Shells + 2: Hi/Lo + 3: Match It + 4: Hit or Miss + 5: Pair Off + 6: Tempo + 7: Musical Ladder + 8: Patterns + 9: Hot Potato + +***************************************************************************/ + +class mmerlin_state : public merlin_state +{ +public: + mmerlin_state(const machine_config &mconfig, device_type type, const char *tag) : + merlin_state(mconfig, type, tag) + { } + + void mmerlin(machine_config &config); +}; + +// handlers: uses the ones in merlin_state + +// config + +static INPUT_PORTS_START( mmerlin ) + PORT_INCLUDE( merlin ) + + PORT_MODIFY("IN.3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") // instead of Hit Me +INPUT_PORTS_END + +void mmerlin_state::mmerlin(machine_config &config) +{ + merlin(config); + + // basic machine hardware + TMS1400(config.replace(), m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF + m_maincpu->k().set(FUNC(mmerlin_state::read_k)); + m_maincpu->r().set(FUNC(mmerlin_state::write_r)); + m_maincpu->o().set(FUNC(mmerlin_state::write_o)); + + config.set_default_layout(layout_mmerlin); +} + +// roms + +ROM_START( mmerlin ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Electronic Master Mind + * TMS1000NLL MP3200 (die label 1000E, MP3200) + * 5 red leds, 5 green leds + + This is a board game, it came with 4 plug boards and a lot of colored pegs. + It's not related to the equally named Electronic Master Mind by Invicta, + that one is on a Rockwell MM75. + +***************************************************************************/ + +class pbmastm_state : public hh_tms1k_state +{ +public: + pbmastm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void pbmastm(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void pbmastm_state::write_r(u16 data) +{ + // R1-R10: leds (direct) + m_display->matrix(1, data >> 1); +} + +void pbmastm_state::write_o(u16 data) +{ + // O0-O5: input mux + m_inp_mux = data & 0x3f; +} + +u8 pbmastm_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( pbmastm ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("A") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("B") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("D") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Blue") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Brown") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Black") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Yellow") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("White") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Pink") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Gray") + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Green") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Orange") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Blank") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Delete") + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Battery Test") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Code") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Check") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void pbmastm_state::pbmastm(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF + m_maincpu->k().set(FUNC(pbmastm_state::read_k)); + m_maincpu->r().set(FUNC(pbmastm_state::write_r)); + m_maincpu->o().set(FUNC(pbmastm_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 10); + config.set_default_layout(layout_pbmastm); + + // no sound! +} + +// roms + +ROM_START( pbmastm ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3200", 0x0000, 0x0400, CRC(059dbb88) SHA1(20e3f6aeecce167371bda914f263daf53c50c839) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_pbmastm_output.pla", 0, 365, CRC(b355c4d9) SHA1(43cc971a4feacfddfe810c8983c65d9eef3ed57b) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Stop Thief, by Bob Doyle + * TMS0980NLL MP6101B (die label 0980B-01A) + * 3-digit 7seg LED display, 6-level sound + + Stop Thief is actually a board game, the electronic device emulated here + (called Electronic Crime Scanner) is an accessory. To start a game, press + the ON button. Otherwise, it is in test-mode where you can hear all sounds. + For the patent romset, it needs to be turned off and on to exit test mode. + +***************************************************************************/ + +class stopthief_state : public hh_tms1k_state +{ +public: + stopthief_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void stopthief(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void stopthief_state::write_r(u16 data) +{ + // R0-R2: select digit + m_display->matrix(data & 7, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f); + + // R3-R8(tied together): speaker out + int level = 0; + for (int i = 0; m_o & 8 && i < 6; i++) + level += (data >> (i+3) & 1); + m_speaker->level_w(level); +} + +void stopthief_state::write_o(u16 data) +{ + // O0,O6: input mux + m_inp_mux = (data & 1) | (data >> 5 & 2); + + // O3: speaker on + // O0-O2,O4-O7: led segments A-G + m_o = data; +} + +u8 stopthief_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + [1] [2] [OFF] + [3] [4] [ON] + [5] [6] [T, TIP] + [7] [8] [A, ARREST] + [9] [0] [C, CLUE] +*/ + +static INPUT_PORTS_START( stopthief ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.1") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.2") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void stopthief_state::stopthief(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 425000); // approximation + m_maincpu->k().set(FUNC(stopthief_state::read_k)); + m_maincpu->r().set(FUNC(stopthief_state::write_r)); + m_maincpu->o().set(FUNC(stopthief_state::write_o)); + m_maincpu->power_off().set(FUNC(stopthief_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(3, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_stopthief); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[7] = { 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; + m_speaker->set_levels(7, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( stopthief ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( stopthiefp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen + * TMS1400NLL MP7313-N2 (die label MP7313) + * LED grid display, 1-bit sound + + Bank Shot is an electronic pool game. To select a game, repeatedly press + the [SELECT] button, then press [CUE UP] to start. Refer to the official + manual for more information. The game selections are: + 1: Straight Pool (1 player) + 2: Straight Pool (2 players) + 3: Poison Pool + 4: Trick Shots + + BTANB: Some of the other (not cue) balls temporarily flash brighter sometimes, + eg. the bottom one when they're placed. This happens on the real device. + +***************************************************************************/ + +class bankshot_state : public hh_tms1k_state +{ +public: + bankshot_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void bankshot(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void bankshot_state::update_display() +{ + m_display->matrix(m_r & ~3, m_o); +} + +void bankshot_state::write_r(u16 data) +{ + // R0: speaker out + m_speaker->level_w(data & 1); + + // R2,R3: input mux + m_inp_mux = data >> 2 & 3; + + // R2-R10: led select + m_r = data; + update_display(); +} + +void bankshot_state::write_o(u16 data) +{ + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 bankshot_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + (note: remember that you can rotate the display in MAME) + + [SELECT [BALL UP] [BALL OVER] + SCORE] + + ------ led display ------ + + [ANGLE] [AIM] [CUE UP + SHOOT] +*/ + +static INPUT_PORTS_START( bankshot ) + PORT_START("IN.0") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up/Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select/Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void bankshot_state::bankshot(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF + m_maincpu->k().set(FUNC(bankshot_state::read_k)); + m_maincpu->r().set(FUNC(bankshot_state::write_r)); + m_maincpu->o().set(FUNC(bankshot_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_bri_levels(0.01, 0.08); // cue ball is brigher + config.set_default_layout(layout_bankshot); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bankshot ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Split Second + * TMS1400NLL MP7314-N2 (die label MP7314) + * LED grid display(default round LEDs, and rectangular shape ones), 1-bit sound + + This is an electronic handheld reflex gaming device, it's straightforward + to use. The included mini-games are: + 1, 2, 3: Mad Maze* + 4, 5: Space Attack* + 6: Auto Cross + 7: Stomp + 8: Speedball + + *: higher number indicates higher difficulty + + display layout, where number yx is lamp R(y).O(x) + + 00 02 04 + 10 01 12 03 14 05 16 + 11 13 15 + 20 21 22 23 24 25 26 + 31 33 35 + 30 41 32 43 34 45 36 + 51 53 55 + 40 61 42 63 44 65 46 + 71 73 75 + 50 60 52 62 54 64 56 + 70 72 74 + +***************************************************************************/ + +class splitsec_state : public hh_tms1k_state +{ +public: + splitsec_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void splitsec(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void splitsec_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void splitsec_state::write_r(u16 data) +{ + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // R9,R10: input mux + m_inp_mux = data >> 9 & 3; + + // R0-R7: led select + m_r = data; + update_display(); +} + +void splitsec_state::write_o(u16 data) +{ + // O0-O6: led state + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 splitsec_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( splitsec ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void splitsec_state::splitsec(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF + m_maincpu->k().set(FUNC(splitsec_state::read_k)); + m_maincpu->r().set(FUNC(splitsec_state::write_r)); + m_maincpu->o().set(FUNC(splitsec_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 7); + config.set_default_layout(layout_splitsec); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( splitsec ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) +ROM_END + + + + + +/*************************************************************************** + + Parker Brothers Lost Treasure - The Electronic Deep-Sea Diving Game, + Featuring The Electronic Dive-Control Center + * TMS1100 M34038-NLL (die label 1100E, M34038) + * 11 LEDs, 4-bit sound + + This is a board game. The electronic accessory is the emulated part here. + +***************************************************************************/ + +class lostreas_state : public hh_tms1k_state +{ +public: + lostreas_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void lostreas(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void lostreas_state::write_r(u16 data) +{ + // R0-R10: leds + m_display->matrix(1, data); +} + +void lostreas_state::write_o(u16 data) +{ + // O0-O3: input mux + m_inp_mux = data & 0xf; + + // O4: 330 ohm resistor - speaker out + // O5: 220 ohm resistor - speaker out + // O6: 180 ohm resistor - speaker out + // O7: 68 ohm resistor - speaker out + m_speaker->level_w(data >> 4 & 0xf); +} + +u8 lostreas_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + (note: Canadian version differs slightly to accomodoate dual-language) + + [N-S(gold)] [1] [2] [3] [AIR] + [E-W(gold)] [4] [5] [6] [UP] + [N-S(silv)] [7] [8] [9] [$ VALUE] + [E-W(silv)] [CLEAR] +*/ + +static INPUT_PORTS_START( lostreas ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // air/up + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("$ Value") + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("E-W (silver)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("N-S (silver)") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("E-W (gold)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("N-S (gold)") + + PORT_START("FAKE") // Air/Up buttons share the same position on the matrix + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Air") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up") +INPUT_PORTS_END + +void lostreas_state::lostreas(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 425000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(lostreas_state::read_k)); + m_maincpu->r().set(FUNC(lostreas_state::write_r)); + m_maincpu->o().set(FUNC(lostreas_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 11); + config.set_default_layout(layout_lostreas); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // set volume levels + static const double speaker_levels[0x10] = + { 1.0/16.0, 1.0/15.0, 1.0/14.0, 1.0/13.0, 1.0/12.0, 1.0/11.0, 1.0/10.0, 1.0/9.0, 1.0/8.0, 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; + m_speaker->set_levels(16, speaker_levels); +} + +// roms + +ROM_START( lostreas ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) ) +ROM_END + + + + + +/*************************************************************************** + + Playskool Alphie + * TMS1000 (label not known yet) + * 5 LEDs, 1-bit sound + + This is an educational toy robot for young kids. It has 2 sliding arms: + the left arm(Alphie's right arm) is for questions, the other for answers. + Cardboard inlays are used for arm position labels. + + There are 4 play modes: + - S symbol: Alphie answers questions. The answers are always the same, + no matter the inlay: Q1=A3, Q2=A5, Q3=A4, Q4=A1, Q5=A2. + - * symbol: used with Lunar Landing board game + - X symbol: used with Robot Land board game + - music note: play a selection of 5 tunes + +***************************************************************************/ + +class alphie_state : public hh_tms1k_state +{ +public: + alphie_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void alphie(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void alphie_state::write_r(u16 data) +{ + // R1-R5, input mux (using d5 for Vss) + m_inp_mux = (data >> 1 & 0x1f) | 0x20; + + // R6-R10: leds + m_display->matrix(1, data >> 6); + + // R0: power off on falling edge (turn back on with button) + if (~data & m_r & 1) + power_off(); + + m_r = data; +} + +void alphie_state::write_o(u16 data) +{ + // O?: speaker out + m_speaker->level_w(data & 1); +} + +u8 alphie_state::read_k() +{ + // K: multiplexed inputs, rotated matrix + return read_rotated_inputs(6); +} + +// config + +static INPUT_PORTS_START( alphie ) + PORT_START("IN.0") // K1 + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + + PORT_START("IN.1") // K2 + PORT_CONFNAME( 0x1f, 0x01, "Question" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x10, "5" ) + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x1f, 0x01, "Answer" ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + PORT_CONFSETTING( 0x10, "5" ) + + PORT_START("IN.3") // K8 + PORT_CONFNAME( 0x0f, 0x01, "Activity" ) + PORT_CONFSETTING( 0x01, "Questions" ) + PORT_CONFSETTING( 0x02, "Lunar Landing" ) + PORT_CONFSETTING( 0x04, "Robot Land" ) + PORT_CONFSETTING( 0x08, "Tunes" ) + + PORT_START("SWITCH") // fake + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<1>, 0x1f) PORT_NAME("Question Arm Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<1>, 0x1f) PORT_NAME("Question Arm Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<2>, 0x1f) PORT_NAME("Answer Arm Up") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<2>, 0x1f) PORT_NAME("Answer Arm Down") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) PORT_NAME("Activity Selector Left") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) PORT_NAME("Activity Selector Right") +INPUT_PORTS_END + +// output PLA is guessed +static const u16 alphie_output_pla[0x20] = +{ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 +}; + +void alphie_state::alphie(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 350000); // approximation + m_maincpu->set_output_pla(alphie_output_pla); + m_maincpu->k().set(FUNC(alphie_state::read_k)); + m_maincpu->r().set(FUNC(alphie_state::write_r)); + m_maincpu->o().set(FUNC(alphie_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 5); + config.set_default_layout(layout_alphie); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alphie ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // " +ROM_END + + + + + +/*************************************************************************** + + Tandy Championship Football (model 60-2150) + * PCB label CYG-316 + * TMS1100NLL MP1193 (die label 1100B, MP1193) + * 7-digit 7seg LED display + LED grid, 1-bit sound + + Another clone of Mattel Football II. The original manufacturer is unknown, but + suspected to be Conic/E.R.S.(Electronic Readout Systems). + +***************************************************************************/ + +class tcfball_state : public hh_tms1k_state +{ +public: + tcfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tcfball(machine_config &config); + +protected: + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void tcfball_state::update_display() +{ + // R8 enables leds, R9 enables digits + u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780); + u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask; + + m_display->matrix(sel, m_o); +} + +void tcfball_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R5-R7: input mux + m_inp_mux = data >> 5 & 7; + + // R8+R0-R3: select led + // R9+R0-R6: select digit + m_r = data; + update_display(); +} + +void tcfball_state::write_o(u16 data) +{ + // O0-O7: digit segments/led data + m_o = data; + update_display(); +} + +u8 tcfball_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(3); +} + +// config + +static INPUT_PORTS_START( tcfball ) + PORT_START("IN.0") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") + + PORT_START("IN.2") // R7 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // college + PORT_CONFSETTING( 0x08, "2" ) // professional +INPUT_PORTS_END + +void tcfball_state::tcfball(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=56K, C=24pF + m_maincpu->k().set(FUNC(tcfball_state::read_k)); + m_maincpu->r().set(FUNC(tcfball_state::write_r)); + m_maincpu->o().set(FUNC(tcfball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 8); + m_display->set_segmask(0x77, 0x7f); + m_display->set_segmask(0x08, 0xff); // R3 has DP + m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter + config.set_default_layout(layout_tcfball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tcfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy Championship Football (model 60-2151) + * TMS1100NLL MP1183 (no decap) + * 7-digit 7seg LED display + LED grid, 1-bit sound + + The hardware is almost the same as the MP1193 one, they added an extra row of leds. + + known releases: + - World(1): Superbowl XV Football, published by E.R.S.(Electronic Readout Systems) + - World(2): Super-Pro Football, no brand + - USA: Championship Football (model 60-2151), published by Tandy + +***************************************************************************/ + +class tcfballa_state : public tcfball_state +{ +public: + tcfballa_state(const machine_config &mconfig, device_type type, const char *tag) : + tcfball_state(mconfig, type, tag) + { } + + void tcfballa(machine_config &config); +}; + +// handlers: uses the ones in tcfball_state + +// config + +static INPUT_PORTS_START( tcfballa ) + PORT_INCLUDE( tcfball ) + + PORT_MODIFY("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Display") +INPUT_PORTS_END + +void tcfballa_state::tcfballa(machine_config &config) +{ + tcfball(config); + + // basic machine hardware + m_maincpu->set_clock(375000); // approximation - RC osc. R=47K, C=50pF + + config.set_default_layout(layout_tcfballa); +} + +// roms + +ROM_START( tcfballa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_tcfballa_output.bin", 0, 0x20, CRC(887ad9a5) SHA1(a2bac48f555df098c1f1f0fa663e5bcb989b8987) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy Computerized Arcade (model 60-2159 or 60-2159A) + * TMS1100 MCU, label CD7282SL + * 12 lamps behind buttons, 1-bit sound + + known releases: + - World: Tandy-12: Computerized Arcade, published by Tandy + - World: Computerized Arcade, published by Tandy, Radio Shack brand. + This one is model 60-2495 from the mid-90s, perhaps different hardware! + - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as + 9-button version, a clone of Mego Fabulous Fred) + + This handheld contains 12 minigames. It looks and plays like Game Robot 9 by + Takatoku Toys (aka Mego's Fabulous Fred) from 1980, which in turn is a mix of + Merlin and Simon. Unlike Merlin and Simon, spin-offs were not as successful in + the USA. There were releases with and without the prefix "Tandy-12", I don't + know which name was more common. Also not worth noting is that it needed five + batteries; four C-cells and a 9-volt. + + Some of the games require accessories included with the toy (eg. the Baseball + game is played with a board representing the playing field). To start a game, + hold the [SELECT] button, then press [START] when the game button lights up. + As always, refer to the official manual for more information. + + See below at the input defs for a list of the games. + +***************************************************************************/ + +class tandy12_state : public hh_tms1k_state +{ +public: + tandy12_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tandy12(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tandy12_state::update_display() +{ + m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00)); +} + +void tandy12_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R5-R9: input mux + m_inp_mux = data >> 5 & 0x1f; + + // R0-R3: button lamps 9-12 + m_r = data; + update_display(); +} + +void tandy12_state::write_o(u16 data) +{ + // O0-O7: button lamps 1-8 + m_o = data; + update_display(); +} + +u8 tandy12_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +/* physical button layout and labels are like this: + + REPEAT-2 SPACE-2 + [O] OFF--ON [O] + + [purple]1 [blue]5 [l-green]9 + ORGAN TAG-IT TREASURE HUNT + + [l-orange]2 [turquoise]6 [red]10 + SONG WRITER ROULETTE COMPETE + + [pink]3 [yellow]7 [violet]11 + REPEAT BASEBALL FIRE AWAY + + [green]4 [orange]8 [brown]12 + TORPEDO REPEAT PLUS HIDE 'N SEEK + + [O] [O] [O] + START SELECT PLAY-2/HIT-7 +*/ + +static INPUT_PORTS_START( tandy12 ) + PORT_START("IN.0") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Button 12") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Button 11") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 9") + + PORT_START("IN.1") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start") + + PORT_START("IN.2") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 1") + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") +INPUT_PORTS_END + +// output PLA is not decapped, this was made by hand +static const u16 tandy12_output_pla[0x20] = +{ + // these are certain + 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, + 0x80, 0x00, 0x00, 0x00, 0x00, + + // rest is unused? + 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +void tandy12_state::tandy12(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->set_output_pla(tandy12_output_pla); + m_maincpu->k().set(FUNC(tandy12_state::read_k)); + m_maincpu->r().set(FUNC(tandy12_state::write_r)); + m_maincpu->o().set(FUNC(tandy12_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 13); + config.set_default_layout(layout_tandy12); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tandy12 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP ) +ROM_END + + + + + +/*************************************************************************** + + Tandy(Radio Shack division) Monkey See (1982 version) + * TMS1000 MP0271 (die label 1000E, MP0271), only half of ROM space used + * 2 LEDs(one red, one green), 1-bit sound + + This is the TMS1000 version, the one from 1977 has a MM5780. + To play, enter an equation followed by the ?-key, and the calculator will + tell you if it was right(green) or wrong(red). For example 1+2=3? + + known releases: + - USA(1): Monkey See, published by Tandy + - USA(2): Heathcliff, published by McNaught Syndicate in 1983 + +***************************************************************************/ + +class monkeysee_state : public hh_tms1k_state +{ +public: + monkeysee_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void monkeysee(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void monkeysee_state::write_r(u16 data) +{ + // R0-R4: input mux + m_inp_mux = data & 0x1f; + + // R5: speaker out + m_speaker->level_w(data >> 5 & 1); +} + +void monkeysee_state::write_o(u16 data) +{ + // O6,O7: leds + // other: N/C + m_display->matrix(1, data >> 6); +} + +u8 monkeysee_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( monkeysee ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") +INPUT_PORTS_END + +void monkeysee_state::monkeysee(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 250000); // approximation - RC osc. R=68K, C=47pF + m_maincpu->k().set(FUNC(monkeysee_state::read_k)); + m_maincpu->r().set(FUNC(monkeysee_state::write_r)); + m_maincpu->o().set(FUNC(monkeysee_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 2); + config.set_default_layout(layout_monkeysee); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( monkeysee ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) ) +ROM_END + + + + + +/*************************************************************************** + + Tandy 3 in 1 Sports Arena (model 60-2178) + * PCB label HP-804 + * TMS1100 (just a datestamp label (8331), die label 1100B MP1231) + * 2x2-digit 7seg LED display + 47 other LEDs, 1-bit sound + + For Tandy Sports Arena (model 60-2158), see cmsport, this is a different game. + This version is very similar to ssports4 released a few years earlier. + + 3 overlays were included for the games (Tandy calls them graphic sheets), + MAME external artwork is needed for those. + + It is always in 2-player head-to-head mode, the Player switch is just meant + for allowing the other player to have full control over 2 defense spots. + +***************************************************************************/ + +class t3in1sa_state : public hh_tms1k_state +{ +public: + t3in1sa_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void t3in1sa(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void t3in1sa_state::update_display() +{ + m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); +} + +void t3in1sa_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0,R1,R5,R7-R9: input mux + m_inp_mux = (data & 3) | (data >> 3 & 4) | (data >> 4 & 0x38); + + // R2: led data high + // R3-R7: led select + // R0,R1,R8,R9: digit select + m_r = data; + update_display(); +} + +void t3in1sa_state::write_o(u16 data) +{ + // O0-O7: led data low + m_o = data; + update_display(); +} + +u8 t3in1sa_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +/* physical button layout and labels are like this: + + ↑ + [ ] [ ] [ ] + TEAM-MATE PASS + ←[ ] [ ]→ shoot + ↗ ↖ + [ ] [ ] [ ] + STATUS ↓ KICK + pass + shoot + +Game and difficulty switches are under the yellow buttons, +player switch is under the red buttons. P1 is yellow, P2 is red. + +*/ + +static INPUT_PORTS_START( t3in1sa ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R5 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) // AMATEUR + PORT_CONFSETTING( 0x01, "2" ) // PRO + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x0e, 0x08, "Game Select" ) + PORT_CONFSETTING( 0x08, "Football" ) // F + PORT_CONFSETTING( 0x04, "Basketball" ) // B + PORT_CONFSETTING( 0x02, "Soccer" ) // S + + PORT_START("IN.4") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Up-Right / Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Team-Mate") + + PORT_START("IN.5") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Up-Right / Status") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass / Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Team-Mate") +INPUT_PORTS_END + +void t3in1sa_state::t3in1sa(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(t3in1sa_state::read_k)); + m_maincpu->r().set(FUNC(t3in1sa_state::write_r)); + m_maincpu->o().set(FUNC(t3in1sa_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x303, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_t3in1sa); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( t3in1sa ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1231", 0x0000, 0x0800, CRC(1c24e5c2) SHA1(0b6c2edea27eba15e890d82475b91a5e9ef6c4b9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_t3in1sa_output.pla", 0, 365, CRC(de82a294) SHA1(7187666a510919b90798b92b9104ac5d6820d559) ) +ROM_END + + + + + +/*************************************************************************** + + Telesensory Systems, Inc.(TSI) Speech+ + * TMS1000 MCU, label TMS1007NL (die label 1000B, 1007A) + * TSI S14001A speech chip, GI S14007-A 2KB maskrom for samples + * 9-digit 7seg LED display + + This is a speaking calculator for the blind, the instructions that came + with it were on audio cassette. It was also released in 1978 by APH + (American Printing House for the Blind). + +***************************************************************************/ + +class speechp_state : public hh_tms1k_state +{ +public: + speechp_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_speech(*this, "speech") + { } + + void speechp(machine_config &config); + +private: + required_device m_speech; + + void update_display(); + virtual void write_r(u16 data); + virtual void write_o(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void speechp_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void speechp_state::write_r(u16 data) +{ + // R5-R9: TSI C0-C5 + m_speech->data_w(data >> 5 & 0x3f); + + // R10: TSI START line + m_speech->start_w(data >> 10 & 1); + + // R0-R9: input mux + m_inp_mux = data & 0x3ff; + + // R0-R8: select digit + m_r = data; + update_display(); +} + +void speechp_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 speechp_state::read_k() +{ + // K: multiplexed inputs + return m_inputs[10]->read() | (read_inputs(10) & 7); +} + +// config + +static INPUT_PORTS_START( speechp ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") // Swap + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") // Clear + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speak") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") // Memory + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.9") // R9 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x00, "Verbose" ) + PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("IN.10") // K8 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x08, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) +INPUT_PORTS_END + +void speechp_state::speechp(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF + m_maincpu->k().set(FUNC(speechp_state::read_k)); + m_maincpu->r().set(FUNC(speechp_state::write_r)); + m_maincpu->o().set(FUNC(speechp_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_speechp); + + // sound hardware + SPEAKER(config, "mono").front_center(); + S14001A(config, m_speech, 25000); // approximation + m_speech->add_route(ALL_OUTPUTS, "mono", 0.75); +} + +// roms + +ROM_START( speechp ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) ) + + ROM_REGION( 0x0800, "speech", 0 ) + ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) ) +ROM_END + + + + + +/*************************************************************************** + + TI SR-16 (1974, first consumer product with TMS1000 series MCU) + * TMS1000 MCU label TMS1001NL (die label 1000, 1001A) + * 12-digit 7seg LED display + + TI SR-16 II (1975 version) + * TMS1000 MCU label TMS1016NL (die label 1000B, 1016A) + * notes: cost-reduced 'sequel', [10^x] was removed, and [pi] was added. + +***************************************************************************/ + +class tisr16_state : public hh_tms1k_state +{ +public: + tisr16_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void tisr16(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void tisr16_state::update_display() +{ + m_display->matrix(m_r, m_o); + + // exponent sign is from R10 O1, and R10 itself only uses segment G + u8 r10 = m_display->read_row(10); + m_display->write_row(11, r10 << 5 & 0x40); + m_display->write_row(10, r10 & 0x40); +} + +void tisr16_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void tisr16_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 tisr16_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( tisr16 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("10" UTF8_POW_X) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( tisr16ii ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CD") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") +INPUT_PORTS_END + +void tisr16_state::tisr16(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq) + m_maincpu->k().set(FUNC(tisr16_state::read_k)); + m_maincpu->o().set(FUNC(tisr16_state::write_o)); + m_maincpu->r().set(FUNC(tisr16_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(0xfff, 0xff); + config.set_default_layout(layout_tisr16); + + // no sound! +} + +// roms + +ROM_START( tisr16 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) ) +ROM_END + +ROM_START( tisr16ii ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1250/TI-1200 (1975 version), Spirit of '76 + * TMS0950 MCU label TMC0952NL, K0952 (die label 0950A 0952) + * 9-digit 7seg LED display + + TI-1250/TI-1200 (1976 version), TI-1400, TI-1450, TI-1205, TI-1255, LADY 1200, ABLE + * TMS0970 MCU label TMS0972NL ZA0348, JP0972A (die label 0970D-72A) + * 8-digit 7seg LED display, or 9 digits with leftmost unused + + As seen listed above, the basic 4-function TMS0972 calculator MCU was used + in many calculators. It was licensed to other manufacturers too, one funny + example being a Mattel Barbie handheld calculator. + + Some cheaper models lacked the memory buttons (the function itself still works). + The ABLE series was for educational purposes, with each having a small subset of + available buttons. + + TI-1270 + * TMS0970 MCU label TMC0974NL ZA0355, DP0974A (die label 0970D-74A) + * 8-digit 7seg LED display + * notes: almost same hardware as TMS0972 TI-1250, minor scientific functions + +***************************************************************************/ + +class ti1250_state : public hh_tms1k_state +{ +public: + ti1250_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti1270(machine_config &config); + void ti1250(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti1250_state::write_r(u16 data) +{ + // R0-R8: select digit + m_display->matrix(data, m_o); +} + +void ti1250_state::write_o(u16 data) +{ + // O1-O5,O7: input mux + // O0-O7: digit segments + m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); + m_o = data; +} + +u8 ti1250_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ti1250 ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("CS") // named either CS(Change Sign) or +/- + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("MC") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") +INPUT_PORTS_END + +static INPUT_PORTS_START( ti1270 ) + PORT_INCLUDE( ti1250 ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") + + PORT_MODIFY("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") +INPUT_PORTS_END + +void ti1250_state::ti1250(machine_config &config) +{ + // basic machine hardware + TMS0950(config, m_maincpu, 200000); // approximation - RC osc. R=68K, C=68pf + m_maincpu->k().set(FUNC(ti1250_state::read_k)); + m_maincpu->o().set(FUNC(ti1250_state::write_o)); + m_maincpu->r().set(FUNC(ti1250_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xff, 0xff); + m_display->set_segmask(0x100, 0x40); // R8 only has segment G connected + config.set_default_layout(layout_ti1250); + + // no sound! +} + +void ti1250_state::ti1270(machine_config &config) +{ + ti1250(config); + + // basic machine hardware + TMS0970(config.replace(), m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti1250_state::read_k)); + m_maincpu->o().set(FUNC(ti1250_state::write_o)); + m_maincpu->r().set(FUNC(ti1250_state::write_r)); + + config.set_default_layout(layout_ti1270); +} + +// roms + +ROM_START( ti1250 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) ) + ROM_REGION( 195, "maincpu:opla", 0 ) + ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + +ROM_START( ti125076 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + +ROM_START( ti1270 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI-2550 III, TI-1650/TI-1600, TI-1265 (they have the same chip) + * TMS1040 MCU label TMS1043NL ZA0352 (die label 1040A, 1043A) + * 9-digit cyan VFD display + + Only the TI-2550 III has the top button row (RV, SQRT, etc). + TI-1600 doesn't have the memory buttons. + +***************************************************************************/ + +class ti25503_state : public hh_tms1k_state +{ +public: + ti25503_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti25503(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti25503_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void ti25503_state::write_r(u16 data) +{ + // R0-R6: input mux + // R0-R8: select digit + m_r = m_inp_mux = data; + update_display(); +} + +void ti25503_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 ti25503_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(7); +} + +// config + +static INPUT_PORTS_START( ti25503 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") +INPUT_PORTS_END + +void ti25503_state::ti25503(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti25503_state::read_k)); + m_maincpu->o().set(FUNC(ti25503_state::write_o)); + m_maincpu->r().set(FUNC(ti25503_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0xff); + config.set_default_layout(layout_ti25503); + + // no sound! +} + +// roms + +ROM_START( ti25503 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) ) +ROM_END + + + + + +/*************************************************************************** + + TI-5100, more (see below) + * TMS1070 MCU label TMS1073NL or TMC1073NL (die label 1070B, 1073) + * 11-digit 7seg VFD (1 custom digit) + + This chip was also used in 3rd-party calculators, such as Toshiba BC-1015, + Panasonic JE1601U, Radio Shack EC2001, Triumph-Adler D100. The original + TI version did not have the 3 buttons at R4. + +***************************************************************************/ + +class ti5100_state : public hh_tms1k_state +{ +public: + ti5100_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti5100(machine_config &config); + +private: + void update_display(); + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti5100_state::update_display() +{ + // extra segment on R10 + m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o); +} + +void ti5100_state::write_r(u16 data) +{ + // R0-R10: input mux, select digit + m_r = m_inp_mux = data; + update_display(); +} + +void ti5100_state::write_o(u16 data) +{ + // O0-O7: digit segments + m_o = data; + update_display(); +} + +u8 ti5100_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(11); +} + +// config + +static INPUT_PORTS_START( ti5100 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "K" ) // constant mode + PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) + PORT_CONFSETTING( 0x08, DEF_STR( On ) ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "DP" ) // display point + PORT_CONFSETTING( 0x00, "F" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // clear all? + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("EX") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("GPM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(UTF8_CAPITAL_DELTA"%") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CE") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R8 0x01 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R9 0x02 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.10") // R10 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-=") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("RM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) +INPUT_PORTS_END + +void ti5100_state::ti5100(machine_config &config) +{ + // basic machine hardware + TMS1070(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti5100_state::read_k)); + m_maincpu->o().set(FUNC(ti5100_state::write_o)); + m_maincpu->r().set(FUNC(ti5100_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 9); + m_display->set_segmask(0x7ff, 0xff); + config.set_default_layout(layout_ti5100); + + // no sound! +} + +// roms + +ROM_START( ti5100 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms1073nl", 0x0000, 0x0400, CRC(94185933) SHA1(d2d9432f857b8530ac399f5097c6d412f06d8814) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ti5100_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ti5100_output.pla", 0, 365, CRC(11f6f0f4) SHA1(f25cf6bd284ab4614746b2e3f98d42d2585e425a) ) +ROM_END + + + + + +/*************************************************************************** + + TMC098x series Majestic-line calculators + + TI-30, SR-40, TI-15(less buttons) and several by Koh-I-Noor + * TMS0980 MCU label TMC0981NL (die label 0980B-81F) + * 9-digit 7seg LED display + + Of note is a peripheral by Schoenherr, called the Braillotron. It acts as + a docking station to the TI-30, with an additional display made of magnetic + refreshable Braille cells. The TI-30 itself is slightly modified to wire + the original LED display to a 25-pin D-Sub connector. + + TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 + * TMS0980 MCU label TMC0982NL (die label 0980B-82F) + + TI Programmer + * TMS0980 MCU label ZA0675NL, JP0983AT (die label 0980B-83) + +***************************************************************************/ + +class ti30_state : public hh_tms1k_state +{ +public: + ti30_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti30(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti30_state::write_r(u16 data) +{ + // R0-R8: select digit + m_display->matrix(data, m_o); +} + +void ti30_state::write_o(u16 data) +{ + // O0-O2,O4-O7: input mux + // O0-O7: digit segments + m_inp_mux = (data & 7) | (data >> 1 & 0x78); + m_o = bitswap<8>(data,7,5,2,1,4,0,6,3); +} + +u8 ti30_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[7]->read() | read_inputs(7); +} + +// config + +static INPUT_PORTS_START( ti30 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE" UTF8_DOWN) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("DRG") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("INV") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("cos") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("sin") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("tan") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +static INPUT_PORTS_START( tiprog ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +static INPUT_PORTS_START( tibusan ) + // PORT_NAME lists functions under [2nd] as secondaries. + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X" " UTF8_POW_X"" UTF8_SQUAREROOT"y") // 2nd one implies xth root of y + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% " UTF8_CAPITAL_DELTA"%") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("CST") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("MAR") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO m") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL b") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA"+ " UTF8_CAPITAL_SIGMA"-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("( AN-CI\"") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("x<>y L.R.") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(") 1/x") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("SUM x" UTF8_PRIME) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + + PORT_START("IN.5") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("FV") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("PMT") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("%i") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("PV") + + PORT_START("IN.6") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC x" UTF8_PRIME) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) +INPUT_PORTS_END + +void ti30_state::ti30(machine_config &config) +{ + // basic machine hardware + TMS0980(config, m_maincpu, 400000); // guessed + m_maincpu->k().set(FUNC(ti30_state::read_k)); + m_maincpu->o().set(FUNC(ti30_state::write_o)); + m_maincpu->r().set(FUNC(ti30_state::write_r)); + m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1fe, 0xff); + m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP + config.set_default_layout(layout_ti30); + + // no sound! +} + +// roms + +ROM_START( ti30 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( tibusan ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + +ROM_START( tiprog ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 1982, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0980_tiprog_micro.pla", 0, 1982, CRC(57043284) SHA1(0fa06d5865830ecdb3d870271cb92ac917bed3ca) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_tiprog_output.pla", 0, 352, BAD_DUMP CRC(125c4ee6) SHA1(b8d865c42fd37c3d9b92c5edbecfc831be558597) ) // corrected by hand + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1000 (1977 version) + * TMS1990 MCU label TMC1991NL (die label 1991-91A) + * 8-digit 7seg LED display + + TI-1000 (1978 version) + * TMS1990 MCU label TMC1992-4NL **not dumped yet + +***************************************************************************/ + +class ti1000_state : public hh_tms1k_state +{ +public: + ti1000_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ti1000(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void ti1000_state::write_r(u16 data) +{ + // R0-R7: select digit + m_display->matrix(data, m_o); +} + +void ti1000_state::write_o(u16 data) +{ + // O0-O3,O5(?): input mux + // O0-O7: digit segments + m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); + m_o = bitswap<8>(data,7,4,3,2,1,0,6,5); +} + +u8 ti1000_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( ti1000 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.3") // O3 or O4? + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void ti1000_state::ti1000(machine_config &config) +{ + // basic machine hardware + TMS1990(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(ti1000_state::read_k)); + m_maincpu->o().set(FUNC(ti1000_state::write_o)); + m_maincpu->r().set(FUNC(ti1000_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 8); + m_display->set_segmask(0xff, 0xff); + config.set_default_layout(layout_ti1270); + + // no sound! +} + +// roms + +ROM_START( ti1000 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) +ROM_END + + + + + +/*************************************************************************** + + TI WIZ-A-TRON + * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label 0970F-07B) + * 9-digit 7seg LED display(one custom digit) + +***************************************************************************/ + +class wizatron_state : public hh_tms1k_state +{ +public: + wizatron_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void wizatron(machine_config &config); + +protected: + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void wizatron_state::write_r(u16 data) +{ + // R0-R8: select digit + + // 3rd digit only has A and G for =, though some newer hardware revisions + // (goes for both wizatron and lilprof) use a custom equals-sign digit here + + // 6th digit is custom(not 7seg), for math symbols, like this: + // \./ GAB + // --- F + // /.\ EDC + m_display->matrix(data, m_o); +} + +void wizatron_state::write_o(u16 data) +{ + // O1-O4: input mux + // O0-O6: digit segments A-G + // O7: N/C + m_inp_mux = data >> 1 & 0xf; + m_o = data & 0x7f; +} + +u8 wizatron_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( wizatron ) + PORT_START("IN.0") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.1") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.2") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) +INPUT_PORTS_END + +void wizatron_state::wizatron(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(wizatron_state::read_k)); + m_maincpu->o().set(FUNC(wizatron_state::write_o)); + m_maincpu->r().set(FUNC(wizatron_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff^8, 0x7f); + m_display->set_segmask(8, 0x41); // equals sign + config.set_default_layout(layout_wizatron); + + // no sound! +} + +// roms + +ROM_START( wizatron ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI Little Professor (1976 version) + * TMS0970 MCU label TMS0975NL ZA0356, GP0975CS (die label 0970D-75C) + * 9-digit 7seg LED display(one custom digit) + + The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this + one is older). + +***************************************************************************/ + +class lilprof_state : public wizatron_state +{ +public: + lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : + wizatron_state(mconfig, type, tag) + { } + + void lilprof(machine_config &config); + +private: + virtual void write_o(u16 data) override; + virtual u8 read_k() override; +}; + +// handlers + +void lilprof_state::write_o(u16 data) +{ + // O1-O4,O7: input mux + // O0-O6: digit segments A-G + m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); + m_o = data; +} + +u8 lilprof_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( lilprof ) + PORT_INCLUDE( wizatron ) + + PORT_MODIFY("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + + PORT_START("IN.4") // O7 + PORT_CONFNAME( 0x0f, 0x01, "Level") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) +INPUT_PORTS_END + +void lilprof_state::lilprof(machine_config &config) +{ + wizatron(config); + + // basic machine hardware + m_maincpu->k().set(FUNC(lilprof_state::read_k)); + m_maincpu->o().set(FUNC(lilprof_state::write_o)); +} + +// roms + +ROM_START( lilprof ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + TI Little Professor (1978 version) + * TMS1990 MCU label TMC1993NL (die label 1990C-c3C) + * 9-digit 7seg LED display(one custom digit) + + 1978 re-release, with on/off and level select on buttons instead of + switches. The casing was slightly revised in 1980 again, but same rom. + +***************************************************************************/ + +class lilprof78_state : public hh_tms1k_state +{ +public: + lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void lilprof78(machine_config &config); + +private: + void write_o(u16 data); + void write_r(u16 data); + u8 read_k(); +}; + +// handlers + +void lilprof78_state::write_r(u16 data) +{ + // update leds state + u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; + u16 r = (data & 7) | (data << 1 & 0x1f0); + m_display->matrix(r, seg); + + // 3rd digit A/G(equals sign) is from O7 + m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); + + // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) + m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); +} + +void lilprof78_state::write_o(u16 data) +{ + // O0-O3,O5(?): input mux + // O0-O6: digit segments A-G + // O7: 6th digit + m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); + m_o = data; +} + +u8 lilprof78_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( lilprof78 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.3") // O3 or O4? + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + + PORT_START("IN.4") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") +INPUT_PORTS_END + +void lilprof78_state::lilprof78(machine_config &config) +{ + // basic machine hardware + TMS1990(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(lilprof78_state::read_k)); + m_maincpu->o().set(FUNC(lilprof78_state::write_o)); + m_maincpu->r().set(FUNC(lilprof78_state::write_r)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 7); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_wizatron); + + // no sound! +} + +// roms + +ROM_START( lilprof78 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) +ROM_END + + + + + +/*************************************************************************** + + TI-1680, TI-2550-IV + * TMS1980 MCU label TMC1981NL (die label 1980A 81F) + * TMC0999NL 256x4 RAM (die label 0999B) + * 9-digit cyan VFD display(leftmost digit is custom) + + The extra RAM is for scrolling back through calculations. For some reason, + TI-2550-IV has the same hardware, this makes it very different from II and III. + +***************************************************************************/ + +class ti1680_state : public hh_tms1k_state +{ +public: + ti1680_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_ram(*this, "ram") + { } + + void ti1680(machine_config &config); + +private: + required_device m_ram; + + virtual void update_display(); + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void ti1680_state::update_display() +{ + // note the extra segments on R9 and R3 + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80) | (m_r << 5 & 0x100)); +} + +void ti1680_state::write_r(u16 data) +{ + // R8,R0,R5,R6: TMC0999 data inputs + // R2,R4+R1/R7: TMC0999 control pins + m_ram->di_w(bitswap<4>(data,8,0,5,6)); + m_ram->adr_w(BIT(data, 2)); + m_ram->wr_w(BIT(data, 4) & BIT(data, 7)); + m_ram->rd_w(BIT(data, 4) & BIT(data, 1)); + + // R3-R8: input mux + m_inp_mux = data >> 3 & 0x3f; + + // R0-R8: select digit + // R9: digit DP segment + m_r = data; + update_display(); +} + +void ti1680_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; + update_display(); +} + +u8 ti1680_state::read_k() +{ + // K: multiplexed inputs, RAM data + return read_inputs(6) | m_ram->do_r(); +} + +// config + +static INPUT_PORTS_START( ti1680 ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("BST") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("RPL") + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + + PORT_START("IN.4") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + + PORT_START("IN.5") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") +INPUT_PORTS_END + +void ti1680_state::ti1680(machine_config &config) +{ + // basic machine hardware + TMS1980(config, m_maincpu, 300000); // approximation + m_maincpu->k().set(FUNC(ti1680_state::read_k)); + m_maincpu->o().set(FUNC(ti1680_state::write_o)); + m_maincpu->r().set(FUNC(ti1680_state::write_r)); + m_maincpu->power_off().set(FUNC(ti1680_state::auto_power_off)); + + TMC0999(config, m_ram); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 9); + m_display->set_segmask(0x1fe, 0xff); + config.set_default_layout(layout_ti1680); + + // no sound! +} + +// roms + +ROM_START( ti1680 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1981nl", 0x0000, 0x1000, CRC(8467c5a1) SHA1(d3a48f6c9dd41e2dc0e0cfafa84dac8d21aacaa3) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_ti1680_output.pla", 0, 525, CRC(188af340) SHA1(eaf707266dde0d708870ef5d8f985ce88d35b43e) ) +ROM_END + + + + + +/*************************************************************************** + + TI DataMan + * TMS1980 MCU label TMC1982NL (die label 1980A 82B) + * 10-digit cyan VFD display(3 digits are custom) + +***************************************************************************/ + +class dataman_state : public hh_tms1k_state +{ +public: + dataman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void dataman(machine_config &config); + +protected: + virtual void update_display(); + virtual void write_o(u16 data); + virtual void write_r(u16 data); + virtual u8 read_k(); +}; + +// handlers + +void dataman_state::update_display() +{ + // note the extra segment on R9 + m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80)); +} + +void dataman_state::write_r(u16 data) +{ + // R0-R4: input mux + // R0-R8: select digit + // R9: =(equals sign) segment + m_r = m_inp_mux = data; + update_display(); +} + +void dataman_state::write_o(u16 data) +{ + // O0-O6: digit segments A-G + m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; + update_display(); +} + +u8 dataman_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[5]->read() | read_inputs(5); +} + +// config + +static INPUT_PORTS_START( dataman ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Memory Bank") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Go") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Force Out") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Number Guesser") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wipe Out") + + // note: even though power buttons are on the matrix, they are not CPU-controlled + PORT_START("IN.5") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Electro Flash") +INPUT_PORTS_END + +void dataman_state::dataman(machine_config &config) +{ + // basic machine hardware + TMS1980(config, m_maincpu, 300000); // patent says 300kHz + m_maincpu->k().set(FUNC(dataman_state::read_k)); + m_maincpu->o().set(FUNC(dataman_state::write_o)); + m_maincpu->r().set(FUNC(dataman_state::write_r)); + m_maincpu->power_off().set(FUNC(dataman_state::auto_power_off)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0x1ff, 0x7f); + config.set_default_layout(layout_dataman); + + // no sound! +} + +// roms + +ROM_START( dataman ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) +ROM_END + + + + + +/*************************************************************************** + + TI Math Marvel + * TMS1980 MCU label TMC1986A-NL (die label 1980A 86A) + * 9-digit cyan VFD display(2 digits are custom), 1-bit sound + + This is the same hardware as DataMan, with R8 connected to a piezo. + +***************************************************************************/ + +class mathmarv_state : public dataman_state +{ +public: + mathmarv_state(const machine_config &mconfig, device_type type, const char *tag) : + dataman_state(mconfig, type, tag) + { } + + void mathmarv(machine_config &config); + +private: + virtual void write_r(u16 data) override; +}; + +// handlers + +void mathmarv_state::write_r(u16 data) +{ + // R8: speaker out + m_speaker->level_w(data >> 8 & 1); + + // rest is same as dataman + dataman_state::write_r(data); +} + +// config + +static INPUT_PORTS_START( mathmarv ) + PORT_INCLUDE( dataman ) + + PORT_MODIFY("IN.4") // R4 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Quest") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Checker") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Review") + + PORT_MODIFY("IN.5") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Zap") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Flash") +INPUT_PORTS_END + +void mathmarv_state::mathmarv(machine_config &config) +{ + dataman(config); + + // basic machine hardware + m_maincpu->r().set(FUNC(mathmarv_state::write_r)); + + config.set_default_layout(layout_mathmarv); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mathmarv ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "maincpu:opla", 0 ) + ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) +ROM_END + + + + + +/*************************************************************************** + + Texas Instruments maze game (unreleased, from patent GB2040172A) + * TMS1000 (development version) + * 1 7seg LED digit, no sound + + The title of this game is unknown, the patent describes it simply as a maze game. + Several electronic maze game concepts are listed in the patent. The PCB schematic + and program source code is included for one of them: A predefined 12*8 maze, + walls close to the player are displayed on a 7seg digit. + + In the end Texas Instruments didn't release any electronic maze game. This version + is too simple and obviously unfinished, start and goal positions are always the same + and there is a lot of ROM space left for more levels. + +***************************************************************************/ + +class timaze_state : public hh_tms1k_state +{ +public: + timaze_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void timaze(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void timaze_state::write_r(u16 data) +{ + // R0: input mux + m_inp_mux = data & 1; +} + +void timaze_state::write_o(u16 data) +{ + // O3210: 7seg EGCD? + m_display->matrix(1, bitswap<8>(data, 7,1,6,0,3,2,5,4)); +} + +u8 timaze_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(1); +} + +// config + +static INPUT_PORTS_START( timaze ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY +INPUT_PORTS_END + +void timaze_state::timaze(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=80K, C=27pF + m_maincpu->k().set(FUNC(timaze_state::read_k)); + m_maincpu->r().set(FUNC(timaze_state::write_r)); + m_maincpu->o().set(FUNC(timaze_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 8); + m_display->set_segmask(1, 0x5c); + config.set_default_layout(layout_timaze); + + // no sound! +} + +// roms + +ROM_START( timaze ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order +ROM_END + + + + + +/*************************************************************************** + + Texas Instruments Electronic Digital Thermostat + * TMS0970 MCU, label TMS0970NLL TMC0910B (die label 0970F-10E) + * 9-digit 7seg LED display, only 4 used + * temperature sensor, heat/cool/fan outputs + + This is a thermostat and digital clock. It's the 2nd one described in + patents US4388692 and US4298946. + +***************************************************************************/ + +class tithermos_state : public hh_tms1k_state +{ +public: + tithermos_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_60hz(*this, "ac_line") + { } + + void tithermos(machine_config &config); + +private: + required_device m_60hz; + + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void tithermos_state::write_r(u16 data) +{ + // D1-D4: select digit + m_display->matrix(data, m_o); + + // D6: heat/cool + // D8: A/D reset + m_r = data; +} + +void tithermos_state::write_o(u16 data) +{ + // SA-SP: input mux + // SA-SG: digit segments + m_o = m_inp_mux = data; +} + +u8 tithermos_state::read_k() +{ + // K: multiplexed inputs + u8 data = read_inputs(8); + + // when SB/SD/SP is high: + if (m_inp_mux & 0x8a) + { + // K1: 60hz from AC line + // K2: battery low? + // K8: A/D output (TODO) + data |= (m_60hz->signal_r()) ? 1 : 0; + } + + return data; +} + +// config + +static INPUT_PORTS_START( tithermos ) + PORT_START("IN.0") // SA + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Temp Row PM 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Time Row PM 2") + + PORT_START("IN.1") // SB + PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // SC + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Temp Row PM 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Time Row PM 1") + + PORT_START("IN.3") // SD + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line + PORT_CONFNAME( 0x06, 0x04, "System") + PORT_CONFSETTING( 0x04, "Heat" ) + PORT_CONFSETTING( 0x00, "Off" ) + PORT_CONFSETTING( 0x02, "Cool" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output + + PORT_START("IN.4") // SE + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Temp Row AM 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Time Row AM 2") + + PORT_START("IN.5") // SF + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Temp Row AM 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Time Row AM 1") + + PORT_START("IN.6") // SG + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Temp / Actual") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Time / Clock") + + PORT_START("IN.7") // SP + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line + PORT_CONFNAME( 0x06, 0x04, "Mode") + PORT_CONFSETTING( 0x04, "Constant" ) + PORT_CONFSETTING( 0x00, "Day/Night" ) + PORT_CONFSETTING( 0x02, "Night" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output + + PORT_START("IN.8") + PORT_CONFNAME( 0x01, 0x00, "Fan") + PORT_CONFSETTING( 0x00, "On" ) + PORT_CONFSETTING( 0x01, "Auto" ) // same output as heat/cool +INPUT_PORTS_END + +void tithermos_state::tithermos(machine_config &config) +{ + // basic machine hardware + TMS0970(config, m_maincpu, 250000); // approximation + m_maincpu->k().set(FUNC(tithermos_state::read_k)); + m_maincpu->r().set(FUNC(tithermos_state::write_r)); + m_maincpu->o().set(FUNC(tithermos_state::write_o)); + + CLOCK(config, "ac_line", 60); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_tithermos); + + // no sound! +} + +// roms + +ROM_START( tithermos ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "tmc0910b", 0x0000, 0x0400, CRC(232011cf) SHA1(598ae8cecd98226fb5056c99ce9f47fd23785fd7) ) + + ROM_REGION( 782, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) + ROM_REGION( 860, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0970_tithermos_micro.pla", 0, 860, CRC(a3bb8ca5) SHA1(006ea733440001c37a77d4ffbc4bd2a8fee212ac) ) + ROM_REGION( 352, "maincpu:opla", 0 ) + ROM_LOAD( "tms0980_tithermos_output.pla", 0, 352, CRC(eb3598fd) SHA1(2372ae17fb982cae2710bf8c348bf02b767daabd) ) + ROM_REGION( 157, "maincpu:spla", 0 ) + ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Sub Wars (model 7-490) + * PCB label CSG201A(main), CSG201B(leds) + * TMS1200N2LL MP3352 (die label 1000C, MP3352) + * 4-digit 7seg LED display + 55 other LEDs, 1-bit sound + + Tiger/Yeno also published an LCD handheld called Sub Wars, it's not related. + + This handheld was modified and used as a prop in the 1981 movie Escape from + New York, Snake Plissken uses it as a homing device. + +***************************************************************************/ + +class subwars_state : public hh_tms1k_state +{ +public: + subwars_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void subwars(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void subwars_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void subwars_state::write_r(u16 data) +{ + // R0-R3: digit select + // R4-R12: led select + m_r = data; + update_display(); +} + +void subwars_state::write_o(u16 data) +{ + // O0-O6: led data + m_o = data; + update_display(); + + // O7: speaker out + m_speaker->level_w(BIT(data, 7)); +} + +// config + +static INPUT_PORTS_START( subwars ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void subwars_state::subwars(machine_config &config) +{ + // basic machine hardware + TMS1200(config, m_maincpu, 550000); // approximation - RC osc. R=24K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(subwars_state::write_r)); + m_maincpu->o().set(FUNC(subwars_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(13, 7); + m_display->set_segmask(0xf, 0x7f); + config.set_default_layout(layout_subwars); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( subwars ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp3352", 0x0000, 0x0400, CRC(5dece1e4) SHA1(65ef77b063c94ff4b6c83dace54ea2f75bd3d6a9) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_subwars_output.pla", 0, 365, CRC(372b9bbc) SHA1(06a875e114b7757c6f4f1727416d1739ebe60931) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A) + * TMS1100 MP1215 (die label 1100B MP1215) + * 2-digit 7seg LED display + 40 other LEDs, 1-bit sound + + The games are on playcards(Tiger calls them that), the hardware detects which + game is inserted from a notch at the lower-right. The playcards also function + as an overlay. MAME external artwork is needed for those. + + Booting the handheld with no playcard inserted will initiate a halftime show. + + "Playmaker" is actually Tiger's trademark for the d-pad controller, this + controller term was also used in for example Deluxe Football, and 7 in 1 Sports + Stadium. The d-pad has a ball shape at the bottom that sits on a concave base. + It is patented under US4256931 (mid-1979, a couple of years before Nintendo's + Game & Watch d-pad with US4687200). + +***************************************************************************/ + +class playmaker_state : public hh_tms1k_state +{ +public: + playmaker_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void playmaker(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + u8 m_notch = 0; // cartridge K1/K2 + + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void playmaker_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_notch)); +} + +// handlers + +DEVICE_IMAGE_LOAD_MEMBER(playmaker_state::cart_load) +{ + if (!image.loaded_through_softlist()) + { + image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); + return image_init_result::FAIL; + } + + // get cartridge notch + const char *notch = image.get_feature("notch"); + m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0; + + return image_init_result::PASS; +} + +void playmaker_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void playmaker_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R3: input mux + m_inp_mux = data & 0xf; + + // R0-R7: led select + // R8,R9: digit select + m_r = data; + update_display(); +} + +void playmaker_state::write_o(u16 data) +{ + // O0-O6: led data + m_o = data; + update_display(); +} + +u8 playmaker_state::read_k() +{ + // K: multiplexed inputs, cartridge notch from R3 + return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0); +} + +// config + +static INPUT_PORTS_START( playmaker ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot / P1 Skill") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill") +INPUT_PORTS_END + +void playmaker_state::playmaker(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=20K, C=250pF + m_maincpu->k().set(FUNC(playmaker_state::read_k)); + m_maincpu->r().set(FUNC(playmaker_state::write_r)); + m_maincpu->o().set(FUNC(playmaker_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 7); + m_display->set_segmask(0x300, 0x7f); + m_display->set_bri_levels(0.004, 0.04); // player 1 leds are brighter + config.set_default_layout(layout_playmaker); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); + + // cartridge + generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "playmaker_cart")); + cartslot.set_must_be_loaded(false); + cartslot.set_device_load(FUNC(playmaker_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("playmaker"); +} + +// roms + +ROM_START( playmaker ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1215", 0x0000, 0x0800, CRC(bfc7b6c8) SHA1(33f6e2b86fae2fd9e4b0a4b8dc842c257ca3047d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_playmaker_output.pla", 0, 365, CRC(0cd484d6) SHA1(4a9af9f3d18af504145690cb0f6444ff1aef26ca) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Deluxe Football with Instant Replay (model 7-550) + * TMS1400NLL MP7302 (die label TMS1400 MP7302) + * 4-digit 7seg LED display, 80 red/green LEDs, 1-bit sound + + According to the manual, player 1 is green, player 2 is red. But when + playing a 1-player game, the CPU controls green, so on MAME, player 1 + is the red side. + + Booting the handheld with the Score and Replay buttons held down will + initiate a halftime show. + +***************************************************************************/ + +class dxfootb_state : public hh_tms1k_state +{ +public: + dxfootb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void dxfootb(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void dxfootb_state::update_display() +{ + // 2 led groups (double multiplexed) + u16 g1 = (m_r & 0x100) ? 0x7f : 0; + u16 g2 = (m_r & 0x80) ? 0x7f << 7 : 0; + m_display->matrix((m_r & g1) | (m_r << 7 & g2), m_o); +} + +void dxfootb_state::write_r(u16 data) +{ + // R9,R10: speaker out + m_speaker->level_w(data >> 9 & 3); + + // R3-R6: input mux + m_inp_mux = data >> 3 & 0xf; + + // R0-R6: led select + // R7,R8: group select + m_r = data; + update_display(); +} + +void dxfootb_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 dxfootb_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( dxfootb ) + PORT_START("IN.0") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Replay / Skill (Green)") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score / Skill (Red)") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") + + PORT_START("IN.2") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + + PORT_START("IN.3") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) +INPUT_PORTS_END + +void dxfootb_state::dxfootb(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(dxfootb_state::read_k)); + m_maincpu->r().set(FUNC(dxfootb_state::write_r)); + m_maincpu->o().set(FUNC(dxfootb_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(7+7, 8); + m_display->set_segmask(0x3c00, 0x7f); + config.set_default_layout(layout_dxfootb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( dxfootb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7302", 0x0000, 0x1000, CRC(a8077062) SHA1(c1318fe5c8f2db021d7d1264fc70158944045fa3) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_dxfootb_output.pla", 0, 557, CRC(a1b3d2c0) SHA1(8030e6dcd3878b58668c98cff36d93b764e1d67f) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Copy Cat (model 7-520) + * PCB label CC REV B + * TMS1000 MCU, label 69-11513 MP0919 (die label MP0919) + * 4 LEDs, 1-bit sound + + known releases: + - World: Copy Cat, published by Tiger + - USA(1): Follow Me, published by Sears + - USA(2): Electronic Repeat, published by Tandy + +***************************************************************************/ + +class copycat_state : public hh_tms1k_state +{ +public: + copycat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void copycat(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void copycat_state::write_r(u16 data) +{ + // R0-R3: leds + m_display->matrix(1, data & 0xf); + + // R4-R7: input mux + // R8-R10: N/C + m_inp_mux = data >> 4 & 0xf; +} + +void copycat_state::write_o(u16 data) +{ + // O0,O1: speaker out + // O2,O7: N/C, O3-O6: tied together but unused + m_speaker->level_w(data & 3); +} + +u8 copycat_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( copycat ) + PORT_START("IN.0") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + + PORT_START("IN.1") // R5 + PORT_CONFNAME( 0x0f, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_CONFSETTING( 0x08, "4" ) + + PORT_START("IN.2") // R6 + PORT_CONFNAME( 0x07, 0x01, "Game Select") + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Best Play") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Play") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Replay") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void copycat_state::copycat(machine_config &config) +{ + // basic machine hardware + TMS1000(config, m_maincpu, 320000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(copycat_state::read_k)); + m_maincpu->r().set(FUNC(copycat_state::write_r)); + m_maincpu->o().set(FUNC(copycat_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_copycat); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( copycat ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Electronics Copy Cat (model 7-522) + * PCB label WS 8107-1 + * TMS1730 MCU, label MP3005N (die label 1700 MP3005) + * 4 LEDs, 1-bit sound + + This is a simplified rerelease of Copy Cat, 10(!) years later. The gameplay + is identical to Ditto. + + 3 variations exist, each with a different colored case. Let's assume that + they're on the same hardware. + - white case, yellow orange green red buttons and leds (same as model 7-520) + - yellow case, purple orange blue pink buttons, leds are same as older version + - transparent case, transparent purple orange blue red buttons, leds same as before + +***************************************************************************/ + +class copycatm2_state : public hh_tms1k_state +{ +public: + copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void copycatm2(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void copycatm2_state::write_r(u16 data) +{ + // R1-R4: leds + m_display->matrix(1, data >> 1 & 0xf); +} + +void copycatm2_state::write_o(u16 data) +{ + // O0,O6: speaker out + m_speaker->level_w((data & 1) | (data >> 5 & 2)); +} + +// config + +static INPUT_PORTS_START( copycatm2 ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") +INPUT_PORTS_END + +void copycatm2_state::copycatm2(machine_config &config) +{ + // basic machine hardware + TMS1730(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(copycatm2_state::write_r)); + m_maincpu->o().set(FUNC(copycatm2_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_copycatm2); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( copycatm2 ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger Ditto (model 7-530) + * TMS1700 MCU, label MP1801-N2LL (die label 1700 MP1801) + * 4 LEDs, 1-bit sound + + known releases: + - World: Ditto, published by Tiger + - USA: Electronic Pocket Repeat (model 60-2152/60-2468A), published by Tandy + note: 1996 model 60-2482 MCU is a Z8, and is assumed to be a clone of Tiger Copycat Jr. + +***************************************************************************/ + +class ditto_state : public hh_tms1k_state +{ +public: + ditto_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ditto(machine_config &config); + +private: + void write_r(u16 data); + void write_o(u16 data); +}; + +// handlers + +void ditto_state::write_r(u16 data) +{ + // R0-R3: leds + m_display->matrix(1, data & 0xf); +} + +void ditto_state::write_o(u16 data) +{ + // O5,O6: speaker out + m_speaker->level_w(data >> 5 & 3); +} + +// config + +static INPUT_PORTS_START( ditto ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue Button") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Orange Button") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Red Button") +INPUT_PORTS_END + +void ditto_state::ditto(machine_config &config) +{ + // basic machine hardware + TMS1700(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF + m_maincpu->k().set_ioport("IN.0"); + m_maincpu->r().set(FUNC(ditto_state::write_r)); + m_maincpu->o().set(FUNC(ditto_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 4); + config.set_default_layout(layout_ditto); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ditto ) + ROM_REGION( 0x0200, "maincpu", 0 ) + ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) ) +ROM_END + + + + + +/*************************************************************************** + + Tiger 7 in 1 Sports Stadium (model 7-555) + * TMS1400 MP7304 (die label TMS1400 MP7304A) + * 2x2-digit 7seg LED display + 39 other LEDs, 1-bit sound + + This handheld includes 7 games: 1: Basketball, 2: Hockey, 3: Soccer, + 4: Maze, 5: Baseball, 6: Football, 7: Raquetball. + MAME external artwork is needed for the switchable overlays. + + known releases: + - World: 7 in 1 Sports Stadium, published by Tiger + - USA: 7 in 1 Sports, published by Sears + +***************************************************************************/ + +class t7in1ss_state : public hh_tms1k_state +{ +public: + t7in1ss_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void t7in1ss(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void t7in1ss_state::update_display() +{ + m_display->matrix(m_r, m_o); +} + +void t7in1ss_state::write_r(u16 data) +{ + // R9: speaker out + m_speaker->level_w(data >> 9 & 1); + + // R0-R2,R10: input mux + m_inp_mux = (data & 7) | (data >> 7 & 8); + + // R0-R3: digit select + // R4-R8: led select + m_r = data; + update_display(); +} + +void t7in1ss_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 t7in1ss_state::read_k() +{ + // K: multiplexed inputs + return read_inputs(4); +} + +// config + +static INPUT_PORTS_START( t7in1ss ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + + PORT_START("IN.3") // R10 + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +void t7in1ss_state::t7in1ss(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(t7in1ss_state::read_k)); + m_maincpu->r().set(FUNC(t7in1ss_state::write_r)); + m_maincpu->o().set(FUNC(t7in1ss_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(9, 8); + m_display->set_segmask(0xf, 0x7f); + m_display->set_bri_levels(0.004, 0.04); // player led is brighter + config.set_default_layout(layout_t7in1ss); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( t7in1ss ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_t7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronics) Break Up (manufactured in Japan) + * PCB label TOMY B.O. + * TMS1040 MP2726 TOMY WIPE (die label MP2726A) + * TMS1025N2LL I/O expander + * 2-digit 7seg display, 46 other leds, 1-bit sound + + known releases: + - USA: Break Up, published by Tomy + - Japan: Block Attack, published by Tomy + - UK: Break-In, published by Tomy + + led translation table: led zz from game PCB = MAME y.x: + + 00 = - 10 = 5.0 20 = 4.2 + 01 = 7.0 11 = 5.1 21 = 3.3 + 02 = 7.1 12 = 5.2 22 = 2.2 + 03 = 7.2 13 = 5.3 + 04 = 7.3 14 = 4.3 + 05 = 6.0 15 = 3.1 + 06 = 6.1 16 = 3.2 + 07 = 6.2 17 = 3.0 + 08 = 6.3 18 = 4.1 + 09 = 4.0 19 = 2.1 + + the 7seg panel is 0.* and 1.*(aka digit0/1), + and the 8(2*4) * 3 rectangular leds panel, where x=0,1,2,3: + + 9.* 11.* + 8.* 13.* + 10.* 12.* + +***************************************************************************/ + +class tbreakup_state : public hh_tms1k_state +{ +public: + tbreakup_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_expander(*this, "expander") + { } + + void tbreakup(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + virtual void machine_start() override; + +private: + required_device m_expander; + u8 m_exp_port[7] = { }; + void expander_w(offs_t offset, u8 data); + + void set_clock(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void tbreakup_state::machine_start() +{ + hh_tms1k_state::machine_start(); + save_item(NAME(m_exp_port)); +} + +void tbreakup_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + set_clock(); +} + +// handlers + +void tbreakup_state::set_clock() +{ + // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K + m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 500000 : 325000); +} + +void tbreakup_state::update_display() +{ + // 7seg leds from R0,R1 and O0-O6 + m_display->matrix_partial(0, 2, m_r, m_o & 0x7f); + + // 22 round leds from O2-O7 and expander port 7 + m_display->matrix_partial(2, 6, m_o >> 2, m_exp_port[6]); + + // 24 rectangular leds from expander ports 1-6 (not strobed) + for (int y = 0; y < 6; y++) + m_display->write_row(y+8, m_exp_port[y]); +} + +void tbreakup_state::expander_w(offs_t offset, u8 data) +{ + // TMS1025 port 1-7 data + m_exp_port[offset] = data; +} + +void tbreakup_state::write_r(u16 data) +{ + // R6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // R7,R8: input mux + m_inp_mux = data >> 7 & 3; + + // R3-R5: TMS1025 port S + // R2: TMS1025 STD pin + m_expander->write_s(data >> 3 & 7); + m_expander->write_std(data >> 2 & 1); + + // R0,R1: select digit + m_r = ~data; + update_display(); +} + +void tbreakup_state::write_o(u16 data) +{ + // O0-O3: TMS1025 port H + m_expander->write_h(data & 0xf); + + // O0-O7: led state + m_o = data; + update_display(); +} + +u8 tbreakup_state::read_k() +{ + // K4: fixed input + // K8: multiplexed inputs + return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8); +} + +// config + +static INPUT_PORTS_START( tbreakup ) + PORT_START("IN.0") // R7 K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Ball") + + PORT_START("IN.1") // R8 K8 + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") + + PORT_START("IN.2") // K4 + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Lives ) ) + PORT_CONFSETTING( 0x00, "3" ) + PORT_CONFSETTING( 0x04, "5" ) + + PORT_START("IN.3") // fake + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tbreakup_state, skill_switch, 0) + PORT_CONFSETTING( 0x00, "Pro 1" ) + PORT_CONFSETTING( 0x01, "Pro 2" ) +INPUT_PORTS_END + +void tbreakup_state::tbreakup(machine_config &config) +{ + // basic machine hardware + TMS1040(config, m_maincpu, 325000); // see set_clock + m_maincpu->k().set(FUNC(tbreakup_state::read_k)); + m_maincpu->r().set(FUNC(tbreakup_state::write_r)); + m_maincpu->o().set(FUNC(tbreakup_state::write_o)); + + TMS1025(config, m_expander).set_ms(1); // MS tied high + m_expander->write_port1_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port2_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port3_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port4_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port5_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port6_callback().set(FUNC(tbreakup_state::expander_w)); + m_expander->write_port7_callback().set(FUNC(tbreakup_state::expander_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(2+6+6, 8); + m_display->set_segmask(3, 0x7f); + config.set_default_layout(layout_tbreakup); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tbreakup ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Power House Pinball + * PCB label TOMY P-B + * TMS1100 MP1180 TOMY PINB (die label MP1180) + * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound + + known releases: + - USA: Power House Pinball, published by Tomy + - Japan: Pinball, published by Tomy + - Europe: Flipper, published by Tomy + + led translation table: led zz from game PCB = MAME y.x: + + 0 = - 10 = 5.0 20 = 6.4 A = 3.0 + 1 = 3.3 11 = 5.5 21 = 6.5 B = 3.4 + 2 = 3.1 12 = 5.1 22 = 7.0 C = 3.5 + 3 = 3.2 13 = 5.2 23 = 7.1 D = 8.0 + 4 = 4.0 14 = 5.3 24 = 7.2 E = 8.1 + 5 = 4.1 15 = 6.0 25 = 7.3 F = 8.2 + 6 = 4.2 16 = 5.4 26 = 7.4 G = 8.3 + 7 = 4.3 17 = 6.1 + 8 = 4.4 18 = 6.2 + 9 = 4.5 19 = 6.3 + + NOTE!: MAME external artwork is required + +***************************************************************************/ + +class phpball_state : public hh_tms1k_state +{ +public: + phpball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void phpball(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(flipper_button) { update_display(); } + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void phpball_state::update_display() +{ + // rectangular LEDs under LEDs D,F and E,G are directly connected + // to the left and right flipper buttons - output them to 10.a and 9.a + u16 in1 = m_inputs[1]->read() << 7 & 0x600; + m_display->matrix((m_r & 0x1ff) | in1, m_o); +} + +void phpball_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R9: input mux + m_inp_mux = data >> 9 & 1; + + // R0-R2: digit select + // R0-R8: led select + m_r = data; + update_display(); +} + +void phpball_state::write_o(u16 data) +{ + // O0-O6: digit segment/led data + // O7: N/C + m_o = data & 0x7f; + update_display(); +} + +u8 phpball_state::read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[1]->read() | read_inputs(1); +} + +// config + +static INPUT_PORTS_START( phpball ) + PORT_START("IN.0") // R9 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Plunger") + PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // Vss! + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) +INPUT_PORTS_END + +void phpball_state::phpball(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(phpball_state::read_k)); + m_maincpu->r().set(FUNC(phpball_state::write_r)); + m_maincpu->o().set(FUNC(phpball_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(11, 7); + m_display->set_segmask(7, 0x7f); + config.set_default_layout(layout_phpball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( phpball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) ) +ROM_END + + + + + +/*************************************************************************** + + U.S. Games Super Sports-4 + * TMS1100 MP1219 (no decap) + * 4 7seg LEDs, 49 other LEDs, 1-bit sound + + The game is very similar to t3in1sa, even parts of the ROM match. But by + the time that one was released (in 1983 or 1984), U.S. Games did not exist + anymore. I suspect t3in1sa was programmed by the same (Hong Kong) company. + + This handheld includes 4 games: Basketball, Football, Soccer, Hockey. + MAME external artwork is needed for the switchable overlays. + +***************************************************************************/ + +class ssports4_state : public hh_tms1k_state +{ +public: + ssports4_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void ssports4(machine_config &config); + +private: + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +// handlers + +void ssports4_state::update_display() +{ + // note: R2 is an extra column + m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); +} + +void ssports4_state::write_r(u16 data) +{ + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: led select/data + // R0,R1 and R8,R9 are 7segs + m_r = data; + update_display(); +} + +void ssports4_state::write_o(u16 data) +{ + // O0-O7: led data + m_o = data; + update_display(); +} + +u8 ssports4_state::read_k() +{ + // input mux is from R0,1,5,8,9 and O7 + m_inp_mux = (m_r & 3) | (m_r >> 3 & 4) | (m_r >> 5 & 0x18) | (m_o >> 2 & 0x20); + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ssports4 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY + + PORT_START("IN.2") // R5 + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x04, "2" ) + PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x08, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + + PORT_START("IN.3") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_16WAY PORT_NAME("P1 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_16WAY PORT_NAME("P1 Up-Right / Info") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_16WAY PORT_NAME("P1 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_16WAY PORT_NAME("P1 O.P.") // offensive player (modifier button) + + PORT_START("IN.4") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Left / Kick") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Right / Info") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Pass") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 O.P.") + + PORT_START("IN.5") // O7 + PORT_CONFNAME( 0x03, 0x00, "Game Select" ) + PORT_CONFSETTING( 0x02, "Basketball" ) + PORT_CONFSETTING( 0x00, "Football" ) + PORT_CONFSETTING( 0x01, "Soccer" ) + PORT_CONFSETTING( 0x03, "Hockey" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ssports4_state::ssports4(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF + m_maincpu->k().set(FUNC(ssports4_state::read_k)); + m_maincpu->r().set(FUNC(ssports4_state::write_r)); + m_maincpu->o().set(FUNC(ssports4_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 9); + m_display->set_segmask(0x303, 0x7f); + m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter + config.set_default_layout(layout_ssports4); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssports4 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified + ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) + ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP ) + + ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump + ROM_LOAD16_BYTE( "tms1100_ssports4_output.bin", 0, 0x20, CRC(cd6f162f) SHA1(3348edb697e996b5ab82be54076b9cd444e0f2b1) ) +ROM_END + + + + + +/*************************************************************************** + + Vulcan XL 25 + * TMS1000SLC MP4486A (die label 1000C/, MP4486A) + * 28 LEDs, 1-bit sound + + This game is the same logic puzzle as Tiger's Lights Out, except that + all 25 lights need to be turned on instead of off. + +***************************************************************************/ + +class xl25_state : public hh_tms1k_state +{ +public: + xl25_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag) + { } + + void xl25(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(k4_button) { update_halt(); } + +protected: + virtual void machine_reset() override; + +private: + void update_halt(); + void update_display(); + void write_r(u16 data); + void write_o(u16 data); + u8 read_k(); +}; + +void xl25_state::machine_reset() +{ + hh_tms1k_state::machine_reset(); + update_halt(); +} + +// handlers + +void xl25_state::update_halt() +{ + // O5+K4 go to HALT pin (used when pressing store/recall button) + bool halt = !((m_o & 0x20) || (read_k() & 4)); + m_maincpu->set_input_line(INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE); +} + +void xl25_state::update_display() +{ + m_display->matrix(m_r, m_o >> 1); +} + +void xl25_state::write_r(u16 data) +{ + // R0-R9: input mux, led select + m_inp_mux = data; + m_r = data; + update_display(); +} + +void xl25_state::write_o(u16 data) +{ + // O1-O3: led data + m_o = data; + update_display(); + + // O6: speaker out + m_speaker->level_w(data >> 6 & 1); + + // O5(+K4): MCU halt + update_halt(); +} + +u8 xl25_state::read_k() +{ + // K: multiplexed inputs + // K4 also goes to MCU halt + return read_inputs(10); +} + +// config + +static INPUT_PORTS_START( xl25 ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Store / Recall") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Cross / Knight / Score") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Clear") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Random") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.9") // R9 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Sound") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void xl25_state::xl25(machine_config &config) +{ + // basic machine hardware + TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=5.6K, C=47pF + m_maincpu->k().set(FUNC(xl25_state::read_k)); + m_maincpu->r().set(FUNC(xl25_state::write_r)); + m_maincpu->o().set(FUNC(xl25_state::write_o)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 3); + config.set_default_layout(layout_xl25); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( xl25 ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "mp4486a", 0x0000, 0x0400, CRC(bd84b515) SHA1(377fcc68a517260acd51eb9746cd62914a75d739) ) + + ROM_REGION( 922, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1000c_xl25_micro.pla", 0, 922, CRC(8823e7f2) SHA1(676b0eace9d8730f2caa9087e8c51e540c7fabf8) ) + ROM_REGION( 558, "maincpu:opla", 0 ) + ROM_LOAD( "tms1000c_xl25_output.pla", 0, 558, CRC(06ecc6e0) SHA1(e0fa1b9388948197b4de2edd3cd02fbde1dbabbb) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE ) + +COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // *** +CONS( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE ) + +COMP( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8 (Multi 8)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** +COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // *** +CONS( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ebball2, 0, 0, ebball2, ebball2, ebball2_state, empty_init, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ebball3, 0, 0, ebball3, ebball3, ebball3_state, empty_init, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, esbattle, 0, 0, esbattle, esbattle, esbattle_state, empty_init, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, blastit, 0, 0, blastit, blastit, blastit_state, empty_init, "Entex", "Blast It", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, einvader, 0, 0, einvader, einvader, einvader_state, empty_init, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, empty_init, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE ) +COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE ) + +COMP( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, elecbowl_state, empty_init, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // *** + +COMP( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +CONS( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons - Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** + +CONS( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) +CONS( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // *** +CONS( 1977, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** +CONS( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** +CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** +CONS( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // *** + +CONS( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // *** +CONS( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, merlina, merlin, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** +CONS( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +CONS( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** +CONS( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot - Electronic Pool", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure - The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie - The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // *** + +CONS( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, tandy12, 0, 0, tandy12, tandy12, tandy12_state, empty_init, "Tandy Corporation", "Tandy-12: Computerized Arcade", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** +CONS( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1976, speechp, 0, 0, speechp, speechp, speechp_state, empty_init, "Telesensory Systems, Inc.", "Speech+", MACHINE_SUPPORTS_SAVE ) + +COMP( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1975 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti125076, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, wizatron, 0, 0, wizatron, wizatron, wizatron_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1976, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1978, lilprof78, lilprof, 0, lilprof78, lilprof78, lilprof78_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, timaze, 0, 0, timaze, timaze, timaze_state, empty_init, "Texas Instruments", "unknown electronic maze game (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state, empty_init, "Texas Instruments", "Electronic Digital Thermostat", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) + +CONS( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +CONS( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1989, copycatm2, copycat, 0, copycatm2, copycatm2, copycatm2_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) + +CONS( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "Vulcan Electronics", "XL 25", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/hh_tms1k.h b/src/mame/handheld/hh_tms1k.h new file mode 100644 index 00000000000..7d9904e4377 --- /dev/null +++ b/src/mame/handheld/hh_tms1k.h @@ -0,0 +1,73 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/* + + TMS1000 MCU series tabletops/handhelds or other simple devices. + +*/ + +#ifndef MAME_INCLUDES_HH_TMS1K_H +#define MAME_INCLUDES_HH_TMS1K_H + +#pragma once + +#include "cpu/tms1000/tms1000.h" +#include "cpu/tms1000/tms1000c.h" +#include "cpu/tms1000/tms1100.h" +#include "cpu/tms1000/tms1400.h" +#include "cpu/tms1000/tms0970.h" +#include "cpu/tms1000/tms0980.h" +#include "cpu/tms1000/tms0270.h" +#include "cpu/tms1000/tp0320.h" +#include "video/pwm.h" +#include "sound/spkrdev.h" + + +class hh_tms1k_state : public driver_device +{ +public: + hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0), + m_out_power(*this, "power") + { } + + virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); + virtual DECLARE_INPUT_CHANGED_MEMBER(power_button); + + template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } + template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<18> m_inputs; // max 18 + output_finder<> m_out_power; // power state, eg. led + + // misc common + u16 m_r = 0U; // MCU R-pins data + u16 m_o = 0U; // MCU O-pins data + u32 m_inp_mux = 0U; // multiplexed inputs mask + bool m_power_on = false; + + u32 m_grid = 0U; // VFD/LED current row data + u32 m_plate = 0U; // VFD/LED current column data + + u8 read_inputs(int columns); + u8 read_rotated_inputs(int columns, u8 rowmask = 0xf); + virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off); + virtual void power_off(); + void set_power(bool state); + void switch_change(int sel, u32 mask, bool next); +}; + + +#endif // MAME_INCLUDES_HH_TMS1K_H diff --git a/src/mame/handheld/hh_ucom4.cpp b/src/mame/handheld/hh_ucom4.cpp new file mode 100644 index 00000000000..d270d5ce7c2 --- /dev/null +++ b/src/mame/handheld/hh_ucom4.cpp @@ -0,0 +1,3060 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton, Sean Riddle +/*************************************************************************** + +NEC uCOM4 MCU tabletops/handhelds or other simple devices, +most of them (emulated ones) are VFD electronic games/toys. + +known chips: + + serial device etc. +---------------------------------------------------------------- + 055 uPD546C 1978, Fidelity Checker Challenger (CR) -> fidel_checkc2.cpp + + @017 uPD552C 1979, Bambino UFO Master-Blaster Station (ET-02) + @042 uPD552C 1980, Tomy Cosmic Combat (TN-??) + @043 uPD552C 1979, Bambino Kick The Goal Soccer (ET-10) + *044 uPD552C 1979, Bambino Lucky Puck Ice Hockey (ET-08) + @048 uPD552C 1980, Tomy Tennis (TN-04) + @049 uPD552C 1981, Bambino Safari (ET-11) + @054 uPD552C 1980, Epoch Invader From Space + + @031 uPD553C 1979, Bambino Superstar Football (ET-03) + @049 uPD553C 1979, Mego Mini-Vid: Break Free + @055 uPD553C 1980, Bambino Space Laser Fight (ET-12) + *073 uPD553C 1980, Sony ST-J75 FM Stereo Tuner + @080 uPD553C 1980, Epoch Electronic Football + *102 uPD553C 1981, Bandai Block Out + @153 uPD553C 1981, Epoch Galaxy II + @160 uPD553C 1982, Tomy Pac Man (TN-08) + *167 uPD553C 1982, Sony SL models (betamax) (have dump) + @170 uPD553C 1982, Bandai Crazy Climber + @192 uPD553C 1982, Tomy Scramble (TN-10) + @202 uPD553C 1982, Epoch Astro Command + @206 uPD553C 1982, Epoch Dracula + *207 uPD553C 1982, Sony SL-J30 (tape/cd deck) + @209 uPD553C 1982, Tomy Caveman (TN-12) + @258 uPD553C 1984, Tomy Alien Chase (TN-16) + *296 uPD553C 1984, Epoch Computer Beam Gun Professional + + @511 uPD557LC 1980, Takatoku Toys Game Robot 9/Mego Fabulous Fred + @512 uPD557LC 1980, Castle Toy Tactix + @513 uPD557LC 1980, Castle Toy Name That Tune + + @060 uPD650C 1979, Mattel Computer Gin + 085 uPD650C 1980, Roland TR-808 -> roland_tr808.cpp + *127 uPD650C 198?, Sony OA-S1100 Typecorder (subcpu, have dump) + 128 uPD650C 1981, Roland TR-606 -> roland_tr606.cpp + 133 uPD650C 1982, Roland TB-303 -> roland_tb303.cpp + + (* means undumped unless noted, @ denotes it's in this driver) + + +Commonly used VFD(vacuum fluorescent display) are by NEC or Futaba. + +NEC FIP9AM20T (example, Epoch Astro Command) + grcss + +FIP = fluorescent indicator panel +g = number of grids +r = revision of the VFD +c = custom display +s = unique display part number + +============================================================================ + +ROM source notes when dumped from another publisher, but confident it's the same: +- astrocmd: Tandy Astro Command +- caveman: Tandy Caveman +- grobot9: Mego Fabulous Fred + +TODO: +- get rid of hardcoded color overlay from SVGs, use MAME internal artwork + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/ucom4/ucom4.h" +#include "video/pwm.h" +#include "video/hlcd0515.h" +#include "sound/spkrdev.h" + +#include "screen.h" +#include "speaker.h" + +// internal artwork (complete) +#include "ctntune.lh" // clickable +#include "efball.lh" +#include "grobot9.lh" // clickable +#include "mcompgin.lh" +#include "mvbfree.lh" +#include "tactix.lh" // clickable + +// internal artwork (bezel overlay) +#include "tmtennis.lh" + +//#include "hh_ucom4_test.lh" // common test-layout - no svg artwork(yet), use external artwork + + +class hh_ucom4_state : public driver_device +{ +public: + hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + // devices + required_device m_maincpu; + optional_device m_display; + optional_device m_speaker; + optional_ioport_array<6> m_inputs; // max 6 + + // misc common + u8 m_port[9] = { }; // MCU port A-I write data (optional) + u8 m_int = 0; // MCU INT pin state + u16 m_inp_mux = 0; // multiplexed inputs mask + + u32 m_grid = 0; // VFD current row data + u32 m_plate = 0; // VFD current column data + + u8 read_inputs(int columns); + void refresh_interrupts(void); + void set_interrupt(int state); + + enum + { + PORTA = 0, + PORTB, + PORTC, + PORTD, + PORTE, + PORTF, + PORTG, + PORTH, + PORTI + }; +}; + + +// machine start/reset + +void hh_ucom4_state::machine_start() +{ + // register for savestates + save_item(NAME(m_port)); + save_item(NAME(m_int)); + save_item(NAME(m_inp_mux)); + save_item(NAME(m_grid)); + save_item(NAME(m_plate)); +} + +void hh_ucom4_state::machine_reset() +{ + refresh_interrupts(); +} + + + +/*************************************************************************** + + Helper Functions + +***************************************************************************/ + +// generic input handlers + +u8 hh_ucom4_state::read_inputs(int columns) +{ + u8 ret = 0; + + // read selected input rows + for (int i = 0; i < columns; i++) + if (m_inp_mux >> i & 1) + ret |= m_inputs[i]->read(); + + return ret; +} + + +// interrupt handling + +void hh_ucom4_state::refresh_interrupts() +{ + m_maincpu->set_input_line(0, m_int ? ASSERT_LINE : CLEAR_LINE); +} + +void hh_ucom4_state::set_interrupt(int state) +{ + state = state ? 1 : 0; + + if (state != m_int) + { + if (machine().phase() >= machine_phase::RESET) + m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); + m_int = state; + } +} + +INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line) +{ + set_interrupt(newval); +} + + + +/*************************************************************************** + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +***************************************************************************/ + +namespace { + +/*************************************************************************** + + Bambino UFO Master-Blaster Station (manufactured in Japan) + * PCB label Emix Corp. ET-02 + * NEC uCOM-44 MCU, label EMIX D552C 017 + * cyan VFD display Emix-101, with blue color overlay + + This is Bambino's first game, it is not known if ET-01 exists. Emix Corp. + wasn't initially a toy company, the first release was through Tomy. Emix + created the Bambino brand afterwards. It is claimed to be the first + computerized VFD game (true, unless TI Speak & Spell or M.E.M. Memoquiz + from 1978 are considered VFD games) + + known releases: + - Japan: "Missile Guerilla Warfare Maneuvers", published by Tomy + - World: UFO Master-Blaster Station, published by Bambino + +***************************************************************************/ + +class ufombs_state : public hh_ucom4_state +{ +public: + ufombs_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ufombs(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void ufombs_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3); + m_display->matrix(grid, plate); +} + +void ufombs_state::grid_w(offs_t offset, u8 data) +{ + // F,G,H0: vfd grid + int shift = (offset - PORTF) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ufombs_state::plate_w(offs_t offset, u8 data) +{ + // C,D012,I: vfd plate + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ufombs_state::speaker_w(u8 data) +{ + // E01: speaker out + m_speaker->level_w(data & 3); +} + +// config + +static INPUT_PORTS_START( ufombs ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("IN.0", 0x0a, EQUALS, 0x00) // pad in the middle, pressed when joystick is centered + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + + PORT_START("IN.1") // port B + PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x04, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ufombs_state::ufombs(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(ufombs_state::plate_w)); + m_maincpu->write_d().set(FUNC(ufombs_state::plate_w)); + m_maincpu->write_e().set(FUNC(ufombs_state::speaker_w)); + m_maincpu->write_f().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_g().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_h().set(FUNC(ufombs_state::grid_w)); + m_maincpu->write_i().set(FUNC(ufombs_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(243, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 10); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ufombs ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) ) + + ROM_REGION( 222395, "screen", 0) + ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Superstar Football (manufactured in Japan) + * PCB label Emix Corp. ET-03 + * NEC uCOM-43 MCU, label D553C 031 + * cyan VFD display Emix-102, with bezel + + The game was rereleased in 1982 as Classic Football (ET-0351), with an + improved cyan/green/red VFD. + + Press the Kick button to start the game, an automatic sequence follows. + Then choose a formation(A,B,C) and either pass the ball, and/or start + running. For more information, refer to the official manual. + +***************************************************************************/ + +class ssfball_state : public hh_ucom4_state +{ +public: + ssfball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ssfball(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_b_r(); +}; + +// handlers + +void ssfball_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); + m_display->matrix(m_grid, plate); +} + +void ssfball_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid 0-7(,8) + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void ssfball_state::plate_w(offs_t offset, u8 data) +{ + m_port[offset] = data; + + // E,F,G,H,I(not all!): vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // F3,G3: input mux + speaker + m_inp_mux = (m_port[PORTF] >> 3 & 1) | (m_port[PORTG] >> 2 & 2); + m_speaker->level_w(m_inp_mux); + + // E3: vfd grid 8 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +u8 ssfball_state::input_b_r() +{ + // B: input port 2, where B3 is multiplexed + return m_inputs[2]->read() | read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + [A] [B] [C] [PASS] [KICK/ + ^FORMATION^ DISPLAY] + + [^] + [<>] + (game lvl sw) [v] + 1<---OFF--->2 +*/ + +static INPUT_PORTS_START( ssfball ) + PORT_START("IN.0") // F3 port B3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Formation A") + + PORT_START("IN.1") // G3 port B3 + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_CONFNAME( 0x08, 0x00, "Game Level" ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x08, "2" ) + + PORT_START("IN.2") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Kick/Display") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Formation C") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Formation B") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed, handled in input_b_r + + PORT_START("IN.3") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pass") +INPUT_PORTS_END + +void ssfball_state::ssfball(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.3"); + m_maincpu->read_b().set(FUNC(ssfball_state::input_b_r)); + m_maincpu->write_c().set(FUNC(ssfball_state::grid_w)); + m_maincpu->write_d().set(FUNC(ssfball_state::grid_w)); + m_maincpu->write_e().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_f().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_g().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_h().set(FUNC(ssfball_state::plate_w)); + m_maincpu->write_i().set(FUNC(ssfball_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 482); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ssfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) + + ROM_REGION( 331352, "screen", 0) + ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) ) +ROM_END + +ROM_START( bmcfball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) + + ROM_REGION( 331352, "screen", 0) + ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Kick The Goal Soccer + * PCB label Emix Corp. ET-10/08 (PCB is for 2 possible games) + * NEC uCOM-44 MCU, label D552C 043 + * cyan VFD display Emix-105, with bezel overlay + + Press the Display button twice to start the game. Action won't start until + player 1 presses one of the directional keys. In 2-player mode, player 2 + controls the goalkeeper, defensive players are still controlled by the CPU. + +***************************************************************************/ + +class bmsoccer_state : public hh_ucom4_state +{ +public: + bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bmsoccer(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_a_r(); +}; + +// handlers + +void bmsoccer_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2); + m_display->matrix(m_grid, plate); +} + +void bmsoccer_state::grid_w(offs_t offset, u8 data) +{ + // C01: input mux + if (offset == PORTC) + m_inp_mux = data & 3; + + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmsoccer_state::plate_w(offs_t offset, u8 data) +{ + // G3: speaker out + if (offset == PORTG) + m_speaker->level_w(data >> 3 & 1); + + // E012,F012,G012,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // E3: grid 8 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +u8 bmsoccer_state::input_a_r() +{ + // port A: multiplexed inputs + return read_inputs(2); +} + +// config + +static INPUT_PORTS_START( bmsoccer ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Ball-carrier Right") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("Ball-carrier Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Ball-carrier Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Ball-carrier Up") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Left") // note: swap buttons if viewed from the same angle as player 1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Right") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // port B + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Display/Banana Shoot") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") +INPUT_PORTS_END + +void bmsoccer_state::bmsoccer(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set(FUNC(bmsoccer_state::input_a_r)); + m_maincpu->read_b().set_ioport("IN.2"); + m_maincpu->write_c().set(FUNC(bmsoccer_state::grid_w)); + m_maincpu->write_d().set(FUNC(bmsoccer_state::grid_w)); + m_maincpu->write_e().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_f().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_g().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_h().set(FUNC(bmsoccer_state::plate_w)); + m_maincpu->write_i().set(FUNC(bmsoccer_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(271, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmsoccer ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) ) + + ROM_REGION( 273796, "screen", 0) + ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Safari (manufactured in Japan) + * PCB label Emix Corp. ET-11 + * NEC uCOM-44 MCU, label EMIX D552C 049 + * cyan VFD display Emix-108 + +***************************************************************************/ + +class bmsafari_state : public hh_ucom4_state +{ +public: + bmsafari_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bmsafari(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void bmsafari_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3); + m_display->matrix(grid, plate); +} + +void bmsafari_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bmsafari_state::plate_w(offs_t offset, u8 data) +{ + // E012,H,I: vfd plate + int shift = (offset == PORTE) ? 8 : (offset - PORTH) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + // E3: grid 0 + if (offset == PORTE) + grid_w(offset, data >> 3 & 1); + else + update_display(); +} + +void bmsafari_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +// config + +static INPUT_PORTS_START( bmsafari ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_CONFSETTING( 0x01, "3" ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY +INPUT_PORTS_END + +void bmsafari_state::bmsafari(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(bmsafari_state::grid_w)); + m_maincpu->write_d().set(FUNC(bmsafari_state::grid_w)); + m_maincpu->write_e().set(FUNC(bmsafari_state::plate_w)); + m_maincpu->write_g().set(FUNC(bmsafari_state::speaker_w)); + m_maincpu->write_h().set(FUNC(bmsafari_state::plate_w)); + m_maincpu->write_i().set(FUNC(bmsafari_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(248, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 10); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bmsafari ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) ) + + ROM_REGION( 275386, "screen", 0) + ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) ) +ROM_END + + + + + +/*************************************************************************** + + Bambino Space Laser Fight (manufactured in Japan) + * PCB label Emix Corp. ET-12 + * NEC uCOM-43 MCU, label D553C 055 + * cyan VFD display Emix-104, with blue or green color overlay + + This is basically a revamp of their earlier Boxing game (ET-06), case and + buttons are exactly the same. + +***************************************************************************/ + +class splasfgt_state : public hh_ucom4_state +{ +public: + splasfgt_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void splasfgt(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + u8 input_b_r(); +}; + +// handlers + +void splasfgt_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); + m_display->matrix(m_grid, plate); +} + +void splasfgt_state::grid_w(offs_t offset, u8 data) +{ + // G,H,I0: vfd grid + int shift = (offset - PORTG) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // G(grid 0-3): input mux + m_inp_mux = m_grid & 0xf; + + // I2: vfd plate 6 + if (offset == PORTI) + plate_w(4 + PORTC, data >> 2 & 1); + else + update_display(); +} + +void splasfgt_state::plate_w(offs_t offset, u8 data) +{ + // F01: speaker out + if (offset == PORTF) + m_speaker->level_w(data & 3); + + // C,D,E,F23(,I2): vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +u8 splasfgt_state::input_b_r() +{ + // B: multiplexed buttons + return read_inputs(4); +} + +// config + +/* physical button layout and labels are like this: + + * left = P1 side * * right = P2 side * (note: in 1P mode, switch sides between turns) + + [ JUMP ] [ HIGH ] (players sw) [ HIGH ] [ JUMP ] + 1<--->2 [START/ + [STRAIGHT] [MEDIUM] RESET] [MEDIUM] [STRAIGHT] + 1<---OFF--->2 + [ STOOP ] [ LOW ] (skill lvl sw) [ LOW ] [ STOOP ] +*/ + +static INPUT_PORTS_START( splasfgt ) + PORT_START("IN.0") // G0 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Position Straight") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Position Jump") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Position Stoop") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // G1 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Beam High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Beam Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Beam Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // G2 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Position Straight") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Position Jump") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Position Stoop") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // G3 port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Beam High") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Beam Medium") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Beam Low") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x01, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void splasfgt_state::splasfgt(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.4"); + m_maincpu->read_b().set(FUNC(splasfgt_state::input_b_r)); + m_maincpu->write_c().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_d().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_e().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_f().set(FUNC(splasfgt_state::plate_w)); + m_maincpu->write_g().set(FUNC(splasfgt_state::grid_w)); + m_maincpu->write_h().set(FUNC(splasfgt_state::grid_w)); + m_maincpu->write_i().set(FUNC(splasfgt_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 476); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 16); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( splasfgt ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) ) + + ROM_REGION( 246609, "screen", 0) + ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) ) +ROM_END + + + + + +/*************************************************************************** + + Bandai Crazy Climber (manufactured in Japan) + * PCB labels SM-020/SM-021 + * NEC uCOM-43 MCU, label D553C 170 + * cyan/red/green VFD display NEC FIP6AM2-T no. 1-8 2, with partial color overlay and bezel + + known releases: + - Japan: FL Crazy Climbing, published by Bandai + - USA: Crazy Climber, published by Bandai + +***************************************************************************/ + +class bcclimbr_state : public hh_ucom4_state +{ +public: + bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void bcclimbr(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void bcclimbr_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); + u32 plate = bitswap<24>(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); + m_display->matrix(grid, plate); +} + +void bcclimbr_state::grid_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // H,I01: vfd grid + int shift = (offset - PORTH) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void bcclimbr_state::plate_w(offs_t offset, u8 data) +{ + // C,D,E,F: vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( bcclimbr ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) +INPUT_PORTS_END + +void bcclimbr_state::bcclimbr(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_d().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_e().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_f().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_g().set(FUNC(bcclimbr_state::plate_w)); + m_maincpu->write_h().set(FUNC(bcclimbr_state::grid_w)); + m_maincpu->write_i().set(FUNC(bcclimbr_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(310, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(6, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( bcclimbr ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) ) + + ROM_REGION( 219971, "screen", 0) + ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) ) +ROM_END + + + + + +/*************************************************************************** + + Castle Toy Tactix + * NEC uCOM-43 MCU, label D557LC 512 + * 16 LEDs behind buttons + + Tactix is similar to Merlin, for 1 or 2 players. In 2-player mode, simply + don't press the Comp Turn button. The four included minigames are: + 1: Capture (reversi) + 2: Jump-Off (peg solitaire) + 3: Triple Play (3 in a row) + 4: Concentration (memory) + +***************************************************************************/ + +class tactix_state : public hh_ucom4_state +{ +public: + tactix_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tactix(machine_config &config); + +private: + void leds_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void tactix_state::leds_w(offs_t offset, u8 data) +{ + // D,F: 4*4 led matrix + m_port[offset] = data; + m_display->matrix(m_port[PORTF], m_port[PORTD]); +} + +void tactix_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +void tactix_state::input_w(offs_t offset, u8 data) +{ + // C,E0: input mux + m_port[offset] = data; + m_inp_mux = (m_port[PORTE] << 4 & 0x10) | m_port[PORTC]; +} + +u8 tactix_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( tactix ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 9") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 13") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 10") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 14") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button 11") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 15") + + PORT_START("IN.3") // C3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 12") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 16") + + PORT_START("IN.4") // E0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("New Game") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Comp Turn") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tactix_state::tactix(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 200000); // approximation + m_maincpu->read_a().set(FUNC(tactix_state::input_r)); + m_maincpu->write_c().set(FUNC(tactix_state::input_w)); + m_maincpu->write_d().set(FUNC(tactix_state::leds_w)); + m_maincpu->write_e().set(FUNC(tactix_state::input_w)); + m_maincpu->write_f().set(FUNC(tactix_state::leds_w)); + m_maincpu->write_g().set(FUNC(tactix_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(4, 4); + config.set_default_layout(layout_tactix); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tactix ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) ) +ROM_END + + + + + +/*************************************************************************** + + Castle Toy Name That Tune + * NEC uCOM-43 MCU, label D557LC 513 + * 2 lamps, 1 7seg(+2 fake 7segs above a power-on lamp, showing "0") + + This is a tabletop multiplayer game. Players are meant to place a bid, + and guess the song (by announcing it to everyone). + +***************************************************************************/ + +class ctntune_state : public hh_ucom4_state +{ +public: + ctntune_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void ctntune(machine_config &config); + + // start button powers unit back on + DECLARE_INPUT_CHANGED_MEMBER(start_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } + +private: + void update_display(); + void _7seg_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void ctntune_state::update_display() +{ + u8 sel = m_port[PORTD] >> 3 & 1; // turn off display when power is off + u8 lamps = m_port[PORTD] & 3; + u8 digit = (m_port[PORTF] << 4 | m_port[PORTE]) & 0x7f; + + m_display->matrix(sel, lamps << 7 | digit); +} + +void ctntune_state::_7seg_w(offs_t offset, u8 data) +{ + // E,F012: 7seg data, F3: N/C + m_port[offset] = data; + update_display(); +} + +void ctntune_state::speaker_w(u8 data) +{ + // G0: speaker out + m_speaker->level_w(data & 1); +} + +void ctntune_state::input_w(offs_t offset, u8 data) +{ + // D3: trigger power-off on falling edge + if (offset == PORTD && ~data & m_port[PORTD] & 8) + m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + + // C,D23: input mux + // D0,D1: yellow, red lamp + m_port[offset] = data; + m_inp_mux = (m_port[PORTD] << 2 & 0x30) | m_port[PORTC]; + update_display(); +} + +u8 ctntune_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(6); +} + +// config + +static INPUT_PORTS_START( ctntune ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Button 1") // defaults to keyboard Z row + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Button 5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Button 9") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Button 6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("Button 10") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Button 3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") + + PORT_START("IN.3") // C3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Button 4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Button 8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") + + PORT_START("IN.4") // D2 port A + PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Play Button") + + PORT_START("IN.5") // D3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, ctntune_state, start_button, 0) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void ctntune_state::ctntune(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 200000); // approximation + m_maincpu->read_a().set(FUNC(ctntune_state::input_r)); + m_maincpu->write_c().set(FUNC(ctntune_state::input_w)); + m_maincpu->write_d().set(FUNC(ctntune_state::input_w)); + m_maincpu->write_e().set(FUNC(ctntune_state::_7seg_w)); + m_maincpu->write_f().set(FUNC(ctntune_state::_7seg_w)); + m_maincpu->write_g().set(FUNC(ctntune_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 7+2); + m_display->set_segmask(1, 0x7f); + config.set_default_layout(layout_ctntune); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( ctntune ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d557lc-513", 0x0000, 0x0800, CRC(cd85ee23) SHA1(32b8fc8cb92fc1fd27da9148788a09d3bcd46a92) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Invader From Space (manufactured in Japan) + * PCB labels 36010(A/B) + * NEC uCOM-44 MCU, label D552C 054 + * cyan VFD display NEC FIP9AM18T tube no. 0D, with color overlay + + known releases: + - USA: Invader From Space, published by Epoch + - UK: Invader From Space, published by Grandstand + +***************************************************************************/ + +class invspace_state : public hh_ucom4_state +{ +public: + invspace_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void invspace(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void invspace_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8); + m_display->matrix(grid, plate); +} + +void invspace_state::grid_w(offs_t offset, u8 data) +{ + // I0: speaker out + if (offset == PORTI) + m_speaker->level_w(data & 1); + + // C,D,I1: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void invspace_state::plate_w(offs_t offset, u8 data) +{ + // E,F,G,H123: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( invspace ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void invspace_state::invspace(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(invspace_state::grid_w)); + m_maincpu->write_d().set(FUNC(invspace_state::grid_w)); + m_maincpu->write_e().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_f().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_g().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_h().set(FUNC(invspace_state::plate_w)); + m_maincpu->write_i().set(FUNC(invspace_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(289, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( invspace ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) ) + + ROM_REGION( 110899, "screen", 0) + ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Electronic Football (manufactured in Japan) + * PCB labels 36020(A/B/C) + * NEC uCOM-43 MCU, label D553C 080 + * cyan VFD display NEC FIP10AM15T tube no. 0F, with bezel overlay + + known releases: + - USA: Electronic Football (aka Pro-Bowl Football), published by Epoch + - Japan: American Football, published by Epoch + +***************************************************************************/ + +class efball_state : public hh_ucom4_state +{ +public: + efball_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void efball(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void efball_state::update_display() +{ + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7); + m_display->matrix(m_grid, plate); +} + +void efball_state::grid_w(offs_t offset, u8 data) +{ + // H2: speaker out + if (offset == PORTH) + m_speaker->level_w(data >> 2 & 1); + + // F,G,H01: vfd grid + int shift = (offset - PORTF) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void efball_state::plate_w(offs_t offset, u8 data) +{ + // D,E,I: vfd plate + int shift = (offset == PORTI) ? 8 : (offset - PORTD) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( efball ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Down-Field") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P1 Score-Time") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") + + PORT_START("IN.2") // port C + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Kick Return") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") +INPUT_PORTS_END + +void efball_state::efball(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->read_c().set_ioport("IN.2"); + m_maincpu->write_d().set(FUNC(efball_state::plate_w)); + m_maincpu->write_e().set(FUNC(efball_state::plate_w)); + m_maincpu->write_f().set(FUNC(efball_state::grid_w)); + m_maincpu->write_g().set(FUNC(efball_state::grid_w)); + m_maincpu->write_h().set(FUNC(efball_state::grid_w)); + m_maincpu->write_i().set(FUNC(efball_state::plate_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(10, 11); + config.set_default_layout(layout_efball); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( efball ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Galaxy II (manufactured in Japan) + * PCB labels 19096/96062 + * NEC uCOM-43 MCU, label D553C 153 + * cyan/red VFD display NEC FIP10xM20T, with color overlay. x = multiple VFD + revisions exist, with different graphics: rev B no. 1-8, rev. D no. 2-21. + + known releases: + - USA: Galaxy II, published by Epoch + - Japan: Astro Wars, published by Epoch + - UK: Astro Wars, published by Grandstand + +***************************************************************************/ + +class galaxy2_state : public hh_ucom4_state +{ +public: + galaxy2_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void galaxy2b(machine_config &config); + void galaxy2(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void galaxy2_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + u16 plate = bitswap<16>(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9); + m_display->matrix(grid, plate); +} + +void galaxy2_state::grid_w(offs_t offset, u8 data) +{ + // E3: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 3 & 1); + + // C,D,E01: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void galaxy2_state::plate_w(offs_t offset, u8 data) +{ + // F,G,H,I: vfd plate + int shift = (offset - PORTF) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( galaxy2 ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void galaxy2_state::galaxy2(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_d().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_e().set(FUNC(galaxy2_state::grid_w)); + m_maincpu->write_f().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_g().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_h().set(FUNC(galaxy2_state::plate_w)); + m_maincpu->write_i().set(FUNC(galaxy2_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(304, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 15); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void galaxy2_state::galaxy2b(machine_config &config) +{ + galaxy2(config); + + // video hardware + screen_device *screen = subdevice("screen"); + screen->set_size(306, 1080); + screen->set_visarea_full(); +} + +// roms + +ROM_START( galaxy2 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) + + ROM_REGION( 325057, "screen", 0) + ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) ) +ROM_END + +ROM_START( galaxy2b ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) + + ROM_REGION( 266377, "screen", 0) + ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Astro Command (manufactured in Japan) + * PCB labels 96111/96112 + * NEC uCOM-43 MCU, label D553C 202 + * cyan/red VFD display NEC FIP9AM20T no. 42-42, with color overlay + bezel + + known releases: + - Japan: Astro Command, published by Epoch + - USA: Astro Command, published by Tandy + - UK: Scramble, published by Grandstand + +***************************************************************************/ + +class astrocmd_state : public hh_ucom4_state +{ +public: + astrocmd_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void astrocmd(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void astrocmd_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); + m_display->matrix(grid, plate); +} + +void astrocmd_state::grid_w(offs_t offset, u8 data) +{ + // C,D(,E3): vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void astrocmd_state::plate_w(offs_t offset, u8 data) +{ + // E01,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + + if (offset == PORTE) + { + // E2: speaker out + m_speaker->level_w(data >> 2 & 1); + + // E3: vfd grid 8 + grid_w(offset, data >> 3 & 1); + } + else + update_display(); +} + +// config + +static INPUT_PORTS_START( astrocmd ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Missile") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void astrocmd_state::astrocmd(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(astrocmd_state::grid_w)); + m_maincpu->write_d().set(FUNC(astrocmd_state::grid_w)); + m_maincpu->write_e().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_f().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_g().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_h().set(FUNC(astrocmd_state::plate_w)); + m_maincpu->write_i().set(FUNC(astrocmd_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 525); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( astrocmd ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) ) + + ROM_REGION( 335362, "screen", 0) + ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) ) +ROM_END + + + + + +/*************************************************************************** + + Epoch Dracula (manufactured in Japan) + * PCB label 96121 + * NEC uCOM-43 MCU, label D553C 206 + * cyan/red/green VFD display NEC FIP8BM20T no. 2-42 + + known releases: + - Japan: Dracula House, yellow case, published by Epoch + - USA: Dracula, red case, published by Epoch + - Other: Dracula, yellow case, published by Hales + +***************************************************************************/ + +class edracula_state : public hh_ucom4_state +{ +public: + edracula_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void edracula(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void edracula_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void edracula_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void edracula_state::plate_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // E,F,G,H,I01: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( edracula ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) +INPUT_PORTS_END + +void edracula_state::edracula(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(edracula_state::grid_w)); + m_maincpu->write_d().set(FUNC(edracula_state::grid_w)); + m_maincpu->write_e().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_f().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_g().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_h().set(FUNC(edracula_state::plate_w)); + m_maincpu->write_i().set(FUNC(edracula_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 526); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 18); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( edracula ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) + + ROM_REGION( 794532, "screen", 0) + ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) ) +ROM_END + + + + + +/*************************************************************************** + + Mattel Computer Gin + * NEC uCOM-43 MCU, label D650C 060 (die label same) + * Hughes HLCD0530 LCD driver, 5 by 14 segments LCD panel, no sound + +***************************************************************************/ + +class mcompgin_state : public hh_ucom4_state +{ +public: + mcompgin_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag), + m_lcd(*this, "lcd") + { } + + void mcompgin(machine_config &config); + +private: + required_device m_lcd; + + void lcd_output_w(offs_t offset, u32 data); + void lcd_w(u8 data); +}; + +// handlers + +void mcompgin_state::lcd_output_w(offs_t offset, u32 data) +{ + // uses ROW0-4, COL11-24 + m_display->matrix(1 << offset, data); +} + +void mcompgin_state::lcd_w(u8 data) +{ + // E0: HLCD0530 _CS + // E1: HLCD0530 clock + // E2: HLCD0530 data in + m_lcd->cs_w(data & 1); + m_lcd->data_w(data >> 2 & 1); + m_lcd->clock_w(data >> 1 & 1); +} + +// config + +static INPUT_PORTS_START( mcompgin ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Deal / Gin") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Discard") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Draw") + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Compare") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Score") + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void mcompgin_state::mcompgin(machine_config &config) +{ + // basic machine hardware + NEC_D650(config, m_maincpu, 400_kHz_XTAL); // TDK FCR400K + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_e().set(FUNC(mcompgin_state::lcd_w)); + + // video hardware + HLCD0530(config, m_lcd, 500); // C=0.01uF + m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); + + PWM_DISPLAY(config, m_display).set_size(8, 24); + + config.set_default_layout(layout_mcompgin); + + // no sound! +} + +// roms + +ROM_START( mcompgin ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) ) +ROM_END + + + + + +/*************************************************************************** + + Mego Mini-Vid: Break Free (manufactured in Japan) + * PCB label Mego 79 rev F + * NEC uCOM-43 MCU, label D553C 049 + * cyan VFD display Futaba DM-4.5 91 + +***************************************************************************/ + +class mvbfree_state : public hh_ucom4_state +{ +public: + mvbfree_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void mvbfree(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void speaker_w(u8 data); +}; + +// handlers + +void mvbfree_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); + u16 plate = bitswap<16>(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); + m_display->matrix(grid, plate); +} + +void mvbfree_state::grid_w(offs_t offset, u8 data) +{ + // E23,F,G,H: vfd grid + int shift = (offset - PORTE) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // E01: plate 0,1 + if (offset == PORTE) + plate_w(2 + PORTC, data & 3); + else + update_display(); +} + +void mvbfree_state::plate_w(offs_t offset, u8 data) +{ + // C,D(,E01): vfd plate + int shift = (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void mvbfree_state::speaker_w(u8 data) +{ + // I0: speaker out + m_speaker->level_w(data & 1); +} + +// config + +static INPUT_PORTS_START( mvbfree ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + + PORT_START("IN.1") // port B + PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) // unimplemented p1/p2 buttons + PORT_CONFNAME( 0x0c, 0x04, "Game Select") + PORT_CONFSETTING( 0x04, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFSETTING( 0x08, "3" ) +INPUT_PORTS_END + +void mvbfree_state::mvbfree(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(mvbfree_state::plate_w)); + m_maincpu->write_d().set(FUNC(mvbfree_state::plate_w)); + m_maincpu->write_e().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_f().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_g().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_h().set(FUNC(mvbfree_state::grid_w)); + m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(14, 10); + config.set_default_layout(layout_mvbfree); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( mvbfree ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) ) +ROM_END + + + + + +/*************************************************************************** + + Takatoku Toys(T.T) Game Robot 9 「ゲームロボット九」 + * PCB label GAME ROBOT 7520 + * NEC uCOM-43 MCU, label TTGR-512 (die label NEC D557 511) + * 9 lamps behind buttons + + known releases: + - Japan: Game Robot 9, published by Takatoku Toys + - USA: Fabulous Fred - The Ultimate Electronic Game, published by Mego + - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as + 12-button version, a clone of Tandy-12) + + Accessories were included for some of the minigames. + +***************************************************************************/ + +class grobot9_state : public hh_ucom4_state +{ +public: + grobot9_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void grobot9(machine_config &config); + +private: + void lamps_w(offs_t offset, u8 data); + void speaker_w(u8 data); + void input_w(u8 data); + u8 input_r(); +}; + +// handlers + +void grobot9_state::lamps_w(offs_t offset, u8 data) +{ + if (offset == PORTE) + { + // E1: speaker out + m_speaker->level_w(data >> 1 & 1); + + // E3: input mux high bit + m_inp_mux = (m_inp_mux & 7) | (data & 8); + } + + // D,F,E0: lamps + m_port[offset] = data; + m_display->matrix(1, m_port[PORTD] | m_port[PORTF] << 4 | m_port[PORTE] << 8); +} + +void grobot9_state::input_w(u8 data) +{ + // C012: input mux low + m_inp_mux = (m_inp_mux & 8) | (data & 7); +} + +u8 grobot9_state::input_r() +{ + // A: multiplexed inputs + return read_inputs(5); +} + +// config + +static INPUT_PORTS_START( grobot9 ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_W) PORT_NAME("Button 2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_E) PORT_NAME("Button 3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_D) PORT_NAME("Button 4") + + PORT_START("IN.1") // C1 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_C) PORT_NAME("Button 5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_X) PORT_NAME("Button 6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_A) PORT_NAME("Button 8") + + PORT_START("IN.2") // C2 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_S) PORT_NAME("Button 9") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Rest") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Eighth Note") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // E3 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Hit") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") + + PORT_START("IN.4") // INT + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_ucom4_state, single_interrupt_line, 0) PORT_NAME("Start-Pitch") +INPUT_PORTS_END + +void grobot9_state::grobot9(machine_config &config) +{ + // basic machine hardware + NEC_D557L(config, m_maincpu, 160000); // approximation + m_maincpu->read_a().set(FUNC(grobot9_state::input_r)); + m_maincpu->write_c().set(FUNC(grobot9_state::input_w)); + m_maincpu->write_d().set(FUNC(grobot9_state::lamps_w)); + m_maincpu->write_e().set(FUNC(grobot9_state::lamps_w)); + m_maincpu->write_f().set(FUNC(grobot9_state::lamps_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(1, 9); + config.set_default_layout(layout_grobot9); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( grobot9 ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Cosmic Combat (manufactured in Japan) + * PCB label 2E1019-E01 + * NEC uCOM-44 MCU, label D552C 042 + * cyan VFD display NEC FIP32AM18Y tube no. 0E, with color overlay + + known releases: + - USA: Cosmic Combat, published by Tomy + - Japan: Space Attack, published by Tomy + +***************************************************************************/ + +class tccombat_state : public hh_ucom4_state +{ +public: + tccombat_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tccombat(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tccombat_state::update_display() +{ + u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4); + u32 plate = bitswap<24>(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6); + m_display->matrix(grid, plate); +} + +void tccombat_state::grid_w(offs_t offset, u8 data) +{ + // I1: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 1 & 1); + + // C,D,I0: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tccombat_state::plate_w(offs_t offset, u8 data) +{ + // E,F123,G,H: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tccombat ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x02, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY +INPUT_PORTS_END + +void tccombat_state::tccombat(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 400000); // approximation + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_c().set(FUNC(tccombat_state::grid_w)); + m_maincpu->write_d().set(FUNC(tccombat_state::grid_w)); + m_maincpu->write_e().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_f().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_g().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_h().set(FUNC(tccombat_state::plate_w)); + m_maincpu->write_i().set(FUNC(tccombat_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(300, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 20); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tccombat ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) ) + + ROM_REGION( 210960, "screen", 0) + ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Tennis (manufactured in Japan) + * PCB label TOMY TN-04 TENNIS + * NEC uCOM-44 MCU, label D552C 048 + * cyan VFD display NEC FIP11AM15T tube no. 0F, with overlay + + The initial release of this game was in 1979, known as Pro-Tennis, + it has a D553 instead of D552, with just a little over 50% ROM used. + + Press the Serve button to start, then hit the ball by pressing one of the + positional buttons when the ball flies over it. + +***************************************************************************/ + +class tmtennis_state : public hh_ucom4_state +{ +public: + tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmtennis(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { set_clock(); } + +protected: + virtual void machine_reset() override; + +private: + void set_clock(); + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); + void port_e_w(u8 data); + u8 input_r(offs_t offset); +}; + +void tmtennis_state::machine_reset() +{ + hh_ucom4_state::machine_reset(); + set_clock(); +} + +// handlers + +void tmtennis_state::set_clock() +{ + // MCU clock is from an LC circuit oscillating by default at ~360kHz, + // but on PRO1, the difficulty switch puts a capacitor across the LC circuit + // to slow it down to ~260kHz. + m_maincpu->set_unscaled_clock((m_inputs[1]->read() & 0x100) ? 260000 : 360000); +} + +void tmtennis_state::update_display() +{ + m_display->matrix(m_grid, m_plate); +} + +void tmtennis_state::grid_w(offs_t offset, u8 data) +{ + // G,H,I: vfd grid + int shift = (offset - PORTG) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtennis_state::plate_w(offs_t offset, u8 data) +{ + // C,D,F: vfd plate + int shift = (offset == PORTF) ? 8 : (offset - PORTC) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmtennis_state::port_e_w(u8 data) +{ + // E01: input mux + // E2: speaker out + // E3: N/C + m_inp_mux = data & 3; + m_speaker->level_w(data >> 2 & 1); +} + +u8 tmtennis_state::input_r(offs_t offset) +{ + // A,B: multiplexed buttons + return ~read_inputs(2) >> (offset*4); +} + +// config + +/* Pro-Tennis physical button layout and labels are like this: + + * left = P2/CPU side * * right = P1 side * + + [SERVE] [1] [2] [3] [3] [2] [1] [SERVE] + [4] [5] [6] [6] [5] [4] + + PRACTICE<--PRO1-->PRO2 1PLAYER<--OFF-->2PLAYER +*/ + +static INPUT_PORTS_START( tmtennis ) + PORT_START("IN.0") // E0 port A/B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Serve") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Serve") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("P1 Button 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("P1 Button 4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Button 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Button 5") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Button 3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Button 6") + + PORT_START("IN.1") // E1 port A/B + PORT_CONFNAME( 0x101, 0x100, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tmtennis_state, difficulty_switch, 0) + PORT_CONFSETTING( 0x001, "Practice" ) + PORT_CONFSETTING( 0x100, "Pro 1" ) // -> difficulty_switch + PORT_CONFSETTING( 0x000, "Pro 2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x00, "1" ) + PORT_CONFSETTING( 0x02, "2" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Button 1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Button 4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Button 2") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Button 5") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P2 Button 3") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 6") +INPUT_PORTS_END + +void tmtennis_state::tmtennis(machine_config &config) +{ + // basic machine hardware + NEC_D552(config, m_maincpu, 360000); // see set_clock + m_maincpu->read_a().set(FUNC(tmtennis_state::input_r)); + m_maincpu->read_b().set(FUNC(tmtennis_state::input_r)); + m_maincpu->write_c().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_d().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_e().set(FUNC(tmtennis_state::port_e_w)); + m_maincpu->write_f().set(FUNC(tmtennis_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmtennis_state::grid_w)); + m_maincpu->write_h().set(FUNC(tmtennis_state::grid_w)); + m_maincpu->write_i().set(FUNC(tmtennis_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 417); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(12, 12); + config.set_default_layout(layout_tmtennis); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmtennis ) + ROM_REGION( 0x0400, "maincpu", 0 ) + ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) ) + + ROM_REGION( 204490, "screen", 0) + ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Pac-Man (manufactured in Japan) + * PCB label TN-08 2E108E01 + * NEC uCOM-43 MCU, label D553C 160 + * cyan/red/green VFD display NEC FIP8AM18T no. 2-21 + * bright yellow round casing + + known releases: + - Japan: Puck Man, published by Tomy + - USA: Pac Man, published by Tomy + - UK: Puckman (Tomy), and also published by Grandstand as Munchman + - Australia: Pac Man-1, published by Futuretronics + + The game will start automatically after turning it on. This Pac Man refuses + to eat dots with his butt, you can only eat them going right-to-left. + +***************************************************************************/ + +class tmpacman_state : public hh_ucom4_state +{ +public: + tmpacman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmpacman(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tmpacman_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; + m_display->matrix(grid, plate); +} + +void tmpacman_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmpacman_state::plate_w(offs_t offset, u8 data) +{ + // E1: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 1 & 1); + + // E023,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tmpacman ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY + + PORT_START("IN.1") // port B + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tmpacman_state::tmpacman(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 430_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(tmpacman_state::grid_w)); + m_maincpu->write_d().set(FUNC(tmpacman_state::grid_w)); + m_maincpu->write_e().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_f().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_h().set(FUNC(tmpacman_state::plate_w)); + m_maincpu->write_i().set(FUNC(tmpacman_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 508); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmpacman ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) ) + + ROM_REGION( 230216, "screen", 0) + ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Scramble (manufactured in Japan) + * PCB label TN-10 2E114E01 + * NEC uCOM-43 MCU, label D553C 192 + * cyan/red/green VFD display NEC FIP10CM20T no. 2-41 + + known releases: + - World: Scramble, published by Tomy + - USA: Scramble, published by Tandy + - UK: Astro Blaster, published by Hales (Epoch Astro Command was named Scramble) + - Germany: Rambler, published by Tomy + +***************************************************************************/ + +class tmscramb_state : public hh_ucom4_state +{ +public: + tmscramb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tmscramb(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tmscramb_state::update_display() +{ + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; + m_display->matrix(m_grid, plate); +} + +void tmscramb_state::grid_w(offs_t offset, u8 data) +{ + // I2: speaker out + if (offset == PORTI) + m_speaker->level_w(data >> 2 & 1); + + // C,D,I01: vfd grid + int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tmscramb_state::plate_w(offs_t offset, u8 data) +{ + // E,F,G,H: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tmscramb ) + PORT_START("IN.0") // port A + PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x01, "Professional" ) + PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + + PORT_START("IN.1") // port B + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void tmscramb_state::tmscramb(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->read_b().set_ioport("IN.1"); + m_maincpu->write_c().set(FUNC(tmscramb_state::grid_w)); + m_maincpu->write_d().set(FUNC(tmscramb_state::grid_w)); + m_maincpu->write_e().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_f().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_g().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_h().set(FUNC(tmscramb_state::plate_w)); + m_maincpu->write_i().set(FUNC(tmscramb_state::grid_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 556); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(10, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tmscramb ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) ) + + ROM_REGION( 243830, "screen", 0) + ROM_LOAD( "tmscramb.svg", 0, 243830, CRC(300b098a) SHA1(9fde58ac0f4e4cfea05301346cbf5b1ced9fe973) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy(tronic) Caveman (manufactured in Japan) + * PCB label TN-12 2E114E03 + * NEC uCOM-43 MCU, label D553C 209 + * cyan/red/green VFD display NEC FIP8AM20T no. 2-42 + + known releases: + - World: Caveman, published by Tomy + - USA: Caveman, published by Tandy + - UK: Cave Man - Jr. Caveman vs Dinosaur, published by Grandstand + +***************************************************************************/ + +class tcaveman_state : public hh_ucom4_state +{ +public: + tcaveman_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void tcaveman(machine_config &config); + +private: + void update_display(); + void grid_w(offs_t offset, u8 data); + void plate_w(offs_t offset, u8 data); +}; + +// handlers + +void tcaveman_state::update_display() +{ + u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); + u32 plate = bitswap<24>(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; + m_display->matrix(grid, plate); +} + +void tcaveman_state::grid_w(offs_t offset, u8 data) +{ + // C,D: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + update_display(); +} + +void tcaveman_state::plate_w(offs_t offset, u8 data) +{ + // E3: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 3 & 1); + + // E012,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = (m_plate & ~(0xf << shift)) | (data << shift); + update_display(); +} + +// config + +static INPUT_PORTS_START( tcaveman ) + PORT_START("IN.0") // port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x08, "Professional" ) +INPUT_PORTS_END + +void tcaveman_state::tcaveman(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set_ioport("IN.0"); + m_maincpu->write_c().set(FUNC(tcaveman_state::grid_w)); + m_maincpu->write_d().set(FUNC(tcaveman_state::grid_w)); + m_maincpu->write_e().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_f().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_g().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_h().set(FUNC(tcaveman_state::plate_w)); + m_maincpu->write_i().set(FUNC(tcaveman_state::plate_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1920, 559); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(8, 19); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tcaveman ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) ) + + ROM_REGION( 306952, "screen", 0) + ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) ) +ROM_END + + + + + +/*************************************************************************** + + Tomy Alien Chase (manufactured in Japan) + * PCB label TN-16 2E121B01 + * NEC uCOM-43 MCU, label D553C 258 + * red/green VFD display NEC FIP9AM24T, with color overlay, 2-sided* + + *Player one views the VFD from the front (grid+filament side) while the + opposite player views it from the back side (through the conductive traces), + basically a mirror-image. + + To start the game, simply press [UP]. Hold a joystick direction to move around. + +***************************************************************************/ + +class alnchase_state : public hh_ucom4_state +{ +public: + alnchase_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ucom4_state(mconfig, type, tag) + { } + + void alnchase(machine_config &config); + +private: + void output_w(offs_t offset, u8 data); + u8 input_r(); +}; + +// handlers + +void alnchase_state::output_w(offs_t offset, u8 data) +{ + if (offset <= PORTE) + { + // C,D,E0: vfd grid + int shift = (offset - PORTC) * 4; + m_grid = (m_grid & ~(0xf << shift)) | (data << shift); + + // C0(grid 0): input enable PL1 + // D0(grid 4): input enable PL2 + m_inp_mux = (m_grid & 1) | (m_grid >> 3 & 2); + + // E1: speaker out + if (offset == PORTE) + m_speaker->level_w(data >> 1 & 1); + } + + if (offset >= PORTE) + { + // E23,F,G,H,I: vfd plate + int shift = (offset - PORTE) * 4; + m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; + } + + m_display->matrix(m_grid, m_plate); +} + +u8 alnchase_state::input_r() +{ + // A: multiplexed buttons + return read_inputs(2); +} + +// config + +/* physical button layout and labels are like this: + + POWER SOUND LEVEL PLAYER + ON ON PRO TWO START + o o | | + | | | | [joystick] + | | o o + OFF OFF AMA ONE GAME 0,1,2,3 + + 1 PLAYER SIDE + + other player side only has a joystick +*/ + +static INPUT_PORTS_START( alnchase ) + PORT_START("IN.0") // C0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + + PORT_START("IN.1") // D0 port A + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // on non-mirrored view, swap P2 left/right + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + + PORT_START("IN.2") // port B + PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) + PORT_CONFSETTING( 0x01, "1" ) + PORT_CONFSETTING( 0x00, "2" ) + PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) + PORT_CONFSETTING( 0x00, "Amateur" ) + PORT_CONFSETTING( 0x02, "Professional" ) + PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +void alnchase_state::alnchase(machine_config &config) +{ + // basic machine hardware + NEC_D553(config, m_maincpu, 400_kHz_XTAL); + m_maincpu->read_a().set(FUNC(alnchase_state::input_r)); + m_maincpu->read_b().set_ioport("IN.2"); + m_maincpu->write_c().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_d().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_e().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_f().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_g().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_h().set(FUNC(alnchase_state::output_w)); + m_maincpu->write_i().set(FUNC(alnchase_state::output_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(365, 1080); + screen.set_visarea_full(); + + PWM_DISPLAY(config, m_display).set_size(9, 17); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alnchase ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "d553c-258", 0x0000, 0x0800, CRC(c5284ff5) SHA1(6a20aaacc9748f0e0335958f3cea482e36153704) ) + + ROM_REGION( 576864, "screen", 0) + ROM_LOAD( "alnchase.svg", 0, 576864, CRC(fe7c7078) SHA1(0d201eeaeb291ded14c0759d1d3d5b2491cf0792) ) +ROM_END + + + +} // anonymous namespace + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE ) + +CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** + +CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE ) +CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE ) + +CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel Electronics", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) + +CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE ) + +CONS( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** + +CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE ) +CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE ) +CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE ) + +// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction +// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/handheld/monty.cpp b/src/mame/handheld/monty.cpp new file mode 100644 index 00000000000..8a2718a167a --- /dev/null +++ b/src/mame/handheld/monty.cpp @@ -0,0 +1,296 @@ +// license:BSD-3-Clause +// copyright-holders:Andrew Gardner, hap +/*************************************************************************** + +Driver for Ritam Monty Plays Scrabble Brand Crossword Game - Portable Computer Console + +Scrabble computer that allows you play a game of Scrabble by yourself (or you +can play with up to 3 players). Has a built-in 12,000 vocabulary, expandable +to 44,000 by way of 2 expansion modules each containing 16,000 more obscure words. +You can use the included 'score cards' (which look like little Scrabble boards), +or you can use a real Scrabble board and tiles to play. Also note, Monty +apparently originally came with a little pen. + +This game was later upgraded by Ritam to Master Monty which had 24,000 words +built-in (expandable to a total of 56,000 with the same 2 expansion modules). +Two variations on Master Monty have been seen: one looks exactly the same as the +Monty but the electronics on the inside have been upgraded. The later version +is blue and says Master Monty at the top. Both of these versions are hand-upgraded +by adding chips and wires to the inside of the game. + +Hardware notes: +- Z80 @ ~3.58MHz +- 2KB SRAM, 16KB ROM(32KB on mmonty) +- 2*16KB ROM sockets for vocabulary expansion +- 2*SED1503F, 40*32 LCD screen, beeper + +TODO: +- put expansion roms in softwarelist? (note: slot #1 only accepts rom #1, + slot #2 only accepts rom #2), they can be disabled in-game with option M + +****************************************************************************/ + +#include "emu.h" + +#include "cpu/z80/z80.h" +#include "sound/dac.h" +#include "video/sed1500.h" + +#include "screen.h" +#include "speaker.h" + +#include "monty.lh" + + +namespace { + +class monty_state : public driver_device +{ +public: + monty_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_lcd(*this, "lcd%u", 0) + , m_dac(*this, "dac") + , m_inputs(*this, "IN.%u", 0) + { } + + DECLARE_WRITE_LINE_MEMBER(key_pressed); + + void monty(machine_config &config); + void mmonty(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device_array m_lcd; + required_device m_dac; + required_ioport_array<6> m_inputs; + + void monty_mem(address_map &map); + void mmonty_mem(address_map &map); + void monty_io(address_map &map); + + template void lcd_output_w(offs_t offset, u64 data) { m_lcd_data[N << 4 | offset] = data; } // buffer for screen_update + u32 screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); + + void control_w(offs_t offset, u8 data); + void lcd_w(offs_t offset, u8 data) { m_lcd[m_lcd_cs]->write(offset, data); } + u8 input_r(offs_t offset); + DECLARE_WRITE_LINE_MEMBER(halt_changed) { m_halt = state; } + + u64 m_lcd_data[32]; + int m_lcd_cs = 0; + int m_halt = 0; +}; + +void monty_state::machine_start() +{ + memset(m_lcd_data, 0, sizeof(m_lcd_data)); + + save_item(NAME(m_lcd_data)); + save_item(NAME(m_lcd_cs)); + save_item(NAME(m_halt)); +} + + + +/****************************************************************************** + Video +******************************************************************************/ + +u32 monty_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) +{ + bitmap.fill(0xffffff); + + // letters with width 5 with space in between them + for (int y = 0; y < 32; y++) + for (int x = 0; x < 40; x++) + bitmap.pix(y + 1, x + x/5 + 1) = BIT(m_lcd_data[y], x) ? 0 : 0xffffff; + + return 0; +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void monty_state::control_w(offs_t offset, u8 data) +{ + // a0: speaker out + m_dac->write(BIT(offset, 0)); + + // a1: lcd chip select + m_lcd_cs = BIT(offset, 1); +} + +u8 monty_state::input_r(offs_t offset) +{ + u8 data = 0; + + // a0-a5, d0-d4: multiplexed inputs + for (int i = 0; i < 6; i++) + if (BIT(offset, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + +WRITE_LINE_MEMBER(monty_state::key_pressed) +{ + if (state && m_halt) + m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void monty_state::monty_mem(address_map &map) +{ + map(0x0000, 0x3fff).rom(); + map(0x4000, 0x7fff).rom(); // slot 1 + map(0x8000, 0xbfff).rom(); // slot 2 + map(0xf800, 0xffff).ram(); +} + +void monty_state::mmonty_mem(address_map &map) +{ + map(0x0000, 0x77ff).rom(); + map(0x7800, 0x7fff).ram(); + map(0x8000, 0xbfff).rom(); // slot 2 + map(0xc000, 0xffff).rom(); // slot 1 +} + +void monty_state::monty_io(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0xff).r(FUNC(monty_state::input_r)); + map(0x00, 0x03).w(FUNC(monty_state::control_w)); + map(0x80, 0xff).w(FUNC(monty_state::lcd_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( monty ) + PORT_START("IN.0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Option") PORT_CODE(KEYCODE_SPACE) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Blank") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('M') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('I') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('G') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + + PORT_START("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_UP) PORT_CHAR('C') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void monty_state::monty(machine_config &config) +{ + // Basic machine hardware + Z80(config, m_maincpu, 3.579545_MHz_XTAL); // Ceramic resonator labeled 3.58MT + m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::monty_mem); + m_maincpu->set_addrmap(AS_IO, &monty_state::monty_io); + m_maincpu->halt_cb().set(FUNC(monty_state::halt_changed)); + + // Video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(0); + screen.set_size(40+8+1, 32+1); + screen.set_visarea_full(); + screen.set_screen_update(FUNC(monty_state::screen_update)); + + SED1503(config, m_lcd[0], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<0>)); + SED1503(config, m_lcd[1], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<1>)); + config.set_default_layout(layout_monty); + + // Sound hardware + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); +} + +void monty_state::mmonty(machine_config &config) +{ + monty(config); + m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::mmonty_mem); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( monty ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "monty_main.bin", 0x0000, 0x4000, CRC(720b4f55) SHA1(0106eb88d3fbbf25a745b9b6ee785ba13689d095) ) // 27128 + ROM_LOAD( "monty_module1.bin", 0x4000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 + ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 +ROM_END + +ROM_START( mmonty ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "master_monty_main.bin", 0x0000, 0x8000, CRC(bb5ef4d4) SHA1(ba2c759e429f8740df419f9abb60832eddfba8ab) ) // 27C256 + ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 + ROM_LOAD( "monty_module1.bin", 0xc000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1983, monty, 0, 0, monty, monty, monty_state, empty_init, "Ritam", "Monty Plays Scrabble", MACHINE_SUPPORTS_SAVE ) +COMP( 1987, mmonty, 0, 0, mmonty, monty, monty_state, empty_init, "Ritam", "Master Monty", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/rzone.cpp b/src/mame/handheld/rzone.cpp new file mode 100644 index 00000000000..abae24156fb --- /dev/null +++ b/src/mame/handheld/rzone.cpp @@ -0,0 +1,355 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + + ** subclass of hh_sm510_state (includes/hh_sm510.h, drivers/hh_sm510.cpp) ** + + Tiger R-Zone driver + + This is a backwards console, the heart of the machine is the cartridge. + The console houses the controller, speaker, power, backlight, and a + polarizer filter for the screen. The cartridge has the MCU, optional + sound ROM, and the LCD screen in a translucent window. + + Console family: + + 1995: R-Zone HeadGear: Wearable headset, controller is separate, + red-on-black screen is reflected in front of the right eye. + 1996: R-Zone SuperScreen: Handheld console, inverted filter(aka black + LCD segments), optional background sheet as with standalone handhelds. + 1997: R-Zone X.P.G - Xtreme Pocket Game: Handheld version of HeadGear. + 1997: R-Zone DataZone: PDA with a built-in SuperScreen. + + TODO: + - softwarelist? it's impossible right now due to SVG initialization + - support for SuperScreen. SVG colors will need to be inverted, or maybe + with artwork or HLSL? + - add DataZone, will get its own driver + +***************************************************************************/ + +#include "emu.h" +#include "hh_sm510.h" + +#include "machine/timer.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "rzone.lh" + + +namespace { + +class rzone_state : public hh_sm510_state +{ +public: + rzone_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_sm510_state(mconfig, type, tag), + m_led_out(*this, "led"), + m_led_off(*this, "led_off") + { } + + void rzbatfor(machine_config &config); + void rztoshden(machine_config &config); + void rzindy500(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + output_finder<> m_led_out; + required_device m_led_off; + + int m_led_pin = 0; + int m_sctrl = 0; + int m_sclock = 0; + + TIMER_DEVICE_CALLBACK_MEMBER(led_off_callback) { m_led_out = m_led_pin ? 1 : 0; } + DECLARE_WRITE_LINE_MEMBER(led_w); + DECLARE_WRITE_LINE_MEMBER(audio_w); + DECLARE_WRITE_LINE_MEMBER(sctrl_w); + DECLARE_WRITE_LINE_MEMBER(sclock_w); + DECLARE_READ_LINE_MEMBER(sdata_r); + + void t1_write_r(u8 data); + void t1_write_s(u8 data); + virtual u8 input_r() override; + + void t2_update_audio(); + void t2_write_r(u8 data); + void t2_write_s(u8 data); +}; + + +// machine start + +void rzone_state::machine_start() +{ + hh_sm510_state::machine_start(); + + // resolve handlers + m_led_out.resolve(); + + // register for savestates + save_item(NAME(m_led_pin)); + save_item(NAME(m_sctrl)); + save_item(NAME(m_sclock)); +} + + +/*************************************************************************** + I/O +***************************************************************************/ + +// console + +WRITE_LINE_MEMBER(rzone_state::led_w) +{ + // LED: enable backlight + if (state) + m_led_out = 1; + + // delay led off to prevent flickering + if (!state && m_led_pin) + m_led_off->adjust(attotime::from_msec(30)); + + m_led_pin = state; +} + +WRITE_LINE_MEMBER(rzone_state::audio_w) +{ + // Audio: speaker out + m_speaker->level_w(state ? 1 : 0); +} + +WRITE_LINE_MEMBER(rzone_state::sctrl_w) +{ + // SCTRL: 74165 SH/LD: reload inputs while low + if (!state || !m_sctrl) + m_inp_mux = m_inputs[0]->read(); + + m_sctrl = state; +} + +WRITE_LINE_MEMBER(rzone_state::sclock_w) +{ + // SCLOCK: 74165 CLK: shift inputs on rising edge when 74165 SH/LD is high + if (m_sctrl && !m_sclock && state) + m_inp_mux >>= 1; + + m_sclock = state; +} + +READ_LINE_MEMBER(rzone_state::sdata_r) +{ + // SDATA: 74165 Q + sctrl_w(m_sctrl); // reload inputs if needed + return m_inp_mux & 1; +} + + +// cartridge type 1: simple SM510 + +void rzone_state::t1_write_r(u8 data) +{ + // R1: Audio + audio_w(data & 1); + + // R2: SCTRL + sctrl_w(data >> 1 & 1); +} + +void rzone_state::t1_write_s(u8 data) +{ + // S1: LED + led_w(data & 1); + + // S2: SCLOCK + sclock_w(data >> 1 & 1); +} + +u8 rzone_state::input_r() +{ + // K1: SDATA + return sdata_r(); +} + + +// cartridge type 2: simple SM512, 2 audio lines + +void rzone_state::t2_update_audio() +{ + audio_w((m_s >> 2 & 1) | (m_r & 1)); +} + +void rzone_state::t2_write_r(u8 data) +{ + // R: Audio + m_r = data; + t2_update_audio(); +} + +void rzone_state::t2_write_s(u8 data) +{ + // S1: SCTRL + sctrl_w(data & 1); + + // S2: SCLOCK + sclock_w(data >> 1 & 1); + + // S3: Audio + m_s = data; + t2_update_audio(); + + // S4: LED + led_w(data >> 3 & 1); +} + + + +/*************************************************************************** + Inputs +***************************************************************************/ + +static INPUT_PORTS_START( rzone ) + PORT_START("IN.0") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // A + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // B + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) // C + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) // D + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) +INPUT_PORTS_END + + + +/*************************************************************************** + Machine Configs +***************************************************************************/ + +void rzone_state::rzbatfor(machine_config &config) +{ + // basic machine hardware + SM512(config, m_maincpu); // no external XTAL + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t2_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t2_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1368, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void rzone_state::rztoshden(machine_config &config) +{ + // basic machine hardware + SM510(config, m_maincpu); + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1392, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + +void rzone_state::rzindy500(machine_config &config) +{ + // basic machine hardware + SM510(config, m_maincpu); // no external XTAL + m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed + m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); + m_maincpu->read_k().set(FUNC(rzone_state::input_r)); + m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); + m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1425, 1080); + screen.set_visarea_full(); + + TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); + config.set_default_layout(layout_rzone); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/*************************************************************************** + ROM Definitions +***************************************************************************/ + +ROM_START( rzbatfor ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-231, SM512 under epoxy (die label KMN1202) (not the same game as the standalone Tiger handheld) + ROM_LOAD( "12_02.program", 0x0000, 0x1000, CRC(27abdb52) SHA1(b356ff80b628244da588b4748404b78d7a57eccd) ) + + ROM_REGION( 0x100, "maincpu:melody", 0 ) + ROM_LOAD( "12_02.melody", 0x000, 0x100, CRC(d794746c) SHA1(f0706c5100c090c65fcb2d768b5a5b4a55b29e04) ) + + ROM_REGION( 652556, "screen", 0) + ROM_LOAD( "rzbatfor.svg", 0, 652556, CRC(4d850489) SHA1(31a2a1e9209c0f77dbc268cddbfa4a67478734a7) ) +ROM_END + +ROM_START( rztoshden ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-241, SM510 under epoxy (die label ML4) + ROM_LOAD( "ml4", 0x0000, 0x1000, CRC(282c641f) SHA1(f94e4a17ffe90adcc6046070034be9b777f72288) ) + + ROM_REGION( 857474, "screen", 0) + ROM_LOAD( "rztoshden.svg", 0, 857474, CRC(e4340f84) SHA1(4f040d3c7dc06d66b4f06942e610a64c11e5cd4d) ) +ROM_END + +ROM_START( rzindy500 ) + ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-312, SM510 under epoxy (die label KMS10 22) + ROM_LOAD( "10_22", 0x0000, 0x1000, CRC(99a746d0) SHA1(64264499d45a566fa9a0801c20e7fa27eac18da6) ) + + ROM_REGION( 533411, "screen", 0) + ROM_LOAD( "rzindy500.svg", 0, 533411, CRC(cfc85677) SHA1(014b9123d81fba1488b4a22a6b6fd0c09e22c1ea) ) +ROM_END + +} // anonymous namespace + + + +/*************************************************************************** + Drivers +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1995, rzbatfor, 0, 0, rzbatfor, rzone, rzone_state, empty_init, "Tiger Electronics", "R-Zone: Batman Forever", MACHINE_SUPPORTS_SAVE ) +CONS( 1996, rztoshden, 0, 0, rztoshden, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Takara)", "R-Zone: Battle Arena Toshinden", MACHINE_SUPPORTS_SAVE ) +CONS( 1996, rzindy500, 0, 0, rzindy500, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Sega)", "R-Zone: Indy 500", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/scrablex.cpp b/src/mame/handheld/scrablex.cpp new file mode 100644 index 00000000000..15b69e7f947 --- /dev/null +++ b/src/mame/handheld/scrablex.cpp @@ -0,0 +1,229 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Selchow & Righter Scrabble Lexor +It's a tabletop scrabble game/scorekeeper. + +Hardware notes: +- PCB label: PB-074 +- Fujitsu MB8841 MCU +- 8-digit 14-seg LEDs, 2-bit sound + +There's also a version of this game on a Panasonic MN1405 MCU. + +*******************************************************************************/ + +#include "emu.h" +#include "cpu/mb88xx/mb88xx.h" +#include "sound/spkrdev.h" +#include "video/pwm.h" +#include "speaker.h" + +#include "scrablex.lh" + + +namespace { + +class scrablex_state : public driver_device +{ +public: + scrablex_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_inputs(*this, "IN.%u", 0) + { } + + void scrablex(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_display; + required_device m_speaker; + required_ioport_array<5> m_inputs; + + void write_o(u8 data); + void write_p(u8 data); + template u8 read_r(); + template void write_r(u8 data); + + u8 m_inp_mux = 0; + u16 m_r = 0; +}; + +void scrablex_state::machine_start() +{ + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_r)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void scrablex_state::write_o(u8 data) +{ + // O0-O7: digit select (uses index 8-15) + m_display->write_my((1 << (data & 0xf)) >> 8); +} + +void scrablex_state::write_p(u8 data) +{ + // P0-P3: input mux part + m_inp_mux = (m_inp_mux & ~0xf) | (~data & 0xf); +} + +template +u8 scrablex_state::read_r() +{ + u16 data = 0; + + // R0-R8: multiplexed inputs + for (int i = 0; i < 5; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data >> (N * 4) & 0xf; +} + +template +void scrablex_state::write_r(u8 data) +{ + // R0-R13: digit segments + m_r = (m_r & ~(0xf << (N * 4))) | ((~data & 0xf) << (N * 4)); + m_display->write_mx(bitswap<14>(m_r,10,8,6,12,11,7,9,13,5,4,3,2,1,0)); + + // R14,R15: speaker out + m_speaker->level_w(m_r >> 14 & 3); + + // R15: input mux part + m_inp_mux = (m_inp_mux & 0xf) | (m_r >> 11 & 0x10); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( scrablex ) + PORT_START("IN.0") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.1") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + + PORT_START("IN.2") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR('*') + + PORT_START("IN.3") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Double") + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Triple") + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Word") + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Bonus") + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Minus") + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter") + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") + PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Flash") + PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Solo") + PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Score") + PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') + PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') + PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') + PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') + PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Timer") + PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Review") +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +void scrablex_state::scrablex(machine_config &config) +{ + // basic machine hardware + MB8841(config, m_maincpu, 500000); // approximation - RC osc. R=15K, C=100pF + m_maincpu->write_o().set(FUNC(scrablex_state::write_o)); + m_maincpu->write_p().set(FUNC(scrablex_state::write_p)); + m_maincpu->read_r<0>().set(FUNC(scrablex_state::read_r<0>)); + m_maincpu->read_r<1>().set(FUNC(scrablex_state::read_r<1>)); + m_maincpu->read_r<2>().set(FUNC(scrablex_state::read_r<2>)); + m_maincpu->read_r<3>().set(FUNC(scrablex_state::read_r<3>)); + m_maincpu->write_r<0>().set(FUNC(scrablex_state::write_r<0>)); + m_maincpu->write_r<1>().set(FUNC(scrablex_state::write_r<1>)); + m_maincpu->write_r<2>().set(FUNC(scrablex_state::write_r<2>)); + m_maincpu->write_r<3>().set(FUNC(scrablex_state::write_r<3>)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(8, 14); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_scrablex); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker); + static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; + m_speaker->set_levels(4, speaker_levels); + m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( scrablex ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "mb8841_320m", 0x0000, 0x0800, CRC(bef4ab5a) SHA1(44e385225c5e8818ed93c3654a294aa412042e34) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1980, scrablex, 0, 0, scrablex, scrablex, scrablex_state, empty_init, "Selchow & Righter", "Scrabble Lexor - Computer Word Game", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/talkingbb.cpp b/src/mame/handheld/talkingbb.cpp new file mode 100644 index 00000000000..1118559e70c --- /dev/null +++ b/src/mame/handheld/talkingbb.cpp @@ -0,0 +1,351 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/****************************************************************************** + +Parker Brothers Starting Lineup Talking Baseball + +Hardware notes: +- PCB label KPT-349 REV 6C<1> +- 80C31 MCU @ 12MHz +- 2KB RAM, 128KB ROM, 2 cartridge slots +- 12 leds, 2 16-button keypads + +ROM chip has (C) 1987 Tonka (Kenner Parker Toys was acquired by Tonka in 1987, Parker +Brothers itself was acquired by Kenner in 1985) + +The speech driver is by Forrest S. Mozer's company. + +The cartridge slots are for extra teams. There are around 8 cartridges, each one +included 3 or 4 baseball teams, with exception to the "Hall of Fame" cartridge. +Players enter a 3-digit code to select the team. + +TODO: +- add cartridge slots +- Buttons are unresponsive at initial game setup, you need to hold the yes/no button + until it responds. The keypad reading routine is at $1A5D, it gets skipped for several + seconds at a time. Once in-game, everything is fine though. BTANB or different cause? + +******************************************************************************* + +Field positions (used when substituting): + +1: Pitcher +2: Catcher +3: First Base +4: Second Base +5: Third Base +6: Shortstop +7: Left Field +8: Center Field +9: Right Field + +The game includes baseball cards with player stats. At the very least, the roster +cards are needed to play the game properly. See below for the default teams. + +American Team: +-------------- + +Starting lineup batting order: + +1: #23 Rickey Henderson, CF +2: #14 Don Mattingly, 1B +3: #18 Wade Boggs, 3B +4: #22 George Bell, LF +5: #24 Dave Winfield, RF +6: #16 Cal Ripken, SS +7: #11 Terry Kennedy, C +8: #15 Willie Randolph, 2B +9: #20 Alan Trammell, SS & DH +10:#27 Roger Clemens, P + +Substitutes: + +#19: George Brett, 3B +#12: Carlton Fisk, C +#25: Jack Morris, P +#13: Eddie Murray, 1B +#21: Kirby Puckett, OF +#30: Dan Quisenberry, P +#29: Dave Righetti, P +#28: Bret Saberhagen, P +#17: Lou Whitaker, 2B +#26: Robin Yount, SS + +National Team: +-------------- + +Starting lineup batting order: + +1: #23: Tim Raines, LF +2: #16: Ryne Sandberg, 2B +3: #22: Darryl Strawberry, RF +4: #19: Mike Schmidt, 3B +5: #13: Jack Clark, 1B +6: #20: Eric Davis, CF +7: #11: Gary Carter, C +8: #17: Ozzie Smith, SS +9: #18: Dale Murphy, OF & DH +10:#25: Mike Scott, P + +Substitutes: + +#15: Buddy Bell, 3B +#26: Jody Davis, C +#24: Andre Dawson, CF +#29: Dwight Gooden, P +#21: Tony Gwynn, OF +#14: Keith Hernandez, 1B +#30: Nolan Ryan, P +#12: Steve Sax, 2B +#28: Fernando Valenzuela, P +#27: Todd Worrell, P + +******************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "video/pwm.h" +#include "sound/dac.h" +#include "speaker.h" + +// internal artwork +#include "talkingbb.lh" + + +namespace { + +class talkingbb_state : public driver_device +{ +public: + talkingbb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_display(*this, "display"), + m_inputs(*this, "IN.%u", 0) + { } + + void talkingbb(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_region_ptr m_rom; + required_device m_display; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + u8 m_bank = 0; + u8 m_inp_mux = 0; + + // I/O handlers + void bank_w(u8 data); + u8 bank_r(offs_t offset); + void input_w(u8 data); + u8 input_r(); + u8 switch_r(); +}; + +void talkingbb_state::machine_start() +{ + // register for savestates + save_item(NAME(m_bank)); + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void talkingbb_state::bank_w(u8 data) +{ + // d0-d1: upper rom bank + // d2-d4: upper rom enable (bus conflict possible) + // d2: internal rom, d3: cart slot 1, d4: cart slot 2 + m_bank = data; +} + +u8 talkingbb_state::bank_r(offs_t offset) +{ + u32 hi = (~m_bank & 3) << 15; + u8 data = (m_bank & 4) ? 0xff : m_rom[offset | hi]; + + // TODO: cartridge + + return data; +} + +void talkingbb_state::input_w(u8 data) +{ + // no effect if P30 is low (never happens though) + if (~m_bank & 1) + return; + + // d4-d7: led select (also input mux) + // d0-d2: led data + m_inp_mux = data >> 4; + m_display->matrix(m_inp_mux, ~data & 7); +} + +u8 talkingbb_state::input_r() +{ + // open bus if P30 is low (never happens though) + if (~m_bank & 1) + return 0xff; + + u8 data = 0; + + // multiplexed inputs + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + +u8 talkingbb_state::switch_r() +{ + // d5: mode switch + return ~m_inputs[4]->read(); +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void talkingbb_state::main_map(address_map &map) +{ + map(0x0000, 0x7fff).rom().region("maincpu", 0x18000); + map(0x8000, 0xffff).r(FUNC(talkingbb_state::bank_r)); +} + +void talkingbb_state::main_io(address_map &map) +{ + map(0x0000, 0x07ff).mirror(0x7800).ram(); + map(0x8000, 0x8000).mirror(0x7fff).rw(FUNC(talkingbb_state::input_r), FUNC(talkingbb_state::input_w)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +/* keypad layout: **** P1 = Batter **** | **** P2 = Pitcher **** + | +[PINCH [1 [2] [3 [TIME OUT] | [INFIELD [1 [2 [3 [TIME OUT] + HITTER] BUNT] POWER] | IN] FAST] CURVE] CHANGE] + | +[SCORE] [4] [5 [6] [NO | [SCORE] [4 [5 [6 [NO + SQUEEZE] CANCEL] | PTCHOUT] PICKOFF] INTWALK] CANCEL] + | +[PINCH [7 [8] [9 [YES | [INSTANT [7 [8] [9 [YES + RUNNER] STEAL] X-BASE] ENTER] | REPLAY] RELIEF] SUB] ENTER] + | + [0 | [0 + SWING] | BALL] +*/ + +static INPUT_PORTS_START( talkingbb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_R) PORT_NAME("P1 3 / Power") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F) PORT_NAME("P1 6") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_V) PORT_NAME("P1 9 / Extra Base") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("P1 Time Out") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_O) PORT_NAME("P2 3 / Change") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_L) PORT_NAME("P2 6 / Intentional Walk") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("P2 9 / Sub") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("P2 Time Out") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_E) PORT_NAME("P1 2") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_D) PORT_NAME("P1 5 / Squeeze") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_C) PORT_NAME("P1 8") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_LALT) PORT_NAME("P1 0 / Swing") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 2 / Curve") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 5 / Pickoff") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 8") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RALT) PORT_NAME("P2 0 / Ball") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_W) PORT_NAME("P1 1 / Bunt") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_S) PORT_NAME("P1 4") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_X) PORT_NAME("P1 7 / Steal") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 1 / Fast") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 4 / Pitchout") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 7 / Relief") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Pinch Hitter") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pinch Runner") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Infield In") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Instant Replay") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") + + PORT_START("IN.4") + PORT_CONFNAME( 0x20, 0x00, "Mode" ) + PORT_CONFSETTING( 0x00, "Player" ) + PORT_CONFSETTING( 0x20, "Coach" ) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void talkingbb_state::talkingbb(machine_config &config) +{ + /* basic machine hardware */ + I80C31(config, m_maincpu, 12_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &talkingbb_state::main_map); + m_maincpu->set_addrmap(AS_IO, &talkingbb_state::main_io); + m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); + m_maincpu->port_out_cb<3>().set(FUNC(talkingbb_state::bank_w)); + m_maincpu->port_in_cb<3>().set(FUNC(talkingbb_state::switch_r)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(4, 3); + config.set_default_layout(layout_talkingbb); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( talkingbb ) + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD("sp17208-002", 0x0000, 0x20000, CRC(e0e56217) SHA1(24a06b5c94a5c750799f61e3eb865e02d6cea68a) ) // GM231000-110 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1988, talkingbb, 0, 0, talkingbb, talkingbb, talkingbb_state, empty_init, "Parker Brothers", "Starting Lineup Talking Baseball", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/talkingfb.cpp b/src/mame/handheld/talkingfb.cpp new file mode 100644 index 00000000000..46dc83b6a00 --- /dev/null +++ b/src/mame/handheld/talkingfb.cpp @@ -0,0 +1,256 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Kevin Horton +/****************************************************************************** + +Parker Brothers Superstar Lineup Talking Football + +Hardware notes: +- PCB label KPT-410 REV B1 (*KPT = Kenner Parker Toys) +- 80C31 MCU @ 12MHz +- 2KB RAM, 256KB ROM, 2 cartridge slots +- two 20-button keypads + +Like Baseball, The ROM chip has (C) Tonka. +The speech driver is by Mozer, the ROM data includes employees names. + +The cartridge slots are probably meant for extra teams. I can't find anything +about it in the manual or any proof that cartridges were released for this. +Maybe the toy went out of production soon after release. + +The game includes formation cards, refer to the manual on which number is which strategy. + +TODO: +- add cartridge slots (no need if no carts exist?) +- verify keypad (everything seems ok, but "Pursue" and "Go For Turnover" might + be swapped, their function is nearly identical so it's hard to test) + +******************************************************************************/ + +#include "emu.h" +#include "cpu/mcs51/mcs51.h" +#include "sound/dac.h" +#include "speaker.h" + + +namespace { + +class talkingfb_state : public driver_device +{ +public: + talkingfb_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_rom(*this, "maincpu"), + m_inputs(*this, "IN.%u", 0) + { } + + void talkingfb(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_region_ptr m_rom; + required_ioport_array<5> m_inputs; + + void main_map(address_map &map); + void main_io(address_map &map); + + u8 m_bank = 0; + u8 m_inp_mux = 0; + + // I/O handlers + void bank_w(u8 data); + template u8 bank_r(offs_t offset); + void input_w(u8 data); + u8 input_r(); +}; + +void talkingfb_state::machine_start() +{ + // register for savestates + save_item(NAME(m_bank)); + save_item(NAME(m_inp_mux)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void talkingfb_state::bank_w(u8 data) +{ + // d0-d2: upper rom bank + // d3-d5: upper rom enable (bus conflict possible) + // d3: cart slot 1, d4: cart slot 2, d5: internal rom + m_bank = data; +} + +template +u8 talkingfb_state::bank_r(offs_t offset) +{ + u32 hi = (m_bank & 7) << 15; + u8 data = (m_bank & 0x20) ? 0xff : m_rom[offset | hi]; + + // cartridge slots are only enabled if PSEN is high + // TODO + + return data; +} + +void talkingfb_state::input_w(u8 data) +{ + // d3-d7: input mux + m_inp_mux = data >> 3; +} + +u8 talkingfb_state::input_r() +{ + u8 data = 0; + + // multiplexed inputs + for (int i = 0; i < 5; i++) + if (BIT(~m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; +} + + + +/****************************************************************************** + Address Maps +******************************************************************************/ + +void talkingfb_state::main_map(address_map &map) +{ + map(0x0000, 0x7fff).rom(); + map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<0>)); +} + +void talkingfb_state::main_io(address_map &map) +{ + map(0x0000, 0x07ff).mirror(0x3800).ram(); + map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(talkingfb_state::input_r), FUNC(talkingfb_state::input_w)); + map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<1>)); +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +/* keypad layout is like this: (P1 = Home, P2 = Away, both keypads are same) + +OFFENSIVE [1 [2 [3 DEFENSIVE + ACTION HB] FB] ST] ACTION + +[SCRAM/ [SCORE] [4 [5 [6 [PURSUE] + EVADE] FL] WR] TE] + +[PASS OUT/ [TIME [7] [8 [9] [GO FOR + RUN OUT] OUT] SE] TURNOVER] + +[CHECK OFF [REPLAY] [YES/ [0 [NO/ + TO BACK] ENTER] DEMO] CANCEL] + +*/ + +static INPUT_PORTS_START( talkingfb ) + PORT_START("IN.0") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Pursue") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Scram / Evade") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Pass Out / Run Out") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Check Off To Back") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pursue") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Scram / Evade") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Pass Out / Run Out") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("P1 Check Off To Back") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Go For Turnover") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Time Out") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Replay") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Go For Turnover") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Time Out") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("P1 Replay") + + PORT_START("IN.2") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P2 1 / HB") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P2 4 / FL") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P2 7") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("P1 1 / HB") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("P1 4 / FL") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("P1 7") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") + + PORT_START("IN.3") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P2 2 / FB") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P2 5 / WR") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P2 8 / SE") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P2 0 / Demo") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("P1 2 / FB") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("P1 5 / WR") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("P1 8 / SE") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("P1 0 / Demo") + + PORT_START("IN.4") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P2 3 / ST") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P2 6 / TE") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P2 9") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("P1 3 / ST") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("P1 6 / TE") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("P1 9") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void talkingfb_state::talkingfb(machine_config &config) +{ + /* basic machine hardware */ + I80C31(config, m_maincpu, 12_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &talkingfb_state::main_map); + m_maincpu->set_addrmap(AS_IO, &talkingfb_state::main_io); + m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); + m_maincpu->port_out_cb<3>().set(FUNC(talkingfb_state::bank_w)); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( talkingfb ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD("sp17492-001", 0x0000, 0x40000, CRC(d03851c6) SHA1(e8ac9c342bee987657c3c18f24d466b3906d6fb0) ) // Sharp LH532378 +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1989, talkingfb, 0, 0, talkingfb, talkingfb, talkingfb_state, empty_init, "Parker Brothers", "Superstar Lineup Talking Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/tispeak.cpp b/src/mame/handheld/tispeak.cpp new file mode 100644 index 00000000000..667647474f1 --- /dev/null +++ b/src/mame/handheld/tispeak.cpp @@ -0,0 +1,1909 @@ +// license:BSD-3-Clause +// copyright-holders:hap, Jonathan Gevaryahu +// thanks-to:Sean Riddle, David Viens, Kevin Horton +/*************************************************************************** + + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** + + Texas Instruments 1st-gen. handheld speech devices. + + These devices, mostly edu-toys, are based around an MCU(TMS0270/TMS1100), + TMS51xx speech, and VSM ROM(s). Newer devices, such as Speak & Music, + are based around the TMP50C40 and belong in another driver, probably. + + note: except for tntell, MAME external artwork is not required. But it + is objectively a large improvement. + +---------------------------------------------------------------------------- + +Known devices on this hardware: (* denotes not dumped) + + +ROM (and/or source) code obtained from patents: +Some of these may have pre-release bugs. + + Speak & Spell: US4189779 + Speak & Math: US4946391 + Touch & Tell: US4403965, EP0048835A2 (patent calls it "Speak & Seek") + Language Translator: US4631748 + + +Speak & Spell: + +This is the original Speak & Spell. TI had done educational toys before, like +Wiz-A-Tron or Little Professor. But the popularity of this product was much +above expectations. TI continued to manufacture many products for this line. + + Speak & Spell (US), 1978 + - MCU: TMC0271, label TMC0271NL DBS (die label 0271B T0270B) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB TMC0351NL + - VSM(2/2): 16KB TMC0352NL + - VFD: NEC FIP8A5AR no. 3A + - notes: keyboard has buttons instead of cheap membrane + + Speak & Spell (US), 1979 + - MCU: TMC0271, label TMC0271H-N2L FDS (die label 0271H T0270D) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB TMC0351N2L + - VSM(2/2): 16KB TMC0352N2L + - notes: fixed a funny bug with gibberish-talk when Module button is pressed + with no module inserted, MCU ROM contents differs from 1978 version + + Speak & Spell (US), 1980 + - MCU: same as 1979 version + - TMS51xx: TMC0281D + - VSM: 16KB CD2350(rev.A) + - notes: only 1 VSM, meaning much smaller internal vocabulary + + Speak & Spell (Japan), 1980 + - MCU: TMC0271 (assume same as US 1979 version) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2321 + - VSM(2/2): 16KB CD2322 + - notes: no local name for the product, words are in English but very low difficulty + + Speak & Spell (UK), 1978 + - MCU: TMC0271 (assume same as US 1978 version) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2303 + - VSM(2/2): 16KB CD2304 + - notes: voice data was manually altered to give it a UK accent, + here's a small anecdote from developer: + "(...) I cannot bear to listen the product even now. I remember the + word 'butcher' took 3 days - I still don't know if it sounds right." + + Speak & Spell (UK), 1981 + - MCU: TMC0271 (assume same as US 1979 version) + - TMS51xx: CD2801 + - VSM: 16KB CD62175 + - VFD: some seen with the one from Speak & Math(!) + - notes: this one has a dedicated voice actor + + Speak & Spell (Spanish, prototype), 1981 + - MCU: CD2701N2L P (die label T0270D 2701) + - TMS51xx: TMC0281 + - VSM(1/2): 16KB CD2319 + - VSM(2/2): 16KB CD2320 + - VFD: 8 digits with 14 segments, DP and accent mark + + Speak & Spell (France) "La Dictée Magique", 1980 + - MCU: CD2702, label CD2702AN2L (die label TMC0270F 2702A) + - TMS51xx: CD2801 + - VSM: 16KB CD2352 + + Speak & Spell (Germany) "Buddy", 1980 + - MCU & TMS51xx: same as French 1980 version + - VSM(1/2): 16KB CD2345* + - VSM(2/2): 16KB CD2346* + + Speak & Spell (Italy) "Grillo Parlante", 1982 + - MCU & TMS51xx: same as French 1980 version + - VSM: 16KB CD62190 + - VFD: same as Speak & Math + - notes: it appears that TI ran out of original snspell VFDs in the early 80s? + + Speak & Spell Compact (US), 1981 + - MCU: CD8011, label CD8011A-NL (die label 1100B) + - TMS51xx: TMC0281D + - VSM: 16KB CD2354, CD2354(rev.A) + - notes: no display, MCU is TMS1100 instead of TMS0270, overall similar to Touch & Tell + + Speak & Spell Compact (UK) "Speak & Write", 1981 + - MCU: same as US 1981 version + - TMS51xx: CD2801A + - VSM: 16KB CD62174(rev.A) + - notes: BTANB: gibberish when the module button is pressed (with module present), + anecdotes from the developer, the same person working on the original UK version: + "We included a pencil and writing pad - it was now about 'writing'.", + and one about the welcome message: + "I had to manually create a sentence of digital speech from thin air. + I had to write down a 20 character code which would create each 10/s + sound bite that made up the phrase "Welcome to Speak and Write". + It took me 1 week. (...) Even Larry Brantingham was amazed." + +Speak & Spell modules: +Note that they are interchangeable, eg. you can use a French module on a US Speak & Spell. + + English: + - Vowel Power: VSM: 16KB CD2302 + - Number Stumpers 4-6: VSM: 16KB CD2305 + - Number Stumpers 7-8: VSM: 16KB CD2307(rev.A) + - Basic Builders: VSM: 16KB CD2308 + - Mighty Verbs: VSM: 16KB CD2309(rev.B) + - Homonym Heroes: VSM: 16KB CD2310 + - Vowel Ventures: VSM: 16KB CD2347(rev.C) + - Noun Endings: VSM: 16KB CD2348 + - Magnificent Modifiers: VSM: 16KB CD2349 + - E.T. Fantasy: VSM: 16KB CD2360 + + French: + - No.1: Les Mots de Base: VSM: 16KB CD2353 (1st release was called "Module No. 1 de Jacques Capelovici") + - No.2: Les Mots Difficiles (aka Les Mots de Base): VSM: 16KB CD62177A + - No.3: Les Animaux Familiers: VSM: 16KB? CD62047* + - No.4: Les Magasins de la Rue: VSM: 16KB CD62048 + - No.5: Les Extra-Terrestres: VSM: 16KB? CD62178* + + Italian: + - Super Modulo: VSM: 16KB? CD62313* + + +Speak & Math: + + Speak & Math (US), 1980 (renamed to "Speak & Maths" in UK, but is the same product) + - MCU: CD2704, label CD2704B-N2L (die label TMC0270F 2704B) - 2nd revision?(mid-1982) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2392 + - VSM(2/2): 16KB CD2393 + - VFD: Futaba 9SY -02Z 7E + - notes: As with the Speak & Spell, the voice actor was a radio announcer. + However, the phrase "is greater than or less than" had to be added by one + of the TI employees in a hurry, the day before a demo. Apparently QA + never found out and it ended up in the final product. + + Speak & Math (US), 1986 + - MCU: CD2708, label CD2708N2L (die label TMC0270F 2708A) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2381 + - VSM(2/2): 4KB CD2614 + + Speak & Math 'Compact' (France) "Les Maths Magiques", 1986? + - MCU: CP3447-NL* (TMS1100?) + - TMS51xx: CD2801 + - VSM: 16KB? CD62173* + - notes: this is not the same as "Le Calcul Magique", that's from a + series centered around a TMS50C40 instead of MCU+TMS51xx + + +Speak & Read: + + Speak & Read (US), 1980 + - MCU: CD2705, label CD2705B-N2L (die label TMC0270E 2705B) - 2nd revision?(late-1981) + - TMS51xx: CD2801 + - VSM(1/2): 16KB CD2394(rev.A) + - VSM(2/2): 16KB CD2395(rev.A) + - VFD: same as Language Tutor, rightmost digit unused + +Speak & Read modules: + + English: + - Sea Sights: VSM: 16KB CD2396(rev.A) + - Who's Who at the Zoo: VSM: 16KB CD2397 + - A Dog on a Log: VSM: 16KB CD3534(rev.A) + - The Seal That Could Fly: VSM: 16KB CD3535 + - A Ghost in the House: VSM: 16KB CD3536 + - On the Track: VSM: 16KB CD3538 + - The Third Circle: VSM: 16KB CD3539 + - The Millionth Knight: VSM: 16KB CD3540 + + +Touch & Tell: + + Touch & Tell (US), 1981 + - MCU: CD8012, label CD8012NL (die label 1100G CD8012) + - TMS51xx: CD2802 + - VSM: 4KB CD2610 + - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices + too, maybe an earlier version? + + Touch & Tell (UK), 1981 + - MCU & TMS51xx: same as US version + - VSM: 16KB CD62170 + + Touch & Tell (France) "Le Livre Magique", 1981 + - MCU & TMS51xx: same as US version + - VSM: 16KB CD62171 + + Touch & Tell (Germany) "Tipp & Sprich", 1981 + - MCU & TMS51xx: same as US version + - VSM: ?KB CD62172* + + Touch & Tell (Italy) "Libro Parlante", 1982 + - MCU & TMS51xx: same as US version + - VSM: ?KB CD62176* + + Vocaid (US), 1982 + - MCU & TMS51xx: same as Touch & Tell (US) + - VSM: 16KB CD2357 + - notes: MCU is the same as in Touch & Tell, but instead of a toddler's toy, + you get a serious medical aid device for the voice-impaired. The PCB is + identical, it includes the edge connector for modules but no external slot. + +Touch & Tell modules: + + English: + - Alphabet Fun: VSM: 4KB CD2611 + - Animal Friends: VSM: 16KB CD2355 + - Number Fun: VSM: 4KB CD2612*, CD2612(rev.A) + - All About Me: VSM: 4KB CD2613 + - World of Transportation: VSM: 16KB CD2361 + - Little Creatures: VSM: 16KB CD2362 + - E.T.: VSM: 16KB CD2363 + +Touch & Tell/Vocaid overlay reference: + + tntell CD2610: + - $04: a - Colors + - $01: b - Objects + - $05: c - Shapes + - $09: d - Home Scene + tntelluk CD62170, tntellfr CD62171: + - see tntell + - see numfun(not A) + - see animalfr + - $08: ? - Clown Face + - $0B: ? - Body Parts + vocaid CD2357: + - $1C: 1 - Leisure + - $1E: 2 - Telephone + - $1B: 3 - Bedside + - $1D: 4 - Alphabet + alphabet CD2611: + - $0E: 1a - Alphabet A-M + - $0D: 1b - Alphabet N-Z + - $0C: 1c - Letter Jumble A-M + - $0B: 1d - Letter Jumble N-Z + animalfr CD2355: + - $0A: 2a - Farm Animals + - $0F: 2b - At The Farm + - $0E: 2c - Animal Babies + - $0D: 2d - In The Jungle + numfun CD2612: + - $02/$0A(rev.A): 3a - Numbers 1-10 + - $03/$0F(rev.A): 3b - Numbers 11-30 + - $07/$0D(rev.A): 3c - How Many? + - $06/$0E(rev.A): 3d - Hidden Numbers + aboutme CD2613: + - $0E: 4a - Clown Face + - $0B: 4b - Body Parts + - $0D: 4c - Things to Wear + - $0C: 4d - Just For Me + wot CD2361: + - $0A: 5a - On Land + - $0B: 5b - In The Air + - $0C: 5c - On The Water + - $0D: 5d - In Space + - $10: 5e - What Belongs Here? + - $11: 5f - How It Used To Be + - $12: 5g - Word Fun + - $13: 5h - In the Surprise Garage + lilcreat CD2362: + - $14: 6a - In The Park + - $15: 6b - In The Sea + - $16: 6c - In The Woods + - $17: 6d - Whose House? + - $18: 6e - Hide & Seek + - $1A: 6f - Who Is It? + - $19: 6g - But It's Not + - $1B: 6h - Word Fun + et CD2363: + - $0F: 7a - The Adventure On Earth I + - $10: 7b - The Adventure On Earth II + - $11: 7c - Fun And Friendship I + - $12: 7d - Fun And Friendship II + - $13: 7e - E.T. The Star I + - $14: 7f - E.T. The Star II + - $15: 7g - Do You Remember? I + - $16: 7h - Do You Remember? II + + $00: none inserted, and $1F is for diagnostics + + +Magic Wand "Speaking Reader" or "Speak & Learn": + +Limited release barcode reader text-to-speech device, meant for children. +The text is coded as phonemes. Books were sold separately. + + Magic Wand "Speaking Reader" (US), 1982 + - MCU: C14007* (TMS1400?) + - TMS5220 + - VSM: 4KB? CD2228* + + Magic Wand "Speak & Learn" (US), 1983 + - notes: same hardware + + +Language Tutor/Translator: + +A later device, called Language Teacher, was released without speech hardware. + + Language Tutor (US), 1978 + - MCU: TMC0275* + - TMS51xx: CD2801 + - VFD: NEC FIP10xxx? + - notes: external module is required (see below) + +Language Tutor modules: + + - Ingles(1/4): VSM: 16KB CD2311 + - Ingles(2/4): VSM: 16KB CD2312 + - Ingles(3/4): VSM: 16KB CD2313 + - Ingles(4/4): VSM: 16KB CD2314 + + - Spanish(1/4): VSM: 16KB CD2315 + - Spanish(2/4): VSM: 16KB CD2316 + - Spanish(3/4): VSM: 16KB CD2317 + - Spanish(4/4): VSM: 16KB CD2318 + + - French(1/4): VSM: 16KB CD2327 + - French(2/4): VSM: 16KB CD2328 + - French(3/4): VSM: 16KB CD2329 + - French(4/4): VSM: 16KB CD2330 + + - German(1/4): VSM: 16KB CD2331 + - German(2/4): VSM: 16KB CD2332 + - German(3/4): VSM: 16KB CD2333 + - German(4/4): VSM: 16KB CD2334 + + - English(1/4): VSM: 16KB CD3526 + - English(2/4): VSM: 16KB CD3527 + - English(3/4): VSM: 16KB CD3528 + - English(4/4): VSM: 16KB CD3529 + + +Other manufacturers: + +Tiger Electronics K28 (model 7-232) Sold in Hong Kong, distributed in US as: +- Coleco: Talking Teacher +- Sears: Talkatron - Learning Computer + +1981 K28 models 7-230 and 7-231 are on different hardware, showing a different +keyboard, VFD display, and use the SC-01 speech chip. --> driver k28.cpp + + K28 model 7-232 (HK), 1985 + - MCU: TMS1400 MP7324 + - TMS51xx: TMS5110A + - VSM: 16KB CM62084 + - LCD: SMOS SMC1112 MCU to 8*14-seg display + +K28 modules: + + - Spelling I: VSM: 16KB CM62086 + - Spelling II: VSM: 16KB CM62085? + - Spelling III: VSM: 16KB CM62087 + - Expansion Module 1: VSM: 16KB CM62214? - assumed same VSM as CM62086 + - Expansion Module 2: VSM: 16KB CM62216 - assumed same VSM as the one in Spelling II + - Expansion Module 3: VSM: 16KB CM62215 - same VSM as CM62087 + - Expansion Module 4: VSM: 16KB CM62217 + - Expansion Module 5: VSM: 16KB CM62218* + - Expansion Module 6: VSM: 16KB CM62219 + + note: these won't work on the 1981 version(s) + +---------------------------------------------------------------------------- + + TODO: + - why doesn't lantutor work? + - emulate k28 LCD + - emulate other known devices + + +Dick Smith catalog numbers, taken from advertisements: + +X-1300, Y-1300 : T.I. Speak & Spell +X-1301 : Super Stumper 1 (for Speak & Spell) +X-1302 : Super Stumper 2 (for Speak & Spell) +X-1305 : Vowell Power (for Speak & Spell) +Y-1310 : T.I. Speak & Math +Y-1313 : T.I. Speak & Read +Y-1320 : T.I. Dataman + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "bus/generic/carts.h" +#include "bus/generic/slot.h" +#include "machine/timer.h" +#include "machine/tms6100.h" +#include "sound/tms5110.h" +#include "softlist_dev.h" +#include "speaker.h" +#include "render.h" + +// internal artwork +#include "k28m2.lh" +#include "snmath.lh" +#include "snread.lh" +#include "snspell.lh" +#include "snspellsp.lh" +#include "tntell.lh" // keyboard overlay + +namespace { + +// The master clock is a single stage RC oscillator into TMS5100 RCOSC: +// In an early 1979 Speak & Spell, C is 68pf, R is a 50kohm trimpot which is set to around 33.6kohm +// (measured in-circuit). CPUCLK is this osc freq /2, ROMCLK is this osc freq /4. +// The typical osc freq curve for TMS5100 is unknown. Let's assume it is set to the default frequency, +// which is 640kHz for 8KHz according to the TMS5100 documentation. + +#define MASTER_CLOCK 640000 + + +class tispeak_state : public hh_tms1k_state +{ +public: + tispeak_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_tms5100(*this, "tms5100"), + m_tms6100(*this, "tms6100"), + m_cart(*this, "cartslot"), + m_ol_out(*this, "ol%u", 1U) + { } + + void init_snspell(); + void init_tntell(); + void init_lantutor(); + + // machine configs + void tms5110_route(machine_config &config); + void sns_tmc0281(machine_config &config); + void sns_tmc0281d(machine_config &config); + void sns_cd2801(machine_config &config); + void snspellit(machine_config &config); + void snspellsp(machine_config &config); + void snspellc(machine_config &config); + void snspellcuk(machine_config &config); + void snmath(machine_config &config); + void snread(machine_config &config); + void tntell(machine_config &config); + void vocaid(machine_config &config); + void lantutor(machine_config &config); + void k28m2(machine_config &config); + +private: + virtual void power_off() override; + void update_display(); + + u8 snspell_read_k(); + void snmath_write_o(u16 data); + void snspell_write_o(u16 data); + void snspell_write_r(u16 data); + void lantutor_write_r(u16 data); + + u8 snspellc_read_k(); + void snspellc_write_o(u16 data); + void snspellc_write_r(u16 data); + u8 tntell_read_k(); + + void k28_update_display(u8 old, u8 data); + u8 k28_read_k(); + void k28_write_o(u16 data); + void k28_write_r(u16 data); + + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); + + u8 tntell_get_hexchar(const char c); + TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay); + + void init_cartridge(); + + virtual void machine_start() override; + + // devices + required_device m_tms5100; + required_device m_tms6100; + optional_device m_cart; + + output_finder<5> m_ol_out; + + // cartridge + u32 m_cart_max_size = 0; + u8 *m_cart_base = nullptr; + + u8 m_overlay = 0; +}; + +void tispeak_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + m_ol_out.resolve(); + init_cartridge(); +} + + + +/*************************************************************************** + + Cartridge Handling + +***************************************************************************/ + +void tispeak_state::init_cartridge() +{ + if (m_cart != nullptr && m_cart->exists()) + { + std::string region_tag; + memory_region *src = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); + if (src) + memcpy(m_cart_base, src->base(), src->bytes()); + } +} + +DEVICE_IMAGE_LOAD_MEMBER(tispeak_state::cart_load) +{ + u32 size = m_cart->common_get_size("rom"); + + if (size > m_cart_max_size) + { + image.seterror(image_error::INVALIDIMAGE, "Invalid file size"); + return image_init_result::FAIL; + } + + m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); + m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); + + return image_init_result::PASS; +} + + +void tispeak_state::init_snspell() +{ + m_cart_max_size = 0x4000; + m_cart_base = memregion("tms6100")->base() + 0x8000; +} + +void tispeak_state::init_tntell() +{ + m_cart_max_size = 0x4000; + m_cart_base = memregion("tms6100")->base() + 0x4000; +} + +void tispeak_state::init_lantutor() +{ + m_cart_max_size = 0x10000; + m_cart_base = memregion("tms6100")->base(); +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +// common/snspell + +void tispeak_state::power_off() +{ + hh_tms1k_state::power_off(); + m_tms5100->reset(); +} + +void tispeak_state::update_display() +{ + u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; + m_display->matrix(m_grid & gridmask, m_plate); +} + +void tispeak_state::snspell_write_r(u16 data) +{ + // R13: power-off request, on falling edge + if (~data & m_r & 0x2000) + power_off(); + + // R0-R7: input mux and select digit (+R8 if the device has 9 digits) + // R15: filament on + // other bits: MCU internal use + m_r = m_inp_mux = data; + m_grid = data & 0x81ff; + update_display(); +} + +void tispeak_state::snspell_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and AP as d15: + // note: lantutor and snread VFD has an accent triangle instead of DP, and no AP + // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK) + m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); + update_display(); +} + +u8 tispeak_state::snspell_read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[8]->read() | read_inputs(8); +} + + +// snmath specific + +void tispeak_state::snmath_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and CT as d15: + // [DP],D,C,H,F,B,I,M,L,K,N,J,[CT],E,G,A (sidenote: TI KLMN = MAME MLNK) + m_plate = bitswap<16>(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15); + update_display(); +} + + +// lantutor specific + +void tispeak_state::lantutor_write_r(u16 data) +{ + // same as default, except R13 is used for an extra digit + m_r = m_inp_mux = data; + m_grid = data & 0xa1ff; + update_display(); +} + + +// snspellc specific + +void tispeak_state::snspellc_write_r(u16 data) +{ + // R10: TMS5100 PDC pin + m_tms5100->pdc_w(data >> 10 & 1); + + // R9: power-off request, on falling edge + if (~data & m_r & 0x200) + power_off(); + + // R0-R8: input mux + m_r = m_inp_mux = data; +} + +void tispeak_state::snspellc_write_o(u16 data) +{ + // O3210: TMS5100 CTL8124 + m_tms5100->ctl_w(bitswap<4>(data,3,0,1,2)); + m_o = data; +} + +u8 tispeak_state::snspellc_read_k() +{ + // K4: TMS5100 CTL1 + u8 k4 = m_tms5100->ctl_r() << 2 & 4; + + // K: multiplexed inputs (note: the Vss row is always on) + return k4 | m_inputs[9]->read() | read_inputs(9); +} + + +// tntell specific + +u8 tispeak_state::tntell_read_k() +{ + // K8: overlay code from R5,O4-O7 + u8 k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0; + + // rest is same as snpellc + return k8 | snspellc_read_k(); +} + +u8 tispeak_state::tntell_get_hexchar(const char c) +{ + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + + return 0; +} + +TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) +{ + // Each keyboard overlay insert has 5 holes, used by the game to determine + // which one is active(if any). If it matches with the internal ROM or + // external module, the game continues. + + // pick overlay code from machine config, see comment section above for reference + m_overlay = m_inputs[10]->read(); + + // try to get it from (external) layout + if (m_overlay == 0x20) + { + // as output value, eg. with defstate (in decimal) + m_overlay = output().get_value("overlay_code") & 0x1f; + + // and from current view name ($ + 2 hex digits) + render_target *target = machine().render().first_target(); + const char *name = target->view_name(target->view()); + + for (int i = 0; name && i < strlen(name); i++) + if (name[i] == '$' && strlen(&name[i]) > 2) + m_overlay = (tntell_get_hexchar(name[i + 1]) << 4 | tntell_get_hexchar(name[i + 2])) & 0x1f; + } + + // overlay holes + for (int i = 0; i < 5; i++) + m_ol_out[i] = BIT(m_overlay, i); +} + + +// k28 specific + +void tispeak_state::k28_update_display(u8 old, u8 data) +{ + // ? +} + +void tispeak_state::k28_write_r(u16 data) +{ + // R1234: TMS5100 CTL8421 + u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f); + m_tms5100->ctl_w(r & 0xf); + + // R0: TMS5100 PDC pin + m_tms5100->pdc_w(data & 1); + + // R5: input mux high bit + m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100); + + // R6: power-off request, on falling edge + if (~data & m_r & 0x40) + power_off(); + + // R7-R10: LCD data + k28_update_display(m_r >> 7 & 0xf, data >> 7 & 0xf); + m_r = r; +} + +void tispeak_state::k28_write_o(u16 data) +{ + // O0-O7: input mux low + m_inp_mux = (m_inp_mux & ~0xff) | data; +} + +u8 tispeak_state::k28_read_k() +{ + // K: TMS5100 CTL, multiplexed inputs (also tied to R1234) + return m_tms5100->ctl_r() | read_inputs(9) | (m_r & 0xf); +} + + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +static INPUT_PORTS_START( snspell ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module Select") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue") + + PORT_START("IN.8") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mystery Word") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellfr ) // French button names + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module 2") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Efface") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Essaie") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME(u8"Arrét") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME(u8"Départ") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Rejoue") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repete") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aide") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mot Mystere") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Code Secret") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Lettre") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Dis-le") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellit ) // Italian button names + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Moduli") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Cancella") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Controllo") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Stop") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Via") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Ritorno") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Replica") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aiuto") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Indovina") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Codice") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Alfabeto") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Ripeti") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabet + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("CH") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("LL") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME(u8"Ñ") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("RR") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Entra") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_NAME("Acento") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Listo") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Programa") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Borra") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Repite") + + PORT_START("IN.8") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Otra Vez") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Palabra Secreta") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Dilo") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + + +static INPUT_PORTS_START( snmath ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("<") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME(">") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Repeat") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Mix It") + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Number Stumper") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + + PORT_START("IN.7") + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.8") + PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( snread ) + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.7") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Word Zapper") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Word Maker") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Read It") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Picture Read") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter Stumper") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Hear It") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) +INPUT_PORTS_END + + +static INPUT_PORTS_START( lantutor ) + PORT_INCLUDE( snspell ) + + PORT_MODIFY("IN.5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Diacritical") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Space") + + PORT_MODIFY("IN.6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") + + PORT_MODIFY("IN.8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Translate") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Learn") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Phrase") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Link") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Repeat") +INPUT_PORTS_END + + +static INPUT_PORTS_START( snspellc ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Stumper") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Review") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + + PORT_START("IN.9") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off +INPUT_PORTS_END + +static INPUT_PORTS_START( snspellcuk ) + PORT_INCLUDE( snspellc ) + + PORT_MODIFY("IN.9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) // just the label changed from Spell to Write +INPUT_PORTS_END + + +static INPUT_PORTS_START( tntell ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Grid 1-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Grid 1-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Grid 1-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Grid 1-3") + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 2-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 2-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 2-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 2-3") + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 3-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 3-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 3-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 3-3") + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Grid 4-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 4-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 4-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 4-3") + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 5-1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 5-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 5-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 5-3") + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 5-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Grid 6-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 5-5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // overlay code + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 3-5") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 2-5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 4-5") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Grid 1-5") + + PORT_START("IN.7") // R7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 3-6") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 2-6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Grid 4-6") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Grid 1-6") + + PORT_START("IN.8") // R8 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Grid 6-2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Grid 6-4") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Grid 6-3") + + PORT_START("IN.9") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.10") + PORT_CONFNAME( 0x3f, 0x20, "Overlay Code" ) + PORT_CONFSETTING( 0x20, "From Artwork View" ) + PORT_CONFSETTING( 0x00, "$00 (None)" ) + PORT_CONFSETTING( 0x01, "$01" ) + PORT_CONFSETTING( 0x02, "$02" ) + PORT_CONFSETTING( 0x03, "$03" ) + PORT_CONFSETTING( 0x04, "$04" ) + PORT_CONFSETTING( 0x05, "$05" ) + PORT_CONFSETTING( 0x06, "$06" ) + PORT_CONFSETTING( 0x07, "$07" ) + PORT_CONFSETTING( 0x08, "$08" ) + PORT_CONFSETTING( 0x09, "$09" ) + PORT_CONFSETTING( 0x0a, "$0A" ) + PORT_CONFSETTING( 0x0b, "$0B" ) + PORT_CONFSETTING( 0x0c, "$0C" ) + PORT_CONFSETTING( 0x0d, "$0D" ) + PORT_CONFSETTING( 0x0e, "$0E" ) + PORT_CONFSETTING( 0x0f, "$0F" ) + PORT_CONFSETTING( 0x10, "$10" ) + PORT_CONFSETTING( 0x11, "$11" ) + PORT_CONFSETTING( 0x12, "$12" ) + PORT_CONFSETTING( 0x13, "$13" ) + PORT_CONFSETTING( 0x14, "$14" ) + PORT_CONFSETTING( 0x15, "$15" ) + PORT_CONFSETTING( 0x16, "$16" ) + PORT_CONFSETTING( 0x17, "$17" ) + PORT_CONFSETTING( 0x18, "$18" ) + PORT_CONFSETTING( 0x19, "$19" ) + PORT_CONFSETTING( 0x1a, "$1A" ) + PORT_CONFSETTING( 0x1b, "$1B" ) + PORT_CONFSETTING( 0x1c, "$1C" ) + PORT_CONFSETTING( 0x1d, "$1D" ) + PORT_CONFSETTING( 0x1e, "$1E" ) + PORT_CONFSETTING( 0x1f, "$1F (Diagnostic)" ) +INPUT_PORTS_END + + +static INPUT_PORTS_START( k28m2 ) + PORT_START("IN.0") // O0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A/1") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J/0") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + + PORT_START("IN.1") // O1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + + PORT_START("IN.2") // O2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Repeat") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C/3") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('L') PORT_NAME("L/-") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.3") // O3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Prompt") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D/4") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('M') PORT_NAME(u8"M/×") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + + PORT_START("IN.4") // O4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E/5") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('N') PORT_NAME(u8"N/÷") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + + PORT_START("IN.5") // O5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("Module") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F/6") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + + PORT_START("IN.6") // O6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Select") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G/7") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + + PORT_START("IN.7") // O7 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.8") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I/9") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") +INPUT_PORTS_END + + + +/*************************************************************************** + + Machine Config + +***************************************************************************/ + +void tispeak_state::tms5110_route(machine_config &config) +{ + // sound hardware + m_tms5100->m0().set(m_tms6100, FUNC(tms6100_device::m0_w)); + m_tms5100->m1().set(m_tms6100, FUNC(tms6100_device::m1_w)); + m_tms5100->addr().set(m_tms6100, FUNC(tms6100_device::add_w)); + m_tms5100->data().set(m_tms6100, FUNC(tms6100_device::data_line_r)); + m_tms5100->romclk().set(m_tms6100, FUNC(tms6100_device::clk_w)); + m_tms5100->add_route(ALL_OUTPUTS, "mono", 0.5); +} + +void tispeak_state::snmath(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r)); + + m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r)); + m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w)); + m_maincpu->write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0x21ff, 0x3fff); + config.set_default_layout(layout_snmath); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + CD2801(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + + +void tispeak_state::sns_cd2801(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + + config.set_default_layout(layout_snspell); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snspell"); +} + +void tispeak_state::snspellit(machine_config &config) +{ + sns_cd2801(config); + + // basic machine hardware + config.set_default_layout(layout_snmath); +} + +void tispeak_state::sns_tmc0281(machine_config &config) +{ + sns_cd2801(config); + + // sound hardware + TMC0281(config.replace(), m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + +void tispeak_state::snspellsp(machine_config &config) +{ + sns_tmc0281(config); + + // basic machine hardware + config.set_default_layout(layout_snspellsp); +} + +void tispeak_state::sns_tmc0281d(machine_config &config) +{ + sns_cd2801(config); + + // sound hardware + TMC0281D(config.replace(), m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + + +void tispeak_state::snread(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + + config.set_default_layout(layout_snread); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snread", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snread"); +} + + +void tispeak_state::lantutor(machine_config &config) +{ + snmath(config); + + // basic machine hardware + m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::lantutor_write_r)); + + config.set_default_layout(layout_snread); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "lantutor", "vsm,bin"); + m_cart->set_must_be_loaded(true); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("lantutor"); +} + + +void tispeak_state::snspellc(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::snspellc_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); + + // no visual feedback! + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + TMC0281D(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("snspell"); +} + +void tispeak_state::snspellcuk(machine_config &config) +{ + snspellc(config); + + // sound hardware + CD2801(config.replace(), m_tms5100, MASTER_CLOCK); // CD2801A! + tms5110_route(config); +} + + +void tispeak_state::vocaid(machine_config &config) +{ + // basic machine hardware + TMS1100(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::tntell_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); + + TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50)); + config.set_default_layout(layout_tntell); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + CD2802(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); +} + +void tispeak_state::tntell(machine_config &config) +{ + vocaid(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tntell", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("tntell"); +} + + +void tispeak_state::k28m2(machine_config &config) +{ + // basic machine hardware + TMS1400(config, m_maincpu, MASTER_CLOCK/2); + m_maincpu->k().set(FUNC(tispeak_state::k28_read_k)); + m_maincpu->o().set(FUNC(tispeak_state::k28_write_o)); + m_maincpu->r().set(FUNC(tispeak_state::k28_write_r)); + + config.set_default_layout(layout_k28m2); + + // sound hardware + TMS6100(config, m_tms6100, MASTER_CLOCK/4); + + SPEAKER(config, "mono").front_center(); + TMS5110A(config, m_tms5100, MASTER_CLOCK); + tms5110_route(config); + + // cartridge + GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "k28m2", "vsm"); + m_cart->set_device_load(FUNC(tispeak_state::cart_load)); + + SOFTWARE_LIST(config, "cart_list").set_original("k28m2"); +} + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( snspell ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351n2l.vsm", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) + ROM_LOAD( "tmc0352n2l.vsm", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) +ROM_END + +ROM_START( snspellp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "us4189779_tmc0271", 0x0000, 0x1000, CRC(d3f5a37d) SHA1(f75ab617a6067d4d3a954a9f86126d2089554df8) ) // typed in from patent US4189779, verified by 2 sources + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version + ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " +ROM_END + +ROM_START( snspellua ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) + ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) +ROM_END + +ROM_START( snspellub ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2350a.vsm", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) +ROM_END + +ROM_START( snspelluk ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2303.vsm", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) + ROM_LOAD( "cd2304.vsm", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) +ROM_END + +ROM_START( snspelluka ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62175.vsm", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) +ROM_END + +ROM_START( snspelljp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2321.vsm", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) + ROM_LOAD( "cd2322.vsm", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) +ROM_END + +ROM_START( snspellsp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2701n2l_p", 0x0000, 0x1000, CRC(5230612a) SHA1(3ec75b207380af2efe84e865fe83ea29e79e8eea) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2701_output.pla", 0, 1246, CRC(f26980bd) SHA1(8d0c98fe5240541cb53c1e1d14c2a4560e7a7f32) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2319.vsm", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) + ROM_LOAD( "cd2320.vsm", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) +ROM_END + +ROM_START( snspellfr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) +ROM_END + +ROM_START( snspellit ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) +ROM_END + + +ROM_START( snspellc ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2354.vsm", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) +ROM_END + +ROM_START( snspellca ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2354a.vsm", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) +ROM_END + +ROM_START( snspellcuk ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd62174a.vsm", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) +ROM_END + + +ROM_START( snmath ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2704b-n2l", 0x0000, 0x1000, CRC(7e06c7c5) SHA1(d60a35a8163ab593c31afc840a0d8a9b3a762f29) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) + ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) +ROM_END + +ROM_START( snmatha ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2708-n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2381.vsm", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) + ROM_LOAD( "cd2614.vsm", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) + ROM_RELOAD( 0x5000, 0x1000 ) + ROM_RELOAD( 0x6000, 0x1000 ) + ROM_RELOAD( 0x7000, 0x1000 ) +ROM_END + +ROM_START( snmathp ) + ROM_REGION( 0x1000, "maincpu", 0 ) + // typed in from patent 4946391, verified with source code + // BTANB note: Mix It does not work at all, this is an original bug in the patent listing. There are probably other minor bugs too. + ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) + ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version + ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " +ROM_END + + +ROM_START( snread ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "cd2705b-n2l", 0x0000, 0x1000, CRC(c235636e) SHA1(57b24dd8414bf76ec786a51d10cb8a5898b60e18) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_cd2705_output.pla", 0, 1246, CRC(bf859848) SHA1(66b297fbf534968fa6db7413b99ef0e81cc35ddc) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge + ROM_LOAD( "cd2394a.vsm", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) + ROM_LOAD( "cd2395a.vsm", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) +ROM_END + + +ROM_START( lantutor ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "us4631748_tmc0275", 0x0000, 0x1000, CRC(22818845) SHA1(1a84f15fb18ca66b1f2bf7491d76fbc56068984d) ) // extracted visually from patent US4631748, verified with source code + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // not verified + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, BAD_DUMP CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // taken from snspell, mostly looks correct + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // cartridge area +ROM_END + + +ROM_START( tntell ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) +ROM_END + +ROM_START( tntelluk ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd62170.vsm", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) +ROM_END + +ROM_START( tntellfr ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd62171.vsm", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) +ROM_END + +ROM_START( tntellp ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "us4403965_cd1100", 0x0000, 0x0800, BAD_DUMP CRC(863a1c9e) SHA1(f2f9eb0ae17eedd4ef2b887b34601e75b4f6c720) ) // typed in from patent US4403965/EP0048835A2, may have errors + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) // from cd8012, matches patent source code + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_us4403965_output.pla", 0, 365, CRC(66cfb3c3) SHA1(80a05e5d729518e1f35d8f26438f56e80ffbd003) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge + ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) +ROM_END + + +ROM_START( vocaid ) + ROM_REGION( 0x0800, "maincpu", 0 ) + ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) + ROM_REGION( 365, "maincpu:opla", 0 ) + ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) + + ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // same hw as tntell, but no external slot + ROM_LOAD( "cd2357.vsm", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) +ROM_END + + +ROM_START( k28m2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(08d15ab6) SHA1(5b0f6c53e6732a362c4bb25d966d4072fdd33db8) ) + + ROM_REGION( 867, "maincpu:mpla", 0 ) + ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) + ROM_REGION( 557, "maincpu:opla", 0 ) + ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) ) + + ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge + ROM_LOAD( "cm62084.vsm", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) +ROM_END + +} // anonymous namespace + + + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1979, snspell, 0, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspellp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snspellub, snspell, 0, sns_tmc0281d, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspellua, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1978, snspelluk, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1981, snspelluka, snspell, 0, sns_cd2801, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1979, snspelljp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1981, snspellsp, snspell, 0, snspellsp, snspellsp, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Spanish, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snspellfr, snspell, 0, sns_cd2801, snspellfr, tispeak_state, init_snspell, "Texas Instruments", u8"La Dictée Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellit, snspell, 0, snspellit, snspellit, tispeak_state, init_snspell, "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1981, snspellc, 0, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellca, snspellc, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1982, snspellcuk, snspellc, 0, snspellcuk, snspellcuk, tispeak_state, init_snspell, "Texas Instruments", "Speak & Write (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1980, snmath, 0, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1986, snmatha, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +COMP( 1980, snmathp, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IS_INCOMPLETE ) + +COMP( 1980, snread, 0, 0, snread, snread, tispeak_state, init_snspell, "Texas Instruments", "Speak & Read (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) + +COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, init_lantutor, "Texas Instruments", "Language Tutor (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) + +COMP( 1981, tntell, 0, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) +COMP( 1980, tntellp, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) +COMP( 1981, tntelluk, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) +COMP( 1981, tntellfr, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1982, vocaid, 0, 0, vocaid, tntell, tispeak_state, empty_init, "Texas Instruments", "Vocaid", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) + +COMP( 1985, k28m2, 0, 0, k28m2, k28m2, tispeak_state, init_snspell, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/handheld/tispellb.cpp b/src/mame/handheld/tispellb.cpp new file mode 100644 index 00000000000..3826fcae96c --- /dev/null +++ b/src/mame/handheld/tispellb.cpp @@ -0,0 +1,452 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/*************************************************************************** + + ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** + + Texas Instruments Spelling B hardware + + The Spelling B was introduced together with the Speak & Spell. It is a + handheld educational toy with booklet. Two revisions of the hardware exist. + (* indicates not dumped) + + 1st revision: + + Spelling B (US), 1978 + - TMS0270 MCU TMC0272 (die label 0272A T0270B) + - TMS1980 MCU TMC1984 (die label 1980A 84A) + - 8-digit cyan VFD display (seen with and without apostrophe) + + Spelling ABC (UK), 1979: exact same hardware as US version + + 2nd revision: + + Spelling B (US), 1979 + - TMS0270 MCU TMC0274 + - TMC0355 4KB VSM ROM CD2602 + - 8-digit cyan VFD display + - 1-bit sound (indicated by a music note symbol on the top-right of the casing) + - note: much rarer than the 1978 version, not much luck finding one on eBay + + Spelling ABC (UK), 1979: exact same hardware as US version + + Spelling ABC (Germany), 1979: different VSM + - TMC0355 4KB VSM ROM CD2607* + + Mr. Challenger (US), 1979 + - TMS0270 MCU TMC0273 + - TMC0355 4KB VSM ROM CD2601 + - 8-digit cyan VFD display + - 1-bit sound + + Letterlogic (UK), 1980: exact same hardware as US Mr. Challenger + + Letterlogic (France), 1980: different VSM + - TMC0355 4KB VSM ROM CD2603* + + Letterlogic (Germany), 1980: different VSM + - TMC0355 4KB VSM ROM CD2604* + + +---------------------------------------------------------------------------- + + TODO: + - spellb fetches wrong word sometimes (on lv1 SPOON and ANT) - roms were doublechecked + + +***************************************************************************/ + +#include "emu.h" +#include "hh_tms1k.h" + +#include "machine/tms6100.h" +#include "speaker.h" + +// internal artwork +#include "spellb.lh" + + +class tispellb_state : public hh_tms1k_state +{ +public: + tispellb_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_tms1k_state(mconfig, type, tag), + m_subcpu(*this, "subcpu"), + m_tms6100(*this, "tms6100") + { } + + void rev1(machine_config &config); + void rev2(machine_config &config); + + virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override; + +private: + // devices + optional_device m_subcpu; + optional_device m_tms6100; + + u8 m_rev1_ctl = 0; + u16 m_sub_o = 0; + u16 m_sub_r = 0; + + virtual void power_off() override; + void power_subcpu(); + void update_display(); + + u8 main_read_k(); + void main_write_o(u16 data); + void main_write_r(u16 data); + + u8 rev1_ctl_r(); + void rev1_ctl_w(u8 data); + u8 sub_read_k(); + void sub_write_o(u16 data); + void sub_write_r(u16 data); + + void rev2_write_o(u16 data); + void rev2_write_r(u16 data); + + virtual void machine_start() override; +}; + +void tispellb_state::machine_start() +{ + hh_tms1k_state::machine_start(); + + // register for savestates + save_item(NAME(m_rev1_ctl)); + save_item(NAME(m_sub_o)); + save_item(NAME(m_sub_r)); +} + + + +/*************************************************************************** + + I/O + +***************************************************************************/ + +// common + +void tispellb_state::power_subcpu() +{ + if (m_subcpu) + m_subcpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); +} + +void tispellb_state::power_off() +{ + hh_tms1k_state::power_off(); + power_subcpu(); +} + +void tispellb_state::update_display() +{ + // almost same as snspell + u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; + m_display->matrix(m_grid & gridmask, m_plate); +} + +void tispellb_state::main_write_o(u16 data) +{ + // reorder opla to led14seg, plus DP as d14 and AP as d15, same as snspell + m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); + update_display(); +} + +void tispellb_state::main_write_r(u16 data) +{ + // R13: power-off request, on falling edge + if (~data & m_r & 0x2000) + power_off(); + + // R0-R6: input mux + // R0-R7: select digit + // R15: filament on + m_r = data; + m_inp_mux = data & 0x7f; + m_grid = data & 0x80ff; + update_display(); +} + +u8 tispellb_state::main_read_k() +{ + // K: multiplexed inputs (note: the Vss row is always on) + return m_inputs[7]->read() | read_inputs(7); +} + + +// 1st revision mcu/mcu comms + +void tispellb_state::rev1_ctl_w(u8 data) +{ + // main CTL write data + m_rev1_ctl = data & 0xf; +} + +u8 tispellb_state::sub_read_k() +{ + // sub K8421 <- main CTL3210 + return m_rev1_ctl; +} + +void tispellb_state::sub_write_o(u16 data) +{ + // sub O write data + m_sub_o = data; +} + +u8 tispellb_state::rev1_ctl_r() +{ + // main CTL3210 <- sub O6043 + return bitswap<4>(m_sub_o,6,0,4,3); +} + +void tispellb_state::sub_write_r(u16 data) +{ + // sub R: unused? + m_sub_r = data; +} + + +// 2nd revision specifics + +void tispellb_state::rev2_write_o(u16 data) +{ + // SEG DP: speaker out + m_speaker->level_w(data >> 15 & 1); + + // SEG DP and SEG AP are not connected to VFD, rest is same as rev1 + main_write_o(data & 0x6fff); +} + +void tispellb_state::rev2_write_r(u16 data) +{ + // R12: TMC0355 CS + // R4: TMC0355 M1 + // R6: TMC0355 M0 + m_tms6100->cs_w(data >> 12 & 1); + m_tms6100->m1_w(data >> 4 & 1); + m_tms6100->m0_w(data >> 6 & 1); + m_tms6100->clk_w(1); + m_tms6100->clk_w(0); + + // rest is same as rev1 + main_write_r(data); +} + + + +/*************************************************************************** + + Inputs + +***************************************************************************/ + +INPUT_CHANGED_MEMBER(tispellb_state::power_button) +{ + hh_tms1k_state::power_button(field, param, oldval, newval); + power_subcpu(); +} + +static INPUT_PORTS_START( spellb ) + PORT_START("IN.0") // R0 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') + + PORT_START("IN.2") // R2 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') + + PORT_START("IN.3") // R3 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') + + PORT_START("IN.4") // R4 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') + + PORT_START("IN.5") // R5 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Memory") PORT_CHAR('=') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Clue") PORT_CHAR('-') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") PORT_CHAR(8) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") PORT_CHAR(13) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') + + PORT_START("IN.6") // R6 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") PORT_CHAR('7') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Level") PORT_CHAR('/') + + PORT_START("IN.7") // Vss! + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter") PORT_CHAR('3') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word") PORT_CHAR('4') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble") PORT_CHAR('5') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With") PORT_CHAR('2') +INPUT_PORTS_END + + +static INPUT_PORTS_START( mrchalgr ) + PORT_INCLUDE( spellb ) // same key layout as spellb + + PORT_MODIFY("IN.5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("2nd Player") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Score") + + PORT_MODIFY("IN.7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Crazy Letters") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Guesser") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Word Challenge") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") +INPUT_PORTS_END + + + +/*************************************************************************** + + Machine Config + +***************************************************************************/ + +void tispellb_state::rev1(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); + m_maincpu->o().set(FUNC(tispellb_state::main_write_o)); + m_maincpu->r().set(FUNC(tispellb_state::main_write_r)); + m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r)); + m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w)); + + TMS1980(config, m_subcpu, 350000); // approximation + m_subcpu->k().set(FUNC(tispellb_state::sub_read_k)); + m_subcpu->o().set(FUNC(tispellb_state::sub_write_o)); + m_subcpu->r().set(FUNC(tispellb_state::sub_write_r)); + + config.set_perfect_quantum(m_maincpu); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_spellb); + + // no sound! +} + + +void tispellb_state::rev2(machine_config &config) +{ + // basic machine hardware + TMS0270(config, m_maincpu, 350000); // approximation + m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); + m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o)); + m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r)); + m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r)); + m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w)); + + TMS6100(config, m_tms6100, 350000); + m_tms6100->enable_4bit_mode(true); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(16, 16); + m_display->set_segmask(0xff, 0x3fff); + config.set_default_layout(layout_spellb); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); +} + + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( spellb ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0272nl", 0x0000, 0x1000, CRC(f90318ff) SHA1(7cff03fafbc66b0e07b3c70a513fbb0b11eef4ea) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(3e021cbd) SHA1(c9bdfe10601b8a5a70442fe4805e4bfed8bbed35) ) + + ROM_REGION( 0x1000, "subcpu", 0 ) + ROM_LOAD( "tmc1984nl", 0x0000, 0x1000, CRC(78c9c83a) SHA1(6307fe2a0228fd1b8d308fcaae1b8e856d40fe57) ) + + ROM_REGION( 1246, "subcpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "subcpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 525, "subcpu:opla", 0 ) + ROM_LOAD( "tms1980_spellb_output.pla", 0, 525, CRC(1e26a719) SHA1(eb031aa216fe865bc9e40b070ca5de2b1509f13b) ) +ROM_END + +ROM_START( spellb79 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0274n2l", 0x0000, 0x1000, CRC(98e3bd32) SHA1(e79b59ac29b0183bf1ee8d84b2944450c5e5d8fb) ) + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_spellb79_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) + + ROM_REGION( 0x1000, "tms6100", 0 ) + ROM_LOAD( "cd2602.vsm", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) +ROM_END + + +ROM_START( mrchalgr ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "tmc0273nll", 0x0000, 0x1000, CRC(ef6d23bd) SHA1(194e3b022c299e99a731bbcfba5bf8a3a9f0d07e) ) // matches patent US4421487 + + ROM_REGION( 1246, "maincpu:ipla", 0 ) + ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) + ROM_REGION( 2127, "maincpu:mpla", 0 ) + ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) + ROM_REGION( 1246, "maincpu:opla", 0 ) + ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) + + ROM_REGION( 0x1000, "tms6100", 0 ) + ROM_LOAD( "cd2601.vsm", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) +ROM_END + + + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1978, spellb, 0, 0, rev1, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) +COMP( 1979, spellb79, spellb, 0, rev2, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1979 version)", MACHINE_SUPPORTS_SAVE ) + +COMP( 1979, mrchalgr, 0, 0, rev2, mrchalgr, tispellb_state, empty_init, "Texas Instruments", "Mr. Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/wildfire.cpp b/src/mame/handheld/wildfire.cpp new file mode 100644 index 00000000000..a680974da95 --- /dev/null +++ b/src/mame/handheld/wildfire.cpp @@ -0,0 +1,212 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/******************************************************************************* + +Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen + +This is an electronic handheld pinball game. It has dozens of small leds to +create the illusion of a moving ball, and even the flippers are leds. A drawing +of a pinball table is added as overlay. + +Hardware notes: +- AMI S2150, labeled C10641 +- RC circuit for speaker volume decay (see patent US4334679 FIG.5, + the 2 resistors at A12 are 10K and the cap is 4.7uF) + +led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x: +*note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48 + + 0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6 + 1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5 + 2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4 + 3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3 + 4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6 + 5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!) + 6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5 + 7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!) + 8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3 + 9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = - + +NOTE!: MAME external artwork is required + +TODO: +- sound can be improved, volume decay should be more steep at the start, and the + pitch sounds wrong too (latter is an MCU emulation problem) + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/amis2000/amis2000.h" +#include "machine/timer.h" +#include "sound/flt_vol.h" +#include "sound/spkrdev.h" +#include "video/pwm.h" +#include "speaker.h" + +#include "wildfire.lh" + + +namespace { + +class wildfire_state : public driver_device +{ +public: + wildfire_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_display(*this, "display"), + m_speaker(*this, "speaker"), + m_volume(*this, "volume") + { } + + void wildfire(machine_config &config); + +protected: + virtual void machine_start() override; + +private: + required_device m_maincpu; + required_device m_display; + required_device m_speaker; + required_device m_volume; + + void update_display(); + void write_d(u8 data); + void write_a(u16 data); + + void speaker_update(); + TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); + double m_speaker_volume = 0.0; + + u16 m_a = 0; + u8 m_d = 0; +}; + +void wildfire_state::machine_start() +{ + // register for savestates + save_item(NAME(m_a)); + save_item(NAME(m_d)); + save_item(NAME(m_speaker_volume)); +} + + + +/******************************************************************************* + I/O +*******************************************************************************/ + +void wildfire_state::speaker_update() +{ + if (~m_a & 0x1000) + m_speaker_volume = 1.0; + + m_volume->flt_volume_set_volume(m_speaker_volume); +} + +TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim) +{ + // volume decays when speaker is off (divisor and timer period determine duration) + speaker_update(); + m_speaker_volume /= 1.0025; +} + +void wildfire_state::update_display() +{ + m_display->matrix(~m_a, m_d); +} + +void wildfire_state::write_d(u8 data) +{ + // D0-D7: led/7seg data + m_d = bitswap<8>(data,7,0,1,2,3,4,5,6); + update_display(); +} + +void wildfire_state::write_a(u16 data) +{ + // A0-A2: digit select + // A3-A11: led select + m_a = data; + update_display(); + + // A12: speaker on + speaker_update(); +} + + + +/******************************************************************************* + Input Ports +*******************************************************************************/ + +static INPUT_PORTS_START( wildfire ) + PORT_START("IN.0") // I + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + + +/******************************************************************************* + Machine Configs +*******************************************************************************/ + +// 7seg decoder table differs from default, this one is made by hand +static const u8 wildfire_7seg_table[0x10] = +{ + 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 + 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, - +}; + +void wildfire_state::wildfire(machine_config &config) +{ + // basic machine hardware + AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=? + m_maincpu->set_7seg_table(wildfire_7seg_table); + m_maincpu->read_i().set_ioport("IN.0"); + m_maincpu->write_d().set(FUNC(wildfire_state::write_d)); + m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); + m_maincpu->write_f().set(m_speaker, FUNC(speaker_sound_device::level_w)); + + // video hardware + PWM_DISPLAY(config, m_display).set_size(12, 8); + m_display->set_segmask(7, 0x7f); + m_display->set_bri_levels(0.01, 0.1); // bumpers are dimmed + config.set_default_layout(layout_wildfire); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); + + TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100)); +} + + + +/******************************************************************************* + ROM Definitions +*******************************************************************************/ + +ROM_START( wildfire ) + ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) + // Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verified with release version. + ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) + ROM_CONTINUE( 0x0600, 0x0200 ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + Drivers +*******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release diff --git a/src/mame/ibmpc/calchase.cpp b/src/mame/ibmpc/calchase.cpp deleted file mode 100644 index 5a68b845335..00000000000 --- a/src/mame/ibmpc/calchase.cpp +++ /dev/null @@ -1,763 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese, Grull Osgo, Peter Ferrie -/************************************************************************************ - -California Chase (c) 1999 The Game Room -Eggs Playing Chicken (c) 2002 The Game Room -Host Invaders (c) 1998 The Game Room - -driver by Angelo Salese & Grull Osgo - -Hardware is known as "AUSCOM System 1" hardware. - -Other games known to be on this hardware (if ever finished): -- Agro (c) The Game Room -- Tiger Odds (c) The Game Room -- one other unnamed/unfinished game - -Notes: -- calchase: type boot to load game - -TODO: -- get Win 98 to boot (most of Windows 98 copy is damaged inside current HDD dump); -- Various graphics bugs (title screen uses ROZ?); -- fix 129 Hz refresh rate bug; -- inputs (is there a service mode?) - -I/O Memo (http://bochs.sourceforge.net/techspec/PORTS.LST): -46E8 ---- 8514/A and compatible video cards (e.g. ATI Graphics Ultra) -46E8 w ROM page select -83C0-83CF ---- Compaq QVision - Line Draw Engine -83C4 ---- Compaq Qvision EISA - Virtual Controller Select -83C6-83C9 ---- Compaq Qvision EISA - DAC color registers - -43c4 is a 83c4 mirror? - -===================================================================================== - -California Chase -The Game Room, 1999 - -This is a rip off of Chase HQ running on PC hardware -and standard 15kHz arcade monitor - -Main board is a cheap Taiwanese one made by SOYO. -Model SY-5EAS -Major main board chips are.... -Cyrix 686MX-PR200 CPU -1M BIOS (Winbond 29C011) -64M RAM (2x 32M 72 pin SIMMs) -ETEQ EQ82C6617'97 MB817A0AG12 (QFP100, x2) -UT6164C32Q-6 (QFP100, x2) -ETEQ 82C6619'97 MB13J15001 (QFP208) -ETEQ 82C6618'97 MB14B10971 (QFP208) -UM61256 -PLL52C61 -SMC FD37C669QF (QFP100) -3V coin battery -3x PCI slots -4x 16-bit ISA slots -4x 72 pin RAM slots -connectors for COM1, COM2, LPT1, IDE0, IDE1, floppy etc -uses standard AT PSU - -Video card is Trident TGUI9680 with 512k on-board VRAM -Card is branded "Union UTD73" - these are all over eBay, for instance -RAM is AS4C256K16EO-50JC (x2) -Trident BIOS V5.5 (DIP28). Actual size unknown, dumped as 64k, 128k, 256k and 512k (can only be one of these sizes) -6.5536MHz xtal - -Custom JAMMA I/O board plugs into one ISA slot -Major components are... -XILINX XC3042 -Dallas DS1220Y NVRAM (dumped) -MACH210 (protected) -16MHz OSC -VGA connector (tied to VGA card with a cable) -2x 4-pin connectors for controls -AD7547 -ULN2803 -LM324 (op amp) -TDA1552 (power amp) -ST TS272 (dual op amp) -2 volume pots -power input connector (from AT PSU) -JAMMA edge connector -ISA edge connector - -HDD is WD Caviar 2170. C/H/S = 1010/6/55. Capacity = 170.6MB -The HDD is DOS-readable and in fact the OS is just Windows 98 DOS and can -be easily copied. Tested with another HDD.... formatted with DOS, copied -all files across to new HDD, boots up fine. - - -Host Invaders is the same motherboard and video card as above, but instead of an HDD, -there is a CD-ROM drive. - -************************************************************************************/ -/* -Grull Osgo - Improvements - --Changes about BIOS memory management so ROM Shadow now works properly. - The changes are: - Rom Memory Map remmapped to 128K size map(0xfffe0000, 0xffffffff).rom().region("bios", 0); - --Changes in mtxc write handler and bios_ram write handler. Now The internal register access are -compatible with chipset VIA. - (this motherboard has VIA Apollo VXPro chipset. It is not compatible with Intel i430). - With this changes now BIOS Shadow ram works fine, BIOS can relocate and decompress the full code - necesary to run the Extended Bios, POST and Boot). No more BIOS Checksum error. - -- Suppressed all video related items wich will be replaced with VGA driver. - -- Temporarily added a VGA driver that is working based on original IBM VGA BIOS.(From MESS) - (This VGA driver doesn't work yet with TRIDENT VGA BIOS as I can see). - -- Added the flag READONLY to the calchase imagen rom load function, to avoid - "DIFF CHD ERROR". - -- Minor changes and NOPS into address maps for debugging purposes. - -- Now Bios is looking for the disk (BIOS Auto detection). It seems all works fine but must be there -something wrong in the disk geometry reported by calchase.chd (20,255,63) since BIOS does not accept - 255 heads as parameter. Perhaps a bad dump? - - TODO: A lot of work to do yet!!! - -- update by peter ferrie: -- corrected memory map to 64kb blocks -- corrected access to PAM register - */ - - -#include "emu.h" - -#include "pcshare.h" - -#include "bus/isa/trident.h" -#include "cpu/i386/i386.h" -#include "machine/lpci.h" -#include "machine/pckeybrd.h" -#include "machine/idectrl.h" -#include "machine/ds128x.h" -#include "machine/nvram.h" -#include "sound/dac.h" -#include "video/pc_vga.h" - -#include "screen.h" -#include "speaker.h" - - -namespace { - -class calchase_state : public pcat_base_state -{ -public: - calchase_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - , m_iocard(*this, "IOCARD%u", 1U) - { - } - - void calchase(machine_config &config); - void hostinv(machine_config &config); - void init_calchase(); - void init_hostinv(); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - required_ioport_array<5> m_iocard; - std::unique_ptr m_bios_ram; - std::unique_ptr m_bios_ext_ram; - std::unique_ptr m_nvram_data; - uint8_t m_mtxc_config_reg[256]{}; - uint8_t m_piix4_config_reg[4][256]{}; - - uint32_t m_idle_skip_ram = 0; - void bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - void bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - uint8_t nvram_r(offs_t offset); - void nvram_w(offs_t offset, uint8_t data); - template uint16_t iocard_r(); - uint32_t calchase_idle_skip_r(); - void calchase_idle_skip_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - - void intel82439tx_init(); - void calchase_io(address_map &map); - void calchase_map(address_map &map); - - uint8_t mtxc_config_r(int function, int reg); - void mtxc_config_w(int function, int reg, uint8_t data); - uint32_t intel82439tx_pci_r(int function, int reg, uint32_t mem_mask); - void intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); - uint8_t piix4_config_r(int function, int reg); - void piix4_config_w(int function, int reg, uint8_t data); - uint32_t intel82371ab_pci_r(int function, int reg, uint32_t mem_mask); - void intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); -}; - -// Intel 82439TX System Controller (MTXC) -// TODO: change with a VIA82C585VPX (North Bridge - APOLLO Chipset) - -uint8_t calchase_state::mtxc_config_r(int function, int reg) -{ -// osd_printf_debug("MTXC: read %d, %02X\n", function, reg); - - return m_mtxc_config_reg[reg]; -} - -void calchase_state::mtxc_config_w(int function, int reg, uint8_t data) -{ -// osd_printf_debug("%s:MTXC: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); - - /* - memory banking with North Bridge: - 0x63 (PAM) xx-- ---- BIOS extension 0xe0000 - 0xeffff - --xx ---- BIOS area 0xf0000-0xfffff - ---- xx-- ISA add-on BIOS 0xc0000 - 0xcffff - ---- --xx ISA add-on BIOS 0xd0000 - 0xdffff - - 10 -> 1 = Write Enable, 0 = Read Enable - */ - - if (reg == 0x63) - { - if (data & 0x20) // enable RAM access to region 0xf0000 - 0xfffff - membank("bios_bank")->set_base(m_bios_ram.get()); - else // disable RAM access (reads go to BIOS ROM) - membank("bios_bank")->set_base(memregion("bios")->base() + 0x10000); - if (data & 0x80) // enable RAM access to region 0xe0000 - 0xeffff - membank("bios_ext")->set_base(m_bios_ext_ram.get()); - else - membank("bios_ext")->set_base(memregion("bios")->base() + 0); - } - - m_mtxc_config_reg[reg] = data; -} - -void calchase_state::intel82439tx_init() -{ - m_mtxc_config_reg[0x60] = 0x02; - m_mtxc_config_reg[0x61] = 0x02; - m_mtxc_config_reg[0x62] = 0x02; - m_mtxc_config_reg[0x63] = 0x02; - m_mtxc_config_reg[0x64] = 0x02; - m_mtxc_config_reg[0x65] = 0x02; -} - -uint32_t calchase_state::intel82439tx_pci_r(int function, int reg, uint32_t mem_mask) -{ - uint32_t r = 0; - - if(reg == 0) - return 0x05851106; // VT82C585VPX, VIA - - if (ACCESSING_BITS_24_31) - { - r |= mtxc_config_r(function, reg + 3) << 24; - } - if (ACCESSING_BITS_16_23) - { - r |= mtxc_config_r(function, reg + 2) << 16; - } - if (ACCESSING_BITS_8_15) - { - r |= mtxc_config_r(function, reg + 1) << 8; - } - if (ACCESSING_BITS_0_7) - { - r |= mtxc_config_r(function, reg + 0) << 0; - } - return r; -} - -void calchase_state::intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) -{ - if (ACCESSING_BITS_24_31) - { - mtxc_config_w(function, reg + 3, (data >> 24) & 0xff); - } - if (ACCESSING_BITS_16_23) - { - mtxc_config_w(function, reg + 2, (data >> 16) & 0xff); - } - if (ACCESSING_BITS_8_15) - { - mtxc_config_w(function, reg + 1, (data >> 8) & 0xff); - } - if (ACCESSING_BITS_0_7) - { - mtxc_config_w(function, reg + 0, (data >> 0) & 0xff); - } -} - -// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) -//TODO: change with VIA82C586B (South Bridge - APOLLO Chipset) - -uint8_t calchase_state::piix4_config_r(int function, int reg) -{ -// osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); - return m_piix4_config_reg[function][reg]; -} - -void calchase_state::piix4_config_w(int function, int reg, uint8_t data) -{ -// osd_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); - m_piix4_config_reg[function][reg] = data; -} - -uint32_t calchase_state::intel82371ab_pci_r(int function, int reg, uint32_t mem_mask) -{ - uint32_t r = 0; - - if(reg == 0) - return 0x30401106; // VT82C586B, VIA - - if (ACCESSING_BITS_24_31) - { - r |= piix4_config_r(function, reg + 3) << 24; - } - if (ACCESSING_BITS_16_23) - { - r |= piix4_config_r(function, reg + 2) << 16; - } - if (ACCESSING_BITS_8_15) - { - r |= piix4_config_r(function, reg + 1) << 8; - } - if (ACCESSING_BITS_0_7) - { - r |= piix4_config_r(function, reg + 0) << 0; - } - return r; -} - -void calchase_state::intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) -{ - if (ACCESSING_BITS_24_31) - { - piix4_config_w(function, reg + 3, (data >> 24) & 0xff); - } - if (ACCESSING_BITS_16_23) - { - piix4_config_w(function, reg + 2, (data >> 16) & 0xff); - } - if (ACCESSING_BITS_8_15) - { - piix4_config_w(function, reg + 1, (data >> 8) & 0xff); - } - if (ACCESSING_BITS_0_7) - { - piix4_config_w(function, reg + 0, (data >> 0) & 0xff); - } -} - -void calchase_state::bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (m_mtxc_config_reg[0x63] & 0x10) // write to RAM if this region is write-enabled - { - COMBINE_DATA(m_bios_ram.get() + offset); - } -} - -void calchase_state::bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (m_mtxc_config_reg[0x63] & 0x40) // write to RAM if this region is write-enabled - { - COMBINE_DATA(m_bios_ext_ram.get() + offset); - } -} - -uint8_t calchase_state::nvram_r(offs_t offset) -{ - return m_nvram_data[offset]; -} - -void calchase_state::nvram_w(offs_t offset, uint8_t data) -{ - m_nvram_data[offset] = data; -} - -template -uint16_t calchase_state::iocard_r() -{ - return m_iocard[N]->read(); -} - - -void calchase_state::calchase_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(trident_vga_device::mem_r), FUNC(trident_vga_device::mem_w)); // VGA VRAM - map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); - map(0x000c8000, 0x000cffff).noprw(); - //map(0x000d0000, 0x000d0003).ram(); // XYLINX - Sincronus serial communication - map(0x000d0004, 0x000d0005).r(FUNC(calchase_state::iocard_r<0>)); - map(0x000d000c, 0x000d000d).r(FUNC(calchase_state::iocard_r<1>)); - map(0x000d0032, 0x000d0033).r(FUNC(calchase_state::iocard_r<2>)); - map(0x000d0030, 0x000d0031).r(FUNC(calchase_state::iocard_r<3>)); // These two controls wheel pot or whatever this game uses ... - map(0x000d0034, 0x000d0035).r(FUNC(calchase_state::iocard_r<4>)); - map(0x000d0008, 0x000d000b).nopw(); // ??? - map(0x000d0024, 0x000d0025).w("ldac", FUNC(dac_word_interface::data_w)); - map(0x000d0028, 0x000d0029).w("rdac", FUNC(dac_word_interface::data_w)); - map(0x000d0800, 0x000d0fff).rw(FUNC(calchase_state::nvram_r), FUNC(calchase_state::nvram_w)); // GAME_CMOS - - map(0x000e0000, 0x000effff).bankr("bios_ext").w(FUNC(calchase_state::bios_ext_ram_w)); - map(0x000f0000, 0x000fffff).bankr("bios_bank").w(FUNC(calchase_state::bios_ram_w)); - map(0x00100000, 0x03ffffff).ram(); // 64MB - map(0x04000000, 0x28ffffff).noprw(); - //map(0x04000000, 0x040001ff).ram(); - //map(0x08000000, 0x080001ff).ram(); - //map(0x0c000000, 0x0c0001ff).ram(); - //map(0x10000000, 0x100001ff).ram(); - //map(0x14000000, 0x140001ff).ram(); - //map(0x18000000, 0x180001ff).ram(); - //map(0x20000000, 0x200001ff).ram(); - //map(0x28000000, 0x280001ff).ram(); - map(0xfffe0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ -} - -void calchase_state::calchase_io(address_map &map) -{ - pcat32_io_common(map); - //map(0x00e8, 0x00eb).noprw(); - map(0x00e8, 0x00ef).noprw(); //AMI BIOS write to this ports as delays between I/O ports operations sending al value -> NEWIODELAY - map(0x0170, 0x0177).noprw(); //To debug - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x0200, 0x021f).noprw(); //To debug - map(0x0260, 0x026f).noprw(); //To debug - map(0x0278, 0x027b).nopw();//.w(FUNC(calchase_state::pnp_config_w)); - map(0x0280, 0x0287).noprw(); //To debug - map(0x02a0, 0x02a7).noprw(); //To debug - map(0x02c0, 0x02c7).noprw(); //To debug - map(0x02e0, 0x02ef).noprw(); //To debug - map(0x02f8, 0x02ff).noprw(); //To debug - map(0x0320, 0x038f).noprw(); //To debug - map(0x03a0, 0x03a7).noprw(); //To debug - map(0x03b0, 0x03bf).rw("vga", FUNC(trident_vga_device::port_03b0_r), FUNC(trident_vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(trident_vga_device::port_03c0_r), FUNC(trident_vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(trident_vga_device::port_03d0_r), FUNC(trident_vga_device::port_03d0_w)); - map(0x03e0, 0x03ef).noprw(); //To debug - map(0x0378, 0x037f).noprw(); //To debug - // map(0x0300, 0x03af).noprw(); - // map(0x03b0, 0x03df).noprw(); - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); - map(0x03f8, 0x03ff).noprw(); // To debug Serial Port COM1: - map(0x0a78, 0x0a7b).nopw();//.w(FUNC(calchase_state::pnp_data_w)); - map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); - map(0x42e8, 0x43ef).noprw(); //To debug - map(0x43c4, 0x43cb).rw("vga", FUNC(trident_vga_device::port_43c6_r), FUNC(trident_vga_device::port_43c6_w)); // Trident Memory and Video Clock register - map(0x46e8, 0x46ef).noprw(); //To debug - map(0x4ae8, 0x4aef).noprw(); //To debug - map(0x83c4, 0x83cb).rw("vga", FUNC(trident_vga_device::port_83c6_r), FUNC(trident_vga_device::port_83c6_w)); // Trident LUTDAC - map(0x92e8, 0x92ef).noprw(); //To debug -} - - - -static INPUT_PORTS_START( calchase ) - PORT_START("IOCARD1") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) - PORT_DIPNAME( 0x0008, 0x0008, "1" ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Accelerator") - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IOCARD2") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE1 ) // guess - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset SW") - PORT_DIPNAME( 0x0004, 0x0004, "2" ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Turbo") - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // returns back to MS-DOS (likely to be unmapped and actually used as a lame protection check) - PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IOCARD3") - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") - PORT_BIT( 0xdfff, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IOCARD4") - PORT_DIPNAME( 0x01, 0x01, "DSWA" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) - PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") //eggsplc - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - - PORT_START("IOCARD5") - PORT_DIPNAME( 0x01, 0x01, "DSWA" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) - PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) -INPUT_PORTS_END - -void calchase_state::machine_start() -{ - m_bios_ram = std::make_unique(0x10000/4); - m_bios_ext_ram = std::make_unique(0x10000/4); - - m_nvram_data = std::make_unique(0x800); - subdevice("nvram")->set_base(m_nvram_data.get(), 0x800); - - for (int i = 0; i < 4; i++) - std::fill(std::begin(m_piix4_config_reg[i]), std::end(m_piix4_config_reg[i]), 0); -} - -void calchase_state::machine_reset() -{ - //membank("bank1")->set_base(memregion("bios")->base() + 0x10000); - membank("bios_bank")->set_base(memregion("bios")->base() + 0x10000); - membank("bios_ext")->set_base(memregion("bios")->base() + 0); -} - -void calchase_state::calchase(machine_config &config) -{ - PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU - m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map); - m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); - pcibus.set_device(0, FUNC(calchase_state::intel82439tx_pci_r), FUNC(calchase_state::intel82439tx_pci_w)); - pcibus.set_device(7, FUNC(calchase_state::intel82371ab_pci_r), FUNC(calchase_state::intel82371ab_pci_w)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // DS1220Y - - /* video hardware */ - pcvideo_trident_vga(config); - - ds12885_device &rtc(DS12885(config.replace(), "rtc")); - rtc.irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); - rtc.set_century_index(0x32); - - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC - DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC -} - -void calchase_state::hostinv(machine_config &config) -{ - PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU - m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map); - m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "cdrom", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); - pcibus.set_device(0, FUNC(calchase_state::intel82439tx_pci_r), FUNC(calchase_state::intel82439tx_pci_w)); - pcibus.set_device(7, FUNC(calchase_state::intel82371ab_pci_r), FUNC(calchase_state::intel82371ab_pci_w)); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // DS1220Y - - /* video hardware */ - pcvideo_trident_vga(config); - - /* sound hardware */ - SPEAKER(config, "lspeaker").front_left(); - SPEAKER(config, "rspeaker").front_right(); - DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC - DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC -} - - -uint32_t calchase_state::calchase_idle_skip_r() -{ - if(m_maincpu->pc()==0x1406f48) - m_maincpu->spin_until_interrupt(); - - return m_idle_skip_ram; -} - -void calchase_state::calchase_idle_skip_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - COMBINE_DATA(&m_idle_skip_ram); -} - -void calchase_state::init_calchase() -{ - m_bios_ram = std::make_unique(0x20000/4); - - intel82439tx_init(); - - m_maincpu->space(AS_PROGRAM).install_read_handler(0x3f0b160, 0x3f0b163, read32smo_delegate(*this, FUNC(calchase_state::calchase_idle_skip_r))); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x3f0b160, 0x3f0b163, write32s_delegate(*this, FUNC(calchase_state::calchase_idle_skip_w))); -} - -void calchase_state::init_hostinv() -{ - m_bios_ram = std::make_unique(0x20000/4); - - intel82439tx_init(); -} - -ROM_START( calchase ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "mb_bios.bin", 0x00000, 0x20000, CRC(dea7a51b) SHA1(e2028c00bfa6d12959fc88866baca8b06a1eab68) ) - - ROM_REGION32_LE( 0x8000, "video_bios", 0 ) - ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) - ROM_CONTINUE( 0x0001, 0x4000 ) - - ROM_REGION( 0x800, "nvram", 0 ) - ROM_LOAD( "ds1220y_nv.bin", 0x000, 0x800, CRC(7912c070) SHA1(b4c55c7ca76bcd8dad1c4b50297233349ae02ed3) ) - - DISK_REGION( "ide:0:hdd:image" ) - DISK_IMAGE_READONLY( "calchase", 0,BAD_DUMP SHA1(6ae51a9b3f31cf4166322328a98c0235b0874eb3) ) -ROM_END - -ROM_START( hostinv ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "hostinv_bios.bin", 0x000000, 0x020000, CRC(5111e4b8) SHA1(20ab93150b61fd068f269368450734bba5dcb284) ) - - ROM_REGION32_LE( 0x8000, "video_bios", 0 ) - ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) - ROM_CONTINUE( 0x0001, 0x4000 ) - - ROM_REGION( 0x800, "nvram", ROMREGION_ERASEFF ) - ROM_LOAD( "ds1220y_hostinv.bin", 0x000, 0x800, NO_DUMP ) - - DISK_REGION( "ide:0:cdrom:image" ) - DISK_IMAGE_READONLY( "hostinv", 0, SHA1(3cb86c62e80be98a717172b717f7276a0e5f6830) ) -ROM_END - -ROM_START( eggsplc ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "hostinv_bios.bin", 0x000000, 0x020000, CRC(5111e4b8) SHA1(20ab93150b61fd068f269368450734bba5dcb284) ) - - ROM_REGION32_LE( 0x8000, "video_bios", 0 ) - ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) - ROM_CONTINUE( 0x0001, 0x4000 ) - - ROM_REGION( 0x800, "nvram", ROMREGION_ERASEFF ) - ROM_LOAD( "ds1220y_eggsplc.bin", 0x000, 0x800, NO_DUMP ) - - DISK_REGION( "ide:0:hdd:image" ) - DISK_IMAGE_READONLY( "eggsplc", 0, SHA1(fa38dd6b0d25cde644f68cf639768f137c607eb5) ) -ROM_END - -} // Anonymous namespace - - -GAME( 1998, hostinv, 0, hostinv, calchase, calchase_state, init_hostinv, ROT0, "The Game Room", "Host Invaders", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) -GAME( 1999, calchase, 0, calchase, calchase, calchase_state, init_calchase, ROT0, "The Game Room", "California Chase", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) -GAME( 2002, eggsplc, 0, calchase, calchase, calchase_state, init_hostinv, ROT0, "The Game Room", "Eggs Playing Chicken", 0 ) diff --git a/src/mame/ibmpc/fruitpc.cpp b/src/mame/ibmpc/fruitpc.cpp deleted file mode 100644 index b8fd10fdef2..00000000000 --- a/src/mame/ibmpc/fruitpc.cpp +++ /dev/null @@ -1,180 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:R. Belmont, Carl -/************************************************************************************ - - "Fruit Land" (c) ???? - hack of an open source game by MesSoft with coin handling added - - preliminary driver by R. Belmont and Carl - - TODO: - - Can't find CF card, throws "No boot device available", culprit may be lack of - PCI shadow RAM handling (which causes BIOS to boot in legacy mode); - - Handle STPCD0166BTC3 SoC properly, including PCI devices connected and SVGA - mods (wrongly draws only top screen with 640x200 with at486 -isa1 svga_s3); - - Hardware: - - ST STPCD0166BTC3 486/66 + PC + VGA all on one chip - - 4x AS4LC1M16E5-60TC 1M x 16 EDO DRAM - -=====================================================================================*/ - -#include "emu.h" -#include "pcshare.h" - -#include "bus/isa/isa.h" -#include "bus/isa/sblaster.h" -#include "cpu/i386/i386.h" -#include "machine/idectrl.h" -#include "machine/pci.h" -#include "machine/pckeybrd.h" -#include "video/pc_vga.h" - - -namespace { - -class fruitpc_state : public pcat_base_state -{ -public: - fruitpc_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - , m_pciroot(*this, "pci") - , m_isabus(*this, "isa") - , m_inp(*this, "INP%u", 1U) - { } - - void fruitpc(machine_config &config); - -private: - required_device m_pciroot; - required_device m_isabus; - required_ioport_array<4> m_inp; - - uint8_t fruit_inp_r(offs_t offset); - void dma8237_1_dack_w(uint8_t data); - static void fruitpc_sb_conf(device_t *device); - void fruitpc_io(address_map &map); - void fruitpc_map(address_map &map); -}; - -uint8_t fruitpc_state::fruit_inp_r(offs_t offset) -{ - return m_inp[offset & 0x03]->read(); -} - -void fruitpc_state::fruitpc_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); // VGA VRAM - map(0x000c0000, 0x000dffff).rom().region("bios", 0); - map(0x000e0000, 0x000fffff).rom().region("bios", 0); - map(0x00100000, 0x008fffff).ram(); // 8MB RAM - map(0x02000000, 0x28ffffff).noprw(); - map(0xfffe0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ -} - -void fruitpc_state::fruitpc_io(address_map &map) -{ - pcat32_io_common(map); - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); - map(0x0310, 0x0313).r(FUNC(fruitpc_state::fruit_inp_r)); - map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); -// map(0x0cf8, 0x0cff).rw(m_pcibus, FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); -} - -static INPUT_PORTS_START( fruitpc ) - PORT_START("INP1") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x00fe, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("INP2") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("INP3") - PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_DIPNAME( 0x0004, 0x0004, "CONFIGURATION" ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, "STATISTICHE" ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("INP4") - PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END - -//TODO: use atmb device -void fruitpc_state::dma8237_1_dack_w(uint8_t data) { m_isabus->dack_w(1, data); } - -static void fruitpc_isa8_cards(device_slot_interface &device) -{ - device.option_add("sb15", ISA8_SOUND_BLASTER_1_5); -} - -static DEVICE_INPUT_DEFAULTS_START( fruitpc_sb_def ) - DEVICE_INPUT_DEFAULTS("CONFIG", 0x03, 0x01) -DEVICE_INPUT_DEFAULTS_END - -void fruitpc_state::fruitpc_sb_conf(device_t *device) -{ - device->subdevice("pc_joy")->set_default_option(nullptr); // remove joystick -} - -void fruitpc_state::fruitpc(machine_config &config) -{ - I486(config, m_maincpu, 66000000); // ST STPCD0166BTC3 66 MHz 486 CPU - m_maincpu->set_addrmap(AS_PROGRAM, &fruitpc_state::fruitpc_map); - m_maincpu->set_addrmap(AS_IO, &fruitpc_state::fruitpc_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - /* video hardware */ - pcvideo_vga(config); - - m_dma8237_1->out_iow_callback<1>().set(FUNC(fruitpc_state::dma8237_1_dack_w)); - - PCI_ROOT(config, m_pciroot, 0); - // TODO: STPCD0166BTC3 host PCI - - ISA8(config, m_isabus, 0); - m_isabus->set_memspace("maincpu", AS_PROGRAM); - m_isabus->set_iospace("maincpu", AS_IO); - m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir1_w)); - m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); - m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); - m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); - m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); - m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); - m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); - m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); - - // FIXME: determine ISA bus clock - isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", fruitpc_isa8_cards, "sb15", true)); - isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(fruitpc_sb_def)); - isa1.set_option_machine_config("sb15", fruitpc_sb_conf); -} - -ROM_START( fruitpc ) - ROM_REGION32_LE( 0x20000, "bios", 0 ) - ROM_LOAD( "at-gs001.bin", 0x000000, 0x020000, CRC(7dec34d0) SHA1(81d194d67fef9f6531bd3cd1ee0baacb5c2558bf) ) - - DISK_REGION( "ide:0:hdd:image" ) // 8 MB Compact Flash card - DISK_IMAGE( "fruit", 0,SHA1(df250ff06a97fa141a4144034f7035ac2947c53c) ) -ROM_END - -} // anonymous namespace - - -GAME( 2006, fruitpc, 0, fruitpc, fruitpc, fruitpc_state, empty_init, ROT0, "", "Fruit Land", MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/ibmpc/igspc.cpp b/src/mame/ibmpc/igspc.cpp deleted file mode 100644 index 0384a918fa4..00000000000 --- a/src/mame/ibmpc/igspc.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/* - - IGS PC based hardware - - - Speed Driver - ------------- - -TODO: -can't be emulated without proper mb bios - - 4 boards - 1x NV440 gfx card - 1x sound card - 1x CF2IDE card - 1x proteection card with a IGS027A (ARM7 with internal ROM) - - The CF dump contains no MBR, it is thought that it is stored in either the main bios - or provided by the IGS027A. If you disconnect the protection card the bios will hang - when detecting the HDDs which further backs up the theory that it is provided or - decrypted by the 027A - - EZTouch - -------------- - - Custom board - - AMD Geode Processor (MediaGX derived?) - marked - AGXD533AAXFDCC - 0452EQA - (c)2001 2.1 - TAIWAN - - IGS027 security chip (ARM with internal ROM) (dumped!) - - IGS035? (maybe..) - - CF card - -*/ - - -#include "emu.h" -#include "cpu/i386/i386.h" - -class speeddrv_state : public driver_device -{ -public: - speeddrv_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") - { } - - void speeddrv(machine_config &config); - - void init_speeddrv(); - -private: - void speeddrv_io(address_map &map); - void speeddrv_map(address_map &map); - - // devices - required_device m_maincpu; -public: -}; - -void speeddrv_state::speeddrv_map(address_map &map) -{ - map(0xfffc0000, 0xffffffff).rom().region("bios", 0); -} - -void speeddrv_state::speeddrv_io(address_map &map) -{ -} - - -static INPUT_PORTS_START( speeddrv ) -INPUT_PORTS_END - - - -void speeddrv_state::speeddrv(machine_config &config) -{ - /* basic machine hardware */ - I486(config, m_maincpu, 40000000); // ?? at least a pentium - m_maincpu->set_addrmap(AS_PROGRAM, &speeddrv_state::speeddrv_map); - m_maincpu->set_addrmap(AS_IO, &speeddrv_state::speeddrv_io); -} - - -ROM_START( speeddrv ) - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ - ROM_LOAD( "mainbios", 0x0000, 0x040000, NO_DUMP ) - - ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ - ROM_LOAD( "speed_driver_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) - - DISK_REGION( "disks" ) - DISK_IMAGE( "speeddrv", 0, SHA1(88712a37b75d84cf9b5a4bee9386285d1b3760b3) ) -ROM_END - -ROM_START( eztouch ) - ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ - ROM_LOAD( "szz_bios.rom", 0x0000, 0x040000, CRC(9b09f094) SHA1(a9c533afa29218339bbd4f12075f34f9574e3bf6) ) - - ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ - ROM_LOAD( "szz_027a.rom", 0x000000, 0x04000, CRC(f05dae69) SHA1(fa64e73cf045cda64aa0b702de3bd032a44d2c5c) ) - - ROM_REGION( 0x80000, "extarm", 0 ) /* external ROM for ARM? (encrypted) */ - ROM_LOAD( "szz_v116cn.rom", 0x000000, 0x80000, CRC(8c443a89) SHA1(efdbaa832def812e0786cab95ebf60cdc226d3c4)) - - DISK_REGION( "disks" ) - DISK_IMAGE( "szz_cf", 0, SHA1(d02cb1af0f03ce83719870d8a66244dde9795b2e) ) -ROM_END - - -void speeddrv_state::init_speeddrv() -{ -} - -GAME( 2004, speeddrv, 0, speeddrv, speeddrv, speeddrv_state, init_speeddrv, ROT0, "IGS", "Speed Driver", MACHINE_IS_SKELETON ) -GAME( 200?, eztouch, 0, speeddrv, speeddrv, speeddrv_state, init_speeddrv, ROT0, "IGS", "EZ Touch (v116 China)", MACHINE_IS_SKELETON ) diff --git a/src/mame/ibmpc/pangofun.cpp b/src/mame/ibmpc/pangofun.cpp deleted file mode 100644 index 3dfaf4e9843..00000000000 --- a/src/mame/ibmpc/pangofun.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood -/************************************************************************************************** - - It's a standard 486 PC motherboard, gfx card etc. with expansion ROM board - - probably impossible to emulate right now due to the bad / missing (blank when read) rom - although it would be a good idea if somebody checked for sure - -TODO: -- Doesn't detect proper CPU type; -- "Memory test fail" at POST, needs um8498f "memory controller" emulation - (non-PCI with shadow RAM?), also cfr. correlated at.cpp romsets; -- Sometimes POST will trip an invalid groupFF_16 modrm FF at 000F00B2, causing an hang; -- bp 932d1, ROM banking that reads at 0xffffe? Is um8498f ROM boot capable? - -=================================================================================================== -readme by f205v - -Game: Pango Fun -Anno: 1995 -Produttore: InfoCube (Pisa-Italy) -N.revisione: rl00rv00 - -CPUs:----------- - -Main PCB (it's a standard 486 motherboard): - -1x 80486 -1x oscillator 14.31818 MHz - -Video PCB (it's a standard VGA ISA board): - -1x CIRRUS CLGD5401-42QC-B-31063-198AC - -Sound PCB (missing, it's a standard ISA 16bit sound card): -? - -ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connetcor on the other side): -1x NE555P - - -ROMs:----------- - -Main PCB (it's a standard 486 motherboard): -1x 27C512 (bios) - -Video PCB (it's a standard VGA ISA board): -1x maskrom (28pin) (VGAbios)(not dumped) - -Sound PCB (missing, it's a standard ISA 16bit sound card): - -ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connector on the other side): -5x AM27C040 (u11,u12,u31,u32,u33) -1x TMS27C040 (u13)(probably corrupted) -1x INTEL27C010A (u39) -4x PALCE16V8H (u5,u25,u26,u28)(not dumped yet) -1x PALCE20V8H (u42) -1x PALCE20V8H (u44)(not dumped yet) -2x PALCE22V10H (u45,u49)(not dumped yet) - - -Notes:---------- - -Main PCB (it's a standard 486 motherboard): -1x Keyboard DIN connector (not used) - -Video PCB (it's a standard VGA ISA board): -1x VGA connetctor (to ROMs PCB) -1x red/black cable (to ROMs PCB) - -Sound PCB (missing, it's a standard ISA 16bit sound card): -1x stereo audio out (to ROMs PCB) - -ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connetcor on the other side): -1x ISA connector (into motherboard) -1x JAMMA edge connector -1x VGA in connector (from Video PCB) -1x stereo audio jack (from sound card) -1x 13x2 legs connector(only 2 legs used for red/black cable from Video PCB) -1x trimmer (volume) -2x 8 switches dip - -Info:---------- - ------------------------------------------- -I have: -3 Main PCBs (all of them without 80486) -11 Video PCBs -4 ROMs PCBs (only one has EPROMs) ------------------------------------------- - -Game was programmed by Giovanni Tummarello and Roberto Molinelli in 1990 for Amiga; -it was an action/strategy videogame published by Proxxima Software (Rome, Italy) and -later ported to PC machines and published in 1994 by AIM Games software (US) and in -Arcade Version (Coin-Op) by InfoCube (Pisa, Italy) - -**************************************************************************************************/ - -#include "emu.h" - -#include "pcshare.h" - -#include "cpu/i386/i386.h" -#include "video/pc_vga.h" -#include "screen.h" - - -namespace { - -class pangofun_state : public pcat_base_state -{ -public: - pangofun_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) { } - - void pangofun(machine_config &config); - - void init_pangofun(); - -private: - virtual void machine_start() override; - void pcat_io(address_map &map); - void pcat_map(address_map &map); -}; - - -void pangofun_state::pcat_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); - map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); - map(0x000e0000, 0x000effff).rom().region("game_prg", 0); - map(0x000f0000, 0x000fffff).rom().region("bios", 0); - /* TODO: correct RAM mapping/size? */ - map(0x00100000, 0x01ffffff).ram(); - map(0x02000000, 0xfffeffff).noprw(); - map(0xffff0000, 0xffffffff).rom().region("bios", 0); -} - -void pangofun_state::pcat_io(address_map &map) -{ - pcat32_io_common(map); - map(0x00e0, 0x00e3).nopw(); - map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); -} - -static INPUT_PORTS_START( pangofun ) -INPUT_PORTS_END - -void pangofun_state::machine_start() -{ -} - -void pangofun_state::pangofun(machine_config &config) -{ - /* basic machine hardware */ - I486(config, m_maincpu, XTAL(40'000'000)); // um486sxlc-40 - m_maincpu->set_addrmap(AS_PROGRAM, &pangofun_state::pcat_map); - m_maincpu->set_addrmap(AS_IO, &pangofun_state::pcat_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - /* video hardware */ - pcvideo_vga(config); - - pcat_common(config); - - // TODO: um8498f -} - - -ROM_START(pangofun) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("bios.bin", 0x000000, 0x10000, CRC(e70168ff) SHA1(4a0d985c218209b7db2b2d33f606068aae539020) ) - - ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ - ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) - ROM_CONTINUE( 0x00001, 0x04000 ) - - /* this is what was on the rom board, mapping unknown */ - ROM_REGION32_LE(0xa00000, "game_prg", 0) /* rom board */ - ROM_LOAD("bank8.u39", 0x000000, 0x20000, CRC(72422c66) SHA1(40b8cca3f99925cf019053921165f6a4a30d784d) ) - ROM_LOAD16_BYTE("bank0.u11", 0x100001, 0x80000, CRC(6ce951d7) SHA1(1dd09491c651920a8a507bdc6584400367e5a292) ) - ROM_LOAD16_BYTE("bank0.u31", 0x100000, 0x80000, CRC(b6c06baf) SHA1(79074b086d24737d629272d98f17de6e1e650485) ) - /* Following two references to a SB Pro clone sound card. */ - ROM_LOAD16_BYTE("bank1.u12", 0x200001, 0x80000, CRC(5adc1f2e) SHA1(17abde7a2836d042a698661339eefe242dd9af0d) ) - ROM_LOAD16_BYTE("bank1.u32", 0x200000, 0x80000, CRC(5647cbf6) SHA1(2e53a74b5939b297fa1a77441017cadc8a19ddef) ) - ROM_LOAD16_BYTE("bank2.u13", 0x300001, 0x80000, BAD_DUMP CRC(504bf849) SHA1(13a184ec9e176371808938015111f8918cb4df7d) ) // EMPTY! (Definitely Bad, interleaves with the next ROM) - ROM_LOAD16_BYTE("bank2.u33", 0x300000, 0x80000, CRC(272ecfb6) SHA1(6e1b6bdef62d953de102784ba0148fb20182fa87) ) - /*bank3.u14 , NOT POPULATED */ - /*bank3.u34 , NOT POPULATED */ - /*bank4.u15 , NOT POPULATED */ - /*bank4.u35 , NOT POPULATED */ - /*bank5.u16 , NOT POPULATED */ - /*bank5.u36 , NOT POPULATED */ - /*bank6.u17 , NOT POPULATED */ - /*bank6.u37 , NOT POPULATED */ - /*bank7.u18 , NOT POPULATED */ - /*bank7.u37 , NOT POPULATED */ - /*bank8.u19 , NOT POPULATED */ -ROM_END - -void pangofun_state::init_pangofun() -{ -} - -} // anonymous namespace - - -GAME( 1995, pangofun, 0, pangofun, pangofun, pangofun_state, init_pangofun, ROT0, "InfoCube", "Pango Fun (Italy)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/ibmpc/paokaipc.cpp b/src/mame/ibmpc/paokaipc.cpp deleted file mode 100644 index ca24b71fd75..00000000000 --- a/src/mame/ibmpc/paokaipc.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: -/************************************************************************************************** - - Go Go Strike (c) 2007? Paokai - - Originally in fruitpc.cpp, split because definitely doesn't belong - - Some kind of x86 pc-like hardware, exact CPU type etc. unknown hardware is by Paokai, - motherboard has logos, large chip with logo too, http://www.paokai.com.tw/ - - CF card has a Linux partition, partially bootable with m55hipl driver. - - starts with a "LILO boot", fails with a recoverable "undefined video mode" - (press RETURN or SPACE); - - Shows being a "gcc 3.2.2 (Red Hat Linux 3.2.2-5)" distro. - Notice that latter seems mislabeled, and RedHat is actually version 9 - http://rpm.pbone.net/info_idpl_19558085_distro_redhat9_com_gcc-3.2.2-5.i386.rpm.html - - Has pretty verbose terminal log, checks PnP, USB, Pentium f0 0f bug, - assumes "33 MHz system bus" for IDE PIO mode, returns PIIX only during PCI scan - (that's what m55hipl has as default); - - Eventually hangs at a "Setting the clock:" prompt; - -**************************************************************************************************/ - -#include "emu.h" - -#include "pcshare.h" - -#include "bus/isa/isa.h" -#include "bus/isa/sblaster.h" -#include "cpu/i386/i386.h" -#include "machine/idectrl.h" -#include "machine/pci.h" -#include "machine/pckeybrd.h" -#include "video/pc_vga.h" - -namespace { - -class paokaipc_state : public pcat_base_state -{ -public: - paokaipc_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - , m_pciroot(*this, "pci") - , m_isabus(*this, "isa") - { } - - void paokaipc(machine_config &config); - -private: - required_device m_pciroot; - required_device m_isabus; - - void main_io(address_map &map); - void main_map(address_map &map); -}; - -void paokaipc_state::main_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); // VGA VRAM - map(0x000e0000, 0x000fffff).rom().region("bios", 0x20000); - map(0x00100000, 0x008fffff).ram(); - map(0x02000000, 0x28ffffff).noprw(); - map(0xfffc0000, 0xffffffff).rom().region("bios", 0x00000); /* System BIOS */ -} - -void paokaipc_state::main_io(address_map &map) -{ - pcat32_io_common(map); - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); - map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); -// map(0x0880, 0x0880) extensively accessed at POST, hangs if returns wrong values -// map(0x0cf8, 0x0cff).rw(m_pcibus, FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); -} - -static INPUT_PORTS_START( gogostrk ) -INPUT_PORTS_END - -void paokaipc_state::paokaipc(machine_config &config) -{ - // TODO: everything inherited from fruitpc.cpp, needs proper identification of motherboard. - PENTIUM(config, m_maincpu, 66000000); // unknown CPU, at least Pentium according to logs - m_maincpu->set_addrmap(AS_PROGRAM, &paokaipc_state::main_map); - m_maincpu->set_addrmap(AS_IO, &paokaipc_state::main_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - pcvideo_vga(config); - - PCI_ROOT(config, m_pciroot, 0); - // ... - - ISA8(config, m_isabus, 0); - m_isabus->set_memspace("maincpu", AS_PROGRAM); - m_isabus->set_iospace("maincpu", AS_IO); - m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir2_w)); - m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); - m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); - m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); - m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); - m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); - m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); - m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); - - // FIXME: determine ISA bus clock -// isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", fruitpc_isa8_cards, "sb15", true)); -// isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(fruitpc_sb_def)); -// isa1.set_option_machine_config("sb15", fruitpc_sb_conf); -} - -ROM_START( gogostrk ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "39sf020a.rom1", 0x000000, 0x040000, CRC(236d4d95) SHA1(50579acddc93c05d5f8e17ad3669a29d2dc49965) ) - - DISK_REGION( "ide:0:hdd:image" ) // 128 MB CF Card - DISK_IMAGE( "ggs-5-2-07", 0,SHA1(f214fd39ec8ac02f008823f4b179ea6c6835e1b8) ) -ROM_END - -} // anonymous namespace - -GAME( 2007?, gogostrk, 0, paokaipc, gogostrk, paokaipc_state, empty_init, ROT0, "American Alpha / Paokai", "Go Go Strike", MACHINE_IS_SKELETON ) // motherboard is dated 2006, if the CF card string is a date it's 2007 diff --git a/src/mame/ibmpc/pcat_dyn.cpp b/src/mame/ibmpc/pcat_dyn.cpp deleted file mode 100644 index f8b9f702a47..00000000000 --- a/src/mame/ibmpc/pcat_dyn.cpp +++ /dev/null @@ -1,286 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese -/******************************************************************************************************************** - -Tournament Solitaire (c) 1995 Dynamo - -Unmodified 486 PC-AT HW. - -Jet Way Information Co. OP495SLC motherboard - - AMD Am486-DX40 CPU - - Trident TVGA9000i video card - - Breve Technologies audio adapter, WSS+Sound Blaster - - CH Products RollerMouse serial trackball, Mouse Systems compatible - -preliminary driver by Angelo Salese - -Notes: -Data from the 99378275.SN file on the rom filesystem is scrambled and written to DF80:0000-0100 then read back. -If the output isn't satisfactory, it prints "I/O BOARD FAILURE". - -********************************************************************************************************************/ - -#include "emu.h" - -#include "pcshare.h" - -#include "cpu/i386/i386.h" -#include "machine/bankdev.h" -#include "machine/ds128x.h" -#include "machine/ins8250.h" -#include "machine/nvram.h" -#include "sound/ad1848.h" - -#include "bus/isa/isa.h" -#include "bus/isa/sblaster.h" -#include "bus/isa/trident.h" -#include "bus/rs232/hlemouse.h" -#include "bus/rs232/rs232.h" - -#include "screen.h" - -namespace { - -class pcat_dyn_state : public pcat_base_state -{ -public: - pcat_dyn_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - , m_isabus(*this, "isa") - , m_prgbank(*this, "prgbank") - , m_nvram_bank(*this, "nvram_bank") - , m_nvram_mem(0x2000){ } - - void pcat_dyn(machine_config &config); - -private: - required_device m_isabus; - required_memory_bank m_prgbank; - required_memory_bank m_nvram_bank; - std::vector m_nvram_mem; - void bank1_w(uint8_t data); - void bank2_w(uint8_t data); - uint8_t audio_r(offs_t offset); - void dma8237_1_dack_w(uint8_t data); - virtual void machine_start() override; - void nvram_init(nvram_device &nvram, void *base, size_t size); - static void pcat_dyn_sb_conf(device_t *device); - void pcat_io(address_map &map); - void pcat_map(address_map &map); -}; - -void pcat_dyn_state::machine_start() -{ - m_prgbank->configure_entries(0, 256, memregion("game_prg")->base(), 0x1000); - m_nvram_bank->configure_entries(0, 2, &m_nvram_mem[0], 0x1000); - subdevice("nvram")->set_base(&m_nvram_mem[0], 0x2000); -} - -void pcat_dyn_state::nvram_init(nvram_device &nvram, void *base, size_t size) -{ - memcpy(base, memregion("nvram")->base(), size); -} - -uint8_t pcat_dyn_state::audio_r(offs_t offset) -{ - switch(offset) - { - case 3: - return 4; - } - return 0; -} - -void pcat_dyn_state::bank1_w(uint8_t data) -{ - m_prgbank->set_entry(data); -} - -void pcat_dyn_state::bank2_w(uint8_t data) -{ - m_nvram_bank->set_entry(data & 1); -} - -void pcat_dyn_state::pcat_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(trident_vga_device::mem_r), FUNC(trident_vga_device::mem_w)); - map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); - map(0x000d0000, 0x000d0fff).rom().region("game_prg", 0x0000).w(FUNC(pcat_dyn_state::bank1_w)); - map(0x000d1000, 0x000d1fff).rom().region("game_prg", 0x1000).w(FUNC(pcat_dyn_state::bank2_w)); - map(0x000d2000, 0x000d2fff).bankr("prgbank"); - map(0x000d3000, 0x000d3fff).bankrw("nvram_bank"); - map(0x000df400, 0x000df8ff).ram(); //I/O board? - map(0x000f0000, 0x000fffff).rom().region("bios", 0); - map(0x00100000, 0x001fffff).ram(); - map(0xffff0000, 0xffffffff).rom().region("bios", 0); -} - -void pcat_dyn_state::pcat_io(address_map &map) -{ - pcat32_io_common(map); - map(0x03b0, 0x03bf).rw("vga", FUNC(trident_vga_device::port_03b0_r), FUNC(trident_vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(trident_vga_device::port_03c0_r), FUNC(trident_vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(trident_vga_device::port_03d0_r), FUNC(trident_vga_device::port_03d0_w)); - map(0x03f8, 0x03ff).rw("ns16550", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); - map(0x0530, 0x0533).r(FUNC(pcat_dyn_state::audio_r)); - map(0x0534, 0x0537).rw("ad1848", FUNC(ad1848_device::read), FUNC(ad1848_device::write)); -} - -//TODO: use atmb device -void pcat_dyn_state::dma8237_1_dack_w(uint8_t data) { m_isabus->dack_w(1, data); } - -static INPUT_PORTS_START( pcat_dyn ) - // M,N,Numpad 6 -- Hang - // Enter,Numpad 4 -- 5 Credits - PORT_START("pc_keyboard_0") - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Bookkeeping") - - PORT_START("pc_keyboard_1") - PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_BILL1) - - PORT_START("pc_keyboard_2") - // Don't use IPT_BUTTON1 or the mouse axes are mapped incorrectly - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Mouse Button") PORT_CODE(MOUSECODE_BUTTON1) - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_COIN1) -INPUT_PORTS_END - -static void pcat_dyn_com(device_slot_interface &device) -{ - device.option_add("msmouse", MSYSTEMS_HLE_SERIAL_MOUSE); -} - -static void pcat_dyn_isa8_cards(device_slot_interface &device) -{ - device.option_add("sb15", ISA8_SOUND_BLASTER_1_5); -} - -static DEVICE_INPUT_DEFAULTS_START( pcat_dyn_sb_def ) - DEVICE_INPUT_DEFAULTS("CONFIG", 0x03, 0x01) -DEVICE_INPUT_DEFAULTS_END - -void pcat_dyn_state::pcat_dyn_sb_conf(device_t *device) -{ - device->subdevice("pc_joy")->set_default_option(nullptr); // remove joystick -} - -void pcat_dyn_state::pcat_dyn(machine_config &config) -{ - /* basic machine hardware */ - I486(config, m_maincpu, 40000000); /* Am486 DX-40 */ - m_maincpu->set_addrmap(AS_PROGRAM, &pcat_dyn_state::pcat_map); - m_maincpu->set_addrmap(AS_IO, &pcat_dyn_state::pcat_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - /* video hardware */ - pcvideo_trident_vga(config); - subdevice("screen")->set_refresh_hz(60); - tvga9000_device &vga(TVGA9000_VGA(config.replace(), "vga", 0)); - vga.set_screen("screen"); - vga.set_vram_size(0x200000); - - pcat_common(config); - - DS12885(config.replace(), m_mc146818); - m_mc146818->irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); - m_mc146818->set_century_index(0x32); - - ad1848_device &ad1848(AD1848(config, "ad1848", 0)); - ad1848.irq().set("pic8259_1", FUNC(pic8259_device::ir5_w)); - ad1848.drq().set("dma8237_1", FUNC(am9517a_device::dreq0_w)); - - m_dma8237_1->out_iow_callback<0>().set("ad1848", FUNC(ad1848_device::dack_w)); - m_dma8237_1->out_iow_callback<1>().set(FUNC(pcat_dyn_state::dma8237_1_dack_w)); - - NVRAM(config, "nvram").set_custom_handler(FUNC(pcat_dyn_state::nvram_init)); - - ns16550_device &uart(NS16550(config, "ns16550", XTAL(1'843'200))); - uart.out_tx_callback().set("serport", FUNC(rs232_port_device::write_txd)); - uart.out_dtr_callback().set("serport", FUNC(rs232_port_device::write_dtr)); - uart.out_rts_callback().set("serport", FUNC(rs232_port_device::write_rts)); - uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - - rs232_port_device &serport(RS232_PORT(config, "serport", pcat_dyn_com, "msmouse")); - serport.set_fixed(true); - serport.rxd_handler().set("ns16550", FUNC(ins8250_uart_device::rx_w)); - serport.dcd_handler().set("ns16550", FUNC(ins8250_uart_device::dcd_w)); - serport.dsr_handler().set("ns16550", FUNC(ins8250_uart_device::dsr_w)); - serport.ri_handler().set("ns16550", FUNC(ins8250_uart_device::ri_w)); - serport.cts_handler().set("ns16550", FUNC(ins8250_uart_device::cts_w)); - - ISA8(config, m_isabus, 0); - m_isabus->set_memspace("maincpu", AS_PROGRAM); - m_isabus->set_iospace("maincpu", AS_IO); - m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir1_w)); - m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); - //m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - //m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); - m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); - m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); - m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); - m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); - m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); - - // FIXME: determine ISA bus clock - isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", pcat_dyn_isa8_cards, "sb15", true)); - isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(pcat_dyn_sb_def)); - isa1.set_option_machine_config("sb15", pcat_dyn_sb_conf); -} - -/*************************************** -* -* ROM definitions -* -***************************************/ - -ROM_START(toursol) - ROM_REGION32_LE(0x10000, "bios", 0) /* Motherboard BIOS */ - ROM_LOAD("prom.mb", 0x000000, 0x10000, CRC(e44bfd3c) SHA1(c07ec94e11efa30e001f39560010112f73cc0016) ) - - ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ - ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION32_LE(0x100000, "game_prg", 0) /* PromStor 32, mapping unknown */ - ROM_LOAD("sol.u21", 0x00000, 0x40000, CRC(e97724d9) SHA1(995b89d129c371b815c6b498093bd1bbf9fd8755)) - ROM_LOAD("sol.u22", 0x40000, 0x40000, CRC(69d42f50) SHA1(737fe62f3827b00b4f6f3b72ef6c7b6740947e95)) - ROM_LOAD("sol.u23", 0x80000, 0x40000, CRC(d1e39bd4) SHA1(39c7ee43cddb53fba0f7c0572ddc40289c4edd07)) - ROM_LOAD("sol.u24", 0xc0000, 0x40000, CRC(555341e0) SHA1(81fee576728855e234ff7aae06f54ae9705c3ab5)) - ROM_FILL(0x2a3e6, 1, 0xeb) // skip prot(?) check - ROM_FILL(0x51bd2, 2, 0x90) // opl2 probe expects timer expiration too quickly - - ROM_REGION(0x2000, "nvram", 0) - ROM_LOAD("sol.u28", 0, 0x2000, CRC(c9374d50) SHA1(49173bc69f70bb2a7e8af9d03e2538b34aa881d8)) - - ROM_REGION(128, "rtc", 0) - ROM_LOAD("rtc", 0, 128, BAD_DUMP CRC(732f64c8) SHA1(5386eac3afef9b16af8dd7766e577f7ac700d9cc)) -ROM_END - - -ROM_START(toursol1) - ROM_REGION32_LE(0x10000, "bios", 0) /* Motherboard BIOS */ - ROM_LOAD("prom.mb", 0x000000, 0x10000, CRC(e44bfd3c) SHA1(c07ec94e11efa30e001f39560010112f73cc0016) ) - - ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ - ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION32_LE(0x100000, "game_prg", 0) /* PromStor 32, mapping unknown */ - ROM_LOAD("prom.0", 0x00000, 0x40000, CRC(f26ce73f) SHA1(5516c31aa18716a47f46e412fc273ae8784d2061)) - ROM_LOAD("prom.1", 0x40000, 0x40000, CRC(8f96e2a8) SHA1(bc3ce8b99e6ff40e355df2c3f797f1fe88b3b219)) - ROM_LOAD("prom.2", 0x80000, 0x40000, CRC(8b0ac5cf) SHA1(1c2b6a53c9ff4d18a5227d899facbbc719f40205)) - ROM_LOAD("prom.3", 0xc0000, 0x40000, CRC(9352e965) SHA1(2bfb647ec27c60a8c821fdf7483199e1a444cea8)) - ROM_FILL(0x334f6, 1, 0xeb) // skip prot(?) check - - ROM_REGION(0x2000, "nvram", 0) - ROM_LOAD("prom.7", 0, 0x2000, CRC(154c8092) SHA1(4439ee82f36d5d5c334494ba7bb4848e839213a7)) - - ROM_REGION(128, "rtc", 0) - ROM_LOAD("rtc", 0, 128, BAD_DUMP CRC(732f64c8) SHA1(5386eac3afef9b16af8dd7766e577f7ac700d9cc)) -ROM_END - -} // anonymous namespace - - -GAME( 1995, toursol, 0, pcat_dyn, pcat_dyn, pcat_dyn_state, empty_init, ROT0, "Dynamo", "Tournament Solitaire (V1.06, 08/03/95)", MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, toursol1, toursol, pcat_dyn, pcat_dyn, pcat_dyn_state, empty_init, ROT0, "Dynamo", "Tournament Solitaire (V1.04, 06/22/95)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/ibmpc/pcat_nit.cpp b/src/mame/ibmpc/pcat_nit.cpp deleted file mode 100644 index 3191f6ced78..00000000000 --- a/src/mame/ibmpc/pcat_nit.cpp +++ /dev/null @@ -1,461 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese, Mariusz Wojcieszek -/******************************************************************************************************************** - -Street Games (c) 1993 New Image Technologies - -A modified 386 PC-AT HW - -Driver by Angelo Salese and Mariusz Wojcieszek - -===================================================================================================================== - -These games were made by New Image Technologies. They are touch screen multi games from around 1993. -Guru dumped one of their games a year ago but the pcb was rusted out and I think the roms might -be bad, not sure. - -nvram is a potential problem. I have them separated into their own folder for now. I'm not really s -ure if they are needed, but I found this inside a Bonanza rom so they may hold a key: - -------------------------------------------- -INVALID KEY -_ -Programming DS1204 -_ -Successfully Programmed DS1204 -_ -Failed Programming DS1204 -_ -Verifying DS1204 -_ -Failed to read secure data -_ -Failed to read ID DS1204 -_ -Verified DS1204 -------------------------------------------- - -I have them (the real chips) for my Bonanza rom boards, but they are missing on my Street Games boards. -However, the back of one of the manuals mentions game swapping on these boards, and it doesn't mention -this chip as needing to be changed. I included the nvram dump from Guru's Street Games II dump, so maybe -that will work on all the Street Games sets? I don't know. My Dallas chip read good as 2764 and verified -ok. The other one (bq4010yma-150) reads the same crc most reads but won't pass the verify function. -It may still be good. Those are for the Bonanza sets as you'll see in the pics. - -I made copies of the manuals for Street Games and Bonanza and included lots of pics. - -From the looks of the boards I got, Street Games II looks like it uses the 3 original Street Games roms -and just builds on them. You'll see what I mean in the pics. - -I don't know if all 3 vga bioses are needed or not, one is soldered and not dumped, I dumped the other two. -I can get the soldered one dumped in the future if it turns out we need it. When these games got upgraded, -they sometimes came with a new video board. Switching from Street Games to Street Games II probably didn't need -it but switching to Bonanza did. The vga bioses I dumped came off of the 2 different video boards for Bonanza. -I dumped them as 27c256. The one on the Street Games video board is the surface mounted one. - -The end numbers on the rom stickers give away the version info. For example, it looks like Guru's old dump -of Street Games II is revision 7C. - -The system bios roms I dumped give an error in romcmp but they seem to verify ok so I think they are good. - -My 2 rom boards for Bonanza were fortunately 2 different revisions. I ended up with 2 sets of Street Games, -1 set of Street Games II, and 2 different sets of Bonanza. A second set of Street Games II might be able to be -"created" if his dump is good because you will notice in the pics, it looks like Street Games II used 3 roms -from Street Games I. That or one of my rom boards came populated incorrectly. - -The ATI keyboard bios is an HT6542. The Jet one I'm not sure. I don't think they can be read. Same for the M5818's. - -My set naming logic... - -bonanza = Bonanza (Rev 3) -bonanza2 = Bonanza (Rev 2) - -streetg = Street Games (Rev 4) -streetg2 = Street Games (Rev 2) - -streetgii = Street Games II (Rev 5) - -Anything else need to be dumped? More pics needed, etc.? Contact me. - - -Smitdogg - -********************************************************************************************************************/ - - -#include "emu.h" - -#include "pcshare.h" - -#include "cpu/i386/i386.h" -#include "machine/ins8250.h" -#include "machine/microtch.h" -#include "machine/nvram.h" -#include "video/clgd542x.h" - -namespace { - -class pcat_nit_state : public pcat_base_state -{ -public: - pcat_nit_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag), - m_uart(*this, "ns16450_0"), - m_microtouch(*this, "microtouch"), - m_bios_region(*this, "bios"), - m_disk_bios_region(*this, "disk_bios"), - m_bios_share(*this, "bios"), - m_disk_bios_share(*this, "disk_bios") - { } - - void bonanza(machine_config &config); - void pcat_nit(machine_config &config); - - void init_pcat_nit(); - -private: - std::unique_ptr m_banked_nvram; - required_device m_uart; - required_device m_microtouch; - required_region_ptr m_bios_region; - required_region_ptr m_disk_bios_region; - required_shared_ptr m_bios_share; - required_shared_ptr m_disk_bios_share; - - void pcat_nit_rombank_w(uint8_t data); - uint8_t pcat_nit_io_r(offs_t offset); - virtual void machine_start() override; - void bonanza_io_map(address_map &map); - void bonanza_map(address_map &map); - void pcat_map(address_map &map); - void pcat_nit_io(address_map &map); -}; - -/************************************* - * - * ROM banking - * - *************************************/ - -void pcat_nit_state::pcat_nit_rombank_w(uint8_t data) -{ - auto &mspace = m_maincpu->space(AS_PROGRAM); - //logerror( "rom bank #%02x at PC=%08X\n", data, m_maincpu->pc() ); - if ( data & 0x40 ) - { - // rom bank - mspace.install_read_bank(0x000d8000, 0x000dffff, membank("rombank") ); - mspace.unmap_write(0x000d8000, 0x000dffff); - - if ( data & 0x80 ) - { - membank("rombank")->set_entry((data & 0x3f) | 0x40 ); - } - else - { - membank("rombank")->set_entry(data & 0x3f ); - } - } - else - { - // nvram bank - mspace.unmap_readwrite(0x000d8000, 0x000dffff); - - mspace.install_ram(0x000d8000, 0x000d9fff, m_banked_nvram.get()); - - } -} - -void pcat_nit_state::pcat_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); - map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0).nopw(); - map(0x000d0000, 0x000d3fff).ram().share("disk_bios"); - map(0x000d7000, 0x000d7000).w(FUNC(pcat_nit_state::pcat_nit_rombank_w)); - map(0x000d8000, 0x000dffff).bankr("rombank"); - map(0x000f0000, 0x000fffff).ram().share("bios"); - map(0xffff0000, 0xffffffff).rom().region("bios", 0); -} - -void pcat_nit_state::bonanza_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(cirrus_gd5428_device::mem_r), FUNC(cirrus_gd5428_device::mem_w)); - map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0).nopw(); - map(0x000d0000, 0x000d3fff).ram().share("disk_bios"); - map(0x000d7000, 0x000d7000).w(FUNC(pcat_nit_state::pcat_nit_rombank_w)); - map(0x000d8000, 0x000dffff).bankr("rombank"); - map(0x000f0000, 0x000fffff).ram().share("bios"); - map(0xffff0000, 0xffffffff).rom().region("bios", 0); -} - -uint8_t pcat_nit_state::pcat_nit_io_r(offs_t offset) -{ - switch(offset) - { - case 0: /* 278 */ - return 0xff; - case 1: /* 279 */ - return ioport("IN0")->read(); - case 7: /* 27f dips */ - return 0xff; - default: - return 0; - } -} - -void pcat_nit_state::pcat_nit_io(address_map &map) -{ - pcat32_io_common(map); - map(0x0278, 0x027f).r(FUNC(pcat_nit_state::pcat_nit_io_r)).nopw(); - map(0x0280, 0x0283).nopr(); - map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); - map(0x03f8, 0x03ff).rw(m_uart, FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w)); -} - -void pcat_nit_state::bonanza_io_map(address_map &map) -{ - pcat32_io_common(map); - map(0x0278, 0x027f).r(FUNC(pcat_nit_state::pcat_nit_io_r)).nopw(); - map(0x0280, 0x0283).nopr(); - map(0x03b0, 0x03bf).rw("vga", FUNC(cirrus_gd5428_device::port_03b0_r), FUNC(cirrus_gd5428_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(cirrus_gd5428_device::port_03c0_r), FUNC(cirrus_gd5428_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(cirrus_gd5428_device::port_03d0_r), FUNC(cirrus_gd5428_device::port_03d0_w)); - map(0x03f8, 0x03ff).rw(m_uart, FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w)); -} - -static INPUT_PORTS_START( pcat_nit ) - PORT_START("IN0") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Clear") PORT_CODE(KEYCODE_C) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_SERVICE) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_COIN1) PORT_IMPULSE(1) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN2) PORT_IMPULSE(1) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_COIN3) PORT_IMPULSE(1) -INPUT_PORTS_END - -void pcat_nit_state::machine_start() -{ - membank("rombank")->configure_entries(0, 0x80, memregion("game_prg")->base(), 0x8000 ); - membank("rombank")->set_entry(0); - - // There's some shadow ram control registers missing somehwere - memcpy(m_bios_share, m_bios_region, 0x10000); - memcpy(m_disk_bios_share, m_disk_bios_region, 0x4000); -} - -void pcat_nit_state::pcat_nit(machine_config &config) -{ - /* basic machine hardware */ - I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */ - m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::pcat_map); - m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::pcat_nit_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - /* video hardware */ - pcvideo_vga(config); - - pcat_common(config); - - ns16450_device &uart(NS16450(config, "ns16450_0", XTAL(1'843'200))); - uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx)); - uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - - MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate? - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); -} - -void pcat_nit_state::bonanza(machine_config &config) -{ - /* basic machine hardware */ - I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */ - m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::bonanza_map); - m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::bonanza_io_map); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - /* video hardware */ - pcvideo_cirrus_gd5428(config); - - pcat_common(config); - ns16450_device &uart(NS16450(config, "ns16450_0", XTAL(1'843'200))); - uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx)); - uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); - - MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate? - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); -} - -/*************************************** -* -* ROM definitions -* -***************************************/ - -ROM_START(streetg) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("system-bios-10-0004-01.u6", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0003-04.u11", 0x000000,0x40000, CRC(1471a728) SHA1(5e12a9230f8130282a1be9a10118a3556bafbc37) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-0003-04.u12", 0x040000,0x40000, CRC(5a50f519) SHA1(c07a583b4220d4d5506824def91774fede760e65) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-0003-04.u13", 0x080000,0x40000, CRC(8a609145) SHA1(18fcb58b461aa9149a163b85dd8267dec90da3cd) ) - ROM_CONTINUE(0x280000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) - - ROM_REGION(0x08000, "nvram_data", 0) - ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) -ROM_END - -ROM_START(streetgr3) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("system-bios-10-0004-01.u6", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-00003-03.u11", 0x000000,0x40000, CRC(2fbcb12b) SHA1(f6413565fc1289ba32b411de877cdf6526f1fa9d) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-00003-03.u12", 0x040000,0x40000, CRC(b37c7dff) SHA1(cf6318bfeca0bd272734f45c7589a0224863b0f1) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-00003-03.u13", 0x080000,0x40000, CRC(6a9d0771) SHA1(6cd9a56a2413416d0928e5cf9340c94bc0c87c46) ) - ROM_CONTINUE(0x280000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) - - ROM_REGION(0x08000, "nvram_data", 0) - ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) -ROM_END - -ROM_START(bonanza) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("system-bios-sx-10-0004-02.u6", 0x00000, 0x10000, CRC(fa545ba8) SHA1(db64548bd87262cd2e82175a1b66f168b5ae072d) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("techyosd-isa-bios-v1.2.u8", 0x00000, 0x04000, CRC(6adf7e71) SHA1(2b07d964cc7c2c0aa560625b7c12f38d4537d652) ) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0018-03-090894.u11", 0x000000,0x40000, CRC(32b6c8bc) SHA1(7f4097990dca268915842d4253d4257654de2cfc) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-0018-03-090894.u12", 0x040000,0x40000, CRC(d7cb191d) SHA1(2047f3668b0e41ad5347107f4e3446c0374c5bb7) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-0018-03-090894.u13", 0x080000,0x40000, CRC(1d3ddeaa) SHA1(8e73fe535882f6d634668733e550281e727fbdbc) ) - ROM_CONTINUE(0x280000, 0x40000) - ROM_LOAD("10-0018-03-090894.u15", 0x100000,0x40000, CRC(b9b3f442) SHA1(6ea5ce3eb007b95ad3350fdb634625b151ae7bdb) ) - ROM_CONTINUE(0x300000, 0x40000) - ROM_LOAD("10-0018-03-090894.u16", 0x140000,0x40000, CRC(5b0dd6f5) SHA1(8172118185179ecb7d3f958480186bf9c906785f) ) - ROM_CONTINUE(0x340000, 0x40000) - ROM_LOAD("10-0018-03-090894.u17", 0x180000,0x40000, CRC(b637eb58) SHA1(7c4615f58118d9b82575d816ef916fccbb1be0f9) ) - ROM_CONTINUE(0x380000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) - - ROM_REGION(0x08000, "nvram_data", 0) - ROM_LOAD("bq4010yma-150.u9", 0x00000, 0x02000, CRC(f4ca28ee) SHA1(17b852028568fb814df62f5870b91a8303302b55)) -ROM_END - -ROM_START(bonanzar2) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("system-bios-sx-10-0004-02.u6", 0x00000, 0x10000, CRC(fa545ba8) SHA1(db64548bd87262cd2e82175a1b66f168b5ae072d) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("techyosd-isa-bios-v1.2.u8", 0x00000, 0x04000, CRC(6adf7e71) SHA1(2b07d964cc7c2c0aa560625b7c12f38d4537d652) ) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0018-02-081794.u11", 0x000000,0x40000, CRC(f87fa935) SHA1(b06144496406231aa63149ae12a048ffab8f77d0) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-0018-02-081794.u12", 0x040000,0x40000, CRC(bd892e3e) SHA1(1b9174fe2a6eaa7687b543798099b86b9039c049) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-0018-02-081794.u13", 0x080000,0x40000, CRC(626d999e) SHA1(5c27e3b064b0235c0d6e0be8d8f78538a11647a2) ) - ROM_CONTINUE(0x280000, 0x40000) - ROM_LOAD("10-0018-02-081794.u15", 0x100000,0x40000, CRC(3b28f582) SHA1(3da61fbd92e6cc60e00eaa21d8fb04aa78cce663) ) - ROM_CONTINUE(0x300000, 0x40000) - ROM_LOAD("10-0018-02-081794.u16", 0x140000,0x40000, CRC(fe29ad76) SHA1(64aaae639f024c50c09fe920bc92e6d45ced5648) ) - ROM_CONTINUE(0x340000, 0x40000) - ROM_LOAD("10-0018-02-081794.u17", 0x180000,0x40000, CRC(066108fe) SHA1(ef837422a2a81f5ac3375b6ed68f20143ac6caec) ) - ROM_CONTINUE(0x380000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) - - ROM_REGION(0x08000, "nvram_data", 0) - ROM_LOAD("bq4010yma-150.u9", 0x00000, 0x02000, CRC(f4ca28ee) SHA1(17b852028568fb814df62f5870b91a8303302b55)) -ROM_END - -ROM_START(streetg2) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("10-0004-01_mb-bios.bin", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-0007-07c_083194_rom4.u11", 0x000000,0x40000, CRC(244c2bfa) SHA1(4f2f0fb6923b4e3f1ab4e607e29a27fb15b39fac) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-0007-07c_083194_rom5.u12", 0x040000,0x40000, CRC(c89d5dca) SHA1(212bcbf7a39243f4524b4a855fbedabd387d17f2) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-0007-07c_083194_rom6.u13", 0x080000,0x40000, CRC(6264f65f) SHA1(919a8e5d9861dc642ac0f0885faed544bbafa321) ) - ROM_CONTINUE(0x280000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) - - ROM_REGION(0x02000, "nvram", 0) - ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) -ROM_END - -ROM_START(streetg2r5) - ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ - ROM_LOAD("10-0004-01_mb-bios.bin", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) - - ROM_REGION32_LE(0x08000, "video_bios", 0) - ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) - ROM_CONTINUE( 0x00001, 0x04000 ) - - ROM_REGION(0x400000, "game_prg", 0) /* proper game */ - ROM_LOAD("10-00007-05-032194.u15", 0x000000,0x40000, CRC(cefa230f) SHA1(91fd30a3def381974fae0edb4d42d452acda19bb) ) - ROM_CONTINUE(0x200000, 0x40000) - ROM_LOAD("10-00007-05-032194.u16", 0x040000,0x40000, CRC(0be5dd19) SHA1(d0474ff5156e1fa8b4edb502c49b7e1a2b3f6169) ) - ROM_CONTINUE(0x240000, 0x40000) - ROM_LOAD("10-00007-05-032194.u17", 0x080000,0x40000, CRC(f6c996b9) SHA1(871a8d093b856511a0e2b03334ef5c66a2482622) ) - ROM_CONTINUE(0x280000, 0x40000) - - ROM_REGION32_LE(0x08000, "disk_bios", 0) - ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) - - ROM_REGION(0x08000, "nvram_data", 0) - ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) -ROM_END - -void pcat_nit_state::init_pcat_nit() -{ - m_banked_nvram = std::make_unique(0x2000); - subdevice("nvram")->set_base(m_banked_nvram.get(), 0x2000); -} - -} // anonymous namespace - -GAME( 1993, streetg, 0, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 4)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) -GAME( 1993, streetgr3, streetg, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 3)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) -GAME( 1993, streetg2, 0, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 7C)", MACHINE_NO_SOUND ) // Street Games II+, 10-0007-07 083194 -GAME( 1993, streetg2r5, streetg2, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 5)", MACHINE_NO_SOUND ) -GAME( 1994, bonanza, 0, bonanza, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Touchstar Bonanza (Revision 3)", MACHINE_NO_SOUND ) // Bonanza 10-0018-03 090894 -GAME( 1994, bonanzar2, bonanza, bonanza, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Touchstar Bonanza (Revision 2)", MACHINE_NO_SOUND ) // Bonanza 10-0018-02 081794 diff --git a/src/mame/ibmpc/pcxt.cpp b/src/mame/ibmpc/pcxt.cpp deleted file mode 100644 index 06e288bfb56..00000000000 --- a/src/mame/ibmpc/pcxt.cpp +++ /dev/null @@ -1,618 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese, Chris Hardy, David Haywood, Tomasz Slanina -/****************************************************************************************** - -PC-XT (c) 1987 IBM - -(Actually Arcade games running on more or less modified PC-XT HW) - -driver by Angelo Salese & Chris Hardy -original tetriunk.c by David Haywood & Tomasz Slanina - -Notes: -- The Korean Tetris is a blantant rip-off of the Mirrorsoft/Andromeda Software Tetris PC - version; - -TODO: -- 02851: tetriskr: Corrupt game graphics after some time of gameplay, caused by a wrong - reading of the i/o $3c8 bit 1. (seems fixed?) -- tetriskr can store inputs read during the timer irq. If ds is 0x40 when the irq is taken - it will corrupt the BIOS data area which can lead to corrupt graphics -- Add a proper FDC device. -- buzzer sound has issues in both games - -******************************************************************************************** -Filetto HW notes: -The PCB is a un-modified IBM-PC with a CGA adapter & a prototyping card that controls the -interface between the pc and the Jamma connectors.Additionally there's also a UM5100 sound -chip for the sound. -PCB Part Number: S/N 90289764 NOVARXT -PCB Contents: -1x UMC 8923S-UM5100 voice processor (upper board) -1x MMI PAL16L8ACN-940CRK9 (upper board) -1x AMD AMPAL16R8APC-8804DM (upper board) -1x AMD P8088-1 main processor 8.000MHz (lower board) -1x Proton PT8010AF PLCC 28.636MHz (lower board) -1x UMC 8928LP-UM8272A floppy disk controller (lower board) -1x UMC 8935CS-UM82C11 Printer Adapter Interface (lower board) -1x UMC 8936CS-UM8250B Programmable asynchronous communications element (lower board) -1x UMC 8937NS-UM82C8167 Real Time Clock (lower board) -1x Yamaha V6363 CMDC QFP (lower board) -There isn't any keyboard found connected to the pcb. -******************************************************************************************** -Filetto SW notes: -The software of this game can be extracted with a normal Windows program extractor. -The files names are: --command.com (1) --ibmbio.com (1) --ibmdos.com (1) --ansi.sys (1) --config.sys (2) --autoexec.bat (3) --x.exe (4) -(1)This is an old Italian version of MS-DOS (v3.30 18th March 1987). -(2)Contains "device=ansi.sys",it's an hook-up for the graphics used by the BIOS. -(3)It has an Echo off (as you can notice from the game itself) and then the loading of the -main program (x.exe). -(4)The main program,done in plain Basic with several Italian comments in it.The date of -the main program is 9th October 1990. - -******************************************************************************************/ - -#include "emu.h" -#include "bus/isa/cga.h" -#include "cpu/i86/i86.h" -#include "sound/hc55516.h" -#include "machine/bankdev.h" -#include "machine/genpc.h" - -class pcxt_state : public driver_device -{ -public: - pcxt_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_mb(*this, "mb"), - m_bank(*this, "bank"), - m_cvsd(*this, "voice"), - m_samples(*this, "samples"){ } - - void tetriskr(machine_config &config); - void filetto(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - TIMER_CALLBACK_MEMBER(sample_tick); - -private: - int m_lastvalue; - uint8_t m_disk_data[2]; - uint8_t m_port_b_data; - uint8_t m_status; - uint8_t m_clr_status; - uint8_t m_voice, m_bit; - uint32_t m_vaddr; - emu_timer *m_sample; - - uint8_t disk_iobank_r(offs_t offset); - void disk_iobank_w(offs_t offset, uint8_t data); - uint8_t fdc765_status_r(); - uint8_t fdc765_data_r(); - void fdc765_data_w(uint8_t data); - void fdc_dor_w(uint8_t data); - uint8_t port_a_r(); - uint8_t port_b_r(); - uint8_t port_c_r(); - void port_b_w(uint8_t data); - void voice_start_w(uint8_t data); - - required_device m_maincpu; - required_device m_mb; - optional_device m_bank; - optional_device m_cvsd; - optional_memory_region m_samples; - void bank_map(address_map &map); - void filetto_io(address_map &map); - void filetto_map(address_map &map); - void tetriskr_io(address_map &map); - void tetriskr_map(address_map &map); -}; - - -class isa8_cga_filetto_device : public isa8_cga_device -{ -public: - // construction/destruction - isa8_cga_filetto_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - virtual const tiny_rom_entry *device_rom_region() const override; -}; - -DEFINE_DEVICE_TYPE(ISA8_CGA_FILETTO, isa8_cga_filetto_device, "filetto_cga", "ISA8_CGA_FILETTO") - -//------------------------------------------------- -// isa8_cga_filetto_device - constructor -//------------------------------------------------- - -isa8_cga_filetto_device::isa8_cga_filetto_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - isa8_cga_device(mconfig, ISA8_CGA_FILETTO, tag, owner, clock) -{ -} - -ROM_START( filetto_cga ) - ROM_REGION( 0x2000, "gfx1", 0 ) - ROM_LOAD("u67.bin", 0x0000, 0x2000, CRC(09710122) SHA1(de84bdd9245df287bbd3bb808f0c3531d13a3545) ) -ROM_END - -const tiny_rom_entry *isa8_cga_filetto_device::device_rom_region() const -{ - return ROM_NAME( filetto_cga ); -} - - - -class isa8_cga_tetriskr_device : public isa8_cga_superimpose_device -{ -public: - // construction/destruction - isa8_cga_tetriskr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; - virtual void device_start() override; - virtual const tiny_rom_entry *device_rom_region() const override; - - uint8_t bg_bank_r(); - void bg_bank_w(uint8_t data); -private: - required_region_ptr m_bg; - uint8_t m_bg_bank = 0; -}; - - -/* for superimposing CGA over a different source video (i.e. tetriskr) */ -DEFINE_DEVICE_TYPE(ISA8_CGA_TETRISKR, isa8_cga_tetriskr_device, "tetriskr_cga", "ISA8_CGA_TETRISKR") - -//------------------------------------------------- -// isa8_cga_tetriskr_device - constructor -//------------------------------------------------- - -isa8_cga_tetriskr_device::isa8_cga_tetriskr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - isa8_cga_superimpose_device(mconfig, ISA8_CGA_TETRISKR, tag, owner, clock), - m_bg(*this, "gfx2") -{ -} - - -void isa8_cga_tetriskr_device::device_start() -{ - m_bg_bank = 0; - isa8_cga_superimpose_device::device_start(); - m_isa->install_device(0x3c0, 0x3c0, read8smo_delegate(*this, FUNC(isa8_cga_tetriskr_device::bg_bank_r)), write8smo_delegate(*this, FUNC(isa8_cga_tetriskr_device::bg_bank_w))); -} - -void isa8_cga_tetriskr_device::bg_bank_w(uint8_t data) -{ - m_bg_bank = (data & 0x0f) ^ 8; -} - -uint8_t isa8_cga_tetriskr_device::bg_bank_r() -{ - return 0xff; -} - - -uint32_t isa8_cga_tetriskr_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - //popmessage("%04x",m_start_offs); - - bitmap.fill(rgb_t::black(), cliprect); - - for(int y=cliprect.min_y;y<=cliprect.max_y;y++) - { - int yi = y % 8; - int yj = y / 8; - for(int x=cliprect.min_x;x<=cliprect.max_x;x++) - { - int xi = x % 8; - int xj = x / 8; - uint8_t color = 0; - /* TODO: first byte seems bogus? */ - for(int pen_i = 0;pen_i<4;pen_i++) - color |= ((m_bg[yj*320/8+xj+(pen_i*0x20000)+yi*0x400+m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i; - - bitmap.pix(y, x) = m_palette->pen(color); - } - } - - isa8_cga_device::screen_update(screen, bitmap, cliprect); - return 0; -} - -ROM_START( tetriskr_cga ) - ROM_REGION( 0x2000, "gfx1",ROMREGION_ERASE00 ) /* gfx - 1bpp font*/ - ROM_LOAD( "b-3.u36", 0x1800, 0x0800, CRC(1a636f9a) SHA1(a356cc57914d0c9b9127670b55d1f340e64b1ac9) ) - ROM_IGNORE( 0x1800 ) - - ROM_REGION( 0x80000+1, "gfx2",ROMREGION_INVERT | ROMREGION_ERASEFF ) - ROM_LOAD( "b-1.u59", 0x00000, 0x10000, CRC(4719d986) SHA1(6e0499944b968d96fbbfa3ead6237d69c769d634)) - ROM_LOAD( "b-2.u58", 0x10000, 0x10000, CRC(599e1154) SHA1(14d99f90b4fedeab0ac24ffa9b1fd9ad0f0ba699)) - ROM_LOAD( "b-4.u54", 0x20000, 0x10000, CRC(e112c450) SHA1(dfdecfc6bd617ec520b7563b7caf44b79d498bd3)) - ROM_LOAD( "b-5.u53", 0x30000, 0x10000, CRC(050b7650) SHA1(5981dda4ed43b6e81fbe48bfba90a8775d5ecddf)) - ROM_LOAD( "b-6.u49", 0x40000, 0x10000, CRC(d596ceb0) SHA1(8c82fb638688971ef11159a6b240253e63f0949d)) - ROM_LOAD( "b-7.u48", 0x50000, 0x10000, CRC(79336b6c) SHA1(7a95875f3071bdc3ee25c0e6a5a3c00ef02dc977)) - ROM_LOAD( "b-8.u44", 0x60000, 0x10000, CRC(1f82121a) SHA1(106da0f39f1260d0761217ed0a24c1611bfd7f05)) - ROM_LOAD( "b-9.u43", 0x70000, 0x10000, CRC(4ea22349) SHA1(14dfd3dbd51f8bd6f3290293b8ea1c165e8cf7fd)) -ROM_END - -const tiny_rom_entry *isa8_cga_tetriskr_device::device_rom_region() const -{ - return ROM_NAME( tetriskr_cga ); -} - -uint8_t pcxt_state::disk_iobank_r(offs_t offset) -{ - //printf("Read Prototyping card [%02x] @ PC=%05x\n",offset,m_maincpu->pc()); - //if(offset == 0) return ioport("DSW")->read(); - if(offset == 1) return ioport("IN1")->read(); - - return m_disk_data[offset]; -} - -void pcxt_state::disk_iobank_w(offs_t offset, uint8_t data) -{ -/* - BIOS does a single out $0310,$F0 on reset - - Then does 2 outs to set the bank.. - - X1 X2 - - $F0 $F2 = m0 - $F1 $F2 = m1 - $F0 $F3 = m2 - $F1 $F3 = m3 - - The sequence of - - out $0310,X1 - out $0310,X2 - - sets the selected rom that appears in $C0000-$CFFFF - -*/ - int bank = 0; - -// printf("bank %d set to %02X\n", offset,data); - - if (data == 0xF0) - { - bank = 0; - } - else - { - if((m_lastvalue == 0xF0) && (data == 0xF2)) - bank = 0; - else if ((m_lastvalue == 0xF1) && (data == 0xF2)) - bank = 1; - else if ((m_lastvalue == 0xF0) && (data == 0xF3)) - bank = 2; - else if ((m_lastvalue == 0xF1) && (data == 0xF3)) - bank = 3; - } - - if (!(data & 0xf0)) - { - int bit = (data >> 1) - 2; - m_voice &= ~(1 << bit); - m_voice |= BIT(data, 0) << bit; - } - - m_bank->set_bank(bank); - - m_lastvalue = data; - - m_disk_data[offset] = data; -} - -uint8_t pcxt_state::port_a_r() -{ - return 0xaa;//harmless keyboard error occurs without this -} - -uint8_t pcxt_state::port_b_r() -{ - return m_port_b_data; -} - -uint8_t pcxt_state::port_c_r() -{ - return 0x00;// DIPS? -} - -/*'buzzer' sound routes here*/ -/* Filetto uses this for either beep and um5100 sound routing,probably there's a mux somewhere.*/ -/* The Korean Tetris uses it as a regular buzzer,probably the sound is all in there...*/ -void pcxt_state::port_b_w(uint8_t data) -{ - m_mb->m_pit8253->write_gate2(BIT(data, 0)); - m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); - m_port_b_data = data; -// m_cvsd->digit_w(data); -} - -/*Floppy Disk Controller 765 device*/ -/*Currently we only emulate it at a point that the BIOS will pass the checks*/ - -#define FDC_BUSY 0x10 -#define FDC_WRITE 0x40 -#define FDC_READ 0x00 /*~0x40*/ - -uint8_t pcxt_state::fdc765_status_r() -{ - uint8_t tmp; - tmp = m_status | 0x80; - m_clr_status++; - if(m_clr_status == 0x10) - { - m_status = 0; - m_clr_status = 0; - } - return tmp; -} - -uint8_t pcxt_state::fdc765_data_r() -{ - m_status = (FDC_READ); - m_mb->m_pic8259->ir6_w(0); - return 0xc0; -} - -void pcxt_state::fdc765_data_w(uint8_t data) -{ - m_status = (FDC_WRITE); -} - - -void pcxt_state::fdc_dor_w(uint8_t data) -{ - m_mb->m_pic8259->ir6_w(1); -} - -// TODO: um5100 device; the actual codec may be sightly different -void pcxt_state::voice_start_w(uint8_t data) -{ - m_sample->adjust(attotime::zero, 0, attotime::from_hz(28000)); - m_bit = 7; - m_vaddr = ((m_voice & 0xf / 5) | (BIT(m_voice, 4) << 2)) * 0x8000; - logerror("%x %x\n",m_voice,m_vaddr); -} - -void pcxt_state::filetto_map(address_map &map) -{ - map(0xc0000, 0xcffff).m(m_bank, FUNC(address_map_bank_device::amap8)); - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - -void pcxt_state::filetto_io(address_map &map) -{ - map.global_mask(0x3ff); - map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map)); - map(0x0060, 0x0060).r(FUNC(pcxt_state::port_a_r)); //not a real 8255 - map(0x0061, 0x0061).rw(FUNC(pcxt_state::port_b_r), FUNC(pcxt_state::port_b_w)); - map(0x0062, 0x0062).r(FUNC(pcxt_state::port_c_r)); - map(0x0201, 0x0201).portr("COIN"); //game port - map(0x0310, 0x0311).rw(FUNC(pcxt_state::disk_iobank_r), FUNC(pcxt_state::disk_iobank_w)); //Prototyping card - map(0x0312, 0x0312).portr("IN0"); //Prototyping card,read only - map(0x0313, 0x0313).w(FUNC(pcxt_state::voice_start_w)); - map(0x03f2, 0x03f2).w(FUNC(pcxt_state::fdc_dor_w)); - map(0x03f4, 0x03f4).r(FUNC(pcxt_state::fdc765_status_r)); //765 Floppy Disk Controller (FDC) Status - map(0x03f5, 0x03f5).rw(FUNC(pcxt_state::fdc765_data_r), FUNC(pcxt_state::fdc765_data_w));//FDC Data -} - -void pcxt_state::tetriskr_map(address_map &map) -{ - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - -void pcxt_state::tetriskr_io(address_map &map) -{ - map.global_mask(0x3ff); - map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map)); - map(0x0060, 0x0060).r(FUNC(pcxt_state::port_a_r)); //not a real 8255 - map(0x0061, 0x0061).rw(FUNC(pcxt_state::port_b_r), FUNC(pcxt_state::port_b_w)); - map(0x0062, 0x0062).r(FUNC(pcxt_state::port_c_r)); - map(0x03c8, 0x03c8).portr("IN0"); - map(0x03c9, 0x03c9).portr("IN1"); -// map(0x03ce, 0x03ce).portr("IN1"); //read then discarded? -} - -void pcxt_state::bank_map(address_map &map) -{ - map(0x00000, 0x3ffff).rom().region("game_prg", 0); -} - -static INPUT_PORTS_START( filetto ) - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - - PORT_START("IN1") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Coinage ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Extra Play" ) - PORT_DIPSETTING( 0x04, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, "Play at 6th match reached" ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("COIN") - PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START( "pcvideo_cga_config" ) - PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( tetriskr ) - PORT_START("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) //probably unused - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) - PORT_START("IN1") //dip-switches - PORT_DIPNAME( 0x03, 0x03, "Starting Level" ) - PORT_DIPSETTING( 0x03, "0" ) - PORT_DIPSETTING( 0x02, "2" ) - PORT_DIPSETTING( 0x01, "4" ) - PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x04, 0x04, "Starting Bomb" ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) -// PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) duplicate - PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) - - PORT_START( "pcvideo_cga_config" ) - PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -TIMER_CALLBACK_MEMBER(pcxt_state::sample_tick) -{ - m_cvsd->digit_w(BIT(m_samples->as_u8(m_vaddr), m_bit)); - m_cvsd->clock_w(1); - m_cvsd->clock_w(0); - if (m_bit == 0) - { - m_vaddr++; - m_bit = 8; - if (!(m_vaddr % 0x8000)) - m_sample->adjust(attotime::never); - } - m_bit--; -} - -void pcxt_state::machine_start() -{ - m_sample = timer_alloc(FUNC(pcxt_state::sample_tick), this); - - m_status = 0; - m_clr_status = 0; -} - -void pcxt_state::machine_reset() -{ - m_lastvalue = -1; - m_voice = 0; -} - -static void filetto_isa8_cards(device_slot_interface &device) -{ - device.option_add_internal("filetto", ISA8_CGA_FILETTO); - device.option_add_internal("tetriskr", ISA8_CGA_TETRISKR); -} - - -void pcxt_state::filetto(machine_config &config) -{ - I8088(config, m_maincpu, XTAL(14'318'181)/3); - m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::filetto_map); - m_maincpu->set_addrmap(AS_IO, &pcxt_state::filetto_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - PCNOPPI_MOTHERBOARD(config, m_mb, 0).set_cputag(m_maincpu); - m_mb->int_callback().set_inputline(m_maincpu, 0); - m_mb->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - - ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "filetto", true); // FIXME: determine ISA bus clock - - HC55516(config, m_cvsd, 0).add_route(ALL_OUTPUTS, "mb:mono", 0.60); //8923S-UM5100 is a HC55536 with ROM hook-up - - RAM(config, RAM_TAG).set_default_size("640K"); - - ADDRESS_MAP_BANK(config, m_bank).set_map(&pcxt_state::bank_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000); -} - -void pcxt_state::tetriskr(machine_config &config) -{ - I8088(config, m_maincpu, XTAL(14'318'181)/3); - m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::tetriskr_map); - m_maincpu->set_addrmap(AS_IO, &pcxt_state::tetriskr_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - PCNOPPI_MOTHERBOARD(config, m_mb, 0).set_cputag(m_maincpu); - m_mb->int_callback().set_inputline(m_maincpu, 0); - m_mb->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - - ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "tetriskr", true); // FIXME: determine ISA bus clock - - RAM(config, RAM_TAG).set_default_size("64K"); -} - -ROM_START( filetto ) - ROM_REGION( 0x10000, "bios", 0 ) - ROM_LOAD("u49.bin", 0xc000, 0x2000, CRC(1be6948a) SHA1(9c433f63d347c211ee4663f133e8417221bc4bf0)) - ROM_RELOAD( 0x8000, 0x2000 ) - ROM_RELOAD( 0x4000, 0x2000 ) - ROM_RELOAD( 0x0000, 0x2000 ) - ROM_LOAD("u55.bin", 0xe000, 0x2000, CRC(1e455ed7) SHA1(786d18ce0ab1af45fc538a2300853e497488f0d4) ) - ROM_RELOAD( 0xa000, 0x2000 ) - ROM_RELOAD( 0x6000, 0x2000 ) - ROM_RELOAD( 0x2000, 0x2000 ) - - ROM_REGION( 0x40000, "game_prg", 0 ) // program data - ROM_LOAD( "m0.u1", 0x00000, 0x10000, CRC(2408289d) SHA1(eafc144a557a79b58bcb48545cb9c9778e61fcd3) ) - ROM_LOAD( "m1.u2", 0x10000, 0x10000, CRC(5b623114) SHA1(0d9a14e6b7f57ce4fa09762343b610a973910f58) ) - ROM_LOAD( "m2.u3", 0x20000, 0x10000, CRC(abc64869) SHA1(564fc9d90d241a7b7776160b3fd036fb08037355) ) - ROM_LOAD( "m3.u4", 0x30000, 0x10000, CRC(0c1e8a67) SHA1(f1b9280c65fcfcb5ec481cae48eb6f52d6cdbc9d) ) - - ROM_REGION( 0x40000, "samples", 0 ) // UM5100 sample roms? - ROM_LOAD("v1.u15", 0x00000, 0x20000, CRC(613ddd07) SHA1(ebda3d559315879819cb7034b5696f8e7861fe42) ) - ROM_LOAD("v2.u14", 0x20000, 0x20000, CRC(427e012e) SHA1(50514a6307e63078fe7444a96e39d834684db7df) ) -ROM_END - -ROM_START( tetriskr ) - ROM_REGION( 0x10000, "bios", 0 ) /* code */ - ROM_LOAD( "b-10.u10", 0x0000, 0x10000, CRC(efc2a0f6) SHA1(5f0f1e90237bee9b78184035a32055b059a91eb3) ) - ROM_FILL( 0x1bdb, 1, 0xba ) // patch to work around input bug mentioned above - ROM_FILL( 0x1bdc, 1, 0x00 ) - ROM_FILL( 0x1bdd, 1, 0x01 ) - ROM_FILL( 0x1bde, 1, 0x8e ) - ROM_FILL( 0x1bdf, 1, 0xda ) -ROM_END - -GAME( 1990, filetto, 0, filetto, filetto, pcxt_state, empty_init, ROT0, "Novarmatic", "Filetto (v1.05 901009)", MACHINE_IMPERFECT_SOUND ) -GAME( 1988?,tetriskr, 0, tetriskr, tetriskr, pcxt_state, empty_init, ROT0, "bootleg", "Tetris (Korean bootleg of Mirrorsoft PC-XT Tetris)", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/ibmpc/quakeat.cpp b/src/mame/ibmpc/quakeat.cpp deleted file mode 100644 index 5fc80a67b48..00000000000 --- a/src/mame/ibmpc/quakeat.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Aaron Giles -/* - - Quake Arcade Tournament - - Only the HDD is dumped. The HDD is stickered 'Release Beta 2' - - We've also seen CDs of this for sale, so maybe there should be a CD too, for the music? - -TODO: -can't be emulated without proper mb bios - - -- set info - -Quake Arcade Tournament by Lazer-Tron - -PC running Windows 95 with a Dongle on the parallel port - -Created .chd with version 0.125 - -It found the following disk paramaters... - -Input offset 511 -Cyclinders 263 -Heads 255 -Sectors 63 -Byte/Sector 512 -Sectors/Hunk 8 -Logical size 2,1163,248,864 - -The "backup" directory on hard disk was created by the dumper. - - -- Hardware info found on the following web pages: -http://web.archive.org/web/20070810060806/http://www.wave-report.com/archives/1998/98170702.htm -http://www.thedodgegarage.com/3dfx/q3d_quicksilver.htm -http://quakearcadetournament.blogspot.com/ -http://web.archive.org/web/20001001045148/http://www.quantum3d.com:80/press%20releases/4-20-98.html -https://www.quaddicted.com/webarchive/www.quaddicted.com/quake-nostalgia/quake-arcade-tournament-edition/ - -Quantum3D Heavy Metal HM233G (part of Quantum3D's Quicksilver family) -- NLX form factor system that is based on the Intel 440LX chipset -- Intel NX440LX motherboard - - Intel 82440LX AGPset (82443LX Northbridge / 82371AB PIIX4 PCI-ISA Southbridge) - - SMC FDC37C677 I/O - - Yamaha OPL3-SA3 (YMF715) Audio codec (16-bit per sample 3D audio) - - Intel Pro 10/100 PCI Ethernet NIC - - (Optional) Cirrus CL-GD5465 AGP Graphics Controller - - Intel/Phoenix BIOS -- Intel Pentium II 233 233MHz CPU processor with 512KB of L2 cache -- (1) 32MB PC66 66 MHz SDRAM 168-pin DIMM -- Microsoft Windows 95 OSR2.5 -- shock-mounted 3.1GB Ultra DMA-33 EIDE hard drive -- 12-24x CD-ROM drive -- 1.44 MB floppy drive -- Quantum3D Obsidian2 90-4440 AGP AGPTV Voodoo2-based realtime 3D graphics accelerator - (a professional version of the Quantum3D Obsidian2 S-12 AGPTV) -- Companion PCI 2D/VGA: Quantum3D Ventana MGV-PCI (Alliance Semiconductor ProMotion aT25) - or Quantum3D Ventana "MGV Rush" (custom Quantum3D Ventana 50 Voodoo Rush with 3D-disabled - 2D-only BIOS and no TV-out, only using the Alliance Semiconductor ProMotion aT25) -- Quantum3D GCI-2 (Game Control Interface II) I/O board - designed to interface coin-op and - industrial input/output control devices to a PC. Fits in either PCI or ISA bus slot for - mechanical attachment only. Communications between the GCI and the PC are via a standard - RS-232 serial interface, using a 14-byte packet protocol. Power is provided by a 4-pin - Molex style disk driver power connector. - -Note: Quantum3D Quicksilver QS233G configuration seem very similar to the HM233G, with the only - exceptions being that the Quantum3D Obsidian2 90-4440 is replaced with the earlier Quantum3D - Obsidian 100SB-4440V Voodoo Graphics realtime 3D graphics accelerator with 2D Alliance - Semiconductor ProMotion aT25 MGV 2000 daughter card, and the Quantum3D GCI-2 might be replaced - with an earlier Quantum3D GCI. - -Dongle: Rainbow Technologies parallel-port security dongle (at least 1024 bytes) - -=============================================================================== -TODO: - * Add BIOS dump (standard NX440LX motherboard) - * Hook up PC hardware - * Hook up the Quantum3D GCI-2 (details? ROMs?) - * What's the dongle do? -=============================================================================== -*/ - -#include "emu.h" - -#include "pcshare.h" - -#include "cpu/i386/i386.h" -#include "emupal.h" -#include "screen.h" - - -namespace { - -class quakeat_state : public pcat_base_state -{ -public: - quakeat_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - { } - - void quake(machine_config &config); - -private: - virtual void machine_start() override; - virtual void video_start() override; - uint32_t screen_update_quake(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void quake_io(address_map &map); - void quake_map(address_map &map); -}; - - -void quakeat_state::video_start() -{ -} - -uint32_t quakeat_state::screen_update_quake(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return 0; -} - -void quakeat_state::quake_map(address_map &map) -{ - map(0x00000000, 0x0000ffff).rom().region("pc_bios", 0); /* BIOS */ -} - -void quakeat_state::quake_io(address_map &map) -{ - pcat32_io_common(map); - map(0x00e8, 0x00eb).noprw(); -// map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::read_cs0), FUNC(ide_controller_device::write_cs0)); - map(0x0300, 0x03af).noprw(); - map(0x03b0, 0x03df).noprw(); -// map(0x0278, 0x027b).w(FUNC(quakeat_state::pnp_config_w)); -// map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::read_cs1), FUNC(ide_controller_device::write_cs1)); -// map(0x0a78, 0x0a7b).w(FUNC(quakeat_state::pnp_data_w)); -// map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); -} - -/*************************************************************/ - -static INPUT_PORTS_START( quake ) -INPUT_PORTS_END - -/*************************************************************/ - -void quakeat_state::machine_start() -{ -} -/*************************************************************/ - -void quakeat_state::quake(machine_config &config) -{ - /* basic machine hardware */ - PENTIUM2(config, m_maincpu, 233000000); /* Pentium II, 233MHz */ - m_maincpu->set_addrmap(AS_PROGRAM, &quakeat_state::quake_map); - m_maincpu->set_addrmap(AS_IO, &quakeat_state::quake_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(64*8, 32*8); - screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1); - screen.set_screen_update(FUNC(quakeat_state::screen_update_quake)); - screen.set_palette("palette"); - - PALETTE(config, "palette").set_entries(0x100); -} - - -ROM_START(quake) - ROM_REGION32_LE(0x20000, "pc_bios", 0) /* motherboard bios */ - ROM_LOAD("quakearcadetournament.pcbios", 0x000000, 0x10000, NO_DUMP ) - - DISK_REGION( "disks" ) - DISK_IMAGE( "quakeat", 0, SHA1(c44695b9d521273c9d3c0e18c88f0dca0185bd7b) ) -ROM_END - -} // anonymous namespace - - -GAME( 1998, quake, 0, quake, quake, quakeat_state, empty_init, ROT0, "Lazer-Tron / iD Software", "Quake Arcade Tournament (Release Beta 2)", MACHINE_IS_SKELETON ) diff --git a/src/mame/ibmpc/queen.cpp b/src/mame/ibmpc/queen.cpp deleted file mode 100644 index 70791d7c10c..00000000000 --- a/src/mame/ibmpc/queen.cpp +++ /dev/null @@ -1,323 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Peter Ferrie -/* Queen */ - -/* - -Produttore STG -N.revisione -CPU main PCB is a standard EPIA -ROMs epia BIOS + solid state HD - -1x VIA EPIA5000EAG (main PCB) with: -VT8231 South Bridge -VIA Eden Processor -VIA EPIA Companion Chip VT1612A (Audio CODEC) -VIA EPIA Companion Chip VT6103 (Networking) -processor speed is 533MHz <- likely to be a Celeron or a Pentium III class CPU -AS - - it's a 2002 era PC at least based on the BIOS, - almost certainly newer than the standard 'PENTIUM' CPU - -- update by Peter Ferrie: -- split BIOS region into 64kb blocks and implement missing PAM registers -- VIA Apollo VXPro chipset is not compatible with Intel i430. - -*/ - - -#include "emu.h" -#include "pcshare.h" - -#include "cpu/i386/i386.h" -#include "machine/lpci.h" -#include "machine/pckeybrd.h" -#include "machine/idectrl.h" -#include "video/pc_vga.h" - -namespace { - -class queen_state : public pcat_base_state -{ -public: - queen_state(const machine_config &mconfig, device_type type, const char *tag) - : pcat_base_state(mconfig, type, tag) - { - } - - void queen(machine_config &config); - -private: - std::unique_ptr m_bios_ram; - std::unique_ptr m_bios_ext_ram; - uint8_t m_mtxc_config_reg[256]{}; - uint8_t m_piix4_config_reg[4][256]{}; - - void bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - - void bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); - virtual void machine_start() override; - virtual void machine_reset() override; - void intel82439tx_init(); - void queen_io(address_map &map); - void queen_map(address_map &map); - - uint8_t mtxc_config_r(int function, int reg); - void mtxc_config_w(int function, int reg, uint8_t data); - uint32_t intel82439tx_pci_r(int function, int reg, uint32_t mem_mask); - void intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); - uint8_t piix4_config_r(int function, int reg); - void piix4_config_w(int function, int reg, uint8_t data); - uint32_t intel82371ab_pci_r(int function, int reg, uint32_t mem_mask); - void intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); -}; - - -// Intel 82439TX System Controller (MTXC) - -uint8_t queen_state::mtxc_config_r(int function, int reg) -{ -// osd_printf_debug("MTXC: read %d, %02X\n", function, reg); - - return m_mtxc_config_reg[reg]; -} - -void queen_state::mtxc_config_w(int function, int reg, uint8_t data) -{ - printf("MTXC: write %d, %02X, %02X\n", function, reg, data); - - /* - memory banking with North Bridge: - 0x63 (PAM) xx-- ---- BIOS area 0xf0000-0xfffff - --xx ---- BIOS extension 0xe0000 - 0xeffff - ---- xx-- ISA add-on BIOS 0xd0000 - 0xdffff - ---- --xx ISA add-on BIOS 0xc0000 - 0xcffff - - 10 -> 1 = Write Enable, 0 = Read Enable - */ - - if (reg == 0x63) - { - if (data & 0x20) // enable RAM access to region 0xf0000 - 0xfffff - membank("bios_bank")->set_base(m_bios_ram.get()); - else // disable RAM access (reads go to BIOS ROM) - membank("bios_bank")->set_base(memregion("bios")->base() + 0x30000); - if (data & 0x80) // enable RAM access to region 0xe0000 - 0xeffff - membank("bios_ext")->set_base(m_bios_ext_ram.get()); - else - membank("bios_ext")->set_base(memregion("bios")->base() + 0x20000); - } - - m_mtxc_config_reg[reg] = data; -} - -void queen_state::intel82439tx_init() -{ - m_mtxc_config_reg[0x60] = 0x02; - m_mtxc_config_reg[0x61] = 0x02; - m_mtxc_config_reg[0x62] = 0x02; - m_mtxc_config_reg[0x63] = 0x02; - m_mtxc_config_reg[0x64] = 0x02; - m_mtxc_config_reg[0x65] = 0x02; -} - -uint32_t queen_state::intel82439tx_pci_r(int function, int reg, uint32_t mem_mask) -{ - uint32_t r = 0; - if (ACCESSING_BITS_24_31) - { - r |= mtxc_config_r(function, reg + 3) << 24; - } - if (ACCESSING_BITS_16_23) - { - r |= mtxc_config_r(function, reg + 2) << 16; - } - if (ACCESSING_BITS_8_15) - { - r |= mtxc_config_r(function, reg + 1) << 8; - } - if (ACCESSING_BITS_0_7) - { - r |= mtxc_config_r(function, reg + 0) << 0; - } - return r; -} - -void queen_state::intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) -{ - if (ACCESSING_BITS_24_31) - { - mtxc_config_w(function, reg + 3, (data >> 24) & 0xff); - } - if (ACCESSING_BITS_16_23) - { - mtxc_config_w(function, reg + 2, (data >> 16) & 0xff); - } - if (ACCESSING_BITS_8_15) - { - mtxc_config_w(function, reg + 1, (data >> 8) & 0xff); - } - if (ACCESSING_BITS_0_7) - { - mtxc_config_w(function, reg + 0, (data >> 0) & 0xff); - } -} - -// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) - -uint8_t queen_state::piix4_config_r(int function, int reg) -{ -// osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); - if ((function < 4) && (reg < 256)) - return m_piix4_config_reg[function][reg]; - else - return 0; // BIOS performs a brute-force scan for devices -} - -void queen_state::piix4_config_w(int function, int reg, uint8_t data) -{ -// osd_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); - if ((function < 4) && (reg < 256)) - m_piix4_config_reg[function][reg] = data; -} - -uint32_t queen_state::intel82371ab_pci_r(int function, int reg, uint32_t mem_mask) -{ - uint32_t r = 0; - if (ACCESSING_BITS_24_31) - { - r |= piix4_config_r(function, reg + 3) << 24; - } - if (ACCESSING_BITS_16_23) - { - r |= piix4_config_r(function, reg + 2) << 16; - } - if (ACCESSING_BITS_8_15) - { - r |= piix4_config_r(function, reg + 1) << 8; - } - if (ACCESSING_BITS_0_7) - { - r |= piix4_config_r(function, reg + 0) << 0; - } - return r; -} - -void queen_state::intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) -{ - if (ACCESSING_BITS_24_31) - { - piix4_config_w(function, reg + 3, (data >> 24) & 0xff); - } - if (ACCESSING_BITS_16_23) - { - piix4_config_w(function, reg + 2, (data >> 16) & 0xff); - } - if (ACCESSING_BITS_8_15) - { - piix4_config_w(function, reg + 1, (data >> 8) & 0xff); - } - if (ACCESSING_BITS_0_7) - { - piix4_config_w(function, reg + 0, (data >> 0) & 0xff); - } -} - - -void queen_state::bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (m_mtxc_config_reg[0x63] & 0x40) // write to RAM if this region is write-enabled - { - COMBINE_DATA(m_bios_ext_ram.get() + offset); - } -} - - -void queen_state::bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) -{ - if (m_mtxc_config_reg[0x63] & 0x10) // write to RAM if this region is write-enabled - { - COMBINE_DATA(m_bios_ram.get() + offset); - } -} - -void queen_state::queen_map(address_map &map) -{ - map(0x00000000, 0x0009ffff).ram(); - map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); - map(0x000e0000, 0x000effff).bankr("bios_ext").w(FUNC(queen_state::bios_ext_ram_w)); - map(0x000f0000, 0x000fffff).bankr("bios_bank").w(FUNC(queen_state::bios_ram_w)); - map(0x00100000, 0x01ffffff).ram(); - map(0xfffc0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ -} - -void queen_state::queen_io(address_map &map) -{ - pcat32_io_common(map); - map(0x00e8, 0x00ef).noprw(); - - map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); - map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); - map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); - map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); - map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); - map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); - map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); - - map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); -} - -void queen_state::machine_start() -{ - m_bios_ram = std::make_unique(0x10000/4); - m_bios_ext_ram = std::make_unique(0x10000/4); - - intel82439tx_init(); -} - -void queen_state::machine_reset() -{ - membank("bios_bank")->set_base(memregion("bios")->base() + 0x30000); - membank("bios_ext")->set_base(memregion("bios")->base() + 0x20000); -} - -void queen_state::queen(machine_config &config) -{ - PENTIUM3(config, m_maincpu, 533000000/16); // Celeron or Pentium 3, 533 Mhz - m_maincpu->set_addrmap(AS_PROGRAM, &queen_state::queen_map); - m_maincpu->set_addrmap(AS_IO, &queen_state::queen_io); - m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); - - pcat_common(config); - - pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); - pcibus.set_device(0, FUNC(queen_state::intel82439tx_pci_r), FUNC(queen_state::intel82439tx_pci_w)); - pcibus.set_device(7, FUNC(queen_state::intel82371ab_pci_r), FUNC(queen_state::intel82371ab_pci_w)); - - ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); - ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); - - ide_controller_32_device &ide2(IDE_CONTROLLER_32(config, "ide2").options(ata_devices, nullptr, nullptr, true)); - ide2.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir7_w)); - - /* video hardware */ - pcvideo_vga(config); -} - - -ROM_START( queen ) - ROM_REGION32_LE( 0x40000, "bios", 0 ) - ROM_LOAD( "bios-original.bin", 0x00000, 0x40000, CRC(feb542d4) SHA1(3cc5d8aeb0e3b7d9ed33248a4f3dc507d29debd9) ) - - ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed -// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) -// ROM_CONTINUE( 0x0001, 0x4000 ) - - DISK_REGION( "ide:0:hdd:image" ) - DISK_IMAGE( "pqiidediskonmodule", 0,SHA1(a56efcc711b1c5a2e63160b3088001a8c4fb56c2) ) -ROM_END - -} // anonymous namespace - - -GAME( 2002?, queen, 0, queen, 0, queen_state, empty_init, ROT0, "STG", "Queen?", MACHINE_IS_SKELETON ) diff --git a/src/mame/ibmpc/sis630.cpp b/src/mame/ibmpc/sis630.cpp deleted file mode 100644 index 1a452974a86..00000000000 --- a/src/mame/ibmpc/sis630.cpp +++ /dev/null @@ -1,305 +0,0 @@ -// license: BSD-3-Clause -// copyright-holders: Angelo Salese, R. Belmont -// thanks-to: Diego Nappino -/************************************************************************************************** - - SiS 630 chipset based PC - - TODO (main): - - PS/2 loses IRQs, mouse is unusable, "ibm" BIOS doesn't work at all; - - '900 Ethernet (missing ROM dump); - - USB controllers (OpenHCI complaint); - - Floppy drive, unsupported SMC37C673 default; - - ACPI is not fully lpc-acpi complaint; - - EISA slots; - - PnP from LPC; - - SMBus; - - Super I/O handling in LPC (HW motherboard monitor, cfr. I/O $294 reads in shutms11 fan tests); - - TODO (usability, to be moved in a SW list): - - windows xp sp3: tests HW then does an ACPI devtrap write ($48), will eventually BSoD with - ACPI STOP #a5 error with param $11 - \- To bypass hold F7 while the "to install SCSI drivers [...] press F6" appears. - And by F7 I really mean it :shrug: - - - windows xp sp3: BSoD during install with a STOP #0a IRQL_NOT_LESS_OR_EQUAL; - - - windows neptune: BSoD during ethernet check (after time clock setup) - with a STOP #a0 INTERNAL_POWER_ERROR with param1 0x5 ("reserved"!?) - - - gamecstl Kontron BIOS: - \- hangs at PC=0xf3cf2, again wanting a SMI# from devtrap_en_w; - \- No PS/2 inputs; - - - gamecstl dump (tested from shutms11, also see notes below): - \- Currently black screens before booting normal Windows, reading $5004 from the LPC ACPI - (flip EAX to non-zero to bypass). - NB: it also writes to $5048 once (devtrap_en_w), which should generate a SMI# event; - \- Doesn't accept any PS/2 input, tries to install a "PCI standard CPU Host Bridge" (?), - hangs there; - \- GUI is never recognized no matter what, punts with DirectX not installed; - - - xubuntu 6.10: throws several SCSIDEV unhandled $46 & $51 commands - (get configuration/read disc information), - eventually punts to prompt with a "can't access tty: job control turned off" (on live CD) or - hangs at "Configuring network interfaces" (on actual install); - - - xubuntu 10.10: stalls after '900 ethernet check; - - - Haiku 0.1: hangs throwing an "unhandled READ TOC format 2", - serial COM1 prints a "vm_mark_page_range_inuse: page 0x9f in non-free state 7!" - - - Red Hat 6.2: Triple Faults on x87 exception check - \- prints the type of mounted floating point exception if bypassed. - -=================================================================================================== - - Cristaltec "Game Cristal" (MAME bootleg) - - Skeleton driver by R. Belmont, based on taitowlf.cpp by Ville Linde - - Notes: - - Specs: P3-866, SiS 630 motherboard + integrated graphics card, - SiS 7018 sound, DirectX 8.1. - - Image is just a more or less stock Windows 98SE with a customized shell - "Ialoader.exe" (sic) to boot the frontend, located in C:\WINDOWS - It will eventually hang after throwing a "DirectX missing" error. - - In order to bypass the shell launcher, you should: - 1. edit C:\WINDOWS\system.ini and change shell property to explorer.exe - 2. remove the autoexec.bat contents, it will otherwise copy a bunch of .ini - files from C:\dat to C:\WINDOWS, and replacing the system.ini shell launcher. - Alternatively you can also execute "open.exe" from MS-DOS, that removes above customization - too. - - (gamecstl) Device Manager installed devices: - - two Samsung SyncMaster 900SL monitors ('630 + '301?); - - SiS 630 display adapter; - - Samsung CD-ROM SC-152L; - - SiS 5513 Dual PCI IDE Controller; - - COM1, COM2, LPT1 enabled; - - a QDI USBDisk USB Mass Storage SCSI driver; - - a SiS 7001 PCI to USB Open Host Controller + USB root hub x 2; - - C:\drvs contains a collection of drivers, mostly the ones described above. - - C:\WINDOWS\temp has a couple footprints: - 1. has a Portuguese version of the Intel Processor Identification Utility, - most likely used for binding the emulator to the CPU serial via CPUID; - 2. has u3spwd.exe (USB Flash Disk), likely used to copy the necessary files for - making the frontend to work; - - Input is via a custom COM1 port JAMMA adaptor. - - The custom emulator is a heavily modified version of MAME32. If you extract the - disk image, it's in C:\GH4\GH4.EXE. It's UPX compressed, so unpack it before doing - any forensics. The emulator does run on Windows as new as XP Pro SP2 but you can't - control it due to the lack of the custom input. - - C:\GH4\mvs contains movie clips of the emulated games. - These are MS-CRAM encoded, 288x208 at 20 fps, stereo MS ADPCM with 11025 Hz sample rate, - 36 seconds length. - Mentioning this because SiS 630 has several HW registers dedicated to video playback, - which will be most likely used once we get there. - - C:\GH4\rdir contains filled NVRAM directory of the supported games. - These are probably copied from a factory default (like skipping NVRAM errors in spang & mk), - needs to be extensively checked if they can be flushed and given a working state with no - arbitrary user data (i.e. the mk games sports about 3 hours of playtime each) - - Updates 27/11/2007 (Diego Nappino): - The COM1 port is opened at 19200 bps, No parity, 8 bit data, 1 stop bit. - The protocol is based on a 6 bytes frame with a leading byte valued 0x05 and a trailing one at 0x02 - The four middle bytes are used, in negative logic (0xFF = No button pressed), to implement the inputs. - Each bit meaning as follows: - - Byte 1 Byte 2 Byte 3 Byte 4 - Bit 0 P1-Credit P1-Button C P2-Left UNUSED - Bit 1 P1-Start P1-Button D P2-Right UNUSED - Bit 2 P1-Down P1-Button E P2-Button A SERVICE - Bit 3 P1-Up TEST P2-Button B UNUSED - Bit 4 P1-Left P2-Credit P2-Button C UNUSED - Bit 5 P1-Right P2-Start P2-Button D UNUSED - Bit 6 P1-Button A P2-Down P2-Button E UNUSED - Bit 7 P1-Button B P2-Up VIDEO-MODE UNUSED - - The JAMMA adaptor sends a byte frame each time an input changes. - So for example, if the P1-Button A and P1-Button B are both pressed, it will send: - - 0x05 0xFC 0xFF 0xFF 0xFF 0x02 - - And when the buttons are both released - - 0x05 0xFF 0xFF 0xFF 0xFF 0x02 - - CPUID info: - - Original set: - CPUID Level: EAX: EBX: ECX: EDX: - 00000000 00000003 756E6547 6C65746E 49656E69 - 00000001 0000068A 00000002 00000000 0387F9FF - 00000002 03020101 00000000 00000000 0C040882 - 00000003 00000000 00000000 CA976D2E 000082F6 - 80000000 00000000 00000000 CA976D2E 000082F6 - C0000000 00000000 00000000 CA976D2E 000082F6 - - Version 2: - CPUID Level: EAX: EBX: ECX: EDX: - 00000000 00000003 756E6547 6C65746E 49656E69 - 00000001 0000068A 00000002 00000000 0387F9FF - 00000002 03020101 00000000 00000000 0C040882 - 00000003 00000000 00000000 B8BA1941 00038881 - 80000000 00000000 00000000 B8BA1941 00038881 - C0000000 00000000 00000000 B8BA1941 00038881 - -**************************************************************************************************/ - -#include "emu.h" -#include "cpu/i386/i386.h" -#include "bus/isa/isa_cards.h" -#include "bus/pc_kbd/keyboards.h" -#include "machine/intelfsh.h" -#include "machine/pci.h" -#include "machine/sis5513_ide.h" -#include "machine/sis630_host.h" -#include "machine/sis630_gui.h" -#include "machine/sis7001_usb.h" -#include "machine/sis7018_audio.h" -#include "machine/sis900_eth.h" -#include "machine/sis950_lpc.h" -#include "machine/sis950_smbus.h" -//#include "machine/fdc37c93x.h" - -class sis630_state : public driver_device -{ -public: - sis630_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_ide_00_1(*this, "pci:00.1") - , m_lpc_01_0(*this, "pci:01.0") - { } - - void sis630(machine_config &config); - void gamecstl(machine_config &config); - -private: - - required_device m_maincpu; - required_device m_ide_00_1; - required_device m_lpc_01_0; - -// void main_io(address_map &map); -// void main_map(address_map &map); -}; - - -static INPUT_PORTS_START(sis630) -INPUT_PORTS_END - -void sis630_state::sis630(machine_config &config) -{ - // Slot 1/Socket 370, Coppermine FC-PGA @ 500~850+/100 MHz or Celeron PPGA 300~600+ MHz - // TODO: lowered rate for debugging aid, needs a slot option anyway - PENTIUM3(config, m_maincpu, 100'000'000); -// m_maincpu->set_addrmap(AS_PROGRAM, &sis630_state::main_map); -// m_maincpu->set_addrmap(AS_IO, &sis630_state::main_io); - m_maincpu->set_irq_acknowledge_callback("pci:01.0:pic_master", FUNC(pic8259_device::inta_cb)); -// m_maincpu->smiact().set("pci:00.0", FUNC(sis950_lpc_device::smi_act_w)); - - // TODO: unknown flash ROM types - // Needs a $80000 sized ROM - AMD_29F400T(config, "flash"); - - PCI_ROOT(config, "pci", 0); - // up to 512MB, 2 x DIMM sockets - SIS630_HOST(config, "pci:00.0", 0, "maincpu", 256*1024*1024); - SIS5513_IDE(config, m_ide_00_1, 0, "maincpu"); - // TODO: both on same line as default, should also trigger towards LPC - m_ide_00_1->irq_pri().set("pci:01.0:pic_slave", FUNC(pic8259_device::ir6_w)); - //FUNC(sis950_lpc_device::pc_irq14_w)); - m_ide_00_1->irq_sec().set("pci:01.0:pic_slave", FUNC(pic8259_device::ir7_w)); - //FUNC(sis950_lpc_device::pc_mirq0_w)); - - SIS950_LPC (config, m_lpc_01_0, XTAL(33'000'000), "maincpu", "flash"); - m_lpc_01_0->fast_reset_cb().set([this] (int state) { - if (state) - machine().schedule_soft_reset(); - }); - LPC_ACPI (config, "pci:01.0:acpi", 0); - SIS950_SMBUS(config, "pci:01.0:smbus", 0); - - SIS900_ETH(config, "pci:01.1", 0); - // USB config: 2 on back, 3 on front. Front is fn 2 - SIS7001_USB(config, "pci:01.2", 0, 3); - SIS7001_USB(config, "pci:01.3", 0, 2); - SIS7018_AUDIO(config, "pci:01.4", 0); - // documentation doesn't mention modem part #, derived from Shuttle MS11 MB manual -// SIS7013_MODEM_AC97(config, "pci:01.6" - - // "Virtual PCI-to-PCI Bridge" - SIS630_BRIDGE(config, "pci:02.0", 0, "pci:02.0:00.0"); - // GUI must go under the virtual bridge - // This will be correctly identified as bus #1-dev #0-func #0 by the Award BIOS - SIS630_GUI(config, "pci:02.0:00.0", 0); - - // optional stuff (according to Kontron 786LCD manual) -// "pci:08.0" SCSI controller (vendor=1000 NCR / LSI Logic / Symbios Logic device=0012 53C895A) -// "pci:09.0" IEEE1394 controller (vendor=1033 NEC device=00ce uPD72872 / μPD72872) - - // TODO: 3 expansion PCI slots (PC104+) - // "pci:09.x" to "pci:12.x"? - // (PIC-MG) - // "pci:20.x" to "pci:17.x"? - - // TODO: 1 parallel + 2 serial ports - // TODO: 1 game port ('7018?) - - // TODO: AMR (Audio/modem riser) + UPT (Panel Link-TV out), assume [E]ISA complaint, needs specific slot options -// ISA16_SLOT(config, "isa1", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); -// ISA16_SLOT(config, "isa2", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); -} - -// Kontron 786LCD/3.5 based -void sis630_state::gamecstl(machine_config &config) -{ - sis630_state::sis630(config); - // TODO: Actually Celeron, as also stated by the BIOS - PENTIUM3(config.replace(), m_maincpu, 100'000'000); - - // tries to install '900 on Windows boot, which implies it doesn't have it - // (leave it on for now since it has specific option in Setup BIOS) - //config.device_remove("pci:01.1"); - - // TODO: mapped RAM config - // TODO: add custom inputs - // TODO: eventually remove PS/2 connector defaults -// subdevice("pci:01.0:ps2_con")->set_default_option(nullptr); -// subdevice("pci:01.0:aux_con")->set_default_option(nullptr); -} - -ROM_START(shutms11) - ROM_REGION32_LE(0x80000, "flash", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "ms11s11d", "ms11s11d") - ROMX_LOAD( "ms11s11d.bin", 0x040000, 0x040000, CRC(27077a58) SHA1(32327ebf328cb0c2dec819c3710acc83527803c5), ROM_BIOS(0) ) - ROM_SYSTEM_BIOS(1, "ms11s134", "ms11s134") - ROMX_LOAD( "ms11s134.bin", 0x040000, 0x040000, CRC(d739c4f3) SHA1(2301e57163ac4d9b7eddcabce52fa7d01b22330e), ROM_BIOS(1) ) -ROM_END - -ROM_START(gamecstl) - ROM_REGION32_LE(0x80000, "flash", ROMREGION_ERASEFF ) - // from gamecstl HDD dump, under "C:\drvs\bios\bios1_9" - ROM_LOAD( "prod19.rom", 0x040000, 0x040000, BAD_DUMP CRC(9262306c) SHA1(5cd805622ecb4d326591b5f2cf918fe5cb1bce8e) ) - ROM_CONTINUE( 0x000000, 0x040000 ) - - DISK_REGION( "pci:00.1:ide1:0:hdd:image" ) - DISK_IMAGE( "gamecstl", 0, SHA1(b431af3c42c48ba07972d77a3d24e60ee1e4359e) ) -ROM_END - -ROM_START(gamecst2) - ROM_REGION32_LE(0x80000, "pci:01.0:flash", ROMREGION_ERASEFF ) - ROM_LOAD( "prod19.rom", 0x040000, 0x040000, BAD_DUMP CRC(9262306c) SHA1(5cd805622ecb4d326591b5f2cf918fe5cb1bce8e) ) - ROM_CONTINUE( 0x000000, 0x040000 ) - - DISK_REGION( "pci:00.1:ide1:0:hdd:image" ) - DISK_IMAGE( "gamecst2", 0, SHA1(14e1b311cb474801c7bdda3164a0c220fb102159) ) -ROM_END - - -COMP( 2000, shutms11, 0, 0, sis630, sis630, sis630_state, empty_init, "Shuttle", "MS11 PC", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) - -// Arcade based games -GAME( 2002, gamecstl, 0, gamecstl, sis630, sis630_state, empty_init, ROT0, "Cristaltec", "GameCristal", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -GAME( 2002, gamecst2, gamecstl, gamecstl, sis630, sis630_state, empty_init, ROT0, "Cristaltec", "GameCristal (version 2.613)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8e932c45fe5..6f695e9fe58 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -2540,7 +2540,7 @@ galmedes // (c) 1992 Visco (Japan) jigkmgri // B41 (c) 1988 Taito Corporation (Japan) mofflott // C17 (c) 1989 Taito Corporation (Japan) -@source:at/at.cpp +@source:pc/at.cpp asi100b0 // ASI 100B0, identified as "HAM 12 TI 286 Motherboard ZERO WAIT" ab hier 286 at // 1987 AMI Bios and Diagnostics ataripc4 // Atari PC4 (286) @@ -3161,7 +3161,7 @@ atom // 1979 Acorn Atom atombb // 1982 Acorn Atom with BBC Basic atomeb // 1979 Acorn Atom with Eprom Box -@source:at/atpci.cpp +@source:pc/atpci.cpp at586 // 19?? AT 586 at586x3 // 19?? AT 586 m55hipl // 19?? Micronics M55HI-Plus @@ -3242,7 +3242,7 @@ avalnche // 030574 1978/04 [6502] cascade // bootleg catchp // 008837 prototype 1977/?? [6502] -@source:misc_chess/ave_arb.cpp +@source:chess/ave_arb.cpp arb // arbv2 // @@ -9947,7 +9947,7 @@ cabalus2 // (c) 1988 Tad + Fabtek license @source:igs/cabaret.cpp cabaret // (c) 1992 AMT -@source:ibmpc/calchase.cpp +@source:pc/calchase.cpp calchase // (c) 1999 The Game Room eggsplc // (c) 2002 The Game Room hostinv // (c) 1998 The Game Room @@ -10595,7 +10595,7 @@ citycon // (c) 1985 Jaleco citycona // (c) 1985 Jaleco cruisin // (c) 1985 Jaleco/Kitkorp -@source:misc_chess/cking_master.cpp +@source:chess/cking_master.cpp ckmaster // @source:alliedl/clayshoo.cpp @@ -10783,7 +10783,7 @@ compgolfo // (c) 1985 Data East Corporation (Japan) compis // 1985 Telenova Compis compis2 // 1985 Telenova Compis -@source:misc_chess/compuchess.cpp +@source:chess/compuchess.cpp ccmk1 // Chess Champion MK I cmpchess cmpchess2 @@ -10806,7 +10806,7 @@ comquest // Comquest Plus German comx35n // comx35p // -@source:misc_chess/conchess.cpp +@source:chess/conchess.cpp concply5 concply8 concplyv @@ -10815,10 +10815,10 @@ concstd @source:concept/concept.cpp concept // 1982 Corvus Concept -@source:misc_chess/conic_cchess2.cpp +@source:chess/conic_cchess2.cpp cncchess2 -@source:misc_chess/conic_cchess3.cpp +@source:chess/conic_cchess3.cpp cncchess3 @source:skeleton/consola_emt.cpp @@ -11645,7 +11645,7 @@ tsuwaku // (c) 2000 @source:namco/cswat.cpp cswat // (c) 1984 -@source:at/ct486.cpp +@source:pc/ct486.cpp ct486 // 1993? 486 with CS4031 @source:skeleton/ct909e_segadvd.cpp @@ -12895,7 +12895,7 @@ eacc // @source:skeleton/easy_karaoke.cpp easykara -@source:xussrpc/ec184x.cpp +@source:pc/ec184x.cpp ec1840 // ec1841 // ec1845 // @@ -14294,7 +14294,7 @@ natsuiro // [1989] Video System presents (Japan) nekkyoku // [1988] Video System Co. (Japan) nmsengen // (c) 1991 Video System (Japan) -@source:ibmpc/fruitpc.cpp +@source:pc/fruitpc.cpp fruitpc // ??? @source:skeleton/fs3216.cpp @@ -16485,7 +16485,7 @@ heromem // E34 (c) 1997 Taito hexion // GX122 (c) 1992 hexionb // bootleg -@source:misc_handheld/hh_cop400.cpp +@source:handheld/hh_cop400.cpp bship82 // Milton Bradley copspa // National Semiconductor ctstein // Castle Toy @@ -16508,7 +16508,7 @@ solution // SCAT unkeinv // Gordon Barlow Design vidchal // Select Merchandise -@source:misc_handheld/hh_cops1.cpp +@source:handheld/hh_cops1.cpp cambrp // Sinclair mbaskb // Mattel mhockey // Mattel @@ -16517,7 +16517,7 @@ msoccer // Mattel qkracerm // National Semiconductor qkspeller // National Semiconductor -@source:misc_handheld/hh_hmcs40.cpp +@source:handheld/hh_hmcs40.cpp alnattck // Coleco bambball // Bambino bbtime // Bandai @@ -16560,11 +16560,11 @@ vinvader // VTech wantgman // Actronics / Hanzawa zackman // Bandai -@source:misc_handheld/hh_melps4.cpp +@source:handheld/hh_melps4.cpp cfrogger // Coleco gjungler // Gakken -@source:misc_handheld/hh_pic16.cpp +@source:handheld/hh_pic16.cpp drdunk // Kmart flash // Ideal hccbaskb // Tiger Electronics @@ -16580,7 +16580,7 @@ ttfballa // Toytronic us2pfball // US Games uspbball // US Games -@source:misc_handheld/hh_pps41.cpp +@source:handheld/hh_pps41.cpp brainbaf // Mattel dunksunk // Kmart ftri1 // Fonas @@ -16593,7 +16593,7 @@ rdqa // Selchow & Righter scrabsen // Selchow & Righter smastmind // Invicta -@source:misc_handheld/hh_rw5000.cpp +@source:handheld/hh_rw5000.cpp autorace // Mattel gravity // Mattel mbaseb // Mattel @@ -16606,7 +16606,7 @@ rw24k // Rockwell rw30r // Rockwell rw31r // Rockwell -@source:misc_handheld/hh_sm510.cpp +@source:handheld/hh_sm510.cpp atakaast // Elektronika auslalom // Elektronika bassmate // Telko @@ -16756,7 +16756,7 @@ txmenpx // Tiger vespovar // Elektronika vfutbol // Elektronika -@source:misc_handheld/hh_tms1k.cpp +@source:handheld/hh_tms1k.cpp alphie // Playskool arcmania // Milton Bradley arrball // A-One LSI @@ -16865,7 +16865,7 @@ wizatron // Texas Instruments xl25 // Vulcan zodiac // Coleco -@source:misc_handheld/hh_ucom4.cpp +@source:handheld/hh_ucom4.cpp alnchase // Tomy astrocmd // Epoch bcclimbr // Bandai @@ -17335,7 +17335,7 @@ tarzana // (c) 1999 tarzanc // (c) 1999 tjsb // (c) 1997 -@source:ibmpc/igspc.cpp +@source:pc/igspc.cpp eztouch // (c) 200? speeddrv // (c) 2004 @@ -17543,7 +17543,7 @@ isbc8010b // @source:intel/isbc8030.cpp isbc8030 // -@source:xussrpc/iskr103x.cpp +@source:pc/iskr103x.cpp iskr1030m // iskr1031 // @@ -22936,7 +22936,7 @@ mc10 // MC-10 @source:cce/mc1000.cpp mc1000 // -@source:xussrpc/mc1502.cpp +@source:pc/mc1502.cpp mc1502 // pk88 // @@ -24276,7 +24276,7 @@ rs70_648 // @source:skeleton/monon_color.cpp mononcol // (c) 2011 M&D -@source:misc_handheld/monty.cpp +@source:handheld/monty.cpp mmonty // Ritam monty // Ritam @@ -34199,14 +34199,14 @@ palmz22 // Palm Z22 @source:konami/pandoras.cpp pandoras // GX328 (c) 1984 + Interlogic -@source:ibmpc/pangofun.cpp +@source:pc/pangofun.cpp pangofun // (c) 1995 InfoCube @source:seibu/panicr.cpp panicr // Seibu / Taito panicrg // Seibu / TV-Tuning (Germany) -@source:ibmpc/paokaipc.cpp +@source:pc/paokaipc.cpp gogostrk // @source:yunsung/paradise.cpp @@ -34455,11 +34455,11 @@ pc9821v20 // 1998 pc9821xa16 // 1996 pc9821xs // 1994 -@source:ibmpc/pcat_dyn.cpp +@source:pc/pcat_dyn.cpp toursol // (c) 1995 Dynamo toursol1 // (c) 1995 Dynamo -@source:ibmpc/pcat_nit.cpp +@source:pc/pcat_nit.cpp bonanza // (c) 1993 bonanzar2 // (c) 1993 streetg // (c) 1993 @@ -34514,7 +34514,7 @@ pcw9512p // 1991 PCW9512+ @source:amstrad/pcw16.cpp pcw16 // 1995 PCW16 -@source:ibmpc/pcxt.cpp +@source:pc/pcxt.cpp filetto // (c) 1990 Novamatic tetriskr // (c) 1988? bootleg @@ -35856,7 +35856,7 @@ pockstat // 1999 Sony PocketStation @source:atari/pofo.cpp pofo // -@source:xussrpc/poisk1.cpp +@source:pc/poisk1.cpp poisk1 // @source:dgrm/pokechmp.cpp @@ -36186,7 +36186,7 @@ proteus // Poly Proteus @source:skeleton/proteus3.cpp proteus3 // -@source:at/ps2.cpp +@source:pc/ps2.cpp i8530286 // IBM PS/2 Model 30-286 i8530h31 // IBM PS/2 8530-H31 (Model 30/286) i8535043 // IBM PS/2 8535-043 (Model 35) @@ -36392,7 +36392,7 @@ tonto // @source:skeleton/qtsbc.cpp qtsbc // -@source:ibmpc/quakeat.cpp +@source:pc/quakeat.cpp quake // (c) 19?? Lazer-Tron / iD Software @source:skeleton/controlid.cpp @@ -36407,7 +36407,7 @@ quantump // 136016 (c) 1982 // made by G quasar // (c) 1980 Zelco Games Italy quasara // (c) 1980 Zelco Games Italy -@source:ibmpc/queen.cpp +@source:pc/queen.cpp queen // @source:nmk/quizdna.cpp @@ -36687,7 +36687,7 @@ zerohour // 8011 (c) Universal zerohoura // 8011 (c) Universal zerohouri // -@source:misc_chess/regence.cpp +@source:chess/regence.cpp regence @source:atari/relief.cpp @@ -37026,7 +37026,7 @@ rx78 // @source:casio/rz1.cpp rz1 // 1986 Casio -@source:misc_handheld/rzone.cpp +@source:handheld/rzone.cpp rzbatfor // rzindy500 // rztoshden // @@ -37668,7 +37668,7 @@ scorpio // @source:konami/scotrsht.cpp scotrsht // GX545 (c) 1985 -@source:misc_handheld/scrablex.cpp +@source:handheld/scrablex.cpp scrablex // Selchow & Righter @source:galaxian/scramble.cpp @@ -39053,7 +39053,7 @@ simpsons2pj // GX072 (c) 1991 (Japan) simpsons4pa // GX072 (c) 1991 (Asia) simpsons4pe // GX072 (c) 1991 (World) -@source:ibmpc/sis630.cpp +@source:pc/sis630.cpp gamecst2 // MAME based bootleg, version 2.613 gamecstl // MAME based bootleg shutms11 // (c) 2000 @@ -41211,10 +41211,10 @@ taitotz // @source:taito/taitowlf.cpp pf2012 // E59 (c) 1997 Taito -@source:misc_handheld/talkingbb.cpp +@source:handheld/talkingbb.cpp talkingbb -@source:misc_handheld/talkingfb.cpp +@source:handheld/talkingfb.cpp talkingfb @source:bandai/tamag1.cpp @@ -41261,7 +41261,7 @@ targeth // (c) 1994 - Ref 940531 targetha // (c) 1994 - Ref 940531 targeth10 // (c) 1994 - Ref 940531 -@source:misc_chess/tasc.cpp +@source:chess/tasc.cpp tascr30 tascr30a tascr30b @@ -41692,7 +41692,7 @@ tc2048 // 198? TC2048 ts2068 // 1983 TS2068 uk2086 // 1986 UK2086 -@source:misc_handheld/tispeak.cpp +@source:handheld/tispeak.cpp k28m2 // Tiger Electronics lantutor // snmath // @@ -41718,7 +41718,7 @@ tntellp // tntelluk // vocaid // -@source:misc_handheld/tispellb.cpp +@source:handheld/tispellb.cpp mrchalgr // spellb // spellb79 // @@ -43551,7 +43551,7 @@ wicat // @source:pinball/wico.cpp aftor // -@source:misc_handheld/wildfire.cpp +@source:handheld/wildfire.cpp wildfire // Parker Bros @source:misc/wildpkr.cpp diff --git a/src/mame/mess.flt b/src/mame/mess.flt index f273860e681..8578737112a 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -62,10 +62,6 @@ appliedconcepts/ggm.cpp appliedconcepts/prodigy.cpp appliedtech/mbee.cpp arcadia/arcadia.cpp -at/at.cpp -at/atpci.cpp -at/ct486.cpp -at/ps2.cpp atari/a2600.cpp atari/a7800.cpp atari/atari400.cpp @@ -117,6 +113,14 @@ casio/sx1000.cpp cce/mc1000.cpp ccs/ccs2810.cpp ceres/ceres.cpp +chess/ave_arb.cpp +chess/cking_master.cpp +chess/compuchess.cpp +chess/conic_cchess2.cpp +chess/conic_cchess3.cpp +chess/conchess.cpp +chess/regence.cpp +chess/tasc.cpp chromatics/cgc7900.cpp chrysler/eva.cpp citoh/cit101.cpp @@ -263,6 +267,24 @@ gamepark/gp32.cpp gridcomp/gridcomp.cpp grundy/newbrain.cpp h01x/h01x.cpp +handheld/hh_cop400.cpp +handheld/hh_cops1.cpp +handheld/hh_hmcs40.cpp +handheld/hh_melps4.cpp +handheld/hh_pic16.cpp +handheld/hh_pps41.cpp +handheld/hh_rw5000.cpp +handheld/hh_sm510.cpp +handheld/hh_tms1k.cpp +handheld/hh_ucom4.cpp +handheld/monty.cpp +handheld/rzone.cpp +handheld/scrablex.cpp +handheld/talkingbb.cpp +handheld/talkingfb.cpp +handheld/tispeak.cpp +handheld/tispellb.cpp +handheld/wildfire.cpp hartung/gmaster.cpp hds/hds200.cpp heathkit/et3400.cpp @@ -342,7 +364,6 @@ husky/hunter16.cpp husky/hunter2.cpp husky/husky.cpp ibm6580/ibm6580.cpp -ibmpc/sis630.cpp ie15/ie15.cpp informer/informer_207_100.cpp informer/informer_207_376.cpp @@ -433,32 +454,6 @@ miltonbradley/milton6805.cpp miltonbradley/vectrex.cpp mips/mips.cpp misc/3do.cpp -misc_chess/ave_arb.cpp -misc_chess/cking_master.cpp -misc_chess/compuchess.cpp -misc_chess/conic_cchess2.cpp -misc_chess/conic_cchess3.cpp -misc_chess/conchess.cpp -misc_chess/regence.cpp -misc_chess/tasc.cpp -misc_handheld/hh_cop400.cpp -misc_handheld/hh_cops1.cpp -misc_handheld/hh_hmcs40.cpp -misc_handheld/hh_melps4.cpp -misc_handheld/hh_pic16.cpp -misc_handheld/hh_pps41.cpp -misc_handheld/hh_rw5000.cpp -misc_handheld/hh_sm510.cpp -misc_handheld/hh_tms1k.cpp -misc_handheld/hh_ucom4.cpp -misc_handheld/monty.cpp -misc_handheld/rzone.cpp -misc_handheld/scrablex.cpp -misc_handheld/talkingbb.cpp -misc_handheld/talkingfb.cpp -misc_handheld/tispeak.cpp -misc_handheld/tispellb.cpp -misc_handheld/wildfire.cpp mit/tx0.cpp mits/altair.cpp mits/mits680b.cpp @@ -564,14 +559,23 @@ osi/osi.cpp palm/palm.cpp palm/palmz22.cpp pc/asst128.cpp +pc/at.cpp +pc/atpci.cpp pc/compc.cpp +pc/ct486.cpp +pc/ec184x.cpp pc/europc.cpp pc/genpc.cpp pc/ibmpc.cpp pc/ibmpcjr.cpp +pc/iskr103x.cpp +pc/mc1502.cpp pc/nforcepc.cpp pc/pc.cpp pc/pcipc.cpp +pc/poisk1.cpp +pc/ps2.cpp +pc/sis630.cpp pc/tandy1t.cpp pc/tosh1000.cpp pdp1/pdp1.cpp @@ -1232,10 +1236,6 @@ xerox/alto1.cpp xerox/alto2.cpp xerox/bigbord2.cpp xerox/xerox820.cpp -xussrpc/ec184x.cpp -xussrpc/iskr103x.cpp -xussrpc/mc1502.cpp -xussrpc/poisk1.cpp yamaha/fb01.cpp yamaha/tg100.cpp yamaha/yman1x.cpp @@ -1289,7 +1289,7 @@ zvt/pp01.cpp //neogeo/neogeo.cpp +aes -//sis630 +//pc/sis630.cpp -gamecst2 -gamecstl diff --git a/src/mame/misc_chess/README.md b/src/mame/misc_chess/README.md deleted file mode 100644 index 74d62771d11..00000000000 --- a/src/mame/misc_chess/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# **src/mame/misc_chess** # - -Folder for miscellaneous chesscomputer drivers, where the number of drivers is too small to place them in specific company folders. \ No newline at end of file diff --git a/src/mame/misc_chess/ave_arb.cpp b/src/mame/misc_chess/ave_arb.cpp deleted file mode 100644 index 0a15c61933c..00000000000 --- a/src/mame/misc_chess/ave_arb.cpp +++ /dev/null @@ -1,365 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - -AVE Micro Systems ARB chess computer driver, in some regions redistributed -by Chafitz, and in Germany by Sandy Electronic. - -Auto Response Board (ARB) overview: -- R6502P CPU @ 2MHz(4MHz XTAL), R6522P VIA -- 2KB RAM(4*2114), cartridge port -- magnetic chessboard, 8*8+12 leds -- PCB label AV001C01 REV A - -The electronic magnetic chessboard is the first of its kind. AVE later licensed -it to Fidelity (see fidel_elite.cpp). -ARB is a romless system, the program ROM is on a cartridge. - -Known chess modules (*denotes not dumped yet): -- Sargon 2.5 -- *Grand Master Series 3 -- *Grand Master Series 3.5 -- Grand Master Series 4.0 - -Other games: -- Avelan (checkers) - -Newer modules included button label stickers for OPTIONS, Verify, Take Back, Clear. - -Around 2012, Steve Braid(aka Trilobyte/Steve UK) started manufacturing ARB V2 boards -without a module slot. CPU and VIA were replaced with new WDC 14MHz-rated chips, -running at 16MHz. - -TODO: -- verify gms40 module memory layout -- gms40 and avelan rom labels - -******************************************************************************/ - -#include "emu.h" - -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" -#include "cpu/m6502/m6502.h" -#include "cpu/m6502/w65c02s.h" -#include "video/pwm.h" -#include "machine/sensorboard.h" -#include "machine/6522via.h" -#include "machine/nvram.h" -#include "sound/dac.h" - -#include "speaker.h" -#include "softlist_dev.h" - -// internal artwork -#include "ave_arb.lh" // clickable - - -namespace { - -class arb_state : public driver_device -{ -public: - arb_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_board(*this, "board"), - m_via(*this, "via"), - m_extram(*this, "extram", 0x800, ENDIANNESS_LITTLE), - m_dac(*this, "dac"), - m_cart(*this, "cartslot"), - m_inputs(*this, "IN.%u", 0) - { } - - // halt button is tied to NMI, reset button to RESET(but only if halt button is held) - DECLARE_INPUT_CHANGED_MEMBER(reset_button) { update_reset(); } - DECLARE_INPUT_CHANGED_MEMBER(halt_button) { m_maincpu->set_input_line(M6502_NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE); update_reset(); } - void update_reset(); - - // machine configs - void arb(machine_config &config); - void v2(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_device m_board; - required_device m_via; - memory_share_creator m_extram; - required_device m_dac; - optional_device m_cart; - required_ioport_array<2> m_inputs; - - // address maps - void main_map(address_map &map); - void v2_map(address_map &map); - - // sensorboard - void init_board(int state); - bool m_altboard = false; - - // cartridge - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u8 cartridge_r(offs_t offset); - u32 m_cart_mask; - - // I/O handlers - void update_display(); - void leds_w(u8 data); - void control_w(u8 data); - u8 input_r(); - - u16 m_inp_mux = 0; - u16 m_led_select = 0; - u8 m_led_group = 0; - u8 m_led_latch = 0; - u16 m_led_data = 0; -}; - -void arb_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_select)); - save_item(NAME(m_led_group)); - save_item(NAME(m_led_latch)); - save_item(NAME(m_led_data)); -} - -void arb_state::update_reset() -{ - bool state = m_inputs[1]->read() == 3; - - // RESET goes to 6502+6522 - m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); - if (state) - m_via->reset(); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -// sensorboard - -void arb_state::init_board(int state) -{ - // different board setup for checkers - if (m_altboard) - for (int i = 0; i < 12; i++) - { - m_board->write_piece((i % 4) * 2 + ((i / 4) & 1), i / 4, 13); // white - m_board->write_piece((i % 4) * 2 + (~(i / 4) & 1), i / 4 + 5, 14); // black - } - else - m_board->preset_chess(state); -} - - -// cartridge - -DEVICE_IMAGE_LOAD_MEMBER(arb_state::cart_load) -{ - u32 size = m_cart->common_get_size("rom"); - m_cart_mask = ((1 << (31 - count_leading_zeros_32(size))) - 1) & 0x7fff; - - m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); - - // extra ram (optional) - if (image.get_feature("ram")) - m_maincpu->space(AS_PROGRAM).install_ram(0x0800, 0x0fff, 0x1000, m_extram); - - m_altboard = bool(image.get_feature("altboard")); - - return image_init_result::PASS; -} - -u8 arb_state::cartridge_r(offs_t offset) -{ - return m_cart->read_rom(offset & m_cart_mask); -} - - -// R6522 ports - -void arb_state::update_display() -{ - // 12 led column data lines via 3 7475 - u16 mask = 0; - mask |= (m_led_group & 1) ? 0xf00 : 0; - mask |= (m_led_group & 2) ? 0x0ff : 0; - - m_led_data = (m_led_data & ~mask) | ((m_led_latch << 8 | m_led_latch) & mask); - m_display->matrix(m_led_select | 0x200, m_led_data); -} - -void arb_state::leds_w(u8 data) -{ - // PA0-PA7: led latch input - m_led_latch = ~data & 0xff; - update_display(); -} - -void arb_state::control_w(u8 data) -{ - // PB0-PB3: 74145 A-D - // 74145 0-8: input mux, led row select - m_inp_mux = data & 0xf; - m_led_select = 1 << (data & 0xf) & 0x1ff; - - // PB4,PB5: led group select - m_led_group = data >> 4 & 3; - update_display(); - - // PB7: speaker out - m_dac->write(BIT(data, 7)); -} - -u8 arb_state::input_r() -{ - u8 data = 0; - - // PA0-PA7: multiplexed inputs - if (m_inp_mux < 8) - data = m_board->read_file(m_inp_mux); - else if (m_inp_mux < 9) - data = m_inputs[m_inp_mux - 8]->read(); - - return ~data; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void arb_state::main_map(address_map &map) -{ - // external slot is A0-A14, potential bus conflict with RAM/VIA - map(0x0000, 0x7fff).mirror(0x8000).r(FUNC(arb_state::cartridge_r)); - map(0x0000, 0x07ff).mirror(0x1000).ram().share("nvram"); - map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); -} - -void arb_state::v2_map(address_map &map) -{ - map(0x0000, 0x7fff).ram().share("nvram"); // BS62LV256 - map(0x8000, 0x800f).mirror(0x1ff0).m(m_via, FUNC(via6522_device::map)); - map(0xa000, 0xffff).rom(); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( arb ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_7) PORT_NAME("Hint / Black") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_CODE(KEYCODE_6) PORT_NAME("Variable / Clear / White / 6") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_5) PORT_NAME("Monitor / Take Back / King / 5") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_4) PORT_NAME("Self Play / Verify / Queen / 4") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_3) PORT_NAME("Change Board / Rook / 3") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_2) PORT_NAME("Change Color / Bishop / 2") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_1) PORT_NAME("Change Level / Knight / 1") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_0) PORT_NAME("New Game / Options / Pawn / 0") - - PORT_START("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, reset_button, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_CODE(KEYCODE_F1) PORT_NAME("Halt") PORT_CHANGED_MEMBER(DEVICE_SELF, arb_state, halt_button, 0) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void arb_state::v2(machine_config &config) -{ - /* basic machine hardware */ - W65C02S(config, m_maincpu, 16_MHz_XTAL); // W65C02S6TPG-14 - m_maincpu->set_addrmap(AS_PROGRAM, &arb_state::v2_map); - - W65C22S(config, m_via, 16_MHz_XTAL); // W65C22S6TPG-14 - m_via->writepa_handler().set(FUNC(arb_state::leds_w)); - m_via->writepb_handler().set(FUNC(arb_state::control_w)); - m_via->readpa_handler().set(FUNC(arb_state::input_r)); - m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(FUNC(arb_state::init_board)); - m_board->set_spawnpoints(12+2); // +2 checkers pieces - m_board->set_delay(attotime::from_msec(100)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(9+1, 12); - config.set_default_layout(layout_ave_arb); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - -void arb_state::arb(machine_config &config) -{ - v2(config); - - /* basic machine hardware */ - M6502(config.replace(), m_maincpu, 4_MHz_XTAL/2); // R6502P - m_maincpu->set_addrmap(AS_PROGRAM, &arb_state::main_map); - - MOS6522(config.replace(), m_via, 4_MHz_XTAL/4); // R6522P - m_via->writepa_handler().set(FUNC(arb_state::leds_w)); - m_via->writepb_handler().set(FUNC(arb_state::control_w)); - m_via->readpa_handler().set(FUNC(arb_state::input_r)); - m_via->irq_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); - - /* cartridge */ - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "arb"); - m_cart->set_device_load(FUNC(arb_state::cart_load)); - m_cart->set_must_be_loaded(true); - - SOFTWARE_LIST(config, "cart_list").set_original("arb"); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( arb ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - // none here, it's in the module slot -ROM_END - -ROM_START( arbv2 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "sargon_4.0", 0x0000, 0x10000, CRC(c519c9e8) SHA1(d7597d50c0f4f9aa6d990c8d3b485e39cb44ff06) ) // AT27C512R -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1980, arb, 0, 0, arb, arb, arb_state, empty_init, "AVE Micro Systems", "Auto Response Board", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 2012, arbv2, arb, 0, v2, arb, arb_state, empty_init, "hack (Steve Braid)", "ARB V2 Sargon 4.0", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/cking_master.cpp b/src/mame/misc_chess/cking_master.cpp deleted file mode 100644 index 764d46bc4e3..00000000000 --- a/src/mame/misc_chess/cking_master.cpp +++ /dev/null @@ -1,260 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - -Chess King Master (yes, it's plainly named "Master") -According to the manual, the chess engine is Cyrus (by Richard Lang). - -Hardware notes: -- Z80 CPU(NEC D780C-1) @ 4MHz(8MHz XTAL), IRQ from 555 timer -- 8KB ROM(NEC D2764C-3), 2KB RAM(NEC D4016C), ROM is scrambled for easy PCB placement -- simple I/O via 2*74373 and a 74145 -- 8*8 chessboard buttons, 32+1 border leds, piezo - -TODO: -- 1 WAIT CLK per M1, workaround with z80_set_cycle_tables is possible - (wait state is similar to MSX) but I can't be bothered, better solution - is to add M1 pin to the z80 core. Until then, it'll run ~20% too fast. - -******************************************************************************/ - -#include "emu.h" - -#include "cpu/z80/z80.h" -#include "machine/bankdev.h" -#include "machine/clock.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" - -#include "speaker.h" - -// internal artwork -#include "ck_master.lh" // clickable - - -namespace { - -class master_state : public driver_device -{ -public: - master_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_board(*this, "board"), - m_dac(*this, "dac"), - m_mainmap(*this, "mainmap"), - m_inputs(*this, "IN.%u", 0) - { } - - // machine configs - void master(machine_config &config); - - void init_master(); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_device m_board; - required_device m_dac; - required_device m_mainmap; - required_ioport_array<2> m_inputs; - - // address maps - void main_map(address_map &map); - void main_trampoline(address_map &map); - u8 main_trampoline_r(offs_t offset); - void main_trampoline_w(offs_t offset, u8 data); - - // I/O handlers - u8 input_r(); - void control_w(u8 data); - - u16 m_inp_mux = 0; -}; - -void master_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -// TTL/generic - -void master_state::control_w(u8 data) -{ - // d0-d3: 74145 A-D - // 74145 0-9: input mux, led select - m_inp_mux = data & 0xf; - u16 sel = 1 << m_inp_mux & 0x3ff; - - // d4,d5: led data - m_display->matrix(sel & 0x1ff, data >> 4 & 3); - - // d6,d7: speaker +/- - m_dac->write(data >> 6 & 3); -} - -u8 master_state::input_r() -{ - u8 data = 0; - - // d0-d7: multiplexed inputs - // read chessboard sensors - if (m_inp_mux < 8) - data = m_board->read_file(m_inp_mux, true); - - // read other buttons - else if (m_inp_mux < 10) - data = m_inputs[m_inp_mux - 8]->read(); - - return ~data; -} - -void master_state::init_master() -{ - u8 *rom = memregion("maincpu")->base(); - const u32 len = memregion("maincpu")->bytes(); - - // descramble data lines - for (int i = 0; i < len; i++) - rom[i] = bitswap<8>(rom[i], 4,5,0,7,6,1,3,2); - - // descramble address lines - std::vector buf(len); - memcpy(&buf[0], rom, len); - for (int i = 0; i < len; i++) - rom[i] = buf[bitswap<16>(i, 15,14,13,12,11,3,7,9, 10,8,6,5,4,2,1,0)]; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void master_state::main_map(address_map &map) -{ - map(0x0000, 0x1fff).mirror(0x6000).rom().region("maincpu", 0); // _A15 - map(0xa000, 0xa000).mirror(0x1fff).rw(FUNC(master_state::input_r), FUNC(master_state::control_w)); // A13 - map(0xc000, 0xc7ff).mirror(0x3800).ram(); // A14 -} - -// PCB design is prone to bus conflicts, but should be fine if software obeys -void master_state::main_trampoline_w(offs_t offset, u8 data) -{ - if (offset & 0x2000) - m_mainmap->write8((offset & 0x3fff) | 0x8000, data); - if (offset & 0x4000) - m_mainmap->write8((offset & 0x7fff) | 0x8000, data); -} - -u8 master_state::main_trampoline_r(offs_t offset) -{ - u8 data = 0xff; - if (~offset & 0x8000) - data &= m_mainmap->read8(offset); - if (offset & 0x2000) - data &= m_mainmap->read8((offset & 0x3fff) | 0x8000); - if (offset & 0x4000) - data &= m_mainmap->read8((offset & 0x7fff) | 0x8000); - - return data; -} - -void master_state::main_trampoline(address_map &map) -{ - map(0x0000, 0xffff).rw(FUNC(master_state::main_trampoline_r), FUNC(master_state::main_trampoline_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( master ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("Change Position") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("Clear Board") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("New Game") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("Take Back") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("King") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Queen") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Rook") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("Pawn") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("White") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Black") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Move") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Level") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Sound") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void master_state::master(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &master_state::main_trampoline); - ADDRESS_MAP_BANK(config, "mainmap").set_map(&master_state::main_map).set_options(ENDIANNESS_LITTLE, 8, 16); - - auto &irq_clock(CLOCK(config, "irq_clock", 418)); // 555 timer (22nF, 150K, 1K5), measured 418Hz - irq_clock.set_pulse_width(attotime::from_nsec(22870)); // active for 22.87us - irq_clock.signal_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(9, 2); - config.set_default_layout(layout_ck_master); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_2BIT_BINARY_WEIGHTED_ONES_COMPLEMENT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.125); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( ckmaster ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("d2764c-3.ic2", 0x0000, 0x2000, CRC(59cbec9e) SHA1(2e0629e65778da62bed857406b91a334698d2fe8) ) // no custom label -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -CONS( 1984, ckmaster, 0, 0, master, master, master_state, init_master, "Chess King", "Master (Chess King)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/compuchess.cpp b/src/mame/misc_chess/compuchess.cpp deleted file mode 100644 index d22fec8e350..00000000000 --- a/src/mame/misc_chess/compuchess.cpp +++ /dev/null @@ -1,507 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Peter Trauner, Wilbert Pol, hap -// thanks-to:Sean Riddle, Berger -/****************************************************************************** - -DCS CompuChess / Novag Chess Champion MK I -Initial driver version by PeT mess@utanet.at 2000,2001. -Driver largely rewritten over the years. - -To start playing, enter difficulty level (1-6), then when it says "bP", press A -for new game, B for empty board, or C for continue. - -TODO: -- cncchess sound is wrong, it should be a long dual-tone alarm sound - -BTANB: -- cmpchess/cmpchess2 accepts illegal moves (Conic fixed that) -- digits may flash briefly after entering a command, eg. the "b" or "P" digit - after setting board preset, this happens on the real device - -=============================================================================== - -DataCash Systems's CompuChess released mid-1977. One of the first chess -computers, the first one being Fidelity Chess Challenger (fidel_cc1.cpp) - -Hardware notes: -- PCB label: CompuChess 1, STAID INC, REV A, 7-77 -- Fairchild 3850PK, 2MHz XTAL -- Fairchild 3853PK -- 2KB ROM, 256 bytes RAM(2*D2101AL-4) -- 4-digit 7seg led display, no sound - -CompuChess 2nd edition is on the same PCB, but with a 3.57MHz XTAL(!), a 3850PC, -and Mostek MK3853N. The MCU speed was also confirmed with move calculation time. - -2nd edition added 3 new game modes: E for "Game of Knights", F for "Amazon Queen", -and G for "Survival". - -=============================================================================== - -The game underneath CompuChess is better known as Novag's MK I, it was an -unlicensed clone. The ROM is identical. DCS sued JS&A / Novag Industries for -copyright infringement and somehow didn't manage to win the case. - -Unlike CompuChess, MK I was a large success, we can assume that it kickstarted -Novag's chess computer generation. It was also distributed as "Computer Chess" -by JS&A, in the same housing as MK I. - -MCU frequency is with an LC circuit. The first version was around 5% faster than -CompuChess, the JS&A version was measured 2.18MHz on average. The 2nd version was -much faster, judging from move calculation time: around 3.5MHz(give or take 0.2). - -1st (slow) version: -- Novag MK I with Boris Spassky photo on the box -- JS&A Computer Chess - -2nd (fast) version: -- Novag MK I with Karpov photo on the box, later advertised with message - "Neu: Mit Quick-Electronic für Schnelle Gegenzüge" -- Waddingtons Videomaster Chess Champion - -MK I hardware description: -- An F8 3850 CPU accompanied by a 3853 memory interface - Variations seen: - - MOSTEK MK 3853N 7915 Philippines (static memory interface for F8) - - MOSTEK MK 3850N-3 7917 Philipines (Fairchild F8 CPU) - - 3850PK F7901 SINGAPORE (Fairchild F8 CPU) - - 3853PK F7851 SINGAPORE (static memory interface for F8) -- 2KB 2316 compatible ROM - Variations seen: - - Signetics 7916E C48091 82S210-1 COPYRIGHT - - RO-3-8316A 8316A-4480 7904 TAIWAN -- 2 x 2111 256x4 SRAM to provide 256 bytes of RAM - Variations seen: - - AM9111 BPC / P2111A-4 7851 -- 16 keys placed in a 4 x 4 matrix -- Power on switch -- L/S switch. This switch is directly tied to the RESET pin of the F8 CPU. - This allows the user to reset the CPU without destroying the RAM contents. -- A 4 character 11 segment digit display using a 15 pin interface. Of the 15 - pins 3 pins are not connected, so three segments are never used and this - leaves a standard 7 segments display with a dot in the lower right. -- The digit display is driven by two other components: - - SN75492N MALAYSIA 7840B - - ULN2033A 7847 -- Hardware addressing is controlled by a HBF4001AE. -- No speaker. - -=============================================================================== - -Conic Computer Chess (aka Master I in Germany) is also based on DCS CompuChess, -this time the 2nd edition. Conic have done a few changes, not enough to hide that -they 'borrowed' code. They also added a piezo circuit. - -Hardware notes: -- Fairchild 3850PK CPU @ 2MHz (LC circuit), 3853PK -- 2KB ROM (3216), 256 bytes RAM (2*2111A) -- 555, 4001, 4011 for display blinking and beeper - -"bP" buttons are F, G, H (instead of A, B, C) - -******************************************************************************/ - -#include "emu.h" -#include "cpu/f8/f8.h" -#include "machine/f3853.h" -#include "machine/timer.h" -#include "sound/beep.h" -#include "video/pwm.h" -#include "speaker.h" - -// internal artwork -#include "cmpchess.lh" // clickable -#include "novag_mk1.lh" // clickable -#include "conic_cchess.lh" // clickable - - -namespace { - -class cmpchess_state : public driver_device -{ -public: - cmpchess_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_beeper_off(*this, "beeper_off"), - m_beeper(*this, "beeper"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(reset_switch) { update_reset(newval); } - DECLARE_INPUT_CHANGED_MEMBER(change_cpu_freq) { update_cpu_freq(newval); } - - // machine configs - void cmpchess(machine_config &config); - void cmpchess2(machine_config &config); - void mk1(machine_config &config); - void cncchess(machine_config &config); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - optional_device m_beeper_off; - optional_device m_beeper; - required_ioport_array<4> m_inputs; - - // address maps - void main_map(address_map &map); - void main_io(address_map &map); - void cncchess_map(address_map &map); - void cncchess_io(address_map &map); - - TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } - TIMER_DEVICE_CALLBACK_MEMBER(blink) { m_blink = !m_blink; update_display(); } - void update_display(); - void update_reset(ioport_value state); - void update_cpu_freq(ioport_value state); - - // I/O handlers - void input_w(u8 data); - u8 input_r(); - void digit_select_w(u8 data); - void digit_data_w(u8 data); - u8 digit_data_r(); - u8 beeper_r(offs_t offset); - - void input_digit_select_w(u8 data) { input_w(data); digit_select_w(data); } - void input_digit_data_w(u8 data) { input_w(data); digit_data_w(data); } - - u8 m_inp_mux = 0; - u8 m_digit_select = 0; - u8 m_digit_data = 0; - bool m_blink = false; -}; - -void cmpchess_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_digit_select)); - save_item(NAME(m_digit_data)); - save_item(NAME(m_blink)); -} - -void cmpchess_state::machine_reset() -{ - if (ioport("FAKE") != nullptr) - update_cpu_freq(ioport("FAKE")->read()); - - update_reset(ioport("RESET")->read()); -} - -void cmpchess_state::update_reset(ioport_value state) -{ - // reset switch is tied to F3850 RESET pin - m_maincpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); - - // clear display - if (state) - m_display->clear(); -} - -void cmpchess_state::update_cpu_freq(ioport_value state) -{ - // 2 MK I versions, 2nd one was a lot faster - const u32 freq = state ? 3500000 : 2250000; - m_maincpu->set_unscaled_clock(freq); - subdevice("smi")->set_unscaled_clock(freq); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void cmpchess_state::update_display() -{ - // display panel goes into automated blink mode if DP segment is held high, - // and DP segment itself by default only appears to be active if no other segments are - u8 dmask = (m_digit_data == 1) ? 0x80 : 0x7f; - u8 bmask = (m_blink && m_digit_data & 1) ? 0 : 0xff; - u8 bstate = m_digit_data & bmask & 1; // DP state for ignoring dmask - - u8 digit_data = bitswap<8>(m_digit_data,0,2,1,3,4,5,6,7) & dmask & bmask; - m_display->matrix(m_digit_select, bstate << 8 | digit_data); -} - -void cmpchess_state::digit_data_w(u8 data) -{ - // digit segment data - m_digit_data = data; - update_display(); -} - -u8 cmpchess_state::digit_data_r() -{ - return m_digit_data; -} - -void cmpchess_state::digit_select_w(u8 data) -{ - // d0-d3: digit select (active low) - m_digit_select = ~data & 0xf; - update_display(); -} - -void cmpchess_state::input_w(u8 data) -{ - // input matrix is shared with either digit_data_w, or digit_select_w - m_inp_mux = data; -} - -u8 cmpchess_state::input_r() -{ - u8 data = m_inp_mux; - - // d0-d3: multiplexed inputs from d4-d7 - for (int i = 0; i < 4; i++) - if (m_inp_mux & m_inputs[i]->read() << 4) - data |= 1 << i; - - // d4-d7: multiplexed inputs from d0-d3 - for (int i = 0; i < 4; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read() << 4; - - return data; -} - -u8 cmpchess_state::beeper_r(offs_t offset) -{ - // cncchess: trigger beeper - if (!machine().side_effects_disabled()) - { - m_beeper->set_state(1); - m_beeper_off->adjust(attotime::from_msec(50)); // wrong, see TODO - } - - return m_maincpu->space(AS_PROGRAM).read_byte(offset); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void cmpchess_state::main_map(address_map &map) -{ - map.global_mask(0x0fff); - map(0x0000, 0x07ff).rom(); - map(0x0800, 0x08ff).mirror(0x0700).ram(); -} - -void cmpchess_state::main_io(address_map &map) -{ - map(0x00, 0x00).rw(FUNC(cmpchess_state::input_r), FUNC(cmpchess_state::input_digit_data_w)); - map(0x01, 0x01).w(FUNC(cmpchess_state::digit_select_w)); - map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write)); -} - -void cmpchess_state::cncchess_map(address_map &map) -{ - map(0x0000, 0x07ff).rom(); - map(0x1800, 0x18ff).ram(); - map(0x8000, 0xffff).r(FUNC(cmpchess_state::beeper_r)); -} - -void cmpchess_state::cncchess_io(address_map &map) -{ - map(0x00, 0x00).rw(FUNC(cmpchess_state::digit_data_r), FUNC(cmpchess_state::digit_data_w)); - map(0x01, 0x01).rw(FUNC(cmpchess_state::input_r), FUNC(cmpchess_state::input_digit_select_w)); - map(0x0c, 0x0f).rw("smi", FUNC(f3853_device::read), FUNC(f3853_device::write)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cmpchess ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("D / Play") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / White Bishop") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / White Queen") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / White King") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_M) PORT_NAME("H / md") // more data - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("G / White Pawn") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / White Rook") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / White Knight") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / fp") // find piece(position) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Black Bishop") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Black Queen") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Black King") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / ep") // enter piece(position) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Black Pawn") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Black Rook") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Black Knight") - - PORT_START("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("Reset Switch") -INPUT_PORTS_END - -static INPUT_PORTS_START( mk1 ) - PORT_INCLUDE( cmpchess ) - - PORT_MODIFY("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_TOGGLE PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("L.S. Switch") - - PORT_START("FAKE") - PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, change_cpu_freq, 0) // factory set - PORT_CONFSETTING( 0x00, "2.25MHz (Spassky packaging)" ) - PORT_CONFSETTING( 0x01, "3.5MHz (Karpov packaging)" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( cncchess ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Black Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Black Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Black Rook") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Black Pawn") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("8 / IP") // insert piece (same as ep) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_S) PORT_NAME("7 / SP") // search piece (same as fp) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Black King") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Black Queen") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("D / White Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("C / White Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("B / White Rook") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("A / White Pawn") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("H / GO") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_M) PORT_NAME("G / MD") // more data - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("F / White King") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("E / White Queen") - - PORT_START("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, cmpchess_state, reset_switch, 0) PORT_NAME("Reset") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void cmpchess_state::cmpchess(machine_config &config) -{ - /* basic machine hardware */ - F8(config, m_maincpu, 2_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &cmpchess_state::main_map); - m_maincpu->set_addrmap(AS_IO, &cmpchess_state::main_io); - m_maincpu->set_irq_acknowledge_callback("smi", FUNC(f3853_device::int_acknowledge)); - - f3853_device &smi(F3853(config, "smi", 2_MHz_XTAL)); - smi.int_req_callback().set_inputline("maincpu", F8_INPUT_LINE_INT_REQ); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 8+1); - m_display->set_segmask(0xf, 0xff); - config.set_default_layout(layout_cmpchess); - - const attotime blink_period = attotime::from_msec(200); // approximation - TIMER(config, "blink_display").configure_periodic(FUNC(cmpchess_state::blink), blink_period); -} - -void cmpchess_state::cmpchess2(machine_config &config) -{ - cmpchess(config); - - /* basic machine hardware */ - m_maincpu->set_clock(3.579545_MHz_XTAL); - subdevice("smi")->set_clock(3.579545_MHz_XTAL); -} - -void cmpchess_state::mk1(machine_config &config) -{ - cmpchess(config); - - /* basic machine hardware */ - m_maincpu->set_clock(2250000); // see notes - subdevice("smi")->set_clock(2250000); - - config.set_default_layout(layout_novag_mk1); -} - -void cmpchess_state::cncchess(machine_config &config) -{ - cmpchess2(config); - - /* basic machine hardware */ - m_maincpu->set_clock(2000000); // LC circuit, measured 2MHz - m_maincpu->set_addrmap(AS_PROGRAM, &cmpchess_state::cncchess_map); - m_maincpu->set_addrmap(AS_IO, &cmpchess_state::cncchess_io); - - subdevice("smi")->set_clock(2000000); - - config.set_default_layout(layout_conic_cchess); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - BEEP(config, m_beeper, 2000); // wrong, see TODO - m_beeper->add_route(ALL_OUTPUTS, "speaker", 0.25); - TIMER(config, "beeper_off").configure_generic(FUNC(cmpchess_state::beeper_off)); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( cmpchess ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("32014-4950_cmcsi_staid.u3", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) ) -ROM_END - -ROM_START( cmpchess2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("8316a-4952_cmc2_staid.u3", 0x0000, 0x0800, CRC(aee49c5f) SHA1(8a10f74207f2646164cc0deed81bd082143ac38a) ) -ROM_END - - -ROM_START( ccmk1 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("82c210-1", 0x0000, 0x0800, CRC(278f7bf3) SHA1(b384c95ba691d52dfdddd35987a71e9746a46170) ) -ROM_END - - -ROM_START( cncchess ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD("c48170.u1", 0x0000, 0x0800, CRC(5beace32) SHA1(9df924037614831a86b73eb3a16bbc80c63257a2) ) // 2316B -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1977, cmpchess, 0, 0, cmpchess, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // aka CompuChess I -CONS( 1978, cmpchess2, 0, 0, cmpchess2, cmpchess, cmpchess_state, empty_init, "DataCash Systems / Staid", "CompuChess: The Second Edition", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1978, ccmk1, cmpchess, 0, mk1, mk1, cmpchess_state, empty_init, "bootleg (Novag)", "Chess Champion: MK I", MACHINE_NO_SOUND_HW | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, cncchess, 0, 0, cncchess, cncchess, cmpchess_state, empty_init, "Conic", "Computer Chess (Conic, model 7011)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/conchess.cpp b/src/mame/misc_chess/conchess.cpp deleted file mode 100644 index 5ec9a2db77f..00000000000 --- a/src/mame/misc_chess/conchess.cpp +++ /dev/null @@ -1,344 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - -Conchess, a series of modular chess computers by Consumenta Computer. -Hardware development by Loproc (Germany), manufactured at Wallharn Electronics -(Ireland). The core people involved were Ulf Rathsman for the chess engine, -and Johan Enroth. After Consumenta went under in 1983, the Conchess brand was -continued by Systemhuset, Enroth's company. - -TODO: -- dump/add princhess module -- dump/add plymate original 2MHz module -- dump/add concplyv library module (L/L16 don't work, manual says it has its own add-on) -- concplyv unmapped reads/writes -- verify irq/beeper for concplyv, though it is probably correct -- official rom labels for concply5, concply8 - -------------------------------------------------------------------------------- - -Hardware notes: - -Chess boards released were Escorter, Ambassador, and Monarch, each should be the -same hardware, they just differ in size and material. -- TTL, 2 module slots -- 16+64 leds, 16 buttons, reed sensors for magnet chesspieces - -All chess modules appear to be on similar PCBs, with room a 6502/65C02, -and 8 ROM/RAM chips. - -For the newer programs, higher clocked versions were also available, the CPU speed -was labeled on a sticker on the module (eg. A2/5.5MHz). A German redistributor -named them "S"(speed) or "T"(top speed). - -A0 (untitled standard pack-in module): -- SY6502A @ 2MHz (4MHz XTAL) -- 3*8KB ROM, 4KB RAM(2*TMM2016P) -- TTL, beeper - -note: XTAL goes to 4020, 4020 /2 goes to CPU clock, and other dividers to -IRQ and beeper. On A0, IRQ is active for ~31.2us. - -A1(P) + A0(M) (Princhess, aka Glasgow) -- dual-module, each module has its own 6502 - need verification, more likely - 2nd module has no CPU (according to the manual, A0 is modified and won't - work stand-alone) - -A2(C) (Plymate, aka Amsterdam) -- R65C02P4 @ 5.5MHz (11MHz XTAL) (5.5MHz version) -- 32KB ROM, rest similar to A0 - -A3 (Plymate Victoria) -- W65C02S8P-14(14? probably replaced chip from a repair) @ 6.144MHz (12.288MHz XTAL) -- 32KB ROM, rest similar to A0 - -Library modules: -- L: small PCB, PCB label: CCL L-2, 8KB EPROM no label -- L16: 2*8KB EPROM (have no photo of PCB) - -******************************************************************************/ - -#include "emu.h" - -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" -#include "cpu/m6502/m6502.h" -#include "cpu/m6502/m65c02.h" -#include "cpu/m6502/r65c02.h" -#include "machine/sensorboard.h" -#include "sound/beep.h" -#include "video/pwm.h" - -#include "softlist_dev.h" -#include "speaker.h" - -// internal artwork -#include "conchess.lh" // clickable - - -namespace { - -class conchess_state : public driver_device -{ -public: - conchess_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_board(*this, "board"), - m_beeper(*this, "beeper"), - m_inputs(*this, "IN.%u", 0) - { } - - // machine configs - void concstd(machine_config &config); - void concply5(machine_config &config); - void concply8(machine_config &config); - void concplyv(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_device m_board; - required_device m_beeper; - required_ioport_array<2> m_inputs; - - // address maps - void main_map(address_map &map); - - // I/O handlers - void clear_irq(); - u8 input_r(); - void leds_w(offs_t offset, u8 data); - void sound_w(u8 data); - - u8 m_inp_mux = 0; -}; - -void conchess_state::machine_start() -{ - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void conchess_state::clear_irq() -{ - m_maincpu->set_input_line(0, CLEAR_LINE); -} - -u8 conchess_state::input_r() -{ - clear_irq(); - - u8 data = 0; - - // read side panel buttons - if (m_inp_mux == 0 || m_inp_mux == 9) - data = m_inputs[m_inp_mux & 1]->read(); - - // read chessboard sensors - else - data = m_board->read_file((m_inp_mux - 1) ^ 7); - - return ~data; -} - -void conchess_state::leds_w(offs_t offset, u8 data) -{ - clear_irq(); - - // a0-a3: CD4028B to led select/input mux - m_inp_mux = offset; - if (m_inp_mux & 8) - m_inp_mux &= 9; - - // d0-d7: led data - m_display->matrix(1 << m_inp_mux, data); -} - -void conchess_state::sound_w(u8 data) -{ - // d7: enable beeper - m_beeper->set_state(BIT(data, 7)); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void conchess_state::main_map(address_map &map) -{ - map(0x0000, 0x0fff).ram(); - map(0x1000, 0x1000).mirror(0x07ff).r(FUNC(conchess_state::input_r)); - map(0x1000, 0x100f).mirror(0x07f0).w(FUNC(conchess_state::leds_w)); - map(0x1800, 0x1800).mirror(0x07ff).w(FUNC(conchess_state::sound_w)); - map(0x4000, 0x7fff).r("cartslot", FUNC(generic_slot_device::read_rom)); - map(0x8000, 0xffff).rom(); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( conchess ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("O. (Clear)") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Stop") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Dice Symbol (Alternate)") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("?-Sign (Analyze)") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Section Sign (Referee)") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("4-Way Arrow (Piece)") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("2-Way Arrow (Level)") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME(". (Continue)") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("White") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Black") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void conchess_state::concstd(machine_config &config) -{ - /* basic machine hardware */ - M6502(config, m_maincpu, 4_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); - - const attotime irq_period = attotime::from_hz(4_MHz_XTAL / 0x2000); - m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - - GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "conchess_cart"); - SOFTWARE_LIST(config, "cart_list").set_original("conchess_standard"); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(10, 8); - config.set_default_layout(layout_conchess); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 4_MHz_XTAL / 0x400); - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void conchess_state::concply5(machine_config &config) -{ - concstd(config); - - /* basic machine hardware */ - R65C02(config.replace(), m_maincpu, 11_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); - - const attotime irq_period = attotime::from_hz(11_MHz_XTAL / 0x4000); - m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); - - SOFTWARE_LIST(config.replace(), "cart_list").set_original("conchess_plymate"); - - /* sound hardware */ - BEEP(config.replace(), m_beeper, 11_MHz_XTAL / 0x800); - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void conchess_state::concply8(machine_config &config) -{ - concply5(config); - - /* basic machine hardware */ - R65C02(config.replace(), m_maincpu, 16_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); - - const attotime irq_period = attotime::from_hz(16_MHz_XTAL / 0x4000); - m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); - - /* sound hardware */ - BEEP(config.replace(), m_beeper, 16_MHz_XTAL / 0x1000); - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void conchess_state::concplyv(machine_config &config) -{ - concstd(config); - - /* basic machine hardware */ - M65C02(config.replace(), m_maincpu, 12.288_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, &conchess_state::main_map); - - const attotime irq_period = attotime::from_hz(12.288_MHz_XTAL / 0x4000); - m_maincpu->set_periodic_int(FUNC(conchess_state::irq0_line_assert), irq_period); - - SOFTWARE_LIST(config.replace(), "cart_list").set_original("conchess_victoria"); - - /* sound hardware */ - BEEP(config.replace(), m_beeper, 12.288_MHz_XTAL / 0x1000); - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( concstd ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD("c87011.b3", 0xa000, 0x2000, CRC(915e414c) SHA1(80c94712d1c79fa469576c37b80ab66f77c77cc4) ) - ROM_LOAD("c87010.b2", 0xc000, 0x2000, CRC(088c8737) SHA1(9f841b3c47de9ef1da8ce98c0a33a919cba873c6) ) - ROM_LOAD("c87009.b1", 0xe000, 0x2000, CRC(e1c648e2) SHA1(725a6ac1c69f788a7bba0573e5609b55b12899ac) ) -ROM_END - -ROM_START( concply5 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("plymate_5.5mhz.bin", 0x8000, 0x8000, CRC(9a9d1ec1) SHA1(75dbd1f96502775ed304f6b085d958f1b07d08f9) ) -ROM_END - -ROM_START( concply8 ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("plymate_8mhz.bin", 0x8000, 0x8000, CRC(85005b73) SHA1(edbc18d07552cab5951d8a6b738b2eacd73331c1) ) -ROM_END - -ROM_START( concplyv ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("cc8-f.a2", 0x8000, 0x8000, CRC(5b0a1d09) SHA1(07cbc970a8dfbca386396ce5d5cc8ce77ad4ee1b) ) -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1982, concstd, 0, 0, concstd, conchess, conchess_state, empty_init, "Consumenta Computer / Loproc", "Conchess (standard)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1985, concply5, 0, 0, concply5, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate 5.5MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1985, concply8, concply5, 0, concply8, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate 8.0MHz", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1990, concplyv, 0, 0, concplyv, conchess, conchess_state, empty_init, "Systemhuset / Loproc", "Conchess Plymate Victoria", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/conic_cchess2.cpp b/src/mame/misc_chess/conic_cchess2.cpp deleted file mode 100644 index f2613fee8a9..00000000000 --- a/src/mame/misc_chess/conic_cchess2.cpp +++ /dev/null @@ -1,285 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:bataais -/****************************************************************************** - -Conic Computer Chess (model 07012), also sold under the same name by -Hanimex (model HMG 1200) and Westrak (model CC 1). It's also known as -Tracer Chess, this title is from an advertisement flyer, the actual chess -computer was simply named Computer Chess. - -The chessboard sensors aren't buttons or magnets, but 64 jacks. There is -a metal plug under each chesspiece. From MAME's perspective, it works the -same as a magnet sensorboard. - -After the player's move, the user needs to press Enter. This does not apply -to the computer's move. - -Hardware notes: -- Synertek 6504 @ ~1MHz -- 2*Motorola MC6821P PIA -- 4KB ROM(AMI), 1KB RAM(2*Synertek 1024x4) -- beeper, 8*8 leds, plug board - -BTANB: -- Learn button still works when in modify-mode - -******************************************************************************/ - -#include "emu.h" - -#include "cpu/m6502/m6504.h" -#include "machine/6821pia.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" - -#include "speaker.h" - -// internal artwork -#include "conic_cchess2.lh" // clickable - - -namespace { - -class cchess2_state : public driver_device -{ -public: - cchess2_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_pia(*this, "pia%u", 0), - m_board(*this, "board"), - m_display(*this, "display"), - m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0) - { } - - // machine configs - void cncchess2(machine_config &config); - - // assume that RESET button is tied to 6504 reset pin - DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device_array m_pia; - required_device m_board; - required_device m_display; - required_device m_dac; - required_ioport_array<8> m_inputs; - - // address maps - void main_map(address_map &map); - - // I/O handlers - void update_display(); - void update_dac(); - void pia0_pa_w(u8 data); - void pia0_pb_w(u8 data); - u8 pia1_pa_r(); - u8 pia1_pb_r(); - void pia1_pb_w(u8 data); - - u8 m_inp_mux = 0; - u8 m_led_data = 0; - int m_dac_on = 0; -}; - -void cchess2_state::machine_start() -{ - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_data)); - save_item(NAME(m_dac_on)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void cchess2_state::update_display() -{ - m_display->matrix(m_inp_mux, m_led_data); -} - -void cchess2_state::update_dac() -{ - m_dac->write(m_dac_on & BIT(m_inp_mux, 1)); -} - -void cchess2_state::pia0_pa_w(u8 data) -{ - // d0-d7: input mux/led select - // d1: dac data - m_inp_mux = data; - update_display(); - update_dac(); -} - -void cchess2_state::pia0_pb_w(u8 data) -{ - // d0-d7: led data - m_led_data = data; - update_display(); -} - -u8 cchess2_state::pia1_pa_r() -{ - u8 data = 0; - - // d0-d7: chessboard sensors - for (int i = 0; i < 8; i++) - if (BIT(m_inp_mux, i)) - data |= m_board->read_rank(i); - - return ~data; -} - -u8 cchess2_state::pia1_pb_r() -{ - u8 data = 0; - - // d0-d3: multiplexed inputs - for (int i = 0; i < 8; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return data; -} - -void cchess2_state::pia1_pb_w(u8 data) -{ - // d7: dac on - m_dac_on = BIT(data, 7); - update_dac(); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void cchess2_state::main_map(address_map &map) -{ - map.global_mask(0x1fff); - map(0x0000, 0x03ff).ram(); - map(0x0a00, 0x0a03).mirror(0x00fc).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x0c00, 0x0c03).mirror(0x00fc).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write)); - map(0x1000, 0x1fff).rom(); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cncchess2 ) - PORT_START("IN.0") - PORT_BIT(0x03, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_CONFNAME( 0x0c, 0x08, "Mode" ) - PORT_CONFSETTING( 0x04, "Modify" ) - PORT_CONFSETTING( 0x08, "Play" ) - - PORT_START("IN.1") - PORT_CONFNAME( 0x03, 0x02, "Color" ) - PORT_CONFSETTING( 0x01, "Black" ) // from the bottom - PORT_CONFSETTING( 0x02, "White" ) - PORT_BIT(0x0c, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.2") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.3") - PORT_BIT(0x0f, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Learn") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("6 / White King") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("5 / White Queen") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("4 / White Rook") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("3 / White Bishop") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("2 / White Knight") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("1 / White Pawn") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("7 / Black Pawn") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("8 / Black Knight") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("9 / Black Bishop") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("10 / Black Rook") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("11 / Black Queen") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("12 / Black King") - - PORT_START("RESET") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CHANGED_MEMBER(DEVICE_SELF, cchess2_state, reset_button, 0) PORT_NAME("Reset") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void cchess2_state::cncchess2(machine_config &config) -{ - // basic machine hardware - M6504(config, m_maincpu, 1000000); // approximation, no XTAL - m_maincpu->set_addrmap(AS_PROGRAM, &cchess2_state::main_map); - - PIA6821(config, m_pia[0], 0); - m_pia[0]->writepa_handler().set(FUNC(cchess2_state::pia0_pa_w)); - m_pia[0]->writepb_handler().set(FUNC(cchess2_state::pia0_pb_w)); - - PIA6821(config, m_pia[1], 0); - m_pia[1]->readpa_handler().set(FUNC(cchess2_state::pia1_pa_r)); - m_pia[1]->readpb_handler().set(FUNC(cchess2_state::pia1_pb_r)); - m_pia[1]->writepb_handler().set(FUNC(cchess2_state::pia1_pb_w)); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - config.set_default_layout(layout_conic_cchess2); - - // sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( cncchess2 ) - ROM_REGION( 0x2000, "maincpu", 0 ) - ROM_LOAD("c11485.u2", 0x1000, 0x1000, CRC(b179d536) SHA1(0b1f9c247a4a3e2ccbf8d3ae5efa62b8938f572f) ) // AMI 2332 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, cncchess2, 0, 0, cncchess2, cncchess2, cchess2_state, empty_init, "Conic", "Computer Chess (Conic, model 7012)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/conic_cchess3.cpp b/src/mame/misc_chess/conic_cchess3.cpp deleted file mode 100644 index f269e3472e9..00000000000 --- a/src/mame/misc_chess/conic_cchess3.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Berger -/****************************************************************************** - -Conic Computer Chess (model 07013), more commonly known as Conic "Korchnoi". - -The interface is similar to the previous model (07012), where the user needs -to press Enter after their move. - -Hardware notes: -- Synertek 6502A @ 2MHz -- OKI MSM5840H-41RS @ 3.57MHz (2KB internal ROM) -- 2*4KB ROM(AMI), 1KB RAM(2*2114) -- beeper, 8*8+4 leds, magnets chessboard - -TODO: -- It does not work, MSM5840 is unemulated, and the internal ROM is not dumped. - MCU handles inputs, leds, sound, and it communicates with maincpu after - triggering an IRQ. - -******************************************************************************/ - -#include "emu.h" - -#include "cpu/m6502/m6502.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" - -#include "speaker.h" - -// internal artwork -//#include "conic_cchess3.lh" // clickable - - -namespace { - -class cchess3_state : public driver_device -{ -public: - cchess3_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_board(*this, "board"), - m_display(*this, "display"), - m_dac(*this, "dac") - { } - - // machine configs - void cncchess3(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_board; - required_device m_display; - required_device m_dac; - - void main_map(address_map &map); - - // I/O handlers - void main_comm_w(u8 data); - u8 main_comm_r(); -}; - -void cchess3_state::machine_start() -{ -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void cchess3_state::main_comm_w(u8 data) -{ -} - -u8 cchess3_state::main_comm_r() -{ - return 0; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void cchess3_state::main_map(address_map &map) -{ - map.global_mask(0x3fff); - map(0x0000, 0x03ff).ram(); - map(0x1000, 0x1000).rw(FUNC(cchess3_state::main_comm_r), FUNC(cchess3_state::main_comm_w)); - map(0x2000, 0x3fff).rom(); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( cncchess3 ) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void cchess3_state::cncchess3(machine_config &config) -{ - // basic machine hardware - M6502(config, m_maincpu, 2_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &cchess3_state::main_map); - - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8+1, 8); - //config.set_default_layout(layout_conic_cchess3); - - // sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( cncchess3 ) - ROM_REGION( 0x4000, "maincpu", 0 ) - ROM_LOAD("ci07013-1", 0x2000, 0x1000, CRC(3251a529) SHA1(729b22d7653761ff0951ce1da58fdfcd474a700d) ) // AMI 2332 - ROM_LOAD("ci07013-2", 0x3000, 0x1000, CRC(0f38dcef) SHA1(f8fb7e12b41753fe52dd2eb2edb843211b5ca7c1) ) // " - - ROM_REGION( 0x0800, "mcu", 0 ) - ROM_LOAD("msm5840h-41rs", 0x0000, 0x0800, NO_DUMP ) -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1981, cncchess3, 0, 0, cncchess3, cncchess3, cchess3_state, empty_init, "Conic", "Computer Chess (Conic, model 7013)", MACHINE_SUPPORTS_SAVE | MACHINE_IS_SKELETON ) diff --git a/src/mame/misc_chess/regence.cpp b/src/mame/misc_chess/regence.cpp deleted file mode 100644 index d03f75fe4c0..00000000000 --- a/src/mame/misc_chess/regence.cpp +++ /dev/null @@ -1,217 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/****************************************************************************** - -La Régence, French chess computer by "France Double R". German distribution -by Sandy Electronic, who sub-titled it TSB 4 (Turniersensorbrett). - -The chess engine is Richard Lang's Cyrus. - -Hardware notes: -- PCB label: FRANCE DOUBLE R, MADE IN FRANCE -- Sharp LH0080A Z80A @ 4 MHz (8MHz XTAL) -- 3*4KB ROM, sockets support up to 48KB ROM -- 2KB RAM (MSM5128-15RS), 3 sockets, only middle one used -- TTL, piezo, 8*8+4 LEDs, magnetic sensors - -******************************************************************************/ - -#include "emu.h" -#include "cpu/z80/z80.h" -#include "machine/sensorboard.h" -#include "sound/dac.h" -#include "video/pwm.h" -#include "speaker.h" - -// internal artwork -#include "regence.lh" // clickable - - -namespace { - -class regence_state : public driver_device -{ -public: - regence_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_board(*this, "board"), - m_dac(*this, "dac"), - m_inputs(*this, "IN.%u", 0) - { } - - // machine configs - void regence(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_device m_display; - required_device m_board; - required_device m_dac; - required_ioport_array<2> m_inputs; - - // address maps - void main_map(address_map &map); - - // I/O handlers - void update_display(); - void control_w(u8 data); - void leds_w(u8 data); - u8 input_r(); - - u8 m_inp_mux = 0; - u8 m_led_data = 0; -}; - -void regence_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_led_data)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void regence_state::update_display() -{ - m_display->matrix(1 << m_inp_mux, m_led_data); -} - -void regence_state::control_w(u8 data) -{ - // d0-d3: input mux/led select - m_inp_mux = data & 0xf; - update_display(); - - // d7: speaker out - m_dac->write(BIT(data, 7)); - - // other: ? -} - -void regence_state::leds_w(u8 data) -{ - // d0-d7: led data - m_led_data = data; - update_display(); -} - -u8 regence_state::input_r() -{ - u8 data = 0; - - // d0-d7: multiplexed inputs - // read chessboard sensors - if (m_inp_mux < 8) - data = m_board->read_file(m_inp_mux, true); - - // read other buttons - else if (m_inp_mux < 10) - data = m_inputs[m_inp_mux - 8]->read(); - - return data; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void regence_state::main_map(address_map &map) -{ - map(0x0000, 0x0fff).rom(); - map(0x4000, 0x4fff).rom(); - map(0x8000, 0x8fff).rom(); - map(0xd000, 0xd7ff).ram(); - map(0xf000, 0xf000).rw(FUNC(regence_state::input_r), FUNC(regence_state::control_w)); - map(0xf800, 0xf800).w(FUNC(regence_state::leds_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( regence ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Changement de Position (Set Up)") // Veränderung - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME(u8"Retour en Arrière (Take Back)") // Zug Zurück - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("Nouvelle Partie (New Game)") // Neues Spiel (press after setup) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("King") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Queen") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Rook") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Bishop") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Son (Sound)") // Ton - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Niveau (Level)") // Stufe - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_H) PORT_NAME("Marche/Arret (Move/Halt)") // Zug-Halt - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_NAME("Noir (Black)") // Schwarz - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Blanc (White)") // Weiss - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Pawn") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Knight") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void regence_state::regence(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, 8_MHz_XTAL/2); - m_maincpu->set_addrmap(AS_PROGRAM, ®ence_state::main_map); - - m_maincpu->set_periodic_int(FUNC(regence_state::irq0_line_hold), attotime::from_hz(448)); // from 555, measured - - SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); - m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); - m_board->set_delay(attotime::from_msec(150)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(10, 8); - config.set_default_layout(layout_regence); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( regence ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("arc0.ic13", 0x0000, 0x1000, CRC(ac6a0a67) SHA1(52b115c7cd372dfbad14b00854aa4f6f75a937d3) ) // M5L2732K - ROM_LOAD("arc1.ic12", 0x4000, 0x1000, CRC(5c2fb0c7) SHA1(811ab3d7cefcf872741eb2265115080aaf913f0f) ) // " - ROM_LOAD("arc2.ic11", 0x8000, 0x1000, CRC(e4c39dbd) SHA1(b6a6d1d39f73a2ff1ade6205bdf180be13e84df3) ) // " -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1982, regence, 0, 0, regence, regence, regence_state, empty_init, "France Double R", u8"La Régence", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/misc_chess/tasc.cpp b/src/mame/misc_chess/tasc.cpp deleted file mode 100644 index e0e698396ee..00000000000 --- a/src/mame/misc_chess/tasc.cpp +++ /dev/null @@ -1,381 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Sandro Ronco -/****************************************************************************** - -Tasc ChessSystem - -Commonly known as Tasc R30, it's basically a dedicated ChessMachine. -The King chess engines are also compatible with Tasc's The ChessMachine software -on PC, however the prototype Gideon 3.1(internally: 2.1, Rebel 2.01) is not. - -WARNING: Don't configure more than 512KB RAM for R30 The King 2.50, it will still -be playable but will actually use less than 512KB RAM and become weaker. - -The King 2.23 version was not sold to consumers. It has an opening book meant -for chesscomputer competitions. -For more information, see: http://chesseval.com/ChessEvalJournal/R30v223.htm - -R30 hardware notes: -- ARM6 CPU(P60ARM/CG) @ 30MHz -- 256KB system ROM (2*27C010) -- 512KB program RAM (4*MT5C1008), 128KB permanent RAM (KM681000ALP-7L) -- Toshiba LCD drivers (3*T7778A, T7900, T6963C), TC5565AFL-15 -- SB20 or SB30 "SmartBoard" chessboard with piece recognition - -R40 hardware notes: -- ARM6 CPU(VY86C061PSTC) @ 40MHz -- +512KB extra RAM piggybacked -- rest same as R30 - -Documentation for the Toshiba chips is hard to find, but similar chips exist: -T7778 is equivalent to T6A39, T7900 is equivalent to T6A40. - -EPROMs are interchangeable between R30 and R40, with some limitations with -The King 2.50 (see below). - -Regarding RAM: The King 2.2x will work fine with RAM expanded up to 8MB. -The King 2.50 appears to be protected against RAM upgrades though, and will -limit itself to 128KB if it detects a non-default amount of RAM. Gideon doesn't -use RAM above 128KB either, perhaps the R30 prototype only had 128KB RAM. - -references: -- https://www.schach-computer.info/wiki/index.php?title=Tasc_R30 -- https://www.schach-computer.info/wiki/index.php?title=Tasc_R40 -- https://www.schach-computer.info/wiki/index.php?title=Tasc_SmartBoard -- https://www.miclangschach.de/index.php?n=Main.TascR30 - -notes: -- holding LEFT+RIGHT on boot load the QC TestMode -- holding UP+DOWN on boot load the TestMode - -TODO: -- bootrom disable timer shouldn't be needed, real ARM has already fetched the next opcode -- more accurate dynamic cpu clock divider (same problem as in saitek_risc2500.cpp), - sound pitch is correct now though -- does the R40 version have the same clock divider value? - -******************************************************************************/ - -#include "emu.h" - -#include "cpu/arm/arm.h" -#include "machine/nvram.h" -#include "machine/ram.h" -#include "machine/smartboard.h" -#include "machine/timer.h" -#include "sound/spkrdev.h" -#include "video/t6963c.h" - -#include "speaker.h" - -// internal artwork -#include "tascr30.lh" - - -namespace { - -class tasc_state : public driver_device -{ -public: - tasc_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_rom(*this, "maincpu"), - m_ram(*this, "ram"), - m_nvram(*this, "nvram", 0x20000, ENDIANNESS_LITTLE), - m_lcd(*this, "lcd"), - m_smartboard(*this, "smartboard"), - m_speaker(*this, "speaker"), - m_disable_bootrom(*this, "disable_bootrom"), - m_inputs(*this, "IN.%u", 0U), - m_out_leds(*this, "pled%u", 0U) - { } - - void tasc(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(switch_cpu_freq) { set_cpu_freq(); } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void device_post_load() override { install_bootrom(m_bootrom_enabled); } - -private: - // devices/pointers - required_device m_maincpu; - required_region_ptr m_rom; - required_device m_ram; - memory_share_creator m_nvram; - required_device m_lcd; - required_device m_smartboard; - required_device m_speaker; - required_device m_disable_bootrom; - required_ioport_array<4> m_inputs; - output_finder<2> m_out_leds; - - void main_map(address_map &map); - - // I/O handlers - u32 input_r(); - u32 rom_r(offs_t offset); - void control_w(offs_t offset, u32 data, u32 mem_mask = ~0); - - u8 nvram_r(offs_t offset) { return m_nvram[offset]; } - void nvram_w(offs_t offset, u8 data) { m_nvram[offset] = data; } - - void set_cpu_freq(); - void install_bootrom(bool enable); - TIMER_DEVICE_CALLBACK_MEMBER(disable_bootrom) { install_bootrom(false); } - bool m_bootrom_enabled = false; - - u32 m_control = 0; - u32 m_prev_pc = 0; - u64 m_prev_cycle = 0; -}; - -void tasc_state::machine_start() -{ - m_out_leds.resolve(); - - save_item(NAME(m_bootrom_enabled)); - save_item(NAME(m_control)); - save_item(NAME(m_prev_pc)); - save_item(NAME(m_prev_cycle)); -} - -void tasc_state::machine_reset() -{ - install_bootrom(true); - set_cpu_freq(); - - m_prev_pc = m_maincpu->pc(); - m_prev_cycle = m_maincpu->total_cycles(); -} - -void tasc_state::set_cpu_freq() -{ - // R30 is 30MHz, R40 is 40MHz - m_maincpu->set_unscaled_clock((ioport("FAKE")->read() & 1) ? 40_MHz_XTAL : 30_MHz_XTAL); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void tasc_state::install_bootrom(bool enable) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - program.unmap_readwrite(0, std::max(m_rom.bytes(), size_t(m_ram->size())) - 1); - - // bootrom bankswitch - if (enable) - program.install_read_handler(0, m_rom.bytes() - 1, read32sm_delegate(*this, FUNC(tasc_state::rom_r))); - else - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); - - m_bootrom_enabled = enable; -} - -u32 tasc_state::input_r() -{ - if (!machine().side_effects_disabled()) - { - // disconnect bootrom from the bus after next opcode - if (m_bootrom_enabled && !m_disable_bootrom->enabled()) - m_disable_bootrom->adjust(m_maincpu->cycles_to_attotime(10)); - - m_maincpu->set_input_line(ARM_FIRQ_LINE, CLEAR_LINE); - } - - // read chessboard - u32 data = m_smartboard->data_r(); - - // read keypad - for (int i = 0; i < 4; i++) - { - if (BIT(m_control, i)) - data |= (m_inputs[i]->read() << 24); - } - - return data; -} - -void tasc_state::control_w(offs_t offset, u32 data, u32 mem_mask) -{ - if (ACCESSING_BITS_24_31) - { - if (BIT(data, 27)) - m_lcd->write(BIT(data, 26), data & 0xff); - - m_smartboard->data0_w(BIT(data, 30)); - m_smartboard->data1_w(BIT(data, 31)); - } - else - { - m_out_leds[0] = BIT(data, 0); - m_out_leds[1] = BIT(data, 1); - m_speaker->level_w((data >> 2) & 3); - } - - COMBINE_DATA(&m_control); -} - -u32 tasc_state::rom_r(offs_t offset) -{ - if (!machine().side_effects_disabled()) - { - // handle dynamic cpu clock divider when accessing rom - s64 diff = m_maincpu->total_cycles() - m_prev_cycle; - u32 pc = m_maincpu->pc(); - - if (diff > 0) - { - static constexpr int arm_branch_cycles = 3; - static constexpr int arm_max_cycles = 17; // datablock transfer - static constexpr int divider = -7 + 1; - - // this takes care of almost all cases, otherwise, total cycles taken can't be determined - if (diff <= arm_branch_cycles || (diff <= arm_max_cycles && (pc - m_prev_pc) == 4 && (pc & ~0x02000000) == (offset * 4))) - m_maincpu->adjust_icount(divider * (int)diff); - else - m_maincpu->adjust_icount(divider); - } - - m_prev_cycle = m_maincpu->total_cycles(); - m_prev_pc = pc; - } - - return m_rom[offset]; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void tasc_state::main_map(address_map &map) -{ - map(0x01000000, 0x01000003).rw(FUNC(tasc_state::input_r), FUNC(tasc_state::control_w)); - map(0x02000000, 0x0203ffff).r(FUNC(tasc_state::rom_r)); - map(0x03000000, 0x0307ffff).rw(FUNC(tasc_state::nvram_r), FUNC(tasc_state::nvram_w)).umask32(0x000000ff); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( tasc ) - PORT_START("IN.0") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("PLAY") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_LEFT) PORT_NAME("LEFT") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.1") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("BACK") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("RIGHT") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("IN.2") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("MENU") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_UP) PORT_NAME("UP") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Left Clock") - - PORT_START("IN.3") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("ENTER") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DOWN) PORT_NAME("DOWN") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Right Clock") - - PORT_START("FAKE") - PORT_CONFNAME( 0x01, 0x00, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, tasc_state, switch_cpu_freq, 0) - PORT_CONFSETTING( 0x00, "30MHz (R30)" ) - PORT_CONFSETTING( 0x01, "40MHz (R40)" ) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void tasc_state::tasc(machine_config &config) -{ - /* basic machine hardware */ - ARM(config, m_maincpu, 30_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &tasc_state::main_map); - m_maincpu->set_copro_type(arm_cpu_device::copro_type::VL86C020); - - const attotime irq_period = attotime::from_hz(32.768_kHz_XTAL / 128); // 256Hz - m_maincpu->set_periodic_int(FUNC(tasc_state::irq1_line_assert), irq_period); - - TIMER(config, "disable_bootrom").configure_generic(FUNC(tasc_state::disable_bootrom)); - - RAM(config, m_ram).set_extra_options("512K, 1M, 2M, 4M, 8M"); // see driver notes - m_ram->set_default_size("512K"); - m_ram->set_default_value(0); - - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - - TASC_SB30(config, m_smartboard); - subdevice("smartboard:board")->set_nvram_enable(true); - - /* video hardware */ - LM24014H(config, m_lcd, 0); - m_lcd->set_fs(1); // font size 6x8 - - config.set_default_layout(layout_tascr30); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); - m_speaker->set_levels(4, speaker_levels); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( tascr30 ) // system version V1.01 (17-Mar-95), program version 2.50 (26-Feb-95) - ROM_REGION32_LE( 0x40000, "maincpu", 0 ) - ROM_LOAD32_WORD("r30_lo_1.01_king_2.5", 0x00000, 0x20000, CRC(9711c158) SHA1(87c60d2097cb437482df11916543f6ef7f18b0d3) ) - ROM_LOAD32_WORD_SWAP("r30_hi_1.01_king_2.5", 0x00002, 0x20000, CRC(df913abf) SHA1(1bc2ea4b6514bf9fec18f52c264f1440ba7c8c01) ) -ROM_END - -ROM_START( tascr30a ) // system version V0.31 (3-May-93), program version 2.20 (23-Apr-93) - ROM_REGION32_LE( 0x40000, "maincpu", 0 ) - ROM_LOAD32_WORD("0.31_l", 0x00000, 0x20000, CRC(d30f81fe) SHA1(81957c7266bedec66b2c14b97008c4261bd67828) ) - ROM_LOAD32_WORD_SWAP("0.31_h", 0x00002, 0x20000, CRC(aeac3b46) SHA1(a757e0086636dfd3bf78e61cee46c7d92b39d3b9) ) -ROM_END - -ROM_START( tascr30b ) // system version V0.31 (3-May-93), program version 2.23 (16-May-93) - ROM_REGION32_LE( 0x40000, "maincpu", 0 ) - ROM_LOAD32_WORD("r30_v2.23_lo", 0x00000, 0x20000, CRC(37251b1a) SHA1(4be768e861002b20ba59a18329f488dba0a0c9bf) ) - ROM_LOAD32_WORD_SWAP("r30_v2.23_hi", 0x00002, 0x20000, CRC(e546be93) SHA1(943ae65cf97ec4389b9730c6006e805935333072) ) -ROM_END - -ROM_START( tascr30g ) // system version V0.31 (3-May-93), program version 2.1 (3-Feb-93) - ROM_REGION32_LE( 0x40000, "maincpu", 0 ) - ROM_LOAD32_WORD("r30_gideon_l", 0x00000, 0x20000, CRC(7041d051) SHA1(266843f375a8621320fc2cd1300775fb7a505c6e) ) - ROM_LOAD32_WORD_SWAP("r30_gideon_h", 0x00002, 0x20000, CRC(7345ee08) SHA1(9cad608bd32d804468b23196151be0a5f8cee214) ) -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1995, tascr30, 0, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.50)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1993, tascr30a, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.20)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1993, tascr30b, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (The King 2.23, TM version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // competed in several chesscomputer tournaments -CONS( 1993, tascr30g, tascr30, 0, tasc, tasc, tasc_state, empty_init, "Tasc", "ChessSystem R30 (Gideon 3.1, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_TIMING | MACHINE_CLICKABLE_ARTWORK ) // made in 1993, later released in 2012 diff --git a/src/mame/misc_handheld/README.md b/src/mame/misc_handheld/README.md deleted file mode 100644 index a5c5ca5e053..00000000000 --- a/src/mame/misc_handheld/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# **src/mame/misc_handheld** # - -Folder for miscellaneous handheld/tabletop drivers, where the number of drivers is too small to place them in specific company folders. -This also includes the hh_ collection drivers and their subclasses. \ No newline at end of file diff --git a/src/mame/misc_handheld/hh_cop400.cpp b/src/mame/misc_handheld/hh_cop400.cpp deleted file mode 100644 index 587d1575207..00000000000 --- a/src/mame/misc_handheld/hh_cop400.cpp +++ /dev/null @@ -1,2506 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -National Semiconductor COPS(COP400 MCU series) handhelds or other simple -devices, mostly LED electronic games/toys. - -TODO: -- why does h2hbaskbc(and clones) need a workaround on writing L pins? -- plus1: which sensor position is which colour? -- vidchal: Add screen and gun cursor with brightness detection callback, - and softwarelist for the video tapes. We'd also need a VHS player device. - The emulated lightgun itself appears to be working fine(eg. add a 30hz - timer to IN.3 to score +100) -- solution release year, most chips on the PCB were from 1984, but this one - was dumped from a licensed product branded for the VWR company, so it - could be later than the initial release - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/cop400/cop400.h" -#include "video/pwm.h" -#include "machine/timer.h" -#include "sound/spkrdev.h" -#include "sound/dac.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "bship82.lh" // clickable -#include "ctstein.lh" // clickable -#include "einvaderc.lh" -#include "funjacks.lh" // clickable -#include "funrlgl.lh" // clickable -#include "funtag.lh" // clickable -#include "h2hbaskbc.lh" -#include "h2hhockeyc.lh" -#include "h2hsoccerc.lh" -#include "lafootb.lh" -#include "lchicken.lh" // clickable -#include "lightfgt.lh" // clickable -#include "mbaskb2.lh" -#include "mdallas.lh" -#include "msoccer2.lh" -#include "qkracer.lh" -#include "scat.lh" -#include "unkeinv.lh" -#include "vidchal.lh" - -//#include "hh_cop400_test.lh" // common test-layout - use external artwork - - -class hh_cop400_state : public driver_device -{ -public: - hh_cop400_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_l = 0; // MCU port L write data - u8 m_g = 0; // MCU port G write data - u8 m_d = 0; // MCU port D write data - int m_so = 0; // MCU SO line state - int m_sk = 0; // MCU SK line state - u16 m_inp_mux = ~0; // multiplexed inputs mask - - u16 read_inputs(int columns, u16 colmask = ~0); -}; - - -// machine start/reset - -void hh_cop400_state::machine_start() -{ - // register for savestates - save_item(NAME(m_l)); - save_item(NAME(m_g)); - save_item(NAME(m_d)); - save_item(NAME(m_so)); - save_item(NAME(m_sk)); - save_item(NAME(m_inp_mux)); -} - -void hh_cop400_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_cop400_state::read_inputs(int columns, u16 colmask) -{ - // active low - u16 ret = ~0 & colmask; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (~m_inp_mux >> i & 1) - ret &= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_cop400_state::reset_button) -{ - // when an input is directly wired to MCU reset pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Castle Toy Einstein - * COP421 MCU label ~/927 COP421-NEZ/N - * 4 lamps, 1-bit sound - - This is a Simon clone, the tones are not harmonic. Two models exist, each - with a different batteries setup, assume they're same otherwise. - -***************************************************************************/ - -class ctstein_state : public hh_cop400_state -{ -public: - ctstein_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void ctstein(machine_config &config); - -private: - void write_g(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void ctstein_state::write_g(u8 data) -{ - // G0-G2: input mux - m_inp_mux = data & 7; -} - -void ctstein_state::write_l(u8 data) -{ - // L0-L3: button lamps - m_display->matrix(1, data & 0xf); -} - -u8 ctstein_state::read_l() -{ - // L4-L7: multiplexed inputs - return read_inputs(3, 0xf) << 4 | 0xf; -} - -// config - -static INPUT_PORTS_START( ctstein ) - PORT_START("IN.0") // G0 port L - PORT_CONFNAME( 0x0f, 0x01^0x0f, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01^0x0f, "1" ) - PORT_CONFSETTING( 0x02^0x0f, "2" ) - PORT_CONFSETTING( 0x04^0x0f, "3" ) - PORT_CONFSETTING( 0x08^0x0f, "4" ) - - PORT_START("IN.1") // G1 port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SELECT ) PORT_NAME("Best Score") - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Red Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Green Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Blue Button") -INPUT_PORTS_END - -void ctstein_state::ctstein(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_g().set(FUNC(ctstein_state::write_g)); - m_maincpu->write_l().set(FUNC(ctstein_state::write_l)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_l().set(FUNC(ctstein_state::read_l)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ctstein); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ctstein ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421-nez_n", 0x0000, 0x0400, CRC(16148e03) SHA1(b2b74891d36813d9a1eefd56a925054997c4b7f7) ) // 2nd half empty -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Basketball/Hockey/Soccer (model 2150/2160/2170) - * COP420 MCU label COP420L-NEZ/N - * 2-digit 7seg display, 41 other leds, 1-bit sound - - 3 Head to Head games were released using this MCU/ROM. They play very much - the same, only differing on game time. The PCB is pre-configured on G1+IN2 - and IN3 to select the game. - - An earlier revision of this runs on TMS1000, see hh_tms1k.cpp driver. Model - numbers are the same. From the outside, an easy way to spot the difference is - the Start/Display button: TMS1000 version button label is D, COP420 one is a *. - The COP420 version also plays much slower. - -***************************************************************************/ - -class h2hbaskbc_state : public hh_cop400_state -{ -public: - h2hbaskbc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void h2hsoccerc(machine_config &config); - void h2hbaskbc(machine_config &config); - void h2hhockeyc(machine_config &config); - -private: - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); -}; - -// handlers - -void h2hbaskbc_state::write_d(u8 data) -{ - // D: led select - m_d = data & 0xf; -} - -void h2hbaskbc_state::write_g(u8 data) -{ - // G: led select, input mux - m_inp_mux = data; - m_g = data & 0xf; -} - -void h2hbaskbc_state::write_l(u8 data) -{ - // D2,D3 double as multiplexer - u16 mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00); - u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask; - - // D2+G0,G1 are 7segs - // L0-L6: digit segments A-G, L0-L4: led data - m_display->matrix(sel, data); -} - -u8 h2hbaskbc_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(4, 7) | (m_inputs[4]->read() & 8); -} - -// config - -static INPUT_PORTS_START( h2hbaskbc ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start/Display") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // factory set - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x04, "Factory Test" ) - PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("IN.4") // IN3 (factory set) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hhockeyc ) - PORT_INCLUDE( h2hbaskbc ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hsoccerc ) - PORT_INCLUDE( h2hhockeyc ) - - PORT_MODIFY("IN.1") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_CUSTOM ) -INPUT_PORTS_END - -void h2hbaskbc_state::h2hbaskbc(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 1000000); // approximation - RC osc. R=43K, C=101pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(h2hbaskbc_state::write_d)); - m_maincpu->write_g().set(FUNC(h2hbaskbc_state::write_g)); - m_maincpu->write_l().set(FUNC(h2hbaskbc_state::write_l)); - m_maincpu->read_in().set(FUNC(h2hbaskbc_state::read_in)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_h2hbaskbc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void h2hbaskbc_state::h2hhockeyc(machine_config &config) -{ - h2hbaskbc(config); - config.set_default_layout(layout_h2hhockeyc); -} - -void h2hbaskbc_state::h2hsoccerc(machine_config &config) -{ - h2hbaskbc(config); - config.set_default_layout(layout_h2hsoccerc); -} - -// roms - -ROM_START( h2hbaskbc ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l-nmy", 0x0000, 0x0400, CRC(87152509) SHA1(acdb869b65d49b3b9855a557ed671cbbb0f61e2c) ) -ROM_END - -#define rom_h2hhockeyc rom_h2hbaskbc // dumped from Basketball -#define rom_h2hsoccerc rom_h2hbaskbc // " - - - - - -/*************************************************************************** - - Entex Space Invader - * COP444L MCU label /B138 COPL444-HRZ/N INV II (die label HRZ COP 444L/A) - * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - The first version was on TMS1100 (see hh_tms1k.c), this is the reprogrammed - second release with a gray case instead of black. - -***************************************************************************/ - -class einvaderc_state : public hh_cop400_state -{ -public: - einvaderc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void einvaderc(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - DECLARE_WRITE_LINE_MEMBER(write_sk); - DECLARE_WRITE_LINE_MEMBER(write_so); - void write_l(u8 data); -}; - -// handlers - -void einvaderc_state::update_display() -{ - u8 l = bitswap<8>(m_l,7,6,0,1,2,3,4,5); - u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff; - - m_display->matrix(grid, l); -} - -void einvaderc_state::write_d(u8 data) -{ - // D: led grid 0-3 (D0-D2 are 7segs) - m_d = data; - update_display(); -} - -void einvaderc_state::write_g(u8 data) -{ - // G: led grid 4-7 - m_g = data; - update_display(); -} - -WRITE_LINE_MEMBER(einvaderc_state::write_sk) -{ - // SK: speaker out + led grid 8 - m_speaker->level_w(state); - m_sk = state; - update_display(); -} - -WRITE_LINE_MEMBER(einvaderc_state::write_so) -{ - // SO: led grid 9 - m_so = state; - update_display(); -} - -void einvaderc_state::write_l(u8 data) -{ - // L: led state/segment - m_l = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( einvaderc ) - PORT_START("IN.0") // port IN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "Amateur" ) - PORT_CONFSETTING( 0x00, "Professional" ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) -INPUT_PORTS_END - -void einvaderc_state::einvaderc(machine_config &config) -{ - // basic machine hardware - COP444L(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->read_in().set_ioport("IN.0"); - m_maincpu->write_d().set(FUNC(einvaderc_state::write_d)); - m_maincpu->write_g().set(FUNC(einvaderc_state::write_g)); - m_maincpu->write_sk().set(FUNC(einvaderc_state::write_sk)); - m_maincpu->write_so().set(FUNC(einvaderc_state::write_so)); - m_maincpu->write_l().set(FUNC(einvaderc_state::write_l)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(919, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_einvaderc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvaderc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) ) - - ROM_REGION( 82104, "mask", 0) - ROM_LOAD( "einvaderc.svg", 0, 82104, CRC(0013227f) SHA1(44a3ac48c947369231f010559331ad16fcbef7be) ) -ROM_END - - - - - -/*************************************************************************** - - Gordon Barlow Design electronic Space Invaders game (unreleased, from patent US4345764) - * COP421 (likely a development chip) - * 36+9 LEDs, 1-bit sound - - This game is presumedly unreleased. The title is unknown, the patent simply names - it "Hand-held electronic game". There is no mass-manufacture company assigned - to it either. The game seems unfinished(no scorekeeping, some bugs), and the design - is very complex. Player ship and bullets are on a moving "wand", a 2-way mirror - makes it appear on the same plane as the enemies and barriers. - -***************************************************************************/ - -class unkeinv_state : public hh_cop400_state -{ -public: - unkeinv_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void unkeinv(machine_config &config); - -private: - void update_display(); - void write_g(u8 data); - void write_d(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void unkeinv_state::update_display() -{ - m_display->matrix(m_g << 4 | m_d, m_l); -} - -void unkeinv_state::write_g(u8 data) -{ - // G0,G1: led select part - // G2,G3: input mux - m_g = ~data & 0xf; - update_display(); -} - -void unkeinv_state::write_d(u8 data) -{ - // D0-D3: led select part - m_d = ~data & 0xf; - update_display(); -} - -void unkeinv_state::write_l(u8 data) -{ - // L0-L7: led data - m_l = ~data & 0xff; - update_display(); -} - -u8 unkeinv_state::read_l() -{ - u8 ret = 0xff; - - // L0-L5+G2: positional odd - // L0-L5+G3: positional even - u8 pos = m_inputs[1]->read(); - if (m_g & 4 && pos & 1) - ret ^= (1 << (pos >> 1)); - if (m_g & 8 && ~pos & 1) - ret ^= (1 << (pos >> 1)); - - // L7+G3: fire button - if (m_g & 8 && m_inputs[0]->read()) - ret ^= 0x80; - - return ret & ~m_l; -} - -// config - -static INPUT_PORTS_START( unkeinv ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") - PORT_BIT( 0x0f, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(12) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_CENTERDELTA(0) -INPUT_PORTS_END - -void unkeinv_state::unkeinv(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // frequency guessed - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_g().set(FUNC(unkeinv_state::write_g)); - m_maincpu->write_d().set(FUNC(unkeinv_state::write_d)); - m_maincpu->write_l().set(FUNC(unkeinv_state::write_l)); - m_maincpu->read_l().set(FUNC(unkeinv_state::read_l)); - m_maincpu->read_l_tristate().set_constant(0xff); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 8); - config.set_default_layout(layout_unkeinv); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( unkeinv ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421_us4345764", 0x0000, 0x0400, CRC(0068c3a3) SHA1(4e5fd566a5a26c066cc14623a9bd01e109ebf797) ) // typed in from patent US4345764, good print quality -ROM_END - - - - - -/*************************************************************************** - - LJN I Took a Lickin' From a Chicken - * COP421 MCU label ~/005 COP421-NJC/N - * 11 leds, 1-bit sound, motor to a chicken on a spring - - This toy includes 4 games: Tic Tac Toe, Chicken Sez, and Total Recall I/II. - - known releases: - - USA: I Took a Lickin' From a Chicken, published by LJN - - Japan: Professor Chicken's Genius Classroom 「にわとり博士の天才教室」, published by Bandai - (not sure if it's the same ROM, or just licensed the outer shell) - -***************************************************************************/ - -class lchicken_state : public hh_cop400_state -{ -public: - lchicken_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag), - m_motor_pos_out(*this, "motor_pos"), - m_motor_on_out(*this, "motor_on") - { } - - void lchicken(machine_config &config); - - DECLARE_READ_LINE_MEMBER(motor_switch_r); - -protected: - virtual void machine_start() override; - -private: - output_finder<> m_motor_pos_out; - output_finder<> m_motor_on_out; - - u8 m_motor_pos = 0; - TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); - - void write_l(u8 data); - void write_d(u8 data); - void write_g(u8 data); - u8 read_g(); -}; - -void lchicken_state::machine_start() -{ - hh_cop400_state::machine_start(); - - m_motor_pos_out.resolve(); - m_motor_on_out.resolve(); - - // register for savestates - save_item(NAME(m_motor_pos)); -} - -// handlers - -READ_LINE_MEMBER(lchicken_state::motor_switch_r) -{ - return m_motor_pos > 0xe8; // approximation -} - -TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick) -{ - if (~m_inp_mux & 8) - { - m_motor_pos++; - m_motor_pos_out = 100 * (m_motor_pos / (float)0x100); - } -} - -void lchicken_state::write_l(u8 data) -{ - // L0-L3: led data - // L4-L6: led select - // L7: N/C - m_display->matrix(data >> 4 & 7, ~data & 0xf); -} - -void lchicken_state::write_d(u8 data) -{ - // D0-D3: input mux - // D3: motor on - m_inp_mux = data & 0xf; - m_motor_on_out = ~data >> 3 & 1; -} - -void lchicken_state::write_g(u8 data) -{ - m_g = data; -} - -u8 lchicken_state::read_g() -{ - // G0-G3: multiplexed inputs - return read_inputs(4, m_g); -} - -// config - -static INPUT_PORTS_START( lchicken ) - PORT_START("IN.0") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(lchicken_state, motor_switch_r) -INPUT_PORTS_END - -void lchicken_state::lchicken(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 850000); // approximation - RC osc. R=12K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(lchicken_state::write_l)); - m_maincpu->write_d().set(FUNC(lchicken_state::write_d)); - m_maincpu->write_g().set(FUNC(lchicken_state::write_g)); - m_maincpu->read_g().set(FUNC(lchicken_state::read_g)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); - - TIMER(config, "chicken_motor").configure_periodic(FUNC(lchicken_state::motor_sim_tick), attotime::from_msec(6000/0x100)); // ~6sec for a full rotation - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 4); - config.set_default_layout(layout_lchicken); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lchicken ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Jacks (model 1603) - * COP410L MCU die bonded directly to PCB (die label COP410L/B NGS) - * 8 LEDs, 1-bit sound - -***************************************************************************/ - -class funjacks_state : public hh_cop400_state -{ -public: - funjacks_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funjacks(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_g(); -}; - -// handlers - -void funjacks_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funjacks_state::write_d(u8 data) -{ - // D: led grid + input mux - m_inp_mux = data; - m_d = ~data & 0xf; - update_display(); -} - -void funjacks_state::write_l(u8 data) -{ - // L0,L1: led state - m_l = data & 3; - update_display(); -} - -void funjacks_state::write_g(u8 data) -{ - // G1: speaker out - m_speaker->level_w(data >> 1 & 1); - m_g = data; -} - -u8 funjacks_state::read_l() -{ - // L4,L5: multiplexed inputs - return read_inputs(3, 0x30) | m_l; -} - -u8 funjacks_state::read_g() -{ - // G1: speaker out state - // G2,G3: inputs - return m_inputs[3]->read() | (m_g & 2); -} - -// config - -static INPUT_PORTS_START( funjacks ) - PORT_START("IN.0") // D0 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) - - PORT_START("IN.1") // D1 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) - - PORT_START("IN.2") // D2 port L - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) // positioned at 1 o'clock on panel, increment clockwise - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) - - PORT_START("IN.3") // port G - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speaker - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void funjacks_state::funjacks(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 850000); // approximation - RC osc. R=47K, C=56pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funjacks_state::write_d)); - m_maincpu->write_l().set(FUNC(funjacks_state::write_l)); - m_maincpu->write_g().set(FUNC(funjacks_state::write_g)); - m_maincpu->read_l().set(FUNC(funjacks_state::read_l)); - m_maincpu->read_g().set(FUNC(funjacks_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 2); - config.set_default_layout(layout_funjacks); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funjacks ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_ngs", 0x0000, 0x0200, CRC(863368ea) SHA1(f116cc27ae721b3a3e178fa13765808bdc275663) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Red Light Green Light (model 1604) - * COP410L MCU die bonded directly to PCB (die label COP410L/B NHZ) - * 14 LEDs, 1-bit sound - - known releases: - - USA: Funtronics: Red Light Green Light, published by Mattel - - USA(rerelease): Funtronics: Hot Wheels Drag Race, published by Mattel - -***************************************************************************/ - -class funrlgl_state : public hh_cop400_state -{ -public: - funrlgl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funrlgl(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); -}; - -// handlers - -void funrlgl_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funrlgl_state::write_d(u8 data) -{ - // D: led grid - m_d = ~data & 0xf; - update_display(); -} - -void funrlgl_state::write_l(u8 data) -{ - // L0-L3: led state - // L4-L7: N/C - m_l = ~data & 0xf; - update_display(); -} - -void funrlgl_state::write_g(u8 data) -{ - // G3: speaker out - m_speaker->level_w(data >> 3 & 1); -} - -// config - -static INPUT_PORTS_START( funrlgl ) - PORT_START("IN.0") // port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_cop400_state, reset_button, 0) -INPUT_PORTS_END - -void funrlgl_state::funrlgl(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 800000); // approximation - RC osc. R=51K, C=91pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funrlgl_state::write_d)); - m_maincpu->write_l().set(FUNC(funrlgl_state::write_l)); - m_maincpu->read_l_tristate().set_constant(0xff); - m_maincpu->write_g().set(FUNC(funrlgl_state::write_g)); - m_maincpu->read_g().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 4); - m_display->set_bri_levels(0.005, 0.1); // top led is brighter - config.set_default_layout(layout_funrlgl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funrlgl ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_nhz", 0x0000, 0x0200, CRC(4065c3ce) SHA1(f0bc8125d922949e0d7ab1ba89c805a836d20e09) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Funtronics: Tag (model 1497) - * COP410L MCU die bonded directly to PCB (die label COP410L/B GTJ) - * 7 LEDs, 7 buttons, 1-bit sound - -***************************************************************************/ - -class funtag_state : public hh_cop400_state -{ -public: - funtag_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void funtag(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_g(); -}; - -// handlers - -void funtag_state::update_display() -{ - m_display->matrix(m_d, m_l); -} - -void funtag_state::write_d(u8 data) -{ - // D: led grid + input mux - m_inp_mux = data; - m_d = ~data & 0xf; - update_display(); -} - -void funtag_state::write_l(u8 data) -{ - // L0,L1: led state - m_l = data & 3; - update_display(); -} - -void funtag_state::write_g(u8 data) -{ - // G2: speaker out - m_speaker->level_w(data >> 2 & 1); -} - -u8 funtag_state::read_l() -{ - // L2: difficulty switch - return m_inputs[4]->read() | 8; -} - -u8 funtag_state::read_g() -{ - // G0,G1: multiplexed inputs - // G3: start button - return read_inputs(3, 3) | m_inputs[3]->read() | 4; -} - -// config - -static INPUT_PORTS_START( funtag ) - PORT_START("IN.0") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) - - PORT_START("IN.1") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) - - PORT_START("IN.2") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) - - PORT_START("IN.3") // port G - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START ) - - PORT_START("IN.4") // port L - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void funtag_state::funtag(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=47K, C=91pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(funtag_state::write_d)); - m_maincpu->write_l().set(FUNC(funtag_state::write_l)); - m_maincpu->write_g().set(FUNC(funtag_state::write_g)); - m_maincpu->read_l().set(FUNC(funtag_state::read_l)); - m_maincpu->read_g().set(FUNC(funtag_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 2); - config.set_default_layout(layout_funtag); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( funtag ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_gtj", 0x0000, 0x0200, CRC(ce565da6) SHA1(34e5f39e32f220007d353c93787c1a6d117592c1) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Basketball 2 (model 1645), Soccer 2 (model 1642) - * PCB label: MA6037/38 - * dual COP420L MCUs, dies bonded to PCB (see romdefs for rom serials) - * 4001, die also bonded to PCB - * 2-digit 7seg display, 36 other leds, 1-bit sound - - The clock generator was measured ~527kHz for mbaskb2, ~483kHz for msoccer2, - meaning that the internal divider is 8. Main MCU SK connects to the other - MCU CKO pin, probably for syncing serial I/O. - - These two are on the same hardware, see patents US4341383 and US4372556 - for detailed descriptions of the games. - -***************************************************************************/ - -class mbaskb2_state : public hh_cop400_state -{ -public: - mbaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag), - m_subcpu(*this, "subcpu"), - m_on_timer(*this, "on_timer") - { } - - void mbaskb2(machine_config &config); - void msoccer2(machine_config &config); - - DECLARE_CUSTOM_INPUT_MEMBER(switch_r); - -protected: - virtual void machine_reset() override; - -private: - required_device m_subcpu; - required_device m_on_timer; - - void update_display(); - void shared_write_l(u8 data); - void main_write_g(u8 data); - void sub_write_g(u8 data); - void sub_write_d(u8 data); - u8 sub_read_in(); -}; - -void mbaskb2_state::machine_reset() -{ - hh_cop400_state::machine_reset(); - m_on_timer->adjust(attotime::from_msec(5)); -} - -// handlers - -void mbaskb2_state::update_display() -{ - m_display->matrix(~(m_d << 4 | m_g), m_l); -} - -void mbaskb2_state::shared_write_l(u8 data) -{ - // L: led data (though it's unlikely that maincpu will write valid led data to it) - m_l = m_maincpu->l_r() | m_subcpu->l_r(); - update_display(); -} - -void mbaskb2_state::main_write_g(u8 data) -{ - // G1: speaker out - m_speaker->level_w(data >> 1 & 1); -} - -void mbaskb2_state::sub_write_g(u8 data) -{ - // G: led select (low), input mux - m_g = m_inp_mux = data & 0xf; - update_display(); -} - -void mbaskb2_state::sub_write_d(u8 data) -{ - // D: led select (high) - m_d = data & 0xf; - update_display(); -} - -u8 mbaskb2_state::sub_read_in() -{ - // IN: multiplexed inputs - return read_inputs(3, 0xf); -} - -// config - -CUSTOM_INPUT_MEMBER(mbaskb2_state::switch_r) -{ - // The power switch is off-1-2, and the game relies on power-on starting at 1, - // otherwise msoccer2 boots up to what looks like a factory test mode. - return (m_inputs[3]->read() & 1) | (m_on_timer->enabled() ? 1 : 0); -} - -static INPUT_PORTS_START( mbaskb2 ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Shoot") - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Defense: Man") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Defense: Zone") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Defense: Press") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mbaskb2_state, switch_r) - - PORT_START("IN.3") - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( msoccer2 ) - PORT_INCLUDE( mbaskb2 ) - - PORT_MODIFY("IN.2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("Low/High Kick") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("Teammate") -INPUT_PORTS_END - -void mbaskb2_state::mbaskb2(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 500000); // approximation - m_maincpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed - m_maincpu->write_g().set(FUNC(mbaskb2_state::main_write_g)); - m_maincpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); - m_maincpu->read_l().set(m_subcpu, FUNC(cop400_cpu_device::l_r)); - m_maincpu->read_l_tristate().set_constant(0x80); - m_maincpu->read_si().set(m_subcpu, FUNC(cop400_cpu_device::so_r)); - - COP420(config, m_subcpu, 500000); // same as maincpu - m_subcpu->set_config(COP400_CKI_DIVISOR_8, COP400_CKO_SYNC_INPUT, false); // guessed - m_subcpu->write_d().set(FUNC(mbaskb2_state::sub_write_d)); - m_subcpu->write_g().set(FUNC(mbaskb2_state::sub_write_g)); - m_subcpu->write_l().set(FUNC(mbaskb2_state::shared_write_l)); - m_subcpu->read_l().set(m_maincpu, FUNC(cop400_cpu_device::l_r)); - m_subcpu->read_l_tristate().set_constant(0x80); - m_subcpu->read_in().set(FUNC(mbaskb2_state::sub_read_in)); - m_subcpu->read_si().set(m_maincpu, FUNC(cop400_cpu_device::so_r)); - m_subcpu->read_cko().set(m_maincpu, FUNC(cop400_cpu_device::sk_r)); - - config.set_perfect_quantum(m_maincpu); - - TIMER(config, "on_timer").configure_generic(nullptr); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(0xc0, 0x7f); - m_display->set_bri_levels(0.008, 0.04); // offense is brighter - config.set_default_layout(layout_mbaskb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void mbaskb2_state::msoccer2(machine_config &config) -{ - mbaskb2(config); - config.set_default_layout(layout_msoccer2); -} - -// roms - -ROM_START( mbaskb2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l_nmp", 0x0000, 0x0400, CRC(afc44378) SHA1(e96435bd1d0b2bea5140efdfe21f4684f2525075) ) - - ROM_REGION( 0x0400, "subcpu", 0 ) - ROM_LOAD( "cop420l_nmq", 0x0000, 0x0400, CRC(70943f6f) SHA1(3f711d8b7c7c5dd13c68bf1ef980d2f784b748f4) ) -ROM_END - -ROM_START( msoccer2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420l_nnm", 0x0000, 0x0400, CRC(c9169aca) SHA1(525486e8a18ec6132e53f9be582b2667172230a9) ) - - ROM_REGION( 0x0400, "subcpu", 0 ) - ROM_LOAD( "cop420l_nnk", 0x0000, 0x0400, CRC(a84dd5f4) SHA1(5d269816248319a2bca1708d5022af455d52682d) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Look Alive! Football (model 1998) - * COP421L MCU die bonded directly to PCB (rom serial HCJ) - * 2 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - For a detailed description, see patent US4582323. 1st-person view versions - for Baseball and Basketball were also announced, but not released. - -***************************************************************************/ - -class lafootb_state : public hh_cop400_state -{ -public: - lafootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void lafootb(machine_config &config); - -private: - void update_display(); - void write_l(u8 data); - void write_d(u8 data); - u8 read_g(); -}; - -// handlers - -void lafootb_state::update_display() -{ - m_display->matrix(~m_d, m_l); -} - -void lafootb_state::write_l(u8 data) -{ - // L: led data - m_l = data; - update_display(); -} - -void lafootb_state::write_d(u8 data) -{ - // D: led select, D2,D3: input mux - m_d = data & 0xf; - m_inp_mux = data >> 2 & 3; - update_display(); -} - -u8 lafootb_state::read_g() -{ - // G: multiplexed inputs - return read_inputs(2, 7) | (m_inputs[2]->read() & 8); -} - -// config - -static INPUT_PORTS_START( lafootb ) - PORT_START("IN.0") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Right / Home") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick / Yards to go") - - PORT_START("IN.1") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Left / Visitors") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Up / Time") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Pass / Status") - - PORT_START("IN.2") // G3 - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void lafootb_state::lafootb(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 900000); // approximation - RC osc. R=51K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(lafootb_state::write_l)); - m_maincpu->write_d().set(FUNC(lafootb_state::write_d)); - m_maincpu->read_g().set(FUNC(lafootb_state::read_g)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1920, 864); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(4, 8); - m_display->set_segmask(0x4, 0x7f); - m_display->set_segmask(0x8, 0xff); // right digit has dp - m_display->set_bri_levels(0.005); - config.set_default_layout(layout_lafootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lafootb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421l_hcj", 0x0000, 0x0400, CRC(a9cc1e94) SHA1(7a39f5a5f10b8a2bd72da3ff3f3fcfaad35ead5f) ) - - ROM_REGION( 38608, "mask", 0) - ROM_LOAD( "lafootb.svg", 0, 38608, CRC(35387445) SHA1(7cd9db170820fc84d47545c3db8d991b2c5f4f7f) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Dalla$ (J.R. handheld) - * COP444 MCU label COP444L-HYN/N - * 8-digit 7seg display, 1-bit sound - - This is a board game, only the handheld device is emulated here. - -***************************************************************************/ - -class mdallas_state : public hh_cop400_state -{ -public: - mdallas_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void mdallas(machine_config &config); - -private: - void update_display(); - void write_l(u8 data); - void write_d(u8 data); - void write_g(u8 data); - u8 read_in(); -}; - -// handlers - -void mdallas_state::update_display() -{ - m_display->matrix(~(m_d << 4 | m_g), m_l); -} - -void mdallas_state::write_l(u8 data) -{ - // L: digit segment data - m_l = data; - update_display(); -} - -void mdallas_state::write_d(u8 data) -{ - // D: select digit, input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); - m_d = data & 0xf; - update_display(); -} - -void mdallas_state::write_g(u8 data) -{ - // G: select digit, input mux low - m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); - m_g = data & 0xf; - update_display(); -} - -u8 mdallas_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(6, 0xf); -} - -// config - -/* physical button layout and labels are like this: - - < ON> [YES] [NO] [NEXT] - [] - [7] [8] [9] [STATUS] - [4] [5] [6] [ASSETS] - [1] [2] [3] [START] - [CLEAR] [0] [MOVE] [ENTER] -*/ - -static INPUT_PORTS_START( mdallas ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Start") - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Assets") - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Status") - - PORT_START("IN.4") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("West") // W - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Next") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("East") // E - - PORT_START("IN.5") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("No") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Yes") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("South") // S - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("North") // N -INPUT_PORTS_END - -void mdallas_state::mdallas(machine_config &config) -{ - // basic machine hardware - COP444L(config, m_maincpu, 900000); // approximation - RC osc. R=57K, C=101pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_l().set(FUNC(mdallas_state::write_l)); - m_maincpu->write_d().set(FUNC(mdallas_state::write_d)); - m_maincpu->write_g().set(FUNC(mdallas_state::write_g)); - m_maincpu->read_in().set(FUNC(mdallas_state::read_in)); - m_maincpu->write_so().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_mdallas); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mdallas ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cop444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Plus One - * COP410L MCU in 8-pin DIP, label ~/029 MM 57405 (die label COP410L/B NNE) - * orientation sensor(4 directions), 1-bit sound - - This is a board game, each player needs to rotate a triangular pyramid - shaped piece the same as the previous player, plus 1. - -***************************************************************************/ - -class plus1_state : public hh_cop400_state -{ -public: - plus1_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void plus1(machine_config &config); - -private: - void write_d(u8 data); - void write_l(u8 data); - u8 read_l(); -}; - -// handlers - -void plus1_state::write_d(u8 data) -{ - // D0?: speaker out - m_speaker->level_w(data & 1); -} - -void plus1_state::write_l(u8 data) -{ - m_l = data; -} - -u8 plus1_state::read_l() -{ - // L: IN.1, mask with output - return m_inputs[1]->read() & m_l; -} - -// config - -static INPUT_PORTS_START( plus1 ) - PORT_START("IN.0") // port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Sensor Position 3") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sensor Position 1") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port L - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Sensor Position 4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sensor Position 2") - PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void plus1_state::plus1(machine_config &config) -{ - // basic machine hardware - COP410(config, m_maincpu, 1000000); // approximation - RC osc. R=51K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(plus1_state::write_d)); - m_maincpu->read_g().set_ioport("IN.0"); - m_maincpu->write_l().set(FUNC(plus1_state::write_l)); - m_maincpu->read_l().set(FUNC(plus1_state::read_l)); - - // no visual feedback! - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( plus1 ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Lightfight - * COP421L MCU label /B119 COP421L-HLA/N - * LED matrix, 1-bit sound - - Xbox-shaped electronic game for 2 or more players, with long diagonal buttons - next to each outer LED. The main object of the game is to pinpoint a light - by pressing 2 buttons. To start, press a skill-level button(P2 button 7/8/9) - after selecting a game mode(P1 button 6-10). - - The game variations are: - 1: LightFight - 2: NightFight - 3: RiteSite - 4: QuiteBrite - 5: RightLight - -***************************************************************************/ - -class lightfgt_state : public hh_cop400_state -{ -public: - lightfgt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void lightfgt(machine_config &config); - -private: - void update_display(); - DECLARE_WRITE_LINE_MEMBER(write_so); - void write_d(u8 data); - void write_l(u8 data); - u8 read_g(); -}; - -// handlers - -void lightfgt_state::update_display() -{ - u8 grid = (m_so | m_d << 1) ^ 0x1f; - m_display->matrix(grid, m_l); -} - -WRITE_LINE_MEMBER(lightfgt_state::write_so) -{ - // SO: led grid 0 (and input mux) - m_so = state; - update_display(); -} - -void lightfgt_state::write_d(u8 data) -{ - // D: led grid 1-4 (and input mux) - m_d = data; - update_display(); -} - -void lightfgt_state::write_l(u8 data) -{ - // L0-L4: led state - // L5-L7: N/C - m_l = data & 0x1f; - update_display(); -} - -u8 lightfgt_state::read_g() -{ - // G: multiplexed inputs - m_inp_mux = m_d << 1 | m_so; - return read_inputs(5, 0xf); -} - -// config - -static INPUT_PORTS_START( lightfgt ) - PORT_START("IN.0") // SO port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) // note: button 1 is on the left side from player perspective - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_COCKTAIL - - PORT_START("IN.1") // D0 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON7 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_COCKTAIL - - PORT_START("IN.2") // D1 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_COCKTAIL - - PORT_START("IN.3") // D2 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_COCKTAIL - - PORT_START("IN.4") // D3 port G - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON10 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_COCKTAIL -INPUT_PORTS_END - -void lightfgt_state::lightfgt(machine_config &config) -{ - // basic machine hardware - COP421(config, m_maincpu, 950000); // approximation - RC osc. R=82K, C=56pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_so().set(FUNC(lightfgt_state::write_so)); - m_maincpu->write_d().set(FUNC(lightfgt_state::write_d)); - m_maincpu->write_l().set(FUNC(lightfgt_state::write_l)); - m_maincpu->write_sk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - m_maincpu->read_g().set(FUNC(lightfgt_state::read_g)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 5); - config.set_default_layout(layout_lightfgt); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( lightfgt ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop421l-hla_n", 0x0000, 0x0400, CRC(aceb2d65) SHA1(2328cbb195faf93c575f3afa3a1fe0079180edd7) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1982 version) - * COP420 MCU label COP420-JWE/N - - see hh_tms1k.cpp bship driver for more information - -***************************************************************************/ - -class bship82_state : public hh_cop400_state -{ -public: - bship82_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void bship82(machine_config &config); - -private: - void write_d(u8 data); - void write_g(u8 data); - u8 read_l(); - u8 read_in(); - DECLARE_WRITE_LINE_MEMBER(write_so); -}; - -// handlers - -void bship82_state::write_d(u8 data) -{ - // D: input mux - m_inp_mux = data; -} - -void bship82_state::write_g(u8 data) -{ - // G0-G2: speaker out via 3.9K, 2.2K, 1.0K resistor - // G3: enable speaker - m_speaker->level_w((data & 8) ? (data & 7) : 0); -} - -u8 bship82_state::read_l() -{ - // L: multiplexed inputs - return read_inputs(4, 0xff); -} - -u8 bship82_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(4, 0xf00) >> 8; -} - -WRITE_LINE_MEMBER(bship82_state::write_so) -{ - // SO: led - m_display->matrix(1, state); -} - -// config - -static INPUT_PORTS_START( bship82 ) - PORT_START("IN.0") // D0 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // D1 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") - - PORT_START("IN.2") // D2 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") // CLE - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 A") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 B") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 C") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 D") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 E") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 F") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 G") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 H") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 I") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 J") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // D3 ports L,IN - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") // CM - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 1") - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 2") - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 3") - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 4") - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 5") - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 6") - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 7") - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 8") - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 9") - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 10") - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("P2 Fire") - - PORT_START("IN.4") // SI - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch -INPUT_PORTS_END - -void bship82_state::bship82(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 750000); // approximation - RC osc. R=14K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(bship82_state::write_d)); - m_maincpu->write_g().set(FUNC(bship82_state::write_g)); - m_maincpu->read_l().set(FUNC(bship82_state::read_l)); - m_maincpu->read_in().set(FUNC(bship82_state::read_in)); - m_maincpu->write_so().set(FUNC(bship82_state::write_so)); - m_maincpu->read_si().set_ioport("IN.4"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship82); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/7.0, 2.0/7.0, 3.0/7.0, 4.0/7.0, 5.0/7.0, 6.0/7.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bship82 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-jwe_n", 0x0000, 0x0400, CRC(5ea8111a) SHA1(34931463b806b48dce4f8ae2361512510bae0ebf) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Racer (COP420 version) - * COP420 MCU label COP420-NPG/N - * 8-digit 7seg led display(1 custom digit), 1 green led, no sound - - This is the COP420 version, they removed support for the link cable. - The first release was on a MM5799 MCU, see hh_cops1.cpp. - -***************************************************************************/ - -class qkracer_state : public hh_cop400_state -{ -public: - qkracer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void qkracer(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); - DECLARE_WRITE_LINE_MEMBER(write_sk); -}; - -// handlers - -void qkracer_state::update_display() -{ - m_display->matrix(~(m_d | m_g << 4 | m_sk << 8), m_l); -} - -void qkracer_state::write_d(u8 data) -{ - // D: select digit, D3: input mux low bit - m_inp_mux = (m_inp_mux & ~1) | (data >> 3 & 1); - m_d = data & 0xf; - update_display(); -} - -void qkracer_state::write_g(u8 data) -{ - // G: select digit, input mux - m_inp_mux = (m_inp_mux & 1) | (data << 1 & 0x1e); - m_g = data & 0xf; - update_display(); -} - -void qkracer_state::write_l(u8 data) -{ - // L0-L6: digit segment data - m_l = data & 0x7f; - update_display(); -} - -u8 qkracer_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(5, 0xf); -} - -WRITE_LINE_MEMBER(qkracer_state::write_sk) -{ - // SK: green led - m_sk = state; - update_display(); -} - -// config - -static INPUT_PORTS_START( qkracer ) - PORT_START("IN.0") // D3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") - - PORT_START("IN.1") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.2") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void qkracer_state::qkracer(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 950000); // approximation - RC osc. R=47K, C=100pF - m_maincpu->set_config(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(qkracer_state::write_d)); - m_maincpu->write_g().set(FUNC(qkracer_state::write_g)); - m_maincpu->write_l().set(FUNC(qkracer_state::write_l)); - m_maincpu->read_in().set(FUNC(qkracer_state::read_in)); - m_maincpu->write_sk().set(FUNC(qkracer_state::write_sk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0xdf, 0x7f); - m_display->set_segmask(0x20, 0x41); // equals sign - config.set_default_layout(layout_qkracer); - - // no sound! -} - -// roms - -ROM_START( qkracer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-npg_n", 0x0000, 0x0400, CRC(17f8e538) SHA1(23d1a1819e6ba552d8da83da2948af1cf5b13d5b) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor Cops Pocket Assistant (CPA) - * COP444 MCU label COP444L-JXY/N - * 8-digit 7seg display, 1-bit sound - - It's a programmable COP400 series MCU simulator, on a COP400 series MCU. - Note that this MCU doesn't have executable RAM, so it truly is a simulator. - The hardware/PCB and the green clamshell are identical to Mattel Dalla$. - -***************************************************************************/ - -// handlers: see mdallas_state - -// config - -static INPUT_PORTS_START( copspa ) - PORT_START("IN.0") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / CLRA") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / LQID") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / COMP") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / CAB") - - PORT_START("IN.1") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / RC") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / SC") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / ASC") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / CBA") - - PORT_START("IN.2") // G2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / SKC") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / SKE") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_NAME("A / JP") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_NAME("B / JSR") - - PORT_START("IN.3") // G3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_NAME("C / LBI") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_NAME("D / SMB") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_NAME("E / RMB") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_NAME("F / SKMB") - - PORT_START("IN.4") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_NAME("Prog") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("SS / AISC") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("Run / STII") - - PORT_START("IN.5") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_NAME("Exec / LD") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_NAME("Reset / X") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_NAME("Modify / XIS") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_NAME("Disp / XDS") -INPUT_PORTS_END - -// roms - -ROM_START( copspa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cop444l-jxy_n", 0x0000, 0x0800, CRC(8e5da5d2) SHA1(d557a5ede206fa0dff7b549acef9e0ef48e48c8a) ) -ROM_END - - - - - -/*************************************************************************** - - SCAT specialist calculators - * COP404LSN-5 MCU (no internal ROM) - * 2KB EPROM (ETC2716Q) - * 8-digit 7seg led display - - SCAT = aka South Carolina(SC) Applied Technology, Inc. - - Known products, assumed to be all on the same hardware: - - The Dimension (aka Feet & Inch Calculator) - - The Solution - - Metalmate - - CKI was measured ~1.469MHz, but D0 was measured ~77.44Hz so that means real - clock speed is a bit higher than CKI measurement, and the clock divider is 32. - -***************************************************************************/ - -class scat_state : public hh_cop400_state -{ -public: - scat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void scat(machine_config &config); - -private: - void main_map(address_map &map); - - void update_display(); - void write_d(u8 data); - void write_g(u8 data); - void write_l(u8 data); - u8 read_in(); -}; - -// handlers - -void scat_state::update_display() -{ - m_display->matrix(~(m_d | m_g << 4), bitswap<8>(m_l,0,1,2,3,4,5,6,7)); -} - -void scat_state::write_d(u8 data) -{ - // D: select digit, input mux (low) - m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf); - m_d = data & 0xf; - update_display(); -} - -void scat_state::write_g(u8 data) -{ - // G: select digit, input mux (high) - m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 0x30); - m_g = data & 0xf; - update_display(); -} - -void scat_state::write_l(u8 data) -{ - // L: digit segment data - m_l = data; - update_display(); -} - -u8 scat_state::read_in() -{ - // IN: multiplexed inputs - return read_inputs(6, 0xf); -} - -void scat_state::main_map(address_map &map) -{ - map(0x0000, 0x07ff).rom(); -} - -// config - -static INPUT_PORTS_START( solution ) - PORT_START("IN.0") // D0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / Enter") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / ppm") - - PORT_START("IN.1") // D1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Atoms / Mole") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Atomic Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / %") - - PORT_START("IN.2") // D2 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Density Wntd.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Orig. Density") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Eq. Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / Normal") - - PORT_START("IN.3") // D3 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Conc. Wntd.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Orig. Conc.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Fmla. Wt.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / Molar") - - PORT_START("IN.4") // G0 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Milli.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Micro.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Gram") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Liter") - - PORT_START("IN.5") // G1 port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Known Vol.") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Known Wt.") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Dil. Wntd.") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") -INPUT_PORTS_END - -void scat_state::scat(machine_config &config) -{ - // basic machine hardware - COP404L(config, m_maincpu, 1500000); // R/C OSC via MM74C14N - m_maincpu->set_config(COP400_CKI_DIVISOR_32, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->set_addrmap(AS_PROGRAM, &scat_state::main_map); - m_maincpu->write_d().set(FUNC(scat_state::write_d)); - m_maincpu->write_g().set(FUNC(scat_state::write_g)); - m_maincpu->write_l().set(FUNC(scat_state::write_l)); - m_maincpu->read_in().set(FUNC(scat_state::read_in)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_scat); - - // no sound! -} - -// roms - -ROM_START( solution ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "etc2716q", 0x0000, 0x0800, CRC(cf990f88) SHA1(6d505fdc94028cbdf6445df9e9451156a9d5f372) ) // no custom label -ROM_END - - - - - -/*************************************************************************** - - Select Merchandise Video Challenger - * COP420 MCU label COP420-TDX/N - * 6-digit 7seg led display, 3 other leds, 4-bit sound - - This is a lightgun with scorekeeping. The "games" themselves were released - on VHS tapes. To determine scoring, the lightgun detects strobe lighting - from objects in the video. - - known releases: - - Japan: Video Challenger, published by Takara - - UK: Video Challenger, published by Bandai - - Canada: Video Challenger, published by Irwin - -***************************************************************************/ - -class vidchal_state : public hh_cop400_state -{ -public: - vidchal_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cop400_state(mconfig, type, tag) - { } - - void vidchal(machine_config &config); - -private: - void update_display(); - void write_d(u8 data); - void write_l(u8 data); - DECLARE_WRITE_LINE_MEMBER(write_sk); -}; - -// handlers - -void vidchal_state::update_display() -{ - m_display->matrix(m_d | m_sk << 6, m_l); -} - -void vidchal_state::write_d(u8 data) -{ - // D: CD4028BE to digit select - m_d = 1 << data & 0x3f; - update_display(); -} - -void vidchal_state::write_l(u8 data) -{ - // L: digit segment data - m_l = bitswap<8>(data,0,3,1,5,4,7,2,6); - update_display(); -} - -WRITE_LINE_MEMBER(vidchal_state::write_sk) -{ - // SK: hit led - m_sk = state; - update_display(); -} - -// config - -static INPUT_PORTS_START( vidchal ) - PORT_START("IN.0") // port IN - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_CODE(KEYCODE_F1) PORT_NAME("Light Sensor") -INPUT_PORTS_END - -void vidchal_state::vidchal(machine_config &config) -{ - // basic machine hardware - COP420(config, m_maincpu, 900000); // approximation - m_maincpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_maincpu->write_d().set(FUNC(vidchal_state::write_d)); - m_maincpu->write_g().set("dac", FUNC(dac_byte_interface::data_w)); - m_maincpu->write_l().set(FUNC(vidchal_state::write_l)); - m_maincpu->read_in().set_ioport("IN.0"); - m_maincpu->write_sk().set(FUNC(vidchal_state::write_sk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6+1, 8); - m_display->set_segmask(0x3f, 0xff); - config.set_default_layout(layout_vidchal); - - // sound hardware - SPEAKER(config, "mono").front_center(); - DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE(config, "dac").add_route(ALL_OUTPUTS, "mono", 0.125); // unknown DAC -} - -// roms - -ROM_START( vidchal ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "cop420-tdx_n", 0x0000, 0x0400, CRC(c9bd041c) SHA1(ab0dcaf4741620fa4c28ab75337a23d646af7626) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ctstein, 0, 0, ctstein, ctstein, ctstein_state, empty_init, "Castle Toy", "Einstein (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, h2hbaskbc, h2hbaskb, 0, h2hbaskbc, h2hbaskbc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (COP420L version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hhockeyc, h2hhockey, 0, h2hhockeyc, h2hhockeyc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (COP420L version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hsoccerc, 0, 0, h2hsoccerc, h2hsoccerc, h2hbaskbc_state, empty_init, "Coleco", "Head to Head: Electronic Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, einvaderc_state, empty_init, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, unkeinv, 0, 0, unkeinv, unkeinv, unkeinv_state, empty_init, "Gordon Barlow Design", "unknown electronic Space Invaders game (patent)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, lchicken, 0, 0, lchicken, lchicken, lchicken_state, empty_init, "LJN", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) - -CONS( 1979, funjacks, 0, 0, funjacks, funjacks, funjacks_state, empty_init, "Mattel Electronics", "Funtronics: Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, funrlgl, 0, 0, funrlgl, funrlgl, funrlgl_state, empty_init, "Mattel Electronics", "Funtronics: Red Light Green Light", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, funtag, 0, 0, funtag, funtag, funtag_state, empty_init, "Mattel Electronics", "Funtronics: Tag", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, mbaskb2, 0, 0, mbaskb2, mbaskb2, mbaskb2_state, empty_init, "Mattel Electronics", "Basketball 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, msoccer2, 0, 0, msoccer2, msoccer2, mbaskb2_state, empty_init, "Mattel Electronics", "Soccer 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, lafootb, 0, 0, lafootb, lafootb, lafootb_state, empty_init, "Mattel Electronics", "Look Alive! Football", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, mdallas, 0, 0, mdallas, mdallas, mdallas_state, empty_init, "Mattel Electronics", "Dalla$ (J.R. handheld)", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1980, plus1, 0, 0, plus1, plus1, plus1_state, empty_init, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_CONTROLS ) // *** -CONS( 1981, lightfgt, 0, 0, lightfgt, lightfgt, lightfgt_state, empty_init, "Milton Bradley", "Electronic Lightfight - The Games of Dueling Lights", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, bship82, bship, 0, bship82, bship82, bship82_state, empty_init, "Milton Bradley", "Electronic Battleship (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1979, qkracer, 0, 0, qkracer, qkracer, qkracer_state, empty_init, "National Semiconductor", "QuizKid Racer (COP420 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1982, copspa, 0, 0, mdallas, copspa, mdallas_state, empty_init, "National Semiconductor", "Cops Pocket Assistant", MACHINE_SUPPORTS_SAVE ) - -COMP( 1984, solution, 0, 0, scat, solution, scat_state, empty_init, "SCAT", "The Solution", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1987, vidchal, 0, 0, vidchal, vidchal, vidchal_state, empty_init, "Select Merchandise", "Video Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction -// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_cops1.cpp b/src/mame/misc_handheld/hh_cops1.cpp deleted file mode 100644 index 62134295653..00000000000 --- a/src/mame/misc_handheld/hh_cops1.cpp +++ /dev/null @@ -1,850 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -National Semiconductor COPS(MM57 MCU series) handhelds - -MCU die label for MM5799 games says MM4799, but they are in fact MM5799. - -ROM source notes when dumped from another publisher, but confident it's the same: -- cambrp: Radio Shack EC-4001 Programmable - -TODO: -- qkracerm link cable (already tested locally and it works, so driver notes - and MCU serial emulation are good enough) - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/cops1/mm5799.h" -#include "machine/ds8874.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "cambrp.lh" -#include "mbaskb.lh" -#include "mhockey.lh" -#include "mhockeya.lh" -#include "msoccer.lh" -#include "qkracerm.lh" -#include "qkspeller.lh" - -//#include "hh_cops1_test.lh" // common test-layout - use external artwork - - -class hh_cops1_state : public driver_device -{ -public: - hh_cops1_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<9> m_inputs; // max 9 - - u16 m_inp_mux = 0; - u16 m_grid = 0; - - // MCU output pin state - u8 m_s = 0; - u8 m_do = 0; - u8 m_f = 0; - int m_blk = false; - - u8 read_inputs(int columns); -}; - - -// machine start/reset - -void hh_cops1_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_s)); - save_item(NAME(m_do)); - save_item(NAME(m_f)); - save_item(NAME(m_blk)); -} - -void hh_cops1_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_cops1_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Mattel Basketball (model 2437) - * PCB label: MA 6017/18/19 - * MM5799 MCU die bonded directly to PCB (die label MM4799 C NCX) - * 4001 and 74154, also bonded to PCB - * 2-digit 7seg led display, 21 leds, 2-bit sound - - Mattel Soccer (model 2678) - * MCU die label MM4799 C NDC - * same hardware as Basketball - - Mattel Hockey (model 2946) - * MCU die label MM4799 C NFR - * same hardware as Basketball - - Judging from videos online, there are two versions of Basketball. One where - the display shows "12" at power-on(as on MAME), and one that shows "15". - - There's also an older version of Hockey, it has the same ROM as Soccer. - This version wasn't sold in the USA. It is commonly known as the Canadian - version, though it was also released in Europe and Japan. - -***************************************************************************/ - -class mbaskb_state : public hh_cops1_state -{ -public: - mbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag) - { } - - void mbaskb(machine_config &config); - void msoccer(machine_config &config); - void mhockey(machine_config &config); - void mhockeya(machine_config &config); - -private: - void update_display(); - void write_do(u8 data); - void write_blk(int state); - void write_s(u8 data); - void write_f(u8 data); - u8 read_f(); -}; - -// handlers - -void mbaskb_state::update_display() -{ - // DO4321: 74154 CBAD - u8 d = (m_do >> 1 & 7) | (m_do << 3 & 8); - u16 sel = m_blk ? (1 << d) : 0; - - // 74154 output 2,6: speaker out - u8 spk = bitswap<2>(sel, 6,2); - m_speaker->level_w(spk); - - // 74154 output 3-5,10-13: digit/led select - u8 dsp = bitswap<7>(sel, 11,4,12,5,13,3,10); - m_display->matrix((m_f << 5 & 0x80) | dsp, m_s); -} - -void mbaskb_state::write_do(u8 data) -{ - // DO: 74154 inputs - m_do = data; - update_display(); -} - -void mbaskb_state::write_blk(int state) -{ - // BLK: 74154 enable - m_blk = state; - update_display(); -} - -void mbaskb_state::write_s(u8 data) -{ - // Sa-Sg: digit segment/led data - m_s = data; - update_display(); -} - -void mbaskb_state::write_f(u8 data) -{ - // F3: led data - m_f = data; - update_display(); -} - -u8 mbaskb_state::read_f() -{ - // F1: difficulty switch - // F2: N/C or tied high - return m_inputs[2]->read() | (m_f & 2); -} - -// config - -static INPUT_PORTS_START( mbaskb ) - PORT_START("IN.0") // port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // INB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // both buttons - - PORT_START("IN.2") // F1 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( mhockeya ) - PORT_INCLUDE( mbaskb ) - - PORT_MODIFY("IN.2") // F2 - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_CUSTOM ) // tied high to select Hockey -INPUT_PORTS_END - -void mbaskb_state::mbaskb(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 370000); // approximation - m_maincpu->write_do().set(FUNC(mbaskb_state::write_do)); - m_maincpu->write_blk().set(FUNC(mbaskb_state::write_blk)); - m_maincpu->write_s().set(FUNC(mbaskb_state::write_s)); - m_maincpu->write_f().set(FUNC(mbaskb_state::write_f)); - m_maincpu->read_f().set(FUNC(mbaskb_state::read_f)); - m_maincpu->read_k().set_ioport("IN.0"); - m_maincpu->read_inb().set_ioport("IN.1"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(3, 0x7f); - m_display->set_bri_levels(0.015, 0.2); // ball led is brighter - config.set_default_layout(layout_mbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void mbaskb_state::msoccer(machine_config &config) -{ - mbaskb(config); - config.set_default_layout(layout_msoccer); - - m_display->set_bri_levels(0.005, 0.05, 0.2); // goalie is darker -} - -void mbaskb_state::mhockey(machine_config &config) -{ - mbaskb(config); - config.set_default_layout(layout_mhockey); -} - -void mbaskb_state::mhockeya(machine_config &config) -{ - msoccer(config); - config.set_default_layout(layout_mhockeya); -} - -// roms - -ROM_START( mbaskb ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ncx", 0x0000, 0x0200, CRC(d0e5fce1) SHA1(04708c043a763bf92d765095e9551388a1d967e8) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( msoccer ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( mhockeya ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndc", 0x0000, 0x0200, CRC(4b5ce604) SHA1(6b3d58f633b4b36f533e9a3b3ca091b2e5ea5018) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - -ROM_START( mhockey ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_nfr", 0x0000, 0x0200, CRC(979e5c5b) SHA1(e6c81572f47d93f4c13472f477aac67e05841976) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Racer (MM5799 version) - * MM5799 MCU die bonded directly to PCB (die label MM4799 C DUZ) - * DS8874 LED driver, die bonded to PCB as well - * 8-digit 7seg led display(1 custom digit), 1 green led, no sound - * optional link cable to compete with another player (see patent US4051605) - - This is the first version of QuizKid Racer, the 2nd release is on a - COP420 MCU, see hh_cop400.cpp. - -***************************************************************************/ - -class qkracerm_state : public hh_cops1_state -{ -public: - qkracerm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void qkracerm(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - u8 read_f(); - u8 read_k(); - int read_si(); -}; - -// handlers - -void qkracerm_state::update_display() -{ - m_display->matrix(m_grid, m_s); -} - -void qkracerm_state::ds8874_output_w(u16 data) -{ - // DS8874 outputs: digit select, input mux - m_grid = ~data; - m_inp_mux = m_grid >> 3; - update_display(); -} - -void qkracerm_state::write_do(u8 data) -{ - // DO1: DS8874 CP - // DO4: DS8874 _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 3)); -} - -void qkracerm_state::write_s(u8 data) -{ - // Sa-Sg: digit segment data - // Sp: link data out - m_s = data; - update_display(); -} - -u8 qkracerm_state::read_f() -{ - // F1: N/C - // F2: link cable detected - // F3: link data in - return m_maincpu->f_output_r() & 1; -} - -u8 qkracerm_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -int qkracerm_state::read_si() -{ - // SI: link master(1)/slave(0) - return 0; -} - -// config - -static INPUT_PORTS_START( qkracerm ) - PORT_START("IN.0") // DS8874 OUT 4 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Amateur") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Pro") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Complex") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Tables") - - PORT_START("IN.1") // DS8874 OUT 5 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.2") // DS8874 OUT 6 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // DS8874 OUT 7 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // DS8874 OUT 8 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Slow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Fast") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void qkracerm_state::qkracerm(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 220000); // approximation - m_maincpu->set_option_ram_d12(true); - m_maincpu->set_option_lb_10(5); - m_maincpu->write_do().set(FUNC(qkracerm_state::write_do)); - m_maincpu->write_s().set(FUNC(qkracerm_state::write_s)); - m_maincpu->read_f().set(FUNC(qkracerm_state::read_f)); - m_maincpu->read_k().set(FUNC(qkracerm_state::read_k)); - m_maincpu->read_si().set(FUNC(qkracerm_state::read_si)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(qkracerm_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0xdf, 0x7f); - m_display->set_segmask(0x20, 0x41); // equals sign - config.set_default_layout(layout_qkracerm); - - // no sound! -} - -// roms - -ROM_START( qkracerm ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_duz", 0x0000, 0x0200, CRC(8b484d2a) SHA1(809e902a11e23bed010ac795ab8dc50e5c1869dc) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_qkracerm_output.pla", 0, 254, CRC(f095fc51) SHA1(e3321d5cc4ecef363df7ef94f47e860c7a6d8c7e) ) -ROM_END - - - - - -/*************************************************************************** - - National Semiconductor QuizKid Speller - * MM5799 MCU die bonded directly to PCB (die label MM4799 C NDF) - * 2-digit 7seg led display, green led, red led, no sound - - The manual included 99 pictures for matching the words, with increased - difficulty. For example 10 = owl, 90 = kangaroo. - - Modes: - - Spell: match numbered picture with word - - Learn: same as Spell, but only the 1st letter - - Game: player 1 enters word, player 2 needs to guess it - -***************************************************************************/ - -class qkspeller_state : public hh_cops1_state -{ -public: - qkspeller_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag) - { } - - void qkspeller(machine_config &config); - -private: - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - void write_f(u8 data); - u8 read_f(); - u8 read_k(); -}; - -// handlers - -void qkspeller_state::update_display() -{ - m_display->matrix((m_f << 1 & 0xc) | (m_do & 3), m_inp_mux); -} - -void qkspeller_state::write_do(u8 data) -{ - // DO1,DO2: digit select - m_do = data; - update_display(); -} - -void qkspeller_state::write_s(u8 data) -{ - // S: digit segment data, input mux - m_inp_mux = data; - update_display(); -} - -void qkspeller_state::write_f(u8 data) -{ - // F2,F3: led data - m_f = data; - update_display(); -} - -u8 qkspeller_state::read_f() -{ - // F1: 3-pos switch (GND, floating, Vcc) - if (m_inputs[8]->read() == 2) - return m_f; - else - return (m_inputs[8]->read() & 1) | (m_f & ~1); -} - -u8 qkspeller_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -static INPUT_PORTS_START( qkspeller ) - PORT_START("IN.0") // Sa port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - - PORT_START("IN.1") // Sb port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - - PORT_START("IN.2") // Sc port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - - PORT_START("IN.3") // Sd port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - - PORT_START("IN.4") // Se port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CHAR(8) PORT_NAME("Erase") - - PORT_START("IN.5") // Sf port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // Sg port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.7") // Sp port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("Start") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Next") - - PORT_START("IN.8") // F1 - PORT_CONFNAME( 0x03, 0x00, "Mode" ) - PORT_CONFSETTING( 0x00, "Spell" ) - PORT_CONFSETTING( 0x02, "Learn" ) - PORT_CONFSETTING( 0x01, "Game" ) - - PORT_START("TEST.0") // INB test pad - PORT_CONFNAME( 0x01, 0x00, "Factory Test 1" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("TEST.1") // DO3 test pad - PORT_CONFNAME( 0x01, 0x00, "Factory Test 2" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) -INPUT_PORTS_END - -void qkspeller_state::qkspeller(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 220000); // approximation - m_maincpu->write_do().set(FUNC(qkspeller_state::write_do)); - m_maincpu->write_s().set(FUNC(qkspeller_state::write_s)); - m_maincpu->write_f().set(FUNC(qkspeller_state::write_f)); - m_maincpu->read_f().set(FUNC(qkspeller_state::read_f)); - m_maincpu->read_k().set(FUNC(qkspeller_state::read_k)); - m_maincpu->read_inb().set_ioport("TEST.0"); - m_maincpu->read_do3().set_ioport("TEST.1"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_qkspeller); - - // no sound! -} - -// roms - -ROM_START( qkspeller ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm4799_c_ndf", 0x0000, 0x0200, CRC(0f497a12) SHA1(78eb79dcc414ed2a955450ffb3be431ecc2edb0c) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_common1_output.pla", 0, 254, CRC(c8d225f1) SHA1(4f1e1977e96e53d1d716b7785c4c3971ed9ff65b) ) -ROM_END - - - - - -/*************************************************************************** - - Sinclair Radionics Cambridge Programmable - * MM5799 MCU (label MM5799NBP/N, die label MM4799 C NBP) - * DS8874 LED driver, 9-digit 7seg led display - - It's a programmable pocket calculator, up to 36 steps. 2 MCU revisions - are known: MM5799EHY and MM5799NBP. - - 4 program libraries were available: - - Vol. 1: General / Finance / Statistics - - Vol. 2: Mathematics - - Vol. 3: Physics & Engineering - - Vol. 4: Electronics - - Paste example: CCSS200SR 2-32+.12131*.5=.5.201=50.200 CSS200C - Now enter a value under 70, followed by RUN, to calculate its factorial. - - known releases: - - World: Cambridge Programmable, published by Sinclair Radionics - - USA: EC-4001 Programmable, published by Tandy Corporation, Radio Shack brand - -***************************************************************************/ - -class cambrp_state : public hh_cops1_state -{ -public: - cambrp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_cops1_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void cambrp(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_do(u8 data); - void write_s(u8 data); - u8 read_f(); - u8 read_k(); -}; - -// handlers - -void cambrp_state::update_display() -{ - m_display->matrix(m_grid, m_s); -} - -void cambrp_state::ds8874_output_w(u16 data) -{ - // DS8874 outputs: digit select, input mux - m_grid = ~data; - m_inp_mux = m_grid >> 2; - update_display(); -} - -void cambrp_state::write_do(u8 data) -{ - // DO1: DS8874 CP - // DO4: DS8874 _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 3)); -} - -void cambrp_state::write_s(u8 data) -{ - // S: digit segment data - // (DS8874 low battery out also connects to Sp) - m_s = data; - update_display(); -} - -u8 cambrp_state::read_f() -{ - // F2: K3, other: N/C - return (~read_inputs(6) >> 1 & 2) | (m_maincpu->f_output_r() & ~2); -} - -u8 cambrp_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( cambrp ) - PORT_START("IN.0") // DS8874 OUT 3 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') PORT_NAME("0 / stop / +/-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_NAME("6 / () / R>D") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR('=') PORT_NAME("= / -") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_NAME("Up/Downshift") - - PORT_START("IN.1") // DS8874 OUT 4 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 / " UTF8_SQUAREROOT "x / go if neg") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_NAME("7 / sin / arcsin") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') PORT_NAME("- / -x / F") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR('C') PORT_NAME("C/CE / step") - - PORT_START("IN.2") // DS8874 OUT 5 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 / sto / go to") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_NAME("8 / cos / arccos") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') PORT_NAME(u8"÷ / 1/x / G") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_NAME("RUN / learn") - - PORT_START("IN.3") // DS8874 OUT 6 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 / ChN/# / D>R") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_NAME("9 / tan / arctan") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') PORT_NAME("+ / 2x / E") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // DS8874 OUT 7 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_NAME("4 / ln x / e" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_NAME("./EE/_ / Downshift / A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') PORT_NAME("× / x" UTF8_POW_2 " / .") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // DS8874 OUT 8 port K - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_NAME("5 / rcl / MEx") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cambrp_state::cambrp(machine_config &config) -{ - // basic machine hardware - MM5799(config, m_maincpu, 200000); // approximation - m_maincpu->set_option_ram_d12(true); - m_maincpu->set_option_lb_10(4); - m_maincpu->write_do().set(FUNC(cambrp_state::write_do)); - m_maincpu->write_s().set(FUNC(cambrp_state::write_s)); - m_maincpu->read_f().set(FUNC(cambrp_state::read_f)); - m_maincpu->read_k().set(FUNC(cambrp_state::read_k)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(cambrp_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_cambrp); - - // no sound! -} - -// roms - -ROM_START( cambrp ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm5799nbp_n", 0x0000, 0x0200, CRC(f4e9063b) SHA1(04b7bf24e994cd453584d233405621f8110feded) ) - ROM_CONTINUE( 0x0400, 0x0400 ) - - ROM_REGION( 254, "maincpu:opla", 0 ) - ROM_LOAD( "mm5799_cambrp_output.pla", 0, 254, CRC(eb882256) SHA1(acd77c066a7b7d18c3ea10f137a45ab83d1c53e1) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1978, mbaskb, 0, 0, mbaskb, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Basketball (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, msoccer, 0, 0, msoccer, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Soccer (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mhockey, 0, 0, mhockey, mbaskb, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, US version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mhockeya, mhockey, 0, mhockeya, mhockeya, mbaskb_state, empty_init, "Mattel Electronics", "Hockey (Mattel, export version)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1977, qkracerm, qkracer, 0, qkracerm, qkracerm, qkracerm_state, empty_init, "National Semiconductor", "QuizKid Racer (MM5799 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NODEVICE_LAN ) -CONS( 1978, qkspeller, 0, 0, qkspeller, qkspeller, qkspeller_state, empty_init, "National Semiconductor", "QuizKid Speller", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** - -COMP( 1977, cambrp, 0, 0, cambrp, cambrp, cambrp_state, empty_init, "Sinclair Radionics", "Cambridge Programmable", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction -// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_hmcs40.cpp b/src/mame/misc_handheld/hh_hmcs40.cpp deleted file mode 100644 index 347d603f2fb..00000000000 --- a/src/mame/misc_handheld/hh_hmcs40.cpp +++ /dev/null @@ -1,5345 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/*************************************************************************** - -Hitachi HMCS40 MCU tabletops/handhelds or other simple devices, -most of them are VFD electronic games/toys. - -known chips: - - serial device etc. ----------------------------------------------------------------- - @A07 HD38750 1979, Bambino Knock-Em Out Boxing (ET-06B) - @A08 HD38750 1979, Bambino Dribble Away Basketball (ET-05) - @A45 HD38750 1981, VTech Invaders - *A56 HD38750 1981, Actronics(Hanzawa) Twinvader (small brown version) - *A58 HD38750 1981, Actronics(Hanzawa) Challenge Racer/Ludotronic(Hanzawa) Grand Prix Turbo - *A62 HD38750 1982, Actronics(Hanzawa) Pack'n Maze - @A67 HD38750 1982, Romtec Pucki & Monsters (ET-803) - - @A04 HD38800 1980, Gakken Heiankyo Alien - A16 HD38800 1981, Entex Select-A-Game cartridge: Basketball 3 -> sag.cpp - *A20 HD38800 1981, Entex Super Space Invader 2 - @A25 HD38800 1981, Coleco Alien Attack - @A27 HD38800 1981, Bandai Packri Monster - @A31 HD38800 1981, Entex Select-A-Game cartridge: Space Invader 2 -> sag.cpp - also used in 2nd version of Super Space Invader 2! - A36 HD38800 1981, Entex Select-A-Game cartridge: Pac-Man 2 -> " - A37 HD38800 1981, Entex Select-A-Game cartridge: Baseball 4 -> " - A38 HD38800 1981, Entex Select-A-Game cartridge: Pinball -> " - *A41 HD38800 1982, Gakken Puck Monster - *A42 HD38800 1981, Akai GX-77 - *A51 HD38800 1981, Actronics(Hanzawa) Twinvader (larger white version) - @A70 HD38800 1982, Coleco Galaxian - @A73 HD38800 1982, Mattel Star Hawk (PT-317B) - @A77 HD38800 1982, Bandai Frisky Tom (PT-327A) - @A88 HD38800 1982, Tomy Tron (THN-02) - @B01 HD38800 1982, Gakken Crazy Kong - @B19 HD38800 1982, Bandai Zaxxon - @B23 HD38800 1982, Tomy Kingman (THF-01II) - @B24 HD38800 1982, Actronics(Hanzawa) Wanted G-Man - @B29 HD38800 1984, Tomy Bombman - *B31 HD38800 1983, Romtec Frog Prince (ET-806) - *B35 HD38800 1983, Bandai Gundam vs Gelgoog Zaku - @B42 HD38800 1983, Bandai Kiteyo Parman - @B43 HD38800 1983, Bandai Dokodemo Dorayaki Doraemon (PT-412) - @B48 HD38800 1983, Bandai Toukon Juohmaru - @B52 HD38800 1983, Bandai Ultraman Monster Battle (PT-424) - - @A09 HD38820 1980, Mattel World Championship Baseball - @A13 HD38820 1981, Entex Galaxian 2 - @A23 HD38820 1981, Entex Pac Man 2 - @A28 HD38820 1981, Coleco Pac-Man (ver 1) - @A29 HD38820 1981, Coleco Pac-Man (ver 2) - @A32 HD38820 1982, Gakken Super Cobra - *A38 HD38820 1982, Entex Crazy Climber - @A42 HD38820 1982, Entex Stargate - @A43 HD38820 1982, Entex Turtles - @A45 HD38820 1982, Coleco Donkey Kong - @A49 HD38820 1983, Bandai Zackman - @L53 HD38820 1983, Gakken Defender - @A61 HD38820 1983, Coleco Ms. Pac-Man - *A62 HD38820 1983, Coleco Zaxxon - @A63 HD38820 1983, Bandai Pengo - @A65 HD38820 1983, Bandai Burger Time (PT-389) - @A69 HD38820 1983, Gakken Dig Dug - @A70 HD38820 1983, Parker Brothers Q*Bert - @A75 HD38820 1983, Bandai Go Go Dynaman - @A85 HD38820 1984, Bandai Machine Man (PT-438) - @A88 HD38820 1984, Bandai Pair Match (PT-460) (1/2) - @A89 HD38820 1984, Bandai Pair Match (PT-460) (2/2) - - A34 HD44801 1981, SciSys Mini Chess -> saitek_minichess.cpp - A50 HD44801 1981, CXG Sensor Computachess -> cxg_scptchess.cpp - A75 HD44801 1982, Alpha 8201 protection MCU -> machine/alpha8201.* - *A85 HD44801 1982, SciSys Travel Sensor / Travel Mate / Chesspartner 5000/6000 - *A92 HD44801 1982, SciSys Play Bridge Computer - B35 HD44801 1983, Alpha 8302 protection MCU (see 8201) - B42 HD44801 1983, Alpha 8303 protection MCU (see 8201) - *B43 HD44801 1983, Alpha 8304 protection MCU (see 8201) - C57 HD44801 1985, Alpha 8505 protection MCU (see 8201) - C89 HD44801 1985, CXG Portachess (1985 version) -> cxg_scptchess.cpp - - *A86 HD44820 1983, Chess King Pocket Micro - *B63 HD44820 1985, CXG Pocket Chess (12 buttons) - - *A13 HD44840 1982, CXG Computachess II - *A14 HD44840 1982, CXG Computachess II / Advanced Portachess - - *B55 HD44860 1987, Saitek Pro Bridge 100 - - *A04 HD44868 1984, SciSys Rapier - *A07 HD44868 1984, Chess King Pocket Micro Deluxe - *A12 HD44868 1985, SciSys MK 10 / Pocket Chess - *A14 HD44868 1985, SciSys Kasparov Plus - - (* means undumped unless noted, @ denotes it's in this driver) - -============================================================================ - -ROM source notes when dumped from another model, but confident it's the same: -- gckong: CGL Super Kong -- ggdman: Bandai Kampf der Monster -- ghalien: CGL Earth Invaders -- kingman: Tandy Kingman -- wantgman: Ludotronic Operation 'Z' -- zackman: Tandy Zackman - -TODO: -- cgalaxn discrete sound (alien attacking sound effect) -- gckong glitchy jump on 1st level (rarely happens), caused by MCU stack overflow. - It can be tested by jumping up repeatedly at the start position under the ladder, - if the glitch happens there, you can jump onto the 2nd floor. -- epacman2 booting the game in demo mode, pacman should take the shortest route to - the upper-left power pill: mcu cycle/interrupt timing related -- kevtris's HMCS40 ROM dumps are incomplete, missing MCU factory test code from - the 2nd half of the ROM, none of the games access it though and it's impossible - to execute unless the chip is in testmode. -- Though very uncommon when compared to games with LED/lamp display, some - games may manipulate VFD plate brightness by strobing it longer/shorter, - eg. cgalaxn when a ship explodes. -- bzaxxon 3D effect is difficult to simulate -- improve/redo SVG for: bzaxxon, bbtime -- add SVG for: ggdman, ktparman, tkjmaru, gdefender, bombman, wantgman, puckimon -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/hmcs40/hmcs40.h" -#include "cpu/cop400/cop400.h" -#include "video/pwm.h" -#include "machine/gen_latch.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork (complete) -#include "pairmtch.lh" - -// internal artwork (bezel overlay) -#include "bambball.lh" -#include "gckong.lh" -#include "mwcbaseb.lh" -#include "msthawk.lh" -#include "packmon.lh" - -#include "hh_hmcs40_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_hmcs40_state : public driver_device -{ -public: - hh_hmcs40_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<7> m_inputs; // max 7 - - // misc common - u8 m_r[8] = { }; // MCU R ports write data (optional) - u16 m_d = 0; // MCU D port write data (optional) - u8 m_int[2] = { }; // MCU INT0/1 pins state - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u64 m_plate = 0; // VFD current column data - - u16 read_inputs(int columns); - void refresh_interrupts(void); - void set_interrupt(int line, int state); -}; - - -// machine start/reset - -void hh_hmcs40_state::machine_start() -{ - // register for savestates - save_item(NAME(m_r)); - save_item(NAME(m_int)); - save_item(NAME(m_d)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_hmcs40_state::machine_reset() -{ - refresh_interrupts(); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_hmcs40_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - -// interrupt handling - -void hh_hmcs40_state::refresh_interrupts() -{ - for (int i = 0; i < 2; i++) - m_maincpu->set_input_line(i, m_int[i] ? ASSERT_LINE : CLEAR_LINE); -} - -void hh_hmcs40_state::set_interrupt(int line, int state) -{ - line = line ? 1 : 0; - state = state ? 1 : 0; - - if (state != m_int[line]) - { - if (machine().phase() >= machine_phase::RESET) - m_maincpu->set_input_line(line, state ? ASSERT_LINE : CLEAR_LINE); - m_int[line] = state; - } -} - -INPUT_CHANGED_MEMBER(hh_hmcs40_state::single_interrupt_line) -{ - set_interrupt((int)param, newval); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Actronics / Hanzawa Wanted G-Man - * Hitachi HD38800B24 MCU - * cyan/red VFD display - - known releases: - - World: Wanted G-Man, published by Actronics - - France: Operation 'Z', published by Ludotronic - -***************************************************************************/ - -class wantgman_state : public hh_hmcs40_state -{ -public: - wantgman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void wantgman(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void wantgman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void wantgman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void wantgman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D6: input mux - m_inp_mux = data >> 1 & 0x3f; - - // D1-D9,D13,D14: vfd grid - m_grid = (data >> 1 & 0x1ff) | (data >> 4 & 0x600); - update_display(); -} - -u16 wantgman_state::input_r() -{ - // D15: multiplexed inputs - return read_inputs(6) & 0x8000; -} - -// config - -static INPUT_PORTS_START( wantgman ) - PORT_START("IN.0") // D1 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D2 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // D3 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.3") // D4 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.4") // D5 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Skill / Start / Jump") - - PORT_START("IN.5") // D6 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Demo") -INPUT_PORTS_END - -void wantgman_state::wantgman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(wantgman_state::plate_w)); - m_maincpu->write_d().set(FUNC(wantgman_state::grid_w)); - m_maincpu->read_d().set(FUNC(wantgman_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 16); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( wantgman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b24", 0x0000, 0x1000, CRC(ad1dfb26) SHA1(f2ef0ec98116a8a38e97299e3e3b2b0129d78c04) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "wantgman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Dribble Away Basketball (manufactured in Japan) - * PCB label Emix Corp. ET-05 - * Hitachi HD38750A08 MCU - * cyan VFD display Emix-106, with bezel overlay - -***************************************************************************/ - -class bambball_state : public hh_hmcs40_state -{ -public: - bambball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bambball(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void bambball_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x(,D0-D3): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 plate = bitswap<16>(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2); - m_display->matrix(m_grid, plate); -} - -void bambball_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D10: input mux - m_inp_mux = data >> 7 & 0xf; - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D3: more plates (update display there) - plate_w(3 + 1, data & 0xf); -} - -u8 bambball_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( bambball ) - PORT_START("IN.0") // D7 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dribble Low") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Dribble Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Dribble High") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("Shoot") - - PORT_START("IN.1") // D8 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // D9 port R0x - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Display") - - PORT_START("IN.3") // D10 port R0x - PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void bambball_state::bambball(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(bambball_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bambball_state::plate_w)); - m_maincpu->write_d().set(FUNC(bambball_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 478); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - config.set_default_layout(layout_bambball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bambball ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a08", 0x0000, 0x0800, CRC(907fef18) SHA1(73fe7ca7c6332268a3a9abc5ac88ada2991012fb) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 281988, "screen", 0) - ROM_LOAD( "bambball.svg", 0, 281988, CRC(63019194) SHA1(cbfb5b051d8f57f6b4d698796030850b3631ed56) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Knock-Em Out Boxing - * PCB label Emix Corp. ET-06B - * Hitachi HD38750A07 MCU - * cyan VFD display Emix-103, with blue or green color overlay - -***************************************************************************/ - -class bmboxing_state : public hh_hmcs40_state -{ -public: - bmboxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bmboxing(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void bmboxing_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u32 plate = bitswap<16>(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8); - m_display->matrix(grid, plate); -} - -void bmboxing_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x: vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmboxing_state::grid_w(u16 data) -{ - // D13: speaker out - m_speaker->level_w(data >> 13 & 1); - - // D9-D12: input mux - m_inp_mux = data >> 9 & 0xf; - - // D4-D12: vfd grid - m_grid = data >> 4 & 0x1ff; - update_display(); -} - -u8 bmboxing_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - * left = P2 side * * right = P1 side * - - [ BACK ] [ HIGH ] (players sw) [ HIGH ] [ BACK ] - 1<--->2 [START/ - [NORMAL] [MEDIUM] RESET] [MEDIUM] [NORMAL] - 1<---OFF--->2 - [ DUCK ] [ LOW ] (skill lvl sw) [ LOW ] [ DUCK ] -*/ - -static INPUT_PORTS_START( bmboxing ) - PORT_START("IN.0") // D9 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Punch High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Punch Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P1 Punch Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D10 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Position Normal") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Position Back") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P1 Position Ducking") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // D11 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Punch High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Punch Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P2 Punch Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D12 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Position Normal") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Position Back") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P2 Position Ducking") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // port D - PORT_CONFNAME( 0x0001, 0x0000, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0001, "2" ) - PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0002, "2" ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0xfff8, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bmboxing_state::bmboxing(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(bmboxing_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bmboxing_state::plate_w)); - m_maincpu->write_d().set(FUNC(bmboxing_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.4"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 529); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmboxing ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a07", 0x0000, 0x0800, CRC(7f33e259) SHA1(c5fcdd6bf060c96666354f09f0570c754f6ed4e0) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 257144, "screen", 0) - ROM_LOAD( "bmboxing.svg", 0, 257144, CRC(dab81477) SHA1(28b0c844a311e2023ffa71d754e799059b7d050f) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Frisky Tom (manufactured in Japan) - * PCB label Kaken Corp., PT-327A - * Hitachi HD38800A77 MCU - * cyan/red/green VFD display Futaba DM-43ZK 2E - -***************************************************************************/ - -class bfriskyt_state : public hh_hmcs40_state -{ -public: - bfriskyt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bfriskyt(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bfriskyt_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21); - m_display->matrix(grid, plate); -} - -void bfriskyt_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bfriskyt_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D5: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x3f0000); - update_display(); -} - -void bfriskyt_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bfriskyt ) - PORT_START("IN.0") // D11 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bfriskyt_state, input_changed, 0) - - PORT_START("IN.5") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void bfriskyt_state::bfriskyt(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bfriskyt_state::plate_w)); - m_maincpu->write_d().set(FUNC(bfriskyt_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 675); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 22); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bfriskyt ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a77", 0x0000, 0x1000, CRC(a2445c4f) SHA1(0aaccfec90b66d27dae194d4462d88e654c41578) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 413577, "screen", 0) - ROM_LOAD( "bfriskyt.svg", 0, 413577, CRC(17090264) SHA1(4512a8a91a459f2ddc258641c6d38c2f48f4160f) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Packri Monster (manufactured in Japan) - * PCB label DM-21ZA2 - * Hitachi HD38800A27 MCU - * cyan/red/green VFD display Futaba DM-21ZK 2B, with bezel overlay - - known releases: - - Japan: FL Packri Monster, published by Bandai - - USA(World?): Packri Monster, published by Bandai - - USA/Canada: Hungry Monster, published by Tandy - - other: Gobble Man/Ogre Monster, published by Tandy - -***************************************************************************/ - -class packmon_state : public hh_hmcs40_state -{ -public: - packmon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void packmon(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void packmon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - u32 plate = bitswap<24>(m_plate,23,22,21,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7); - m_display->matrix(grid, plate); -} - -void packmon_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D11-D15: input mux - m_inp_mux = data >> 11 & 0x1f; - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3: plate 9-12 (update display there) - plate_w(4, data & 0xf); -} - -u16 packmon_state::input_r() -{ - // D5: multiplexed inputs - return read_inputs(5) & 0x20; -} - -// config - -static INPUT_PORTS_START( packmon ) - PORT_START("IN.0") // D11 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START ) - - PORT_START("IN.1") // D12 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D13 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // D14 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.4") // D15 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) -INPUT_PORTS_END - -void packmon_state::packmon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(packmon_state::plate_w)); - m_maincpu->write_d().set(FUNC(packmon_state::grid_w)); - m_maincpu->read_d().set(FUNC(packmon_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 680); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - config.set_default_layout(layout_packmon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( packmon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a27", 0x0000, 0x1000, CRC(86e09e84) SHA1(ac7d3c43667d5720ca513f8ff51d146d9f2af124) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 224386, "screen", 0) - ROM_LOAD( "packmon.svg", 0, 224386, CRC(b2ee5b6b) SHA1(e53b4d5a4118cc5fbec4656580c2aab76af8f8d7) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Zaxxon (manufactured in Japan, licensed from Sega) - * PCB label FL Zaxxon - * Hitachi HD38800B19 MCU - * cyan/red/blue VFD display NEC FIP11BM24T no. 4-8, half of it reflected - with a one-way mirror to give the illusion of a 3D display - -***************************************************************************/ - -class bzaxxon_state : public hh_hmcs40_state -{ -public: - bzaxxon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bzaxxon(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bzaxxon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0); - u32 plate = bitswap<24>(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800; - m_display->matrix(grid, plate); -} - -void bzaxxon_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D10: input mux - u8 inp_mux = data >> 7 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0-D2: plate 7-9 (update display there) - plate_w(4, data & 7); -} - -void bzaxxon_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( bzaxxon ) - PORT_START("IN.0") // D7 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.1") // D8 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.2") // D9 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.3") // D10 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bzaxxon_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.5") // port D - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0xfff7, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bzaxxon_state::bzaxxon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 450000); // approximation - m_maincpu->write_r<0>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bzaxxon_state::plate_w)); - m_maincpu->write_d().set(FUNC(bzaxxon_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(613, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bzaxxon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b19", 0x0000, 0x1000, CRC(4fecb80d) SHA1(7adf079480ffd3825ad5ae1eaa4d892eecbcc42d) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 521080, "screen", 0) - ROM_LOAD( "bzaxxon.svg", 0, 521080, BAD_DUMP CRC(f4fbb2de) SHA1(83db400e67d91ae4bfee3e8568ae9df94ebede19) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Zackman "The Pit, FL Exploration of Space" (manufactured in Japan) - * Hitachi QFP HD38820A49 MCU - * cyan/red/yellow VFD display Futaba DM-53Z 3E, with color overlay - - known releases: - - World: Zackman, published by Bandai - - USA: Zackman, published by Tandy - -***************************************************************************/ - -class zackman_state : public hh_hmcs40_state -{ -public: - zackman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void zackman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void zackman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D0,D1): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<32>(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12); - m_display->matrix(grid, plate); -} - -void zackman_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D11-D14: input mux - u8 inp_mux = data >> 11 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0,D1: plate 12,13 (update display there) - plate_w(7, data & 3); -} - -void zackman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( zackman ) - PORT_START("IN.0") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, zackman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void zackman_state::zackman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(zackman_state::plate_w)); - m_maincpu->write_d().set(FUNC(zackman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(487, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( zackman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a49", 0x0000, 0x1000, CRC(b97f5ef6) SHA1(7fe20e8107361caf9ea657e504be1f8b10b8b03f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 910689, "screen", 0) - ROM_LOAD( "zackman.svg", 0, 910689, CRC(5f322820) SHA1(4210aff160e5de9a409aba8b915aaebff2a92647) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Pengo (manufactured in Japan, licensed from Sega) - * PCB label FL Pengo(in katakana) - * Hitachi QFP HD38820A63 MCU - * cyan/red/blue VFD display Futaba DM-68ZK 3D DM-63 - -***************************************************************************/ - -class bpengo_state : public hh_hmcs40_state -{ -public: - bpengo_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bpengo(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bpengo_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<32>(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bpengo_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bpengo_state::grid_w(u16 data) -{ - // D10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D0-D7: vfd grid - m_grid = data & 0xff; - update_display(); -} - -void bpengo_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( bpengo ) - PORT_START("IN.0") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bpengo_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) - - PORT_START("IN.5") // port D - PORT_CONFNAME( 0x0800, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0800, DEF_STR( On ) ) - PORT_BIT( 0xf7ff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bpengo_state::bpengo(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(bpengo_state::plate_w)); - m_maincpu->write_d().set(FUNC(bpengo_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 759); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 25); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bpengo ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a63", 0x0000, 0x1000, CRC(ebd6bc64) SHA1(0a322c47b9553a2739a85908ce64b9650cf93d49) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 565069, "screen", 0) - ROM_LOAD( "bpengo.svg", 0, 565069, CRC(fb25ffeb) SHA1(fb4db5120f1e35e39c7fb2da4af3aa63417efaf1) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Burger Time (manufactured in Japan, licensed from Data East) - * PCB label Kaken Corp. PT-389 Burger Time - * Hitachi QFP HD38820A65 MCU - * cyan/red/green VFD display NEC FIP6AM25T no. 21-21 - -***************************************************************************/ - -class bbtime_state : public hh_hmcs40_state -{ -public: - bbtime_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bbtime(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bbtime_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); - u32 plate = bitswap<32>(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1; - m_display->matrix(grid, plate); -} - -void bbtime_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bbtime_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(data >> 3 & 1); - - // D10-D14: input mux - u8 inp_mux = data >> 10 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D4-D9: vfd grid - m_grid = data >> 4 & 0x3f; - update_display(); -} - -void bbtime_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bbtime ) - PORT_START("IN.0") // D10 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.1") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.2") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bbtime_state, input_changed, 0) - - PORT_START("IN.5") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void bbtime_state::bbtime(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(bbtime_state::plate_w)); - m_maincpu->write_d().set(FUNC(bbtime_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(379, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6, 28); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bbtime ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a65", 0x0000, 0x1000, CRC(33611faf) SHA1(29b6a30ed543688d31ec2aa18f7938fa4eef30b0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 461605, "screen", 0) - ROM_LOAD( "bbtime.svg", 0, 461605, BAD_DUMP CRC(5b335271) SHA1(46c45b711358e8397ae707668aecead9e341ab8a) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Kiteyo Parman - * Hitachi HD38800B42 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class ktparman_state : public hh_hmcs40_state -{ -public: - ktparman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ktparman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void ktparman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void ktparman_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(data >> 3 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D2: vfd plate (update display there) - plate_w(4, data & 7); -} - -// config - -static INPUT_PORTS_START( ktparman ) - PORT_START("IN.0") // port D - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void ktparman_state::ktparman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ktparman_state::plate_w)); - m_maincpu->write_d().set(FUNC(ktparman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 19); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ktparman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b42", 0x0000, 0x1000, CRC(ba1f7939) SHA1(1038d33923fcc87b5dd95954d5f964064a10ff9d) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "ktparman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Dokodemo Dorayaki Doraemon (FL LSI Game Push Up) (manufactured in Japan) - * PCB label Kaken Corp PT-412 FL-Doreamon(in katakana) - * Hitachi HD38800B43 MCU - * cyan/red/blue VFD display Futaba DM-71 - -***************************************************************************/ - -class bdoramon_state : public hh_hmcs40_state -{ -public: - bdoramon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bdoramon(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bdoramon_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,7,6); - u32 plate = bitswap<24>(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bdoramon_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D3: plate 15-18 (update display there) - plate_w(4, data & 0xf); -} - -// config - -static INPUT_PORTS_START( bdoramon ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) - - PORT_START("IN.2") // port D - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // port R2x - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void bdoramon_state::bdoramon(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->read_r<2>().set_ioport("IN.3"); - m_maincpu->write_r<3>().set(FUNC(bdoramon_state::plate_w)); - m_maincpu->write_d().set(FUNC(bdoramon_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.2"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 668); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bdoramon ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b43", 0x0000, 0x1000, CRC(9387ca42) SHA1(8937e208934b34bd9f49700aa50287dfc8bda76c) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 624751, "screen", 0) - ROM_LOAD( "bdoramon.svg", 0, 624751, CRC(5dc4017c) SHA1(2091765de401969651b8eb22067572be72d12398) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Toukon Juohmaru - * Hitachi HD38800B48 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class tkjmaru_state : public hh_hmcs40_state -{ -public: - tkjmaru_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void tkjmaru(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void tkjmaru_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void tkjmaru_state::grid_w(u16 data) -{ - // D4-D7: input mux - m_inp_mux = data >> 4 & 0xf; - - // D10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // D11-D15: vfd grid - m_grid = data >> 11 & 0x1f; - - // D0: vfd plate (update display there) - plate_w(4, data & 1); -} - -u16 tkjmaru_state::input_r() -{ - // D3: multiplexed inputs, D8,D9: fixed inputs - return read_inputs(4) | m_inputs[4]->read(); -} - -// config - -static INPUT_PORTS_START( tkjmaru ) - PORT_START("IN.0") // D4 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D5 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // D6 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.3") // D7 line D3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.4") // D8,D9 - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x200, 0x000, "Factory Test" ) - PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x200, DEF_STR( On ) ) -INPUT_PORTS_END - -void tkjmaru_state::tkjmaru(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(tkjmaru_state::plate_w)); - m_maincpu->write_d().set(FUNC(tkjmaru_state::grid_w)); - m_maincpu->read_d().set(FUNC(tkjmaru_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 17); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tkjmaru ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b48", 0x0000, 0x1000, CRC(249f357d) SHA1(0b5dad187a035db622790eb092b7be1ca7c57d97) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "tkjmaru.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Ultraman Monster Battle (FL LSI Game Push Up) (manufactured in Japan) - * PCB label Kaken Corp. PT-424 FL Ultra Man - * Hitachi HD38800B52 MCU - * cyan/red/blue VFD display NEC FIP8BM25T no. 21-8 2 - -***************************************************************************/ - -class bultrman_state : public hh_hmcs40_state -{ -public: - bultrman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bultrman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bultrman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D2): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2); - m_display->matrix(grid, plate); -} - -void bultrman_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D2: plate 15-17 (update display there) - plate_w(4, data & 7); -} - -// config - -static INPUT_PORTS_START( bultrman ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_CONFNAME( 0x0010, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0010, DEF_STR( On ) ) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0xff8f, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bultrman_state::bultrman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 350000); // approximation - m_maincpu->write_r<0>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bultrman_state::plate_w)); - m_maincpu->write_d().set(FUNC(bultrman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 673); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bultrman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b52", 0x0000, 0x1000, CRC(88d372dc) SHA1(f2ac3b89be8afe6fb65914ccebe1a56316b9472a) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 405717, "screen", 0) - ROM_LOAD( "bultrman.svg", 0, 405717, CRC(13367971) SHA1(f294898712d1e146ff267bb1e3cfd059f972b248) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Go Go Dynaman - * Hitachi HD38820A75 MCU - * cyan/red/blue VFD display - - known releases: - - Japan: Go Go Dynaman, published by Bandai - - Germany: Kampf der Monster, published by Bandai - -***************************************************************************/ - -class ggdman_state : public hh_hmcs40_state -{ -public: - ggdman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ggdman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void ggdman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ggdman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R5x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ggdman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D6-D9: input mux - u8 inp_mux = data >> 6 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D11-D15: vfd grid - m_grid = data >> 11 & 0x1f; - update_display(); -} - -void ggdman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( ggdman ) - PORT_START("IN.0") // D6 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.1") // D7 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.2") // D8 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.3") // D9 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, ggdman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void ggdman_state::ggdman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(ggdman_state::plate_w)); - m_maincpu->write_d().set(FUNC(ggdman_state::grid_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 24); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ggdman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a75", 0x0000, 0x1000, CRC(14a9c064) SHA1(253a5decbf4219c1b457280e301b82388694e49f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "ggdman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Machine Man (FL Flat Type) (manufactured in Japan) - * PCB label Kaken PT-438 - * Hitachi QFP HD38820A85 MCU - * cyan/red/green VFD display NEC FIP5CM33T no. 4 21 - -***************************************************************************/ - -class machiman_state : public hh_hmcs40_state -{ -public: - machiman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void machiman(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void machiman_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18); - m_display->matrix(m_grid, plate); -} - -void machiman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x,R6012: vfd plate - int shift = (offset == 6) ? 16 : offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void machiman_state::grid_w(u16 data) -{ - // D13: speaker out - m_speaker->level_w(data >> 13 & 1); - - // D0-D4: vfd grid - m_grid = data & 0x1f; - update_display(); -} - -// config - -static INPUT_PORTS_START( machiman ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_BIT( 0x3fff, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY -INPUT_PORTS_END - -void machiman_state::machiman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(machiman_state::plate_w)); - m_maincpu->write_d().set(FUNC(machiman_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1534, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(5, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( machiman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a85", 0x0000, 0x1000, CRC(894b4954) SHA1(cab49638a326b031aa548301beb16f818759ef62) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 374097, "screen", 0) - ROM_LOAD( "machiman.svg", 0, 374097, CRC(78af02ac) SHA1(1b4bbea3e46e1bf33149727d9725bc9b18652b9c) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Pair Match (manufactured in Japan) - * PCB label Kaken Corp. PT-460 - * Hitachi QFP HD38820A88 MCU(main), HD38820A89(audio) - * cyan/red VFD display - - This is a memory game, the difference is instead of pictures, the player - needs to match sound effects. It has an extra MCU for sound. The case is - shaped like a glossy black pyramid. Star Trek fans will recognize it as - a prop used in TNG Ten Forward. - -***************************************************************************/ - -class pairmtch_state : public hh_hmcs40_state -{ -public: - pairmtch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_audiocpu(*this, "audiocpu"), - m_soundlatch(*this, "soundlatch%u", 0) - { } - - void pairmtch(machine_config &config); - -private: - required_device m_audiocpu; - required_device_array m_soundlatch; - - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); - - void sound_w(u8 data); - void sound2_w(u8 data); - void speaker_w(u16 data); -}; - -// handlers: maincpu side - -void pairmtch_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void pairmtch_state::plate_w(offs_t offset, u8 data) -{ - // R2x,R3x,R6x: vfd plate - int shift = (offset == 6) ? 8 : (offset-2) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void pairmtch_state::grid_w(u16 data) -{ - // D7: sound reset (to audiocpu reset line) - m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x80) ? ASSERT_LINE : CLEAR_LINE); - - // D9: sound start (to audiocpu INT0) - m_audiocpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); - - // D10,D15: input mux - m_inp_mux = (data >> 10 & 1) | (data >> 14 & 2); - - // D0-D5: vfd grid - m_grid = data & 0x3f; - update_display(); -} - -u8 pairmtch_state::input_r() -{ - // R4x: multiplexed inputs - return read_inputs(2); -} - -void pairmtch_state::sound_w(u8 data) -{ - // R5x: soundlatch (to audiocpu R2x) - m_soundlatch[0]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); -} - -// handlers: audiocpu side - -void pairmtch_state::sound2_w(u8 data) -{ - // R2x: soundlatch (to maincpu R5x) - m_soundlatch[1]->write(bitswap<8>(data,7,6,5,4,0,1,2,3)); -} - -void pairmtch_state::speaker_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1: sound ack (to maincpu INT0) - m_maincpu->set_input_line(0, (data & 2) ? ASSERT_LINE : CLEAR_LINE); -} - -// config - -static INPUT_PORTS_START( pairmtch ) - PORT_START("IN.0") // D10 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.1") // D15 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // port D - PORT_CONFNAME( 0x0040, 0x0000, "Factory Test" ) - PORT_CONFSETTING( 0x0000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x0040, DEF_STR( On ) ) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_CONFNAME( 0x0800, 0x0800, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x0800, "1" ) - PORT_CONFSETTING( 0x0000, "2" ) - PORT_CONFNAME( 0x3000, 0x2000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x2000, "1" ) - PORT_CONFSETTING( 0x1000, "2" ) - PORT_CONFSETTING( 0x0000, "3" ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x86bf, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pairmtch_state::pairmtch(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<2>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->read_r<4>().set(FUNC(pairmtch_state::input_r)); - m_maincpu->write_r<5>().set(FUNC(pairmtch_state::sound_w)); - m_maincpu->read_r<5>().set(m_soundlatch[1], FUNC(generic_latch_8_device::read)); - m_maincpu->write_r<6>().set(FUNC(pairmtch_state::plate_w)); - m_maincpu->write_d().set(FUNC(pairmtch_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.2"); - - HD38820(config, m_audiocpu, 400000); // approximation - m_audiocpu->write_r<2>().set(FUNC(pairmtch_state::sound2_w)); - m_audiocpu->read_r<2>().set(m_soundlatch[0], FUNC(generic_latch_8_device::read)); - m_audiocpu->write_d().set(FUNC(pairmtch_state::speaker_w)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 12); - config.set_default_layout(layout_pairmtch); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); - - GENERIC_LATCH_8(config, m_soundlatch[0]); - GENERIC_LATCH_8(config, m_soundlatch[1]); -} - -// roms - -ROM_START( pairmtch ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a88", 0x0000, 0x1000, CRC(ffa35730) SHA1(5a80b9025aaad2ac0ab0b1436a1355ae8cd3f868) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x2000, "audiocpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a89", 0x0000, 0x1000, CRC(3533ec56) SHA1(556d69e78a0ee1bf766fce16ed58992d7272d57f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Alien Attack (manufactured in Taiwan) - * Hitachi HD38800A25 MCU - * cyan/red VFD display Futaba DM-19Z 1J - - It looks like Coleco took Gakken's Heiankyo Alien and turned it into a more - action-oriented game. - -***************************************************************************/ - -class alnattck_state : public hh_hmcs40_state -{ -public: - alnattck_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void alnattck(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void alnattck_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15); - m_display->matrix(m_grid, plate); -} - -void alnattck_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D7-D13: input mux - m_inp_mux = data >> 7 & 0x7f; - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3: plate 16-19 (update display there) - plate_w(4, data & 0xf); -} - -u16 alnattck_state::input_r() -{ - // D5: multiplexed inputs - return read_inputs(7) & 0x20; -} - -// config - -static INPUT_PORTS_START( alnattck ) - PORT_START("IN.0") // D7 line D5 - PORT_CONFNAME( 0x20, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x20, "2" ) - - PORT_START("IN.1") // D8 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D9 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // D10 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.4") // D11 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.5") // D12 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Move") - - PORT_START("IN.6") // D13 line D5 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Fire") -INPUT_PORTS_END - -void alnattck_state::alnattck(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(alnattck_state::plate_w)); - m_maincpu->write_d().set(FUNC(alnattck_state::grid_w)); - m_maincpu->read_d().set(FUNC(alnattck_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 700); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alnattck ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a25", 0x0000, 0x1000, CRC(18b50869) SHA1(11e9d5f7b4ae818b077b0ee14a3b43190e20bff3) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 564271, "screen", 0) - ROM_LOAD( "alnattck.svg", 0, 564271, CRC(5466d1d4) SHA1(3295272015969e58fddc53272769e1fc1bd4b355) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Donkey Kong (manufactured in Taiwan, licensed from Nintendo) - * PCB label Coleco Rev C 75790 DK - * Hitachi QFP HD38820A45 MCU - * RC circuit for speaker volume decay - * cyan/red VFD display Futaba DM-47ZK 2K, with color overlay - -***************************************************************************/ - -class cdkong_state : public hh_hmcs40_state -{ -public: - cdkong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void cdkong(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void cdkong_state::machine_start() -{ - hh_hmcs40_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void cdkong_state::speaker_update() -{ - if (m_r[1] & 8) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.02; -} - -void cdkong_state::update_display() -{ - u32 plate = bitswap<32>(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800; - m_display->matrix(m_grid, plate); -} - -void cdkong_state::plate_w(offs_t offset, u8 data) -{ - // R13: speaker on - m_r[offset] = data; - speaker_update(); - - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void cdkong_state::grid_w(u16 data) -{ - // D3: speaker out - m_speaker->level_w(BIT(data, 3)); - - // D4-D14: vfd grid - m_grid = data >> 4 & 0x7ff; - update_display(); -} - -// config - -static INPUT_PORTS_START( cdkong ) - PORT_START("IN.0") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.1") // port D - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x7ff8, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cdkong_state::cdkong(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cdkong_state::plate_w)); - m_maincpu->write_d().set(FUNC(cdkong_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(605, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(cdkong_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( cdkong ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a45", 0x0000, 0x1000, CRC(196b8070) SHA1(da85d1eb4b048b77f3168630662ab94ec9baa262) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359199, "screen", 0) - ROM_LOAD( "cdkong.svg", 0, 359199, CRC(ba159fd5) SHA1(3188e2ed3234f39ac9ee93a485a7e73314bc3457) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Galaxian (manufactured in Taiwan) - * PCB label Coleco Rev A 75718 - * Hitachi HD38800A70 MCU - * discrete sound (when alien attacks) - * cyan/red VFD display Futaba DM-36Z 2H, with color overlay - - Select game mode on start: - - P1 Left: Galaxian (default game) - - P1 Right: Midway's Attackers - - P2 Left: Head-to-Head Galaxian (2-player mode, short) - - P2 Right: Head-to-Head Galaxian (2-player mode, long) - -***************************************************************************/ - -class cgalaxn_state : public hh_hmcs40_state -{ -public: - cgalaxn_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cgalaxn(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(player_switch); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cgalaxn_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3); - u16 plate = bitswap<16>(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13); - m_display->matrix(grid, plate); -} - -INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch) -{ - // 2-player switch directly enables plate 14 - m_plate = (m_plate & 0x3fff) | (newval ? 0 : 0x4000); - update_display(); -} - -void cgalaxn_state::grid_w(offs_t offset, u8 data) -{ - // R10,R11: input mux - if (offset == 1) - m_inp_mux = data & 3; - - // R1x-R3x: vfd grid - int shift = (offset - 1) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void cgalaxn_state::plate_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1: start alien attack whine sound effect (edge triggered) - - // D2-D15: vfd plate - m_plate = (m_plate & 0x4000) | (data >> 2 & 0x3fff); - update_display(); -} - -u8 cgalaxn_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( cgalaxn ) - PORT_START("IN.0") // R10 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // R11 port R0x - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, cgalaxn_state, player_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.3") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void cgalaxn_state::cgalaxn(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cgalaxn_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_r<2>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_r<3>().set(FUNC(cgalaxn_state::grid_w)); - m_maincpu->write_d().set(FUNC(cgalaxn_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(526, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 15); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cgalaxn ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a70", 0x0000, 0x1000, CRC(a4c5ed1d) SHA1(0f647cb78437d7e62411febf7c9ce3c5b6753a80) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 712204, "screen", 0) - ROM_LOAD( "cgalaxn.svg", 0, 712204, CRC(67ec57bf) SHA1(195c9867b321da9768ce287d1060ceae50345dd4) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Pac-Man (manufactured in Taiwan, licensed from Midway) - * PCB label Coleco 75690 - * Hitachi QFP HD38820A28/29 MCU - * cyan/red VFD display Futaba DM-34Z 2A, with color overlay - - known releases: - - USA: Pac-Man, by Coleco (name-license from Midway) - - Japan: Super Puck Monster, published by Gakken - - Select game mode on start: - - P1 Right: Pac-Man (default game) - - P1 Left: Head-to-Head Pac-Man (2-player mode) - - P1 Up: Eat & Run - - P1 Down: Demo - - BTANB: 1st version doesn't show the whole maze on power-on - -***************************************************************************/ - -class cpacman_state : public hh_hmcs40_state -{ -public: - cpacman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cpacman(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cpacman_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x(,D1,D2): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); - u32 plate = bitswap<32>(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7); - m_display->matrix(grid, plate); -} - -void cpacman_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D13-D15: input mux - m_inp_mux = data >> 13 & 7; - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D1,D2: plate 8,14 (update display there) - plate_w(6 + 1, data >> 1 & 3); -} - -u8 cpacman_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cpacman ) - PORT_START("IN.0") // D13 port R0x - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D14 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - - PORT_START("IN.2") // D15 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) -INPUT_PORTS_END - -void cpacman_state::cpacman(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cpacman_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cpacman_state::plate_w)); - m_maincpu->write_d().set(FUNC(cpacman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(484, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 27); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cpacman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a29", 0x0000, 0x1000, CRC(1082d577) SHA1(0ef73132bd41f6ca1e4c001ae19f7f7c97eaa8d1) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359765, "screen", 0) - ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) -ROM_END - -ROM_START( cpacmanr1 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a28", 0x0000, 0x1000, CRC(d2ed57e5) SHA1(f56f1341485ac28ea9e6cc4d162fab18d8a4c977) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 359765, "screen", 0) - ROM_LOAD( "cpacman.svg", 0, 359765, CRC(e3810a46) SHA1(d0994edd71a6adc8f238c71e360a8606ce397a14) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Ms. Pac-Man (manufactured in Taiwan, licensed from Midway) - * PCB label Coleco 911171 - * Hitachi QFP HD38820A61 MCU - * cyan/red VFD display Futaba DM-60Z 3I, with color overlay - - Select game mode on start: - - P1 Left: Ms. Pac-Man (default game) - - P1 Down: Head-to-Head Ms. Pac-Man (2-player mode) - - P1 Up: Demo - - BTANB: in demo-mode, she hardly ever walks to the upper two rows - -***************************************************************************/ - -class cmspacmn_state : public hh_hmcs40_state -{ -public: - cmspacmn_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void cmspacmn(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void cmspacmn_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x(,D0,D1): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1); - u32 plate = bitswap<32>(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080; - m_display->matrix(grid, u64(BIT(m_plate,15)) << 32 | plate); -} - -void cmspacmn_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D13-D15: input mux - m_inp_mux = data >> 13 & 7; - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0,D1: more plates (update display there) - plate_w(6 + 1, data & 3); -} - -u8 cmspacmn_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cmspacmn ) - PORT_START("IN.0") // D13 port R0x - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // D14 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - - PORT_START("IN.2") // D15 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) -INPUT_PORTS_END - -void cmspacmn_state::cmspacmn(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(cmspacmn_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(cmspacmn_state::plate_w)); - m_maincpu->write_d().set(FUNC(cmspacmn_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(481, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 33); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cmspacmn ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a61", 0x0000, 0x1000, CRC(76276318) SHA1(9d6ff3f49b4cdaee5c9e238c1ed638bfb9b99aa7) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 849327, "screen", 0) - ROM_LOAD( "cmspacmn.svg", 0, 849327, CRC(4110ad07) SHA1(76113a2ce0fb1c6dab4e26fd59a13dc89d950d75) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Galaxian 2 (manufactured in Japan) - * PCB labels ENTEX GALAXIAN PB-118/116/097 80-210137/135/114 - * Hitachi QFP HD38820A13 MCU - * cyan/red/green VFD display Futaba DM-20 - - known releases: - - USA: Galaxian 2, published by Entex - - UK: Astro Invader, published by Hales/Entex - -***************************************************************************/ - -class egalaxn2_state : public hh_hmcs40_state -{ -public: - egalaxn2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void egalaxn2(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u8 input_r(); -}; - -// handlers - -void egalaxn2_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14); - u32 plate = bitswap<24>(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8); - m_display->matrix(grid, plate); -} - -void egalaxn2_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D4: input mux - m_inp_mux = data >> 1 & 0xf; - - // D1-D15: vfd grid - m_grid = data >> 1 & 0x7fff; - update_display(); -} - -void egalaxn2_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R6x: vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -u8 egalaxn2_state::input_r() -{ - // R0x: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( egalaxn2 ) - PORT_START("IN.0") // D1 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D4 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x0c, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) // for Demo mode: need to hold down Fire button at power-on - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) -INPUT_PORTS_END - -void egalaxn2_state::egalaxn2(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set(FUNC(egalaxn2_state::input_r)); - m_maincpu->write_r<1>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(egalaxn2_state::plate_w)); - m_maincpu->write_d().set(FUNC(egalaxn2_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(505, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(15, 24); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( egalaxn2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a13", 0x0000, 0x1000, CRC(112b721b) SHA1(4a185bc57ea03fe64f61f7db4da37b16eeb0cb54) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 507945, "screen", 0) - ROM_LOAD( "egalaxn2.svg", 0, 507945, CRC(b72a8721) SHA1(2d90fca6ce962710525b631e5bc8f75d79332b9d) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Pac Man 2 (manufactured in Japan) - * PCB labels ENTEX PAC-MAN PB-093/094 80-210149/50/51 - * Hitachi QFP HD38820A23 MCU - * cyan/red VFD display Futaba DM-28Z 1G(cyan Pac-Man) or DM-28 1K(orange Pac-Man) - - 2 VFD revisions are known, the difference is Pac-Man's color: cyan or red. - -***************************************************************************/ - -class epacman2_state : public egalaxn2_state -{ -public: - epacman2_state(const machine_config &mconfig, device_type type, const char *tag) : - egalaxn2_state(mconfig, type, tag) - { } - - void epacman2(machine_config &config); -}; - -// handlers are identical to Galaxian 2, so we can use those - -// config - -static INPUT_PORTS_START( epacman2 ) - PORT_START("IN.0") // D1 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // D2 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // D3 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Skill Control") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Demo Light Test") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // D4 port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "0 (Demo)" ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void epacman2_state::epacman2(machine_config &config) -{ - egalaxn2(config); - - // video hardware - screen_device *screen = subdevice("screen"); - screen->set_size(505, 1080); - screen->set_visarea_full(); -} - -// roms - -ROM_START( epacman2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 262480, "screen", 0) - ROM_LOAD( "epacman2.svg", 0, 262480, CRC(73bd9671) SHA1(a3ac754c0e060da50b65f3d0f9630d9c3d871650) ) -ROM_END - -ROM_START( epacman2r ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a23", 0x0000, 0x1000, CRC(6eab640f) SHA1(509bdd02be915089e13769f22a08e03509f03af4) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 262483, "screen", 0) - ROM_LOAD( "epacman2r.svg", 0, 262483, CRC(279b629a) SHA1(4c499fb143aadf4f6722b994a22a0d0d3c5150b6) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Super Space Invader 2 (black version) - * Hitachi HD38800A31 MCU - * cyan/red VFD display - - This version has the same MCU as the Select-A-Game cartridge. Maybe from - surplus inventory after that console was discontinued?. It was also sold - as "Super Alien Invader 2". - - Hold down the fire button at boot for demo mode to work. - -***************************************************************************/ - -class einvader2_state : public hh_hmcs40_state -{ -public: - einvader2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void einvader2(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void einvader2_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void einvader2_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void einvader2_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D3,D5,D6: input mux - m_inp_mux = (data >> 3 & 1) | (data >> 4 & 6); - - // D1-D12: vfd grid - m_grid = data >> 1 & 0xfff; - update_display(); -} - -u16 einvader2_state::input_r() -{ - // D13-D15: multiplexed inputs - return read_inputs(3) << 13; -} - -// config - -static INPUT_PORTS_START( einvader2 ) - PORT_START("IN.0") // D3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x01) // 1 player - - PORT_START("IN.1") // D5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x00) // demo - - PORT_START("IN.2") // D6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - - PORT_START("FAKE") // shared D3/D5 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "Demo" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) -INPUT_PORTS_END - -void einvader2_state::einvader2(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 450000); // approximation - m_maincpu->write_r<0>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(einvader2_state::plate_w)); - m_maincpu->write_d().set(FUNC(einvader2_state::grid_w)); - m_maincpu->read_d().set(FUNC(einvader2_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(469, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 14); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvader2 ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "inv2_hd38800a31", 0x0000, 0x1000, CRC(10e39521) SHA1(41d86696e518ea071e75ed37d5dc63c0408c262e) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 217430, "screen", 0) - ROM_LOAD( "einvader2.svg", 0, 217430, CRC(b082d9a3) SHA1(67f7e0314c69ba146751ea12cf490805b8660489) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Turtles (manufactured in Japan) - * PCB label 560359 - * Hitachi QFP HD38820A43 MCU - * COP411L sub MCU, label COP411L-KED/N - * cyan/red/green VFD display NEC FIP15BM32T - -***************************************************************************/ - -class eturtles_state : public hh_hmcs40_state -{ -public: - eturtles_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag), - m_audiocpu(*this, "audiocpu") - { } - - void eturtles(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int(); } - -protected: - virtual void machine_start() override; - - required_device m_audiocpu; - - void update_int(); - virtual void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - - DECLARE_WRITE_LINE_MEMBER(speaker_w); - void cop_irq_w(u8 data); - u8 cop_latch_r(); - u8 cop_ack_r(); - - u8 m_cop_irq = 0; -}; - -void eturtles_state::machine_start() -{ - hh_hmcs40_state::machine_start(); - save_item(NAME(m_cop_irq)); -} - -// handlers: maincpu side - -void eturtles_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0); - u32 plate = bitswap<32>(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13); - m_display->matrix(grid, plate | (grid >> 5 & 8)); // grid 8 also forces plate 3 high -} - -void eturtles_state::plate_w(offs_t offset, u8 data) -{ - m_r[offset] = data; - - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void eturtles_state::grid_w(u16 data) -{ - m_d = data; - - // D1-D6: input mux - u8 inp_mux = data >> 1 & 0x3f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int(); - } - - // D1-D15: vfd grid - m_grid = data >> 1 & 0x7fff; - update_display(); -} - -void eturtles_state::update_int() -{ - // INT0/1 on multiplexed inputs, and from COP D0 - u8 inp = read_inputs(6); - set_interrupt(0, (inp & 1) | m_cop_irq); - set_interrupt(1, inp & 2); -} - -// handlers: COP side - -WRITE_LINE_MEMBER(eturtles_state::speaker_w) -{ - // SK: speaker out - m_speaker->level_w(!state); -} - -void eturtles_state::cop_irq_w(u8 data) -{ - // D0: maincpu INT0 (active low) - m_cop_irq = ~data & 1; - update_int(); -} - -u8 eturtles_state::cop_latch_r() -{ - // L0-L3: soundlatch from maincpu R0x - return m_r[0]; -} - -u8 eturtles_state::cop_ack_r() -{ - // G0: ack from maincpu D0 - return m_d & 1; -} - -// config - -static INPUT_PORTS_START( eturtles ) - PORT_START("IN.0") // D1 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.1") // D2 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.2") // D3 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.3") // D4 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.4") // D5 INT0/1 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.5") // D6 INT0/1 - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x02, "0 (Demo)" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -void eturtles_state::eturtles(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(eturtles_state::plate_w)); - m_maincpu->write_d().set(FUNC(eturtles_state::grid_w)); - - COP411(config, m_audiocpu, 215000); // approximation - m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_audiocpu->write_sk().set(FUNC(eturtles_state::speaker_w)); - m_audiocpu->write_d().set(FUNC(eturtles_state::cop_irq_w)); - m_audiocpu->read_l().set(FUNC(eturtles_state::cop_latch_r)); - m_audiocpu->read_g().set(FUNC(eturtles_state::cop_ack_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(484, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(15, 30); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( eturtles ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a43", 0x0000, 0x1000, CRC(446aa4e2) SHA1(d1c0fb14ea7081def53b1174964b39eed1e5d5e6) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x0200, "audiocpu", 0 ) - ROM_LOAD( "cop411l-ked_n", 0x0000, 0x0200, CRC(503d26e9) SHA1(a53d24d62195bfbceff2e4a43199846e0950aef6) ) - - ROM_REGION( 1027626, "screen", 0) - ROM_LOAD( "eturtles.svg", 0, 1027626, CRC(b4f7abff) SHA1(e9b065a3a3fef3c71495002945724a86c2a68eb4) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Stargate (manufactured in Japan) - * PCB label 5603521/31 - * Hitachi QFP HD38820A42 MCU - * COP411L sub MCU, label ~/B8236 COP411L-KEC/N - * cyan/red/green VFD display NEC FIP15AM32T (EL628-003) no. 2-421, with partial color overlay - -***************************************************************************/ - -class estargte_state : public eturtles_state -{ -public: - estargte_state(const machine_config &mconfig, device_type type, const char *tag) : - eturtles_state(mconfig, type, tag) - { } - - void estargte(machine_config &config); - -private: - virtual void update_display() override; - u8 cop_data_r(); -}; - -// handlers (most of it is in eturtles_state above) - -void estargte_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1); - u32 plate = bitswap<32>(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13); - m_display->matrix(grid, plate); -} - -u8 estargte_state::cop_data_r() -{ - // L0-L3: soundlatch from maincpu R0x - // L7: ack from maincpu D0 - return m_r[0] | (m_d << 7 & 0x80); -} - -// config - -static INPUT_PORTS_START( estargte ) - PORT_START("IN.0") // D1 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Inviso") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Smart Bomb") - - PORT_START("IN.1") // D2 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Change Direction") - - PORT_START("IN.2") // D3 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - - PORT_START("IN.3") // D4 INT0/1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) PORT_NAME("Thrust") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // D5 INT0/1 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x00, "0 (Demo)" ) // yes, same value as 1-player, hold the Inviso button at boot to enter demo mode - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, eturtles_state, input_changed, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.5") // D6 INT0/1 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void estargte_state::estargte(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(estargte_state::plate_w)); - m_maincpu->write_d().set(FUNC(estargte_state::grid_w)); - - COP411(config, m_audiocpu, 190000); // approximation - m_audiocpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false); // guessed - m_audiocpu->write_sk().set(FUNC(estargte_state::speaker_w)); - m_audiocpu->write_d().set(FUNC(estargte_state::cop_irq_w)); - m_audiocpu->read_l().set(FUNC(estargte_state::cop_data_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 854); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(14, 29); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( estargte ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a42", 0x0000, 0x1000, CRC(5f6d55a6) SHA1(0da32149790fa5f16097338fc80536b462169e0c) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 0x0200, "audiocpu", 0 ) - ROM_LOAD( "cop411l-kec_n", 0x0000, 0x0200, CRC(fbd3c2d3) SHA1(65b8b24d38678c3fa970bfd639e9449a75a28927) ) - - ROM_REGION( 462214, "screen", 0) - ROM_LOAD( "estargte.svg", 0, 462214, CRC(282cc090) SHA1(b0f3c21e9a529e5f1e33b90ca25ce3a097fb75a0) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Heiankyo Alien (manufactured in Japan) - * Hitachi HD38800A04 MCU - * cyan/red VFD display Futaba DM-11Z 1H - - known releases: - - Japan: Heiankyo Alien, published by Gakken - - USA: Earth Invaders, published by CGL - -***************************************************************************/ - -class ghalien_state : public hh_hmcs40_state -{ -public: - ghalien_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void ghalien(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void ghalien_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D10-D13): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - u32 plate = bitswap<24>(m_plate,23,22,21,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18); - m_display->matrix(grid, plate); -} - -void ghalien_state::grid_w(u16 data) -{ - // D14: speaker out - m_speaker->level_w(data >> 14 & 1); - - // D0-D6: input mux - m_inp_mux = data & 0x7f; - - // D0-D9: vfd grid - m_grid = data & 0x3ff; - - // D10-D13: more plates (update display there) - plate_w(4, data >> 10 & 0xf); -} - -u16 ghalien_state::input_r() -{ - // D15: multiplexed inputs - return read_inputs(7) & 0x8000; -} - -// config - -static INPUT_PORTS_START( ghalien ) - PORT_START("IN.0") // D0 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // D1 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // D2 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.3") // D3 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.4") // D4 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Dig") - - PORT_START("IN.5") // D5 line D15 - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bury") - - PORT_START("IN.6") // D6 line D15 - PORT_CONFNAME( 0x8000, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "Amateur" ) - PORT_CONFSETTING( 0x8000, "Professional" ) -INPUT_PORTS_END - -void ghalien_state::ghalien(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(ghalien_state::plate_w)); - m_maincpu->write_d().set(FUNC(ghalien_state::grid_w)); - m_maincpu->read_d().set(FUNC(ghalien_state::input_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 699); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ghalien ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a04", 0x0000, 0x1000, CRC(019c3328) SHA1(9f1029c5c479f78350952c4f18747341ba5ea7a0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 462749, "screen", 0) - ROM_LOAD( "ghalien.svg", 0, 462749, CRC(1acbb1e8) SHA1(7bdeb840bc9080792e24812eba923bf84f7865a6) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Crazy Kong (manufactured in Japan) - * PCB label ZENY 5603601 - * Hitachi HD38800B01 MCU - * cyan/red/blue VFD display Futaba DM-54Z 2H, with bezel overlay - - known releases: - - Japan: Crazy Kong, published by Gakken - - USA: Super Kong, published by CGL - -***************************************************************************/ - -class gckong_state : public hh_hmcs40_state -{ -public: - gckong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gckong(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gckong_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x(,D0,D1): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10); - u32 plate = bitswap<32>(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000; - m_display->matrix(grid, plate); -} - -void gckong_state::grid_w(u16 data) -{ - // D2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // D5-D8: input mux - u8 inp_mux = data >> 5 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D5-D15: vfd grid - m_grid = data >> 5 & 0x7ff; - - // D0,D1: more plates (update display there) - plate_w(4, data & 3); -} - -void gckong_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( gckong ) - PORT_START("IN.0") // D5 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.1") // D6 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.2") // D7 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.3") // D8 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gckong_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) - - PORT_START("IN.5") // port D - PORT_CONFNAME( 0x0010, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "A" ) - PORT_CONFSETTING( 0x0010, "B" ) - PORT_BIT( 0xffef, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gckong_state::gckong(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gckong_state::plate_w)); - m_maincpu->write_d().set(FUNC(gckong_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.5"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(479, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(11, 32); - config.set_default_layout(layout_gckong); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gckong ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b01", 0x0000, 0x1000, CRC(d5a2cca3) SHA1(37bb5784383daab672ed1e0e2362c7a40d8d9b3f) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 346588, "screen", 0) - ROM_LOAD( "gckong.svg", 0, 346588, CRC(317af984) SHA1(ff6323526d1f5e46eccf8fa8d979175895be75de) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Super Cobra - * PCB label SUPER COBRA 3000N - * Hitachi QFP HD38820A32 MCU - * cyan/red/green VFD display - - known releases: - - World: Super Cobra, published by Gakken - - USA: Cobra Super Copter, published by Tandy - - There are 2 versions, a green one and a white one. They have the same MCU, - though the VFD has color differences and is more compact. - - BTANB(green version): 1 rocket seems out of place at the top-right area - -***************************************************************************/ - -class gscobra_state : public hh_hmcs40_state -{ -public: - gscobra_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gscobra(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gscobra_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D1-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - m_display->matrix(m_grid, m_plate); -} - -void gscobra_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D10-D15: input mux - u8 inp_mux = data >> 10 & 0x3f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D1-D3: more plates (update display there) - plate_w(7, data >> 1 & 7); -} - -void gscobra_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(6)); -} - -// config - -static INPUT_PORTS_START( gscobra ) - PORT_START("IN.0") // D10 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.1") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.2") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) - - PORT_START("IN.5") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gscobra_state, input_changed, 0) -INPUT_PORTS_END - -void gscobra_state::gscobra(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gscobra_state::plate_w)); - m_maincpu->write_d().set(FUNC(gscobra_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 852); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 31); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gscobra ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a32", 0x0000, 0x1000, CRC(7bbd130f) SHA1(91dd280e4108fad7ba99191355364bd3217b9d17) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 232919, "screen", 0) - ROM_LOAD( "gscobra.svg", 0, 232919, CRC(5ceb4bfc) SHA1(77c9a45569d780838ebe75818acb2d2ced4bda00) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Defender - * Hitachi HD38820L53 MCU (SDIP) - * cyan/red/green VFD display - -***************************************************************************/ - -class gdefender_state : public hh_hmcs40_state -{ -public: - gdefender_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gdefender(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_display(); - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - u16 input_r(); -}; - -// handlers - -void gdefender_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void gdefender_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void gdefender_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D3-D15: vfd grid - m_grid = data >> 3 & 0x1fff; - update_display(); -} - -u16 gdefender_state::input_r() -{ - // D1: multiplexed inputs - return read_inputs(4) & 2; -} - -void gdefender_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4) & 1); -} - -// config - -static INPUT_PORTS_START( gdefender ) - PORT_START("IN.0") // D11 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.1") // D12 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Warp") - - PORT_START("IN.2") // D13 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) PORT_NAME("Missile / Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") - - PORT_START("IN.3") // D14 INT1/D1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdefender_state, input_changed, 0) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gdefender_state::gdefender(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gdefender_state::plate_w)); - m_maincpu->write_d().set(FUNC(gdefender_state::grid_w)); - m_maincpu->read_d().set(FUNC(gdefender_state::input_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(13, 28); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gdefender ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820l53", 0x0000, 0x1000, CRC(fe52bbb4) SHA1(e0250954c3801af9841306c2e1fdf57f3b9edffa) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "gdefender.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Dig Dug (manufactured in Japan) - * PCB label Gakken DIG-DAG KS-004283(A/B) - * Hitachi QFP HD38820A69 MCU - * cyan/red/green VFD display Futaba DM-69Z 3F, with color overlay - -***************************************************************************/ - -class gdigdug_state : public hh_hmcs40_state -{ -public: - gdigdug_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void gdigdug(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void gdigdug_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D0-D3): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<32>(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16); - m_display->matrix(m_grid, plate); -} - -void gdigdug_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D3: more plates (update display there) - plate_w(7, data & 0xf); -} - -void gdigdug_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( gdigdug ) - PORT_START("IN.0") // D11 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, gdigdug_state, input_changed, 0) - - PORT_START("IN.5") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void gdigdug_state::gdigdug(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(gdigdug_state::plate_w)); - m_maincpu->write_d().set(FUNC(gdigdug_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(476, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 32); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gdigdug ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a69", 0x0000, 0x1000, CRC(501165a9) SHA1(8a15d00c4aa66e870cadde33148426463560d2e6) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 807990, "screen", 0) - ROM_LOAD( "gdigdug.svg", 0, 807990, CRC(a5b8392d) SHA1(3503829bb1a626a9e70115fb60b656dff8908144) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel World Championship Baseball (model 3201) - * PCB label MEL-001 Baseball Rev. B - * Hitachi QFP HD38820A09 MCU - * cyan/red/green VFD display Futaba DM-24ZK 1G, with etched overlay - - It was patented under US4372557. To start the game in 2-player mode, simply - turn the game on. For 1-player, turn the game on while holding the 1-key - and use the visitor's side keypad to play offsense. - -***************************************************************************/ - -class mwcbaseb_state : public hh_hmcs40_state -{ -public: - mwcbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void mwcbaseb(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - void speaker_w(u8 data); - u8 input_r(); -}; - -// handlers - -void mwcbaseb_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - m_display->matrix(grid, m_plate); -} - -void mwcbaseb_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x,R6x: vfd plate - int shift = (offset == 6) ? 12 : (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void mwcbaseb_state::grid_w(u16 data) -{ - // D9-D15: input mux - m_inp_mux = data >> 9 & 0x7f; - - // D0-D7: vfd grid - m_grid = data & 0xff; - update_display(); -} - -void mwcbaseb_state::speaker_w(u8 data) -{ - // R50,R51+R52(tied together): speaker out - m_speaker->level_w(data & 7); -} - -u8 mwcbaseb_state::input_r() -{ - // R4x: multiplexed inputs - return read_inputs(7); -} - -// config - -/* physical button layout and labels are like this: - - (visitor team side) (home team side) - COMP PITCH [SCORE] [INNING] - [1] [2] [3] [1] [2] [3] - NEW PITCHER PINCH HITTER NEW PITCHER PINCH HITTER - - [4] [5] [6] [4] [5] [6] - BACKWARD (pitch) FORWARD BACKWARD (pitch) FORWARD - - [7] [8] [9] [7] [8] [9] - - BUNT NORMAL HR SWING BUNT NORMAL HR SWING - [CLEAR] [0] [ENTER] [CLEAR] [0] [ENTER] - SLOW CURVE FAST SLOW CURVE FAST -*/ - -static INPUT_PORTS_START( mwcbaseb ) // P1 = left/visitor, P2 = right/home - PORT_START("IN.0") // D9 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("P2 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("P2 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("P2 1") - - PORT_START("IN.1") // D10 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P2 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 5") - - PORT_START("IN.2") // D11 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 9") - - PORT_START("IN.3") // D12 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Inning") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Score") - - PORT_START("IN.4") // D13 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P1 Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - - PORT_START("IN.5") // D14 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - - PORT_START("IN.6") // D15 port R4x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") -INPUT_PORTS_END - -void mwcbaseb_state::mwcbaseb(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<1>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->read_r<4>().set(FUNC(mwcbaseb_state::input_r)); - m_maincpu->write_r<5>().set(FUNC(mwcbaseb_state::speaker_w)); - m_maincpu->write_r<6>().set(FUNC(mwcbaseb_state::plate_w)); - m_maincpu->write_d().set(FUNC(mwcbaseb_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 478); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 16); - m_display->set_bri_levels(0.001); // cyan elements strobed very briefly? - config.set_default_layout(layout_mwcbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); - static const double speaker_levels[] = { 0.0, 0.5, -0.5, 0.0, -0.5, 0.0, -1.0, -0.5 }; - m_speaker->set_levels(8, speaker_levels); -} - -// roms - -ROM_START( mwcbaseb ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a09", 0x0000, 0x1000, CRC(25ba7dc0) SHA1(69e0a867fdcf07b454b1faf835e576ae782432c0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 178441, "screen", 0) - ROM_LOAD( "mwcbaseb.svg", 0, 178441, CRC(0f631190) SHA1(74a10ad0630af5516f76d5bf5628483d21f6b7be) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Star Hawk (manufactured in Japan) - * PCB label Kaken, PT-317B - * Hitachi HD38800A73 MCU - * cyan/red VFD display Futaba DM-41ZK, with partial color overlay + bezel - - Before release, it was advertised as "Space Battle"(a Mattel Intellivision game). - Kaken was a subsidiary of Bandai. Star Hawk shell design is the same as Bandai's - games from the same era. It's likely that this was made under contract exclusively - for Mattel. There is no indication that this game was released in Japan by Bandai. - -***************************************************************************/ - -class msthawk_state : public hh_hmcs40_state -{ -public: - msthawk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void msthawk(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void msthawk_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - u32 plate = bitswap<24>(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void msthawk_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void msthawk_state::grid_w(u16 data) -{ - // D5: speaker out - m_speaker->level_w(data >> 5 & 1); - - // D10-D15: input mux - u8 inp_mux = data >> 10 & 0x3f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D4: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); - update_display(); -} - -void msthawk_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(6)); -} - -// config - -static INPUT_PORTS_START( msthawk ) - PORT_START("IN.0") // D10 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) PORT_NAME("Score") - - PORT_START("IN.1") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) PORT_NAME("Land") - - PORT_START("IN.2") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.3") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.4") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.5") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, msthawk_state, input_changed, 0) - - PORT_START("IN.6") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) PORT_NAME("Fire") -INPUT_PORTS_END - -void msthawk_state::msthawk(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(msthawk_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(msthawk_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(msthawk_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(msthawk_state::plate_w)); - m_maincpu->write_d().set(FUNC(msthawk_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 696); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 21); - config.set_default_layout(layout_msthawk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( msthawk ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a73", 0x0000, 0x1000, CRC(a4f9a523) SHA1(465f06b02e2e7d2277218fd447830725790a816c) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 191888, "screen", 0) - ROM_LOAD( "msthawk.svg", 0, 191888, CRC(a607fc0f) SHA1(282a412f6462128e09ee8bd18d682dda01297611) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Q*Bert - * PCB label 13662 REV-4 - * Hitachi QFP HD38820A70 MCU - * cyan/red/green/darkgreen VFD display Itron CP5137 - -***************************************************************************/ - -class pbqbert_state : public hh_hmcs40_state -{ -public: - pbqbert_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void pbqbert(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void pbqbert_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R6x(,D8): vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u32 plate = bitswap<32>(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000; - m_display->matrix(m_grid, plate); -} - -void pbqbert_state::grid_w(u16 data) -{ - // D14: speaker out - m_speaker->level_w(data >> 14 & 1); - - // D0-D7: vfd grid - m_grid = data & 0xff; - - // D8: plate 25 (update display there) - plate_w(7, data >> 8 & 1); -} - -// config - -static INPUT_PORTS_START( pbqbert ) - PORT_START("IN.0") // port D - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // up-left - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) // up-right - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // down-right - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) // down-left - PORT_BIT( 0xe1ff, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pbqbert_state::pbqbert(machine_config &config) -{ - // basic machine hardware - HD38820(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<4>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<5>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_r<6>().set(FUNC(pbqbert_state::plate_w)); - m_maincpu->write_d().set(FUNC(pbqbert_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.0"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(603, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 30); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( pbqbert ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38820a70", 0x0000, 0x1000, CRC(be7c80b4) SHA1(0617a80ef7fe188ea221de32e760d45fd4318c67) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 456567, "screen", 0) - ROM_LOAD( "pbqbert.svg", 0, 456567, CRC(49853a62) SHA1(869377109fb7163e5ef5efadb26ce3955231f6ca) ) -ROM_END - - - - - -/*************************************************************************** - - Romtec Pucki & Monsters - * Hitachi HD38750A67 MCU - * cyan/red/green VFD display - -***************************************************************************/ - -class puckimon_state : public hh_hmcs40_state -{ -public: - puckimon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void puckimon(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(u16 data); -}; - -// handlers - -void puckimon_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void puckimon_state::grid_w(offs_t offset, u8 data) -{ - // R1x-R3x: vfd grid - int shift = (offset - 1) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // R13: vfd plate - if (offset == 1) - m_plate = (m_plate & 0x7fff) | (data << 12 & 0x8000); - update_display(); -} - -void puckimon_state::plate_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D1-D15: vfd plate - m_plate = (m_plate & 0x8000) | (data >> 1 & 0x7fff); - update_display(); - -} - -// config - -static INPUT_PORTS_START( puckimon ) - PORT_START("IN.0") // port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void puckimon_state::puckimon(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 400000); // approximation - m_maincpu->read_r<0>().set_ioport("IN.0").invert(); - m_maincpu->write_r<1>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_r<2>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_r<3>().set(FUNC(puckimon_state::grid_w)); - m_maincpu->write_d().set(FUNC(puckimon_state::plate_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 16); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( puckimon ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a67", 0x0000, 0x0800, CRC(8b493783) SHA1(6c37e67de5d59889abf8a155654f130218cfc12e) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "puckimon.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Tron (manufactured in Japan) - * PCB label THN-02 2E114E07 - * Hitachi HD38800A88 MCU - * cyan/red/green VFD display NEC FIP10AM24T no. 2-8 1 - -***************************************************************************/ - -class tmtron_state : public hh_hmcs40_state -{ -public: - tmtron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void tmtron(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int1(); } - -private: - void update_int1(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void tmtron_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0); - u32 plate = bitswap<24>(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15); - m_display->matrix(grid, plate); -} - -void tmtron_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtron_state::grid_w(u16 data) -{ - // D4: speaker out - m_speaker->level_w(data >> 4 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int1(); - } - - // D6-D15: vfd grid - m_grid = data >> 6 & 0x3ff; - - // D0-D3,D5: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x2f0000); - update_display(); -} - -void tmtron_state::update_int1() -{ - // INT1 on multiplexed inputs - set_interrupt(1, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( tmtron ) - PORT_START("IN.0") // D12 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, tmtron_state, input_changed, 0) - - PORT_START("IN.4") // INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 0) -INPUT_PORTS_END - -void tmtron_state::tmtron(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(tmtron_state::plate_w)); - m_maincpu->write_d().set(FUNC(tmtron_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 662); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 23); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmtron ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800a88", 0x0000, 0x1000, CRC(33db9670) SHA1(d6f747a59356526698784047bcfdbb59e79b9a23) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 384174, "screen", 0) - ROM_LOAD( "tmtron.svg", 0, 384174, CRC(06bd9e63) SHA1(fb93013ec42dc05f7029ef3c3073c84867f0d077) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Kingman (manufactured in Japan) - * PCB label THF-01II 2E138E01/2E128E02 - * Hitachi HD38800B23 MCU - * cyan/red/blue VFD display Futaba DM-65ZK 3A - - known releases: - - World: Kingman, published by Tomy - - USA: Kingman, published by Tandy - -***************************************************************************/ - -class kingman_state : public hh_hmcs40_state -{ -public: - kingman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void kingman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void kingman_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u32 plate = bitswap<24>(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12); - m_display->matrix(grid, plate); -} - -void kingman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void kingman_state::grid_w(u16 data) -{ - // D6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // D12-D15: input mux - u8 inp_mux = data >> 12 & 0xf; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D0-D4: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); - update_display(); -} - -void kingman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(4)); -} - -// config - -static INPUT_PORTS_START( kingman ) - PORT_START("IN.0") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.1") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.2") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.3") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, kingman_state, input_changed, 0) - - PORT_START("IN.4") // INT1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_hmcs40_state, single_interrupt_line, 1) -INPUT_PORTS_END - -void kingman_state::kingman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(kingman_state::plate_w)); - m_maincpu->write_d().set(FUNC(kingman_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(374, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 23); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( kingman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b23", 0x0000, 0x1000, CRC(f8dfe14f) SHA1(660610d92ae7e5f92bddf5a3bcc2296b2ec3946b) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 396320, "screen", 0) - ROM_LOAD( "kingman.svg", 0, 396320, CRC(3f52d2a9) SHA1(9291f1a1da3d19c3d6dedb995de0a5feba75b442) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Bombman (Portable 6000 series) - * Hitachi HD38800B29 MCU - * cyan/red/blue VFD display - -***************************************************************************/ - -class bombman_state : public hh_hmcs40_state -{ -public: - bombman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void bombman(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed) { update_int0(); } - -private: - void update_int0(); - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void bombman_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void bombman_state::plate_w(offs_t offset, u8 data) -{ - // R0x-R3x: vfd plate - int shift = offset * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bombman_state::grid_w(u16 data) -{ - // D7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // D11-D15: input mux - u8 inp_mux = data >> 11 & 0x1f; - if (inp_mux != m_inp_mux) - { - m_inp_mux = inp_mux; - update_int0(); - } - - // D8-D15: vfd grid - m_grid = data >> 8 & 0xff; - - // D0-D4: more plates - m_plate = (m_plate & 0x00ffff) | (data << 16 & 0x1f0000); - update_display(); -} - -void bombman_state::update_int0() -{ - // INT0 on multiplexed inputs - set_interrupt(0, read_inputs(5)); -} - -// config - -static INPUT_PORTS_START( bombman ) - PORT_START("IN.0") // D11 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.1") // D12 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.2") // D13 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.3") // D14 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) - - PORT_START("IN.4") // D15 INT0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_MEMBER(DEVICE_SELF, bombman_state, input_changed, 0) -INPUT_PORTS_END - -void bombman_state::bombman(machine_config &config) -{ - // basic machine hardware - HD38800(config, m_maincpu, 400000); // approximation - m_maincpu->write_r<0>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<1>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(bombman_state::plate_w)); - m_maincpu->write_d().set(FUNC(bombman_state::grid_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 21); - config.set_default_layout(layout_hh_hmcs40_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bombman ) - ROM_REGION( 0x2000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38800b29", 0x0000, 0x1000, CRC(f99ebd3f) SHA1(5016d4e35efa1353d26e60f98d8a027773d571a0) ) - ROM_CONTINUE( 0x1e80, 0x0100 ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "bombman.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - VTech Invaders (manufactured in Taiwan) - * Hitachi HD38750A45 MCU - * cyan/red VFD display Futaba DM-26Z 1G, with bezel - - known releases: - - USA: Invaders/Sonic Invader, published by VTech - - UK: Cosmic Invader, published by Grandstand - - UK: Galactic Invaders, published by Prinztronic - -***************************************************************************/ - -class vinvader_state : public hh_hmcs40_state -{ -public: - vinvader_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_hmcs40_state(mconfig, type, tag) - { } - - void vinvader(machine_config &config); - -private: - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); -}; - -// handlers - -void vinvader_state::plate_w(offs_t offset, u8 data) -{ - // R1x-R3x(,D4-D6): vfd plate - int shift = (offset - 1) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // update display - u16 plate = bitswap<16>(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0); - m_display->matrix(m_grid, plate); -} - -void vinvader_state::grid_w(u16 data) -{ - // D0: speaker out - m_speaker->level_w(data & 1); - - // D7-D15: vfd grid - m_grid = data >> 7 & 0x1ff; - - // D4-D6: more plates (update display there) - plate_w(3 + 1, data >> 4 & 7); -} - -// config - -static INPUT_PORTS_START( vinvader ) - PORT_START("IN.0") // port R0x - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port D - PORT_CONFNAME( 0x0002, 0x0000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x0000, "1" ) - PORT_CONFSETTING( 0x0002, "2" ) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0xfff5, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void vinvader_state::vinvader(machine_config &config) -{ - // basic machine hardware - HD38750(config, m_maincpu, 300000); // approximation - m_maincpu->read_r<0>().set_ioport("IN.0"); - m_maincpu->write_r<1>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_r<2>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_r<3>().set(FUNC(vinvader_state::plate_w)); - m_maincpu->write_d().set(FUNC(vinvader_state::grid_w)); - m_maincpu->read_d().set_ioport("IN.1"); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(233, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( vinvader ) - ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "hd38750a45", 0x0000, 0x0800, CRC(32de6056) SHA1(70238c6c40c3d513f8eced1cb81bdd4dbe12f16c) ) - ROM_CONTINUE( 0x0f00, 0x0080 ) - - ROM_REGION( 166379, "screen", 0) - ROM_LOAD( "vinvader.svg", 0, 166379, CRC(b75c448e) SHA1(40d546f9fbdb446883e3ab0e3f678f1be8105159) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1982, wantgman, 0, 0, wantgman, wantgman, wantgman_state, empty_init, "Actronics / Hanzawa", "Wanted G-Man", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1979, bambball, 0, 0, bambball, bambball, bambball_state, empty_init, "Bambino", "Dribble Away Basketball", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, bmboxing, 0, 0, bmboxing, bmboxing, bmboxing_state, empty_init, "Bambino", "Knock-Em Out Boxing", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, bfriskyt, 0, 0, bfriskyt, bfriskyt, bfriskyt_state, empty_init, "Bandai", "Frisky Tom (Bandai)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, packmon, 0, 0, packmon, packmon, packmon_state, empty_init, "Bandai", "Packri Monster", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, bzaxxon, 0, 0, bzaxxon, bzaxxon, bzaxxon_state, empty_init, "Bandai", "Zaxxon (Bandai)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, zackman, 0, 0, zackman, zackman, zackman_state, empty_init, "Bandai", "Zackman", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, bpengo, 0, 0, bpengo, bpengo, bpengo_state, empty_init, "Bandai", "Pengo (Bandai)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, bbtime, 0, 0, bbtime, bbtime, bbtime_state, empty_init, "Bandai", "Burger Time (Bandai)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, ktparman, 0, 0, ktparman, ktparman, ktparman_state, empty_init, "Bandai", "Kiteyo Parman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1983, bdoramon, 0, 0, bdoramon, bdoramon, bdoramon_state, empty_init, "Bandai", "Dokodemo Dorayaki Doraemon", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, tkjmaru, 0, 0, tkjmaru, tkjmaru, tkjmaru_state, empty_init, "Bandai", "Toukon Juohmaru", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1983, bultrman, 0, 0, bultrman, bultrman, bultrman_state, empty_init, "Bandai", "Ultraman Monster Battle", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, ggdman, 0, 0, ggdman, ggdman, ggdman_state, empty_init, "Bandai", "Go Go Dynaman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1984, machiman, 0, 0, machiman, machiman, machiman_state, empty_init, "Bandai", "Machine Man", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, pairmtch, 0, 0, pairmtch, pairmtch, pairmtch_state, empty_init, "Bandai", "Pair Match", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, alnattck, 0, 0, alnattck, alnattck, alnattck_state, empty_init, "Coleco", "Alien Attack", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, cdkong, 0, 0, cdkong, cdkong, cdkong_state, empty_init, "Coleco", "Donkey Kong (Coleco)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, cgalaxn, 0, 0, cgalaxn, cgalaxn, cgalaxn_state, empty_init, "Coleco", "Galaxian (Coleco)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -CONS( 1981, cpacman, 0, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 29)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, cpacmanr1, cpacman, 0, cpacman, cpacman, cpacman_state, empty_init, "Coleco", "Pac-Man (Coleco, Rev. 28)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, cmspacmn, 0, 0, cmspacmn, cmspacmn, cmspacmn_state, empty_init, "Coleco", "Ms. Pac-Man (Coleco)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, egalaxn2, 0, 0, egalaxn2, egalaxn2, egalaxn2_state, empty_init, "Entex", "Galaxian 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, epacman2, 0, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, cyan Pacman)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, epacman2r, epacman2, 0, epacman2, epacman2, epacman2_state, empty_init, "Entex", "Pac Man 2 (Entex, red Pacman)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, einvader2, 0, 0, einvader2, einvader2, einvader2_state, empty_init, "Entex", "Super Space Invader 2 (Entex, black version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, eturtles, 0, 0, eturtles, eturtles, eturtles_state, empty_init, "Entex", "Turtles (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, estargte, 0, 0, estargte, estargte, estargte_state, empty_init, "Entex", "Stargate (Entex)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, ghalien, 0, 0, ghalien, ghalien, ghalien_state, empty_init, "Gakken", "Heiankyo Alien (Gakken)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, gckong, 0, 0, gckong, gckong, gckong_state, empty_init, "Gakken", "Crazy Kong (Gakken)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, gscobra, 0, 0, gscobra, gscobra, gscobra_state, empty_init, "Gakken", "Super Cobra (Gakken, green version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1983, gdefender, 0, 0, gdefender, gdefender, gdefender_state, empty_init, "Gakken", "Defender (Gakken)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1983, gdigdug, 0, 0, gdigdug, gdigdug, gdigdug_state, empty_init, "Gakken", "Dig Dug (Gakken)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, mwcbaseb, 0, 0, mwcbaseb, mwcbaseb, mwcbaseb_state, empty_init, "Mattel Electronics", "World Championship Baseball", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, msthawk, 0, 0, msthawk, msthawk, msthawk_state, empty_init, "Mattel Electronics", "Star Hawk (Mattel)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1983, pbqbert, 0, 0, pbqbert, pbqbert, pbqbert_state, empty_init, "Parker Brothers", "Q*Bert (Parker Brothers)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, puckimon, 0, 0, puckimon, puckimon, puckimon_state, empty_init, "Romtec", "Pucki & Monsters", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1982, tmtron, 0, 0, tmtron, tmtron, tmtron_state, empty_init, "Tomy", "Tron (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, kingman, 0, 0, kingman, kingman, kingman_state, empty_init, "Tomy", "Kingman", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, bombman, 0, 0, bombman, bombman, bombman_state, empty_init, "Tomy", "Bombman", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1981, vinvader, 0, 0, vinvader, vinvader, vinvader_state, empty_init, "VTech", "Invaders (VTech)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_melps4.cpp b/src/mame/misc_handheld/hh_melps4.cpp deleted file mode 100644 index 060ddba845b..00000000000 --- a/src/mame/misc_handheld/hh_melps4.cpp +++ /dev/null @@ -1,381 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/*************************************************************************** - -Mitsubishi MELPS 4 MCU tabletops/handhelds or other simple devices, -most of them are VFD electronic games/toys. - -TODO: -- dump/add Gakken version of Frogger -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/melps4/m58846.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -//#include "hh_melps4_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_melps4_state : public driver_device -{ -public: - hh_melps4_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<4> m_inputs; // max 4 - - // misc common - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u32 m_plate = 0; // VFD current column data - - u8 read_inputs(int columns); -}; - - -// machine start/reset - -void hh_melps4_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_melps4_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_melps4_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_melps4_state::reset_button) -{ - // for when reset button is directly tied to MCU reset pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Coleco Frogger (manufactured in Japan, licensed from Sega) - * PCB label Coleco Frogger Code No. 01-81543, KS-003282 Japan - * Mitsubishi M58846-701P MCU - * cyan/red/green VFD display Itron CP5090GLR R1B, with partial color overlay - - Gakken / Konami Frogger - * PCB label Konami Gakken KH-8201D - * Mitsubishi M58846-700P MCU (Konami logo on it) - * cyan/red/green VFD display, with partial color overlay - -***************************************************************************/ - -class cfrogger_state : public hh_melps4_state -{ -public: - cfrogger_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_melps4_state(mconfig, type, tag) - { } - - void cfrogger(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - DECLARE_WRITE_LINE_MEMBER(speaker_w); - u16 input_r(); -}; - -// handlers - -void cfrogger_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11); - u16 plate = bitswap<16>(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8); - m_display->matrix(grid, plate); -} - -void cfrogger_state::plate_w(offs_t offset, u8 data) -{ - // F0,F1: input mux - if (offset == MELPS4_PORTF) - m_inp_mux = data & 3; - - // Sx,Fx,Gx: vfd plate - int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit - int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; - m_plate = (m_plate & ~(mask << shift)) | (data << shift); - update_display(); -} - -void cfrogger_state::grid_w(u16 data) -{ - // D0-D11: vfd grid - m_grid = data; - update_display(); -} - -WRITE_LINE_MEMBER(cfrogger_state::speaker_w) -{ - // T: speaker out - m_speaker->level_w(state); -} - -u16 cfrogger_state::input_r() -{ - // K0,K1: multiplexed inputs - // K2: N/C - // K3: fixed input - return (m_inputs[2]->read() & 8) | (read_inputs(2) & 3); -} - -// config - -static INPUT_PORTS_START( cfrogger ) - PORT_START("IN.0") // F0 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // F1 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - - PORT_START("IN.2") // K3 - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) -INPUT_PORTS_END - -void cfrogger_state::cfrogger(machine_config &config) -{ - // basic machine hardware - M58846(config, m_maincpu, 600_kHz_XTAL); - m_maincpu->read_k().set(FUNC(cfrogger_state::input_r)); - m_maincpu->write_s().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_f().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_g().set(FUNC(cfrogger_state::plate_w)); - m_maincpu->write_d().set(FUNC(cfrogger_state::grid_w)); - m_maincpu->write_t().set(FUNC(cfrogger_state::speaker_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(500, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cfrogger ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m58846-701p", 0x0000, 0x1000, CRC(ba52a242) SHA1(7fa53b617f4bb54be32eb209e9b88131e11cb518) ) - - ROM_REGION( 786255, "screen", 0) - ROM_LOAD( "cfrogger.svg", 0, 786255, CRC(d8d6e2b6) SHA1(bc9a0260b211ed07021dfe1cc19a993569f4c544) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken / Konami Jungler (manufactured in Japan) - * PCB label Konami Gakken GR503 - * Mitsubishi M58846-702P MCU - * cyan/red/green VFD display Itron CP5143GLR SGA, with light-yellow color overlay - -***************************************************************************/ - -class gjungler_state : public hh_melps4_state -{ -public: - gjungler_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_melps4_state(mconfig, type, tag) - { } - - void gjungler(machine_config &config); - -private: - void update_display(); - void plate_w(offs_t offset, u8 data); - void grid_w(u16 data); - DECLARE_WRITE_LINE_MEMBER(speaker_w); - u16 input_r(); -}; - -// handlers - -void gjungler_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000; - m_display->matrix(grid, plate); -} - -void gjungler_state::plate_w(offs_t offset, u8 data) -{ - // G0,G1: input mux - if (offset == MELPS4_PORTG) - m_inp_mux = data & 3; - - // Sx,Fx,Gx,U: vfd plate - int mask = (offset == MELPS4_PORTS) ? 0xff : 0xf; // port S is 8-bit - int shift = (offset == MELPS4_PORTS) ? 0 : (offset + 1) * 4; - m_plate = (m_plate & ~(mask << shift)) | (data << shift); - update_display(); -} - -void gjungler_state::grid_w(u16 data) -{ - // D0-D11: vfd grid - m_grid = data; - update_display(); -} - -WRITE_LINE_MEMBER(gjungler_state::speaker_w) -{ - // T: speaker out - m_speaker->level_w(state); -} - -u16 gjungler_state::input_r() -{ - // K0,K1: multiplexed inputs - // K2,K3: fixed inputs - return (m_inputs[2]->read() & 0xc) | (read_inputs(2) & 3); -} - -// config - -static INPUT_PORTS_START( gjungler ) - PORT_START("IN.0") // G0 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.1") // G1 port K0,K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.2") // K2,K3 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x08, 0x00, "Game Mode" ) - PORT_CONFSETTING( 0x00, "A" ) - PORT_CONFSETTING( 0x08, "B" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_melps4_state, reset_button, 0) -INPUT_PORTS_END - -void gjungler_state::gjungler(machine_config &config) -{ - // basic machine hardware - M58846(config, m_maincpu, 600_kHz_XTAL); - m_maincpu->read_k().set(FUNC(gjungler_state::input_r)); - m_maincpu->write_s().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_f().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_g().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_u().set(FUNC(gjungler_state::plate_w)); - m_maincpu->write_d().set(FUNC(gjungler_state::grid_w)); - m_maincpu->write_t().set(FUNC(gjungler_state::speaker_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(481, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gjungler ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m58846-702p", 0x0000, 0x1000, CRC(94ab7060) SHA1(3389bc115d1df8d01a30611fa9e95a900d32b29b) ) - - ROM_REGION( 419696, "screen", 0) - ROM_LOAD( "gjungler.svg", 0, 419696, CRC(c5f6d1f2) SHA1(5032f35326ca689c8e329f760e380cdc9f5dff86) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1982, cfrogger, 0, 0, cfrogger, cfrogger, cfrogger_state, empty_init, "Coleco / Konami", "Frogger (Coleco)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, gjungler, 0, 0, gjungler, gjungler, gjungler_state, empty_init, "Gakken / Konami", "Jungler (Gakken)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_pic16.cpp b/src/mame/misc_handheld/hh_pic16.cpp deleted file mode 100644 index 3a35e746c8c..00000000000 --- a/src/mame/misc_handheld/hh_pic16.cpp +++ /dev/null @@ -1,1965 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -GI PIC 16xx-driven dedicated handhelds or other simple devices. - -known chips: - - serial device etc. ------------------------------------------------------------ - *020 1650 19??, GI Economega IV TV PPL Tuning System Control - *021 1650 1978, GI AY-3-8910 demo board - @024 1655 1979, Toytronic? Football - @033 1655A 1979, Toytronic Football (newer) - @036 1655A 1979, Ideal Maniac - @043 1655A 1979, Caprice Pro-Action Baseball - @049 1655A 1980, Kingsford Match Me(?)/Mini Match Me - @051 1655A 1979, Kmart Dr. Dunk/Tandy Electronic Basketball - @053 1655A 1979, Atari Touch Me - @0?? 1655A 1979, Tiger Half Court Computer Basketball/Sears Electronic Basketball (custom label) - @061 1655A 1980, Lakeside Le Boom - @078 1655A 1980, Ideal Flash - *081 1655A 1981, Ramtex Space Invaders/Block Buster - *085 1655A 1980, VTech Soccer 2/Grandstand Match of the Day Soccer - @094 1655A 1980, GAF Melody Madness - @110 1650A 1979, Tiger/Tandy Rocket Pinball - *123 1655A? 1980, Kingsford Match Me/Mini Match Me - @133 1650A 1981, U.S. Games Programmable Baseball/Tandy 2-Player Baseball - @144 1650A 1981, U.S. Games/Tandy 2-Player Football - *192 1650 19??, phone dialer (have dump) - *255 1655 19??, talking clock (have dump) - *518 1650A 19??, GI Teleview Control Chip (features differ per program) - *519 1650A 19??, " - *532 1650A 19??, " - *533 1650A 19??, " - *536 1650 1982, GI Teleview Autodialer/Terminal Identifier - - (* means undumped unless noted, @ denotes it's in this driver) - -ROM source notes when dumped from another publisher, but confident it's the same: -- drdunk: Tandy Electronic Basketball -- flash: Radio Shack Sound Effects Chassis -- hccbaskb: Sears Electronic Basketball -- us2pfball: Tandy 2-Player Football -- uspbball: Tandy 2-Player Baseball - -TODO: -- tweak MCU frequency for games when video/audio recording surfaces(YouTube etc.) -- ttfball: discrete sound part, for volume gating? -- what's the relation between drdunk and hccbaskb? Probably made by the same - Hong Kong subcontractor? I presume Toytronic. -- uspbball and pabball internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/pic16c5x/pic16c5x.h" -#include "video/pwm.h" -#include "machine/clock.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "drdunk.lh" -#include "flash.lh" // clickable -#include "hccbaskb.lh" -#include "leboom.lh" // clickable -#include "maniac.lh" // clickable -#include "melodym.lh" // clickable -#include "matchme.lh" // clickable -#include "rockpin.lh" -#include "touchme.lh" // clickable -#include "ttfball.lh" -#include "us2pfball.lh" - -#include "hh_pic16_test.lh" // common test-layout - use external artwork - - -class hh_pic16_state : public driver_device -{ -public: - hh_pic16_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_a = 0; // MCU port A write data - u8 m_b = 0; // " B - u8 m_c = 0; // " C - u8 m_d = 0; // " D - u16 m_inp_mux = ~0; // multiplexed inputs mask - - u16 read_inputs(int columns, u16 colmask = ~0); - u8 read_rotated_inputs(int columns, u8 rowmask = ~0); -}; - - -// machine start/reset - -void hh_pic16_state::machine_start() -{ - // register for savestates - save_item(NAME(m_a)); - save_item(NAME(m_b)); - save_item(NAME(m_c)); - save_item(NAME(m_d)); - save_item(NAME(m_inp_mux)); -} - -void hh_pic16_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u16 hh_pic16_state::read_inputs(int columns, u16 colmask) -{ - // active low - u16 ret = ~0 & colmask; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (~m_inp_mux >> i & 1) - ret &= m_inputs[i]->read(); - - return ret; -} - -u8 hh_pic16_state::read_rotated_inputs(int columns, u8 rowmask) -{ - u8 ret = 0; - u16 colmask = (1 << columns) - 1; - - // read selected input columns - for (int i = 0; i < 8; i++) - if (1 << i & rowmask && ~m_inputs[i]->read() & ~m_inp_mux & colmask) - ret |= 1 << i; - - // active low - return ~ret & rowmask; -} - -INPUT_CHANGED_MEMBER(hh_pic16_state::reset_button) -{ - // when an input is directly wired to MCU MCLR pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Atari Touch Me - * PIC 1655A-053 - * 2 7seg LEDs + 4 other LEDs, 1-bit sound - - This is the handheld version of the 1974 arcade game. - - known revisions: - - Model BH-100 GI C013233 Rev 2 Atari W 1979: PIC 1655A-053 - - Model BH-100 C013150 Rev 6 Atari 1979: AMI C10745 (custom ASIC) - -***************************************************************************/ - -class touchme_state : public hh_pic16_state -{ -public: - touchme_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void touchme(machine_config &config); - -private: - void update_display(); - void update_speaker(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void touchme_state::update_display() -{ - m_display->matrix(~m_b & 0x7b, m_c); -} - -void touchme_state::update_speaker() -{ - m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); -} - -u8 touchme_state::read_a() -{ - // A: multiplexed inputs - return read_inputs(3, 0xf); -} - -void touchme_state::write_b(u8 data) -{ - // B0-B2: input mux - m_inp_mux = data & 7; - - // B0,B1: digit select - // B3-B6: leds - m_b = data; - update_display(); - - // B7: speaker lead 1 - update_speaker(); -} - -void touchme_state::write_c(u8 data) -{ - // C0-C6: digit segments - m_c = data; - update_display(); - - // C7: speaker lead 2 - update_speaker(); -} - -// config - -static INPUT_PORTS_START( touchme ) - PORT_START("IN.0") // B0 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("High") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("Skill") - - PORT_START("IN.1") // B1 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Blue Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Green Button") - - PORT_START("IN.2") // B2 port A - PORT_CONFNAME( 0x07, 0x01^0x07, "Game Select" ) - PORT_CONFSETTING( 0x01^0x07, "1" ) - PORT_CONFSETTING( 0x02^0x07, "2" ) - PORT_CONFSETTING( 0x04^0x07, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void touchme_state::touchme(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 300000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->read_a().set(FUNC(touchme_state::read_a)); - m_maincpu->write_b().set(FUNC(touchme_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(touchme_state::write_c)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 300000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_touchme); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( touchme ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-053", 0x0000, 0x0400, CRC(f0858f0a) SHA1(53ffe111d43db1c110847590350ef62f02ed5e0e) ) -ROM_END - - - - - -/*************************************************************************** - - Caprice Pro-Action Baseball (manufactured by Calfax) - * PIC 1655A-043 - * 1 7seg LED + 36 other LEDs, CD4028, 1-bit sound - -***************************************************************************/ - -class pabball_state : public hh_pic16_state -{ -public: - pabball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void pabball(machine_config &config); - -private: - void update_display(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void pabball_state::update_display() -{ - // CD4028 BCD to decimal decoder - // CD4028 0-8: led select, 9: 7seg - u16 sel = m_c & 0xf; - if (sel & 8) sel &= 9; - sel = 1 << sel; - - m_display->matrix(sel, m_b); -} - -void pabball_state::write_b(u8 data) -{ - // B: led data - m_b = ~data; - update_display(); -} - -void pabball_state::write_c(u8 data) -{ - // C2: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 2 & 1); - - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C3: CD4028 A-D - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( pabball ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Straight") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port C - PORT_BIT( 0xcf, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Hit") - PORT_CONFNAME( 0x20, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x20, "2" ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pic16_state, reset_button, 0) PORT_NAME("P1 Reset") -INPUT_PORTS_END - -void pabball_state::pabball(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1200000); // approximation - RC osc. R=18K, C=27pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(pabball_state::write_b)); - m_maincpu->read_c().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(pabball_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x200, 0xff); - config.set_default_layout(layout_hh_pic16_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( pabball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-043", 0x0000, 0x0400, CRC(43c9b765) SHA1(888a431bab9bcb241c14f33f70863fa2ad89c96b) ) -ROM_END - - - - - -/*************************************************************************** - - GAF Melody Madness - * PIC 1655A-094 - * 2 lamps under tube, 1-bit sound - - Melody Madness is a tabletop music memory game, shaped like a jukebox. - It can also be played as a simple electronic piano. - -***************************************************************************/ - -class melodym_state : public hh_pic16_state -{ -public: - melodym_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void melodym(machine_config &config); - -private: - void write_b(u8 data); - u8 read_c(); - void write_c(u8 data); -}; - -// handlers - -void melodym_state::write_b(u8 data) -{ - // B2-B6: input mux - m_inp_mux = data >> 2 & 0x1f; -} - -u8 melodym_state::read_c() -{ - // C0-C4: multiplexed inputs - return read_inputs(5, 0x1f) | 0xe0; -} - -void melodym_state::write_c(u8 data) -{ - // C6: both lamps - m_display->matrix(1, ~data >> 6 & 1); - - // C7: speaker out - m_speaker->level_w(~data >> 7 & 1); -} - -// config - -static INPUT_PORTS_START( melodym ) - PORT_START("IN.0") // B2 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") - - PORT_START("IN.1") // B3 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 6") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 8") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 9") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Button 10") - - PORT_START("IN.2") // B4 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 11") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 12") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // there is no button 13 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 14") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Button 15") - - PORT_START("IN.3") // B5 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 16") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 17") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 18") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 19") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button 20") - - PORT_START("IN.4") // B6 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Button 21") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Button 22") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Button 23") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Button 24") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Button 25") - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Novice") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Whiz") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Pro") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Note") -INPUT_PORTS_END - -void melodym_state::melodym(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - m_maincpu->read_a().set_ioport("IN.5"); - m_maincpu->write_b().set(FUNC(melodym_state::write_b)); - m_maincpu->read_c().set(FUNC(melodym_state::read_c)); - m_maincpu->write_c().set(FUNC(melodym_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - m_display->set_bri_levels(0.9); - config.set_default_layout(layout_melodym); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( melodym ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-094", 0x0000, 0x0400, CRC(6d35bd7b) SHA1(20e326085878f69a9d4ef1651ef4443f27188567) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Maniac, by Ralph Baer - * PIC 1655A-036 - * 2 7seg LEDs, 1-bit sound - - Maniac is a reflex game for 2-4 players. There are 4 challenges: - 1: Musical Maniac: Press the button as soon as the music stops. - 2: Sounds Abound: Count the number of tones in the song, then press the button - after the same amount of beeps. - 3: Look Twice: Press the button after the game repeats the first pattern. - 4: Your Time Is Up: Press the button after estimating the duration of the tone. - -***************************************************************************/ - -class maniac_state : public hh_pic16_state -{ -public: - maniac_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void maniac(machine_config &config); - -private: - void update_display(); - void update_speaker(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void maniac_state::update_display() -{ - m_display->write_row(0, ~m_b & 0x7f); - m_display->write_row(1, ~m_c & 0x7f); -} - -void maniac_state::update_speaker() -{ - m_speaker->level_w((m_b >> 7 & 1) | (m_c >> 6 & 2)); -} - -void maniac_state::write_b(u8 data) -{ - // B0-B6: left 7seg - m_b = data; - update_display(); - - // B7: speaker lead 1 - update_speaker(); -} - -void maniac_state::write_c(u8 data) -{ - // C0-C6: right 7seg - m_c = data; - update_display(); - - // C7: speaker lead 2 - update_speaker(); -} - -// config - -static INPUT_PORTS_START( maniac ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) // top button, increment clockwise - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) -INPUT_PORTS_END - -void maniac_state::maniac(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - RC osc. R=~13.4K, C=470pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(maniac_state::write_b)); - m_maincpu->write_c().set(FUNC(maniac_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_maniac); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( maniac ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-036", 0x0000, 0x0400, CRC(a96f7011) SHA1(e97ae44d3c1e74c7e1024bb0bdab03eecdc9f827) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Flash - * PCB label 25-600321, REV C, TCI-A3H / 94HB - * PIC 1655A-078 - * 2 7seg LEDs + 8 other LEDs, 1-bit sound with volume decay - - Flash is a wall-mounted game, players throw beanbags to activate the buttons. - It's described in patent US4333657 as an electronic dart game. - - BTANB: In games 4 and 5 it's easy to lock up the program by pressing the - buttons repeatedly and causing a score overflow. Although that wouldn't be - possible by properly throwing beanbags at it. This bug is warned about in - the manual. - - This could also be purchased as a bare PCB from Radio Shack under the Archer - brand, catalog number 277-1013. It was named "Sound Effects Chassis" but - clearly it's nothing like that. The instruction leaflet that came with the - PCB says to attach a speaker and a 9V power source. It actually takes 5V, - 9V would break it. The only thing it has to say about the game itself is - "Your module will produce blinking lights and several different sounds." - -***************************************************************************/ - -class flash_state : public hh_pic16_state -{ -public: - flash_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void flash(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - void update_display(); - void write_b(u8 data); - u8 read_c(); - void write_c(u8 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void flash_state::machine_start() -{ - hh_pic16_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void flash_state::speaker_update() -{ - if (~m_b & 0x40) - m_speaker_volume = 50.0; - - // it takes a bit before it actually starts fading - m_volume->flt_volume_set_volume(std::min(m_speaker_volume, 1.0)); -} - -TIMER_DEVICE_CALLBACK_MEMBER(flash_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.0075; -} - -void flash_state::update_display() -{ - m_display->matrix(~m_b >> 4 & 3, (~m_c >> 1 & 0x7f) | (~m_b << 7 & 0x780)); -} - -void flash_state::write_b(u8 data) -{ - // B0-B3: led data - // B4,B5: led select - m_b = data; - update_display(); - - // B7: speaker out - m_speaker->level_w(BIT(data, 7)); - - // B6: speaker on - speaker_update(); -} - -u8 flash_state::read_c() -{ - // C1-C7: buttons - return (m_c & 1) ? 0xff : m_inputs[1]->read(); -} - -void flash_state::write_c(u8 data) -{ - // C0: enable buttons - // C1-C7: digit segments - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( flash ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // top button, increment clockwise - PORT_BIT( 0x0e, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.1") // port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) -INPUT_PORTS_END - -void flash_state::flash(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1050000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_b().set(FUNC(flash_state::write_b)); - m_maincpu->read_c().set(FUNC(flash_state::read_c)); - m_maincpu->write_c().set(FUNC(flash_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 7+4); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_flash); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(flash_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( flash ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-078", 0x0000, 0x0400, CRC(bf780733) SHA1(57ac4620d87492280ab8cf69c148f98e38ecedc4) ) -ROM_END - - - - - -/*************************************************************************** - - Kingsford Match Me - * PIC 1655A-049 - * 8 lamps, 1-bit sound - - Known releases: - - USA(1): Match Me/Mini Match Me, published by Kingsford - - USA(2): Me Too, published by Talbot - - Hong Kong: Gotcha!/Encore/Follow Me, published by Toytronic - - Match Me is the tabletop version, Mini Match Me is the handheld. - The original is probably by Toytronic, Kingsford's version being licensed from them. - - Known revisions: - - PIC 1655A-049 (this one, dumped from a Mini Match Me) - - PIC 1655A-123 (seen in Match Me and Mini Match Me) - -***************************************************************************/ - -class matchme_state : public hh_pic16_state -{ -public: - matchme_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void matchme(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void write_b(u8 data); - void write_c(u8 data); - u8 read_c(); -}; - -void matchme_state::machine_reset() -{ - hh_pic16_state::machine_reset(); - set_clock(); -} - -// handlers - -void matchme_state::set_clock() -{ - // MCU clock is ~1.2MHz by default (R=18K, C=15pF), high speed setting adds a - // 10pF cap to speed it up by about 7.5%. - m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 1300000 : 1200000); -} - -void matchme_state::write_b(u8 data) -{ - // B0-B7: lamps - m_display->matrix(1, data); -} - -u8 matchme_state::read_c() -{ - // C0-C3: multiplexed inputs from C4-C6 - m_inp_mux = m_c >> 4 & 7; - u8 lo = read_inputs(3, 0xf); - - // C4-C6: multiplexed inputs from C0-C3 - m_inp_mux = m_c & 0xf; - u8 hi = read_rotated_inputs(4, 7); - - return lo | hi << 4 | 0x80; -} - -void matchme_state::write_c(u8 data) -{ - // C0-C6: input mux - m_c = data; - - // C7: speaker out + RTCC pin - m_speaker->level_w(data >> 7 & 1); - m_maincpu->set_input_line(PIC16C5x_RTCC, data >> 7 & 1); -} - -// config - -static INPUT_PORTS_START( matchme ) - PORT_START("IN.0") // C4 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // purple - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pink - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // yellow - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // blue - - PORT_START("IN.1") // C5 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON5 ) // red - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON6 ) // cyan - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON7 ) // orange - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON8 ) // green - - PORT_START("IN.2") // C6 port C - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START ) - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, EQUALS, 0x03) // Last/Auto - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON10 ) PORT_NAME("Long") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.3") // port A - PORT_CONFNAME( 0x07, 0x00^0x07, "Game" ) - PORT_CONFSETTING( 0x00^0x07, "1" ) - PORT_CONFSETTING( 0x01^0x07, "2" ) - PORT_CONFSETTING( 0x02^0x07, "3" ) - PORT_CONFSETTING( 0x04^0x07, "4" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "Amateur" ) // AM - PORT_CONFSETTING( 0x00, "Professional" ) // PRO - - PORT_START("IN.4") // another fake - PORT_CONFNAME( 0x01, 0x00, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, matchme_state, speed_switch, 0) - PORT_CONFSETTING( 0x00, DEF_STR( Low ) ) - PORT_CONFSETTING( 0x01, DEF_STR( High ) ) - - PORT_START("FAKE") // Last/Auto are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON9 ) PORT_NAME("Last") - PORT_CONFNAME( 0x02, 0x02, "Music" ) - PORT_CONFSETTING( 0x02, "Manual" ) - PORT_CONFSETTING( 0x00, "Auto" ) -INPUT_PORTS_END - -void matchme_state::matchme(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1200000); // see set_clock - m_maincpu->read_a().set_ioport("IN.3"); - m_maincpu->write_b().set(FUNC(matchme_state::write_b)); - m_maincpu->read_c().set(FUNC(matchme_state::read_c)); - m_maincpu->write_c().set(FUNC(matchme_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 8); - config.set_default_layout(layout_matchme); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( matchme ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-049", 0x0000, 0x0400, CRC(fa3f4805) SHA1(57cbac18baa201927e99cd69cc2ffda4d2e642bb) ) -ROM_END - - - - - -/*************************************************************************** - - Kmart Dr. Dunk (manufactured in Hong Kong) - * PIC 1655A-51 - * 2 7seg LEDs + 21 other LEDs, 1-bit sound - - It is a clone of Mattel Basketball, but at lower speed. - The ROM is nearly identical to hccbaskb, the housing/overlay is similar to - U.S. Games/Tandy Trick Shot Basketball. - - known releases: - - USA(1): Dr. Dunk, published by Kmart - - USA(2): Electronic Basketball (model 60-2146), published by Tandy - -***************************************************************************/ - -class drdunk_state : public hh_pic16_state -{ -public: - drdunk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void drdunk(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void drdunk_state::update_display() -{ - m_display->matrix(m_b, m_c); -} - -u8 drdunk_state::read_a() -{ - // A2: skill switch, A3: multiplexed inputs - return m_inputs[5]->read() | read_inputs(5, 8) | 3; -} - -void drdunk_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0-B4: input mux - m_inp_mux = ~data & 0x1f; - - // B0-B3: led select - // B4,B5: digit select - m_b = data; - update_display(); -} - -void drdunk_state::write_c(u8 data) -{ - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C6: led data - m_c = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( drdunk ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // B2 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // B4 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) - - PORT_START("IN.5") // port A2 - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void drdunk_state::drdunk(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=18K, C=47pF - m_maincpu->read_a().set(FUNC(drdunk_state::read_a)); - m_maincpu->write_b().set(FUNC(drdunk_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(drdunk_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 7); - m_display->set_segmask(0x30, 0x7f); - m_display->set_bri_levels(0.01, 0.2); // player led is brighter - config.set_default_layout(layout_drdunk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( drdunk ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-051", 0x0000, 0x0400, CRC(92534b40) SHA1(7055e32846c913e68f7d35f279cd537f6325f4f2) ) -ROM_END - - - - - -/*************************************************************************** - - Lakeside Le Boom - * PIC 1655A-061 - * 1 led, 1-bit sound with RC circuit for volume decay - - This is a tabletop timebomb defusion game. It's shaped like an aerial bomb, - colored black on USA version, yellow on dual-language Canadian version. - The game starts 'ticking' when the player opens the keypad door. To begin, - select the game mode, rows(keypad size), and fuse duration. - - Game modes as described on the box: - 1: Eliminate the buttons one by one in the order set out by the computer. Press - one twice and you'll be sorry! - 2: For 2 or more players. Take turns pressing the buttons, remember which ones. - Press a button a second time and watch out, it's all over. - 3: The computer picks one secret button that stops the fuse. You must press it - on your 5th turn. Listen to the clues and you'll do fine. - 4: The computer picks a secret combination. Find it first by listening to the - clues. Find the right order and you'll get it to fizzle out. - -***************************************************************************/ - -class leboom_state : public hh_pic16_state -{ -public: - leboom_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag), - m_volume(*this, "volume") - { } - - void leboom(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void leboom_state::machine_start() -{ - hh_pic16_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -void leboom_state::speaker_update() -{ - if (~m_c & 0x80) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(leboom_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.005; -} - -u8 leboom_state::read_a() -{ - // A: multiplexed inputs - return read_inputs(6, 0xf); -} - -void leboom_state::write_b(u8 data) -{ - // B0-B5: input mux - m_inp_mux = data & 0x3f; -} - -void leboom_state::write_c(u8 data) -{ - // C4: single led - m_display->matrix(1, BIT(data, 4)); - - // C6: speaker out - m_speaker->level_w(BIT(data, 6)); - - // C7: speaker on - m_c = data; - speaker_update(); -} - -// config - -static INPUT_PORTS_START( leboom ) - PORT_START("IN.0") // B0 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Red Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Red Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Red Button 4") - - PORT_START("IN.1") // B1 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Red-Red Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Red-Green Button") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Red-Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Red-Blue Button") - - PORT_START("IN.2") // B2 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Shortest") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Short") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Long") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Longest") - - PORT_START("IN.3") // B3 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Yellow Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Yellow Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Yellow Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Yellow Button 4") - - PORT_START("IN.4") // B4 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Blue Button 1") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Blue Button 2") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Blue Button 3") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Blue Button 4") - - PORT_START("IN.5") // B5 port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Blue Button 5") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Blue Button 6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Blue Button 7") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Blue Button 8") -INPUT_PORTS_END - -void leboom_state::leboom(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 1000000); // approximation - m_maincpu->read_a().set(FUNC(leboom_state::read_a)); - m_maincpu->write_b().set(FUNC(leboom_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(leboom_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_leboom); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(leboom_state::speaker_decay_sim), attotime::from_msec(5)); -} - -// roms - -ROM_START( leboom ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-061", 0x0000, 0x0400, CRC(5880eea1) SHA1(e3795b347fd5df9de084da36e33f6b70fbc0b0ae) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Rocket Pinball (model 7-460) - * PIC 1650A-110, 69-11397 - * 3 7seg LEDs + 44 other LEDs, 1-bit sound - - known releases: - - Hong Kong(1): Rocket Pinball, published by Tiger - - Hong Kong(2): Spaceship Pinball, published by Toytronic - - USA(1): Rocket Pinball (model 60-2140), published by Tandy - - USA(2): Cosmic Pinball (model 49-65456), published by Sears - -***************************************************************************/ - -class rockpin_state : public hh_pic16_state -{ -public: - rockpin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void rockpin(machine_config &config); - -private: - void update_display(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void rockpin_state::update_display() -{ - // 3 7seg leds from ports A and B - m_display->matrix_partial(0, 3, m_a, m_b); - - // 44 leds from ports C and D - m_display->matrix_partial(3, 6, m_d, m_c); -} - -void rockpin_state::write_a(u8 data) -{ - // A3,A4: speaker out - m_speaker->level_w(data >> 3 & 3); - - // A0-A2: select digit - m_a = ~data & 7; - update_display(); -} - -void rockpin_state::write_b(u8 data) -{ - // B0-B6: digit segments - m_b = data & 0x7f; - update_display(); -} - -void rockpin_state::write_c(u8 data) -{ - // C0-C7: led data - m_c = ~data; - update_display(); -} - -void rockpin_state::write_d(u8 data) -{ - // D0-D5: led select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( rockpin ) - PORT_START("IN.0") // port A - PORT_BIT( 0x1f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Ball") -INPUT_PORTS_END - -void rockpin_state::rockpin(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_a().set(FUNC(rockpin_state::write_a)); - m_maincpu->read_b().set_constant(0xff); - m_maincpu->write_b().set(FUNC(rockpin_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(rockpin_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(rockpin_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 450000/4).signal_handler().set_inputline(m_maincpu, PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3+6, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_rockpin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( rockpin ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-110_69-11397", 0x0000, 0x0400, CRC(d5396e77) SHA1(952feaff70fde53a9eda84c54704520d50749e78) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Half Court Computer Basketball (model 7-470) - * PIC 1655A(no serial), 69-11557 - * 2 7seg LEDs + 26 other LEDs, 1-bit sound - - known releases: - - Hong Kong: Half Court Computer Basketball, published by Tiger - - USA: Electronic Basketball (model 49-65453), published by Sears - -***************************************************************************/ - -class hccbaskb_state : public hh_pic16_state -{ -public: - hccbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void hccbaskb(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void hccbaskb_state::update_display() -{ - m_display->matrix(m_b, m_c); -} - -u8 hccbaskb_state::read_a() -{ - // A2: skill switch, A3: multiplexed inputs - return m_inputs[5]->read() | read_inputs(5, 8) | 3; -} - -void hccbaskb_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0-B4: input mux - m_inp_mux = ~data & 0x1f; - - // B7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // B0-B4: led select - // B5,B6: digit select - m_b = data; - update_display(); -} - -void hccbaskb_state::write_c(u8 data) -{ - // C0-C6: led data - m_c = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( hccbaskb ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // B2 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // B4 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) - - PORT_START("IN.5") // port A2 - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void hccbaskb_state::hccbaskb(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 800000); // approximation - RC osc. R=15K, C=47pF - m_maincpu->read_a().set(FUNC(hccbaskb_state::read_a)); - m_maincpu->write_b().set(FUNC(hccbaskb_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(hccbaskb_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x60, 0x7f); - m_display->set_bri_levels(0.01, 0.2); // player led is brighter - config.set_default_layout(layout_hccbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( hccbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "69-11557", 0x0000, 0x0400, CRC(56e81079) SHA1(1933f87f82c4c53f953534dba7757c9afc52d5bc) ) -ROM_END - - - - - -/*************************************************************************** - - Toytronic Football (set 1) - * PIC 1655A-033 - * 4511 7seg BCD decoder, 7 7seg LEDs + 27 other LEDs, 1-bit sound - - (no brand) Football (set 2) - * PIC 1655-024 - * rest same as above, 1 less button - - Hello and welcome to another Mattel Football clone, there are so many of these. - The 1655-024 one came from an unbranded handheld, but comparison suggests that - it's the 'prequel' of 1655A-033. - - The 1655-024 version looks and sounds the same as Conic "Electronic Football". - -***************************************************************************/ - -class ttfball_state : public hh_pic16_state -{ -public: - ttfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void ttfball(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_b(u8 data); - void write_c(u8 data); -}; - -// handlers - -void ttfball_state::update_display() -{ - // C0-C2: led data - // C0-C3: 4511 A-D, C4: digit segment DP - // C5: select digits or led matrix - const u8 _4511_map[16] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0,0,0,0,0,0 }; - u16 led_data = (m_c & 0x20) ? (_4511_map[m_c & 0xf] | (~m_c << 3 & 0x80)) : (~m_c << 8 & 0x700); - - m_display->matrix(m_b | (m_c << 1 & 0x100), led_data); -} - -u8 ttfball_state::read_a() -{ - // A3: multiplexed inputs, A0-A2: other inputs - return m_inputs[5]->read() | read_inputs(5, 8); -} - -void ttfball_state::write_b(u8 data) -{ - // B0: RTCC pin - m_maincpu->set_input_line(PIC16C5x_RTCC, data & 1); - - // B0,B1,B3,B7: input mux low - m_inp_mux = (m_inp_mux & 0x10) | (~data & 3) | (~data >> 1 & 4) | (~data >> 4 & 8); - - // B0-B7: led select (see above) - m_b = data; - update_display(); -} - -void ttfball_state::write_c(u8 data) -{ - // C6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // C7: input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); - - // C0-C7: led data/select (see above) - m_c = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( ttfball ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.2") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.3") // B7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.4") // C7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick") - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -static INPUT_PORTS_START( ttfballa ) - PORT_START("IN.0") // B0 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.1") // B1 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Forward") - - PORT_START("IN.2") // B3 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.3") // B7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.4") // C7 port A3 - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START("IN.5") // port A - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Score") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void ttfball_state::ttfball(machine_config &config) -{ - // basic machine hardware - PIC1655(config, m_maincpu, 600000); // approximation - RC osc. R=27K(set 1) or 33K(set 2), C=68pF - m_maincpu->read_a().set(FUNC(ttfball_state::read_a)); - m_maincpu->write_b().set(FUNC(ttfball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(ttfball_state::write_c)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x7f, 0xff); - m_display->set_bri_levels(0.003, 0.03); // player led is brighter - config.set_default_layout(layout_ttfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ttfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655a-033", 0x0000, 0x0400, CRC(2b500501) SHA1(f7fe464663c56e2181a31a1dc5f1f5239df57bed) ) -ROM_END - -ROM_START( ttfballa ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1655-024", 0x0000, 0x0400, CRC(9091102f) SHA1(ef72759f20b5a99e0366863caad1e26be114263f) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Programmable Baseball - * PIC 1650A-133 - * 3 7seg LEDs + 36 other LEDs, 1-bit sound - - known releases: - - USA(1): Programmable Baseball, published by U.S. Games - - USA(2): Electronic 2-Player Baseball (model 60-2157), published by Tandy - -***************************************************************************/ - -class uspbball_state : public hh_pic16_state -{ -public: - uspbball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void uspbball(machine_config &config); - -private: - void update_display(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void uspbball_state::update_display() -{ - m_display->matrix(m_d, m_c << 8 | m_b); -} - -void uspbball_state::write_a(u8 data) -{ - // A0: speaker out - m_speaker->level_w(data & 1); -} - -void uspbball_state::write_b(u8 data) -{ - // B: digit segment data - m_b = bitswap<8>(data,0,1,2,3,4,5,6,7); - update_display(); -} - -void uspbball_state::write_c(u8 data) -{ - // C: led data - m_c = ~data; - update_display(); -} - -void uspbball_state::write_d(u8 data) -{ - // D0-D2: digit select - // D3-D5: led select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( uspbball ) - PORT_START("IN.0") // port A - PORT_BIT( 0x03, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Fast") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Change Up/Fielder") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - - PORT_START("IN.1") // port D - PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_CONFNAME( 0x80, 0x80, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x80, "1" ) - PORT_CONFSETTING( 0x00, "2" ) -INPUT_PORTS_END - -void uspbball_state::uspbball(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 900000); // approximation - RC osc. R=22K, C=47pF - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_a().set(FUNC(uspbball_state::write_a)); - m_maincpu->read_b().set_constant(0xff); - m_maincpu->write_b().set(FUNC(uspbball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(uspbball_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(uspbball_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 900000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6, 16); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_hh_pic16_test); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( uspbball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-133", 0x0000, 0x0400, CRC(479e98be) SHA1(67437177b059dfa6e01940da26daf997cec96ead) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Electronic 2-Player Football - * PIC 1650A-144 - * 8 7seg LEDs + 2 other LEDs, 1-bit sound - - known releases: - - USA(1): Electronic 2-Player Football, published by U.S. Games - - USA(2): Electronic 2-Player Football (model 60-2156), published by Tandy - -***************************************************************************/ - -class us2pfball_state : public hh_pic16_state -{ -public: - us2pfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pic16_state(mconfig, type, tag) - { } - - void us2pfball(machine_config &config); - -private: - void update_display(); - u8 read_a(); - void write_a(u8 data); - void write_b(u8 data); - void write_c(u8 data); - void write_d(u8 data); -}; - -// handlers - -void us2pfball_state::update_display() -{ - m_display->matrix(m_d | (m_a << 6 & 0x300), m_c); -} - -u8 us2pfball_state::read_a() -{ - // A0,A1: multiplexed inputs, A4-A7: other inputs - return read_inputs(4, 3) | (m_inputs[4]->read() & 0xf0) | 0x0c; -} - -void us2pfball_state::write_a(u8 data) -{ - // A2,A3: leds - m_a = data; - update_display(); -} - -void us2pfball_state::write_b(u8 data) -{ - // B0-B3: input mux - m_inp_mux = data & 0xf; -} - -void us2pfball_state::write_c(u8 data) -{ - // C7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // C0-C6: digit segments - m_c = data; - update_display(); -} - -void us2pfball_state::write_d(u8 data) -{ - // D0-D7: digit select - m_d = ~data; - update_display(); -} - -// config - -static INPUT_PORTS_START( us2pfball ) - PORT_START("IN.0") // B0 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.1") // B1 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.2") // B2 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.3") // B3 port A low - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY - - PORT_START("IN.4") // port A high - PORT_CONFNAME( 0x10, 0x10, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x10, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x20, "1" ) // college - PORT_CONFSETTING( 0x00, "2" ) // pro - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") // K/P - - PORT_START("IN.5") // port B - PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Status/Score") // S -INPUT_PORTS_END - -void us2pfball_state::us2pfball(machine_config &config) -{ - // basic machine hardware - PIC1650(config, m_maincpu, 800000); // approximation - RC osc. R=39K, C=75pF - m_maincpu->read_a().set(FUNC(us2pfball_state::read_a)); - m_maincpu->write_a().set(FUNC(us2pfball_state::write_a)); - m_maincpu->read_b().set_ioport("IN.5"); - m_maincpu->write_b().set(FUNC(us2pfball_state::write_b)); - m_maincpu->read_c().set_constant(0xff); - m_maincpu->write_c().set(FUNC(us2pfball_state::write_c)); - m_maincpu->read_d().set_constant(0xff); - m_maincpu->write_d().set(FUNC(us2pfball_state::write_d)); - - // PIC CLKOUT, tied to RTCC - CLOCK(config, "clock", 800000/4).signal_handler().set_inputline("maincpu", PIC16C5x_RTCC); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0xff, 0x7f); - m_display->set_bri_levels(0.01, 0.17); // player led is brighter - config.set_default_layout(layout_us2pfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( us2pfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "pic_1650a-144", 0x0000, 0x0400, CRC(ef3677c9) SHA1(33f89c79e7e090710681dffe09eddaf66b5cb794) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, touchme, 0, 0, touchme, touchme, touchme_state, empty_init, "Atari", "Touch Me (handheld, Rev 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, pabball, 0, 0, pabball, pabball, pabball_state, empty_init, "Caprice / Calfax", "Pro-Action Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) - -CONS( 1980, melodym, 0, 0, melodym, melodym, melodym_state, empty_init, "GAF", "Melody Madness", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, maniac, 0, 0, maniac, maniac, maniac_state, empty_init, "Ideal Toy Corporation", "Maniac", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, flash, 0, 0, flash, flash, flash_state, empty_init, "Ideal Toy Corporation", "Flash (Ideal)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1980, matchme, 0, 0, matchme, matchme, matchme_state, empty_init, "Kingsford", "Match Me", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, drdunk, 0, 0, drdunk, drdunk, drdunk_state, empty_init, "Kmart", "Dr. Dunk", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, leboom, 0, 0, leboom, leboom, leboom_state, empty_init, "Lakeside", "Le Boom", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, rockpin, 0, 0, rockpin, rockpin, rockpin_state, empty_init, "Tiger Electronics", "Rocket Pinball", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, hccbaskb, 0, 0, hccbaskb, hccbaskb, hccbaskb_state, empty_init, "Tiger Electronics", "Half Court Computer Basketball", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, ttfball, 0, 0, ttfball, ttfball, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -CONS( 1979, ttfballa, ttfball, 0, ttfball, ttfballa, ttfball_state, empty_init, "Toytronic", "Football (Toytronic, set 2)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1981, uspbball, 0, 0, uspbball, uspbball, uspbball_state, empty_init, "U.S. Games", "Programmable Baseball", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) -CONS( 1981, us2pfball, 0, 0, us2pfball, us2pfball, us2pfball_state, empty_init, "U.S. Games", "Electronic 2-Player Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_pps41.cpp b/src/mame/misc_handheld/hh_pps41.cpp deleted file mode 100644 index 2521f355b0d..00000000000 --- a/src/mame/misc_handheld/hh_pps41.cpp +++ /dev/null @@ -1,1617 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -Rockwell PPS-4/1 MCU series handhelds - -ROM source notes when dumped from another publisher, but confident it's the same: -- memoquiz: Mattel Mind Boggler - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/pps41/mm75.h" -#include "cpu/pps41/mm76.h" -#include "cpu/pps41/mm78.h" -#include "cpu/pps41/mm78la.h" -#include "video/pwm.h" -#include "sound/beep.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "brainbaf.lh" -#include "dunksunk.lh" -#include "ftri1.lh" -#include "horocomp.lh" -#include "mastmind.lh" -#include "memoquiz.lh" -#include "mfootb2.lh" -#include "mwcfootb.lh" -#include "rdqa.lh" -#include "scrabsen.lh" -#include "smastmind.lh" - -//#include "hh_pps41_test.lh" // common test-layout - use external artwork - - -class hh_pps41_state : public driver_device -{ -public: - hh_pps41_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override { update_int(); } - virtual void device_post_load() override { update_int(); } - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<11> m_inputs; // max 11 - - u16 m_inp_mux = 0; - u32 m_grid = 0; - u32 m_plate = 0; - - // MCU output pin state - u16 m_d = 0; - u16 m_r = 0; - - u8 read_inputs(int columns); - virtual void update_int() { ; } -}; - - -// machine start - -void hh_pps41_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); - save_item(NAME(m_d)); - save_item(NAME(m_r)); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_pps41_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -INPUT_CHANGED_MEMBER(hh_pps41_state::reset_button) -{ - // when an input is directly wired to MCU PO pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Fonas Tri-1 - * PCB label: CASSIA CA010-F - * MM78 MCU variant with 40 pins (no label, die label A7859) - * 4 7seg leds, 41 other leds, 1-bit sound - - The game only uses 1.5KB ROM and seems it doesn't use all the RAM either, - as if it was programmed for MM77L. - - Hold all 4 buttons at boot (not counting RESET) for a led test. - Cassia was Eric White/Ken Cohen's company, later named CXG, known for - their chess computers. - -***************************************************************************/ - -class ftri1_state : public hh_pps41_state -{ -public: - ftri1_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void ftri1(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); -}; - -// handlers - -void ftri1_state::update_display() -{ - m_display->matrix(m_d, bitswap<8>(~m_r, 0,7,6,5,4,3,2,1)); -} - -void ftri1_state::write_d(u16 data) -{ - // DIO0-DIO8: digit/led select - m_d = data; - update_display(); - - // DIO9: speaker out - m_speaker->level_w(BIT(data, 9)); -} - -void ftri1_state::write_r(u16 data) -{ - // RIO1-RIO8: digit/led data - m_r = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( ftri1 ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0c, 0x04, "Game Select" ) - PORT_CONFSETTING( 0x08, "Star Chase" ) - PORT_CONFSETTING( 0x04, "All Star Baseball" ) - PORT_CONFSETTING( 0x00, "Batting Champs" ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Score / S1 H") - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Steal / S1 V") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pitch / S2 H") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Swing / S2 V") - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_pps41_state, reset_button, 0) PORT_CODE(KEYCODE_F1) PORT_NAME("Game Reset") -INPUT_PORTS_END - -void ftri1_state::ftri1(machine_config &config) -{ - // basic machine hardware - MM78(config, m_maincpu, 300000); // approximation - VC osc. R=68K - m_maincpu->write_d().set(FUNC(ftri1_state::write_d)); - m_maincpu->write_r().set(FUNC(ftri1_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1e0, 0x7f); - config.set_default_layout(layout_ftri1); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ftri1 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "a7859", 0x0000, 0x0800, CRC(3c957f1d) SHA1(42db81a78bbef971a84e61a26d91f7411980d79c) ) -ROM_END - - - - - -/*************************************************************************** - - Invicta Electronic Master Mind - * MM75 MCU (label MM75 A7525-11, die label A7525) - * 9-digit 7seg VFD display (Futaba 9-ST) - - Invicta Super-Sonic Electronic Master Mind - * MM75 MCU (label A7539-12, die label A7539) - * same base hardware, added beeper - - Invicta Plastics is the owner of the Mastermind game rights. The back of the - Master Mind unit says (C) 1977, but this electronic handheld version came - out in 1979. Or maybe there's an older revision. - -***************************************************************************/ - -class mastmind_state : public hh_pps41_state -{ -public: - mastmind_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag), - m_beeper(*this, "beeper") - { } - - void mastmind(machine_config &config); - void smastmind(machine_config &config); - -private: - optional_device m_beeper; - - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void mastmind_state::update_display() -{ - m_display->matrix(m_inp_mux, ~m_r); -} - -void mastmind_state::write_d(u16 data) -{ - // DIO0-DIO7: digit select (DIO7 N/C on mastmind) - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8: beeper on smastmind - if (m_beeper) - m_beeper->set_state(BIT(data, 8)); -} - -void mastmind_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 mastmind_state::read_p() -{ - // PI1-PI4: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( mastmind ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Try") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fail") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test on mastmind? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") -INPUT_PORTS_END - -void mastmind_state::mastmind(machine_config &config) -{ - // basic machine hardware - MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mastmind_state::write_d)); - m_maincpu->write_r().set(FUNC(mastmind_state::write_r)); - m_maincpu->read_p().set(FUNC(mastmind_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_mastmind); - - // no sound! -} - -void mastmind_state::smastmind(machine_config &config) -{ - mastmind(config); - - config.set_default_layout(layout_smastmind); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2400); // approximation - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mastmind ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "mm75_a7525-11", 0x0000, 0x0200, CRC(39dbdd50) SHA1(72fa5781e9df62d91d57437ded2931fab8253c3c) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_mastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) -ROM_END - -ROM_START( smastmind ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a7539-12", 0x0000, 0x0200, CRC(b63c453f) SHA1(f47a540fd90eed7514ed03864be2121f641c1154) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_smastmind_output.pla", 0, 314, CRC(c936aee7) SHA1(e9ec08a82493d6b63e936f82deeab3e4449b54c3) ) -ROM_END - - - - - -/*************************************************************************** - - Kmart Dunk 'n Sunk (manufactured in Hong Kong) - * MM76EL MCU (label GE-E 1V2280, die label B8617) - * 4 7seg leds, 31 other leds, 1-bit sound - - It's by the same Hong Kong company that did Kmart Dr. Dunk/Tandy Electronic - Basketball (PIC16 MCU), Grandstand Pocket Match of the Day (MOS MPS765x MCU) - among others. - - known releases: - - USA(1): Dunk 'n Sunk, published by Kmart - - USA(2): Electronic Basketball / Submarine Warfare, published by U.S. Games - -***************************************************************************/ - -class dunksunk_state : public hh_pps41_state -{ -public: - dunksunk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void dunksunk(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { update_int(); } - DECLARE_INPUT_CHANGED_MEMBER(game_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); -}; - -// handlers - -void dunksunk_state::update_int() -{ - // 2 of the switches are tied to MCU interrupt pins - m_maincpu->set_input_line(0, (m_inputs[1]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); - m_maincpu->set_input_line(1, (m_inputs[2]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void dunksunk_state::update_display() -{ - m_display->matrix(m_d >> 1, ~m_r); -} - -void dunksunk_state::write_d(u16 data) -{ - // DIO0: speaker out - m_speaker->level_w(data & 1); - - // DIO1-DIO5: led select - // DIO6-DIO9: digit select - m_d = data; - update_display(); -} - -void dunksunk_state::write_r(u16 data) -{ - // RIO1-RIO7: led data - m_r = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( dunksunk ) - PORT_START("IN.0") // PI - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x03, EQUALS, 0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, difficulty_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // INT0 - PORT_CONFSETTING( 0x01, "2" ) // PI4 - PORT_CONFSETTING( 0x03, "3" ) - - PORT_START("IN.2") // INT1 - PORT_CONFNAME( 0x01, 0x01, "Game Select" ) PORT_CHANGED_MEMBER(DEVICE_SELF, dunksunk_state, game_switch, 0) - PORT_CONFSETTING( 0x01, "Basketball" ) - PORT_CONFSETTING( 0x00, "Submarine Chase" ) -INPUT_PORTS_END - -void dunksunk_state::dunksunk(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 390000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(dunksunk_state::write_d)); - m_maincpu->write_r().set(FUNC(dunksunk_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1e0, 0x7f); - m_display->set_bri_levels(0.015, 0.2); // player led is brighter - config.set_default_layout(layout_dunksunk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( dunksunk ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "ge-e_1v2280", 0x0000, 0x0400, CRC(90f17191) SHA1(80c3708af99c9db7afe17254fa4df2080aa9f145) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_dunksunk_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) -ROM_END - - - - - -/*************************************************************************** - - M.E.M. Belgium Memoquiz - * PCB label: MEMOQUIZ MO3 - * MM75 MCU (label M7505 A7505-12, die label A7505) - * 9-digit 7seg VFD display, no sound - - It's a Mastermind game, not as straightforward as Invicta's version. - To start, press the "?" button to generate a new code, then try to guess it, - confirming with the "=" button. CD reveals the answer, PE is for player entry. - - known releases: - - Europe: Memoquiz, published by M.E.M. Belgium - - UK: Memoquiz, published by Polymark - - USA: Mind Boggler (model 2626), published by Mattel - -***************************************************************************/ - -class memoquiz_state : public hh_pps41_state -{ -public: - memoquiz_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void memoquiz(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(digits_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void memoquiz_state::update_int() -{ - // digits switch is tied to MCU interrupt pins - u8 inp = m_inputs[4]->read(); - m_maincpu->set_input_line(0, (inp & 1) ? CLEAR_LINE : ASSERT_LINE); - m_maincpu->set_input_line(1, (inp & 2) ? ASSERT_LINE : CLEAR_LINE); -} - -void memoquiz_state::update_display() -{ - m_display->matrix(m_inp_mux, (m_inp_mux << 2 & 0x80) | (~m_r & 0x7f)); -} - -void memoquiz_state::write_d(u16 data) -{ - // DIO0-DIO7: digit select, DIO5 is also DP segment - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8: N/C, looks like they planned to add sound, but didn't -} - -void memoquiz_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 memoquiz_state::read_p() -{ - // PI1-PI4: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( memoquiz ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("AC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("PE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CD") - - PORT_START("IN.4") - PORT_CONFNAME( 0x03, 0x01, "Digits" ) PORT_CHANGED_MEMBER(DEVICE_SELF, memoquiz_state, digits_switch, 0) - PORT_CONFSETTING( 0x01, "3" ) // INT0, Vdd when closed, pulled to GND when open - PORT_CONFSETTING( 0x02, "4" ) // INT1, GND when closed, pulled to Vdd when open - PORT_CONFSETTING( 0x00, "5" ) -INPUT_PORTS_END - -void memoquiz_state::memoquiz(machine_config &config) -{ - // basic machine hardware - MM75(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(memoquiz_state::write_d)); - m_maincpu->write_r().set(FUNC(memoquiz_state::write_r)); - m_maincpu->read_p().set(FUNC(memoquiz_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_memoquiz); - - // no sound! -} - -// roms - -ROM_START( memoquiz ) - ROM_REGION( 0x0400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "m7505_a7505-12", 0x0000, 0x0200, CRC(47223508) SHA1(97b62e0c453ae2e65d48e039ad65857dae2d4d76) ) - ROM_CONTINUE( 0x0380, 0x0080 ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_memoquiz_output.pla", 0, 314, CRC(a5799b50) SHA1(9b4923b37c9ba8221ecece5a3370c605a880a453) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Football 2 (model 1050) - * PCB label: MATTEL, 1050-4369D - * MM77LA MCU (label B8000-12, die label B8000) - * 7 7seg leds, 30 other leds, 2-bit sound - - Through its production run, it was released as "Football 2" and "Football II". - -***************************************************************************/ - -class mfootb2_state : public hh_pps41_state -{ -public: - mfootb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void mfootb2(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - void write_spk(u8 data); -}; - -// handlers - -void mfootb2_state::update_display() -{ - m_display->matrix(m_d, (m_r << 1 & 0x700) | (m_d >> 4 & 0x80) | (m_r & 0x7f)); -} - -void mfootb2_state::write_d(u16 data) -{ - // DIO0-DIO2, DIO6-DIO9: digit select - // DIO3-DIO5: led select - // DIO10: 4th digit DP - m_d = data; - update_display(); -} - -void mfootb2_state::write_r(u16 data) -{ - // RO01-RO10: led data - m_r = data; - update_display(); -} - -void mfootb2_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -static INPUT_PORTS_START( mfootb2 ) - PORT_START("IN.0") // PI - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.1") // DIO11 - PORT_CONFNAME( 0x400, 0x000, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x000, "1" ) // PRO 1 - PORT_CONFSETTING( 0x400, "2" ) // PRO 2 -INPUT_PORTS_END - -void mfootb2_state::mfootb2(machine_config &config) -{ - // basic machine hardware - MM77LA(config, m_maincpu, 380000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mfootb2_state::write_d)); - m_maincpu->read_d().set_ioport("IN.1"); - m_maincpu->write_r().set(FUNC(mfootb2_state::write_r)); - m_maincpu->read_p().set_ioport("IN.0"); - m_maincpu->write_spk().set(FUNC(mfootb2_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 11); - m_display->set_segmask(0x3c7, 0x7f); - m_display->set_segmask(0x002, 0xff); // only one digit has DP - m_display->set_bri_levels(0.015, 0.2); // ball led is brighter - config.set_default_layout(layout_mfootb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( mfootb2 ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b8000-12", 0x0000, 0x0600, CRC(5b65fc38) SHA1(4fafc9deb5609b16f09b18b7346ea96ffe8bf9e0) ) - - ROM_REGION( 317, "maincpu:opla", 0 ) - ROM_LOAD( "mm77la_mfootb2_output.pla", 0, 317, CRC(11c0bbfa) SHA1(939a0a6adeace8ca0f9e17290306a2e7ced21db3) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Brain Baffler (model 1080) - * PCB label: OLYMPOS KOREA, CM04-D102-001 REV D - * MM78LA MCU (label MM95 B9000-12, die label B9000) - * 8-digit 14seg LED display, 2-bit sound - - It includes 8 word games, most of them are meant for 2 players. - -***************************************************************************/ - -class brainbaf_state : public hh_pps41_state -{ -public: - brainbaf_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void brainbaf(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); - void write_spk(u8 data); -}; - -// handlers - -void brainbaf_state::update_display() -{ - m_display->matrix(m_inp_mux, bitswap<14>(m_r, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); -} - -void brainbaf_state::write_d(u16 data) -{ - // DIO0-DIO9: input mux - // DIO0-DIO7: digit select - m_inp_mux = data; - update_display(); -} - -void brainbaf_state::write_r(u16 data) -{ - // RO01-RO14: digit segment data - m_r = data; - update_display(); -} - -u8 brainbaf_state::read_p() -{ - // PI5-PI8: multiplexed inputs - return read_inputs(10) << 4; -} - -void brainbaf_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -static INPUT_PORTS_START( brainbaf ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J-0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F12) PORT_NAME("Player / Bonus R") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Player / Bonus L") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Game") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C-3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_NAME("Go") - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D-4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Entry") - - PORT_START("IN.5") // DIO5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E-5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - - PORT_START("IN.6") // DIO6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_NAME("Refresh") - - PORT_START("IN.7") // DIO7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G-7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_NAME("Buy") - - PORT_START("IN.8") // DIO8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H-8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_NAME("Give-Up") - - PORT_START("IN.9") // DIO9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I-9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CODE(KEYCODE_F11) PORT_NAME("Stop") // both STOP keys - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_NAME("Score") -INPUT_PORTS_END - -void brainbaf_state::brainbaf(machine_config &config) -{ - // basic machine hardware - MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K - m_maincpu->write_d().set(FUNC(brainbaf_state::write_d)); - m_maincpu->write_r().set(FUNC(brainbaf_state::write_r)); - m_maincpu->read_p().set(FUNC(brainbaf_state::read_p)); - m_maincpu->write_spk().set(FUNC(brainbaf_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_brainbaf); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( brainbaf ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm95_b9000-12", 0x0000, 0x0800, CRC(f7a4829c) SHA1(12f789d8264a969777764d31ea67067cc330a73c) ) - - ROM_REGION( 605, "maincpu:opla", 0 ) - ROM_LOAD( "mm78la_brainbaf_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Horoscope Computer (model 1081) - * PCB label: DET. CM05-D102-001 REV D - * MM78LA MCU (label MM95 B9001-13, die label B9001) - * 8-digit 14seg LED display, 2-bit sound - - This is not a toy, but a fortune forecast. Date format is mm-dd-yy, it is - valid only from June 1 1979 until December 31 1987 - -***************************************************************************/ - -class horocomp_state : public hh_pps41_state -{ -public: - horocomp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void horocomp(machine_config &config); - -private: - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); - void write_spk(u8 data); -}; - -// handlers - -void horocomp_state::update_display() -{ - // 14seg display is upside-down - u16 flip = m_r << 7 | m_r >> 7; - m_display->matrix(m_inp_mux, bitswap<14>(flip, 6,5,13,12,11,4,3,10,9,8,7,2,1,0)); -} - -void horocomp_state::write_d(u16 data) -{ - // DIO0-DIO9: input mux - // DIO0-DIO7: digit select - m_inp_mux = data; - update_display(); -} - -void horocomp_state::write_r(u16 data) -{ - // RO01-RO14: digit segment data - m_r = data; - update_display(); -} - -u8 horocomp_state::read_p() -{ - // PI4: mode switch - // PI5-PI8: multiplexed inputs - return read_inputs(10) << 4 | (m_inputs[10]->read() & 8); -} - -void horocomp_state::write_spk(u8 data) -{ - // SPK: speaker out - m_speaker->level_w(data); -} - -// config - -/* physical button layout and labels are like this: - - CAP. - AQU. [ ] SAG. - [ ] 9 [ ] - PIS. 8 SCO. - [ ] 7[ ] - -ARI.[ ]0 6[ ]LIB. - - [ ]1 5[ ] [ ] [ ] [ ] [ ] - TAU. 2 4 VIR. LOVE CAREER TRAVEL MONEY - [ ] 3 [ ] - GEM. [ ] LEO [ ] [ ] [ ] [ ] - CAN. FRIENDS SPIRIT FAMILY CREATIVE -*/ - -static INPUT_PORTS_START( horocomp ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Love") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Friends") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0 / Aries") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Career") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Spirit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1 / Taurus") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Travel") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Family") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2 / Gemini") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Money") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Creative") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3 / Cancer") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4 / Leo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Aquarius / Reset") - - PORT_START("IN.5") // DIO5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5 / Virgo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Pisces") - - PORT_START("IN.6") // DIO6 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6 / Libra") - - PORT_START("IN.7") // DIO7 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7 / Scorpio") - - PORT_START("IN.8") // DIO8 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8 / Sagittarius") - - PORT_START("IN.9") // DIO9 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9 / Capricorn") - - PORT_START("IN.10") // PI4 - PORT_CONFNAME( 0x08, 0x00, "Mode" ) - PORT_CONFSETTING( 0x08, "C" ) // compatibility - PORT_CONFSETTING( 0x00, "P" ) // personal -INPUT_PORTS_END - -void horocomp_state::horocomp(machine_config &config) -{ - // basic machine hardware - MM78LA(config, m_maincpu, 440000); // approximation - VC osc. R=10K - m_maincpu->write_d().set(FUNC(horocomp_state::write_d)); - m_maincpu->write_r().set(FUNC(horocomp_state::write_r)); - m_maincpu->read_p().set(FUNC(horocomp_state::read_p)); - m_maincpu->write_spk().set(FUNC(horocomp_state::write_spk)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_horocomp); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( horocomp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm95_b9001-13", 0x0000, 0x0800, CRC(d284a837) SHA1(02092db2a29b4bb7e9f86286601b67b2e9556476) ) - - ROM_REGION( 605, "maincpu:opla", 0 ) - ROM_LOAD( "mm78la_horocomp_output.pla", 0, 605, CRC(4fae532f) SHA1(3a08c0fa3ce476c014280b3cfeb6aa37824ae503) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel World Championship Football (model 3202) - * MM78 MCU (MM78L pinout) (label MM78 A78C6-12, die label A78C6) - * MM78 MCU (MM78L pinout) (label MM78 A78C7-12, die label A78C7) - * 8-digit 7seg VFD, cyan/red/green VFD Itron CP5023, 1-bit sound - - It was patented under US4422639. Like the Baseball counterpart (mwcbaseb in - hh_hmcs40.cpp), this handheld is a complex game. - -***************************************************************************/ - -class mwcfootb_state : public hh_pps41_state -{ -public: - mwcfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag), - m_subcpu(*this, "subcpu") - { } - - void mwcfootb(machine_config &config); - -private: - required_device m_subcpu; - - void update_display(); - - void main_write_d(u16 data); - u16 main_read_d(); - void main_write_r(u16 data); - u8 main_read_p(); - - void sub_write_d(u16 data); - void sub_write_r(u16 data); -}; - -// handlers - -void mwcfootb_state::update_display() -{ - m_display->matrix(m_grid, bitswap<19>(m_plate, 19,18,17,16, 11,10,9,8,15,14,13,12, 2,3,1,0,6,5,4)); -} - -// maincpu side - -void mwcfootb_state::main_write_d(u16 data) -{ - // DIO0-DIO7: vfd grid - // DIO0-DIO2: input mux - m_grid = m_inp_mux = data; - update_display(); - - // DIO8: subcpu INT0 - m_subcpu->set_input_line(0, (data & 0x100) ? ASSERT_LINE : CLEAR_LINE); -} - -u16 mwcfootb_state::main_read_d() -{ - // DIO9: subcpu DIO9 - return m_subcpu->d_output_r() & 0x200; -} - -void mwcfootb_state::main_write_r(u16 data) -{ - // RIO1-RIO7: vfd plate 0-6 - m_plate = (m_plate & 0xfff00) | (~data & 0x7f); - update_display(); - - // RIO8: speaker out - m_speaker->level_w(BIT(~data, 7)); -} - -u8 mwcfootb_state::main_read_p() -{ - // PI1-PI8: multiplexed inputs - return ~read_inputs(3); -} - -// subcpu side - -void mwcfootb_state::sub_write_d(u16 data) -{ - // DIO0-DIO3: vfd plate 15-18 - m_plate = (m_plate & 0x0ffff) | (data << 16 & 0xf0000); - update_display(); - - // DIO9: maincpu INT0 (+DIO9) - m_maincpu->set_input_line(0, (data & 0x200) ? ASSERT_LINE : CLEAR_LINE); -} - -void mwcfootb_state::sub_write_r(u16 data) -{ - // RIO1-RIO8: vfd plate 7-14 - m_plate = (m_plate & 0xf00ff) | (~data << 8 & 0xff00); - update_display(); -} - -// config - -/* physical button layout and labels are like this: - - (home team side) (visitor team side) - [1] RECEIVERS [2] [1] RECEIVERS [2] - - [1] [1] - [4] [PAUSE] [2] [4] [PAUSE] [2] - [3] [3] - DOWN QUARTER - [ENTER] YDS. TO GO TIME LEFT POSITION SCORE [ENTER] - [KICK] [TIME] [ ] [ ] [ ] [ ] [TIME] [KICK] - - [^] [^] - [<] [P/C] [>] [<] [P/C] [>] - [v] [v] -*/ - -static INPUT_PORTS_START( mwcfootb ) // P1 = left/home, P2 = right/visitor - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("Position") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 P/C/Pause") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Quarter Time Left") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Down / Yards To Go") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Kick") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 P/C/Pause") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Time") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Enter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Receiver 1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Time") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Enter") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Receiver 1") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Left/4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Right/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Down/3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_16WAY PORT_NAME("P2 Up/1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Left/4") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Right/2") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Down/3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY PORT_NAME("P1 Up/1") -INPUT_PORTS_END - -void mwcfootb_state::mwcfootb(machine_config &config) -{ - // basic machine hardware - MM78(config, m_maincpu, 360000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(mwcfootb_state::main_write_d)); - m_maincpu->read_d().set(FUNC(mwcfootb_state::main_read_d)); - m_maincpu->write_r().set(FUNC(mwcfootb_state::main_write_r)); - m_maincpu->read_p().set(FUNC(mwcfootb_state::main_read_p)); - m_maincpu->read_sdi().set(m_subcpu, FUNC(pps41_base_device::sdo_r)); - m_maincpu->write_ssc().set(m_subcpu, FUNC(pps41_base_device::ssc_w)); - - MM78(config, m_subcpu, 360000); // osc. from maincpu - m_subcpu->write_d().set(FUNC(mwcfootb_state::sub_write_d)); - m_subcpu->write_r().set(FUNC(mwcfootb_state::sub_write_r)); - m_subcpu->read_sdi().set(m_maincpu, FUNC(pps41_base_device::sdo_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 571); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - m_display->set_segmask(0x7f, 0x7f); - config.set_default_layout(layout_mwcfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mwcfootb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mm78_a78c6-12", 0x0000, 0x0800, CRC(91cf0d9b) SHA1(8d778b441eb26fcff50e8532c142f368c0dd5818) ) - - ROM_REGION( 0x0800, "subcpu", 0 ) - ROM_LOAD( "mm78_a78c7-12", 0x0000, 0x0800, CRC(b991d06e) SHA1(1f801b5cd7214f7378ae3f19799b84a9dc5bba4e) ) - - ROM_REGION( 248486, "screen", 0) - ROM_LOAD( "mwcfootb.svg", 0, 248486, CRC(03d17b85) SHA1(c877316c0c7923432235655d810fea8d714a4b31) ) -ROM_END - - - - - -/*************************************************************************** - - Selchow & Righter Scrabble Sensor - * MM76EL MCU (label B8610-11, die label B8610) - * 16 leds, 1-bit sound - - The game concept is similar to Mastermind. Enter a word (or press AUTO.) - to start the game, then try to guess it. - -***************************************************************************/ - -class scrabsen_state : public hh_pps41_state -{ -public: - scrabsen_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void scrabsen(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void scrabsen_state::update_int() -{ - // players switch is tied to MCU INT0 - m_maincpu->set_input_line(0, (m_inputs[5]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void scrabsen_state::update_display() -{ - m_display->matrix(m_inp_mux >> 6 & 3, ~m_r); -} - -void scrabsen_state::write_d(u16 data) -{ - // DIO0-DIO4: input mux - // DIO6,DIO7: led select - m_inp_mux = data; - update_display(); - - // DIO8: speaker out - m_speaker->level_w(BIT(data, 8)); -} - -void scrabsen_state::write_r(u16 data) -{ - // RIO1-RIO8: led data - m_r = data; - update_display(); -} - -u8 scrabsen_state::read_p() -{ - // PI1-PI7: multiplexed inputs - return ~read_inputs(5); -} - -// config - -static INPUT_PORTS_START( scrabsen ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_NAME("Space") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) PORT_NAME("Enter") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_NAME("Auto.") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - - PORT_START("IN.4") // DIO4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - - PORT_START("IN.5") // INT0 - PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, scrabsen_state, players_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) // single - PORT_CONFSETTING( 0x00, "2" ) // double -INPUT_PORTS_END - -void scrabsen_state::scrabsen(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 380000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(scrabsen_state::write_d)); - m_maincpu->write_r().set(FUNC(scrabsen_state::write_r)); - m_maincpu->read_p().set(FUNC(scrabsen_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 8); - config.set_default_layout(layout_scrabsen); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( scrabsen ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "b8610-11", 0x0000, 0x0400, CRC(97c8a466) SHA1(ed5d2cddd2761ed6e3ddc47d97b2ed19a2aaeee9) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) // unused - ROM_LOAD( "mm76_scrabsen_output.pla", 0, 314, CRC(410fa6d7) SHA1(d46aaf1ec2c942083cba7dbd59d4261dc238d4c8) ) -ROM_END - - - - - -/*************************************************************************** - - Selchow & Righter Reader's Digest Q&A - * MM76EL MCU (label MM76EL B8654-11, die label B8654) - * 9-digit 7seg LED display(4 unused), 2-bit sound - - The game requires question books. The player inputs a 3-digit code and - answers 20 multiple-choice questions from the page. - -***************************************************************************/ - -class rdqa_state : public hh_pps41_state -{ -public: - rdqa_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_pps41_state(mconfig, type, tag) - { } - - void rdqa(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(players_switch) { update_int(); } - -private: - virtual void update_int() override; - void update_display(); - void write_d(u16 data); - void write_r(u16 data); - u8 read_p(); -}; - -// handlers - -void rdqa_state::update_int() -{ - // players switch is tied to MCU INT0 - m_maincpu->set_input_line(0, (m_inputs[4]->read() & 1) ? ASSERT_LINE : CLEAR_LINE); -} - -void rdqa_state::update_display() -{ - m_display->matrix(m_inp_mux, ~m_r); -} - -void rdqa_state::write_d(u16 data) -{ - // DIO0-DIO4: digit select - // DIO0-DIO3: input mux - m_inp_mux = data; - update_display(); - - // DIO8,DIO9: speaker out - m_speaker->level_w(data >> 8 & 3); -} - -void rdqa_state::write_r(u16 data) -{ - // RIO1-RIO7: digit segment data - m_r = data; - update_display(); -} - -u8 rdqa_state::read_p() -{ - // PI1-PI5: multiplexed inputs - return ~read_inputs(4); -} - -// config - -static INPUT_PORTS_START( rdqa ) - PORT_START("IN.0") // DIO0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") - - PORT_START("IN.1") // DIO1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") - - PORT_START("IN.2") // DIO2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") - - PORT_START("IN.3") // DIO3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wrong") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.4") // INT0 - PORT_CONFNAME( 0x01, 0x01, "Players" ) PORT_CHANGED_MEMBER(DEVICE_SELF, rdqa_state, players_switch, 0) - PORT_CONFSETTING( 0x01, "1" ) // single - PORT_CONFSETTING( 0x00, "2" ) // double -INPUT_PORTS_END - -void rdqa_state::rdqa(machine_config &config) -{ - // basic machine hardware - MM76EL(config, m_maincpu, 400000); // approximation - VC osc. R=56K - m_maincpu->write_d().set(FUNC(rdqa_state::write_d)); - m_maincpu->write_r().set(FUNC(rdqa_state::write_r)); - m_maincpu->read_p().set(FUNC(rdqa_state::read_p)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(5, 7); - m_display->set_segmask(0x1f, 0x7f); - config.set_default_layout(layout_rdqa); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - -// roms - -ROM_START( rdqa ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mm76el_b8654-11", 0x0000, 0x0400, CRC(95c00eee) SHA1(1537626df03a7131d83a555e557a4528e093a22a) ) - - ROM_REGION( 314, "maincpu:opla", 0 ) - ROM_LOAD( "mm76_rdqa_output.pla", 0, 314, CRC(e024b2d3) SHA1(fc3121e70f22151cf8f3411f9fcbac88002ae330) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ftri1, 0, 0, ftri1, ftri1, ftri1_state, empty_init, "Fonas", "Tri-1 (Fonas)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, mastmind, 0, 0, mastmind, mastmind, mastmind_state, empty_init, "Invicta", "Electronic Master Mind (Invicta)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -CONS( 1979, smastmind, 0, 0, smastmind, mastmind, mastmind_state, empty_init, "Invicta", "Super-Sonic Electronic Master Mind", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, dunksunk, 0, 0, dunksunk, dunksunk, dunksunk_state, empty_init, "Kmart", "Dunk 'n Sunk", MACHINE_SUPPORTS_SAVE ) - -CONS( 1978, memoquiz, 0, 0, memoquiz, memoquiz, memoquiz_state, empty_init, "M.E.M. Belgium", "Memoquiz", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, mfootb2, 0, 0, mfootb2, mfootb2, mfootb2_state, empty_init, "Mattel Electronics", "Football 2 (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, brainbaf, 0, 0, brainbaf, brainbaf, brainbaf_state, empty_init, "Mattel Electronics", "Brain Baffler", MACHINE_SUPPORTS_SAVE ) -COMP( 1979, horocomp, 0, 0, horocomp, horocomp, horocomp_state, empty_init, "Mattel Electronics", "Horoscope Computer", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, mwcfootb, 0, 0, mwcfootb, mwcfootb, mwcfootb_state, empty_init, "Mattel Electronics", "World Championship Football", MACHINE_SUPPORTS_SAVE ) - -CONS( 1978, scrabsen, 0, 0, scrabsen, scrabsen, scrabsen_state, empty_init, "Selchow & Righter", "Scrabble Sensor - Electronic Word Game", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, rdqa, 0, 0, rdqa, rdqa, rdqa_state, empty_init, "Selchow & Righter", "Reader's Digest Q&A - Computer Question & Answer Game", MACHINE_SUPPORTS_SAVE ) // *** - -// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction -// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_rw5000.cpp b/src/mame/misc_handheld/hh_rw5000.cpp deleted file mode 100644 index 0424ccad720..00000000000 --- a/src/mame/misc_handheld/hh_rw5000.cpp +++ /dev/null @@ -1,1109 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - -Rockwell A/B5000 MCU series handhelds (before PPS-4/1) -Mostly calculators on these MCUs, but also Mattel's first couple of handhelds. - -ROM source notes when dumped from another model, but confident it's the same: -- rw18r: Rockwell 8R -- rw24k: Rockwell 14RD-II -- misatk: Mattel Space Alert - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/rw5000/a5000.h" -#include "cpu/rw5000/a5500.h" -#include "cpu/rw5000/a5900.h" -#include "cpu/rw5000/b5000.h" -#include "cpu/rw5000/b5500.h" -#include "cpu/rw5000/b6000.h" -#include "cpu/rw5000/b6100.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - -#include "speaker.h" - -// internal artwork -#include "autorace.lh" -#include "gravity.lh" -#include "mbaseb.lh" -#include "mfootb.lh" -#include "misatk.lh" -#include "rw10r.lh" -#include "rw24k.lh" -#include "rw30r.lh" - -//#include "hh_rw5000_test.lh" // common test-layout - use external artwork - - -class hh_rw5000_state : public driver_device -{ -public: - hh_rw5000_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(power_button); - template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } - template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<9> m_inputs; // max 9 - - u16 m_inp_mux = 0; - - // MCU output pin state - u16 m_str = 0; - u16 m_seg = 0; - - u8 read_inputs(int columns); - void switch_change(int sel, u32 mask, bool next); -}; - - -// machine start/reset - -void hh_rw5000_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_str)); - save_item(NAME(m_seg)); -} - -void hh_rw5000_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_rw5000_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -void hh_rw5000_state::switch_change(int sel, u32 mask, bool next) -{ - // config switches (for direct control) - ioport_field *inp = m_inputs[sel]->field(mask); - - if (next && inp->has_next_setting()) - inp->select_next_setting(); - else if (!next && inp->has_previous_setting()) - inp->select_previous_setting(); -} - -INPUT_CHANGED_MEMBER(hh_rw5000_state::power_button) -{ - // power button or switch - bool power = (param) ? (bool(param - 1)) : !newval; - - if (!power && m_display != nullptr) - m_display->clear(); - m_maincpu->set_input_line(INPUT_LINE_RESET, power ? CLEAR_LINE : ASSERT_LINE); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Mattel Auto Race (model 9879) - * B6000 MCU (label B6000CA, die label B6000-B) - * 2-digit 7seg display, 21 other leds, 1-bit sound - - This is Mattel's first electronic handheld game, also the first CPU-based - handheld game overall. Hardware design (even the MCU) and programming - was done at Rockwell. - - A European version was released as "Ski Slalom", except it's upside-down. - -***************************************************************************/ - -class autorace_state : public hh_rw5000_state -{ -public: - autorace_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void autorace(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void autorace_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void autorace_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( autorace ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " - PORT_CONFNAME( 0x0c, 0x0c, "Gear" ) - PORT_CONFSETTING( 0x0c, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x00, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("POWER") // power switch - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Start / Reset") - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_prev<0>, 0x0c) PORT_NAME("Gear Switch Down") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, switch_next<0>, 0x0c) PORT_NAME("Gear Switch Up") -INPUT_PORTS_END - -void autorace_state::autorace(machine_config &config) -{ - // basic machine hardware - B6000(config, m_maincpu, 160000); // approximation - m_maincpu->write_str().set(FUNC(autorace_state::write_str)); - m_maincpu->write_seg().set(FUNC(autorace_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.02, 0.2); // player led is brighter - config.set_default_layout(layout_autorace); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( autorace ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "b6000ca", 0x000, 0x200, CRC(a112c928) SHA1(aa5d0b46a08e2460081d4148cf254dc5ec53817e) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Missile Attack (model 2048) / Space Alert (model 2448) - * B6000 MCU (label B6001CA/EA, die label B6001) - * 2-digit 7seg display, 21 other leds, 1-bit sound - - The initial release was called Missile Attack, it didn't sell well (Mattel - blamed it on NBC for refusing to air their commercial). They changed the - title/setting and rereleased it as "Space Alert" (aka "Battlestar Galactica: - Space Alert"). In 1980, they advertised another rerelease, this time as - "Flash Gordon", but that didn't come out. - -***************************************************************************/ - -class misatk_state : public hh_rw5000_state -{ -public: - misatk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void misatk(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void misatk_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void misatk_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( misatk ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) // does not auto-center on real device - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - - PORT_START("POWER") // power switch - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_rw5000_state, power_button, 0) PORT_NAME("Arm / Off") -INPUT_PORTS_END - -void misatk_state::misatk(machine_config &config) -{ - // basic machine hardware - B6000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(misatk_state::write_str)); - m_maincpu->write_seg().set(FUNC(misatk_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.015, 0.15); // player led is brighter - config.set_default_layout(layout_misatk); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( misatk ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "b6001ea", 0x000, 0x200, CRC(56564b79) SHA1(6f33f57ea312cb2018fb59f72eaff3a9642e74a2) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Football (model 2024) - * B6100 MCU (label B6100EB/-15, die label B6100 A) - * 7-digit 7seg display, 27 other leds, 1-bit sound - - When Football II came out, they renamed this one to Football I. - -***************************************************************************/ - -class mfootb_state : public hh_rw5000_state -{ -public: - mfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void mfootb(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(score_button) { update_display(); } - -private: - void update_display(); - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void mfootb_state::update_display() -{ - // 4th digit DP is from the SCORE button - u8 dp = (m_inputs[1]->read() & 2) ? 0x80 : 0; - m_display->matrix(m_str, (m_seg << 1 & 0x700) | dp | (m_seg & 0x7f)); -} - -void mfootb_state::write_str(u16 data) -{ - m_str = data; - update_display(); -} - -void mfootb_state::write_seg(u16 data) -{ - m_seg = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( mfootb ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // PRO 1 - PORT_CONFSETTING( 0x00, "2" ) // PRO 2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") PORT_CHANGED_MEMBER(DEVICE_SELF, mfootb_state, score_button, 0) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void mfootb_state::mfootb(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 280000); // approximation - m_maincpu->write_str().set(FUNC(mfootb_state::write_str)); - m_maincpu->write_seg().set(FUNC(mfootb_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x7f, 0x7f); - m_display->set_segmask(0x08, 0xff); // only one digit has DP - m_display->set_bri_levels(0.02, 0.2); // player led is brighter - config.set_default_layout(layout_mfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mfootb ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6100eb", 0x000, 0x300, CRC(5b27620f) SHA1(667ff6cabced89ef4ad848b73d66a06526edc5e6) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Baseball (model 2942) - * B6100 MCU (label B6101-12, die label B6101 A) - * 4-digit 7seg display, 28 other leds, 1-bit sound - -***************************************************************************/ - -class mbaseb_state : public hh_rw5000_state -{ -public: - mbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void mbaseb(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void mbaseb_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void mbaseb_state::write_seg(u16 data) -{ - m_display->write_mx(bitswap<10>(data,7,8,9,6,5,4,3,2,1,0)); -} - -// config - -static INPUT_PORTS_START( mbaseb ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Pitch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // PRO 1 - PORT_CONFSETTING( 0x00, "2" ) // PRO 2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Run") - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void mbaseb_state::mbaseb(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 280000); // approximation - m_maincpu->write_str().set(FUNC(mbaseb_state::write_str)); - m_maincpu->write_seg().set(FUNC(mbaseb_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 10); - m_display->set_segmask(0x170, 0x7f); - m_display->set_segmask(0x110, 0xff); // 2 digits have DP - config.set_default_layout(layout_mbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mbaseb ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6101-12", 0x000, 0x300, CRC(7720ddcc) SHA1(cd43126db7c6262f659f325aa58420e1a8a1a659) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Gravity (model 8291) - * B6100 MCU (label B6102-11, die label B6102 A) - * 3-digit 7seg display, 27 other leds, 1-bit sound - - It was advertised as "Catastrophe", but went unreleased. It got sold later - as "Gravity", with a less catastrophic setting. - - The game is basically 3 mini games in 1: - - Juggling (Rumbling Rocks in Catastrophe) - - Coin Drop (Quake Shock in Catastrophe) - - Docking (Meteorite Shower in Catstrophe) - -***************************************************************************/ - -class gravity_state : public hh_rw5000_state -{ -public: - gravity_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void gravity(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); -}; - -// handlers - -void gravity_state::write_str(u16 data) -{ - m_display->write_my(data); -} - -void gravity_state::write_seg(u16 data) -{ - m_display->write_mx(data); -} - -// config - -static INPUT_PORTS_START( gravity ) - PORT_START("IN.0") // KB - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // DIN - PORT_CONFNAME( 0x08, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) -INPUT_PORTS_END - -void gravity_state::gravity(machine_config &config) -{ - // basic machine hardware - B6100(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(gravity_state::write_str)); - m_maincpu->write_seg().set(FUNC(gravity_state::write_seg)); - m_maincpu->read_kb().set_ioport("IN.0"); - m_maincpu->read_din().set_ioport("IN.1"); - m_maincpu->write_spk().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 10); - m_display->set_segmask(0x1c0, 0x7f); - config.set_default_layout(layout_gravity); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gravity ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b6102-11", 0x000, 0x300, CRC(532f332e) SHA1(593224d3a2a5b6022f0d73b6e6fb9093d2d54f68) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 10R - * A5000 MCU (label A5000PA, die label A5000) - * 8-digit 7seg LED display - - Rockwell 12R "Square Root" - * A5000 MCU (label A5001, die label A5001) - * rest is same as 10R - - 12R supports square root by pressing × after ÷ (or the other way around). - -***************************************************************************/ - -class rw10r_state : public hh_rw5000_state -{ -public: - rw10r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw10r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw10r_state::write_str(u16 data) -{ - // STR0-STR7: digit select - // STR4-STR7: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw10r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw10r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( rw10r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("+=") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") -INPUT_PORTS_END - -void rw10r_state::rw10r(machine_config &config) -{ - // basic machine hardware - A5000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw10r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw10r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw10r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_rw10r); -} - -// roms - -ROM_START( rw10r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5000pa", 0x000, 0x0c0, CRC(db6cbbea) SHA1(3757f303a84e412e8763c4ec2170c9badc172454) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - -ROM_START( rw12r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5001", 0x000, 0x0c0, CRC(4337a46b) SHA1(70f4683eac0afa31a6cd9dd44fdf1b6680575f67) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 8R "Automatic Percent", Rockwell 18R "Memory" - * B5000 MCU (label B5000CC, die label B5000) - * 8-digit 7seg LED display - - This MCU was used in Rockwell 8R, 18R, and 9TR. It was also sold by - Tandy (Radio Shack) as EC-220. - - 8R/9TR doesn't have the memory store/recall buttons. - -***************************************************************************/ - -class rw18r_state : public hh_rw5000_state -{ -public: - rw18r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw18r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw18r_state::write_str(u16 data) -{ - // STR0-STR7: digit select - // STR4-STR8: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw18r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw18r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( rw18r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.4") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("STO") // unpopulated on 8R - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("RCL") // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void rw18r_state::rw18r(machine_config &config) -{ - // basic machine hardware - B5000(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw18r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw18r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw18r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_rw10r); -} - -// roms - -ROM_START( rw18r ) - ROM_REGION( 0x200, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b5000cc", 0x000, 0x0c0, CRC(ace32614) SHA1(23cf11acf2e73ce2dfc165cb87f86fab15f69ff7) ) - ROM_CONTINUE( 0x100, 0x100 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 30R "Slide Rule Memory" - * B5500 MCU (label B5500PA, die label B5500) - * 9-digit 7seg LED display - - Rockwell 31R "Slide Rule Memory" - * A5500 MCU (label A5502PA, die label A5500) - * rest is same as 30R - - 30R and 31R have the exact same functionality, even though they are on - different MCUs. There's also a 30R version on an A4600 MCU. - -***************************************************************************/ - -class rw30r_state : public hh_rw5000_state -{ -public: - rw30r_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw30r(machine_config &config); - void rw31r(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw30r_state::write_str(u16 data) -{ - // STR0-STR8: digit select - // STR4-STR8: input mux - m_display->write_my(data); - m_inp_mux = data >> 4; -} - -void rw30r_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw30r_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( rw30r ) - PORT_START("IN.0") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(". / +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F / CF") // function - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+ / M+") - - PORT_START("IN.1") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("- / M-") - - PORT_START("IN.2") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"× / x" UTF8_POW_2) - - PORT_START("IN.3") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷ / 1/x") - - PORT_START("IN.4") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("C / MC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("X\xe2\x86\x94Y / X\xe2\x86\x94M") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% / " UTF8_SQUAREROOT "x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("= / MR") -INPUT_PORTS_END - -void rw30r_state::rw30r(machine_config &config) -{ - // basic machine hardware - B5500(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_rw30r); -} - -void rw30r_state::rw31r(machine_config &config) -{ - rw30r(config); - - // basic machine hardware - A5500(config.replace(), m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw30r_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw30r_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw30r_state::read_kb)); -} - -// roms - -ROM_START( rw30r ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "b5500pa", 0x000, 0x280, CRC(937dd695) SHA1(bc286209943f49e9acccbf319b87c6ec24386894) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - -ROM_START( rw31r ) - ROM_REGION( 0x400, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "a5502pa", 0x000, 0x280, CRC(6ee0b30a) SHA1(42e5d1e29bdef4b4faaafee3592cacc0e66b982f) ) - ROM_CONTINUE( 0x380, 0x080 ) -ROM_END - - - - - -/*************************************************************************** - - Rockwell 24K aka "the 24K" (see below for more) - * A5900 MCU (label A5901CA/A5903CB, die label A59__) - * 9-digit 7seg VFD - - This MCU was used in Rockwell 14RD-II, 24RD-II, 24K, 24K II, 24MS, and - probably also in 14RD, 24RD, 22K. - - 14RD has 6 less buttons than 24RD, the non-II versions have LED(s) instead - of a 9th digit for minus sign and memory status. 24K has an extra button - for register exchange. The difference between 24K and 24K II is unknown. - -***************************************************************************/ - -class rw24k_state : public hh_rw5000_state -{ -public: - rw24k_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_rw5000_state(mconfig, type, tag) - { } - - void rw24k(machine_config &config); - -private: - void write_str(u16 data); - void write_seg(u16 data); - u8 read_kb(); -}; - -// handlers - -void rw24k_state::write_str(u16 data) -{ - // STR0-STR8: digit select, input mux - m_display->write_my(data); - m_inp_mux = data; -} - -void rw24k_state::write_seg(u16 data) -{ - // SEG0-SEG7: digit segment data - m_display->write_mx(bitswap<8>(data,0,7,6,5,4,3,2,1)); -} - -u8 rw24k_state::read_kb() -{ - // KB: multiplexed inputs - return read_inputs(9); -} - -// config - -static INPUT_PORTS_START( rw24k ) - PORT_START("IN.0") // STR0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") // unpopulated on 14RD - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("M+") // " - - PORT_START("IN.1") // STR1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M-") // " - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // STR2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // STR3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("MC") // " - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("MR") // " - - PORT_START("IN.4") // STR4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.5") // STR5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.6") // STR6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - - PORT_START("IN.7") // STR7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - - PORT_START("IN.8") // STR8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE/C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("\xe2\x86\x94") // register exchange - unpopulated on 14RD/24RD - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void rw24k_state::rw24k(machine_config &config) -{ - // basic machine hardware - A5900(config, m_maincpu, 250000); // approximation - m_maincpu->write_str().set(FUNC(rw24k_state::write_str)); - m_maincpu->write_seg().set(FUNC(rw24k_state::write_seg)); - m_maincpu->read_kb().set(FUNC(rw24k_state::read_kb)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_rw24k); -} - -// roms - -ROM_START( rw24k ) - ROM_REGION( 0x200, "maincpu", 0 ) - ROM_LOAD( "a5901ca", 0x000, 0x200, CRC(00de7764) SHA1(0f24add4b6d2660aad63ddd4d0003d59a0e39df6) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1976, autorace, 0, 0, autorace, autorace, autorace_state, empty_init, "Mattel Electronics", "Auto Race", MACHINE_SUPPORTS_SAVE ) -CONS( 1977, misatk, 0, 0, misatk, misatk, misatk_state, empty_init, "Mattel Electronics", "Missile Attack / Space Alert", MACHINE_SUPPORTS_SAVE ) -CONS( 1977, mfootb, 0, 0, mfootb, mfootb, mfootb_state, empty_init, "Mattel Electronics", "Football (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1978, mbaseb, 0, 0, mbaseb, mbaseb, mbaseb_state, empty_init, "Mattel Electronics", "Baseball (Mattel)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gravity, 0, 0, gravity, gravity, gravity_state, empty_init, "Mattel Electronics", "Gravity (Mattel)", MACHINE_SUPPORTS_SAVE ) - -COMP( 1974, rw10r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "10R (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw12r, 0, 0, rw10r, rw10r, rw10r_state, empty_init, "Rockwell", "12R: Square Root", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw18r, 0, 0, rw18r, rw18r, rw18r_state, empty_init, "Rockwell", "18R: Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1974, rw30r, 0, 0, rw30r, rw30r, rw30r_state, empty_init, "Rockwell", "30R: Slide Rule Memory (B5500 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, rw31r, rw30r, 0, rw31r, rw30r, rw30r_state, empty_init, "Rockwell", "31R: Slide Rule Memory", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, rw24k, 0, 0, rw24k, rw24k, rw24k_state, empty_init, "Rockwell", "24K (Rockwell)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) diff --git a/src/mame/misc_handheld/hh_sm510.cpp b/src/mame/misc_handheld/hh_sm510.cpp deleted file mode 100644 index 298bbdec48d..00000000000 --- a/src/mame/misc_handheld/hh_sm510.cpp +++ /dev/null @@ -1,10093 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Henrik Algestam -// thanks-to:Sean Riddle, Igor, Lee Robson, Milan Galcik -/*************************************************************************** - -Sharp SM5xx family handhelds. -List of child drivers: -- rzone: Tiger R-Zone - -The LCD screen graphics are provided internally with an SVG file. -MAME external artwork is recommended for the backgrounds inlays. - -Most of these LCD games are meant to stay powered on 24/7. There is no -RTC or NVRAM. Quitting MAME is akin to removing the handheld's battery. -Use -autosave to at least make them remember the highscores. - -TODO: -- improve display decay simulation? but SVG doesn't support setting brightness - per segment, adding pwm_display_device right now has no added value -- add nstarfox sound effect chip emulation -- add svg screen for nsmb3, nsmw -- confirm gnw_bfight rom (assumed to be the same as gnw_bfightn) -- confirm gnw_climber rom (assumed to be the same as gnw_climbern) -- confirm gnw_smb rom (assumed to be the same as gnw_smbn) -- Currently there is no accurate way to dump the SM511/SM512 melody ROM - electronically. For the ones that weren't decapped, they were read by - playing back all melody data and reconstructing it to ROM. Visual(decap) - verification is wanted for: bassmate, gnw_bfightn, gnw_bjack, gnw_bsweep, - gnw_climbern, gnw_dkcirc, gnw_dkhockey, gnw_dkjrp, gnw_dkong3, gnw_gcliff, - gnw_mariocmt, gnw_mariocmta, gnw_mariotj, gnw_mbaway, gnw_mmousep, - gnw_pinball, gnw_popeyep, gnw_sbuster, gnw_snoopyp, gnw_zelda - -**************************************************************************** - -Misc Nintendo Game & Watch notes: - -Trivia: Most of the Nintendo G&W have built-in cheats, likely kept in by -Nintendo to test the game. These were not accessible to users of course, -but for the sake of fun they're available on MAME. - -BTANB: On some of the earlier G&W games, eg. gnw_fire, gnw_mmouse, gnw_pchute, -gnw_popeye, the controls still work after game over, this happens on the real -thing too. - -Game list (* denotes not emulated yet) - -Serial Series MCU Title ---------------------------------------------- -AC-01 s SM5A Ball (aka Toss-Up) -FL-02 s SM5A Flagman (aka Flag Man) -MT-03 s SM5A Vermin (aka The Exterminator) -RC-04 s SM5A Fire (aka Fireman Fireman) -IP-05 s SM5A Judge -MH-06 g SM5A Manhole -CN-07 g SM5A Helmet (aka Headache) -LN-08 g SM5A Lion -PR-21 ws SM5A Parachute -OC-22 ws SM5A Octopus -PP-23 ws SM5A Popeye -FP-24 ws SM5A Chef -MC-25 ws SM5A Mickey Mouse -EG-26 ws SM5A Egg (same ROM as MC-25, but LCD differs) -FR-27 ws SM5A Fire -TL-28 ws SM510 Turtle Bridge -ID-29 ws SM510 Fire Attack -SP-30 ws SM510 Snoopy Tennis -OP-51 ms SM510 Oil Panic -DK-52 ms SM510 Donkey Kong -DM-53 ms SM510 Mickey & Donald -GH-54 ms SM510 Green House -JR-55 ms SM510 Donkey Kong II -MW-56 ms SM510 Mario Bros. -LP-57 ms SM510 Rain Shower -TC-58 ms SM510 Life Boat -PB-59 ms SM511 Pinball -BJ-60 ms SM512 Black Jack -MG-61 ms SM510 Squish -BD-62 ms SM512 Bomb Sweeper -JB-63 ms SM511 Safe Buster -MV-64 ms SM512 Gold Cliff -ZL-65 ms SM512 Zelda -CJ-71* tt SM511? Donkey Kong Jr. -CM-72 tt SM511 Mario's Cement Factory -SM-73* tt SM511? Snoopy -PG-74* tt SM511? Popeye -SM-91 p SM511 Snoopy (assume same ROM & LCD as tabletop version) -PG-92 p SM511 Popeye " -CJ-93 p SM511 Donkey Kong Jr. " -TB-94 p SM511 Mario's Bombs Away -DC-95 p SM511 Mickey Mouse -MK-96 p SM511 Donkey Kong Circus (same ROM as DC-95, LCD is different) -DJ-101 nws SM510 Donkey Kong Jr. -ML-102 nws SM510 Mario's Cement Factory -NH-103 nws SM510 Manhole -TF-104 nws SM510 Tropical Fish -YM-105 nws SM511 Super Mario Bros. -DR-106 nws SM511 Climber -BF-107 nws SM511 Balloon Fight -MB-108 nws SM511 Mario The Juggler -BU-201 sc SM510 Spitball Sparky -UD-202 sc SM510 Crab Grab -BX-301 mvs SM511 Boxing (aka Punch Out) -AK-302 mvs SM511 Donkey Kong 3 -HK-303 mvs SM511 Donkey Kong Hockey -YM-801 cs SM511 Super Mario Bros. (assume same ROM as nws version) -DR-802 cs SM511 Climber " -BF-803 cs SM511 Balloon Fight " -YM-901-S* x SM511 Super Mario Bros. " - -RGW-001 (2010 Ball remake) is on different hardware, ATmega169PV MCU. -The "Mini Classics" keychains are by Stadlbauer, not Nintendo. -The "Game Watch" wristwatches are by Nelsonic, not Nintendo. - -Bassmate Computer (BM-501) is on identical hardware as G&W Multi Screen, -but it's not part of the game series. - -**************************************************************************** - -Regarding Электроника (Elektronika, translated: Electronics): It is not -actually a company. It was a USSR brand name for consumer electronics, -produced by factories belonging to the Ministry of Electronic Industry -(Minelektronprom, МЭП). - -The LCD games were produced by: Angstrem, Mikron, Voschod (Russia), Billur -(Azerbaijan), Kamerton, Evistor (Belarus), Severodonetsk Instrument-Making -Plant (Ukraine), PO Proton and more. Their most popular LCD game (Nu, pogodi!), -is known to be initially produced by Evistor. - -Most of the games are marked "bootleg" in MAME, because the ROM contents are -a 1:1 copy of Nintendo Game & Watch games. Known G&W cloned by Elektronika: -Fire(FR-27), Octopus, Chef, Egg/Mickey Mouse, Donkey Kong Jr.(CJ-93), -Spitball Sparky. - -The MCUs used were not imported from Sharp, but cloned by USSR, renamed to -КБ1013ВК1-2 for SM5A and КБ1013ВК4-2 for SM510. - -***************************************************************************/ - -#include "emu.h" -#include "hh_sm510.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "gnw_dualv.lh" -#include "gnw_dualh.lh" - -//#include "hh_sm510_test.lh" // common test-layout - use external artwork -#include "hh_sm500_test.lh" // " - - -// machine start/reset - -void hh_sm510_state::machine_start() -{ - // resolve handlers - m_out_x.resolve(); - - // determine number of input lines (set it in the subclass constructor if different) - if (m_inp_lines == 0 && m_inp_fixed < 0) - { - for (; m_inputs[m_inp_lines] != nullptr; m_inp_lines++) { ; } - - // when last input line is fixed(GND) - if (m_inp_fixed == -2) - { - m_inp_lines--; - m_inp_fixed = m_inp_lines; - } - } - - // 1kHz display decay ticks - m_display_decay_timer = timer_alloc(FUNC(hh_sm510_state::display_decay_tick), this); - m_display_decay_timer->adjust(attotime::from_hz(1024), 0, attotime::from_hz(1024)); - - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_inp_lines)); - save_item(NAME(m_inp_fixed)); - save_item(NAME(m_speaker_data)); - save_item(NAME(m_s)); - save_item(NAME(m_r)); - - save_item(NAME(m_display_x_len)); - save_item(NAME(m_display_y_len)); - save_item(NAME(m_display_z_len)); - save_item(NAME(m_display_state)); - save_item(NAME(m_display_decay)); - save_item(NAME(m_decay_pivot)); - save_item(NAME(m_decay_len)); -} - -void hh_sm510_state::machine_reset() -{ -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// lcd panel - on lcd handhelds, usually not a generic x/y screen device -// deflicker here, especially needed for SM500/SM5A with the active shift register - -TIMER_CALLBACK_MEMBER(hh_sm510_state::display_decay_tick) -{ - u8 z_mask = (1 << m_display_z_len) - 1; - u8 zx_len = 1 << (m_display_x_len + m_display_z_len); - - for (int zx = 0; zx < zx_len; zx++) - { - for (int y = 0; y < m_display_y_len; y++) - { - // delay lcd segment on/off state - if (m_display_state[zx] >> y & 1) - { - if (m_display_decay[y][zx] < (m_decay_pivot + m_decay_len)) - m_display_decay[y][zx]++; - } - else if (m_display_decay[y][zx] > 0) - m_display_decay[y][zx]--; - u8 active_state = (m_display_decay[y][zx] < m_decay_pivot) ? 0 : 1; - - // SM510 series: output to x.y.z, where: - // x = group a/b/bs/c (0/1/2/3) - // y = segment 1-16 (0-15) - // z = common H1-H4 (0-3) - - // SM500/SM530 series: output to x.y.z, where: - // x = O group (0-*) - // y = O segment 1-4 (0-3) - // z = common H1/H2 (0/1) - m_out_x[zx >> m_display_z_len][y][zx & z_mask] = active_state; - } - } -} - -void hh_sm510_state::set_display_size(u8 x, u8 y, u8 z) -{ - // x = groups(in bits) - // y = number of segments per group - // z = commons(in bits) - m_display_x_len = x; - m_display_y_len = y; - m_display_z_len = z; -} - -void hh_sm510_state::sm510_lcd_segment_w(offs_t offset, u16 data) -{ - set_display_size(2, 16, 2); - m_display_state[offset] = data; -} - -void hh_sm510_state::sm500_lcd_segment_w(offs_t offset, u16 data) -{ - set_display_size(4, 4, 1); - m_display_state[offset] = data; -} - - -// generic input handlers - usually S output is input mux, and K input for buttons - -u8 hh_sm510_state::read_inputs(int columns, int fixed) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - if (fixed >= 0) - ret |= m_inputs[fixed]->read(); - - return ret; -} - -void hh_sm510_state::update_k_line() -{ - // this is necessary because the MCU can wake up on K input activity - m_maincpu->set_input_line(0, input_r() ? ASSERT_LINE : CLEAR_LINE); -} - -INPUT_CHANGED_MEMBER(hh_sm510_state::input_changed) -{ - update_k_line(); -} - -void hh_sm510_state::input_w(u8 data) -{ - m_inp_mux = data; - update_k_line(); -} - -u8 hh_sm510_state::input_r() -{ - return read_inputs(m_inp_lines, m_inp_fixed); -} - -INPUT_CHANGED_MEMBER(hh_sm510_state::acl_button) -{ - // ACL button is directly tied to MCU ACL pin - m_maincpu->set_input_line(SM510_INPUT_LINE_ACL, newval ? ASSERT_LINE : CLEAR_LINE); -} - - -// other generic output handlers - -void hh_sm510_state::piezo_r1_w(u8 data) -{ - // R1 to piezo (SM511 R pin is melody output) - m_speaker->level_w(data & 1); -} - -void hh_sm510_state::piezo_r2_w(u8 data) -{ - // R2 to piezo - m_speaker->level_w(data >> 1 & 1); -} - -void hh_sm510_state::piezo_input_w(u8 data) -{ - // R1 to piezo, other to input mux - piezo_r1_w(data & 1); - input_w(data >> 1); -} - -void hh_sm510_state::piezo2bit_r1_w(u8 data) -{ - // R1(+S1) to piezo - m_speaker_data = (m_speaker_data & ~1) | (data & 1); - m_speaker->level_w(m_speaker_data); -} - -void hh_sm510_state::piezo2bit_input_w(u8 data) -{ - // S1(+R1) to piezo, other to input mux - m_speaker_data = (m_speaker_data & ~2) | (data << 1 & 2); - m_speaker->level_w(m_speaker_data); - input_w(data >> 1); -} - - - -/*************************************************************************** - - Common Machine Configurations - -***************************************************************************/ - -// building blocks - -void hh_sm510_state::mcfg_cpu_common(machine_config &config) -{ - m_maincpu->read_k().set(FUNC(hh_sm510_state::input_r)); - m_maincpu->read_ba().set([this] () { return m_io_ba.read_safe(1); }); - m_maincpu->read_b().set([this] () { return m_io_b.read_safe(1); }); -} - -void hh_sm510_state::mcfg_cpu_sm5a(machine_config &config) -{ - SM5A(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); -} - -void hh_sm510_state::mcfg_cpu_kb1013vk12(machine_config &config) -{ - KB1013VK12(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); -} - -void hh_sm510_state::mcfg_cpu_sm510(machine_config &config) -{ - SM510(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->set_r_mask_option(2); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm511(machine_config &config) -{ - SM511(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm512(machine_config &config) -{ - SM512(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm510_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_cpu_sm530(machine_config &config) -{ - SM530(config, m_maincpu); - mcfg_cpu_common(config); - m_maincpu->write_segs().set(FUNC(hh_sm510_state::sm500_lcd_segment_w)); - m_maincpu->write_s().set(FUNC(hh_sm510_state::input_w)); -} - -void hh_sm510_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) -{ - screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(width, height); - screen.set_visarea_full(); -} - -void hh_sm510_state::mcfg_sound_r1(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_r1_w)); -} - - -// common presets - -void hh_sm510_state::sm5a_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm5a(config); - mcfg_sound_r1(config); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::kb1013vk12_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_kb1013vk12(config); - mcfg_sound_r1(config); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo_input_w)); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm510_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm510(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm511_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm511(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - -void hh_sm510_state::sm530_common(machine_config &config, u16 width, u16 height) -{ - mcfg_cpu_sm530(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, width, height); -} - - -// deviations - -// multi-screen - -void hh_sm510_state::sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight) -{ - mcfg_cpu_sm510(config); - mcfg_sound_r1(config); - mcfg_svg_screen(config, leftwidth, leftheight, "screen_left"); - mcfg_svg_screen(config, rightwidth, rightheight, "screen_right"); - - config.set_default_layout(layout_gnw_dualh); -} - -void hh_sm510_state::dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_sound_r1(config); - mcfg_svg_screen(config, topwidth, topheight, "screen_top"); - mcfg_svg_screen(config, botwidth, botheight, "screen_bottom"); - - config.set_default_layout(layout_gnw_dualv); -} - -void hh_sm510_state::sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm510(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - -void hh_sm510_state::sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm511(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - -void hh_sm510_state::sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight) -{ - mcfg_cpu_sm512(config); - dualv_common(config, topwidth, topheight, botwidth, botheight); -} - - -// Tiger (SM510 R mask is direct, BA/B pins always connected) - -void hh_sm510_state::sm510_tiger(machine_config &config, u16 width, u16 height) -{ - sm510_common(config, width, height); - - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->read_ba().set_ioport("BA"); - m_maincpu->read_b().set_ioport("B"); -} - -void hh_sm510_state::sm511_tiger1bit(machine_config &config, u16 width, u16 height) -{ - sm511_common(config, width, height); - - m_maincpu->read_ba().set_ioport("BA"); - m_maincpu->read_b().set_ioport("B"); -} - -void hh_sm510_state::sm511_tiger2bit(machine_config &config, u16 width, u16 height) -{ - sm511_tiger1bit(config, width, height); - - m_maincpu->write_s().set(FUNC(hh_sm510_state::piezo2bit_input_w)); - m_maincpu->write_r().set(FUNC(hh_sm510_state::piezo2bit_r1_w)); - - // R via 120K resistor, S1 via 39K resistor (eg. tsonic, tsonic2, tbatmana) - static const double speaker_levels[] = { 0.0, 1.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(4, speaker_levels); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Nintendo Game & Watch: Ball (model AC-01) - * PCB label AC-01 - * Sharp SM5A label AC-01 5009 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as Toss-Up by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_ball_state : public hh_sm510_state -{ -public: - gnw_ball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_ball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ball ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_ball_state::gnw_ball(machine_config &config) -{ - sm5a_common(config, 1671, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ball ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ac-01", 0x0000, 0x0740, CRC(ac94e6e4) SHA1(8270cb61f9fbff252eafec411b4c67f0171f8687) ) - - ROM_REGION( 71748, "screen", 0) - ROM_LOAD( "gnw_ball.svg", 0, 71748, CRC(7c116eaf) SHA1(578882af492b8a9f1eb72e06a547c8b574255fb9) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Flagman (model FL-02) - * PCB label FL-02 - * Sharp SM5A label FL-02 2005 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as Flag Man by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_flagman_state : public hh_sm510_state -{ -public: - gnw_flagman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_flagman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_flagman ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("4") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_flagman_state::gnw_flagman(machine_config &config) -{ - sm5a_common(config, 1511, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_flagman ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fl-02", 0x0000, 0x0740, CRC(cc7a99e4) SHA1(d03d9a6b278bc11df7839708831241b5fa805f69) ) - - ROM_REGION( 56163, "screen", 0) - ROM_LOAD( "gnw_flagman.svg", 0, 56163, CRC(3aa97c65) SHA1(a363e71d371e5c85835cb3a0679760d0aedc75d5) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Vermin (model MT-03) - * PCB label MT-03 - * Sharp SM5A label MT-03 5012 (no decap) - * lcd screen with custom segments, 1-bit sound - - In the USA, it was distributed as The Exterminator by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_vermin_state : public hh_sm510_state -{ -public: - gnw_vermin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_vermin(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_vermin ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_vermin_state::gnw_vermin(machine_config &config) -{ - sm5a_common(config, 1650, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_vermin ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mt-03", 0x0000, 0x0740, CRC(f8493177) SHA1(d629432ef8e9fbd7bbdc3fbeb45d9bd70d9d571b) ) - - ROM_REGION( 105603, "screen", 0) - ROM_LOAD( "gnw_vermin.svg", 0, 105603, CRC(1bd59ef4) SHA1(099120105e80d4753838ea513ffa784c4690cf5f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire (model RC-04) - * PCB label RC-04 - * Sharp SM5A label RC-04 5103 (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the silver version, there's also a wide screen version. - - In the USA, it was distributed as Fireman Fireman by Mego under their Time-Out series. - -***************************************************************************/ - -class gnw_fires_state : public hh_sm510_state -{ -public: - gnw_fires_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void gnw_fires(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fires ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_CONFNAME( 0x08, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_fires_state::gnw_fires(machine_config &config) -{ - sm5a_common(config, 1646, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fires ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "rc-04", 0x0000, 0x0740, CRC(154ef27d) SHA1(fb65826dfd405ad05fe0f5f947c213214bbd61c0) ) - - ROM_REGION( 102678, "screen", 0) - ROM_LOAD( "gnw_fires.svg", 0, 102678, CRC(4f61f2f8) SHA1(2873629f0e36d3170bc284fa031a9c6181021495) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Judge (model IP-05) - * PCB label IP-05 - * Sharp SM5A label IP-05 5010, or IP-15 5012 (no decap) - * lcd screen with custom segments, 1-bit sound - - The first (green) issue of the game contains a bug where the players are - scored differently when wrongly dodging a win. This issue is fixed in the - second (purple) issue. - -***************************************************************************/ - -class gnw_judge_state : public hh_sm510_state -{ -public: - gnw_judge_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_judge(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_judge ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Dodge") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P2 Hit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Dodge") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("P1 Hit") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") // 2-Player - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") // 1-Player - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Increase Computer's Operation Time (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_judge_state::gnw_judge(machine_config &config) -{ - sm5a_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_judge ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ip-15", 0x0000, 0x0740, CRC(f6ed6f62) SHA1(97bc1b5c383fb4077d982cfdc5a7d7603a0b5e2f) ) - - ROM_REGION( 105108, "screen", 0) - ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) -ROM_END - -ROM_START( gnw_judgeo ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ip-05", 0x0000, 0x0740, CRC(1b28a834) SHA1(cb8dbbf678ba22c4484d18cc1a6b99c1d34d1951) ) - - ROM_REGION( 105108, "screen", 0) - ROM_LOAD( "gnw_judge.svg", 0, 105108, CRC(7760e82e) SHA1(cfc1f08465ecc8ac3385bcb078268cbbfca9fc41) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Manhole (model MH-06) - * PCB label MH-06 - * Sharp SM5A label MH-06 5104 (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the Gold Series version, there's also a new wide screen version - (NH-103) - -***************************************************************************/ - -class gnw_manholeg_state : public hh_sm510_state -{ -public: - gnw_manholeg_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_manholeg(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_manholeg ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_manholeg_state::gnw_manholeg(machine_config &config) -{ - sm5a_common(config, 1667, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_manholeg ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mh-06", 0x0000, 0x0740, CRC(ae52c425) SHA1(8da8a714ecbdde7d0f257b52a5014993675a5f3f) ) - - ROM_REGION( 125607, "screen", 0) - ROM_LOAD( "gnw_manholeg.svg", 0, 125607, CRC(4b281ff2) SHA1(18f212ab5738756e0841d6afa401a03f7aaddf7b) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Helmet (model CN-07) - * PCB label CN-07 - * Sharp SM5A label CN-07 5102, or CN-17 21ZA (no decap) - * lcd screen with custom segments, 1-bit sound - - In the UK, it was distributed as Headache by CGL. - - MCU label CN-07 is the first version, CN-17 is a bugfix release. - -***************************************************************************/ - -class gnw_helmet_state : public hh_sm510_state -{ -public: - gnw_helmet_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_helmet(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_helmet ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_helmet_state::gnw_helmet(machine_config &config) -{ - sm5a_common(config, 1657, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_helmet ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "cn-17", 0x0000, 0x0740, CRC(6d251e2e) SHA1(c61f591514de36fb2270038a6505945564c9f90e) ) - - ROM_REGION( 109404, "screen", 0) - ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) -ROM_END - -ROM_START( gnw_helmeto ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "cn-07", 0x0000, 0x0740, CRC(30c8bc90) SHA1(f5ac0fe7a09ee1ad6f6e4bd096b4be20f65d73db) ) - - ROM_REGION( 109404, "screen", 0) - ROM_LOAD( "gnw_helmet.svg", 0, 109404, CRC(0dce1694) SHA1(412e69054b95f17fe08545f3c303c11abbe26304) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Lion (model LN-08) - * PCB label LN-08 - * Sharp SM5A label LN-08 519A (no decap) - * lcd screen with custom segments, 1-bit sound - - BTANB: The game doesn't support simultaneous button presses for the controls, - it's the same as in eg. gnw_mmouse but in this game it doesn't make much sense - with the 2 separate guys. More likely a bad game design choice than bug. - -***************************************************************************/ - -class gnw_lion_state : public hh_sm510_state -{ -public: - gnw_lion_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_lion(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_lion ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Increase Speed (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) // display test? - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_lion_state::gnw_lion(machine_config &config) -{ - sm5a_common(config, 1646, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_lion ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ln-08", 0x0000, 0x0740, CRC(9677681d) SHA1(6f7c960e04b63f1b7d926b598413f4c818b8fe53) ) - - ROM_REGION( 155863, "screen", 0) - ROM_LOAD( "gnw_lion.svg", 0, 155863, CRC(b5a5a4dc) SHA1(49d894d6e1d1fb35cd11f08c7ce30518be89dd0f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Parachute (model PR-21) - * PCB label PR-21Y - * Sharp SM5A label PR-21 52XC (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_pchute_state : public hh_sm510_state -{ -public: - gnw_pchute_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_pchute(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_pchute ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- disable after boot - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_pchute_state::gnw_pchute(machine_config &config) -{ - sm5a_common(config, 1602, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_pchute ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "pr-21", 0x0000, 0x0740, CRC(392b545e) SHA1(e71940cd4cee07ba1e62c1c7d9e9b19410e7232d) ) - - ROM_REGION( 169640, "screen", 0) - ROM_LOAD( "gnw_pchute.svg", 0, 169640, CRC(f30a0b31) SHA1(676989a418ae0dfe6bb1b097640422219c930453) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Octopus (model OC-22) - * PCB label OC-22Y A - * Sharp SM5A label OC-22 204A (no decap) - * lcd screen with custom segments, 1-bit sound - - Also cloned in 1989 by Elektronika(USSR) as Тайны океана (Tayny okeana, export - version: Mysteries of the Ocean), ROM is identical, graphics as well except - for the AM/PM/GAME segments. - -***************************************************************************/ - -class gnw_octopus_state : public hh_sm510_state -{ -public: - gnw_octopus_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_octopus(machine_config &config); - void taynyoke(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_octopus ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // " - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_octopus_state::gnw_octopus(machine_config &config) -{ - sm5a_common(config, 1586, 1080); // R mask option confirmed -} - -void gnw_octopus_state::taynyoke(machine_config &config) -{ - kb1013vk12_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_octopus ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "oc-22", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) - - ROM_REGION( 119827, "screen", 0) - ROM_LOAD( "gnw_octopus.svg", 0, 119827, CRC(efbdaa65) SHA1(42c746bef282176d59f57ddf7328f8d034f4ca02) ) -ROM_END - -ROM_START( taynyoke ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-03.bin", 0x0000, 0x0740, CRC(bd27781d) SHA1(07b4feb9265c83b159f96c7e8ee1c61a2cc17dc5) ) - - ROM_REGION( 93910, "screen", 0) - ROM_LOAD( "taynyoke.svg", 0, 93910, CRC(da7a835e) SHA1(1fe427a60bbf78fdf29ea401ec86b225098b68bb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Popeye (model PP-23) - * PCB label PP-23 Y - * Sharp SM5A label PP-23 52YD (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the wide screen version, there's also tabletop and panorama versions. - -***************************************************************************/ - -class gnw_popeye_state : public hh_sm510_state -{ -public: - gnw_popeye_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_popeye(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_popeye ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_popeye_state::gnw_popeye(machine_config &config) -{ - sm5a_common(config, 1604, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_popeye ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "pp-23", 0x0000, 0x0740, CRC(49987769) SHA1(ad90659a3ce7169a4df16367c5307435d9f9d956) ) - - ROM_REGION( 218587, "screen", 0) - ROM_LOAD( "gnw_popeye.svg", 0, 218587, CRC(4740bcd5) SHA1(a46ab455f2dd41caabd6c85cfa7dfde70805f157) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Chef (model FP-24) - * PCB label FP-24 - * Sharp SM5A label FP-24 51YB (die label CMS646, ROM ID 74) - * lcd screen with custom segments, 1-bit sound - - In 1989, Elektronika(USSR) released a clone: Весёлый повар (Vesyolyy povar, - export version: Merry Cook). This game shares the same ROM, though the graphics - are slightly different. - -***************************************************************************/ - -class gnw_chef_state : public hh_sm510_state -{ -public: - gnw_chef_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void vespovar(machine_config &config); - void gnw_chef(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_chef ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_chef_state::gnw_chef(machine_config &config) -{ - sm5a_common(config, 1666, 1080); // assuming same R mask option as merry cook -} - -void gnw_chef_state::vespovar(machine_config & config) -{ - kb1013vk12_common(config, 1679, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_chef ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fp-24", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) - - ROM_REGION( 199518, "screen", 0) - ROM_LOAD( "gnw_chef.svg", 0, 199518, CRC(ecc18d28) SHA1(1c0b7dfff71faa4d4395c19a84454870e403f927) ) -ROM_END - -ROM_START( vespovar ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-04.bin", 0x0000, 0x0740, CRC(2806ab39) SHA1(18261a80eec5bf768bb88b803c598f80e078c71f) ) - - ROM_REGION( 144128, "screen", 0) - ROM_LOAD( "vespovar.svg", 0, 144128, CRC(dcd1c073) SHA1(e15bf643f17b7ead37407c985e053e6434683d7c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey Mouse (model MC-25), Egg (model EG-26) - * PCB label MC-25 EG-26 (yes, both listed) - * Sharp SM5A label MC-25 51YD (Mickey Mouse), MC-25 519D (Egg) (no decap) - * lcd screen with custom segments, 1-bit sound - - MC-25 and EG-26 are the same game, it's assumed that the latter was for - regions where Nintendo wasn't able to license from Disney. - - In 1984, Электроника (Elektronika, USSR) released an unlicensed clone: - Ну, погоди! (Nu, pogodi!). This was followed by several other titles that - were the same under the hood, only differing in graphics. They also made a - slightly modified version, adding a new game mode (by pressing A+B) where the - player/CPU roles are reversed. This version is known as Разведчики космоса - (Razvedchiki kosmosa, export version: Explorers of Space). - - The following Mickey Mouse Elektronika clones are emulated in MAME: - - Model Title Transliteration Export version Note - --------------------------------------------------------------------------------- - ИМ-02 Ну, погоди! Nu, pogodi! - - - ИМ-10 Хоккей Hockey (Khokkey) Ice Hockey Export version manufactured by PO Proton - ИМ-13 Разведчики космоса Razvedchiki kosmosa Explorers of Space Modified ROM (see note above) - ИМ-16 Охота Okhota Fowling - - ИМ-19 Биатлон Biathlon (Biatlon) - - - ИМ-22 Весёлые футболисты Vesyolye futbolisty Monkey Goalkeeper - - ИМ-32 Кот-рыболов Kot-rybolov - - - ИМ-33 Квака-задавака Kvaka-zadavaka Frogling - - ИМ-49 Ночные воришки Nochnye vorishki Night Burglars - - ИМ-50 Космический полёт Kosmicheskiy polyot Space Flight The Model ID is the same as Весёлая арифметика (Vesyolaya arithmetika, export version: Amusing Arithmetic) (not emulated in MAME) - ИМ-51 Морская атака Morskaya ataka - - - ИМ-53 Атака астероидов Ataka asteroidov - Graphics are very similar to ИМ-50 - - Цирк Circus (Tsirk) - Unknown Model ID - -***************************************************************************/ - -class gnw_mmouse_state : public hh_sm510_state -{ -public: - gnw_mmouse_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mmouse(machine_config &config); - void gnw_egg(machine_config &config); - void nupogodi(machine_config &config); - void ehockey(machine_config &config); - void rkosmosa(machine_config &config); - void okhota(machine_config &config); - void biathlon(machine_config &config); - void vfutbol(machine_config &config); - void krybolov(machine_config &config); - void kvakazad(machine_config &config); - void nochnyev(machine_config &config); - void kosmicpt(machine_config &config); - void morataka(machine_config &config); - void atakaast(machine_config &config); - void ecircus(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mmouse ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB -- only works after power-on - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -static INPUT_PORTS_START( rkosmosa ) - PORT_INCLUDE( gnw_mmouse ) - - PORT_MODIFY("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void gnw_mmouse_state::gnw_mmouse(machine_config &config) -{ - sm5a_common(config, 1684, 1080); // R mask option confirmed -} - -void gnw_mmouse_state::gnw_egg(machine_config &config) -{ - sm5a_common(config, 1690, 1080); // R mask option confirmed -} - -void gnw_mmouse_state::nupogodi(machine_config &config) -{ - kb1013vk12_common(config, 1715, 1080); // R mask option ? -} - -void gnw_mmouse_state::ehockey(machine_config &config) -{ - kb1013vk12_common(config, 1782, 1080); // R mask option ? -} - -void gnw_mmouse_state::rkosmosa(machine_config &config) -{ - kb1013vk12_common(config, 1646, 1080); // R mask option ? -} - -void gnw_mmouse_state::okhota(machine_config &config) -{ - kb1013vk12_common(config, 1632, 1080); // R mask option ? -} - -void gnw_mmouse_state::biathlon(machine_config &config) -{ - kb1013vk12_common(config, 1633, 1080); // R mask option ? -} - -void gnw_mmouse_state::vfutbol(machine_config &config) -{ - kb1013vk12_common(config, 1655, 1080); // R mask option ? -} - -void gnw_mmouse_state::krybolov(machine_config &config) -{ - kb1013vk12_common(config, 1638, 1080); // R mask option ? -} - -void gnw_mmouse_state::kvakazad(machine_config &config) -{ - kb1013vk12_common(config, 1660, 1080); // R mask option ? -} - -void gnw_mmouse_state::nochnyev(machine_config &config) -{ - kb1013vk12_common(config, 1641, 1080); // R mask option ? -} - -void gnw_mmouse_state::kosmicpt(machine_config &config) -{ - kb1013vk12_common(config, 1658, 1080); // R mask option ? -} - -void gnw_mmouse_state::morataka(machine_config &config) -{ - kb1013vk12_common(config, 1648, 1080); // R mask option ? -} - -void gnw_mmouse_state::atakaast(machine_config &config) -{ - kb1013vk12_common(config, 1620, 1080); // R mask option ? -} - -void gnw_mmouse_state::ecircus(machine_config &config) -{ - kb1013vk12_common(config, 1657, 1080); // R mask option ? -} - -// roms - -ROM_START( gnw_mmouse ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 181706, "screen", 0) - ROM_LOAD( "gnw_mmouse.svg", 0, 181706, CRC(60cdc76a) SHA1(09755abd16222c1a0fe6c7ebb902706440d3e369) ) -ROM_END - -ROM_START( gnw_egg ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "mc-25", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 193119, "screen", 0) - ROM_LOAD( "gnw_egg.svg", 0, 193119, CRC(1e469fe5) SHA1(bc80114337feefca590e48c823e8488f6b63f896) ) -ROM_END - -ROM_START( nupogodi ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-02.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 154233, "screen", 0) - ROM_LOAD( "nupogodi.svg", 0, 154233, CRC(42cfb84a) SHA1(249ca7ec78066b57f9a18e48ada64712c944e461) ) -ROM_END - -ROM_START( ehockey ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-10.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 94977, "screen", 0) - ROM_LOAD( "ehockey.svg", 0, 94977, CRC(98cf43b0) SHA1(4353505709612344cd3b597c3b4e9f6b441ddb66) ) -ROM_END - -ROM_START( rkosmosa ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-13.bin", 0x0000, 0x0740, CRC(553e2b09) SHA1(2b74f8437b881fbb62b61f25435a5bfc66872a9a) ) - - ROM_REGION( 81420, "screen", 0) - ROM_LOAD( "rkosmosa.svg", 0, 81420, CRC(dc6632be) SHA1(0906d933f4cda39ee1e57b502651a821e61e95ef) ) -ROM_END - -ROM_START( okhota ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-16.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 117838, "screen", 0) - ROM_LOAD( "okhota.svg", 0, 117838, CRC(7de707c6) SHA1(c876ea16bd8af033086e2e20860d2e1d09296d59) ) -ROM_END - -ROM_START( biathlon ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-19.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 116377, "screen", 0) - ROM_LOAD( "biathlon.svg", 0, 116377, CRC(fadf729e) SHA1(671f9496e2bfe7b4800ee7bad039485e19958428) ) -ROM_END - -ROM_START( vfutbol ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-22.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 131901, "screen", 0) - ROM_LOAD( "vfutbol.svg", 0, 131901, CRC(85811308) SHA1(288aa41bade08c61e0d346b9c1109179564e34ed) ) -ROM_END - -ROM_START( krybolov ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-32.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 132804, "screen", 0) - ROM_LOAD( "krybolov.svg", 0, 132804, CRC(4e3e70d3) SHA1(18f1300afa601deb6ac01dcf7dca88187b7940a3) ) -ROM_END - -ROM_START( kvakazad ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-33.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 131961, "screen", 0) - ROM_LOAD( "kvakazad.svg", 0, 131961, CRC(37b27420) SHA1(25d9e273f056c10e3a5bc4476ce980bfdb8095e1) ) -ROM_END - -ROM_START( nochnyev ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-49.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 136498, "screen", 0) - ROM_LOAD( "nochnyev.svg", 0, 136498, CRC(24a287cd) SHA1(2d14aa9b55b42c634df141fe4037ae286549b17b) ) -ROM_END - -ROM_START( kosmicpt ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-50.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 110214, "screen", 0) - ROM_LOAD( "kosmicpt.svg", 0, 110214, CRC(ccef6d27) SHA1(71f3cf49a5797ed9296f1e86ec4575ffefab67dd) ) -ROM_END - -ROM_START( morataka ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-51.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 105057, "screen", 0) - ROM_LOAD( "morataka.svg", 0, 105057, CRC(c235c56c) SHA1(b6ef74ba7826221683243e23513270d0f0f2cfda) ) -ROM_END - -ROM_START( atakaast ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-53.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 105570, "screen", 0) - ROM_LOAD( "atakaast.svg", 0, 105570, CRC(3d79aacc) SHA1(bc25969f4d6fa75b320130c920ac0bdc8fb44cbd) ) -ROM_END - -ROM_START( ecircus ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "ecircus.bin", 0x0000, 0x0740, CRC(cb820c32) SHA1(7e94fc255f32db725d5aa9e196088e490c1a1443) ) - - ROM_REGION( 124643, "screen", 0) - ROM_LOAD( "ecircus.svg", 0, 124643, CRC(079f25db) SHA1(defa784c80e01ce6affbb424930674114275bea1) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire (model FR-27) - * PCB label FR-27 - * Sharp SM5A label FR-27 523B (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the wide screen version, there's also a silver version. Doing a - hex-compare between the two, this one seems to be a complete rewrite. - FR-27 is the last G&W on SM5A, they were followed with SM51x. - - In 1989 Elektronika(USSR) released a clone: Космический мост (Kosmicheskiy most, - export version: Space Bridge). This game shares the same ROM, though the - graphics are different. - -***************************************************************************/ - -class gnw_fire_state : public hh_sm510_state -{ -public: - gnw_fire_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kosmicmt(machine_config &config); - void gnw_fire(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fire ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // reset? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) // lcd test? - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_fire_state::gnw_fire(machine_config &config) -{ - sm5a_common(config, 1624, 1080); // R mask option confirmed -} - -void gnw_fire_state::kosmicmt(machine_config & config) -{ - kb1013vk12_common(config, 1673, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fire ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "fr-27", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) - - ROM_REGION( 163920, "screen", 0) - ROM_LOAD( "gnw_fire.svg", 0, 163920, CRC(be8a9f05) SHA1(644d8bed6228fa7e2f541b60fcfc1a0d97df0df6) ) -ROM_END - -ROM_START( kosmicmt ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-09.bin", 0x0000, 0x0740, CRC(f4c53ef0) SHA1(6b57120a0f9d2fd4dcd65ad57a5f32def71d905f) ) - - ROM_REGION( 124578, "screen", 0) - ROM_LOAD( "kosmicmt.svg", 0, 124578, CRC(913324ef) SHA1(6e72f7f517da754075af11283d71fc8d24ac0529) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Turtle Bridge (model TL-28) - * PCB label TL-28 - * Sharp SM510 label TL-28 523C (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_tbridge_state : public hh_sm510_state -{ -public: - gnw_tbridge_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: unwanted segments light up - m_decay_pivot = 25; - m_decay_len = 25; - } - - void gnw_tbridge(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_tbridge ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_tbridge_state::gnw_tbridge(machine_config &config) -{ - sm510_common(config, 1587, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_tbridge ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tl-28", 0x0000, 0x1000, CRC(284e7224) SHA1(b50d7f3a527ffe50771ef55fdf8214929bfa2253) ) - - ROM_REGION( 242944, "screen", 0) - ROM_LOAD( "gnw_tbridge.svg", 0, 242944, CRC(bf66cb38) SHA1(3f19d1e6584062944e56107d47ebe26335d50f42) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Fire Attack (model ID-29) - * PCB label ID-29 - * Sharp SM510 label ID-29 524B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_fireatk_state : public hh_sm510_state -{ -public: - gnw_fireatk_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_fireatk(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_fireatk ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_fireatk_state::gnw_fireatk(machine_config &config) -{ - sm510_common(config, 1655, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_fireatk ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "id-29", 0x0000, 0x1000, CRC(5f6e8042) SHA1(63afc3acd8a2a996095fa8ba2dfccd48e5214478) ) - - ROM_REGION( 267914, "screen", 0) - ROM_LOAD( "gnw_fireatk.svg", 0, 267914, CRC(f9eea340) SHA1(1fbc224dac447fe3902920ee3f1afc11150b5962) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Snoopy Tennis (model SP-30) - * PCB label SP-30 - * Sharp SM510 label SP-30 525B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_stennis_state : public hh_sm510_state -{ -public: - gnw_stennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_stennis(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_stennis ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_stennis_state::gnw_stennis(machine_config &config) -{ - sm510_common(config, 1581, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_stennis ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "sp-30", 0x0000, 0x1000, CRC(ba1d9504) SHA1(ff601765d88564b1570a59f5b1a4005c7b0fd66c) ) - - ROM_REGION( 228125, "screen", 0) - ROM_LOAD( "gnw_stennis.svg", 0, 228125, CRC(1134ef9a) SHA1(6f35a4d610c952663761f7ccb74c6650752cac77) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Oil Panic (model OP-51) - * PCB label OP-51A - * Sharp SM510 label OP-51 28ZB (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_opanic_state : public hh_sm510_state -{ -public: - gnw_opanic_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_opanic(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_opanic ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_opanic_state::gnw_opanic(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1292/2, 1920/2, 1230/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_opanic ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "op-51", 0x0000, 0x1000, CRC(31c288c9) SHA1(4bfd0fba94a9927cefc925db8196b063c5dd9b19) ) - - ROM_REGION( 79771, "screen_top", 0) - ROM_LOAD( "gnw_opanic_top.svg", 0, 79771, CRC(0e1e6485) SHA1(15d5ec48cad65759a50ed624e4161a8f2513f704) ) - - ROM_REGION( 112962, "screen_bottom", 0) - ROM_LOAD( "gnw_opanic_bottom.svg", 0, 112962, CRC(ae4f4f1f) SHA1(97907bea3ca92759a0ea889e80d60d25a701027a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong (model DK-52) - * PCB label DK-52C - * Sharp SM510 label DK-52 52ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong_state : public hh_sm510_state -{ -public: - gnw_dkong_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong_state::gnw_dkong(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1266/2, 1920/2, 1266/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkong ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dk-52", 0x0000, 0x1000, CRC(5180cbf8) SHA1(5174570a8d6a601226f51e972bac6735535fe11d) ) - - ROM_REGION( 176843, "screen_top", 0) - ROM_LOAD( "gnw_dkong_top.svg", 0, 176843, CRC(16c16b84) SHA1(fa2e54c04366a30b51de024296b9f94c1cb76d68) ) - - ROM_REGION( 145516, "screen_bottom", 0) - ROM_LOAD( "gnw_dkong_bottom.svg", 0, 145516, CRC(2b711e9d) SHA1(0e263020cbe0e8b88bb68e3176630639b518935e) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey & Donald (model DM-53) - * PCB label DM-53 - * Sharp SM510 label DM-53 52ZC (die label CMS54C, CMS565) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mickdon_state : public hh_sm510_state -{ -public: - gnw_mickdon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mickdon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mickdon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mickdon_state::gnw_mickdon(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1281/2, 1920/2, 1236/2); // R mask option confirmed - - m_maincpu->write_r().set(FUNC(gnw_mickdon_state::piezo_r2_w)); -} - -// roms - -ROM_START( gnw_mickdon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dm-53_565", 0x0000, 0x1000, CRC(e21fc0f5) SHA1(3b65ccf9f98813319410414e11a3231b787cdee6) ) - - ROM_REGION( 126477, "screen_top", 0) - ROM_LOAD( "gnw_mickdon_top.svg", 0, 126477, CRC(11e02fce) SHA1(fe2700711c73940a9488a6d223db4c4e92df4188) ) - - ROM_REGION( 122915, "screen_bottom", 0) - ROM_LOAD( "gnw_mickdon_bottom.svg", 0, 122915, CRC(b8cf63c2) SHA1(2406c9826f94a345ca9641e51fb26088f434960c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Green House (model GH-54) - * PCB label GH-54 - * Sharp SM510 label GH-54 52ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - - After the 20,000,000th G&W, Nintendo made a special edition of Green House - (still model GH-54), with the box art showing all the released games so far. - -***************************************************************************/ - -class gnw_ghouse_state : public hh_sm510_state -{ -public: - gnw_ghouse_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_ghouse(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ghouse ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Spray - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_ghouse_state::gnw_ghouse(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1303/2, 1920/2, 1274/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ghouse ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "gh-54", 0x0000, 0x1000, CRC(4df12b4d) SHA1(708be5fef8dbd9337f5ab35baaca5bdf21e1f36c) ) - - ROM_REGION( 159258, "screen_top", 0) - ROM_LOAD( "gnw_ghouse_top.svg", 0, 159258, CRC(308c9c86) SHA1(e83d114e702b6da3cba4e45bd48edfe9882afac1) ) - - ROM_REGION( 149922, "screen_bottom", 0) - ROM_LOAD( "gnw_ghouse_bottom.svg", 0, 149922, CRC(c07c6bb8) SHA1(7a0d6f38ecdbfcd09ab967417fa9d06b5c5c21e4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong II (model JR-55) - * PCB label JR-55 - * Sharp SM510 label JR-55 53YC (die label CMS54C, KMS560) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong2_state : public hh_sm510_state -{ -public: - gnw_dkong2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong2_state::gnw_dkong2(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1241/2, 1920/2, 1237/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkong2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "jr-55_560", 0x0000, 0x1000, CRC(46aed0ae) SHA1(72f75ccbd84aea094148c872fc7cc1683619a18a) ) - - ROM_REGION( 267462, "screen_top", 0) - ROM_LOAD( "gnw_dkong2_top.svg", 0, 267462, CRC(41bb5414) SHA1(20c7af7c64e12273320029eecc5a33ec65d15bc5) ) - - ROM_REGION( 390601, "screen_bottom", 0) - ROM_LOAD( "gnw_dkong2_bottom.svg", 0, 390601, CRC(3f85bb01) SHA1(8964f02e8372f5d8dd5e8edfe0b79dae31b59b3a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario Bros. (model MW-56) - * PCB label MW-56-M-I (left), MW-56-S (right) - * Sharp SM510 label MW-56 533C (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mario_state : public hh_sm510_state -{ -public: - gnw_mario_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mario(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mario ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mario_state::gnw_mario(machine_config &config) -{ - sm510_dualh(config, 2258/2, 1440/2, 2261/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_mario ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mw-56", 0x0000, 0x1000, CRC(385e59da) SHA1(2f79281bdf2f2afca2fb5bd7b9a3beeffc9c4eb7) ) - - ROM_REGION( 154916, "screen_left", 0) - ROM_LOAD( "gnw_mario_left.svg", 0, 154916, CRC(8ea82355) SHA1(ad286039a215dfa0f02bb1caf875d55dedb9b71e) ) - - ROM_REGION( 202902, "screen_right", 0) - ROM_LOAD( "gnw_mario_right.svg", 0, 202902, CRC(cfe8c0ba) SHA1(87cd54a8104e9bb4f266b137b043e32a0c1d9772) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Rain Shower (model LP-57) - * PCB labels: LP-57-M-I (left), LP-57-S (right) - * Sharp SM510 label LP-57 538A (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_rshower_state : public hh_sm510_state -{ -public: - gnw_rshower_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_rshower(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_rshower ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // L/R - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_rshower_state::gnw_rshower(machine_config &config) -{ - sm510_dualh(config, 2126/2, 1440/2, 2146/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_rshower ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "lp-57", 0x0000, 0x1000, CRC(51a2c5c4) SHA1(d60542e6785ba7b6a44153a66c739787cf670816) ) - - ROM_REGION( 135868, "screen_left", 0) - ROM_LOAD( "gnw_rshower_left.svg", 0, 135868, CRC(806493f1) SHA1(0287fba2c2962aced8156c2ebc4f299c4703acf2) ) - - ROM_REGION( 140445, "screen_right", 0) - ROM_LOAD( "gnw_rshower_right.svg", 0, 140445, CRC(bead097a) SHA1(a3929e0043ff5132fb4cf7a41edece96926f50d2) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Life Boat (model TC-58) - * PCB labels: TC-58-M (left), TC-58-S (right) - * Sharp SM510 label TC-58 281D (no decap) - * horizontal dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_lboat_state : public hh_sm510_state -{ -public: - gnw_lboat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_lboat(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_lboat ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_lboat_state::gnw_lboat(machine_config &config) -{ - sm510_dualh(config, 2116/2, 1440/2, 2057/2, 1440/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_lboat ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tc-58", 0x0000, 0x1000, CRC(1f88f6a2) SHA1(22fd62127dda43a0ada2fe89b0518eec8cbe2a25) ) - - ROM_REGION( 156441, "screen_left", 0) - ROM_LOAD( "gnw_lboat_left.svg", 0, 156441, CRC(a1727890) SHA1(b1dd24f99496d215a3083a138fc3fff923303d34) ) - - ROM_REGION( 155258, "screen_right", 0) - ROM_LOAD( "gnw_lboat_right.svg", 0, 155258, CRC(76619ad3) SHA1(b44d57e2f4a2cecf98e402adf802d16c5934d301) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Pinball (model PB-59) - * PCB label PB-59 - * Sharp SM511 label PB-59 53ZD (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_pinball_state : public hh_sm510_state -{ -public: - gnw_pinball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_pinball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_pinball ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB -- this one multiplies scoring factor - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_pinball_state::gnw_pinball(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1271/2, 1920/2, 1286/2); -} - -// roms - -ROM_START( gnw_pinball ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "pb-59.program", 0x0000, 0x1000, CRC(d29dab34) SHA1(69ac9ee63eda67360c21627b7d625093709b5cd9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "pb-59.melody", 0x000, 0x100, BAD_DUMP CRC(5c9ccb55) SHA1(1bada6caf3609f969421087219e6635f4c135282) ) // decap needed for verification - - ROM_REGION( 83191, "screen_top", 0) - ROM_LOAD( "gnw_pinball_top.svg", 0, 83191, CRC(abe3edd9) SHA1(b32327b81b788896150e709ab8dc4a2155ae0995) ) - - ROM_REGION( 63618, "screen_bottom", 0) - ROM_LOAD( "gnw_pinball_bottom.svg", 0, 63618, CRC(1db44191) SHA1(73f73d246630d0b9efeb8dc72f37a2b88f735ceb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Black Jack (model BJ-60) - * PCB label BJ-60 - * Sharp SM512 label BJ-60 564D (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_bjack_state : public hh_sm510_state -{ -public: - gnw_bjack_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bjack(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bjack ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Double Down") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x10 / Hit") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Bet x1 / Stand") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY PORT_NAME("Enter") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void gnw_bjack_state::gnw_bjack(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1290/2, 1920/2, 1297/2); -} - -// roms - -ROM_START( gnw_bjack ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bj-60.program", 0x0000, 0x1000, CRC(8e74f633) SHA1(54b0f65ee716d2820a9ed9c743755d2a2d99ce4d) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bj-60.melody", 0x000, 0x100, BAD_DUMP CRC(2619224e) SHA1(b65dc590b6eb1de793e980af236ccf8360b3cfee) ) // decap needed for verification - - ROM_REGION( 75366, "screen_top", 0) - ROM_LOAD( "gnw_bjack_top.svg", 0, 75366, CRC(d36fb4e4) SHA1(7f2a0256d78eb01e757208ead0fd52ee63ce8efa) ) - - ROM_REGION( 112599, "screen_bottom", 0) - ROM_LOAD( "gnw_bjack_bottom.svg", 0, 112599, CRC(04880ae1) SHA1(60f3723f81965fe4891f25a3522351872f338389) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Squish (model MG-61) - * PCB label MG-61 - * Sharp SM510 label MG-61 8841B (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_squish_state : public hh_sm510_state -{ -public: - gnw_squish_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: unwanted segments light up - m_decay_pivot = 17; - } - - void gnw_squish(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_squish ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Bonus Life (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_squish_state::gnw_squish(machine_config &config) -{ - sm510_dualv(config, 1920/2, 1285/2, 1920/2, 1287/2); // R mask option confirmed -} - -// roms - -ROM_START( gnw_squish ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg-61", 0x0000, 0x1000, CRC(79cd509c) SHA1(969e5425984ba9e5183c68b38b3588f53d1e8e5d) ) - - ROM_REGION( 70456, "screen_top", 0) - ROM_LOAD( "gnw_squish_top.svg", 0, 70456, CRC(8d10b94e) SHA1(33854e7ea8f02adceb597c9ba259aa553953e698) ) - - ROM_REGION( 279739, "screen_bottom", 0) - ROM_LOAD( "gnw_squish_bottom.svg", 0, 279739, CRC(7f4bd704) SHA1(e625910101896cf3a6d41e28ccda77f902f71c7a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Bomb Sweeper (model BD-62) - * PCB label BD-62 - * Sharp SM512 label BD-62 8727 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_bsweep_state : public hh_sm510_state -{ -public: - gnw_bsweep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bsweep(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bsweep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Controller keys skips level when activated - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_bsweep_state::gnw_bsweep(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1291/2, 1920/2, 1239/2); -} - -// roms - -ROM_START( gnw_bsweep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bd-62.program", 0x0000, 0x1000, CRC(f3ac66ea) SHA1(3fbf444ade5bc96cf0073ca72f1d583cb0f48fc5) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bd-62.melody", 0x000, 0x100, BAD_DUMP CRC(addc0368) SHA1(fc488bdf1c2ea5ca84cc66762126bb5874659d8f) ) // decap needed for verification - - ROM_REGION( 218174, "screen_top", 0) - ROM_LOAD( "gnw_bsweep_top.svg", 0, 218174, CRC(b2c8e895) SHA1(9f7d5973a5f920845c83d30f7ebbbec93232c41e) ) - - ROM_REGION( 277420, "screen_bottom", 0) - ROM_LOAD( "gnw_bsweep_bottom.svg", 0, 277420, CRC(8a9786cb) SHA1(48390a77b0e436ec7d7e8835923faef787e163d4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Safe Buster (model JB-63) - * PCB label JB-63 - * Sharp SM511 label JB-63 8841 B (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_sbuster_state : public hh_sm510_state -{ -public: - gnw_sbuster_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_sbuster(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_sbuster ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_sbuster_state::gnw_sbuster(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1246/2, 1920/2, 1269/2); -} - -// roms - -ROM_START( gnw_sbuster ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "jb-63.program", 0x0000, 0x1000, CRC(231d358d) SHA1(c748788da125e77b9d0fe1228f64de71f41af42b) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "jb-63.melody", 0x000, 0x100, BAD_DUMP CRC(28cb2914) SHA1(52d34265611f786b597653193752d16563dd5e82) ) // decap needed for verification - - ROM_REGION( 221903, "screen_top", 0) - ROM_LOAD( "gnw_sbuster_top.svg", 0, 221903, CRC(adb9b67f) SHA1(902998ead1a13d3c26854393283ab622e1fd3f70) ) - - ROM_REGION( 282593, "screen_bottom", 0) - ROM_LOAD( "gnw_sbuster_bottom.svg", 0, 282593, CRC(12542c5e) SHA1(fb05b8f4a2cbeeb566ae111cd27ff486c1478d7b) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Gold Cliff (model MV-64) - * PCB label MV-64 - * Sharp SM512 label MV-64 9027 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_gcliff_state : public hh_sm510_state -{ -public: - gnw_gcliff_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_gcliff(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_gcliff ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Level Skip (Cheat)") // " -- Left or right skips level when activated - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_gcliff_state::gnw_gcliff(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1257/2, 1920/2, 1239/2); -} - -// roms - -ROM_START( gnw_gcliff ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mv-64.program", 0x0000, 0x1000, CRC(2448a3bf) SHA1(bfb1a1b500321f8ee0b6f07ef8503e64fe6d37c0) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mv-64.melody", 0x000, 0x100, BAD_DUMP CRC(cb938709) SHA1(516dcc8a1edffe02f50d349389caac0676de1eba) ) // decap needed for verification - - ROM_REGION( 530731, "screen_top", 0) - ROM_LOAD( "gnw_gcliff_top.svg", 0, 530731, CRC(3bb60d8f) SHA1(e7dac1fcbe7b682c9d988443c1446e5ad28d3baa) ) - - ROM_REGION( 519321, "screen_bottom", 0) - ROM_LOAD( "gnw_gcliff_bottom.svg", 0, 519321, CRC(1117041e) SHA1(0f87167614c1ba65915fa7205a6bb44778e443a8) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Zelda (model ZL-65) - * PCB label ZL-65 - * Sharp SM512 label ZL-65 8935 A (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_zelda_state : public hh_sm510_state -{ -public: - gnw_zelda_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_zelda(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_zelda ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Water of Life - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Continue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " -- Invincibility when playing on bottom screen only - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_zelda_state::gnw_zelda(machine_config &config) -{ - sm512_dualv(config, 1920/2, 1346/2, 1920/2, 1291/2); -} - -// roms - -ROM_START( gnw_zelda ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "zl-65.program", 0x0000, 0x1000, CRC(b96aa64e) SHA1(d1f0c64104eb3ecbf370674d5078a3a85b2b7227) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "zl-65.melody", 0x000, 0x100, BAD_DUMP CRC(3a281b0f) SHA1(7a236775557939050bbcd6f9d0a598d219a032f2) ) // decap needed for verification - - ROM_REGION( 283029, "screen_top", 0) - ROM_LOAD( "gnw_zelda_top.svg", 0, 283029, CRC(aaab1d7e) SHA1(fe01e8a92e6dcf457da87afe6bf39fcf511da9db) ) - - ROM_REGION( 424886, "screen_bottom", 0) - ROM_LOAD( "gnw_zelda_bottom.svg", 0, 424886, CRC(09f00d09) SHA1(33045028bd7e0df4e976e79dc180028c6886359a) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Cement Factory (model CM-72) - * PCB labels: CM-72 M (main board) - CM-72 C (joystick controller board) - CM-72 S (buttons controller board) - * Sharp SM511 label CM-72 534A, or CM-72A 536C (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the tabletop version. There's also a new wide screen version which is - a different game. Unlike the other tabletop games, there is no panorama version. - There are two known versions, distinguished by the startup jingle. The first - version sounds like Queen's "Another One Bites the Dust". - -***************************************************************************/ - -class gnw_mariocmt_state : public hh_sm510_state -{ -public: - gnw_mariocmt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariocmt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariocmt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariocmt_state::gnw_mariocmt(machine_config &config) -{ - sm511_common(config, 1920, 1046); -} - -// roms - -ROM_START( gnw_mariocmt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cm-72.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cm-72.melody", 0x000, 0x100, BAD_DUMP CRC(db4f0fc1) SHA1(e386df3e3e88fa36a73bcd0649feb904180493c8) ) // decap needed for verification - - ROM_REGION( 293317, "screen", 0) - ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) -ROM_END - -ROM_START( gnw_mariocmta ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cm-72a.program", 0x0000, 0x1000, CRC(b2ae4596) SHA1(f64bf11e18c9fbd4de4134f685bb2d7bda3d7487) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cm-72a.melody", 0x000, 0x100, BAD_DUMP CRC(b6d72560) SHA1(9d7c23f94b7f894ba1b7881f68824949702a37f2) ) // decap needed for verification - - ROM_REGION( 293317, "screen", 0) - ROM_LOAD( "gnw_mariocmt.svg", 0, 293317, CRC(4f969dc7) SHA1(fec72c4a8600c0753f81bfb296b53cca6aee14cc) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Snoopy (model SM-91) - * PCB labels: SM-91 M (main board), SM-91C (controller board) - * Sharp SM511 label SM-91 538A (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD. - -***************************************************************************/ - -class gnw_snoopyp_state : public hh_sm510_state -{ -public: - gnw_snoopyp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_snoopyp(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_snoopyp ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Hit - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_snoopyp_state::gnw_snoopyp(machine_config &config) -{ - sm511_common(config, 1920, 1020); -} - -// roms - -ROM_START( gnw_snoopyp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "sm-91.program", 0x0000, 0x1000, CRC(893bd7e3) SHA1(94e218f464b2ec8c81bd4c0f13f3a3049c4effe9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "sm-91.melody", 0x000, 0x100, BAD_DUMP CRC(09360aaf) SHA1(906eff1d2eaf7ff040d833b4513a995e7026279b) ) // decap needed for verification - - ROM_REGION( 353488, "screen", 0) - ROM_LOAD( "gnw_snoopyp.svg", 0, 353488, CRC(30cfa42e) SHA1(2abe74299db7241c66f9631b01d0ea336ec411ad) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Popeye (model PG-92) - * PCB labels: PG-92 M (main board), SM-91C (controller board) - * Sharp SM511 label PG-92 538A (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD, and a new wide screen version which is - a different game. - - The PCB design for the controller board is shared with the panorama version - of Snoopy (SM-91). - -***************************************************************************/ - -class gnw_popeyep_state : public hh_sm510_state -{ -public: - gnw_popeyep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_popeyep(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_popeyep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Punch - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives and Stronger Punch (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_popeyep_state::gnw_popeyep(machine_config &config) -{ - sm511_common(config, 1920, 1043); -} - -// roms - -ROM_START( gnw_popeyep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "pg-92.program", 0x0000, 0x1000, CRC(f9a2f181) SHA1(f97969abe63285964ef9585660e82590014bbece) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "pg-92.melody", 0x000, 0x100, BAD_DUMP CRC(ce2a0e03) SHA1(cb7e4c64639579349aa944e4bfff7b05cf49ce0e) ) // decap needed for verification - - ROM_REGION( 541218, "screen", 0) - ROM_LOAD( "gnw_popeyep.svg", 0, 541218, CRC(ad93aa24) SHA1(b02c1fec1d8388878b5f21887f19aa5007b8ae43) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong Jr. (model CJ-93) - * PCB labels: CJ-93 M (main board), CJ-93C (controller board) - * Sharp SM511 label CJ-93 539D (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version. There's also a tabletop version which is - assumed to use the same ROM/LCD, and a new wide screen version which is - a different game. - - The tabletop version was also licensed to Coleco. - -***************************************************************************/ - -class gnw_dkjrp_state : public hh_sm510_state -{ -public: - gnw_dkjrp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkjrp(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkjrp ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkjrp_state::gnw_dkjrp(machine_config &config) -{ - sm511_common(config, 1920, 1049); -} - -// roms - -ROM_START( gnw_dkjrp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cj-93.program", 0x0000, 0x1000, CRC(a2cd5a91) SHA1(33f6fd1530e5522491851f16d7c9f928b2dbdc3b) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "cj-93.melody", 0x000, 0x100, BAD_DUMP CRC(99fbf76a) SHA1(15ba1af51bebc316146eb9a0a3d58d28f644d45f) ) // decap needed for verification - - ROM_REGION( 340751, "screen", 0) - ROM_LOAD( "gnw_dkjrp.svg", 0, 340751, CRC(eb3cb98b) SHA1(5b148557d3ade2e2050ddde879a6cc05e119b446) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Bombs Away (model TB-94) - * PCB labels: TB-94 M (main board), SM-91C (controller board) - * Sharp SM511 label TB-94 537C (no decap) - * inverted lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mbaway_state : public hh_sm510_state -{ -public: - gnw_mbaway_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mbaway(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mbaway ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Up/Down - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mbaway_state::gnw_mbaway(machine_config &config) -{ - sm511_common(config, 1920, 1031); -} - -// roms - -ROM_START( gnw_mbaway ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tb-94.program", 0x0000, 0x1000, CRC(11d18a48) SHA1(afccfa19dace7c4fcc15a84ecfcfb9d7ae3861e4) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "tb-94.melody", 0x000, 0x100, BAD_DUMP CRC(60d98353) SHA1(8789d7cd39111fe01848a89748ab91731de5caef) ) // decap needed for verification - - ROM_REGION( 514643, "screen", 0) - ROM_LOAD( "gnw_mbaway.svg", 0, 514643, CRC(2ec2f18b) SHA1(8e2fd20615d867aac97e443fb977513ff98138b4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mickey Mouse (model DC-95), - Nintendo Game & Watch: Donkey Kong Circus (model MK-96) - * PCB labels: DC-95M (main board), DC-95C (controller board) - * Sharp SM511 - - label DC-95 284C (Mickey Mouse) (no decap) - - label DC-95 541D (Donkey Kong Circus) (no decap) - * inverted lcd screen with custom segments, 1-bit sound - - This is the panorama version of Mickey Mouse. There's also a wide screen - version which is a different game. - - DC-95 and MK-96 are the same game, it's assumed that the latter was for - regions where Nintendo wasn't able to license from Disney. - -***************************************************************************/ - -class gnw_mmousep_state : public hh_sm510_state -{ -public: - gnw_mmousep_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mmousep(machine_config &config); - void gnw_dkcirc(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mmousep ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mmousep_state::gnw_mmousep(machine_config &config) -{ - sm511_common(config, 1920, 1122); -} - -void gnw_mmousep_state::gnw_dkcirc(machine_config &config) -{ - sm511_common(config, 1920, 1107); -} - -// roms - -ROM_START( gnw_mmousep ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dc-95.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dc-95.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification - - ROM_REGION( 275609, "screen", 0) - ROM_LOAD( "gnw_mmousep.svg", 0, 275609, CRC(bac13689) SHA1(3ddcb4416bc5b8615b2854434ef78acac204a583) ) -ROM_END - -ROM_START( gnw_dkcirc ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk-96.program", 0x0000, 0x1000, CRC(39dd864a) SHA1(25c67dac7320fe00990989cd42438461950a68ec) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mk-96.melody", 0x000, 0x100, BAD_DUMP CRC(6ccde8e3) SHA1(4e704a1d61126465b14e3889b4a0179c5568b90b) ) // decap needed for verification - - ROM_REGION( 367718, "screen", 0) - ROM_LOAD( "gnw_dkcirc.svg", 0, 367718, CRC(f8571437) SHA1(bc000267deab83dfd460aea5c4102a23ac51f169) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Donkey Kong Jr. (model DJ-101) - * Sharp SM510 label DJ-101 52ZA (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a tabletop version that - plays more like the arcade game. - -***************************************************************************/ - -class gnw_dkjr_state : public hh_sm510_state -{ -public: - gnw_dkjr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkjr(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkjr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkjr_state::gnw_dkjr(machine_config &config) -{ - sm510_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_dkjr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dj-101", 0x0000, 0x1000, CRC(8dcfb5d1) SHA1(e0ef578e9362eb9a3cab631376df3cf55978f2de) ) - - ROM_REGION( 281202, "screen", 0) - ROM_LOAD( "gnw_dkjr.svg", 0, 281202, CRC(f8b18d58) SHA1(fa8321b3d8f81685da763d66fc148d339e6bcd55) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario's Cement Factory (model ML-102) - * Sharp SM510 label ML-102 298D (die label CMS54C, KMS577) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a tabletop version. - -***************************************************************************/ - -class gnw_mariocm_state : public hh_sm510_state -{ -public: - gnw_mariocm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariocm(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariocm ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Open - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariocm_state::gnw_mariocm(machine_config &config) -{ - sm510_common(config, 1647, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_mariocm ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ml-102_577", 0x0000, 0x1000, CRC(c1128dea) SHA1(8647e36f43a0e37756a3c7b6a3f08d4c8243f1cc) ) - - ROM_REGION( 302983, "screen", 0) - ROM_LOAD( "gnw_mariocm.svg", 0, 302983, CRC(32ed7941) SHA1(ce7c5ae7a179ec9bcd17db7d7a27780801f7c1cb) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Manhole (model NH-103) - * PCB label NH-103 - * Sharp SM510 label NH-103 538A (no decap) - * lcd screen with custom segments, 1-bit sound - - This is the new wide screen version, there's also a Gold Series version - (MH-06). The two games are using different MCU types so this version seems - to be a complete rewrite. - -***************************************************************************/ - -class gnw_manhole_state : public hh_sm510_state -{ -public: - gnw_manhole_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_manhole(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_manhole ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Invincibility (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_manhole_state::gnw_manhole(machine_config &config) -{ - sm510_common(config, 1560, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_manhole ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "nh-103", 0x0000, 0x1000, CRC(ec03acf7) SHA1(b74ae672d8f8a155b2ea4ecee9afbaed95ec0ceb) ) - - ROM_REGION( 223414, "screen", 0) - ROM_LOAD( "gnw_manhole.svg", 0, 223414, CRC(774d806b) SHA1(acb730d8e397eb29988a353e0a9db8ae69913117) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Tropical Fish (model TF-104) - * PCB label TF-104 - * Sharp SM510 label TF-104 8739A (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_tfish_state : public hh_sm510_state -{ -public: - gnw_tfish_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_tfish(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_tfish ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_tfish_state::gnw_tfish(machine_config &config) -{ - sm510_common(config, 1572, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_tfish ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tf-104", 0x0000, 0x1000, CRC(53cde918) SHA1(bc1e1b8f8b282bb886bb076c1c7ce35d00eca6fc) ) - - ROM_REGION( 257396, "screen", 0) - ROM_LOAD( "gnw_tfish.svg", 0, 257396, CRC(6f457a30) SHA1(0b748c9573ff96b99f4fa0adb17d218e89b56d3f) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Super Mario Bros. (model: see below) - * PCB label YM-801 (Crystal Screen), YM-105 (New Wide Screen) - * Sharp SM511 - - label YM-801 8034A (crystal screen) (not dumped yet) - - label YM-105 9024B (new wide screen version) (die label ?) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model YM-801), rereleased on - New Wide Screen in 1988 (model YM-105). It was also a prize in a Nintendo - game contest in 1987 (model YM-901-S). In YM-801, Mario looks like the - ones in ML-102 and MW-56. In YM-901-S and YM-105 he looks more detailed. - Until further proof, it's assumed that the ROM is the same for each model. - -***************************************************************************/ - -class gnw_smb_state : public hh_sm510_state -{ -public: - gnw_smb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_smb(machine_config &config); - void gnw_smbn(machine_config & config); -}; - -// config - -static INPUT_PORTS_START( gnw_smb ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_smb_state::gnw_smb(machine_config &config) -{ - sm511_common(config, 1768, 1080); -} - -void gnw_smb_state::gnw_smbn(machine_config &config) -{ - sm511_common(config, 1677, 1080); -} - -// roms - -ROM_START( gnw_smb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ym-801.program", 0x0000, 0x1000, BAD_DUMP CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ym-801.melody", 0x000, 0x100, BAD_DUMP CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) // dumped from NWS version - - ROM_REGION( 342106, "screen", 0) - ROM_LOAD( "gnw_smb.svg", 0, 342106, CRC(243224ac) SHA1(9b7f41abe4e340e32893ff1ef6e4d696deadc637) ) -ROM_END - -ROM_START( gnw_smbn ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ym-105.program", 0x0000, 0x1000, CRC(0dff3b12) SHA1(3fa83f88e49ea9d7080fe935ec90ce69acbe8850) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ym-105.melody", 0x000, 0x100, CRC(b48c6d90) SHA1(a1ce1e52627767752974ab0d49bec48ead36663e) ) - - ROM_REGION( 648313, "screen", 0) - ROM_LOAD( "gnw_smbn.svg", 0, 648313, CRC(5808c793) SHA1(06b90993eb9db2a1909509f99ebf00e27c20dcad) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Climber Crystal Screen (model DR-802), - Nintendo Game & Watch: Climber New Wide Screen (model DR-106) - * PCB label DR-802 (Crystal Screen), DR-106 (New Wide Screen) - * Sharp SM511 - - label DR-802 8626A (crystal screen) (not dumped yet) - - label DR-106 9038B (new wide screen version) (no decap) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model DR-802), rereleased on - New Wide Screen in 1988 (model DR-106). The graphic LCD elements look the same - in both versions but the display aspect ratio and the graphical background is - slightly different. Until further proof, it's assumed that the ROM is the same - for both models. - -***************************************************************************/ - -class gnw_climber_state : public hh_sm510_state -{ -public: - gnw_climber_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_climber(machine_config &config); - void gnw_climbern(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_climber ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_climber_state::gnw_climber(machine_config &config) -{ - sm511_common(config, 1756, 1080); -} - -void gnw_climber_state::gnw_climbern(machine_config &config) -{ - sm511_common(config, 1677, 1080); -} - -// roms - -ROM_START( gnw_climber ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dr-802.program", 0x0000, 0x1000, BAD_DUMP CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dr-802.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // dumped from NWS version - - ROM_REGION( 564868, "screen", 0) - ROM_LOAD( "gnw_climber.svg", 0, 564868, CRC(a50ebd1c) SHA1(51047db960c8f110c1b681347cf8efd1d6263b85) ) -ROM_END - -ROM_START( gnw_climbern ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "dr-106.program", 0x0000, 0x1000, CRC(2adcbd6d) SHA1(110dc08c65120ab2c76ee647e89aa2726e24ac1a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "dr-106.melody", 0x000, 0x100, BAD_DUMP CRC(7c49a3a3) SHA1(fad00d650b4864135c7d50f6fae735b7fffe720f) ) // decap needed for verification - - ROM_REGION( 542453, "screen", 0) - ROM_LOAD( "gnw_climbern.svg", 0, 542453, CRC(2ded966e) SHA1(7e9c99d372b6e547b9b3e789dca9dee60455a427) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Balloon Fight Crystal Screen (model BF-803), - Nintendo Game & Watch: Balloon Fight New Wide Screen (model BF-107) - * PCB labels - - DR-802-2 (Crystal Screen) - - DR-106 (new wide screen version) - * Sharp SM511 - - label BF-803 8646A (crystal screen) (not dumped yet) - - label BF-107 9031B (new wide screen version) (no decap) - * lcd screen with custom segments, 1-bit sound - - First released in 1986 on Crystal Screen (model BF-803), rereleased on - New Wide Screen in 1988 (model BF-107). The graphic LCD elements look the same - in both versions but the graphical background is slightly different. - Until further proof, it's assumed that the ROM is the same for both models. - - The PCB design for the different editions seems to be shared with the - corresponding editions of Climber. - -***************************************************************************/ - -class gnw_bfight_state : public hh_sm510_state -{ -public: - gnw_bfight_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_bfight(machine_config &config); - void gnw_bfightn(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_bfight ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Eject - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_bfight_state::gnw_bfight(machine_config &config) -{ - sm511_common(config, 1771, 1080); -} - -void gnw_bfight_state::gnw_bfightn(machine_config &config) -{ - sm511_common(config, 1549, 1080); -} - -// roms - -ROM_START( gnw_bfight ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bf-803.program", 0x0000, 0x1000, BAD_DUMP CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) // dumped from NWS version - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bf-803.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // dumped from NWS version - - ROM_REGION( 586453, "screen", 0) - ROM_LOAD( "gnw_bfight.svg", 0, 586453, CRC(40d81b65) SHA1(96ed909647229cfde6d733ba10d54ace29e5618a) ) -ROM_END - -ROM_START( gnw_bfightn ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bf-107.program", 0x0000, 0x1000, CRC(4c8d07ed) SHA1(a8974dff85d5f3bacaadb71b86e9b30994b6d129) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bf-107.melody", 0x000, 0x100, BAD_DUMP CRC(ffddf9ed) SHA1(e9cb3a340924363eeef5ab453c452b9cc69207b9) ) // decap needed for verification - - ROM_REGION( 558496, "screen", 0) - ROM_LOAD( "gnw_bfightn.svg", 0, 558496, CRC(c488000e) SHA1(f9a042799a1489f83b07a91827b8b421238a67e8) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Mario The Juggler (model MB-108) - * PCB label MB-108 - * Sharp SM511 label MB-108 9209B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_mariotj_state : public hh_sm510_state -{ -public: - gnw_mariotj_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_mariotj(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_mariotj ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_mariotj_state::gnw_mariotj(machine_config &config) -{ - sm511_common(config, 1630, 1080); -} - -// roms - -ROM_START( gnw_mariotj ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb-108.program", 0x0000, 0x1000, CRC(f7118bb4) SHA1(c3117fd009e4686a149f85fb65786ddffc091eeb) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "mb-108.melody", 0x000, 0x100, BAD_DUMP CRC(d8cc1f74) SHA1(4bbb470ef01777b0c1dbd7b84dc560da6d3b87e7) ) // decap needed for verification - - ROM_REGION( 210391, "screen", 0) - ROM_LOAD( "gnw_mariotj.svg", 0, 210391, CRC(8f1e6118) SHA1(4ecad443142330470384659af1e8dd59bca519e4) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Spitball Sparky (model BU-201) - * PCB label BU-201 - * Sharp SM510 label BU-201 542A (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_ssparky_state : public hh_sm510_state -{ -public: - gnw_ssparky_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_ssparky(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_ssparky ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Shooter - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Increase Score (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_ssparky_state::gnw_ssparky(machine_config &config) -{ - sm510_common(config, 627, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_ssparky ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bu-201", 0x0000, 0x1000, CRC(ae0d28e7) SHA1(1427cca1f3aaf3ef6fc3499171a5220428d9894f) ) - - ROM_REGION( 136929, "screen", 0) - ROM_LOAD( "gnw_ssparky.svg", 0, 136929, CRC(66e5d586) SHA1(b666f675abb8edef65ff402e8bc9a5213b630851) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Game & Watch: Crab Grab (model UD-202) - * PCB label UD-202 - * Sharp SM510 label UD-202 542B (no decap) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_cgrab_state : public hh_sm510_state -{ -public: - gnw_cgrab_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_cgrab(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_cgrab ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Do not release crabs (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_cgrab_state::gnw_cgrab(machine_config &config) -{ - sm510_common(config, 609, 1080); // R mask option confirmed -} - -// roms - -ROM_START( gnw_cgrab ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ud-202", 0x0000, 0x1000, CRC(65e97963) SHA1(f6d589fac337e2c4acdaa8f1281912feabc54198) ) - - ROM_REGION( 354770, "screen", 0) - ROM_LOAD( "gnw_cgrab.svg", 0, 354770, CRC(d61478aa) SHA1(8dd44cfb3720740150defdfbebe0bd52a3b3a377) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Boxing (model BX-301) - * Sharp SM511 label BX-301 287C (die label KMS73B, KMS744) - * wide lcd screen with custom segments, 1-bit sound - - Also known as Punch-Out!! in the USA. - -***************************************************************************/ - -class gnw_boxing_state : public hh_sm510_state -{ -public: - gnw_boxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_boxing(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( microvs_shared ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_PLAYER(2) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( gnw_boxing ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "P2 Decrease Health (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Health (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_boxing_state::gnw_boxing(machine_config &config) -{ - sm511_common(config, 1920, 524); -} - -// roms - -ROM_START( gnw_boxing ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bx-301_744.program", 0x0000, 0x1000, CRC(0fdf0303) SHA1(0b791c9d4874e9534d0a9b7a8968ce02fe4bee96) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bx-301_744.melody", 0x000, 0x100, CRC(439d943d) SHA1(52880df15ec7513f96482f455ef3d9778aa24750) ) - - ROM_REGION( 265217, "screen", 0) - ROM_LOAD( "gnw_boxing.svg", 0, 265217, CRC(306c733e) SHA1(8c80df1295ff0889e16ef9a14e45b27a6ebaa9a2) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Donkey Kong 3 (model AK-302) - * PCB label AK-302M - * Sharp SM511 label AK-302 299D (no decap) - * wide lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkong3_state : public hh_sm510_state -{ -public: - gnw_dkong3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkong3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkong3 ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P1 Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkong3_state::gnw_dkong3(machine_config &config) -{ - sm511_common(config, 1920, 563); -} - -// roms - -ROM_START( gnw_dkong3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ak-302.program", 0x0000, 0x1000, CRC(ed59c15e) SHA1(94f6ce23677d2150c9f86c4b1954f5f531693b21) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "ak-302.melody", 0x000, 0x100, BAD_DUMP CRC(8b8f3d55) SHA1(54ebdeff4dd56a8bc2cd39bca1deada14bb90cce) ) // decap needed for verification - - ROM_REGION( 292480, "screen", 0) - ROM_LOAD( "gnw_dkong3.svg", 0, 292480, CRC(980d2486) SHA1(8578bdf4a3814401d9a79867252ee09ed7df253c) ) -ROM_END - - - - - -/*************************************************************************** - - Nintendo Micro Vs. System: Donkey Kong Hockey (model HK-303) - * PCB label HK-303M - * Sharp SM511 label HK-303 57XD (no decap) - * wide lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class gnw_dkhockey_state : public hh_sm510_state -{ -public: - gnw_dkhockey_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void gnw_dkhockey(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gnw_dkhockey ) - PORT_INCLUDE( microvs_shared ) - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Any Goal Scores 10 Points (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "P2 Goals Scores No Points (Cheat)") // " - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void gnw_dkhockey_state::gnw_dkhockey(machine_config &config) -{ - sm511_common(config, 1920, 579); -} - -// roms - -ROM_START( gnw_dkhockey ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "hk-303.program", 0x0000, 0x1000, CRC(dc73eec7) SHA1(daaca286de326321335fd26d9b435b444787f609) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "hk-303.melody", 0x000, 0x100, BAD_DUMP CRC(3f61032c) SHA1(b0fd9077fb5e59ca2787c828c78c35116c48c245) ) // decap needed for verification - - ROM_REGION( 263239, "screen", 0) - ROM_LOAD( "gnw_dkhockey.svg", 0, 263239, CRC(3a576c12) SHA1(9a7ca67c35fcfb5858227f3ef2a6027c877c64d3) ) -ROM_END - - - - - -/*************************************************************************** - - Telko Bassmate Computer (model BM-501) - * PCB label BM-501 - * Sharp SM511 label BM-501 556AA (no decap) - * vertical dual lcd screens with custom segments, 1-bit sound - - The Bassmate Computer was produced for Telko by Nintendo as an OEM product - and sold under different brands, i.e. Telko, KMV and Probe 2000. - - The hardware is identical as G&W Multi Screen, but it's not part of the game - series. - -***************************************************************************/ - -class bassmate_state : public hh_sm510_state -{ -public: - bassmate_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void bassmate(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( bassmate ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Compute") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Wind") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Cover") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time of Day") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Temp F") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Clarity") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Structure") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Water Depth(ft)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Season") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("BA") - PORT_CONFNAME( 0x01, 0x01, "Skip Compute Animation (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) -INPUT_PORTS_END - -void bassmate_state::bassmate(machine_config &config) -{ - sm511_dualv(config, 1920/2, 1253/2, 1920/2, 1273/2); -} - -// roms - -ROM_START( bassmate ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "bm-501.program", 0x0000, 0x1000, CRC(9bdd0501) SHA1(986b3b84184a987ae383c325700df21d8915f0e2) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "bm-501.melody", 0x000, 0x100, BAD_DUMP CRC(fbe15600) SHA1(8be64792fffe5b8913a55b9b2624dd57dc238be7) ) // decap needed for verification - - ROM_REGION( 42305, "screen_top", 0) - ROM_LOAD( "bassmate_top.svg", 0, 42305, CRC(0cc056fe) SHA1(4d0e5b115adf513f5b3148ca7e39e0acbafd925c) ) - - ROM_REGION( 19775, "screen_bottom", 0) - ROM_LOAD( "bassmate_bottom.svg", 0, 19775, CRC(9561d52d) SHA1(903ef3944810c0efdc02f46a619891c1ef17c483) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Double Dribble - * Sharp SM510 under epoxy (die label CMS54C, KMS584) - * lcd screen with custom segments, 1-bit sound - - BTANB: At the basket, the ball goes missing sometimes for 1 frame, or - may show 2 balls at the same time. It's the same on the real handheld. - BTANB: players flicker (increasing LCD delay won't improve it much) - Another BTANB? If a period is over at the same time a defender on the - 2nd column grabs the ball, his arm won't be erased until it's redrawn. - -***************************************************************************/ - -class kdribble_state : public hh_sm510_state -{ -public: - kdribble_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kdribble(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kdribble ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Level Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kdribble_state::kdribble(machine_config &config) -{ - sm510_common(config, 1524, 1080); // R mask option confirmed -} - -// roms - -ROM_START( kdribble ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "584", 0x0000, 0x1000, CRC(1d9022c8) SHA1(64567f9f161e830a0634d5c89917ab866c26c0f8) ) - - ROM_REGION( 450349, "screen", 0) - ROM_LOAD( "kdribble.svg", 0, 450349, CRC(0ea4153e) SHA1(b5deb398bb9f5e56e5bbcbe477d54528fb989487) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Top Gun - * PCB label BH003 - * Sharp SM510 under epoxy (die label CMS54C, KMS598) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ktopgun_state : public hh_sm510_state -{ -public: - ktopgun_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void ktopgun(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ktopgun ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void ktopgun_state::ktopgun(machine_config &config) -{ - sm510_common(config, 1515, 1080); // R mask option confirmed -} - -// roms - -ROM_START( ktopgun ) // except for filler/unused bytes, ROM listing in patent US5137277 "BH003 Top Gun" is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "598", 0x0000, 0x1000, CRC(50870b35) SHA1(cda1260c2e1c180995eced04b7d7ff51616dcef5) ) - - ROM_REGION( 425839, "screen", 0) - ROM_LOAD( "ktopgun.svg", 0, 425839, CRC(f0eb200f) SHA1(cbdc7cfaf1785b393c806dabd1a355d325bddc3f) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Contra - * PCB label BH002 - * Sharp SM511 under epoxy (die label KMS73B, KMS773) - * lcd screen with custom segments, 1-bit sound - - Contra handheld is titled simply "C" in the USA. - -***************************************************************************/ - -class kcontra_state : public hh_sm510_state -{ -public: - kcontra_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: score digit flickers - m_decay_len = 20; - } - - void kcontra(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kcontra ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kcontra_state::kcontra(machine_config &config) -{ - sm511_common(config, 1505, 1080); -} - -// roms - -ROM_START( kcontra ) // except for filler/unused bytes, ROM listing in patent US5120057 "BH002 C (Contra)" program/melody is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "773.program", 0x0000, 0x1000, CRC(bf834877) SHA1(055dd56ec16d63afba61ab866481fd9c029fb54d) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "773.melody", 0x000, 0x100, CRC(23d02b99) SHA1(703938e496db0eeacd14fe7605d4b5c39e0a5bc8) ) - - ROM_REGION( 721055, "screen", 0) - ROM_LOAD( "kcontra.svg", 0, 721055, CRC(f1ce8d19) SHA1(7d8f2fac40605a3fd6f1386c945a53412b2f2b15) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Teenage Mutant Ninja Turtles - * PCB label BH005 - * Sharp SM511 under epoxy (die label KMS73B, KMS774) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ktmnt_state : public hh_sm510_state -{ -public: - ktmnt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void ktmnt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ktmnt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void ktmnt_state::ktmnt(machine_config &config) -{ - sm511_common(config, 1505, 1080); -} - -// roms - -ROM_START( ktmnt ) // except for filler/unused bytes, ROM listing in patent US5150899 "BH005 TMNT" program/melody is same - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "774.program", 0x0000, 0x1000, CRC(a1064f87) SHA1(92156c35fbbb414007ee6804fe635128a741d5f1) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "774.melody", 0x000, 0x100, CRC(8270d626) SHA1(bd91ca1d5cd7e2a62eef05c0033b19dcdbe441ca) ) - - ROM_REGION( 610309, "screen", 0) - ROM_LOAD( "ktmnt.svg", 0, 610309, CRC(9f48c50d) SHA1(917c0ed8e83d949e5115c897cacda8d60e42d74d) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Gradius - * PCB label BH004 - * Sharp SM511 under epoxy (die label KMS73B, KMS774) - * lcd screen with custom segments, 1-bit sound - - Known in Japan as Nemesis. - -***************************************************************************/ - -class kgradius_state : public hh_sm510_state -{ -public: - kgradius_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kgradius(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kgradius ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kgradius_state::kgradius(machine_config &config) -{ - sm511_common(config, 1420, 1080); -} - -// roms - -ROM_START( kgradius ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "771.program", 0x0000, 0x1000, CRC(830c2afc) SHA1(bb9ebd4e52831cc02cd92dd4b37675f34cf37b8c) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "771.melody", 0x000, 0x100, CRC(4c586b73) SHA1(14c5ab2898013a577f678970a648c374749cc66d) ) - - ROM_REGION( 638136, "screen", 0) - ROM_LOAD( "kgradius.svg", 0, 638136, CRC(85dd296e) SHA1(bd75d0c08387a69bbcf4fd100252846499a261b3) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Lone Ranger - * PCB label BH009 - * Sharp SM511 under epoxy (die label KMS73B, KMS781) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kloneran_state : public hh_sm510_state -{ -public: - kloneran_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kloneran(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kloneran ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kloneran_state::kloneran(machine_config &config) -{ - sm511_common(config, 1497, 1080); -} - -// roms - -ROM_START( kloneran ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "781.program", 0x0000, 0x1000, CRC(52b9735f) SHA1(06c5ef6e7e781b1176d4c1f2445f765ccf18b3f7) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "781.melody", 0x000, 0x100, CRC(a393de36) SHA1(55089f04833ccb318524ab2b584c4817505f4019) ) - - ROM_REGION( 633161, "screen", 0) - ROM_LOAD( "kloneran.svg", 0, 633161, CRC(1fb937ff) SHA1(9e5841dc67e50b789f0161693ebbd75f79915980) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Blades of Steel - * PCB label BH011 - * Sharp SM511 under epoxy (die label KMS73B, KMS782) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kblades_state : public hh_sm510_state -{ -public: - kblades_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 25; - } - - void kblades(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kblades ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kblades_state::kblades(machine_config &config) -{ - sm511_common(config, 1516, 1080); -} - -// roms - -ROM_START( kblades ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "782.program", 0x0000, 0x1000, CRC(3351a35d) SHA1(84c64b65d3cabfa20c18f4649c9ede2578b82523) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "782.melody", 0x000, 0x100, CRC(e8bf48ba) SHA1(3852c014dc9136566322b4f9e2aab0e3ec3a7387) ) - - ROM_REGION( 455154, "screen", 0) - ROM_LOAD( "kblades.svg", 0, 455154, CRC(f17ec8ba) SHA1(ed999ef4b3f0ae94c243219ea8ea1eedd7179c26) ) -ROM_END - - - - - -/*************************************************************************** - - Konami NFL Football - * Sharp SM511 under epoxy (die label KMS73B, KMS786) - * lcd screen with custom segments, 1-bit sound - - This is the 1989 version. It was rereleased in 1992, assumed to be the same - game underneath. - -***************************************************************************/ - -class knfl_state : public hh_sm510_state -{ -public: - knfl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 35; - } - - void knfl(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( knfl ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void knfl_state::knfl(machine_config &config) -{ - sm511_common(config, 1449, 1080); -} - -// roms - -ROM_START( knfl ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "786.program", 0x0000, 0x1000, CRC(0535c565) SHA1(44cdcd284713ff0b194b24beff9f1b94c8bc63b2) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "786.melody", 0x000, 0x100, CRC(6c80263b) SHA1(d3c21e2f8491fef101907b8e0871b1e1c1ed58f5) ) - - ROM_REGION( 571173, "screen", 0) - ROM_LOAD( "knfl.svg", 0, 571173, CRC(406c5bed) SHA1(1f3a704f091b78c89c06108ba11310f4072cc178) ) -ROM_END - - - - - -/*************************************************************************** - - Konami The Adventures of Bayou Billy - * Sharp SM511 under epoxy (die label KMS73B, KMS788) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kbilly_state : public hh_sm510_state -{ -public: - kbilly_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kbilly(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kbilly ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kbilly_state::kbilly(machine_config &config) -{ - sm511_common(config, 1490, 1080); -} - -// roms - -ROM_START( kbilly ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "788.program", 0x0000, 0x1000, CRC(b8b1f734) SHA1(619dd527187b43276d081cdb1b13e0a9a81f2c6a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "788.melody", 0x000, 0x100, CRC(cd488bea) SHA1(8fc60081f46e392978d6950c74711fb7ebd154de) ) - - ROM_REGION( 598317, "screen", 0) - ROM_LOAD( "kbilly.svg", 0, 598317, CRC(fec67ddf) SHA1(3e5f520733e8b720966028ed6a72062be5381f27) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Bucky O'Hare - * Sharp SM511 under epoxy (die label KMS73B, N58) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kbucky_state : public hh_sm510_state -{ -public: - kbucky_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void kbucky(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kbucky ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kbucky_state::kbucky(machine_config &config) -{ - sm511_common(config, 1490, 1080); -} - -// roms - -ROM_START( kbucky ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n58.program", 0x0000, 0x1000, CRC(7c36a0c4) SHA1(1b55ac64a71af746fd0a0f44266fcc92cca77482) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n58.melody", 0x000, 0x100, CRC(7e99e469) SHA1(3e9a3843c6ab392f5989f3366df87a2d26cb8620) ) - - ROM_REGION( 727879, "screen", 0) - ROM_LOAD( "kbucky.svg", 0, 727879, CRC(64cde7e6) SHA1(60c0120c7955a694bb07eb013e42c7a71757ab9f) ) -ROM_END - - - - - -/*************************************************************************** - - Konami Garfield - * Sharp SM511 under epoxy (die label KMS73B, N62) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class kgarfld_state : public hh_sm510_state -{ -public: - kgarfld_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - // increase lcd decay: too much overall flicker - m_decay_len = 30; - } - - void kgarfld(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( kgarfld ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("All Clear") -INPUT_PORTS_END - -void kgarfld_state::kgarfld(machine_config &config) -{ - sm511_common(config, 1500, 1080); -} - -// roms - -ROM_START( kgarfld ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n62.program", 0x0000, 0x1000, CRC(5a762049) SHA1(26d4d891160d254dfd752734e1047126243f88dd) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n62.melody", 0x000, 0x100, CRC(232b7d55) SHA1(76f6a19e8182ee3f00c9f4ef007b5dde75a9c00d) ) - - ROM_REGION( 581147, "screen", 0) - ROM_LOAD( "kgarfld.svg", 0, 581147, CRC(ef2e5a61) SHA1(fbf0236cd0d4228403823d2623c6fd2d68349f7a) ) -ROM_END - - - - - -/*************************************************************************** - - Nelsonic Game Watches on SM530*, wristwatch with an LCD game on it. - *: Older games are on a different MCU, several seen with OKI MSM5055. - Newer ones: to be investigated, maybe SM5x. - - Hardware notes: - * Sharp SM530 under epoxy (die label KAS600 + ROM serial, see romdefs) - * lcd screen with custom segments, 1-bit sound - - Currently emulated in generic driver: - - Super Mario Bros. 3 - - Super Mario World (aka Super Mario Bros. 4) - - Different hardware: - - Star Fox (extra sound effect chip) - -***************************************************************************/ - -class gamewatch_state : public hh_sm510_state -{ -public: - gamewatch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void nsmb3(machine_config &config); - void nsmw(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( gamewatch ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // mode - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // set - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY -INPUT_PORTS_END - -void gamewatch_state::nsmb3(machine_config &config) -{ - sm530_common(config, 1000, 1000); - config.set_default_layout(layout_hh_sm500_test); -} - -void gamewatch_state::nsmw(machine_config &config) -{ - sm530_common(config, 1000, 1000); - config.set_default_layout(layout_hh_sm500_test); -} - -// roms - -ROM_START( nsmb3 ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "633.program", 0x000, 0x800, CRC(a981b540) SHA1(1271d15e6168d73852f8ade9ade4d5f3b1838bf5) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "633.melody", 0x000, 0x100, CRC(98340c46) SHA1(94b5865fc669b7f6487845647866c06f4f581f63) ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "nsmb3.svg", 0, 100000, NO_DUMP ) -ROM_END - -ROM_START( nsmw ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "636.program", 0x000, 0x800, CRC(56a705fa) SHA1(384ba68e597c7901cc9db2eb991cb80049113503) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "636.melody", 0x000, 0x100, CRC(5df99e13) SHA1(98d5f78b5bcf59a232ccb5c61210568948c4501b) ) - - ROM_REGION( 100000, "screen", 0) - ROM_LOAD( "nsmw.svg", 0, 100000, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Nelsonic Star Fox (Game Watch) - * Sharp SM530 under epoxy (die label KAS600, 643) - * sound effect chip under epoxy (die label HMC, HA1152_001A) - * lcd screen with custom segments, 1-bit sound - - Two versions are known, with different shape/button layout, but assumed - to be the exact same game. - - The HMC sound effect chip is very similar (possibly the same one) as found - in electronic toys such as the Executor keychain. There are 8 sound effects - in the ROM, only 3 are used in Star Fox. - -***************************************************************************/ - -class nstarfox_state : public hh_sm510_state -{ -public: - nstarfox_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void nstarfox(machine_config &config); - -private: - void sound_w(u8 data); -}; - -// handlers - -void nstarfox_state::sound_w(u8 data) -{ - // S2-S4: falling edge starts sound effect -} - -// config - -static INPUT_PORTS_START( nstarfox ) - PORT_INCLUDE( gamewatch ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // laser - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // bomb -INPUT_PORTS_END - -void nstarfox_state::nstarfox(machine_config &config) -{ - sm530_common(config, 1176, 1080); - m_maincpu->write_s().set(FUNC(nstarfox_state::sound_w)); -} - -// roms - -ROM_START( nstarfox ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "643.program", 0x000, 0x800, CRC(ac1f5c68) SHA1(165cefeba9abc8725e55d15fdc218b07857d4cfe) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "643.melody", 0x000, 0x100, CRC(6684f6b7) SHA1(32056467f796cb2e3c9f05c364419e7935fd1361) ) - - ROM_REGION( 0x80, "sfx", 0) - ROM_LOAD( "ha1152_001a", 0x00, 0x80, CRC(fba00b7c) SHA1(5dfb15eee3c57bbca80f485f68442e5f7c6bc5e4) ) - - ROM_REGION( 155284, "screen", 0) - ROM_LOAD( "nstarfox.svg", 0, 155284, CRC(843c0fa2) SHA1(bed08fcc8e9fd20624052d91db90923897a1cf7c) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Gauntlet (model 7-778), Robin Hood (model 7-861) - * Sharp SM510 under epoxy (die label CMS54C, KMS583) - * lcd screen with custom segments, 1-bit sound - - known releases (Gauntlet): - - World: Gauntlet, published by Tiger - - Japan: Gauntlet, published by Sega - - UK: Gauntlet, published by Grandstand - - Robin Hood is the same MCU/ROM, different LCD. - -***************************************************************************/ - -class tgaunt_state : public hh_sm510_state -{ -public: - tgaunt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobhood(machine_config &config); - void tgaunt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgaunt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Bomb") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Key") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( trobhood ) - PORT_INCLUDE( tgaunt ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Money") -INPUT_PORTS_END - -void tgaunt_state::tgaunt(machine_config &config) -{ - sm510_tiger(config, 1425, 1080); -} - -void tgaunt_state::trobhood(machine_config &config) -{ - sm510_tiger(config, 1468, 1080); -} - -// roms - -ROM_START( tgaunt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) - - ROM_REGION( 713071, "screen", 0) - ROM_LOAD( "tgaunt.svg", 0, 713071, CRC(b2dfb31b) SHA1(3e57c6aaa665e2874e6e7e051245a81ab7a917b3) ) -ROM_END - -ROM_START( trobhood ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "583", 0x0000, 0x1000, CRC(598d8156) SHA1(9f776e8b9b4321e8118481e6b1304f8a38f9932e) ) - - ROM_REGION( 704816, "screen", 0) - ROM_LOAD( "trobhood.svg", 0, 704816, CRC(f4b94f32) SHA1(8f68a7f4240489d42934d3875f82456aceabfb48) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Double Dragon (model 7-780) - * Sharp SM510 under epoxy (die label CMS54C, KMS570, 593) - * lcd screen with custom segments, 1-bit sound - - BTANB: On the baddie in the background throwing dynamite, the sparks - above his head are the same segment as the body, not the arm. - -***************************************************************************/ - -class tddragon_state : public hh_sm510_state -{ -public: - tddragon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tddragon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tddragon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sway") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tddragon_state::tddragon(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); // R mask option confirmed -} - -// roms - -ROM_START( tddragon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "593", 0x0000, 0x1000, CRC(2642f778) SHA1(fee77acf93e057a8b4627389dfd481c6d9cbd02b) ) - - ROM_REGION( 511477, "screen", 0) - ROM_LOAD( "tddragon.svg", 0, 511477, CRC(d3046671) SHA1(15fd328e28362402eab1094851dddd8e20a0bcec) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Karnov (model 7-783) - * Sharp SM510 under epoxy (die label CMS54C, KMS582) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tkarnov_state : public hh_sm510_state -{ -public: - tkarnov_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tkarnov(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tkarnov ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire-Ball") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Boomerang") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tkarnov_state::tkarnov(machine_config &config) -{ - sm510_tiger(config, 1477, 1080); -} - -// roms - -ROM_START( tkarnov ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "582", 0x0000, 0x1000, CRC(cee85bdd) SHA1(143e39524f1dea523e0575f327ed189343cc87f5) ) - - ROM_REGION( 527432, "screen", 0) - ROM_LOAD( "tkarnov.svg", 0, 527432, CRC(9317066c) SHA1(087cfde97e106c6fd8c52d3a1138e6bde2ad9289) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Vindicators (model 7-786) - * Sharp SM510 under epoxy (die label CMS54C, KMS595) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tvindictr_state : public hh_sm510_state -{ -public: - tvindictr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tvindictr(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tvindictr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Gun Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tvindictr_state::tvindictr(machine_config &config) -{ - sm510_tiger(config, 1459, 1080); -} - -// roms - -ROM_START( tvindictr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "595", 0x0000, 0x1000, CRC(b574d16f) SHA1(d2cb0f2e21ca2defe49a4b45f4c8e169ae9979ab) ) - - ROM_REGION( 314205, "screen", 0) - ROM_LOAD( "tvindictr.svg", 0, 314205, CRC(fefe9f31) SHA1(3c8e7ab2cd81de72740b2948def07a2fc000a78a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Ninja Gaiden (model 7-787) - * Sharp SM510 under epoxy (die label M82) - * lcd screen with custom segments, 1 led, 1-bit sound - -***************************************************************************/ - -class tgaiden_state : public hh_sm510_state -{ -public: - tgaiden_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag), - m_led_out(*this, "led") - { - inp_fixed_last(); - } - - void tgaiden(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // R2 connects to a single LED behind the screen - void led_w(u8 data) { m_led_out = data >> 1 & 1; } - output_finder<> m_led_out; -}; - -void tgaiden_state::machine_start() -{ - hh_sm510_state::machine_start(); - m_led_out.resolve(); -} - -// config - -static INPUT_PORTS_START( tgaiden ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgaiden_state::tgaiden(machine_config &config) -{ - sm510_tiger(config, 1476, 1080); - m_maincpu->write_r().append(FUNC(tgaiden_state::led_w)); -} - -// roms - -ROM_START( tgaiden ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m82", 0x0000, 0x1000, CRC(278eafb0) SHA1(14396a0010bade0fde705969151200ed432321e7) ) - - ROM_REGION( 588916, "screen", 0) - ROM_LOAD( "tgaiden.svg", 0, 588916, CRC(5845c630) SHA1(c4b0d4d85e4b58a051920b6b34668847049c57a7) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman (model 7-799) - * Sharp SM510 under epoxy (die label CMS54C, KMS597) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbatman_state : public hh_sm510_state -{ -public: - tbatman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatman ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatman_state::tbatman(machine_config &config) -{ - sm510_tiger(config, 1442, 1080); -} - -// roms - -ROM_START( tbatman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "597", 0x0000, 0x1000, CRC(8b7acc97) SHA1(fe811675dc5c5ef9f6f969685c933926c8b9e868) ) - - ROM_REGION( 551931, "screen", 0) - ROM_LOAD( "tbatman.svg", 0, 551931, CRC(95ae104b) SHA1(0508f925f29b2152b41c478447e63c74fce718ad) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Space Harrier II (model 7-814) - * Sharp SM510 under epoxy (die label M91) - * lcd screen with custom segments, 1-bit sound - - known releases: - - World: Space Harrier II, published by Tiger - - Japan: Space Harrier, published by Sega - -***************************************************************************/ - -class tsharr2_state : public hh_sm510_state -{ -public: - tsharr2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsharr2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsharr2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Attack - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsharr2_state::tsharr2(machine_config &config) -{ - sm510_tiger(config, 1493, 1080); // R mask option confirmed -} - -// roms - -ROM_START( tsharr2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m91", 0x0000, 0x1000, CRC(b207ac79) SHA1(9889dfec26089313ba2bdac845a75a26742d09e1) ) - - ROM_REGION( 555177, "screen", 0) - ROM_LOAD( "tsharr2.svg", 0, 555177, CRC(842f8f7e) SHA1(2c523531059acdfa3a0cebac9d8f84f1971e1086) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Strider (model 7-815) - * Sharp SM510 under epoxy (die label M92) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tstrider_state : public hh_sm510_state -{ -public: - tstrider_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tstrider(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tstrider ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Weapon") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tstrider_state::tstrider(machine_config &config) -{ - sm510_tiger(config, 1479, 1080); -} - -// roms - -ROM_START( tstrider ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m92", 0x0000, 0x1000, CRC(4b488e8f) SHA1(b037c220c4a456f0dac67d759736f202a7609ee5) ) - - ROM_REGION( 554858, "screen", 0) - ROM_LOAD( "tstrider.svg", 0, 554858, CRC(12767799) SHA1(9d67a96affee18dacaf3d49d89f60940c33492aa) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Golden Axe (model 7-817) - * Sharp SM510 under epoxy (die label M94) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tgoldnaxe_state : public hh_sm510_state -{ -public: - tgoldnaxe_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tgoldnaxe(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgoldnaxe ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Magic") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgoldnaxe_state::tgoldnaxe(machine_config &config) -{ - sm510_tiger(config, 1456, 1080); -} - -// roms - -ROM_START( tgoldnaxe ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m94", 0x0000, 0x1000, CRC(af183fbf) SHA1(23716e2a7c4bb4842b2af1a43fe88db44e18dc17) ) - - ROM_REGION( 605525, "screen", 0) - ROM_LOAD( "tgoldnaxe.svg", 0, 605525, CRC(9c1097c5) SHA1(bf9c2a1f4ae98ebe5eb9d381b0729588a150fa27) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Robocop 2 (model 7-830), The Rocketeer (model 7-864) - * Sharp SM510 under epoxy (die label M96) - * lcd screen with custom segments, 1-bit sound - - The Rocketeer is the same MCU/ROM, different LCD. - -***************************************************************************/ - -class trobocop2_state : public hh_sm510_state -{ -public: - trobocop2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobocop2(machine_config &config); - void trockteer(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trobocop2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -static INPUT_PORTS_START( trockteer ) - PORT_INCLUDE( trobocop2 ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Up/Rocket Pack") - - PORT_MODIFY("IN.3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Right") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire Left") -INPUT_PORTS_END - -void trobocop2_state::trobocop2(machine_config &config) -{ - sm510_tiger(config, 1487, 1080); -} - -void trobocop2_state::trockteer(machine_config &config) -{ - sm510_tiger(config, 1463, 1080); -} - -// roms - -ROM_START( trobocop2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) - - ROM_REGION( 463572, "screen", 0) - ROM_LOAD( "trobocop2.svg", 0, 463572, CRC(0218c1d9) SHA1(2932825ca03e008e5c2993882d363ae00df43f26) ) -ROM_END - -ROM_START( trockteer ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m96", 0x0000, 0x1000, CRC(3704b60c) SHA1(04275833e1a79fd33226faf060890b66ae54e1d3) ) - - ROM_REGION( 558128, "screen", 0) - ROM_LOAD( "trockteer.svg", 0, 558128, CRC(70ff1f46) SHA1(5cd94655654614206ed11844ba31650edb51eb22) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Altered Beast (model 7-831) - * Sharp SM510 under epoxy (die label M88) - * lcd screen with custom segments, 1-bit sound - - known releases: - - World: Altered Beast, published by Tiger - - Japan: Juuouki, published by Sega - -***************************************************************************/ - -class taltbeast_state : public hh_sm510_state -{ -public: - taltbeast_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void taltbeast(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( taltbeast ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick/Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void taltbeast_state::taltbeast(machine_config &config) -{ - sm510_tiger(config, 1455, 1080); // R mask option confirmed -} - -// roms - -ROM_START( taltbeast ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "m88", 0x0000, 0x1000, CRC(1b3d15e7) SHA1(78371230dff872d6c07eefdbc4856c2a3336eb61) ) - - ROM_REGION( 667931, "screen", 0) - ROM_LOAD( "taltbeast.svg", 0, 667931, CRC(a642d5f7) SHA1(ad005deaa35189e59317a07d860403adeef51aad) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Street Fighter 2010 - The Final Fight (model 7-837) - * Sharp SM510 under epoxy (die label MA2) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsf2010_state : public hh_sm510_state -{ -public: - tsf2010_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsf2010(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsf2010 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select Planet") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsf2010_state::tsf2010(machine_config &config) -{ - sm510_tiger(config, 1465, 1080); -} - -// roms - -ROM_START( tsf2010 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma2", 0x0000, 0x1000, CRC(764b3757) SHA1(c5f90b860128658576bb837e9cabbb3045ad2756) ) - - ROM_REGION( 595191, "screen", 0) - ROM_LOAD( "tsf2010.svg", 0, 595191, CRC(78f96bad) SHA1(4389580e3d47dda0243b01625427013eb7ec4336) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Swamp Thing (model 7-851) - * Sharp SM510 under epoxy (die label MB0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tswampt_state : public hh_sm510_state -{ -public: - tswampt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tswampt(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tswampt ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tswampt_state::tswampt(machine_config &config) -{ - sm510_tiger(config, 1450, 1080); -} - -// roms - -ROM_START( tswampt ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb0", 0x0000, 0x1000, CRC(8433530c) SHA1(60716d3bba92dc8ac3f1ee29c5734c9e894a1aff) ) - - ROM_REGION( 578544, "screen", 0) - ROM_LOAD( "tswampt.svg", 0, 578544, CRC(921e2b43) SHA1(176426fe9bf4855256e0ff7804ca48e619fa0cf3) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Spider-Man (model 7-853) - * Sharp SM510 under epoxy (die label MA5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tspidman_state : public hh_sm510_state -{ -public: - tspidman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tspidman(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tspidman ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right/Kick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up/Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left/Rescue") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Status") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tspidman_state::tspidman(machine_config &config) -{ - sm510_tiger(config, 1440, 1080); -} - -// roms - -ROM_START( tspidman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma5", 0x0000, 0x1000, CRC(2624daed) SHA1(7c10434ae899637264de706045d48e3fce1d30a7) ) - - ROM_REGION( 605375, "screen", 0) - ROM_LOAD( "tspidman.svg", 0, 605375, CRC(6c032ce4) SHA1(69043096e28709821ddc26ef05f60f353fc3e35d) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger X-Men (model 7-854) - * Sharp SM510 under epoxy (die label MA7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class txmen_state : public hh_sm510_state -{ -public: - txmen_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void txmen(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( txmen ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Claws") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void txmen_state::txmen(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( txmen ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma7", 0x0000, 0x1000, CRC(6f3ff34f) SHA1(aa24fbc3a4117ea51ebf951ee343a36c77692b72) ) - - ROM_REGION( 543273, "screen", 0) - ROM_LOAD( "txmen.svg", 0, 543273, CRC(039b37bb) SHA1(bd57cba8f380185beda2eb5ea7b5d1f25c8d447b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Double Dragon 3 - The Rosetta Stone (model 7-858) - * Sharp SM510 under epoxy (die label MA6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tddragon3_state : public hh_sm510_state -{ -public: - tddragon3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tddragon3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tddragon3 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tddragon3_state::tddragon3(machine_config &config) -{ - sm510_tiger(config, 1514, 1080); -} - -// roms - -ROM_START( tddragon3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "ma6", 0x0000, 0x1000, CRC(8e2da0d9) SHA1(54dd05124b4c605975b0cb1eadd7456ff4a94d68) ) - - ROM_REGION( 615734, "screen", 0) - ROM_LOAD( "tddragon3.svg", 0, 615734, CRC(4c94d574) SHA1(e2717db6c0279da4813550f0035a23bdaaa8b7bb) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Flash (model 7-859) - * Sharp SM510 under epoxy (die label MB5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tflash_state : public hh_sm510_state -{ -public: - tflash_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tflash(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tflash ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Brake") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Run") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tie") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tflash_state::tflash(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tflash ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb5", 0x0000, 0x1000, CRC(f7f1d082) SHA1(49a7a931450cf27fe69076c4e15ffb34814e25d4) ) - - ROM_REGION( 587863, "screen", 0) - ROM_LOAD( "tflash.svg", 0, 587863, CRC(8ddb9391) SHA1(fa8b4610a914de8ae95123c4273a12cdb4353a39) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger MC Hammer: U Can't Touch This (model 7-863) - * Sharp SM511 under epoxy (die label N63) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tmchammer_state : public hh_sm510_state -{ -public: - tmchammer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tmchammer(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tmchammer ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Up") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Footwork Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Up/Jump") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Leg Leaps Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Right") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Splits Left") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Arm Down") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tmchammer_state::tmchammer(machine_config &config) -{ - sm511_tiger1bit(config, 1471, 1080); -} - -// roms - -ROM_START( tmchammer ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n63.program", 0x0000, 0x1000, CRC(303aa6f7) SHA1(296689be1ee05238e52e9882812868b2ea96202c) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n63.melody", 0x000, 0x100, CRC(77c1a5a3) SHA1(c00ae3b7c64dd9db96eab520fe674a40571fc15f) ) - - ROM_REGION( 456487, "screen", 0) - ROM_LOAD( "tmchammer.svg", 0, 456487, CRC(1cd10ff3) SHA1(092396c56adae7f872c3b5916ef3ecf67ab30161) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Battletoads (model 7-868) - * Sharp SM510 under epoxy (die label MB3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbtoads_state : public hh_sm510_state -{ -public: - tbtoads_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbtoads(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbtoads ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbtoads_state::tbtoads(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( tbtoads ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb3", 0x0000, 0x1000, CRC(8fa4c55a) SHA1(2be97e63dfed51313e180d7388dd431058db5a51) ) - - ROM_REGION( 694417, "screen", 0) - ROM_LOAD( "tbtoads.svg", 0, 694417, CRC(c0fbc25d) SHA1(def54ab2f10123246f7809fc3caf3e9d26800f87) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Hook (model 7-869) - * Sharp SM510 under epoxy (die label MB7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thook_state : public hh_sm510_state -{ -public: - thook_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thook(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thook ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Up") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sword Down/Dodge") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thook_state::thook(machine_config &config) -{ - sm510_tiger(config, 1489, 1080); -} - -// roms - -ROM_START( thook ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mb7", 0x0000, 0x1000, CRC(7eb1a6e2) SHA1(f4a09ab95c968b0ddbe56cd7bb2667881c145731) ) - - ROM_REGION( 680544, "screen", 0) - ROM_LOAD( "thook.svg", 0, 680544, CRC(bddefb9b) SHA1(438b0fe6f4c0196952bd179075498d6bd19c3e48) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Back to the Future (model 7-809) - * Sharp SM510 under epoxy (die label MC3) - * lcd screen with custom segments, 1-bit sound - - This game is from 1992, even though the model number suggests otherwise. - Perhaps Tiger filled unused model numbers before switching to 78-xxx. - -***************************************************************************/ - -class tbttf_state : public hh_sm510_state -{ -public: - tbttf_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbttf(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbttf ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Repair") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbttf_state::tbttf(machine_config &config) -{ - sm510_tiger(config, 1466, 1080); -} - -// roms - -ROM_START( tbttf ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc3", 0x0000, 0x1000, CRC(9c37a23c) SHA1(c09fa5caac8b574f8460265b98c0bea1d5e78c6a) ) - - ROM_REGION( 667741, "screen", 0) - ROM_LOAD( "tbttf.svg", 0, 667741, CRC(1a57e35a) SHA1(9b622e08cc44e3d48b71a283cd07b89fbcc6faa4) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Addams Family (model 7-829) - * Sharp SM510 under epoxy (die label MC2) - * lcd screen with custom segments, 1-bit sound - - Like Back to the Future, this game is newer than the model number suggests. - -***************************************************************************/ - -class taddams_state : public hh_sm510_state -{ -public: - taddams_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void taddams(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( taddams ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Take") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void taddams_state::taddams(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( taddams ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc2", 0x0000, 0x1000, CRC(af33d432) SHA1(676ada238c389d1dd02dcb29731d69624f60b342) ) - - ROM_REGION( 554703, "screen", 0) - ROM_LOAD( "taddams.svg", 0, 554703, CRC(85f15123) SHA1(088dbfbe760b782988bbfe6d29d89b8427844992) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Home Alone (model 78-502) - * Sharp SM510 under epoxy (die label MC7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thalone_state : public hh_sm510_state -{ -public: - thalone_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thalone(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thalone ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thalone_state::thalone(machine_config &config) -{ - sm510_tiger(config, 1448, 1080); -} - -// roms - -ROM_START( thalone ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc7", 0x0000, 0x1000, CRC(eceda335) SHA1(20c9ffcf914db61aba03716fe146bac42873ac82) ) - - ROM_REGION( 494279, "screen", 0) - ROM_LOAD( "thalone.svg", 0, 494279, CRC(2479d88d) SHA1(061413d6e0893106b335ca42cf0260f45c7dacc7) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger X-Men - Project X (model 78-504) - * Sharp SM510 under epoxy (die label MD3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class txmenpx_state : public hh_sm510_state -{ -public: - txmenpx_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void txmenpx(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( txmenpx ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Move") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void txmenpx_state::txmenpx(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( txmenpx ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "md3", 0x0000, 0x1000, CRC(11c2b09a) SHA1(f94b1e3e60f002398b39c98946469dd1a6aa8e77) ) - - ROM_REGION( 572583, "screen", 0) - ROM_LOAD( "txmenpx.svg", 0, 572583, CRC(b98f3134) SHA1(78ac7cd32b36f214b5e6eada725378ccbca91987) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Home Alone 2 - Lost in New York (model 78-506) - * Sharp SM510 under epoxy (die label MD7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class thalone2_state : public hh_sm510_state -{ -public: - thalone2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void thalone2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( thalone2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Climb/Pick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Trap/Flash Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void thalone2_state::thalone2(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( thalone2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "md7", 0x0000, 0x1000, CRC(ac8a21e9) SHA1(9024f74e34056f90b7dbf439300797183f74eb00) ) - - ROM_REGION( 748928, "screen", 0) - ROM_LOAD( "thalone2.svg", 0, 748928, CRC(d42ec743) SHA1(7df9654b7f700662f29ca7cabe25ac78b2c4b04b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sonic The Hedgehog (model 78-513) - * Sharp SM511 under epoxy (die label KMS73B, N71) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tsonic_state : public hh_sm510_state -{ -public: - tsonic_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsonic(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsonic ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump Up - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Super Sonic Spin - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsonic_state::tsonic(machine_config &config) -{ - sm511_tiger2bit(config, 1517, 1080); -} - -// roms - -ROM_START( tsonic ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n71.program", 0x0000, 0x1000, CRC(44cafd68) SHA1(bf8d0ab88d153fabc688ffec19959209ca79c3db) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n71.melody", 0x000, 0x100, CRC(bae258c8) SHA1(81cb75d73fab4479cd92fcb13d9cb03cec2afdd5) ) - - ROM_REGION( 541491, "screen", 0) - ROM_LOAD( "tsonic.svg", 0, 541491, CRC(ac6bff26) SHA1(fa944958eb64e8283d35951ff105cead28e6ab8a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Robocop 3 (model 78-514) - * Sharp SM510 under epoxy (die label MC6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class trobocop3_state : public hh_sm510_state -{ -public: - trobocop3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void trobocop3(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trobocop3 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Fly") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Rescue") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trobocop3_state::trobocop3(machine_config &config) -{ - sm510_tiger(config, 1464, 1080); -} - -// roms - -ROM_START( trobocop3 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mc6", 0x0000, 0x1000, CRC(07b44e4c) SHA1(3165c85e16c062d2d9d0c0f1b1f6bd6079b4de15) ) - - ROM_REGION( 612142, "screen", 0) - ROM_LOAD( "trobocop3.svg", 0, 612142, CRC(b55c1440) SHA1(e8f692deecf489be22be570510175b750d65d5c5) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Incredible Crash Dummies (model 78-516) - * Sharp SM510 under epoxy (die label ME0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tdummies_state : public hh_sm510_state -{ -public: - tdummies_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tdummies(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tdummies ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Crash") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Accelerate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tdummies_state::tdummies(machine_config &config) -{ - sm510_tiger(config, 1441, 1080); -} - -// roms - -ROM_START( tdummies ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me0", 0x0000, 0x1000, CRC(29efae4a) SHA1(0b26913a3fd2fde2b39549f0f7cbc3daaa41eb50) ) - - ROM_REGION( 525535, "screen", 0) - ROM_LOAD( "tdummies.svg", 0, 525535, CRC(b0db8655) SHA1(937b3edd9c0949b9f7d01ef8920ac63b61e64909) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Street Fighter II (model 78-522) - * Sharp SM510 under epoxy (die label ME1) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsfight2_state : public hh_sm510_state -{ -public: - tsfight2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsfight2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsfight2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) // Down - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch/Special Move") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsfight2_state::tsfight2(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tsfight2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me1", 0x0000, 0x1000, CRC(73384e94) SHA1(350417d101ce034b3974b4a1d2e04bcb3bf70605) ) - - ROM_REGION( 630444, "screen", 0) - ROM_LOAD( "tsfight2.svg", 0, 630444, CRC(42b82c9b) SHA1(8e18d0cfd629478973f2c857105daad70eae46d9) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Wayne's World (model 78-523) - * Sharp SM510 under epoxy (die label ME7) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class twworld_state : public hh_sm510_state -{ -public: - twworld_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void twworld(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( twworld ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("High Five") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Cassandra") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Hockey Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void twworld_state::twworld(machine_config &config) -{ - sm510_tiger(config, 1429, 1080); -} - -// roms - -ROM_START( twworld ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "me7", 0x0000, 0x1000, CRC(dcb16d98) SHA1(539989e12bbc4a719818546c5edcfda02b98210e) ) - - ROM_REGION( 527901, "screen", 0) - ROM_LOAD( "twworld.svg", 0, 527901, CRC(515fede8) SHA1(e9c5adfb02b860fb97968957f282e685b1a4e3bc) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Jurassic Park (model 78-524) - * Sharp SM510 under epoxy (die label MF4) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tjpark_state : public hh_sm510_state -{ -public: - tjpark_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tjpark(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tjpark ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump/Climb") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Swing/Power") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Forward") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tjpark_state::tjpark(machine_config &config) -{ - sm510_tiger(config, 1454, 1080); -} - -// roms - -ROM_START( tjpark ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf4", 0x0000, 0x1000, CRC(f66faf73) SHA1(4cfa743dcd6e44a3c1f56206d5824fddba16df01) ) - - ROM_REGION( 812619, "screen", 0) - ROM_LOAD( "tjpark.svg", 0, 812619, CRC(04d85ec6) SHA1(97f67bb496d985b62dc094f6f1d6b5597a4df895) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sonic The Hedgehog 2 (model 78-527) - * Sharp SM511 under epoxy (die label N86) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tsonic2_state : public hh_sm510_state -{ -public: - tsonic2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsonic2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsonic2 ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsonic2_state::tsonic2(machine_config &config) -{ - sm511_tiger2bit(config, 1475, 1080); -} - -// roms - -ROM_START( tsonic2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n86.program", 0x0000, 0x1000, CRC(782874c5) SHA1(b7eb1f56cbc781ba0b90f6b4b5b51944120733cc) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n86.melody", 0x000, 0x100, CRC(c16fa2b2) SHA1(222772d311fd3b3b05d80cfd539c2c862bed0be5) ) - - ROM_REGION( 667927, "screen", 0) - ROM_LOAD( "tsonic2.svg", 0, 667927, CRC(d2c52e67) SHA1(24ffbc8fae606dcd2f60a4d95fe1dcfd261c3576) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Super Double Dragon (model 78-528) - * Sharp SM510 under epoxy (die label MF5) - * lcd screen with custom segments, 1-bit sound - - BTANB: The player char right arm muscle is part of the right kick segment. - They probably meant to use it for the right punch segment, but this is - how it shows on the LCD. - -***************************************************************************/ - -class tsddragon_state : public hh_sm510_state -{ -public: - tsddragon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsddragon(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsddragon ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("P1 Down/Pick") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Special Technique") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsddragon_state::tsddragon(machine_config &config) -{ - sm510_tiger(config, 1503, 1080); -} - -// roms - -ROM_START( tsddragon ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf5", 0x0000, 0x1000, CRC(264c8e82) SHA1(470eb2f09a58ef05eb0b7c8e11380ad1d8ce4e1a) ) - - ROM_REGION( 753572, "screen", 0) - ROM_LOAD( "tsddragon.svg", 0, 753572, CRC(0759388b) SHA1(4e4acb1b97845e529522ba21de846ce1dc74357d) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Dennis the Menace (model 78-532) - * Sharp SM510 under epoxy (die label MF9) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tdennis_state : public hh_sm510_state -{ -public: - tdennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tdennis(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tdennis ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Brake") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Left") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Slingshot Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tdennis_state::tdennis(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( tdennis ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mf9", 0x0000, 0x1000, CRC(d95f54d5) SHA1(1b3a170f32deec98e54ad09c04b404f5ae03dcea) ) - - ROM_REGION( 754896, "screen", 0) - ROM_LOAD( "tdennis.svg", 0, 754896, CRC(6e7512c3) SHA1(b84ef988051a6a883f3435a779ea67e544d50dae) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Nightmare Before Christmas (model 78-537) - * Sharp SM510 under epoxy (die label MG0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tnmarebc_state : public hh_sm510_state -{ -public: - tnmarebc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tnmarebc(machine_config &config); - -private: - virtual void input_w(u8 data) override; -}; - -// handlers - -void tnmarebc_state::input_w(u8 data) -{ - // S5 and S6 tied together - hh_sm510_state::input_w((data & 0x1f) | (data >> 1 & 0x10)); -} - -// config - -static INPUT_PORTS_START( tnmarebc ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) // Jump - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // Action - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5/S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tnmarebc_state::tnmarebc(machine_config &config) -{ - sm510_tiger(config, 1456, 1080); -} - -// roms - -ROM_START( tnmarebc ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg0", 0x0000, 0x1000, CRC(5ef21421) SHA1(8fd458575111b89d7c33c969e76703bde5ad2c36) ) - - ROM_REGION( 631351, "screen", 0) - ROM_LOAD( "tnmarebc.svg", 0, 631351, CRC(140e278b) SHA1(f0d2b6e6ee2328f54255532ad03d5d505ebbb23b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Transformers - Generation 2 (model 78-541) - * Sharp SM510 under epoxy (die label MG2) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class ttransf2_state : public hh_sm510_state -{ -public: - ttransf2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void ttransf2(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( ttransf2 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Call") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Transform") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void ttransf2_state::ttransf2(machine_config &config) -{ - sm510_tiger(config, 1476, 1080); -} - -// roms - -ROM_START( ttransf2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg2", 0x0000, 0x1000, CRC(65c0f456) SHA1(b1bc3887c5088b3fe359585658e5c5236c09af9e) ) - - ROM_REGION( 727708, "screen", 0) - ROM_LOAD( "ttransf2.svg", 0, 727708, CRC(bd527f23) SHA1(9ce35bbfe1ea61c431eccaf32274faa4181587da) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Operation: Aliens (model 78-552) - * Sharp SM510 under epoxy (die label MJ1) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class topaliens_state : public hh_sm510_state -{ -public: - topaliens_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void topaliens(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( topaliens ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void topaliens_state::topaliens(machine_config &config) -{ - sm510_tiger(config, 1450, 1080); -} - -// roms - -ROM_START( topaliens ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mj1", 0x0000, 0x1000, CRC(ccc196cf) SHA1(f18f7cf842cddecf90d05ab0f90257bb76514f54) ) - - ROM_REGION( 1214917, "screen", 0) - ROM_LOAD( "topaliens.svg", 0, 1214917, CRC(cbd57ab4) SHA1(efac0833f421212a81a8fc9b35c97369375aa1a9) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Mortal Kombat (model 78-553) - * Sharp SM510 under epoxy (die label MG6) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tmkombat_state : public hh_sm510_state -{ -public: - tmkombat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tmkombat(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tmkombat ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch High") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick High") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Low") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick Low") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Select") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tmkombat_state::tmkombat(machine_config &config) -{ - sm510_tiger(config, 1468, 1080); -} - -// roms - -ROM_START( tmkombat ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mg6", 0x0000, 0x1000, CRC(f6375dc7) SHA1(a711199c2623979f19c11067ebfff9355256c2c3) ) - - ROM_REGION( 841871, "screen", 0) - ROM_LOAD( "tmkombat.svg", 0, 841871, CRC(3bd5a963) SHA1(4d093f34c64caf60233e156fe160d8fceb15b6c6) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger The Shadow (model 78-559) - * Sharp SM510 under epoxy (die label MJ5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tshadow_state : public hh_sm510_state -{ -public: - tshadow_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tshadow(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tshadow ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shadow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tshadow_state::tshadow(machine_config &config) -{ - sm510_tiger(config, 1484, 1080); -} - -// roms - -ROM_START( tshadow ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mj5", 0x0000, 0x1000, CRC(09822d73) SHA1(30cae8b783a4f388193aee248fa18c6c1042e0ec) ) - - ROM_REGION( 946494, "screen", 0) - ROM_LOAD( "tshadow.svg", 0, 946494, CRC(e62de82e) SHA1(94fcef33066e97266efcd0d91b60229859088b36) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Skeleton Warriors - The Dark Crusade (model 78-569) - * Sharp SM510 under epoxy (die label MK0) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tskelwarr_state : public hh_sm510_state -{ -public: - tskelwarr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tskelwarr(machine_config &); -}; - -// config - -static INPUT_PORTS_START( tskelwarr ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Right") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Attack Left") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tskelwarr_state::tskelwarr(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tskelwarr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk0", 0x0000, 0x1000, CRC(dc7827a1) SHA1(74ff143605684df0c70db604a5f22dbf512044d7) ) - - ROM_REGION( 1125043, "screen", 0) - ROM_LOAD( "tskelwarr.svg", 0, 1125043, CRC(ee086073) SHA1(70e06a7fe8a1a8b8fee483c08522996da9917501) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman Forever - Double Dose of Doom (model 78-572) - * Sharp SM510 under epoxy (die label MK3) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tbatfor_state : public hh_sm510_state -{ -public: - tbatfor_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatfor(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatfor ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Grappling Gun") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Help") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Batarang") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatfor_state::tbatfor(machine_config &config) -{ - sm510_tiger(config, 1493, 1080); -} - -// roms - -ROM_START( tbatfor ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk3", 0x0000, 0x1000, CRC(9993c382) SHA1(0c89e21024315ce7c086af5390c60f5766028c4f) ) - - ROM_REGION( 902412, "screen", 0) - ROM_LOAD( "tbatfor.svg", 0, 902412, CRC(d92d799e) SHA1(fa8b4198099748570a9cc9772c81aa583ac7ea72) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Judge Dredd (model 78-581) - * Sharp SM510 under epoxy (die label MK5) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tjdredd_state : public hh_sm510_state -{ -public: - tjdredd_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tjdredd(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tjdredd ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Call") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tjdredd_state::tjdredd(machine_config &config) -{ - sm510_tiger(config, 1444, 1080); -} - -// roms - -ROM_START( tjdredd ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mk5", 0x0000, 0x1000, CRC(7beee5a7) SHA1(9a190197c5751b43a9ab2dc8c536934dc5fc5e83) ) - - ROM_REGION( 1051637, "screen", 0) - ROM_LOAD( "tjdredd.svg", 0, 1051637, CRC(0f3541c6) SHA1(9838e2ae5806a48be595f53e6096b7c150b91651) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Apollo 13 (model 78-591) - * Sharp SM510 under epoxy (die label 10 07) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tapollo13_state : public hh_sm510_state -{ -public: - tapollo13_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tapollo13(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tapollo13 ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Parachute") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Thruster Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Capture") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tapollo13_state::tapollo13(machine_config &config) -{ - sm510_tiger(config, 1467, 1080); -} - -// roms - -ROM_START( tapollo13 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_07", 0x0000, 0x1000, CRC(63d0deaa) SHA1(d5de99d5e0ee08ec2ebeef7189ebac1c008d2e7d) ) - - ROM_REGION( 643219, "screen", 0) - ROM_LOAD( "tapollo13.svg", 0, 643219, CRC(f4b94141) SHA1(d67367212f2be1685de0f3acaebaae0dc67734c4) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger 007: GoldenEye (model 78-594) - * Sharp SM510 under epoxy (die label 10 06) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tgoldeye_state : public hh_sm510_state -{ -public: - tgoldeye_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tgoldeye(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tgoldeye ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Q") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tgoldeye_state::tgoldeye(machine_config &config) -{ - sm510_tiger(config, 1461, 1080); -} - -// roms - -ROM_START( tgoldeye ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_06", 0x0000, 0x1000, CRC(fe053efb) SHA1(3c90c0fa43e6e5e1f76b306e402f902d19175c96) ) - - ROM_REGION( 938956, "screen", 0) - ROM_LOAD( "tgoldeye.svg", 0, 938956, CRC(c4ad9836) SHA1(23555bd5fdaebed190ce02054a8ee681c88a8afb) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Kazaam (model 78-613) - * Sharp SM510 under epoxy (die label KMS10, 18) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tkazaam_state : public hh_sm510_state -{ -public: - tkazaam_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tkazaam(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tkazaam ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Kick") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pick/Rescue") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Punch Back") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tkazaam_state::tkazaam(machine_config &config) -{ - sm510_tiger(config, 1452, 1080); // no external XTAL -} - -// roms - -ROM_START( tkazaam ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_18", 0x0000, 0x1000, CRC(aa796372) SHA1(fdaea736e1df46c19fca08ed981e9659e038d15a) ) - - ROM_REGION( 929109, "screen", 0) - ROM_LOAD( "tkazaam.svg", 0, 929109, CRC(5eb178d4) SHA1(bcf64df4f342d16d5fd3d4cb503fceb1e5485591) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Space Jam (model 78-621) - * Sharp SM510 under epoxy (die label KMS10, 23) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tsjam_state : public hh_sm510_state -{ -public: - tsjam_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tsjam(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tsjam ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shoot/Block") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Tune/Steal") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tsjam_state::tsjam(machine_config &config) -{ - sm510_tiger(config, 1421, 1080); // no external XTAL -} - -// roms - -ROM_START( tsjam ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_23", 0x0000, 0x1000, CRC(6eaabfbd) SHA1(f0ecbd6f65fe72ce2d8a452685be2e77a63fc9f0) ) - - ROM_REGION( 1046158, "screen", 0) - ROM_LOAD( "tsjam.svg", 0, 1046158, CRC(29187365) SHA1(f277a064e6ecd6219c930736a0bdf56196279b42) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Independence Day (model 78-624) - * Sharp SM510 under epoxy (die label 10 16) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class tinday_state : public hh_sm510_state -{ -public: - tinday_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tinday(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tinday ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Shield") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fire") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alert") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Velocity") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tinday_state::tinday(machine_config &config) -{ - sm510_tiger(config, 1463, 1080); -} - -// roms - -ROM_START( tinday ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "10_16", 0x0000, 0x1000, CRC(77c2c2f7) SHA1(06326b26d0f6757180724ba0bdeb4110cc7e29d6) ) - - ROM_REGION( 1162716, "screen", 0) - ROM_LOAD( "tinday.svg", 0, 1162716, CRC(97056e62) SHA1(0348f0aca5d9b8e24f83c7e73b5e31f419fe60df) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Batman: The Animated Series (model 72-505) - * Sharp SM511 under epoxy (die label N81) - * lcd screen with custom segments, 2-bit sound - -***************************************************************************/ - -class tbatmana_state : public hh_sm510_state -{ -public: - tbatmana_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { - inp_fixed_last(); - } - - void tbatmana(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( tbatmana ) - PORT_START("IN.0") // S2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_NAME("Jump") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Fast") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S5 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Throw/Attack") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // S6 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Max Score") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // GND! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) PORT_NAME("Power On/Start") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Sound") - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_OFF ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void tbatmana_state::tbatmana(machine_config &config) -{ - sm511_tiger2bit(config, 1478, 1080); -} - -// roms - -ROM_START( tbatmana ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "n81.program", 0x0000, 0x1000, CRC(efb3f122) SHA1(d55c2fb92fb9bd41d6001f42143691b84f3f389a) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "n81.melody", 0x000, 0x100, CRC(56ba8fe5) SHA1(5c286ae1bfc943bbe8c8f4cdc9c8b73d9b3c186e) ) - - ROM_REGION( 618872, "screen", 0) - ROM_LOAD( "tbatmana.svg", 0, 618872, CRC(8c721273) SHA1(d8c52441466943254bffcd6449af47a9fad6296b) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica Shuttle Voyage (MG-8) - * Sharp SM510 label 0019 238E TRONICA (no decap) - * lcd screen with custom segments, 1-bit sound - - Even though the serial is MG-8, the back of the game says 1983, newer than MG-9? - Thief in Garden (model TG-18) is the exact same MCU, but different graphics. - -***************************************************************************/ - -class trshutvoy_state : public hh_sm510_state -{ -public: - trshutvoy_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trshutvoy(machine_config &config); - void tigarden(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trshutvoy ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // S6 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F - - PORT_START("IN.7") // S8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") - - PORT_START("FAKE") // Up/Sound are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") -INPUT_PORTS_END - -void trshutvoy_state::trshutvoy(machine_config &config) -{ - sm510_common(config, 1496, 1080); // R mask option confirmed -} - -void trshutvoy_state::tigarden(machine_config &config) -{ - sm510_common(config, 1515, 1080); -} - -// roms - -ROM_START( trshutvoy ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) - - ROM_REGION( 221748, "screen", 0) - ROM_LOAD( "trshutvoy.svg", 0, 221748, CRC(9e630b4e) SHA1(7e2a3a82519f29f7b1b92930604e010b5b9fdb06) ) -ROM_END - -ROM_START( tigarden ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) ) - - ROM_REGION( 409134, "screen", 0) - ROM_LOAD( "tigarden.svg", 0, 409134, CRC(628f4aee) SHA1(5fa4843be61b52660a932e0d1efad403cf12de88) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica: Space Rescue (model MG-9), Thunder Ball (model FR-23) - * PCB labels: SPACE RESCUE MG-9 080492 (MG-9) - SPACE RESCUE MG-9 210982 (FR-23) - * Sharp SM510 labels (no decap): 0015 224B TRONICA (MG-9) - 0015 236D TRONICA (FR-23) - * lcd screen with custom segments, 1-bit sound - -***************************************************************************/ - -class trsrescue_state : public hh_sm510_state -{ -public: - trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trsrescue(machine_config &config); - void trthuball(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( trsrescue ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - - PORT_START("B") - PORT_CONFNAME( 0x01, 0x01, "Infinite Lives (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trsrescue_state::trsrescue(machine_config &config) -{ - sm510_common(config, 1533, 1080); // R mask option confirmed -} - -void trsrescue_state::trthuball(machine_config &config) -{ - sm510_common(config, 1599, 1080); // R mask option confirmed -} - -// roms - -ROM_START( trsrescue ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) - - ROM_REGION( 178760, "screen", 0) - ROM_LOAD( "trsrescue.svg", 0, 178760, CRC(40756fd3) SHA1(9762ebbe4753a3194d7f0844c91addb8e1f8930b) ) -ROM_END - -ROM_START( trthuball ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "0015_236d", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) ) - - ROM_REGION( 175018, "screen", 0) - ROM_LOAD( "trthuball.svg", 0, 175018, CRC(3404cc1d) SHA1(4cebe3c742c6947c6fddb8a84ae2f7d0cea1b527) ) -ROM_END - - - - - -/*************************************************************************** - - Tronica: Space Mission (model SM-11), Spider (model SG-21) - * PCB labels: SPACE MISSION SM-11 250582 (SM-11) - SPACE MISSION SM-11 220982 (SG-21) - * Sharp SM5A labels (no decap): 0126 228B TRONICA (SM-11) - 0126 22YC TRONICA (SG-21) - * lcd screen with custom segments, 1-bit sound - - SM-11 and SG-21 are the exact same MCU, but with different graphics. - - In 1983, Tronica released a second revision of SG-21 with different graphic - overlays. This version can be distinguished by having the year 1983 labeled - on the backside of the unit. - -***************************************************************************/ - -class trspacmis_state : public hh_sm510_state -{ -public: - trspacmis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void trspacmis(machine_config &config); - void trspider(machine_config & config); -}; - -// config - -static INPUT_PORTS_START( trspacmis ) - PORT_START("IN.0") // R2 - PORT_CONFNAME( 0x01, 0x00, "Invincibility (Cheat)") // factory test, unpopulated on PCB - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as 0x01? - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // display test? - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // alarm test? - - PORT_START("IN.1") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("BA") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("B") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void trspacmis_state::trspacmis(machine_config &config) -{ - sm5a_common(config, 1601, 1080); // R mask option confirmed -} - -void trspacmis_state::trspider(machine_config &config) -{ - sm5a_common(config, 1597, 1080); // R mask option confirmed -} - -// roms - -ROM_START( trspacmis ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "0126_228b", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) - - ROM_REGION( 106675, "screen", 0) - ROM_LOAD( "trspacmis.svg", 0, 106675, CRC(45d7b798) SHA1(db08fef21462507a115547ecf8eac38260a0c868) ) -ROM_END - -ROM_START( trspider ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "0126_22yc", 0x0000, 0x0740, CRC(3d319537) SHA1(007d376cfd29574554caa59ed9163178179ae9c5) ) - - ROM_REGION( 130534, "screen", 0) - ROM_LOAD( "trspider.svg", 0, 130534, CRC(d3f00245) SHA1(348c47dbe87ce8537c9b1c91d0d8bbf0809546e8) ) -ROM_END - - - - - -/*************************************************************************** - - Elektronika Автослалом (Autoslalom) (model ИМ-23) - * KB1013VK1-2 MCU - * lcd screen with custom segments, 1-bit sound - - This is not an unlicensed clone, but doing a hex compare with MC-25 - still shows around 30% similarity so clearly they used that as a base. - -***************************************************************************/ - -class auslalom_state : public hh_sm510_state -{ -public: - auslalom_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void auslalom(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( auslalom ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Запуск (Start)") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Скорость (Speed)") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL") -INPUT_PORTS_END - -void auslalom_state::auslalom(machine_config &config) -{ - kb1013vk12_common(config, 1732, 1080); // R mask option ? -} - -// roms - -ROM_START( auslalom ) - ROM_REGION( 0x800, "maincpu", 0 ) - ROM_LOAD( "im-23.bin", 0x0000, 0x0740, CRC(3b6e726f) SHA1(eabd04722811d1cc6519db9386b14a535f5aa865) ) - - ROM_REGION( 117520, "screen", 0) - ROM_LOAD( "auslalom.svg", 0, 117520, CRC(2f90fd4c) SHA1(f0de58b1fe2f7c18fc219f9f9a94c227ca1245e4) ) -ROM_END - - - - - -/*************************************************************************** - - VTech Electronic Number Muncher - * Sharp SM511 under epoxy (die label 772) - * lcd screen with custom segments(no background), 1-bit sound - -***************************************************************************/ - -class nummunch_state : public hh_sm510_state -{ -public: - nummunch_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag) - { } - - void nummunch(machine_config &config); -}; - -// config - -static INPUT_PORTS_START( nummunch ) - PORT_START("IN.0") // S1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // S2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CHANGED_CB(input_changed) PORT_NAME("Calc. / Clear") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // S3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_CHANGED_CB(input_changed) PORT_NAME("Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CHANGED_CB(input_changed) PORT_NAME("Count") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CHANGED_CB(input_changed) PORT_NAME("Quiz") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // S4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose +") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CHANGED_CB(input_changed) PORT_NAME("Choose -") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"Choose ÷") - - PORT_START("IN.4") // S5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CHANGED_CB(input_changed) PORT_NAME("Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHANGED_CB(input_changed) PORT_NAME("Right") - - PORT_START("IN.5") // S6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2") - - PORT_START("IN.6") // S7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6") - - PORT_START("IN.7") // S8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(u8"÷") - - PORT_START("ACL") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(acl_button) -INPUT_PORTS_END - -void nummunch_state::nummunch(machine_config &config) -{ - sm511_common(config, 1920, 875); -} - -// roms - -ROM_START( nummunch ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "772.program", 0x0000, 0x1000, CRC(2f7ff516) SHA1(132e7c5c4d69170953b2e51731992d6d6ba829f9) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "772.melody", 0x000, 0x100, CRC(96fe463a) SHA1(dcef5eee15a3f6d21e0db1b8ae3fbddc81633fc8) ) - - ROM_REGION( 140704, "screen", 0) - ROM_LOAD( "nummunch.svg", 0, 140704, CRC(050301d7) SHA1(3671d0e1b0cc788d74df0c6adb57a01729f66d7c) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT COMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS - -// Nintendo G&W: Silver/Gold (initial series is uncategorized, "Silver" was made up later) -CONS( 1980, gnw_ball, 0, 0, gnw_ball, gnw_ball, gnw_ball_state, empty_init, "Nintendo", "Game & Watch: Ball", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_flagman, 0, 0, gnw_flagman, gnw_flagman, gnw_flagman_state, empty_init, "Nintendo", "Game & Watch: Flagman", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_vermin, 0, 0, gnw_vermin, gnw_vermin, gnw_vermin_state, empty_init, "Nintendo", "Game & Watch: Vermin", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_fires, 0, 0, gnw_fires, gnw_fires, gnw_fires_state, empty_init, "Nintendo", "Game & Watch: Fire (Silver)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, gnw_judge, 0, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (purple version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gnw_judgeo, gnw_judge, 0, gnw_judge, gnw_judge, gnw_judge_state, empty_init, "Nintendo", "Game & Watch: Judge (green version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, gnw_manholeg, 0, 0, gnw_manholeg, gnw_manholeg, gnw_manholeg_state, empty_init, "Nintendo", "Game & Watch: Manhole (Gold)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_helmet, 0, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-17)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_helmeto, gnw_helmet, 0, gnw_helmet, gnw_helmet, gnw_helmet_state, empty_init, "Nintendo", "Game & Watch: Helmet (version CN-07)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_lion, 0, 0, gnw_lion, gnw_lion, gnw_lion_state, empty_init, "Nintendo", "Game & Watch: Lion", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Wide Screen -CONS( 1981, gnw_pchute, 0, 0, gnw_pchute, gnw_pchute, gnw_pchute_state, empty_init, "Nintendo", "Game & Watch: Parachute", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_octopus, 0, 0, gnw_octopus, gnw_octopus, gnw_octopus_state, empty_init, "Nintendo", "Game & Watch: Octopus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_popeye, 0, 0, gnw_popeye, gnw_popeye, gnw_popeye_state, empty_init, "Nintendo", "Game & Watch: Popeye (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_chef, 0, 0, gnw_chef, gnw_chef, gnw_chef_state, empty_init, "Nintendo", "Game & Watch: Chef", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_mmouse, 0, 0, gnw_mmouse, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_egg, gnw_mmouse, 0, gnw_egg, gnw_mmouse, gnw_mmouse_state, empty_init, "Nintendo", "Game & Watch: Egg", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1981, gnw_fire, 0, 0, gnw_fire, gnw_fire, gnw_fire_state, empty_init, "Nintendo", "Game & Watch: Fire (Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_tbridge, 0, 0, gnw_tbridge, gnw_tbridge, gnw_tbridge_state, empty_init, "Nintendo", "Game & Watch: Turtle Bridge", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_fireatk, 0, 0, gnw_fireatk, gnw_fireatk, gnw_fireatk_state, empty_init, "Nintendo", "Game & Watch: Fire Attack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_stennis, 0, 0, gnw_stennis, gnw_stennis, gnw_stennis_state, empty_init, "Nintendo", "Game & Watch: Snoopy Tennis", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Multi Screen -CONS( 1982, gnw_opanic, 0, 0, gnw_opanic, gnw_opanic, gnw_opanic_state, empty_init, "Nintendo", "Game & Watch: Oil Panic", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_dkong, 0, 0, gnw_dkong, gnw_dkong, gnw_dkong_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_mickdon, 0, 0, gnw_mickdon, gnw_mickdon, gnw_mickdon_state, empty_init, "Nintendo", "Game & Watch: Mickey & Donald", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, gnw_ghouse, 0, 0, gnw_ghouse, gnw_ghouse, gnw_ghouse_state, empty_init, "Nintendo", "Game & Watch: Green House", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_dkong2, 0, 0, gnw_dkong2, gnw_dkong2, gnw_dkong2_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong II", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mario, 0, 0, gnw_mario, gnw_mario, gnw_mario_state, empty_init, "Nintendo", "Game & Watch: Mario Bros.", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_rshower, 0, 0, gnw_rshower, gnw_rshower, gnw_rshower_state, empty_init, "Nintendo", "Game & Watch: Rain Shower", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_lboat, 0, 0, gnw_lboat, gnw_lboat, gnw_lboat_state, empty_init, "Nintendo", "Game & Watch: Life Boat", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_pinball, 0, 0, gnw_pinball, gnw_pinball, gnw_pinball_state, empty_init, "Nintendo", "Game & Watch: Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1985, gnw_bjack, 0, 0, gnw_bjack, gnw_bjack, gnw_bjack_state, empty_init, "Nintendo", "Game & Watch: Black Jack", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_squish, 0, 0, gnw_squish, gnw_squish, gnw_squish_state, empty_init, "Nintendo", "Game & Watch: Squish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1987, gnw_bsweep, 0, 0, gnw_bsweep, gnw_bsweep, gnw_bsweep_state, empty_init, "Nintendo", "Game & Watch: Bomb Sweeper", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_sbuster, 0, 0, gnw_sbuster, gnw_sbuster, gnw_sbuster_state, empty_init, "Nintendo", "Game & Watch: Safe Buster", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_gcliff, 0, 0, gnw_gcliff, gnw_gcliff, gnw_gcliff_state, empty_init, "Nintendo", "Game & Watch: Gold Cliff", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, gnw_zelda, 0, 0, gnw_zelda, gnw_zelda, gnw_zelda_state, empty_init, "Nintendo", "Game & Watch: Zelda", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: New Wide Screen / Crystal Screen -CONS( 1982, gnw_dkjr, 0, 0, gnw_dkjr, gnw_dkjr, gnw_dkjr_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mariocm, 0, 0, gnw_mariocm, gnw_mariocm, gnw_mariocm_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_manhole, 0, 0, gnw_manhole, gnw_manhole, gnw_manhole_state, empty_init, "Nintendo", "Game & Watch: Manhole (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1985, gnw_tfish, 0, 0, gnw_tfish, gnw_tfish, gnw_tfish_state, empty_init, "Nintendo", "Game & Watch: Tropical Fish", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_smb, 0, 0, gnw_smb, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_smbn, gnw_smb, 0, gnw_smbn, gnw_smb, gnw_smb_state, empty_init, "Nintendo", "Game & Watch: Super Mario Bros. (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_climber, 0, 0, gnw_climber, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_climbern, gnw_climber, 0, gnw_climbern, gnw_climber, gnw_climber_state, empty_init, "Nintendo", "Game & Watch: Climber (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1986, gnw_bfight, 0, 0, gnw_bfight, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (Crystal Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, gnw_bfightn, gnw_bfight, 0, gnw_bfightn, gnw_bfight, gnw_bfight_state, empty_init, "Nintendo", "Game & Watch: Balloon Fight (New Wide Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, gnw_mariotj, 0, 0, gnw_mariotj, gnw_mariotj, gnw_mariotj_state, empty_init, "Nintendo", "Game & Watch: Mario The Juggler", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Table Top / Panorama Screen (the first Table Top releases in Japan were called "Color Screen") -CONS( 1983, gnw_mariocmt, 0, 0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // "Another one bites the dust" startup jingle -CONS( 1983, gnw_mariocmta,gnw_mariocmt,0, gnw_mariocmt, gnw_mariocmt, gnw_mariocmt_state, empty_init, "Nintendo", "Game & Watch: Mario's Cement Factory (Table Top, version CM-72A)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // Plays an alternate jingle when starting a game -CONS( 1983, gnw_snoopyp, 0, 0, gnw_snoopyp, gnw_snoopyp, gnw_snoopyp_state, empty_init, "Nintendo", "Game & Watch: Snoopy (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_popeyep, 0, 0, gnw_popeyep, gnw_popeyep, gnw_popeyep_state, empty_init, "Nintendo", "Game & Watch: Popeye (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_dkjrp, 0, 0, gnw_dkjrp, gnw_dkjrp, gnw_dkjrp_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Jr. (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, gnw_mbaway, 0, 0, gnw_mbaway, gnw_mbaway, gnw_mbaway_state, empty_init, "Nintendo", "Game & Watch: Mario's Bombs Away", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_mmousep, 0, 0, gnw_mmousep, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Mickey Mouse (Panorama Screen)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkcirc, gnw_mmousep, 0, gnw_dkcirc, gnw_mmousep, gnw_mmousep_state, empty_init, "Nintendo", "Game & Watch: Donkey Kong Circus", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Super Color -CONS( 1984, gnw_ssparky, 0, 0, gnw_ssparky, gnw_ssparky, gnw_ssparky_state, empty_init, "Nintendo", "Game & Watch: Spitball Sparky", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_cgrab, 0, 0, gnw_cgrab, gnw_cgrab, gnw_cgrab_state, empty_init, "Nintendo", "Game & Watch: Crab Grab", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W: Micro Vs. System (actually, no official Game & Watch logo anywhere) -CONS( 1984, gnw_boxing, 0, 0, gnw_boxing, gnw_boxing, gnw_boxing_state, empty_init, "Nintendo", "Micro Vs. System: Boxing", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkong3, 0, 0, gnw_dkong3, gnw_dkong3, gnw_dkong3_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong 3", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, gnw_dkhockey, 0, 0, gnw_dkhockey, gnw_dkhockey, gnw_dkhockey_state, empty_init, "Nintendo", "Micro Vs. System: Donkey Kong Hockey", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nintendo G&W hardware licensed to other companies (not part of G&W series) -CONS( 1984, bassmate, 0, 0, bassmate, bassmate, bassmate_state, empty_init, "Telko / Nintendo", "Bassmate Computer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Elektronika (mostly G&W clones) -CONS( 1988, taynyoke, gnw_octopus, 0, taynyoke, gnw_octopus, gnw_octopus_state, empty_init, "bootleg (Elektronika)", "Tayny okeana", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, vespovar, gnw_chef, 0, vespovar, gnw_chef, gnw_chef_state, empty_init, "bootleg (Elektronika)", "Vesyolyy povar", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1984, nupogodi, gnw_mmouse, 0, nupogodi, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nu, pogodi!", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1988, ehockey, gnw_mmouse, 0, ehockey, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Hockey (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, rkosmosa, gnw_mmouse, 0, rkosmosa, rkosmosa, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Razvedchiki kosmosa", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, okhota, gnw_mmouse, 0, okhota, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Okhota", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, biathlon, gnw_mmouse, 0, biathlon, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Biathlon", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, vfutbol, gnw_mmouse, 0, vfutbol, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Vesyolye futbolisty", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, krybolov, gnw_mmouse, 0, krybolov, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kot-rybolov (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kvakazad, gnw_mmouse, 0, kvakazad, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kvaka-zadavaka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, nochnyev, gnw_mmouse, 0, nochnyev, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Nochnye vorishki", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, kosmicpt, gnw_mmouse, 0, kosmicpt, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy polyot", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, morataka, gnw_mmouse, 0, morataka, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Morskaja ataka", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, atakaast, gnw_mmouse, 0, atakaast, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Ataka asteroidov", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 19??, ecircus, gnw_mmouse, 0, ecircus, gnw_mmouse, gnw_mmouse_state, empty_init, "bootleg (Elektronika)", "Circus (Elektronika)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kosmicmt, gnw_fire, 0, kosmicmt, gnw_fire, gnw_fire_state, empty_init, "bootleg (Elektronika)", "Kosmicheskiy most", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, auslalom, 0, 0, auslalom, auslalom, auslalom_state, empty_init, "Elektronika", "Autoslalom", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Konami -CONS( 1989, kdribble, 0, 0, kdribble, kdribble, kdribble_state, empty_init, "Konami", "Double Dribble (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, ktopgun, 0, 0, ktopgun, ktopgun, ktopgun_state, empty_init, "Konami", "Top Gun (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kcontra, 0, 0, kcontra, kcontra, kcontra_state, empty_init, "Konami", "Contra (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, ktmnt, 0, 0, ktmnt, ktmnt, ktmnt_state, empty_init, "Konami", "Teenage Mutant Ninja Turtles (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kgradius, 0, 0, kgradius, kgradius, kgradius_state, empty_init, "Konami", "Gradius (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kloneran, 0, 0, kloneran, kloneran, kloneran_state, empty_init, "Konami", "Lone Ranger (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kblades, 0, 0, kblades, kblades, kblades_state, empty_init, "Konami", "Blades of Steel (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, knfl, 0, 0, knfl, knfl, knfl_state, empty_init, "Konami", "NFL Football (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, kbilly, 0, 0, kbilly, kbilly, kbilly_state, empty_init, "Konami", "The Adventures of Bayou Billy (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, kbucky, 0, 0, kbucky, kbucky, kbucky_state, empty_init, "Konami", "Bucky O'Hare (handheld)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, kgarfld, 0, 0, kgarfld, kgarfld, kgarfld_state, empty_init, "Konami", "Garfield (Konami)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Nelsonic Game Watch series -CONS( 1990, nsmb3, 0, 0, nsmb3, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario Bros. 3 (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -CONS( 1991, nsmw, 0, 0, nsmw, gamewatch, gamewatch_state, empty_init, "Nelsonic (licensed from Nintendo)", "Super Mario World (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -CONS( 1993, nstarfox, 0, 0, nstarfox, nstarfox, nstarfox_state, empty_init, "Nelsonic (licensed from Nintendo)", "Star Fox (Nelsonic)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_IMPERFECT_SOUND ) - -// Tiger 7-xxx/78-xxx models -CONS( 1989, tgaunt, 0, 0, tgaunt, tgaunt, tgaunt_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Gauntlet (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, trobhood, tgaunt, 0, trobhood, trobhood, tgaunt_state, empty_init, "Tiger Electronics", "Robin Hood (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tddragon, 0, 0, tddragon, tddragon, tddragon_state, empty_init, "Tiger Electronics (licensed from Technos/Tradewest)", "Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tkarnov, 0, 0, tkarnov, tkarnov, tkarnov_state, empty_init, "Tiger Electronics (licensed from Data East)", "Karnov (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tvindictr, 0, 0, tvindictr, tvindictr, tvindictr_state, empty_init, "Tiger Electronics (licensed from Tengen)", "Vindicators (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tgaiden, 0, 0, tgaiden, tgaiden, tgaiden_state, empty_init, "Tiger Electronics (licensed from Tecmo)", "Ninja Gaiden (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1989, tbatman, 0, 0, tbatman, tbatman, tbatman_state, empty_init, "Tiger Electronics", "Batman (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tsharr2, 0, 0, tsharr2, tsharr2, tsharr2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Space Harrier II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tstrider, 0, 0, tstrider, tstrider, tstrider_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Strider (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tgoldnaxe, 0, 0, tgoldnaxe, tgoldnaxe, tgoldnaxe_state, empty_init, "Tiger Electronics (licensed from Sega)", "Golden Axe (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, trobocop2, 0, 0, trobocop2, trobocop2, trobocop2_state, empty_init, "Tiger Electronics", "Robocop 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, trockteer, trobocop2, 0, trockteer, trockteer, trobocop2_state, empty_init, "Tiger Electronics", "The Rocketeer (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, taltbeast, 0, 0, taltbeast, taltbeast, taltbeast_state, empty_init, "Tiger Electronics (licensed from Sega)", "Altered Beast (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1990, tsf2010, 0, 0, tsf2010, tsf2010, tsf2010_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter 2010 - The Final Fight (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tswampt, 0, 0, tswampt, tswampt, tswampt_state, empty_init, "Tiger Electronics", "Swamp Thing (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tspidman, 0, 0, tspidman, tspidman, tspidman_state, empty_init, "Tiger Electronics", "Spider-Man (Tiger, 1991 version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, txmen, 0, 0, txmen, txmen, txmen_state, empty_init, "Tiger Electronics", "X-Men (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tddragon3, 0, 0, tddragon3, tddragon3, tddragon3_state, empty_init, "Tiger Electronics (licensed from Technos)", "Double Dragon 3 - The Rosetta Stone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tflash, 0, 0, tflash, tflash, tflash_state, empty_init, "Tiger Electronics", "The Flash (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tmchammer, 0, 0, tmchammer, tmchammer, tmchammer_state, empty_init, "Tiger Electronics", "MC Hammer: U Can't Touch This (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, tbtoads, 0, 0, tbtoads, tbtoads, tbtoads_state, empty_init, "Tiger Electronics (licensed from Rare/Tradewest)", "Battletoads (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1991, thook, 0, 0, thook, thook, thook_state, empty_init, "Tiger Electronics", "Hook (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, tbttf, 0, 0, tbttf, tbttf, tbttf_state, empty_init, "Tiger Electronics", "Back to the Future (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, taddams, 0, 0, taddams, taddams, taddams_state, empty_init, "Tiger Electronics", "The Addams Family (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, thalone, 0, 0, thalone, thalone, thalone_state, empty_init, "Tiger Electronics", "Home Alone (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, txmenpx, 0, 0, txmenpx, txmenpx, txmenpx_state, empty_init, "Tiger Electronics", "X-Men - Project X (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, thalone2, 0, 0, thalone2, thalone2, thalone2_state, empty_init, "Tiger Electronics", "Home Alone 2 - Lost in New York (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, tsonic, 0, 0, tsonic, tsonic, tsonic_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, trobocop3, 0, 0, trobocop3, trobocop3, trobocop3_state, empty_init, "Tiger Electronics", "Robocop 3 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tdummies, 0, 0, tdummies, tdummies, tdummies_state, empty_init, "Tiger Electronics", "The Incredible Crash Dummies (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsfight2, 0, 0, tsfight2, tsfight2, tsfight2_state, empty_init, "Tiger Electronics (licensed from Capcom)", "Street Fighter II (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1992, twworld, 0, 0, twworld, twworld, twworld_state, empty_init, "Tiger Electronics", "Wayne's World (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tjpark, 0, 0, tjpark, tjpark, tjpark_state, empty_init, "Tiger Electronics", "Jurassic Park (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsonic2, 0, 0, tsonic2, tsonic2, tsonic2_state, empty_init, "Tiger Electronics (licensed from Sega)", "Sonic The Hedgehog 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tsddragon, 0, 0, tsddragon, tsddragon, tsddragon_state, empty_init, "Tiger Electronics (licensed from Technos)", "Super Double Dragon (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tdennis, 0, 0, tdennis, tdennis, tdennis_state, empty_init, "Tiger Electronics", "Dennis the Menace (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tnmarebc, 0, 0, tnmarebc, tnmarebc, tnmarebc_state, empty_init, "Tiger Electronics", "Nightmare Before Christmas (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: title has no "The" -CONS( 1993, ttransf2, 0, 0, ttransf2, ttransf2, ttransf2_state, empty_init, "Tiger Electronics", "Transformers - Generation 2 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, topaliens, 0, 0, topaliens, topaliens, topaliens_state, empty_init, "Tiger Electronics", "Operation: Aliens (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1993, tmkombat, 0, 0, tmkombat, tmkombat, tmkombat_state, empty_init, "Tiger Electronics (licensed from Midway)", "Mortal Kombat (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, tshadow, 0, 0, tshadow, tshadow, tshadow_state, empty_init, "Tiger Electronics", "The Shadow (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1994, tskelwarr, 0, 0, tskelwarr, tskelwarr, tskelwarr_state, empty_init, "Tiger Electronics", "Skeleton Warriors - The Dark Crusade (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tbatfor, 0, 0, tbatfor, tbatfor, tbatfor_state, empty_init, "Tiger Electronics", "Batman Forever - Double Dose of Doom (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tjdredd, 0, 0, tjdredd, tjdredd, tjdredd_state, empty_init, "Tiger Electronics", "Judge Dredd (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tapollo13, 0, 0, tapollo13, tapollo13, tapollo13_state, empty_init, "Tiger Electronics", "Apollo 13 (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1995, tgoldeye, 0, 0, tgoldeye, tgoldeye, tgoldeye_state, empty_init, "Tiger Electronics", "007: GoldenEye (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tkazaam, 0, 0, tkazaam, tkazaam, tkazaam_state, empty_init, "Tiger Electronics", "Kazaam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tsjam, 0, 0, tsjam, tsjam, tsjam_state, empty_init, "Tiger Electronics", "Space Jam (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state, empty_init, "Tiger Electronics", "Independence Day (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Tiger 72-xxx models -CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (Tiger)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// Tronica Game Clock series -CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1983, trthuball, trsrescue, 0, trthuball, trsrescue, trsrescue_state, empty_init, "Tronica", "Thunder Ball (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trspacmis, 0, 0, trspacmis, trspacmis, trspacmis_state, empty_init, "Tronica", "Space Mission (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, trspider, trspacmis, 0, trspider, trspacmis, trspacmis_state, empty_init, "Tronica", "Spider (Tronica)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -// misc -CONS( 1989, nummunch, 0, 0, nummunch, nummunch, nummunch_state, empty_init, "VTech", "Electronic Number Muncher", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/hh_sm510.h b/src/mame/misc_handheld/hh_sm510.h deleted file mode 100644 index ad9041ae226..00000000000 --- a/src/mame/misc_handheld/hh_sm510.h +++ /dev/null @@ -1,116 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/* - - Sharp SM5xx family handhelds. - -*/ - -#ifndef MAME_INCLUDES_HH_SM510_H -#define MAME_INCLUDES_HH_SM510_H - -#pragma once - -#include "cpu/sm510/sm510.h" -#include "cpu/sm510/sm511.h" -#include "cpu/sm510/sm530.h" -#include "cpu/sm510/sm5a.h" -#include "sound/spkrdev.h" - - -#define PORT_CHANGED_CB(x) \ - PORT_CHANGED_MEMBER(DEVICE_SELF, hh_sm510_state, x, 0) - - -class hh_sm510_state : public driver_device -{ -public: - hh_sm510_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0), - m_io_ba(*this, "BA"), - m_io_b(*this, "B"), - m_out_x(*this, "%u.%u.%u", 0U, 0U, 0U) - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed); - virtual DECLARE_INPUT_CHANGED_MEMBER(acl_button); - -protected: - // devices - required_device m_maincpu; - optional_device m_speaker; - optional_ioport_array<8+1> m_inputs; // max 8 - optional_ioport m_io_ba, m_io_b; - output_finder<16, 16, 4> m_out_x; - - // misc common - u16 m_inp_mux = 0; // multiplexed inputs mask - int m_inp_lines = 0; // number of input mux columns - int m_inp_fixed = -1; // input column fixed to GND/Vdd (-1 means none) - u8 m_speaker_data = 0; // speaker output data(if more than 1 bit) - u8 m_s = 0; // MCU S output pins - u8 m_r = 0; // MCU R output pins - - void inp_fixed_last() { m_inp_fixed = -2; } // last input line to GND - u8 read_inputs(int columns, int fixed = -1); - - virtual void update_k_line(); - virtual void sm510_lcd_segment_w(offs_t offset, u16 data); - virtual void sm500_lcd_segment_w(offs_t offset, u16 data); - virtual u8 input_r(); - virtual void input_w(u8 data); - virtual void piezo_r1_w(u8 data); - virtual void piezo_r2_w(u8 data); - virtual void piezo_input_w(u8 data); - virtual void piezo2bit_r1_w(u8 data); - virtual void piezo2bit_input_w(u8 data); - - // display common - int m_decay_pivot = 8; // lcd segment off-to-on delay in 1kHz ticks (affects input lag) - int m_decay_len = 17; // lcd segment on-to-off delay in 1kHz ticks (lcd persistence) - u8 m_display_x_len = 0; // lcd number of groups - u8 m_display_y_len = 0; // lcd number of segments - u8 m_display_z_len = 0; // lcd number of commons - u32 m_display_state[0x20] = { }; // lcd segment data (max. 5-bit offset) - u8 m_display_decay[0x20][0x20] = { }; // (internal use) - - void set_display_size(u8 x, u8 y, u8 z); - TIMER_CALLBACK_MEMBER(display_decay_tick); - emu_timer *m_display_decay_timer = nullptr; - - virtual void machine_start() override; - virtual void machine_reset() override; - - // machine configs - void mcfg_cpu_common(machine_config &config); - void mcfg_cpu_sm5a(machine_config &config); - void mcfg_cpu_kb1013vk12(machine_config &config); - void mcfg_cpu_sm510(machine_config &config); - void mcfg_cpu_sm511(machine_config &config); - void mcfg_cpu_sm512(machine_config &config); - void mcfg_cpu_sm530(machine_config &config); - void mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag = "screen"); - void mcfg_sound_r1(machine_config &config); - - void sm5a_common(machine_config &config, u16 width, u16 height); - void kb1013vk12_common(machine_config &config, u16 width, u16 height); - void sm510_common(machine_config &config, u16 width, u16 height); - void sm511_common(machine_config &config, u16 width, u16 height); - //void sm512_common(machine_config &config, u16 width, u16 height); - void sm530_common(machine_config &config, u16 width, u16 height); - - void sm510_dualh(machine_config &config, u16 leftwidth, u16 leftheight, u16 rightwidth, u16 rightheight); - void dualv_common(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm510_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm511_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm512_dualv(machine_config &config, u16 topwidth, u16 topheight, u16 botwidth, u16 botheight); - void sm510_tiger(machine_config &config, u16 width, u16 height); - void sm511_tiger1bit(machine_config &config, u16 width, u16 height); - void sm511_tiger2bit(machine_config &config, u16 width, u16 height); -}; - - -#endif // MAME_INCLUDES_HH_SM510_H diff --git a/src/mame/misc_handheld/hh_tms1k.cpp b/src/mame/misc_handheld/hh_tms1k.cpp deleted file mode 100644 index 4ad3d0b2c72..00000000000 --- a/src/mame/misc_handheld/hh_tms1k.cpp +++ /dev/null @@ -1,14465 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle, Kevin Horton -/*************************************************************************** - -This driver is a collection of simple dedicated handheld and tabletop -toys based around the TMS1000 MCU series. Anything more complex or clearly -part of a series is (or will be) in its own driver, see: -- eva: Chrysler EVA-11 (and EVA-24) -- microvsn: Milton Bradley Microvision -- sag: Entex Select-A-Game Machine - -(contd.) hh_tms1k child drivers: -- tispellb: TI Spelling B series gen. 1 -- tispeak: TI Speak & Spell series gen. 1 - -About the approximated MCU frequency everywhere: The RC osc. is not that -stable on most of these handhelds. When comparing multiple video recordings -of the same game, it shows(and sounds) that the frequency range can differ -up to 50kHz. This is probably exaggerated due to components getting worn out -after many decades. TMS1000 RC curve is documented in the data manual, but -not for newer ones (rev. E or TMS1400 MCUs). TMS0970/0980 osc. is on-die. - -ROM source notes when dumped from another publisher, but confident it's the same: -- arrball: Tandy Zingo -- bcheetah: Fundimensions Incredible Brain Buggy -- cmsport: Conic Basketball -- cnbaskb: Cardinal Electronic Basketball -- cnfball: Elecsonic Football -- copycat: Sears Follow Me -- ditto: Tandy Electronic Pocket Repeat -- fxmcr165: Tandy Science Fair Microcomputer Trainer -- ginv1000: Tandy Cosmic 1000 Fire Away -- gjackpot: Entex Electronic Jackpot: Gin Rummy & Black Jack -- gpoker: Entex Electronic Poker -- matchnum: LJN Electronic Concentration -- palmf31: Toshiba BC-8018B -- ti1250: Texas Instruments TI-1200 -- ti25503: Texas Instruments TI-1265 -- ti5100: loose 1979 TMS1073NL chip - -TODO: -- Verify output PLA and microinstructions PLA for MCUs that have been dumped - electronically (mpla is usually the default, opla is often custom). -- unknown MCU clocks for some, especially if no YouTube videos are found -- Fake-press ON button when emulation starts for machines that have it on the - button matrix (doesn't look like any relies on it though). -- t7in1ss: in 2-player mode, game select and skill select can be configured after - selecting a game? Possibly BTANB, players are expected to quickly press the - "First Up" button after the alarm sound. -- bship discrete sound, netlist is documented -- finish bshipb SN76477 sound -- redo internal artwork for the baseball games (embedded SVG for diamond shapes) -- improve elecbowl driver -- tithermos temperature sensor comparator (right now just the digital clock works) -- is alphie(patent) the same as the final version? -- is starwbcp the same as MP3438? (starwbc is MP3438A) - -============================================================================ - -Let's use this driver for a list of known devices and their serials, -excluding most of TI's own products(they normally didn't use "MP" codes). -For TI's calculators, a comprehensive list of MCU serials is available -on Joerg Woerner's datamath.org: http://www.datamath.org/IC_List.htm - - serial device etc. --------------------------------------------------------------------- - @CP0904A TMS0970 1977, Milton Bradley Comp IV - @MP0905B TMS0970 1977, Parker Brothers Codename Sector - *MP0057 TMS1000 1978, APH Student Speech+ (same ROM contents as TSI Speech+?) - @MP0154 TMS1000 1979, Fonas 2 Player Baseball - @MP0158 TMS1000 1979, Entex Soccer (6003) - @MP0163 TMS1000 1979, A-One LSI Match Number/LJN Electronic Concentration - @MP0166 TMS1000 1980, A-One Arrange Ball/LJN Computer Impulse/Tandy Zingo (model 60-2123) - @MP0168 TMS1000 1979, Conic Multisport/Tandy Sports Arena (model 60-2158) - @MP0170 TMS1000 1979, Conic Football - *MP0220 TMS1000 1980, Tomy Teacher - @MP0230 TMS1000 1980, Entex Blast It (6015) - @MP0271 TMS1000 1982, Radio Shack Monkey See - @MP0907 TMS1000 1979, Conic Basketball (101-006) - @MP0908 TMS1000 1979, Conic Electronic I.Q. - *MP0910 TMS1000 1979, Conic Basketball (101-003) - @MP0914 TMS1000 1979, Entex Baseball 1 - @MP0915 TMS1000 1979, Bandai System Control Car: Cheetah/The Incredible Brain Buggy - @MP0919 TMS1000 1979, Tiger Copy Cat (model 7-520) - @MP0920 TMS1000 1979, Entex Space Battle (6004) - @MP0923 TMS1000 1979, Entex Baseball 2 (6002) - *MP1022 TMS1100 1979, Texas Instruments unknown thermostat - @MP1030 TMS1100 1980, APF Mathemagician - *MP1072 TMS1100 198?, unknown device, Germany (have decap) - @MP1133 TMS1470 1979, Kosmos Astro - @MP1180 TMS1100 1980, Tomy Power House Pinball - @MP1181 TMS1100 1979, Conic Football 2 - @MP1183 TMS1100 1980, E.R.S. Superbowl XV Football/Tandy Championship Football (model 60-2151) - @MP1185 TMS1100 1979, Fonas 3 in 1: Football, Basketball, Soccer - @MP1193 TMS1100 1980, Tandy Championship Football (model 60-2150) - @MP1204 TMS1100 1980, Entex Baseball 3 (6007) - *MP1209 TMS1100 1980, U.S. Games Space Cruiser/Strategy Football - @MP1211 TMS1100 1980, Entex Space Invader (6012) - @MP1215 TMS1100 1980, Tiger Playmaker - @MP1218 TMS1100 1980, Entex Basketball 2 (6010) - @MP1219 TMS1100 1980, U.S. Games Super Sports-4 - @MP1221 TMS1100 1980, Entex Raise The Devil (6011) - @MP1228 TMS1100 1980, Entex Musical Marvin (6014) - @MP1231 TMS1100 1984, Tandy 3 in 1 Sports Arena (model 60-2178) - @MP1296 TMS1100 1982, Entex Black Knight Pinball (6081) - @MP1311 TMS1100 1981, Bandai TC7: Air Traffic Control - @MP1312 TMS1100 1983, Gakken FX-Micom R-165/Radio Shack Science Fair Microcomputer Trainer - *MP1359 TMS1100? 1985, Capsela CRC2000 - @MP1525 TMS1170 1980, Coleco Head to Head: Electronic Baseball - @MP1604 TMS1370 1982, Gakken Invader 2000/Tandy Cosmic Fire Away 3000 - @MP1801 TMS1700 1981, Tiger Ditto/Tandy Pocket Repeat (model 60-2152) - @MP2105 TMS1370 1979, Gakken/Entex Poker (6005) - @MP2110 TMS1370 1980, Gakken Invader/Tandy Fire Away - @MP2139 TMS1370 1981, Gakken Galaxy Invader 1000/Tandy Cosmic 1000 Fire Away - @MP2726 TMS1040 1979, Tomy Break Up - *MP2788 TMS1070? 1980, Bandai Flight Time (? note: VFD-capable) - @MP3005 TMS1730 1989, Tiger Copy Cat (model 7-522) - @MP3200 TMS1000 1978, Parker Brothers Electronic Master Mind - @MP3201 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750A) - *MP3206 TMS1000 1979, Concept 2000 Mr. Mus-I-Cal - @MP3208 TMS1000 1977, Milton Bradley Electronic Battleship (1977, model 4750B) - @MP3226 TMS1000 1978, Milton Bradley Simon (Rev A) - *MP3232 TMS1000 1979, Fonas 2 Player Baseball (no "MP" on chip label) - @MP3260 TMS1000 1979, Electroplay Quickfire - @MP3300 TMS1000 1979, Milton Bradley Simon (Rev F) - @MP3301A TMS1000 1979, Milton Bradley Big Trak - *MP3312 TMS1000 1980, Nathan Mega 10000 - @MP3320A TMS1000 1979, Coleco Head to Head: Electronic Basketball - @MP3321A TMS1000 1979, Coleco Head to Head: Electronic Hockey - @MP3352 TMS1200 1979, Tiger Sub Wars (model 7-490) - @M32001 TMS1000 1981, Coleco Quiz Wiz Challenger (note: MP3398, MP3399, M3200x?) - *M32018 TMS1000 1990, unknown device (have decap/dump) - M32045B TMS1000 1983, Chrysler Electronic Voice Alert (11-function) -> eva.cpp - @MP3403 TMS1100 1978, Marx Electronic Bowling - @MP3404 TMS1100 1978, Parker Brothers Merlin - @MP3405 TMS1100 1979, Coleco Amaze-A-Tron - *MP3407 TMS1100 1979, General Electric The Great Awakening (model 7-4880) - @MP3415 TMS1100 1978, Coleco Electronic Quarterback - @MP3435 TMS1100 1979, Coleco Zodiac - @MP3438A TMS1100 1979, Kenner Star Wars Electronic Battle Command - MP3450A TMS1100 1979, Microvision cartridge: Block Buster - MP3454 TMS1100 1979, Microvision cartridge: Star Trek Phaser Strike - MP3455 TMS1100 1980, Microvision cartridge: Pinball - MP3457 TMS1100 1979, Microvision cartridge: Mindbuster - @MP3460 TMS1100 1979, Coleco Head to Head: Electronic Football - MP3474 TMS1100 1979, Microvision cartridge: Vegas Slots - MP3475 TMS1100 1979, Microvision cartridge: Bowling - @MP3476 TMS1100 1979, Milton Bradley Super Simon - MP3479 TMS1100 1980, Microvision cartridge: Baseball - MP3481 TMS1100 1979, Microvision cartridge: Connect Four - @MP3489 TMS1100 1980, Kenner Live Action Football - @MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer - *MP3493 TMS1100 1980, Milton Bradley OMNI Entertainment System (1/2) - *MP3494 TMS1100 1980, Milton Bradley OMNI Entertainment System (2/2) - MP3496 TMS1100 1980, Microvision cartridge: Sea Duel - M34009 TMS1100 1981, Microvision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..) - @M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game - *M34014 TMS1100 1981, Coleco Bowlatronic - M34017 TMS1100 1981, Microvision cartridge: Cosmic Hunter - @M34018 TMS1100 1981, Coleco Head to Head: Electronic Boxing - @M34038 TMS1100 1982, Parker Brothers Lost Treasure - M34047 TMS1100 1982, Microvision cartridge: Super Blockbuster - @M34078A TMS1100 1983, Milton Bradley Electronic Arcade Mania - *M34137 TMS1100? 1985, Technasonic Weight Talker - @MP4486A TMS1000C 1983, Vulcan XL 25 - *MP6061 TMS0970 1979, Texas Instruments Electronic Digital Thermostat (from patent, the one in MAME didn't have a label) - @MP6100A TMS0980 1979, Ideal Electronic Detective - @MP6101B TMS0980 1979, Parker Brothers Stop Thief - *MP6354 ? 1982, Tsukuda The Dracula (? note: 40-pin, VFD-capable) - *MP6361 ? 1983, Defender Strikes (? note: VFD-capable) - @MP7302 TMS1400 1980, Tiger Deluxe Football with Instant Replay - @MP7304 TMS1400 1982, Tiger 7 in 1 Sports Stadium (model 7-555) - @MP7313 TMS1400 1980, Parker Brothers Bank Shot - @MP7314 TMS1400 1980, Parker Brothers Split Second - MP7324 TMS1400 1985, Tiger K28/Coleco Talking Teacher -> tispeak.cpp - @MP7332 TMS1400 1981, Milton Bradley Dark Tower - @MP7334 TMS1400 1981, Coleco Total Control 4 - @MP7351 TMS1400 1982, Parker Brothers Master Merlin - @MP7551 TMS1670 1980, Entex Color Football 4 (6009) - @MPF553 TMS1670 1980, Gakken/Entex Jackpot: Gin Rummy & Black Jack (6008) (note: assume F to be a misprint) - MP7573 TMS1670 1981, Entex Select-A-Game cartridge: Football 4 -> sag.cpp - *M30026 TMS2370 1983, Yaesu FT-757 Display Unit part - *M95041 TMS2670 1983, Tsukuda Game Pachinko (have decap, missing MCU emulation) - - inconsistent: - - @TMS1007 TMS1000 1976, TSI Speech+ (S14002-A) - @CD7282SL TMS1100 1981, Tandy-12 (serial is similar to TI Speak & Spell series?) - - (* means undumped unless noted, @ denotes it's in this driver) - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "machine/clock.h" -#include "machine/ds8874.h" -#include "machine/timer.h" -#include "machine/tmc0999.h" -#include "machine/tms1024.h" -#include "sound/beep.h" -#include "sound/flt_vol.h" -#include "sound/s14001a.h" -#include "sound/sn76477.h" -#include "video/hlcd0515.h" -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" - -#include "softlist_dev.h" -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "t7in1ss.lh" -#include "alphie.lh" -#include "amaztron.lh" // clickable -#include "arcmania.lh" // clickable -#include "arrball.lh" -#include "astro.lh" -#include "bankshot.lh" -#include "bcheetah.lh" -#include "bigtrak.lh" -#include "blastit.lh" -#include "bship.lh" // clickable -#include "cmsport.lh" -#include "cnbaskb.lh" -#include "cnfball.lh" -#include "cnfball2.lh" -#include "cnsector.lh" // clickable -#include "comp4.lh" // clickable -#include "copycat.lh" // clickable -#include "copycatm2.lh" // clickable -#include "dataman.lh" -#include "ditto.lh" // clickable -#include "dxfootb.lh" -#include "cqback.lh" -#include "ebball.lh" -#include "ebball2.lh" -#include "ebball3.lh" -#include "ebaskb2.lh" -#include "ebknight.lh" -#include "efootb4.lh" -#include "einvader.lh" -#include "elecbowl.lh" -#include "elecdet.lh" -#include "eleciq.lh" // clickable -#include "esbattle.lh" -#include "esoccer.lh" -#include "f2pbball.lh" -#include "f3in1.lh" -#include "fxmcr165.lh" // clickable -#include "gjackpot.lh" -#include "gpoker.lh" -#include "h2hbaseb.lh" -#include "h2hbaskb.lh" -#include "h2hboxing.lh" -#include "h2hfootb.lh" -#include "h2hhockey.lh" -#include "horseran.lh" -#include "liveafb.lh" -#include "lostreas.lh" // clickable -#include "matchnum.lh" // clickable -#include "mathmagi.lh" -#include "mathmarv.lh" -#include "mbdtower.lh" // clickable -#include "mdndclab.lh" // clickable -#include "merlin.lh" // clickable -#include "mmarvin.lh" // clickable -#include "mmerlin.lh" // clickable -#include "monkeysee.lh" -#include "palmf31.lh" -#include "palmmd8.lh" -#include "pbmastm.lh" -#include "phpball.lh" -#include "playmaker.lh" -#include "qfire.lh" // clickable -#include "quizwizc.lh" -#include "raisedvl.lh" -#include "simon.lh" // clickable -#include "speechp.lh" -#include "splitsec.lh" -#include "ssimon.lh" // clickable -#include "ssports4.lh" -#include "starwbc.lh" // clickable -#include "stopthief.lh" // clickable -#include "subwars.lh" -#include "t3in1sa.lh" -#include "tandy12.lh" // clickable -#include "tbreakup.lh" -#include "tc4.lh" -#include "tc7atc.lh" -#include "tcfball.lh" -#include "tcfballa.lh" -#include "ti1250.lh" -#include "ti1270.lh" -#include "ti1680.lh" -#include "ti25503.lh" -#include "ti30.lh" -#include "ti5100.lh" -#include "timaze.lh" -#include "tisr16.lh" -#include "tithermos.lh" -#include "wizatron.lh" -#include "xl25.lh" // clickable -#include "zodiac.lh" // clickable - -//#include "hh_tms1k_test.lh" // common test-layout - use external artwork - - -// machine_start/reset - -void hh_tms1k_state::machine_start() -{ - // resolve handlers - m_out_power.resolve(); - - // register for savestates - save_item(NAME(m_o)); - save_item(NAME(m_r)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_power_on)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_tms1k_state::machine_reset() -{ - set_power(true); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_tms1k_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - -u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask) -{ - u8 ret = 0; - u16 colmask = (1 << columns) - 1; - - // read selected input columns - for (int i = 0; i < 8; i++) - if (1 << i & rowmask && m_inputs[i]->read() & m_inp_mux & colmask) - ret |= 1 << i; - - return ret; -} - -void hh_tms1k_state::switch_change(int sel, u32 mask, bool next) -{ - // config switches (for direct control) - ioport_field *inp = m_inputs[sel]->field(mask); - - if (next && inp->has_next_setting()) - inp->select_next_setting(); - else if (!next && inp->has_previous_setting()) - inp->select_previous_setting(); -} - -INPUT_CHANGED_MEMBER(hh_tms1k_state::reset_button) -{ - // when an input is directly wired to MCU INIT pin - m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); -} - -INPUT_CHANGED_MEMBER(hh_tms1k_state::power_button) -{ - set_power((bool)param); - m_maincpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); -} - -WRITE_LINE_MEMBER(hh_tms1k_state::auto_power_off) -{ - // devices with a TMS0980 can auto power-off - if (state) - power_off(); -} - -void hh_tms1k_state::power_off() -{ - set_power(false); - m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); -} - -void hh_tms1k_state::set_power(bool state) -{ - m_power_on = state; - m_out_power = state ? 1 : 0; -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - A-One LSI Match Number - * PCB label PT-204 "Pair Card" - * TMS1000NLL MP0163 (die label 1000B, MP0163) - * 2x2-digit 7seg LED displays + 3 LEDs, 1-bit sound - - A-One was a subsidiary of Bandai? The PCB serial PT-xxx is same, and the font - used on the boxes for "A-One LSI" is same as "Bandai Electronics" from early-80s. - - known releases: - - Japan: Match Number, published by A-One (white case, Queen playing card bezel) - - USA: Electronic Concentration, published by LJN (black case, rainbow pattern bezel) - - UK: Electronic Concentration, published by Peter Pan Playthings (same as USA version) - -***************************************************************************/ - -class matchnum_state : public hh_tms1k_state -{ -public: - matchnum_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void matchnum(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void matchnum_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void matchnum_state::write_r(u16 data) -{ - // R3-R5,R8-R10: input mux - m_inp_mux = (data >> 3 & 7) | (data >> 5 & 0x38); - - // R6,R7: speaker out - m_speaker->level_w(data >> 6 & 3); - - // R0-R3: digit/led select - m_r = data; - update_display(); -} - -void matchnum_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: led data - m_o = data; - update_display(); -} - -u8 matchnum_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( matchnum ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Change") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") - - PORT_START("IN.5") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") -INPUT_PORTS_END - -void matchnum_state::matchnum(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(matchnum_state::read_k)); - m_maincpu->r().set(FUNC(matchnum_state::write_r)); - m_maincpu->o().set(FUNC(matchnum_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 8); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_matchnum); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( matchnum ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0163", 0x0000, 0x0400, CRC(37507600) SHA1(b1d4d8ea563e97ef378b42c44cb3ea4eb6abe0d2) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_matchnum_output.pla", 0, 365, CRC(da29670c) SHA1(bcec28bf25dc8c81d08851ad8a3f4e89f413017a) ) -ROM_END - - - - - -/*************************************************************************** - - A-One LSI Arrange Ball - * PCB label Kaken, PT-249 - * TMS1000NLL MP0166 (die label 1000B, MP0166) - * 2-digit 7seg LED display + 22 LEDs, 1-bit sound - - known releases: - - Japan/World: Arrange Ball, published by A-One (black case) - - USA(1): Zingo (model 60-2123), published by Tandy (red case) - - USA(2): Computer Impulse, published by LJN (white case) - - Germany: Fixball, unknown publisher, same as LJN version - -***************************************************************************/ - -class arrball_state : public hh_tms1k_state -{ -public: - arrball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void arrball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void arrball_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void arrball_state::write_r(u16 data) -{ - // R8: input mux (always set) - m_inp_mux = data >> 8 & 1; - - // R9,R10: speaker out - m_speaker->level_w(data >> 9 & 3); - - // R0-R6: digit/led select - m_r = data; - update_display(); -} - -void arrball_state::write_o(u16 data) -{ - // O0-O6: digit segments/led data - m_o = data; - update_display(); -} - -u8 arrball_state::read_k() -{ - // K: multiplexed inputs (actually just 1) - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( arrball ) - PORT_START("IN.0") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shot") // pressed when START lights up - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stop") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Speed" ) - PORT_CONFSETTING( 0x00, "Slow" ) - PORT_CONFSETTING( 0x08, "Fast" ) -INPUT_PORTS_END - -void arrball_state::arrball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(arrball_state::read_k)); - m_maincpu->r().set(FUNC(arrball_state::write_r)); - m_maincpu->o().set(FUNC(arrball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x10, 0x7f); - m_display->set_segmask(0x20, 0x06); // left digit only segments B and C - config.set_default_layout(layout_arrball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( arrball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0166", 0x0000, 0x0400, CRC(a78694db) SHA1(362aa6e356288e8df7da610246bd01fe72985d57) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_arrball_output.pla", 0, 365, CRC(ffc206fb) SHA1(339be3f066fb2f075211c554e81260b49cd83d15) ) -ROM_END - - - - - -/*************************************************************************** - - APF Mathemagician - * TMS1100 MCU, label MP1030 (no decap) - * 2 x DS8870N - Hex LED Digit Driver - * 2 x DS8861N - MOS-to-LED 5-Segment Driver - * 10-digit 7seg LED display(2 custom ones) + 4 LEDs, no sound - - This is a tabletop educational calculator. It came with plastic overlays - for playing different kind of games. Refer to the manual on how to use it. - In short, to start from scratch, press [SEL]. By default the device is in - calculator teaching mode. If [SEL] is followed with 1-6 and then [NXT], - one of the games is started. - - 1) Number Machine - 2) Countin' On - 3) Walk The Plank - 4) Gooey Gumdrop - 5) Football - 6) Lunar Lander - -***************************************************************************/ - -class mathmagi_state : public hh_tms1k_state -{ -public: - mathmagi_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void mathmagi(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void mathmagi_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void mathmagi_state::write_r(u16 data) -{ - // R3,R5-R7,R9,R10: input mux - m_inp_mux = (data >> 3 & 1) | (data >> 4 & 0xe) | (data >> 5 & 0x30); - - // R0-R7: 7seg leds - // R8: custom math symbols digit - // R9: custom equals digit - // R10: misc lamps - m_r = data; - update_display(); -} - -void mathmagi_state::write_o(u16 data) -{ - // O1-O7: led/digit segment data - // O0: N/C - m_o = data; - update_display(); -} - -u8 mathmagi_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* physical button layout and labels are like this: - - ON ONE [SEL] [NXT] [?] [/] - | | [7] [8] [9] [x] - OFF TWO [4] [5] [6] [-] - PLAYERS [1] [2] [3] [+] - [0] [_] [r] [=] -*/ - -static INPUT_PORTS_START( mathmagi ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.1") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("_") // blank - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("r") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("NXT") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("?") // check - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // R10 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 mathmagi_output_pla[0x20] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 - 0x7f, 0x6f, 0x53, 0x50, 0x08, 0x79, 0x40, 0x00, // 8, 9, questionmark, r, underscore?, E, -(negative), empty - 0x00, 0x40, 0x08, 0x7c, 0x02, 0x42, 0x06, 0x6e, // empty, led4/-, led3, b, led2, +, ×, y - 0x01, 0x41, 0x09, 0, 0, 0x5c, 0, 0x3d // led1, ÷, =, ?, ?, o, ?, G -}; - -void mathmagi_state::mathmagi(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 175000); // approximation - RC osc. R=68K, C=82pF - m_maincpu->set_output_pla(mathmagi_output_pla); - m_maincpu->k().set(FUNC(mathmagi_state::read_k)); - m_maincpu->r().set(FUNC(mathmagi_state::write_r)); - m_maincpu->o().set(FUNC(mathmagi_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 7); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_mathmagi); - - // no sound! -} - -// roms - -ROM_START( mathmagi ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1030", 0x0000, 0x0800, CRC(a81d7ccb) SHA1(4756ce42f1ea28ce5fe6498312f8306f10370969) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_mathmagi_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Bandai System Control Car: Cheetah 「システムコントロールカー チーター」 - * TMS1000NLL MP0915 (die label 1000B, MP0915) - * 2 motors (one for back axis, one for steering), no sound - - It's a programmable buggy, like Big Track but much simpler. To add a command - step in program-mode, press a direction key and one of the time delay number - keys at the same time. To run the program(max 24 steps), switch to run-mode - and press the go-key. - - known releases: - - Japan: System Control Car: Cheetah, published by Bandai - - USA: The Incredible Brain Buggy, published by Fundimensions - - UK: The Incredible Brain Buggy, published by Palitoy (same as USA version) - -***************************************************************************/ - -class bcheetah_state : public hh_tms1k_state -{ -public: - bcheetah_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_motor1(*this, "motor1"), - m_motor2_left(*this, "motor2_left"), - m_motor2_right(*this, "motor2_right") - { } - - void bcheetah(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - output_finder<> m_motor1; - output_finder<> m_motor2_left; - output_finder<> m_motor2_right; -}; - -void bcheetah_state::machine_start() -{ - hh_tms1k_state::machine_start(); - m_motor1.resolve(); - m_motor2_left.resolve(); - m_motor2_right.resolve(); -} - -// handlers - -void bcheetah_state::write_r(u16 data) -{ - // R0-R4: input mux - // R5,R6: tied to K4?? - m_inp_mux = data & 0x1f; -} - -void bcheetah_state::write_o(u16 data) -{ - // O1: back motor (drive) - // O0: front motor steer left - // O2: front motor steer right - // O3: GND, other: N/C - m_motor1 = data >> 1 & 1; - m_motor2_left = data & 1; - m_motor2_right = data >> 2 & 1; -} - -u8 bcheetah_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( bcheetah ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, "Mode") - PORT_CONFSETTING( 0x02, "Program" ) - PORT_CONFSETTING( 0x00, "Run" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Stop") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x05, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") -INPUT_PORTS_END - -void bcheetah_state::bcheetah(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 100000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(bcheetah_state::read_k)); - m_maincpu->r().set(FUNC(bcheetah_state::write_r)); - m_maincpu->o().set(FUNC(bcheetah_state::write_o)); - - config.set_default_layout(layout_bcheetah); - - // no sound! -} - -// roms - -ROM_START( bcheetah ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0915", 0x0000, 0x0400, CRC(2968c81e) SHA1(d1e6691952600e88ccf626cb3d683419a1e8468c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bcheetah_output.pla", 0, 365, CRC(cc6d1ecd) SHA1(b0635a841d8850c36c1f414abe0571b81884b972) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai TC7: Air Traffic Control - * TMS1100 MCU, label MP1311 (die label 1100E, MP1311) - * 4-digit 7seg LED display, 40 other LEDs, 1-bit sound - - It is a very complicated game, refer to the manual on how to play. - -***************************************************************************/ - -class tc7atc_state : public hh_tms1k_state -{ -public: - tc7atc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tc7atc(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tc7atc_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void tc7atc_state::write_r(u16 data) -{ - // R5: speaker out - m_speaker->level_w(BIT(data, 5)); - - // R0-R4: input mux, led select - // R6-R9: digit select - m_inp_mux = m_r = data; - update_display(); -} - -void tc7atc_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 tc7atc_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( tc7atc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("High Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hazard") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("West") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("East") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Arrive") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Depart") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Flight Path A / Level 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Flight Path B / Level 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Flight Path C / Level 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Flight Path D / Level 4") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Altitude Descend") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Altitude Ascend") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Air Speed Decrease") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Air Speed Increase") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("10%") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("20%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("40%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("80%") -INPUT_PORTS_END - -void tc7atc_state::tc7atc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=68K, C=47pF - m_maincpu->k().set(FUNC(tc7atc_state::read_k)); - m_maincpu->r().set(FUNC(tc7atc_state::write_r)); - m_maincpu->o().set(FUNC(tc7atc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3c0, 0x7f); - config.set_default_layout(layout_tc7atc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tc7atc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1311", 0x0000, 0x0800, CRC(704f5e1b) SHA1(765dce31798640480eab7576550c5378d6351b65) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_tc7atc_output.pla", 0, 365, CRC(0e6e3096) SHA1(375beb43657af0cc3070e581b42e501878c0eaaa) ) -ROM_END - - - - - -/*************************************************************************** - - Canon Palmtronic F-31, Canon Canola L813, Toshiba BC-8111B, Toshiba BC-8018B, - Triumph-Adler 81 SN, Silver-Reed 8J, more - * TMS1040 MCU label TMS1045NL (die label 1040A, 1045) - * 9-digit cyan VFD display (leftmost may be custom) - - TMS1045NL is a versatile calculator chip for 3rd party manufacturers, used - by Canon, Toshiba, and several smaller companies. It doesn't look like it - was used in any TI calculator. It was up to the manufacturer to choose which - functions(keys) to leave out. - -***************************************************************************/ - -class palmf31_state : public hh_tms1k_state -{ -public: - palmf31_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void palmf31(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void palmf31_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void palmf31_state::write_r(u16 data) -{ - // R0-R8: select digit, input mux - m_r = m_inp_mux = data; - update_display(); -} - -void palmf31_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 palmf31_state::read_k() -{ - // K: multiplexed inputs, one of the columns is K2+K8 - u8 data = read_inputs(9); - if (data & 1) - data = (data & 0xe) | 0xa; - - // switches are on K1 - if (m_inp_mux & m_inputs[9]->read()) - data |= 1; - - return data; -} - -// config - -static INPUT_PORTS_START( palmf31 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M+") // add to memory - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("M-") // subtract from memory - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("RV") // reverse - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as M+ - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // same as sqrt - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("1/x") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("RM/CM") // combined function (press twice) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("C") // clear (all) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME(UTF8_LEFT) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("CI") // clear indicator - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("CI/C") // combined function (press twice) - - PORT_START("IN.9") // K1 - PORT_CONFNAME( 0x1f, 0x00, "DP" ) // display point - PORT_CONFSETTING( 0x02, "+" ) - PORT_CONFSETTING( 0x01, "0" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x10, "4" ) - PORT_CONFSETTING( 0x00, "F" ) - PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_CONFNAME( 0x100, 0x000, "AM" ) // accumulate memory - PORT_CONFSETTING( 0x000, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x100, DEF_STR( On ) ) -INPUT_PORTS_END - -void palmf31_state::palmf31(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(palmf31_state::read_k)); - m_maincpu->o().set(FUNC(palmf31_state::write_o)); - m_maincpu->r().set(FUNC(palmf31_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_palmf31); - - // no sound! -} - -// roms - -ROM_START( palmf31 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1045nl", 0x0000, 0x0400, CRC(0c42d43e) SHA1(b76d404623e3abfd0b237ee1c0b46e83f96ceb78) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_palmf31_micro.pla", 0, 867, CRC(639cbc13) SHA1(a96152406881bdfc7ddc542cf4b478525c8b0e23) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_palmf31_output.pla", 0, 365, CRC(bc295ea6) SHA1(7e7c9ed0c1e5e37173dd8f297473516c410bca8c) ) -ROM_END - - - - - -/*************************************************************************** - - Canon Palmtronic MD-8 (Multi 8) / Canon Canola MD 810 - * TMS1070 MCU label TMC1079 (die label 1070B, 1079A) - * 2-line cyan VFD display, each 9-digit 7seg + 1 custom (label 20-ST-22) - * PCB label Canon EHI-0115-03 - - The only difference between MD-8 and MD 810 is the form factor. The latter - is a tabletop calculator. - -***************************************************************************/ - -class palmmd8_state : public hh_tms1k_state -{ -public: - palmmd8_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void palmmd8(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void palmmd8_state::update_display() -{ - // M-digit is on in memory mode, upper row is off in single mode - u32 m = (m_inputs[10]->read() & 0x10) ? 0x100000 : 0; - u32 mask = (m_inputs[10]->read() & 0x20) ? 0xfffff : 0xffc00; - - // R10 selects display row - u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00); - m_display->matrix((sel & mask) | m, m_o); -} - -void palmmd8_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void palmmd8_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = bitswap<8>(data,0,4,5,6,7,1,2,3); - update_display(); -} - -u8 palmmd8_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( palmmd8 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% +/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("RM") // recall memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("SC") // sign change - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("CM") // clear memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("M+") // add to memory - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") // reverse - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CI/C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.10") // R10 - PORT_CONFNAME( 0x31, 0x20, "Mode" ) // bit 4 indicates M-digit on/off, bit 5 indicates upper row filament on/off - PORT_CONFSETTING( 0x31, "Memory" ) - PORT_CONFSETTING( 0x01, "Single" ) - PORT_CONFSETTING( 0x20, "Process" ) - PORT_CONFNAME( 0x02, 0x00, "AM" ) // accumulate memory - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x02, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void palmmd8_state::palmmd8(machine_config &config) -{ - // basic machine hardware - TMS1070(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=68pf - m_maincpu->k().set(FUNC(palmmd8_state::read_k)); - m_maincpu->o().set(FUNC(palmmd8_state::write_o)); - m_maincpu->r().set(FUNC(palmmd8_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(21, 8); - m_display->set_segmask(0xfffff, 0xff); - config.set_default_layout(layout_palmmd8); - - // no sound! -} - -// roms - -ROM_START( palmmd8 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1079nl", 0x0000, 0x0400, CRC(202c5ed8) SHA1(0143975cac20cb4a4e9f659ca0535e8a9056f5bb) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_palmmd8_output.pla", 0, 365, CRC(e999cece) SHA1(c5012877cd030a4dc66228f109fa23eec1867873) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Amaze-A-Tron, by Ralph Baer - * TMS1100 MCU, label MP3405 (die label same) - * 2-digit 7seg LED display + 2 LEDs(one red, one green), 1-bit sound - * 5*5 pressure-sensitive playing board(buttons), 4 game pieces - - This is an electronic board game with a selection of 8 maze games, - most of them for 2 players. - -***************************************************************************/ - -class amaztron_state : public hh_tms1k_state -{ -public: - amaztron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void amaztron(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void amaztron_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void amaztron_state::write_r(u16 data) -{ - // R0-R5: input mux - m_inp_mux = data & 0x3f; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R6,R7: leds - // R8,R9: select digit - m_r = data >> 6 & 0xf; - update_display(); -} - -void amaztron_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 amaztron_state::read_k() -{ - // K: multiplexed inputs - u8 k = read_inputs(6); - - // the 5th column is tied to K4+K8 - if (k & 0x10) k |= 0xc; - return k & 0xf; -} - -// config - -static INPUT_PORTS_START( amaztron ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Game Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Game Start") - PORT_BIT( 0x1c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void amaztron_state::amaztron(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=33K?, C=100pF - m_maincpu->k().set(FUNC(amaztron_state::read_k)); - m_maincpu->r().set(FUNC(amaztron_state::write_r)); - m_maincpu->o().set(FUNC(amaztron_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xc, 0x7f); - config.set_default_layout(layout_amaztron); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( amaztron ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3405", 0x0000, 0x0800, CRC(9cbc0009) SHA1(17772681271b59280687492f37fa0859998f041d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_amaztron_output.pla", 0, 365, CRC(f3875384) SHA1(3c256a3db4f0aa9d93cf78124db39f4cbdc57e4a) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Zodiac - The Astrology Computer (model 2110) - * TMS1100 MP3435 (no decap) - * 8-digit 7seg display, 12 other LEDs, 1-bit sound - - As the name suggests, this is an astrologic calculator. Refer to the - (very extensive) manual on how to use it. - -***************************************************************************/ - -class zodiac_state : public hh_tms1k_state -{ -public: - zodiac_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void zodiac(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void zodiac_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void zodiac_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R4,R8: input mux - m_inp_mux = (data & 0x1f) | (data >> 3 & 0x20); - - // R0-R7: digit select - // R8,R9: led select - m_r = data & 0x3ff; - update_display(); -} - -void zodiac_state::write_o(u16 data) -{ - // O0-O7: digit segment/led data - m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); - update_display(); -} - -u8 zodiac_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* The physical button layout and labels are like this: - - [P] [A] - [ 1 ] [ 2 ] [ 3 ] - [L] [ 4 ] [ 5 ] [ 6 ] [D] - [ 7 ] [ 8 ] [ 9 ] - [J] [ 0 ] [CLR] [ENT] [E] - - [.__.__.__.] - OFF H P A - -Despite that this layout features a typical digital keypad and distances -the letter buttons from it, the 8-character encoding for date input uses -letters and digits in combination. This fact and the use of the P key are -why the digit buttons are mapped here as keyboard inputs rather than as a -keypad. - -*/ - -static INPUT_PORTS_START( zodiac ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") PORT_CHAR(13) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("Clear") PORT_CHAR(8) - - PORT_START("IN.5") // R8 - PORT_CONFNAME( 0x03, 0x01, "Mode") - PORT_CONFSETTING( 0x01, "Horoscope" ) - PORT_CONFSETTING( 0x02, "Preview" ) - PORT_CONFSETTING( 0x00, "Answer" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void zodiac_state::zodiac(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 500000); // approximation - RC osc. R=18K, C=100pF - m_maincpu->k().set(FUNC(zodiac_state::read_k)); - m_maincpu->r().set(FUNC(zodiac_state::write_r)); - m_maincpu->o().set(FUNC(zodiac_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0xff, 0x7f); - config.set_default_layout(layout_zodiac); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( zodiac ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3435", 0x0000, 0x0800, CRC(ecdc3160) SHA1(a7e82d66314a039fcffeddf99919d9f9ad42d61d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_zodiac_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_zodiac_output.bin", 0, 0x20, CRC(d35d64cb) SHA1(315e7ca9a18a06ff7dc0b95c6f119e093b15a41f) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Electronic Quarterback (model 2120) - * TMS1100NLL MP3415 (die label same) - * 9-digit LED grid, 1-bit sound - - known releases: - - USA(1): Electronic Quarterback, published by Coleco - - USA(2): Electronic Touchdown, published by Sears - -***************************************************************************/ - -class cqback_state : public hh_tms1k_state -{ -public: - cqback_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cqback(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cqback_state::update_display() -{ - // R9 selects between segments B/C or A'/D' - u16 seg = m_o; - if (m_r & 0x200) - seg = (m_o << 7 & 0x300) | (m_o & 0xf9); - - m_display->matrix(m_r & 0x1ff, seg); -} - -void cqback_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R0-R9: select digit/segment - m_r = data; - update_display(); -} - -void cqback_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cqback_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(5); -} - -// config - -static INPUT_PORTS_START( cqback ) - PORT_START("IN.0") // K1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick/Pass") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") - - PORT_START("IN.1") // K2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.3") // K8 - PORT_CONFNAME( 0x01, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x01, DEF_STR( On ) ) // TP1-TP2 -INPUT_PORTS_END - -void cqback_state::cqback(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(cqback_state::read_k)); - m_maincpu->r().set(FUNC(cqback_state::write_r)); - m_maincpu->o().set(FUNC(cqback_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x1ff, 0xff); - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_cqback); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cqback ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3415.u4", 0x0000, 0x0800, CRC(65ebdabf) SHA1(9b5cf5adaf9132ced87f611ae8c3148b9b62ba89) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cqback_output.pla", 0, 365, CRC(c6dcbfd0) SHA1(593b6b7de981a28d1b4a33336b39df92d02ed4f4) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Football (model 2140) - * TMS1100NLLE (rev. E!) MP3460 (die label same) - * 2*SN75492N LED display drivers, 9-digit LED grid, 1-bit sound - - LED electronic football game. To distinguish between offense and defense, - offense blips appear brighter. The hardware is similar to cqback. - - known releases: - - USA(1): Head to Head: Electronic Football, published by Coleco - - USA(2): Team Play Football, published by Sears - -***************************************************************************/ - -class h2hfootb_state : public hh_tms1k_state -{ -public: - h2hfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hfootb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void h2hfootb_state::update_display() -{ - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 1 & 0x100)); -} - -void h2hfootb_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R8: input mux - m_inp_mux = data & 0x1ff; - - // R0-R8: select led - // R9: led between digits - m_r = data; - update_display(); -} - -void h2hfootb_state::write_o(u16 data) -{ - // O0-O7: digit segments A-G,A' - m_o = data; - update_display(); -} - -u8 h2hfootb_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(9); -} - -// config - -static INPUT_PORTS_START( h2hfootb ) - PORT_START("IN.0") // K1 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.1") // K2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("P1 Play Selector") // pass - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x01, EQUALS, 0x00) // run/kick - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - - PORT_START("IN.3") // K8 - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick/Pass") - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Display") - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY -INPUT_PORTS_END - -void h2hfootb_state::h2hfootb(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 310000); // approximation - RC osc. R=39K, C=100pF - m_maincpu->k().set(FUNC(h2hfootb_state::read_k)); - m_maincpu->r().set(FUNC(h2hfootb_state::write_r)); - m_maincpu->o().set(FUNC(h2hfootb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1ff, 0x7f); - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_h2hfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hfootb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3460.u3", 0x0000, 0x0800, CRC(3a4e53a8) SHA1(5052e706f992c6c4bada1fa7769589eec3df6471) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hfootb_output.pla", 0, 365, CRC(c8d85873) SHA1(16bd6fc8e3cd16d5f8fd32d0c74e67de77f5487e) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Basketball (model 2150) - * TMS1000NLL MP3320A (die label 1000E MP3320A) - * 2-digit 7seg LED display, LED grid display, 1-bit sound - - Coleco Head to Head: Electronic Hockey (model 2160) - * TMS1000NLL E MP3321A (die label 1000E MP3321A) - * same PCB/hardware as above - - Unlike the COP420 version(see hh_cop400.cpp driver), each game has its own MCU. - To begin play, press start while holding left/right. - -***************************************************************************/ - -class h2hbaskb_state : public hh_tms1k_state -{ -public: - h2hbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_cap_empty_timer(*this, "cap_empty") - { } - - void h2hbaskb(machine_config &config); - void h2hhockey(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_cap_empty_timer; - TIMER_DEVICE_CALLBACK_MEMBER(cap_empty_callback); - bool m_cap_state = false; - attotime m_cap_charge = attotime::zero; - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void h2hbaskb_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_cap_state)); - save_item(NAME(m_cap_charge)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(h2hbaskb_state::cap_empty_callback) -{ - if (~m_r & 0x200) - m_cap_state = false; -} - -void h2hbaskb_state::update_display() -{ - // R6,R7 are commons for R0-R5 - u16 sel = 0; - if (m_r & 0x40) sel |= (m_r & 0x3f); - if (m_r & 0x80) sel |= (m_r & 0x3f) << 6; - - m_display->matrix(sel, m_o); -} - -void h2hbaskb_state::write_r(u16 data) -{ - // R0-R3: input mux - m_inp_mux = (data & 0xf); - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R9: K8 and 15uF cap to V- (used as timer) - // rising edge, remember the time - if (data & ~m_r & 0x200) - { - m_cap_state = true; - m_cap_charge = machine().time(); - } - // falling edge, determine how long K8 should stay up - if (~data & m_r & 0x200) - { - const attotime full = attotime::from_usec(1300); // approx. charge time - const int factor = 27; // approx. factor for charge/discharge to logic 0 - - attotime charge = machine().time() - m_cap_charge; - if (charge > full) - charge = full; - - m_cap_empty_timer->adjust(charge * factor); - } - - // R0-R7: led select - m_r = data; - update_display(); -} - -void h2hbaskb_state::write_o(u16 data) -{ - // O1-O7: led data - m_o = data >> 1 & 0x7f; - update_display(); -} - -u8 h2hbaskb_state::read_k() -{ - // K1-K4: multiplexed inputs, K8: R9 and capacitor - return (read_inputs(4) & 7) | (m_cap_state ? 8 : 0); -} - -// config - -static INPUT_PORTS_START( h2hbaskb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("P1 Pass CW") // clockwise - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("P1 Pass CCW") // counter-clockwise - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start/Display") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Defense Left") - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( h2hhockey ) - PORT_INCLUDE( h2hbaskb ) - - PORT_MODIFY("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Goalie Left") -INPUT_PORTS_END - -void h2hbaskb_state::h2hbaskb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=100pF - m_maincpu->k().set(FUNC(h2hbaskb_state::read_k)); - m_maincpu->r().set(FUNC(h2hbaskb_state::write_r)); - m_maincpu->o().set(FUNC(h2hbaskb_state::write_o)); - - TIMER(config, "cap_empty").configure_generic(FUNC(h2hbaskb_state::cap_empty_callback)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(6+6, 7); - m_display->set_segmask(0xc0, 0x7f); - config.set_default_layout(layout_h2hbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void h2hbaskb_state::h2hhockey(machine_config &config) -{ - h2hbaskb(config); - config.set_default_layout(layout_h2hhockey); -} - -// roms - -ROM_START( h2hbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3320a", 0x0000, 0x0400, CRC(39a63f43) SHA1(14a765e42a39f8d3a465c990e09dd651e595a1c5) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_h2hbaskb_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) -ROM_END - -ROM_START( h2hhockey ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3321a", 0x0000, 0x0400, CRC(e974e604) SHA1(ed740c98ce96ad70ee5237eccae1f54a75ad8100) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_h2hhockey_output.pla", 0, 365, CRC(9d1a91e1) SHA1(96303eb22375129b0dfbfcd823c8ca5b919511bc) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Baseball (model 2180) - * PCB labels Coleco rev C 73891/2 - * TMS1170NLN MP1525-N2 (die label MP1525) - * 9-digit cyan VFD display, and other LEDs behind bezel, 1-bit sound - - known releases: - - USA: Head to Head: Electronic Baseball, published by Coleco - - Japan: Computer Baseball, published by Tsukuda - -***************************************************************************/ - -class h2hbaseb_state : public hh_tms1k_state -{ -public: - h2hbaseb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hbaseb(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void h2hbaseb_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void h2hbaseb_state::set_clock() -{ - // MCU clock is from an RC circuit with C=47pF, and R value is depending on - // skill switch: R=51K(1) or 43K(2) - m_maincpu->set_unscaled_clock((m_inputs[5]->read() & 1) ? 400000 : 350000); -} - -void h2hbaseb_state::update_display() -{ - m_display->matrix((m_r & 0xff) | (m_r >> 1 & 0x100), (m_r & 0x100) | m_o); -} - -void h2hbaseb_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R4-R7: input mux - m_inp_mux = data >> 4 & 0xf; - - // R0-R7,R9: select vfd digit/led - // R8: led state - m_r = data; - update_display(); -} - -void h2hbaseb_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - // O7: N/C - m_o = data; - update_display(); -} - -u8 h2hbaseb_state::read_k() -{ - // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inputs[4]->read() | read_inputs(4); -} - -// config - -static INPUT_PORTS_START( h2hbaseb ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("N") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("B") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("S") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Curve") // these two buttons appear twice on the board - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Pitch") // " - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // Vss! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Swing") - - PORT_START("IN.5") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, h2hbaseb_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) -INPUT_PORTS_END - -void h2hbaseb_state::h2hbaseb(machine_config &config) -{ - // basic machine hardware - TMS1170(config, m_maincpu, 350000); // see set_clock - m_maincpu->k().set(FUNC(h2hbaseb_state::read_k)); - m_maincpu->r().set(FUNC(h2hbaseb_state::write_r)); - m_maincpu->o().set(FUNC(h2hbaseb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_h2hbaseb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hbaseb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1525", 0x0000, 0x0800, CRC(b5d6bf9b) SHA1(2cc9f35f077c1209c46d16ec853af87e4725c2fd) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hbaseb_output.pla", 0, 365, CRC(cb3d7e38) SHA1(6ab4a7c52e6010b7c7158463cb499973e52ff556) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Head to Head: Electronic Boxing (model 2190) - * TMS1100NLL M34018-N2 (die label M34018) - * 2-digit 7seg LED display, LED grid display, 1-bit sound - - This appears to be the last game of Coleco's Head to Head series. - -***************************************************************************/ - -class h2hboxing_state : public hh_tms1k_state -{ -public: - h2hboxing_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void h2hboxing(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void h2hboxing_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void h2hboxing_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R0-R7: select led - // R9,R10: select digit - m_r = data & ~0x100; - update_display(); -} - -void h2hboxing_state::write_o(u16 data) -{ - // O0-O7: digit segments/led data - m_o = data; - update_display(); -} - -u8 h2hboxing_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( h2hboxing ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punch / Pro") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Block / Amateur") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Punch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Block") -INPUT_PORTS_END - -void h2hboxing_state::h2hboxing(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=100pF - m_maincpu->k().set(FUNC(h2hboxing_state::read_k)); - m_maincpu->r().set(FUNC(h2hboxing_state::write_r)); - m_maincpu->o().set(FUNC(h2hboxing_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_segmask(0x600, 0x7f); - config.set_default_layout(layout_h2hboxing); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( h2hboxing ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34018", 0x0000, 0x0800, CRC(e26a11a3) SHA1(aa2735088d709fa8d9188c4fb7982a53e3a8c1bc) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_h2hboxing_output.pla", 0, 365, CRC(ffb0e63d) SHA1(31ee3f779270a23f05f9ad508283d2569ef069f1) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Quiz Wiz Challenger - * TMS1000NLL M32001-N2 (die label 1000E, M32001) - * 4 7seg LEDs, 17 other LEDs, 1-bit sound - - This is a 4-player version of Quiz Wiz, a multiple choice quiz game. - According to the manual, Quiz Wiz cartridges are compatible with it. - The question books are needed to play, as well as optional game pieces. - - Cartridge pinout: - 1 R4 - 2 R6 - 3 R7 - 4 K1 - 5 N/C - 6 R8 - 7 R5 - 8 R9 - - The cartridge connects one or more of the R pins to K1. Together with the - question numbers, the game generates a pseudo-random answerlist. - -***************************************************************************/ - -class quizwizc_state : public hh_tms1k_state -{ -public: - quizwizc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void quizwizc(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u16 m_pinout = 0x07; // cartridge R pins - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void quizwizc_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_pinout)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(quizwizc_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge pinout K1 to R connections - const char *pinout = image.get_feature("pinout"); - m_pinout = pinout ? strtoul(pinout, nullptr, 2) & 0xe7 : 0; - m_pinout = bitswap<8>(m_pinout,4,3,7,5,2,1,6,0) << 4; - - if (m_pinout == 0) - { - image.seterror(image_error::INVALIDIMAGE, "Invalid cartridge pinout"); - return image_init_result::FAIL; - } - - return image_init_result::PASS; -} - -void quizwizc_state::update_display() -{ - // note: O7 is on VSS - m_display->matrix(m_r | 0x400, m_o); -} - -void quizwizc_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R5: input mux - // R4-R9: to cartridge slot - m_inp_mux = data & 0x3f; - - // R0-R3: led select - // R6-R9: digit select - m_r = data; - update_display(); -} - -void quizwizc_state::write_o(u16 data) -{ - // O0-O7: led/digit segment data - m_o = bitswap<8>(data,7,0,1,2,3,4,5,6); - update_display(); -} - -u8 quizwizc_state::read_k() -{ - // K: multiplexed inputs - // K1: cartridge pin 4 (pin 5 N/C) - return read_inputs(6) | ((m_r & m_pinout) ? 1 : 0); -} - -// config - -static INPUT_PORTS_START( quizwizc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) // A (player 1 at bottom, increment counter-clockwise) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) // B - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) // C - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) // D - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(4) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(3) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Go") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Fast Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Slow Forward") - - PORT_START("IN.5") // R5 - PORT_CONFNAME( 0x02, 0x00, "Game Select" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void quizwizc_state::quizwizc(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=100pF - m_maincpu->k().set(FUNC(quizwizc_state::read_k)); - m_maincpu->r().set(FUNC(quizwizc_state::write_r)); - m_maincpu->o().set(FUNC(quizwizc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10+1, 8); - m_display->set_segmask(0x3c0, 0x7f); - config.set_default_layout(layout_quizwizc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "quizwiz_cart")); - cartslot.set_must_be_loaded(true); - cartslot.set_device_load(FUNC(quizwizc_state::cart_load)); - SOFTWARE_LIST(config, "cart_list").set_original("quizwiz"); -} - -// roms - -ROM_START( quizwizc ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "m32001", 0x0000, 0x0400, CRC(053657eb) SHA1(38c84f7416f79aa679f434a3d35df54cd9aa528a) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_quizwizc_output.pla", 0, 365, CRC(475b7053) SHA1(8f61bf736eb41d7029a6b165cc0a184ba0a70a2a) ) -ROM_END - - - - - -/*************************************************************************** - - Coleco Total Control 4 - * TMS1400NLL MP7334-N2 (die label MP7334) - * 2x2-digit 7seg LED display + 4 LEDs, LED grid display, 1-bit sound - - This is a head to head electronic tabletop LED-display sports console. - One cartridge(Football) was included with the console, the other three were - sold in a pack. Gameplay has emphasis on strategy, read the official manual - on how to play. MAME external artwork is needed for the switchable overlays. - - Cartridge pinout: - 1 N/C - 2 9V+ - 3 power switch - 4 K8 - 5 K4 - 6 K2 - 7 K1 - 8 R9 - - The cartridge connects pin 8 with one of the K-pins. - -***************************************************************************/ - -class tc4_state : public hh_tms1k_state -{ -public: - tc4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tc4(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u8 m_pinout = 0xf; // cartridge K pins - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void tc4_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_pinout)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(tc4_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge pinout R9 to K connections - const char *pinout = image.get_feature("pinout"); - m_pinout = pinout ? strtoul(pinout, nullptr, 0) & 0xf : 0xf; - - return image_init_result::PASS; -} - -void tc4_state::update_display() -{ - // note: R6 is an extra column - m_display->matrix(m_r, (m_o | (m_r << 2 & 0x100))); -} - -void tc4_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R5: input mux - // R9: to cartridge slot - m_inp_mux = data & 0x3f; - - // R0-R4: select led - // R6: led 8 state - // R5,R7-R9: select digit - m_r = data; - update_display(); -} - -void tc4_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 tc4_state::read_k() -{ - // K: multiplexed inputs, cartridge pins from R9 - return read_inputs(6) | ((m_r & 0x200) ? m_pinout : 0); -} - -// config - -static INPUT_PORTS_START( tc4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pass/Shoot Button 3") // right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass/Shoot Button 1") // left - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass/Shoot Button 2") // middle - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 D/K Button") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_PLAYER(2) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_PLAYER(2) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 3") // right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 1") // left - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Pass/Shoot Button 2") // middle - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 D/K Button") -INPUT_PORTS_END - -void tc4_state::tc4(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 450000); // approximation - RC osc. R=27.3K, C=100pF - m_maincpu->k().set(FUNC(tc4_state::read_k)); - m_maincpu->r().set(FUNC(tc4_state::write_r)); - m_maincpu->o().set(FUNC(tc4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x3a0, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_tc4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "tc4_cart")); - cartslot.set_must_be_loaded(true); // system won't power on without cartridge - cartslot.set_device_load(FUNC(tc4_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("tc4"); -} - -// roms - -ROM_START( tc4 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7334", 0x0000, 0x1000, CRC(923f3821) SHA1(a9ae342d7ff8dae1dedcd1e4984bcfae68586581) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_tc4_output.pla", 0, 557, CRC(3b908725) SHA1(f83bf5faa5b3cb51f87adc1639b00d6f9a71ad19) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Basketball - * PCB label CONIC 101-006 - * TMS1000NLL MP0907 (die label 1000B MP0907) - * DS8871N, 2 7seg LEDs, 30 other LEDs, 1-bit sound - - There are 3 known versions of Conic Basketball: MP0910(101-003) and - MP0907(101-006) are nearly identical. MP0168 is found in Conic Multisport. - - known releases: - - Hong Kong: Electronic Basketball, published by Conic - - USA: Electronic Basketball, published by Cardinal - -***************************************************************************/ - -class cnbaskb_state : public hh_tms1k_state -{ -public: - cnbaskb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnbaskb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnbaskb_state::update_display() -{ - m_display->matrix(m_r & 0x1fc, m_o); -} - -void cnbaskb_state::write_r(u16 data) -{ - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0,R1: input mux - // R10 is also tied to K1 (locks up at boot if it's not handled) - m_inp_mux = (data >> 8 & 4) | (data & 3); - - // R2-R6: led select - // R7,R8: digit select - m_r = data; - update_display(); -} - -void cnbaskb_state::write_o(u16 data) -{ - // O0-O6: led/digit segment data - // O7: N/C - m_o = data; - update_display(); -} - -u8 cnbaskb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cnbaskb ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x01, "2" ) // professional - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_CUSTOM ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cnbaskb_state::cnbaskb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(cnbaskb_state::read_k)); - m_maincpu->r().set(FUNC(cnbaskb_state::write_r)); - m_maincpu->o().set(FUNC(cnbaskb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x180, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cnbaskb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnbaskb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0907", 0x0000, 0x0400, CRC(35f84f0f) SHA1(744ca60bb853a2785184042e747530a9e02488f8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cnbaskb_output.pla", 0, 365, CRC(b4e28956) SHA1(8356112da71b351420a88d7e394e7d03e429368c) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Multisport - * PCB label CONIC 101-027(1979), or CONIC 101-021 REV A(1980, with DS8871N) - * TMS1000 MP0168 (die label same) - * 2 7seg LEDs, 33 other LEDs, 1-bit sound - - This handheld includes 3 games: Basketball, Ice Hockey, Soccer. - MAME external artwork is needed for the switchable overlays. - - known releases: - - Hong Kong: Electronic Multisport, published by Conic - - Hong Kong: Basketball/Ice Hockey/Soccer, published by Conic (3 separate handhelds) - - USA(1): Electronic Multisport, published by Innocron - - USA(2): Sports Arena, published by Tandy (model 60-2158) - -***************************************************************************/ - -class cmsport_state : public hh_tms1k_state -{ -public: - cmsport_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cmsport(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cmsport_state::update_display() -{ - m_display->matrix(m_r & ~0x80, m_o); -} - -void cmsport_state::write_r(u16 data) -{ - // R7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // R0,R9,R10: input mux - m_inp_mux = (data & 1) | (data >> 8 & 6); - - // R0-R4,R8: led select - // R5,R6: digit select - m_r = data; - update_display(); -} - -void cmsport_state::write_o(u16 data) -{ - // O0-O7: led/digit segment data - m_o = data; - update_display(); -} - -u8 cmsport_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cmsport ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x05, 0x01, "Game Select" ) - PORT_CONFSETTING( 0x01, "Basketball" ) - PORT_CONFSETTING( 0x00, "Soccer" ) - PORT_CONFSETTING( 0x04, "Ice Hockey" ) - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void cmsport_state::cmsport(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(cmsport_state::read_k)); - m_maincpu->r().set(FUNC(cmsport_state::write_r)); - m_maincpu->o().set(FUNC(cmsport_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x60, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cmsport); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cmsport ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0168.u1", 0x0000, 0x0400, CRC(0712a268) SHA1(bd4e23e5c17b28c52e7e769e44773cc9c8839bed) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cmsport_output.pla", 0, 365, CRC(7defa140) SHA1(477e3cb55e79938d6acaa911e410f6dcb974c218) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Football - * TMS1000 MP0170 (die label same) - * DS8874N, 3*9 LED array, 7 7seg LEDs, 1-bit sound - - This is a clone of Mattel Football. Apparently Mattel tried to keep imports - of infringing games from going through customs. Conic (Hong Kong) answered - by distributing the game under subsidiary brands - see list below. - - known releases: - - Hong Kong: Electronic Football, published by Conic - - USA(1): Football, published by E.R.S.(Electronic Readout Systems) - - USA(2): Football, published by ELECsonic - - USA(3): Football, no brand! - - Another hardware revision of this game uses a PIC16 MCU. - -***************************************************************************/ - -class cnfball_state : public hh_tms1k_state -{ -public: - cnfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_ds8874(*this, "ds8874") - { } - - void cnfball(machine_config &config); - -private: - required_device m_ds8874; - void ds8874_output_w(u16 data); - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnfball_state::update_display() -{ - m_display->matrix(~m_grid, m_o | (m_r << 6 & 0x700)); -} - -void cnfball_state::ds8874_output_w(u16 data) -{ - m_grid = data; - update_display(); -} - -void cnfball_state::write_r(u16 data) -{ - // R5,R8: N/C - // R6,R7: speaker out - m_speaker->level_w(data >> 6 & 3); - - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R0: DS8874N CP (note: it goes back to K8 too, game relies on it) - // R1: DS8874N _DATA - m_ds8874->cp_w(BIT(data, 0)); - m_ds8874->data_w(BIT(data, 1)); - - // R2-R4: led data - m_r = data; - update_display(); -} - -void cnfball_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cnfball_state::read_k() -{ - // K: multiplexed inputs, K8 also tied to DS8874N CP(R0) - return read_inputs(2) | (m_r << 3 & 8); -} - -// config - -static INPUT_PORTS_START( cnfball ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) // college - PORT_CONFSETTING( 0x00, "2" ) // professional -INPUT_PORTS_END - -void cnfball_state::cnfball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(cnfball_state::read_k)); - m_maincpu->r().set(FUNC(cnfball_state::write_r)); - m_maincpu->o().set(FUNC(cnfball_state::write_o)); - - // video hardware - DS8874(config, m_ds8874).write_output().set(FUNC(cnfball_state::ds8874_output_w)); - PWM_DISPLAY(config, m_display).set_size(9, 8+3); - m_display->set_segmask(0xc3, 0x7f); - m_display->set_segmask(0x38, 0xff); // only the middle 3 7segs have DP - m_display->set_bri_levels(0.01, 0.1); // player led is brighter - config.set_default_layout(layout_cnfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnfball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0170", 0x0000, 0x0400, CRC(50e8a44f) SHA1(fea6ae03c4ef329d825f8688e6854df15023d47e) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_cnfball_output.pla", 0, 365, CRC(0af52f64) SHA1(b4cf450e4d895eddb67448aa69e4f18a5a84e033) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic Football II - * TMS1100 MP1181 (no decap) - * 9-digit LED grid, 1-bit sound - - This is a clone of Coleco's Quarterback, similar at hardware-level too. - Unlike the other LED Football games, this one looks like it doesn't make - the offense(player) leds brighter. - - known releases: - - Hong Kong: Electronic Football II, published by Conic - - USA: Electronic Football II, published by Tandy - -***************************************************************************/ - -class cnfball2_state : public hh_tms1k_state -{ -public: - cnfball2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnfball2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnfball2_state::update_display() -{ - // R1 selects between segments B/C or A'/D' - u16 seg = m_o; - if (~m_r & 2) - seg = (m_o << 7 & 0x300) | (m_o & 0xf9); - - m_display->matrix(m_r >> 2 & 0x1ff, seg); -} - -void cnfball2_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R8-R10: input mux - m_inp_mux = data >> 8 & 7; - - // R1-R10: select digit/segment - m_r = data; - update_display(); -} - -void cnfball2_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 cnfball2_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( cnfball2 ) - PORT_START("IN.0") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x00, "Factory Test" ) - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x02, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_TOGGLE PORT_NAME("Play Selector") // pass/run - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // college - PORT_CONFSETTING( 0x08, "2" ) // professional - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Kick/Pass") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void cnfball2_state::cnfball2(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(cnfball2_state::read_k)); - m_maincpu->r().set(FUNC(cnfball2_state::write_r)); - m_maincpu->o().set(FUNC(cnfball2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 11); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_cnfball2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( cnfball2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1181", 0x0000, 0x0800, CRC(4553a840) SHA1(2e1132c9bc51641f77ba7f2430b5a3b2766b3a3d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_cnfball2_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump, 2nd half unused - ROM_LOAD16_BYTE( "tms1100_cnfball2_output.bin", 0, 0x20, CRC(c51d7404) SHA1(3a00c69b52b7d0dd12ccd66428130592c7e06240) ) -ROM_END - - - - - -/*************************************************************************** - - Conic Electronic I.Q. - * PCB labels: main: CONIC 101-037 (other side: HG-15, 11*00198*00), button PCB: - CONIC 102-001, led PCB: CONIC 100-003 REV A itac - * TMS1000NLL MP0908 (die label 1000B, MP0908) - * 2 7seg LEDs, 30 other LEDs, 1-bit sound - - This is a peg solitaire game, with random start position. - - known releases: - - Hong Kong: Electronic I.Q., published by Conic - - UK: Solitaire, published by Grandstand - -***************************************************************************/ - -class eleciq_state : public hh_tms1k_state -{ -public: - eleciq_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void eleciq(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void eleciq_state::update_display() -{ - m_display->matrix(m_r & ~1, m_o); -} - -void eleciq_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R1-R6,R9: input mux - m_inp_mux = (data >> 1 & 0x3f) | (data >> 3 & 0x40); - - // R1-R6: led select - // R7,R8: digit select - m_r = data; - update_display(); -} - -void eleciq_state::write_o(u16 data) -{ - // O0-O6: led/digit segment data - // O7: N/C - m_o = data; - update_display(); -} - -u8 eleciq_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -static INPUT_PORTS_START( eleciq ) - PORT_START("IN.0") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Up-Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Up") - - PORT_START("IN.1") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Button B") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Up-Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Down") - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Down-Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Left") - - PORT_START("IN.3") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button D") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Down-Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Right") - - PORT_START("IN.4") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button E") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button 5") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button F") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R9 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x01, "2" ) // professional - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) -INPUT_PORTS_END - -void eleciq_state::eleciq(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=47K, C=50pF - m_maincpu->k().set(FUNC(eleciq_state::read_k)); - m_maincpu->r().set(FUNC(eleciq_state::write_r)); - m_maincpu->o().set(FUNC(eleciq_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x180, 0x7f); - config.set_default_layout(layout_eleciq); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( eleciq ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0908", 0x0000, 0x0400, CRC(db59b82c) SHA1(c9a6bcba208969560495ad9f8775f53de16a69c3) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_eleciq_output.pla", 0, 365, CRC(b8e04232) SHA1(22eed6d9b1fb1e5c9974ea3df16cda71a39aad57) ) -ROM_END - - - - - -/*************************************************************************** - - Electroplay Quickfire - * TMS1000NLL MP3260 (die label same) - * 2 7seg LEDs, 5 lamps, 3 lightsensors, lightgun - - To play it in MAME, either use the clickable artwork with -mouse, or set - button 1 to "Z or X or C" and each lightsensor to one of those keys. - Although the game seems mostly playable without having to use the gun trigger - -***************************************************************************/ - -class qfire_state : public hh_tms1k_state -{ -public: - qfire_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void qfire(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void qfire_state::write_r(u16 data) -{ - // R1,R2,R5: input mux - m_inp_mux = (data >> 1 & 3) | (data >> 3 & 4); - - // R3,R4,R6-R8: leds (direct) - m_display->write_row(2, (data >> 3 & 3) | (data >> 4 & 0x1c)); - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); -} - -void qfire_state::write_o(u16 data) -{ - // O0: 1st digit "1" - // O1-O7: 2nd digit segments - m_display->write_row(0, (data & 1) ? 6 : 0); - m_display->write_row(1, data >> 1 & 0x7f); -} - -u8 qfire_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( qfire ) - PORT_START("IN.0") // R1 - PORT_CONFNAME( 0x0f, 0x00, "Game" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x02, "4" ) - PORT_CONFSETTING( 0x01, "5" ) - PORT_CONFSETTING( 0x06, "6" ) - - PORT_START("IN.1") // R2 - PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "A" ) - PORT_CONFSETTING( 0x02, "B" ) - PORT_CONFSETTING( 0x01, "C" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Lightsensor 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // lightgun trigger, also turns on lightgun lamp -INPUT_PORTS_END - -void qfire_state::qfire(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(qfire_state::read_k)); - m_maincpu->r().set(FUNC(qfire_state::write_r)); - m_maincpu->o().set(FUNC(qfire_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_qfire); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( qfire ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3260", 0x0000, 0x0400, CRC(f6e28376) SHA1(6129584c55a1629b458694cdc97edccb77ab00ba) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_qfire_output.pla", 0, 365, CRC(8f7668a9) SHA1(c8faeff0f88bfea8f032ce5bc583f049e8930c11) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Soccer - * TMS1000NL MP0158 (die label 1000B, MP0158) - * 2 7seg LEDs, 30 other LEDs, 1-bit sound - - known releases: - - USA: Electronic Soccer, 2 versions (leds on green bezel, or leds under bezel) - - Germany: Fussball, with skill switch - -***************************************************************************/ - -class esoccer_state : public hh_tms1k_state -{ -public: - esoccer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void esoccer(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void esoccer_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void esoccer_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void esoccer_state::write_o(u16 data) -{ - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 esoccer_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( esoccer ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R2 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // Auto - PORT_CONFSETTING( 0x02, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL -INPUT_PORTS_END - -void esoccer_state::esoccer(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 475000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(esoccer_state::read_k)); - m_maincpu->r().set(FUNC(esoccer_state::write_r)); - m_maincpu->o().set(FUNC(esoccer_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x300, 0x7f); - m_display->set_bri_levels(0.008, 0.08); // player led is brighter - config.set_default_layout(layout_esoccer); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( esoccer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0158.ic1", 0x0000, 0x0400, CRC(ae4581ea) SHA1(5f6881f8247094abf8cffb17f6e6586e94cff38c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_esoccer_output.pla", 0, 365, CRC(c6eeabbd) SHA1(99d07902126b5a1c1abf43340f30d3390da5fa92) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball (1) - * TMS1000NLP MP0914 (die label MP0914A) - * 1 7seg LED, and other LEDs behind bezel, 1-bit sound - - This is a handheld LED baseball game. One player controls the batter, the CPU - or other player controls the pitcher. Pitcher throw buttons are on a 'joypad' - obtained from a compartment in the back. Player scores are supposed to be - written down manually, the game doesn't save scores or innings (this annoyance - was resolved in the sequel). For more information, refer to the official manual. - - The overlay graphic is known to have 2 versions: one where the field players - are denoted by words ("left", "center", "short", etc), and an alternate one - with little guys drawn next to the LEDs. - - led translation table: led LDzz from game PCB = MAME y.x: - - 0 = - 10 = 1.2 20 = 4.2 30 = 6.0 - 1 = 2.3 11 = 0.4 21 = 4.1 31 = 6.1 - 2 = 0.0 12 = 1.5 22 = 4.0 32 = 6.2 - 3 = 0.1 13 = 2.2 23 = 4.3 33 = 7.0 - 4 = 0.2 14 = 3.3 24 = 5.3 34 = 7.1 - 5 = 1.0 15 = 3.2 25 = 5.2 - 6 = 1.3 16 = 2.1 26 = 5.1 - 7 = 1.1 17 = 3.1 27 = 5.0 - 8 = 0.3 18 = 3.0 28 = 7.2 - 9 = 1.4 19 = 2.0 29 = 7.3 - -***************************************************************************/ - -class ebball_state : public hh_tms1k_state -{ -public: - ebball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebball_state::update_display() -{ - m_display->matrix(m_r, ~m_o); -} - -void ebball_state::write_r(u16 data) -{ - // R1-R5: input mux - m_inp_mux = data >> 1 & 0x1f; - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0-R7: led select - // R8: digit select - m_r = data; - update_display(); -} - -void ebball_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 ebball_state::read_k() -{ - // K: multiplexed inputs (note: K8(Vss row) is always on) - return m_inputs[5]->read() | read_inputs(5); -} - -// config - -static INPUT_PORTS_START( ebball ) - PORT_START("IN.0") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Change Sides") - PORT_CONFNAME( 0x04, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // Vss! - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") -INPUT_PORTS_END - -void ebball_state::ebball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 375000); // approximation - RC osc. R=43K, C=47pF - m_maincpu->k().set(FUNC(ebball_state::read_k)); - m_maincpu->r().set(FUNC(ebball_state::write_r)); - m_maincpu->o().set(FUNC(ebball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x100, 0x7f); - config.set_default_layout(layout_ebball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0914", 0x0000, 0x0400, CRC(3c6fb05b) SHA1(b2fe4b3ca72d6b4c9bfa84d67f64afdc215e7178) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ebball_output.pla", 0, 365, CRC(062bf5bb) SHA1(8d73ee35444299595961225528b153e3a5fe66bf) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball 2 - * PCB label ZENY - * TMS1000 MCU, MP0923 (die label same) - * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - The Japanese version was published by Gakken, black case instead of white. - - The sequel to Entex Baseball, this version keeps up with score and innings. - As its predecessor, the pitcher controls are on a separate joypad. - - led translation table: led zz from game PCB = MAME y.x: - - 00 = - 10 = 9.4 20 = 7.4 30 = 5.0 - 01 = 5.3 11 = 9.3 21 = 7.5 31 = 5.1 - 02 = 0.7 12 = 9.2 22 = 8.0 32 = 5.2 - 03 = 1.7 13 = 6.2 23 = 8.1 33 = 4.0 - 04 = 2.7 14 = 7.0 24 = 8.2 34 = 4.1 - 05 = 9.7 15 = 7.1 25 = 8.3 35 = 3.1 - 06 = 9.0 16 = 6.1 26 = 8.4 36 = 3.0 - 07 = 9.5 17 = 7.2 27 = 8.5 37 = 3.3 - 08 = 6.3 18 = 7.3 28 = 4.2 38 = 3.2 - 09 = 9.1 19 = 6.0 29 = 4.3 - -***************************************************************************/ - -class ebball2_state : public hh_tms1k_state -{ -public: - ebball2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebball2_state::update_display() -{ - m_display->matrix(m_r ^ 0x7f, ~m_o); -} - -void ebball2_state::write_r(u16 data) -{ - // R3-R6: input mux - m_inp_mux = data >> 3 & 0xf; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R2: digit select - // R3-R9: led select - m_r = data; - update_display(); -} - -void ebball2_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 ebball2_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( ebball2 ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ebball2_state::ebball2(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ebball2_state::read_k)); - m_maincpu->r().set(FUNC(ebball2_state::write_r)); - m_maincpu->o().set(FUNC(ebball2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_ebball2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball2 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0923", 0x0000, 0x0400, CRC(077acfe2) SHA1(a294ce7614b2cdb01c754a7a50d60d807e3f0939) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ebball2_output.pla", 0, 365, CRC(adcd73d1) SHA1(d69e590d288ef99293d86716498f3971528e30de) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Baseball 3 - * PCB label ZENY - * TMS1100NLL 6007 MP1204 (rev. E!) (die label MP1204) - * 2*SN75492N LED display driver - * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - This is another improvement over Entex Baseball, where gameplay is a bit more - varied. Like the others, the pitcher controls are on a separate joypad. - - led translation table: led zz from game PCB = MAME y.x: - note: unlabeled panel leds are listed here as Sz, Bz, Oz, Iz, z left-to-right - - 00 = - 10 = 7.5 20 = 7.2 - 01 = 6.0 11 = 6.5 21 = 8.4 - 02 = 6.1 12 = 5.5 22 = 8.5 - 03 = 6.2 13 = 5.2 23 = 9.0 - 04 = 6.3 14 = 8.0 24 = 9.2 - 05 = 7.3 15 = 8.1 25 = 9.1 - 06 = 5.3 16 = 5.1 26 = 9.3 - 07 = 7.4 17 = 8.2 27 = 9.5 - 08 = 6.4 18 = 8.3 28 = 9.4 - 09 = 5.4 19 = 5.0 - - S1,S2: 4.0,4.1 - B1-B3: 3.0-3.2 - O1,O2: 4.2,4.3 - I1-I6: 2.0-2.5, I7-I9: 3.3-3.5 - -***************************************************************************/ - -class ebball3_state : public hh_tms1k_state -{ -public: - ebball3_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebball3(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void ebball3_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void ebball3_state::set_clock() -{ - // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz, - // but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed - // it up to around ~440kHz. - m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 440000 : 340000); -} - -void ebball3_state::update_display() -{ - m_display->matrix_partial(0, 10, m_r, m_o); - - // R0,R1 are normal 7segs - // R4,R7 contain segments(only F and B) for the two other digits - m_display->write_row(10, (m_display->read_row(4) & 0x20) | (m_display->read_row(7) & 0x02)); - m_display->write_row(11, ((m_display->read_row(4) & 0x10) | (m_display->read_row(7) & 0x01)) << 1); -} - -void ebball3_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1, digit select - // R2-R9: led select - m_r = data; - update_display(); -} - -void ebball3_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 ebball3_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -/* physical button layout and labels are like this: - - main device (batter side): remote pitcher: - - MAN - PRO | [FAST BALL] [CHANGE UP] [CURVE] [SLIDER] - | OFF| - o o [STEAL DEFENSE] [KNUCKLER] - AM AUTO - - [BUNT] [BATTER] [STEAL] -*/ - -static INPUT_PORTS_START( ebball3 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Fast Ball") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Change Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Slider") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Curve") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_NAME("P2 Knuckler") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Batter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_NAME("P2 Steal Defense") - - PORT_START("IN.2") // R2 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // AUTO - PORT_CONFSETTING( 0x00, "2" ) // MAN - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Bunt") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, ebball3_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // AM - PORT_CONFSETTING( 0x01, "2" ) // PRO -INPUT_PORTS_END - -void ebball3_state::ebball3(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 340000); // see set_clock - m_maincpu->k().set(FUNC(ebball3_state::read_k)); - m_maincpu->r().set(FUNC(ebball3_state::write_r)); - m_maincpu->o().set(FUNC(ebball3_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10+2, 7); - m_display->set_segmask(3, 0x7f); - m_display->set_segmask(0xc00, 0x22); - config.set_default_layout(layout_ebball3); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebball3 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "6007_mp1204", 0x0000, 0x0800, CRC(987a29ba) SHA1(9481ae244152187d85349d1a08e439e798182938) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ebball3_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Space Battle - * TMS1000 EN-6004 MP0920 (die label 1000B, MP0920) - * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - The Japanese version was published by Gakken, same name. - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 1.1 20 = 2.3 30 = 5.2 - 1 = 0.0 11 = 1.2 21 = 3.0 31 = 5.3 - 2 = 0.1 12 = 1.3 22 = 3.1 32 = 6.0 - 3 = 0.2 13 = 1.4 23 = 3.2 33 = 6.1 - 4 = 0.3 14 = 1.5 24 = 3.3 34 = 6.2 - 5 = 0.4 15 = 1.6 25 = 4.0 35 = 7.0 - 6 = 0.5 16 = 1.7 26 = 4.1 36 = 7.1 - 7 = 0.6 17 = 2.0 27 = 4.2 - 8 = 0.7 18 = 2.1 28 = 5.0 - 9 = 1.0 19 = 2.2 29 = 5.1 - -***************************************************************************/ - -class esbattle_state : public hh_tms1k_state -{ -public: - esbattle_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void esbattle(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void esbattle_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void esbattle_state::write_r(u16 data) -{ - // R0,R1: input mux - m_inp_mux = data & 3; - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void esbattle_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 esbattle_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( esbattle ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual -INPUT_PORTS_END - -void esbattle_state::esbattle(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 450000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(esbattle_state::read_k)); - m_maincpu->r().set(FUNC(esbattle_state::write_r)); - m_maincpu->o().set(FUNC(esbattle_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x300, 0x7f); - config.set_default_layout(layout_esbattle); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( esbattle ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "en-6004_mp0920", 0x0000, 0x0400, CRC(7460c179) SHA1(be855054b4a98b05b34fd931d5c247c5c0f9b036) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_esbattle_output.pla", 0, 365, CRC(861b45a2) SHA1(a5a9dc9bef8adb761845ad548058b55e970517d3) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Blast It - * TMS1000 MP0230 (die label 1000B, MP0230) - * 3 7seg LEDs, 49 other LEDs (both under an overlay mask), 1-bit sound - -***************************************************************************/ - -class blastit_state : public hh_tms1k_state -{ -public: - blastit_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void blastit(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void blastit_state::update_display() -{ - m_display->matrix(m_r >> 1, m_o); -} - -void blastit_state::write_r(u16 data) -{ - // R3: input mux - m_inp_mux = data >> 3 & 1; - - // R0: speaker out - m_speaker->level_w(data & 1); - - // R1-R7: led select - // R8-R10: digit select - m_r = data; - update_display(); -} - -void blastit_state::write_o(u16 data) -{ - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 blastit_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( blastit ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x08, "1" ) // AM - PORT_CONFSETTING( 0x00, "2" ) // PRO -INPUT_PORTS_END - -void blastit_state::blastit(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=33pF - m_maincpu->k().set(FUNC(blastit_state::read_k)); - m_maincpu->r().set(FUNC(blastit_state::write_r)); - m_maincpu->o().set(FUNC(blastit_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x380, 0x7f); - m_display->set_bri_levels(0.01, 0.115); // ball/paddle is slightly brighter - config.set_default_layout(layout_blastit); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( blastit ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0230", 0x0000, 0x0400, CRC(1eb5f473) SHA1(76cd8c0e04368aa2150d428018643e1d0b9adda0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_blastit_output.pla", 0, 365, CRC(fa8081df) SHA1(99706d5ad58a76d47446576fac18964e602171c8) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Space Invader - * TMS1100 MP1211 (die label same) - * 3 7seg LEDs, LED matrix and overlay mask, 1-bit sound - - There are two versions of this game: the first release(this one) is on - TMS1100, the second more widespread release runs on a COP400. There are - also differences with the overlay mask. - -***************************************************************************/ - -class einvader_state : public hh_tms1k_state -{ -public: - einvader_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - void einvader(machine_config &config); - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); -}; - -void einvader_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void einvader_state::set_clock() -{ - // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz, - // but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed - // it up to around ~400kHz. - m_maincpu->set_unscaled_clock((m_inputs[0]->read() & 8) ? 400000 : 320000); -} - -void einvader_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void einvader_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R6: led select - // R7-R9: digit select - m_r = data; - update_display(); -} - -void einvader_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -// config - -static INPUT_PORTS_START( einvader ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, einvader_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void einvader_state::einvader(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 320000); // see set_clock - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(einvader_state::write_r)); - m_maincpu->o().set(FUNC(einvader_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(945, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x380, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // ufo/player explosion is brighter - config.set_default_layout(layout_einvader); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( einvader ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1211", 0x0000, 0x0800, CRC(b6efbe8e) SHA1(d7d54921dab22bb0c2956c896a5d5b56b6f64969) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) ) - - ROM_REGION( 45196, "mask", 0) - ROM_LOAD( "einvader.svg", 0, 45196, CRC(35a1c744) SHA1(6beb9767454b9bc8f2ccf9fee25e7be209eefd22) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Color Football 4 - * TMS1670 6009 MP7551 (die label MP7551) - * 9-digit cyan VFD display, 60 red and green LEDs behind mask, 1-bit sound - - Another version exist, one with a LED(red) 7seg display. - -***************************************************************************/ - -class efootb4_state : public hh_tms1k_state -{ -public: - efootb4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void efootb4(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void efootb4_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void efootb4_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R0-R9: led select - // R10-R15: digit select - m_r = data; - update_display(); -} - -void efootb4_state::write_o(u16 data) -{ - // O7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // O0-O6: led state - m_o = data; - update_display(); -} - -u8 efootb4_state::read_k() -{ - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( efootb4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY // 2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY // 3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY // 4 - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY // 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY // 2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY // 3 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY // 4 - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Run") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Run") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // amateur - PORT_CONFSETTING( 0x02, "2" ) // professional - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Status") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void efootb4_state::efootb4(machine_config &config) -{ - // basic machine hardware - TMS1670(config, m_maincpu, 400000); // approximation - RC osc. R=42K, C=47pF - m_maincpu->k().set(FUNC(efootb4_state::read_k)); - m_maincpu->r().set(FUNC(efootb4_state::write_r)); - m_maincpu->o().set(FUNC(efootb4_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1920, 904); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(16, 7); - m_display->set_segmask(0xfc00, 0x7f); - config.set_default_layout(layout_efootb4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( efootb4 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "6009_mp7551", 0x0000, 0x1000, CRC(54fa7244) SHA1(4d16bd825c4a2db76ca8a263c373ade15c20e270) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_efootb4_output.pla", 0, 557, CRC(5c87c753) SHA1(bde9d4aa1e57a718affd969475c0a1edcf60f444) ) - - ROM_REGION( 67472, "mask", 0) - ROM_LOAD( "efootb4.svg", 0, 67472, CRC(ba0abcda) SHA1(6066e4cbae5404e4db17fae0153808b044adc823) ) -ROM_END - - - - - -/*************************************************************************** - - Entex (Electronic) Basketball 2 - * TMS1100 6010 MP1218 (die label MP1218) - * 4 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - led translation table: led zz from game PCB = MAME y.x: - - 11 = 9.0 21 = 9.1 31 = 9.2 41 = 9.3 51 = 9.5 - 12 = 8.0 22 = 8.1 32 = 8.2 42 = 8.3 52 = 8.5 - 13 = 7.0 23 = 7.1 33 = 7.2 43 = 7.3 53 = 8.4 - 14 = 6.0 24 = 6.1 34 = 6.2 44 = 6.3 54 = 7.5 - 15 = 5.0 25 = 5.1 35 = 5.2 45 = 5.3 55 = 7.4 - 16 = 4.0 26 = 4.1 36 = 4.2 46 = 4.3 56 = 6.5 - - A = 9.4 - B = 6.4 - -***************************************************************************/ - -class ebaskb2_state : public hh_tms1k_state -{ -public: - ebaskb2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ebaskb2(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ebaskb2_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void ebaskb2_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R6-R9: input mux - m_inp_mux = data >> 6 & 0xf; - - // R0-R3: digit select - // R4-R9: led select - m_r = data; - update_display(); -} - -void ebaskb2_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data; - update_display(); -} - -u8 ebaskb2_state::read_k() -{ - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( ebaskb2 ) - PORT_START("IN.0") // R6 - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) // amateur - PORT_CONFSETTING( 0x00, "2" ) // professional - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) // Auto - PORT_CONFSETTING( 0x00, "2" ) // Manual - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - - PORT_START("IN.1") // R7 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Shoot") - - PORT_START("IN.2") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.3") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY -INPUT_PORTS_END - -void ebaskb2_state::ebaskb2(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 360000); // approximation - RC osc. R=33K, C=82pF - m_maincpu->k().set(FUNC(ebaskb2_state::read_k)); - m_maincpu->r().set(FUNC(ebaskb2_state::write_r)); - m_maincpu->o().set(FUNC(ebaskb2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0xf, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // ball carrier led is brighter - config.set_default_layout(layout_ebaskb2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ebaskb2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "6010_mp1218", 0x0000, 0x0800, CRC(0089ede8) SHA1(c8a79d5aca7e37b637a4d152150acba9f41aad96) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ebaskb2_output.pla", 0, 365, CRC(c18103ae) SHA1(5a9bb8e1d95a9f6919b05ff9471fa0a8014b8b81) ) -ROM_END - - - - - -/*************************************************************************** - - Entex Raise The Devil - * TMS1100 MP1221 (die label same) - * 4 7seg LEDs(rightmost one unused), and other LEDs behind bezel, 1-bit sound - - Entex Black Knight (licensed handheld version of Williams' pinball game) - * TMS1100 MP1296 (no decap) - * same hardware as Raise The Devil - - raisedvl led translation table: led zz from game PCB = MAME y.x: - (no led labels on ebknight PCB) - - 0 = - 10 = 4.4 20 = 5.3 30 = 9.5 40 = 9.2 - 1 = 3.0 11 = 4.5 21 = 5.4 31 = 8.5 41 = 9.3 - 2 = 3.1 12 = - 22 = - 32 = 6.5 42 = 9.0 - 3 = 3.2 13 = 5.0 23 = 6.0 33 = 7.4 43 = 9.1 - 4 = 3.3 14 = 5.1 24 = 6.1 34 = 7.0 - 5 = 3.4 15 = 5.2 25 = 6.2 35 = 7.1 - 6 = 4.0 16 = - 26 = 6.3 36 = 8.0 - 7 = 4.1 17 = 7.2 27 = 6.4 37 = 8.1 - 8 = 4.2 18 = 7.3 28 = 8.4 38 = 8.2 - 9 = 4.3 19 = - 29 = 9.4 39 = 8.3 - - NOTE!: MAME external artwork is required - -***************************************************************************/ - -class raisedvl_state : public hh_tms1k_state -{ -public: - raisedvl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void raisedvl(machine_config &config); - void ebknight(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void raisedvl_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void raisedvl_state::set_clock() -{ - // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills - // 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one. - // 0: R=47K -> ~350kHz - // 2,3: R=35K8 -> ~425kHz (combined) - // 4: R=32K -> ~465kHz (combined) - u8 inp = m_inputs[1]->read(); - m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000)); -} - -void raisedvl_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void raisedvl_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1: input mux - m_inp_mux = data & 3; - - // R0-R2: digit select - // R3-R9: led select - m_r = data; - update_display(); -} - -void raisedvl_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 raisedvl_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2) & 0xf; -} - -// config - -static INPUT_PORTS_START( raisedvl ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 (only bit 0) - PORT_CONFNAME( 0x31, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, raisedvl_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x10, "2" ) - PORT_CONFSETTING( 0x11, "3" ) - PORT_CONFSETTING( 0x21, "4" ) -INPUT_PORTS_END - -void raisedvl_state::raisedvl(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // see set_clock - m_maincpu->k().set(FUNC(raisedvl_state::read_k)); - m_maincpu->r().set(FUNC(raisedvl_state::write_r)); - m_maincpu->o().set(FUNC(raisedvl_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_raisedvl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void raisedvl_state::ebknight(machine_config &config) -{ - raisedvl(config); - config.set_default_layout(layout_ebknight); -} - -// roms - -ROM_START( raisedvl ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1221", 0x0000, 0x0800, CRC(782791cc) SHA1(214249406fcaf44efc6350022bd534e59ec69c88) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_raisedvl_output.pla", 0, 365, CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) -ROM_END - -ROM_START( ebknight ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1296", 0x0000, 0x0800, CRC(bc57a46a) SHA1(f60843779f49a8bd28291df3390086e54b9e3f40) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified, taken from raisedvl - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ebknight_output.pla", 0, 365, BAD_DUMP CRC(00db663b) SHA1(6eae12503364cfb1f863df0e57970d3e766ec165) ) // " -ROM_END - - - - - -/*************************************************************************** - - Entex Musical Marvin - * TMS1100 MP1228 (no decap) - * 1 7seg LED, 8 other leds, 1-bit sound with volume decay - * dials for speed, tone (volume decay), volume (also off/on switch) - - The design patent was assigned to Hanzawa (Japan), so it's probably - manufactured by them. - -***************************************************************************/ - -class mmarvin_state : public hh_tms1k_state -{ -public: - mmarvin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_volume(*this, "volume"), - m_speed_timer(*this, "speed") - { } - - void mmarvin(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_volume; - required_device m_speed_timer; - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; -}; - -void mmarvin_state::machine_start() -{ - hh_tms1k_state::machine_start(); - save_item(NAME(m_speaker_volume)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(mmarvin_state::speaker_decay_sim) -{ - m_volume->flt_volume_set_volume(m_speaker_volume); - - // volume decays when speaker is off, decay scale is determined by tone dial - double step = (1.01 - 1.003) / 255.0; // approximation - m_speaker_volume /= 1.01 - (double)(u8)m_inputs[5]->read() * step; -} - -void mmarvin_state::update_display() -{ - u8 digit = bitswap<7>(m_o,6,2,1,0,5,4,3); // 7seg is upside-down - m_display->matrix(m_r, (m_o << 1 & 0x100) | (m_r & 0x80) | digit); -} - -void mmarvin_state::write_r(u16 data) -{ - // R2-R5: input mux - m_inp_mux = data >> 2 & 0xf; - - // R6: trigger speed dial timer - if (m_r & 0x40 && ~data & 0x40) - { - double step = (2100 - 130) / 255.0; // duration range is around 0.13s to 2.1s - m_speed_timer->adjust(attotime::from_msec(2100 - (u8)m_inputs[4]->read() * step)); - } - - // R10: speaker out - m_speaker->level_w(BIT(m_r, 10)); - - // R9: trigger speaker on - if (m_r & 0x200 && ~data & 0x200) - m_volume->flt_volume_set_volume(m_speaker_volume = 1.0); - - // R0,R1: digit/led select - // R7: digit DP - m_r = data; - update_display(); -} - -void mmarvin_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 mmarvin_state::read_k() -{ - // K1-K4: multiplexed inputs - // K8: speed dial state - return (read_inputs(4) & 7) | (m_speed_timer->enabled() ? 0 : 8); -} - -// config - -static INPUT_PORTS_START( mmarvin ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Mode") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button Do 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button Re") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button Mi") - - PORT_START("IN.2") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button Fa") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Button Sol") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Button La") - - PORT_START("IN.3") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Button Ti") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Button Do 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Space") - - PORT_START("IN.4") - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(1) PORT_NAME("Speed Dial") - - PORT_START("IN.5") - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(15) PORT_KEYDELTA(15) PORT_CENTERDELTA(0) PORT_PLAYER(2) PORT_NAME("Tone Dial") -INPUT_PORTS_END - -void mmarvin_state::mmarvin(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=51K, C=47pF - m_maincpu->k().set(FUNC(mmarvin_state::read_k)); - m_maincpu->r().set(FUNC(mmarvin_state::write_r)); - m_maincpu->o().set(FUNC(mmarvin_state::write_o)); - - TIMER(config, "speed").configure_generic(nullptr); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2, 9); - m_display->set_segmask(1, 0xff); - config.set_default_layout(layout_mmarvin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(mmarvin_state::speaker_decay_sim), attotime::from_msec(1)); -} - -// roms - -ROM_START( mmarvin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1228", 0x0000, 0x0800, CRC(68ce3ab6) SHA1(15f7fb3f438116bf6128f11c981bdc0852d5a4ec) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_mmarvin_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_mmarvin_output.bin", 0, 0x20, CRC(a274951f) SHA1(7e91ddd42c132942a32351649eaf1107b5b0285c) ) -ROM_END - - - - - -/*************************************************************************** - - Fonas 2 Player Baseball - * PCB label CA-014 (probably Cassia) - * TMS1000NLL MP0154 (die label 1000B, MP0154) - * 4 7seg LEDs, 37 other LEDs, 1-bit sound - - known releases: - - World: 2 Player Baseball, published by Fonas - - USA: 2 Player Baseball, published by Sears - - Canada: 2 Player Baseball, published by Talbot Electronics - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 2.2 20 = 4.0 30 = 4.4 - 1 = 2.3 11 = 3.3 21 = 2.7 31 = 3.7 - 2 = 0.4 12 = 1.2 22 = 0.0 32 = 4.3 - 3 = 3.2 13 = 2.4 23 = 4.1 33 = 4.6 - 4 = 0.5 14 = 1.0 24 = 3.1 34 = 3.5 - 5 = 0.3 15 = 2.1 25 = 0.2 35 = 4.5 - 6 = 3.4 16 = 1.1 26 = 0.1 - 7 = 1.3 17 = 4.7 27 = 4.2 - 8 = 1.4 18 = 2.0 28 = 3.0 - 9 = 1.7 19 = 0.7 29 = 1.5 - -***************************************************************************/ - -class f2pbball_state : public hh_tms1k_state -{ -public: - f2pbball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void f2pbball(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void f2pbball_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void f2pbball_state::write_r(u16 data) -{ - // R4,R9,R10: input mux - m_inp_mux = (data >> 4 & 1) | (data >> 8 & 6); - - // R9,R10(ANDed together): speaker out - m_speaker->level_w(data >> 10 & data >> 9 & 1); - - // R0-R4: led select - // R5-R8: digit select - m_r = data; - update_display(); -} - -void f2pbball_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = bitswap<8>(data,0,7,6,5,4,3,2,1); - update_display(); -} - -u8 f2pbball_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( f2pbball ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pick Off") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0c, 0x04, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "Practice" ) // middle switch - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.1") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pitch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Swing") - - PORT_START("IN.2") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast") - - PORT_START("RESET") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, reset_button, 0) -INPUT_PORTS_END - -void f2pbball_state::f2pbball(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 325000); // approximation - RC osc. R=51K, C=39pF - m_maincpu->k().set(FUNC(f2pbball_state::read_k)); - m_maincpu->r().set(FUNC(f2pbball_state::write_r)); - m_maincpu->o().set(FUNC(f2pbball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1e0, 0x7f); - config.set_default_layout(layout_f2pbball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( f2pbball ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) ) -ROM_END - - - - - -/*************************************************************************** - - Fonas 3 in 1: Football, Basketball, Soccer - * PCB label HP-801 - * TMS1100NLL MP1185 - * 4 7seg LEDs, 40 other LEDs, 1-bit sound - - It's not known if this game has an official title. The current one is - taken from the handheld front side. - MAME external artwork is needed for the switchable overlays. - -***************************************************************************/ - -class f3in1_state : public hh_tms1k_state -{ -public: - f3in1_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void f3in1(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void f3in1_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void f3in1_state::set_clock() -{ - // MCU clock is from an RC circuit where C=47pF, R=39K(PROF) or 56K(REG) - m_maincpu->set_unscaled_clock((m_inputs[4]->read() & 1) ? 400000 : 300000); -} - -void f3in1_state::update_display() -{ - m_display->matrix(m_r & ~0x20, m_o); -} - -void f3in1_state::write_r(u16 data) -{ - // R0-R2,R4: input mux - m_inp_mux = (data & 7) | (data >> 1 & 8); - - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R4: led select - // R6-R9: digit select - m_r = data; - update_display(); -} - -void f3in1_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 f3in1_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( f3in1 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("K Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("D Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0e, 0x02, "Game Select" ) - PORT_CONFSETTING( 0x02, "Football" ) - PORT_CONFSETTING( 0x04, "Basketball" ) - PORT_CONFSETTING( 0x08, "Soccer" ) - - PORT_START("IN.4") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, f3in1_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "1" ) // REG - PORT_CONFSETTING( 0x01, "2" ) // PROF -INPUT_PORTS_END - -void f3in1_state::f3in1(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // see set_clock - m_maincpu->k().set(FUNC(f3in1_state::read_k)); - m_maincpu->r().set(FUNC(f3in1_state::write_r)); - m_maincpu->o().set(FUNC(f3in1_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3c0, 0x7f); - m_display->set_bri_levels(0.003, 0.05); // player led is brighter - config.set_default_layout(layout_f3in1); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( f3in1 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1185", 0x0000, 0x0800, CRC(53f7b28d) SHA1(2249890e3a259095193b4331ca88c29ccd81eefe) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_f3in1_output.pla", 0, 365, CRC(51d947bc) SHA1(f766397d84f038be96e83d40989195c98ddcb1d9) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Poker - * PCB label POKER. gakken - * TMS1370 MP2105 (die label same) - * 11-digit cyan VFD display Itron FG1114B, oscillator sound - - known releases: - - Japan: Poker, published by Gakken - - USA: Electronic Poker, published by Entex - -***************************************************************************/ - -class gpoker_state : public hh_tms1k_state -{ -public: - gpoker_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_beeper(*this, "beeper") - { } - - void gpoker(machine_config &config); - -protected: - required_device m_beeper; - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void gpoker_state::update_display() -{ - u16 segs = bitswap<16>(m_o, 15,14,7,12,11,10,9,8,6,6,5,4,3,2,1,0) & 0x20ff; - m_display->matrix(m_r & 0x7ff, segs | (m_r >> 3 & 0xf00)); -} - -void gpoker_state::write_r(u16 data) -{ - // R15: enable beeper - m_beeper->set_state(data >> 15 & 1); - - // R0-R6: input mux - m_inp_mux = data & 0x7f; - - // R0-R10: select digit - // R11-R14: card symbols - m_r = data; - update_display(); -} - -void gpoker_state::write_o(u16 data) -{ - // O0-O7: digit segments A-G,H - m_o = data; - update_display(); -} - -u8 gpoker_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -/* physical button layout and labels are like this: - - [7] [8] [9] [DL] | (on/off switch) - [4] [5] [6] [BT] - [1] [2] [3] [CA] [CE] - [0] [GO] [T] [AC] -*/ - -static INPUT_PORTS_START( gpoker ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // 9/DL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x06, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear All") // AC - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Call") // CA - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Bet") // BT - - PORT_START("FAKE") // 9/DL are electronically the same button - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL -INPUT_PORTS_END - -void gpoker_state::gpoker(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(gpoker_state::read_k)); - m_maincpu->r().set(FUNC(gpoker_state::write_r)); - m_maincpu->o().set(FUNC(gpoker_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 14); - m_display->set_segmask(0x7ff, 0x20ff); // 7seg + bottom-right diagonal - config.set_default_layout(layout_gpoker); - - // sound hardware - SPEAKER(config, "mono").front_center(); - BEEP(config, m_beeper, 2400); // astable multivibrator - C1 and C2 are 0.003uF, R1 and R4 are 1K, R2 and R3 are 100K - m_beeper->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( gpoker ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_gpoker_output.pla", 0, 365, CRC(f7e2d812) SHA1(cc3abd89afb1d2145dc47636553ccd0ba7de70d9) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Jackpot: Gin Rummy & Black Jack - * PCB label gakken - * TMS1670 MPF553 (die label same) - * 11-digit cyan VFD display Itron FG1114B, oscillator sound - - known releases: - - Japan: Jackpot(?), published by Gakken - - USA: Electronic Jackpot: Gin Rummy & Black Jack, published by Entex - -***************************************************************************/ - -class gjackpot_state : public gpoker_state -{ -public: - gjackpot_state(const machine_config &mconfig, device_type type, const char *tag) : - gpoker_state(mconfig, type, tag) - { } - - void gjackpot(machine_config &config); - -private: - virtual void write_r(u16 data) override; -}; - -// handlers - -void gjackpot_state::write_r(u16 data) -{ - // same as gpoker, only input mux msb is R10 instead of R6 - gpoker_state::write_r(data); - m_inp_mux = (data & 0x3f) | (data >> 4 & 0x40); -} - -// config - -/* physical button layout and labels are like this: - (note: on dual-function buttons, upper label=Gin, lower label=Black Jack) - - BJ --o GIN - OFF - [7] [8] [9] [DL] - - [4] [5] [6] [ [KN - DB] SP] - [1] [2] [3] [DS] [DR] - BT] HT] - [10/0] [T] [MD [CH [AC] - GO] ST] -*/ - -static INPUT_PORTS_START( gjackpot ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("10/0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Draw/Hit") // DR/HT - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Deal") // DL - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Knock/Split") // KN/SP - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Total") // T - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Display/Bet") // DS/BT - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Meld/Go") // MD/GO - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Double") // DB - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Change/Stand") // CH/ST - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Entry") // CE - PORT_BIT( 0x0a, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R10 - PORT_CONFNAME( 0x06, 0x04, "Game Select" ) - PORT_CONFSETTING( 0x04, "Gin Rummy" ) - PORT_CONFSETTING( 0x02, "Black Jack" ) - PORT_BIT( 0x09, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void gjackpot_state::gjackpot(machine_config &config) -{ - gpoker(config); - - // basic machine hardware - TMS1670(config.replace(), m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(gjackpot_state::read_k)); - m_maincpu->r().set(FUNC(gjackpot_state::write_r)); - m_maincpu->o().set(FUNC(gjackpot_state::write_o)); - - config.set_default_layout(layout_gjackpot); -} - -// roms - -ROM_START( gjackpot ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mpf553", 0x0000, 0x1000, CRC(f45fd008) SHA1(8d5d6407a8a031a833ceedfb931f5c9d2725ecd0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_gjackpot_output.pla", 0, 557, CRC(50e471a7) SHA1(9d862cb9f51a563882b62662c5bfe61b52e3df00) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Invader - * PCB label GAKKEN, INVADER, KS-00779 - * TMS1370 MP2110 - * cyan VFD display Itron? CP5008A, 1-bit sound - - known releases: - - World: Invader, published by Gakken - - USA(1): Galaxy Invader, published by CGL - - USA(2): Fire Away, published by Tandy - - USA(3): Electron Blaster, published by Vanity Fair - - On the real thing, the joystick is "sticky"(it doesn't autocenter when you let go). - There's also a version with a cyan/red VFD, possibly the same ROM. - -***************************************************************************/ - -class ginv_state : public hh_tms1k_state -{ -public: - ginv_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ginv(machine_config &config); - -private: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ginv_state::write_r(u16 data) -{ - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R15: speaker out - m_speaker->level_w(data >> 15 & 1); - - // R0-R8: VFD grid - // R11-R14: VFD plate - m_grid = data & 0x1ff; - m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); - update_display(); -} - -void ginv_state::write_o(u16 data) -{ - // O0-O7: VFD plate - m_plate = (m_plate & ~0xff) | data; - update_display(); -} - -u8 ginv_state::read_k() -{ - // K1-K4: multiplexed inputs (K8 is fire button) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -static INPUT_PORTS_START( ginv ) - PORT_START("IN.0") // R9 - PORT_CONFNAME( 0x07, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.1", 0x05, EQUALS, 0x00) // joystick centered - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) -INPUT_PORTS_END - -void ginv_state::ginv(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ginv_state::read_k)); - m_maincpu->r().set(FUNC(ginv_state::write_r)); - m_maincpu->o().set(FUNC(ginv_state::write_o)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(236, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ginv ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2110", 0x0000, 0x0800, CRC(f09c5588) SHA1(06eb8ed512eaf5367ea30c2b633219e105ddfd14) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ginv_output.pla", 0, 365, CRC(6e33a24e) SHA1(cdf7ecf12ddd3863e6301e20fe80f9737db429e5) ) - - ROM_REGION( 142959, "screen", 0) - ROM_LOAD( "ginv.svg", 0, 142959, CRC(b0dc9bac) SHA1(18f8cc51a432d14f08fdf766275222f3ed184d89) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Invader 1000 - * TMS1370 MP2139 (die label 1170 MP2139) - * cyan/red VFD display Futaba DM-25Z 2D, 1-bit sound - - known releases: - - World: Galaxy Invader 1000, published by Gakken - - Japan: Invader 1000, published by Gakken - - USA(1): Galaxy Invader 1000, published by CGL - - USA(2): Cosmic 1000 Fire Away, published by Tandy - -***************************************************************************/ - -class ginv1000_state : public hh_tms1k_state -{ -public: - ginv1000_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ginv1000(machine_config &config); - -private: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv1000_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7); - u16 plate = bitswap<16>(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0); - m_display->matrix(grid, plate); -} - -void ginv1000_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R8,R15: input mux - m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2); - - // R1-R10: VFD grid - // R11-R14: VFD plate - m_grid = data >> 1 & 0x3ff; - m_plate = (m_plate & 0xff) | (data >> 3 & 0xf00); - update_display(); -} - -void ginv1000_state::write_o(u16 data) -{ - // O0-O7: VFD plate - m_plate = (m_plate & ~0xff) | data; - update_display(); -} - -u8 ginv1000_state::read_k() -{ - // K1,K2: multiplexed inputs (K8 is fire button) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -static INPUT_PORTS_START( ginv1000 ) - PORT_START("IN.0") // R8 - PORT_CONFNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFSETTING( 0x02, "3" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R15 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) -INPUT_PORTS_END - -void ginv1000_state::ginv1000(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(ginv1000_state::read_k)); - m_maincpu->r().set(FUNC(ginv1000_state::write_r)); - m_maincpu->o().set(FUNC(ginv1000_state::write_o)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(226, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ginv1000 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp2139", 0x0000, 0x0800, CRC(036eab37) SHA1(0795878ad89296f7a6a0314c6e4db23c1cc3673e) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ginv1000_output.pla", 0, 365, CRC(b0a5dc41) SHA1(d94746ec48661998173e7f60ccc7c96e56b3484e) ) - - ROM_REGION( 227224, "screen", 0) - ROM_LOAD( "ginv1000.svg", 0, 227224, CRC(f220711a) SHA1(729ad85fb9d9853a77c45b5ed072f10ede7649c4) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken Invader 2000 - * TMS1370(28 pins) MP1604 (die label 1370A MP1604) - * TMS1024 I/O expander - * cyan/red/green VFD display, 1-bit sound - - known releases: - - World: Invader 2000, published by Gakken - - USA(1): Galaxy Invader 10000, published by CGL - - USA(2): Cosmic 3000 Fire Away, published by Tandy - -***************************************************************************/ - -class ginv2000_state : public hh_tms1k_state -{ -public: - ginv2000_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_expander(*this, "expander") - { } - - void ginv2000(machine_config &config); - -private: - required_device m_expander; - void expander_w(offs_t offset, u8 data); - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ginv2000_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void ginv2000_state::expander_w(offs_t offset, u8 data) -{ - // TMS1024 port 4-7: VFD plate - int shift = (offset - tms1024_device::PORT4) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ginv2000_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R11,R12: input mux - m_inp_mux = data >> 11 & 3; - - // R11,R12: TMS1024 S1,S0 (S2 forced high) - // R13: TMS1024 STD - m_expander->write_s((data >> 12 & 1) | (data >> 10 & 2) | 4); - m_expander->write_std(data >> 13 & 1); - - // R1-R10: VFD grid - m_grid = data >> 1 & 0x3ff; - update_display(); -} - -void ginv2000_state::write_o(u16 data) -{ - // O4-O7: TMS1024 H1-H4 - m_expander->write_h(data >> 4 & 0xf); -} - -u8 ginv2000_state::read_k() -{ - // K1,K2: multiplexed inputs (K8 is fire button) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -static INPUT_PORTS_START( ginv2000 ) - PORT_START("IN.0") // R11 - PORT_CONFNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R12 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) -INPUT_PORTS_END - -void ginv2000_state::ginv2000(machine_config &config) -{ - // basic machine hardware - TMS1370(config, m_maincpu, 425000); // approximation - RC osc. R=36K, C=47pF - m_maincpu->k().set(FUNC(ginv2000_state::read_k)); - m_maincpu->r().set(FUNC(ginv2000_state::write_r)); - m_maincpu->o().set(FUNC(ginv2000_state::write_o)); - - TMS1024(config, m_expander).set_ms(1); // MS tied high - m_expander->write_port4_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port5_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port6_callback().set(FUNC(ginv2000_state::expander_w)); - m_expander->write_port7_callback().set(FUNC(ginv2000_state::expander_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(364, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ginv2000 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1604", 0x0000, 0x0800, CRC(f1646d0b) SHA1(65601931d81e3eef7bf22a08de5a146910ce8137) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_ginv2000_output.pla", 0, 365, CRC(520bb003) SHA1(1640ae54f8dcc257e0ad0cbe0281b38fcbd8da35) ) - - ROM_REGION( 374443, "screen", 0) - ROM_LOAD( "ginv2000.svg", 0, 374443, CRC(a4ce1e6d) SHA1(57d9ff05d634a8d495b9d544a2a959790cd10b6b) ) -ROM_END - - - - - -/*************************************************************************** - - Gakken FX-Micom R-165 - * TMS1100 MCU, label MP1312 (die label MP1312A) - * 1 7seg led, 6 other leds, 1-bit sound - - This is a simple educational home computer. Refer to the extensive manual - for more information. It was published later in the USA by Tandy(Radio Shack), - under their Science Fair series. Another 25 years later, Gakken re-released - the R-165 as GMC-4, obviously on modern hardware, but fully compatible. - - known releases: - - Japan: FX-Micom R-165, published by Gakken - - USA: Science Fair Microcomputer Trainer, published by Tandy. Of note is - the complete redesign of the case, adding more adjustable wiring - -***************************************************************************/ - -class fxmcr165_state : public hh_tms1k_state -{ -public: - fxmcr165_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void fxmcr165(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void fxmcr165_state::update_display() -{ - // 7seg digit from O0-O6 - m_display->write_row(0, bitswap<8>(m_o,7,2,6,5,4,3,1,0) & 0x7f); - - // leds from R4-R10 - m_display->write_row(1, m_r >> 4 & 0x7f); -} - -void fxmcr165_state::write_r(u16 data) -{ - // R0-R3: input mux low - m_inp_mux = (m_inp_mux & 0x10) | (data & 0xf); - - // R7: speaker out - m_speaker->level_w(data >> 7 & 1); - - // R4-R10: led data (direct) - m_r = data; - update_display(); -} - -void fxmcr165_state::write_o(u16 data) -{ - // O7: input mux high - m_inp_mux = (m_inp_mux & 0xf) | (data >> 3 & 0x10); - - // O0-O6: digit segments (direct) - m_o = data; - update_display(); -} - -u8 fxmcr165_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - [C] [D] [E] [F] [ADR SET] - [8] [9] [A] [B] [INCR] - [4] [5] [6] [7] [RUN] - [0] [1] [2] [3] [RESET] -*/ - -static INPUT_PORTS_START( fxmcr165 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("D") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") - - PORT_START("IN.4") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Reset") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Run") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Increment") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Address Set") -INPUT_PORTS_END - -void fxmcr165_state::fxmcr165(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->k().set(FUNC(fxmcr165_state::read_k)); - m_maincpu->r().set(FUNC(fxmcr165_state::write_r)); - m_maincpu->o().set(FUNC(fxmcr165_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1+1, 7); - m_display->set_segmask(1, 0x7f); - config.set_default_layout(layout_fxmcr165); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( fxmcr165 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1312", 0x0000, 0x0800, CRC(6efc8bcc) SHA1(ced8a02b472a3178073691d3dccc0f19f57428fd) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_fxmcr165_output.pla", 0, 365, CRC(ce656866) SHA1(40e1614f5afcc7572fda596e1be453d54e95af0c) ) -ROM_END - - - - - -/*************************************************************************** - - Ideal Electronic Detective - * TMS0980NLL MP6100A (die label 0980B-00) - * 10-digit 7seg LED display, 2-level sound - - hardware (and concept) is very similar to Parker Brothers Stop Thief - - This is an electronic board game. It requires game cards with suspect info, - and good old pen and paper to record game progress. To start the game, enter - difficulty(1-3), then number of players(1-4), then [ENTER]. Refer to the - manual for more information. - -***************************************************************************/ - -class elecdet_state : public hh_tms1k_state -{ -public: - elecdet_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void elecdet(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void elecdet_state::write_r(u16 data) -{ - // R7,R8: speaker out - m_speaker->level_w((m_o & 0x80) ? (data >> 7 & 3) : 0); - - // R0-R6: select digit - m_display->matrix(data, bitswap<8>(m_o,7,5,2,1,4,0,6,3)); -} - -void elecdet_state::write_o(u16 data) -{ - // O0,O1,O4,O6: input mux - m_inp_mux = (data & 3) | (data >> 2 & 4) | (data >> 3 & 8); - - // O0-O6: digit segments A-G - // O7: speaker on -> write_r - m_o = data; -} - -u8 elecdet_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[4]->read() | read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - [1] [2] [3] [SUSPECT] - [4] [5] [6] [PRIVATE QUESTION] - [7] [8] [9] [I ACCUSE] - [0] [ENTER] - [ON] [OFF] [END TURN] -*/ - -static INPUT_PORTS_START( elecdet ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Private Question") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("I Accuse") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.3") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Suspect") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.4") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("End Turn") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void elecdet_state::elecdet(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 425000); // approximation - m_maincpu->k().set(FUNC(elecdet_state::read_k)); - m_maincpu->r().set(FUNC(elecdet_state::write_r)); - m_maincpu->o().set(FUNC(elecdet_state::write_o)); - m_maincpu->power_off().set(FUNC(elecdet_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 7); - m_display->set_segmask(0x7f, 0x7f); - config.set_default_layout(layout_elecdet); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 0.5, 0.5, 1.0}; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( elecdet ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_elecdet_output.pla", 0, 352, CRC(5d12c24a) SHA1(e486802151a704c6273d4a8682c9c374d27d1e6d) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - Kenner Star Wars - Electronic Battle Command - * TMS1100 MCU, label MP3438A (die label 1100B, MP3438A) - * 4x4 LED grid display + 2 separate LEDs and 2-digit 7segs, 1-bit sound - - This is a small tabletop space-dogfighting game. To start the game, - press BASIC/INTER/ADV and enter P#(number of players), then - START TURN. Refer to the official manual for more information. - -***************************************************************************/ - -class starwbc_state : public hh_tms1k_state -{ -public: - starwbc_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void starwbc(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void starwbc_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void starwbc_state::write_r(u16 data) -{ - // R0,R1,R3,R5,R7: input mux - m_inp_mux = (data & 3) | (data >> 1 & 4) | (data >> 2 & 8) | (data >> 3 & 0x10); - - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0,R2,R4: led select - // R6,R8: digit select - m_r = data & 0x155; - update_display(); -} - -void starwbc_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = (data << 4 & 0xf0) | (data >> 4 & 0x0f); - update_display(); -} - -u8 starwbc_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - (reconnnaissance=yellow) (tactical reaction=green) - [MAGNA] [ENEMY] [EM] [BS] [SCR] - - [BASIC] [INTER] [START TURN] [END TURN] [MOVE] [FIRE] - [ADV] [P#] [<] [^] [>] [v] - (game=blue) (maneuvers=red) -*/ - -static INPUT_PORTS_START( starwbc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Basic Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Intermediate Game") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Advanced Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Player Number") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Start Turn") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("End Turn") - - PORT_START("IN.2") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Magna Scan") // only used in adv. game - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Enemy Scan") // only used in adv. game - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Screen Up") - - PORT_START("IN.3") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Evasive Maneuvers") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Battle Stations") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Down") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") -INPUT_PORTS_END - -void starwbc_state::starwbc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=51K, C=47pF - m_maincpu->k().set(FUNC(starwbc_state::read_k)); - m_maincpu->r().set(FUNC(starwbc_state::write_r)); - m_maincpu->o().set(FUNC(starwbc_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x140, 0x7f); - config.set_default_layout(layout_starwbc); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( starwbc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3438a", 0x0000, 0x0800, CRC(c12b7069) SHA1(d1f39c69a543c128023ba11cc6228bacdfab04de) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) -ROM_END - -ROM_START( starwbcp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "us4270755", 0x0000, 0x0800, BAD_DUMP CRC(fb3332f2) SHA1(a79ac81e239983cd699b7cfcc55f89b203b2c9ec) ) // from patent US4270755, may have errors - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_starwbc_output.pla", 0, 365, CRC(d358a76d) SHA1(06b60b207540e9b726439141acadea9aba718013) ) -ROM_END - - - - - -/*************************************************************************** - - Kenner Live Action Football - * TMS1100NLL MCU, label MP3489-N2 (die label 1100E, MP3489) - * 6-digit 7seg LED display, other LEDs under overlay, 1-bit sound - - The LEDs are inside reflective domes, with an overlay mask on top of that. - It is done with an SVG screen on MAME. In reality, the display is not as - sharp or as evenly lit as MAME suggests it to be. - - It has a 1-bit roller controller. Half of the axis connects to the input - (eg. 1 rising edge per full rotation), so there's no difference between - rotating left or right. - -***************************************************************************/ - -class liveafb_state : public hh_tms1k_state -{ -public: - liveafb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void liveafb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void liveafb_state::update_display() -{ - u8 d = (~m_r & 0x100) ? (m_r & 0x3f) : 0; // digit select - u8 l = (m_r & 0x100) ? (m_r & 0xf) : 0; // led select - m_display->matrix(d | l << 6 | BIT(m_r, 6) << 10 | BIT(m_r, 8, 3) << 11, m_o | (m_r << 4 & 0x300)); -} - -void liveafb_state::write_r(u16 data) -{ - // R0-R3: input mux - m_inp_mux = data & 0xf; - - // R7(+R8): speaker out - m_speaker->level_w(BIT(data, 7) & BIT(data, 8)); - - // R8: enable digit or led select - // R0-R3: led select - // R0-R5: digit select - // R4,R5: led data high - // R6,R8-R10: direct leds - m_r = data & ~0x80; - update_display(); -} - -void liveafb_state::write_o(u16 data) -{ - // O0-O7: led data low - m_o = data; - update_display(); -} - -u8 liveafb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( liveafb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("ROLLER", 0x7f, LESSTHAN, 0x40) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Tackle") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Punt") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Field Goal") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Skill / Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Action") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("ROLLER") - PORT_BIT( 0x7f, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) -INPUT_PORTS_END - -void liveafb_state::liveafb(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(liveafb_state::read_k)); - m_maincpu->r().set(FUNC(liveafb_state::write_r)); - m_maincpu->o().set(FUNC(liveafb_state::write_o)); - - // video hardware - screen_device &mask(SCREEN(config, "mask", SCREEN_TYPE_SVG)); - mask.set_refresh_hz(60); - mask.set_size(1834, 1080); - mask.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6+4+4, 8+2); - m_display->set_segmask(0x3f, 0x7f); - m_display->set_segmask(0x20, 0xff); // only one digit has DP - config.set_default_layout(layout_liveafb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( liveafb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3489", 0x0000, 0x0800, CRC(1fe05ab3) SHA1(a8d7dfed61a6397b7af1d3fcf17b26d5d917b4f0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_liveafb_output.pla", 0, 365, CRC(a7bc9384) SHA1(fab458de394eeddbf5ba0830853a915e51f909c6) ) - - ROM_REGION( 162058, "mask", 0) - ROM_LOAD( "liveafb.svg", 0, 162058, CRC(046078d0) SHA1(68a5775f4f9a1258c06b76839e1cfdab69b61920) ) -ROM_END - - - - - -/*************************************************************************** - - Kosmos Astro - * TMS1470NLHL MP1133 (die label TMS1400 MP1133) - * 9-digit 7seg VFD display + 8 LEDs(4 green, 4 yellow), no sound - - This is an astrological calculator, and also supports 4-function - calculations. Refer to the official manual on how to use this device. - -***************************************************************************/ - -class astro_state : public hh_tms1k_state -{ -public: - astro_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void astro(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void astro_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void astro_state::write_r(u16 data) -{ - // R0-R7: input mux - m_inp_mux = data & 0xff; - - // R0-R9: led select - m_r = data; - update_display(); -} - -void astro_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 astro_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -static INPUT_PORTS_START( astro ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE"/Sun") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY"/Mercury") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-/Venus") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+/Mars") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=/Astro") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("B1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("B2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, "Mode" ) - PORT_CONFSETTING( 0x00, "Calculator" ) - PORT_CONFSETTING( 0x08, "Astro" ) -INPUT_PORTS_END - -void astro_state::astro(machine_config &config) -{ - // basic machine hardware - TMS1470(config, m_maincpu, 450000); // approximation - RC osc. R=4.7K, C=33pF - m_maincpu->k().set(FUNC(astro_state::read_k)); - m_maincpu->r().set(FUNC(astro_state::write_r)); - m_maincpu->o().set(FUNC(astro_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3ff, 0xff); - config.set_default_layout(layout_astro); - - // no sound! -} - -// roms - -ROM_START( astro ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp1133", 0x0000, 0x1000, CRC(bc21109c) SHA1(05a433cce587d5c0c2d28b5fda5f0853ea6726bf) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_astro_output.pla", 0, 557, CRC(eb08957e) SHA1(62ae0d13a1eaafb34f1b27d7df51441b400ccd56) ) -ROM_END - - - - - -/*************************************************************************** - - Marx Series 300 Electronic Bowling Game - * TMS1100NLL MP3403 DBS 7836 SINGAPORE (no decap) - * 4*SN75492 quad segment driver, 2*SN74259 8-line demultiplexer, - 2*CD4043 quad r/s input latch - * 5 7seg LEDs, 15 lamps(10 lamps projected to bowling pins reflection), - 1bit-sound with crude volume control - * edge connector to sensors(switches trigger when ball rolls over) - and other inputs - - lamp translation table: SN74259.u5(mux 1) goes to MAME output 5.x, - SN74259.u6(mux 2) goes to MAME output 6.*. u1-u3 are SN75492 ICs, - where other: u1 A2 is N/C, u3 A1 is from O2 and goes to digits seg C. - - u5 Q0 -> u1 A4 -> L2 (pin #2) u6 Q0 -> u3 A4 -> L1 (pin #1) - u5 Q1 -> u1 A5 -> L4 (pin #4) u6 Q1 -> u3 A5 -> L5 (pin #5) - u5 Q2 -> u1 A6 -> L7 (pin #7) u6 Q2 -> u2 A3 -> L11 (player 1) - u5 Q3 -> u1 A1 -> L8 (pin #8) u6 Q3 -> u2 A2 -> L12 (player 2) - u5 Q4 -> u3 A2 -> L3 (pin #3) u6 Q4 -> u2 A1 -> L15 (?) - u5 Q5 -> u2 A6 -> L6 (pin #6) u6 Q5 -> u3 A6 -> L14 (?) - u5 Q6 -> u2 A5 -> L10 (pin #10) u6 Q6 -> u1 A3 -> L13 (spare) - u5 Q7 -> u2 A4 -> L9 (pin #9) u6 Q7 -> u3 A3 -> digit 4 B+C - -***************************************************************************/ - -class elecbowl_state : public hh_tms1k_state -{ -public: - elecbowl_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void elecbowl(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void elecbowl_state::update_display() -{ - // standard 7segs - m_display->matrix_partial(0, 4, m_r >> 4, m_o); - - // lamp muxes - u8 sel = m_o & 7; - u8 state = m_r >> 1 & 1; - if (~m_r & 1) - m_display->write_element(5, sel, state); - if (~m_r & 4) - m_display->write_element(6, sel, state); - - // digit 4 is from mux2 Q7 - m_display->write_row(4, m_display->read_element(6, 7) ? 6 : 0); -} - -void elecbowl_state::write_r(u16 data) -{ - // R5-R7,R10: input mux - m_inp_mux = (data >> 5 & 7) | (data >> 7 & 8); - - // R9: speaker out - // R3,R8: speaker volume.. - m_speaker->level_w(data >> 9 & 1); - - // R4-R7: select digit - // R0,R2: lamp mux1,2 _enable - // R1: lamp muxes state - m_r = data; - update_display(); -} - -void elecbowl_state::write_o(u16 data) -{ - //if (data & 0x80) printf("%X ",data&0x7f); - - // O0-O2: lamp muxes select - // O0-O6: digit segments A-G - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 elecbowl_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( elecbowl ) - PORT_START("IN.0") // R5 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) - - PORT_START("IN.1") // R6 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) // reset/test? - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) // reset/test? - - PORT_START("IN.2") // R7 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) - - PORT_START("IN.3") // R10 - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // 2 players sw? -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 elecbowl_output_pla[0x20] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, // 0-9 - 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, // ? - 0, 1, 2, 3, 4, 5, 6, 7, // lamp muxes select - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f // ? -}; - -void elecbowl_state::elecbowl(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->set_output_pla(elecbowl_output_pla); - m_maincpu->k().set(FUNC(elecbowl_state::read_k)); - m_maincpu->r().set(FUNC(elecbowl_state::write_r)); - m_maincpu->o().set(FUNC(elecbowl_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7, 8); - m_display->set_segmask(0xf, 0x7f); - m_display->set_segmask(0x10, 0x06); // 1 - config.set_default_layout(layout_elecbowl); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( elecbowl ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3403.u9", 0x0000, 0x0800, CRC(9eabaa7d) SHA1(b1f54587ed7f2bbf3a5d49075c807296384c2b06) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, BAD_DUMP CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_elecbowl_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Thoroughbred Horse Race Analyzer - * PCB label 1670-4619D - * TMS1100NLL MP3491-N2 (die label 1100E MP3491) - * HLCD0569, 67-segment LCD panel, no sound - - This handheld is not a toy, read the manual for more information. In short, - it is a device for predicting the winning chance of a gambling horserace. - - It was rereleased in 1994 in China/Canada by AHTI(Advanced Handicapping - Technologies, Inc.), on a Hitachi HD613901. - -***************************************************************************/ - -class horseran_state : public hh_tms1k_state -{ -public: - horseran_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_lcd(*this, "lcd") - { } - - void horseran(machine_config &config); - -private: - required_device m_lcd; - - void lcd_output_w(offs_t offset, u32 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void horseran_state::lcd_output_w(offs_t offset, u32 data) -{ - // only 3 rows used - if (offset > 2) - return; - - // update lcd segments - m_display->matrix_partial(0, 3, 1 << offset, data); - - // col5-11 and col13-19 are 7segs - for (int i = 0; i < 2; i++) - m_display->write_row(3 + (offset << 1 | i), bitswap<8>(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f); -} - -void horseran_state::write_r(u16 data) -{ - // R0: HLCD0569 clock - // R1: HLCD0569 data in - // R2: HLCD0569 _CS - m_lcd->cs_w(data >> 2 & 1); - m_lcd->data_w(data >> 1 & 1); - m_lcd->clock_w(data & 1); - - // R3-R10: input mux - m_inp_mux = data >> 3 & 0xff; -} - -u8 horseran_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(8); -} - -// config - -/* physical button layout and labels are like this: - - [PURSE] [DIST.] [P. POSN.] [DAYS] [R.S.L.] [7] [8] [9] - [RACES] [WINS] [PLACES] [SHOWS] [EARNINGS] [4] [5] [6] - [DISTANCE] [L.E.B. 1st] [L.E.B. 2nd] [L.E.B. 3rd] [FIN. POSN.] [1] [2] [3] - [L.E.B. Fin] [SPD. RTG.] [SPD. RTG.] [ANALYZE] [NEXT] [C/H] [C/E] [0] - - R.S.L. = Races Since (Last) Layoff - L.E.B. = Last Race / Lengths Back -*/ - -static INPUT_PORTS_START( horseran ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Next") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Final Position") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Earnings") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("R.S.L.") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Analyze") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("L.E.B. 3rd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Shows") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Days") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Speed Rating (right)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("L.E.B. 2nd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Places") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Post Position") - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Speed Rating (left)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("L.E.B. 1st") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wins") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Distance (L.E.B.)") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("L.E.B. Finish") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Distance") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Races") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Purse") - - PORT_START("IN.5") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.6") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("C/E") // Clear Entry - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.7") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("C/H") // Clear Horse Information - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") -INPUT_PORTS_END - -void horseran_state::horseran(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF - m_maincpu->k().set(FUNC(horseran_state::read_k)); - m_maincpu->r().set(FUNC(horseran_state::write_r)); - - // video hardware - HLCD0569(config, m_lcd, 1100); // C=0.022uF - m_lcd->write_cols().set(FUNC(horseran_state::lcd_output_w)); - - PWM_DISPLAY(config, m_display).set_size(3+6, 24); - m_display->set_segmask(0x3f<<3, 0x7f); - config.set_default_layout(layout_horseran); - - // no sound! -} - -// roms - -ROM_START( horseran ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Dungeons & Dragons - Computer Labyrinth Game - * TMS1100 M34012-N2LL (die label M34012) - * 72 buttons, no LEDs, 1-bit sound - - This is an electronic board game. It requires markers and wall pieces to play. - Refer to the official manual for more information. - -***************************************************************************/ - -class mdndclab_state : public hh_tms1k_state -{ -public: - mdndclab_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void mdndclab(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void mdndclab_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R9: input mux part - m_inp_mux = (m_inp_mux & 0xff) | (data << 8 & 0x3ff00); -} - -void mdndclab_state::write_o(u16 data) -{ - // O0-O7: input mux part - m_inp_mux = (m_inp_mux & ~0xff) | data; -} - -u8 mdndclab_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(18); -} - -// config - -static INPUT_PORTS_START( mdndclab ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.6") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.7") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.8") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Wall / Door") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Illegal Move / Warrior Moves") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Warrior 1 / Winner") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Warrior 2 / Treasure") - - PORT_START("IN.9") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.10") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.11") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.12") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.13") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.14") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.15") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.16") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Board Sensor") - - PORT_START("IN.17") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Switch Key") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Next Turn / Level 1/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Dragon Flying / Defeat Tune") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Dragon Attacks / Dragon Wakes") -INPUT_PORTS_END - -void mdndclab_state::mdndclab(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 475000); // approximation - RC osc. R=27K, C=100pF - m_maincpu->k().set(FUNC(mdndclab_state::read_k)); - m_maincpu->r().set(FUNC(mdndclab_state::write_r)); - m_maincpu->o().set(FUNC(mdndclab_state::write_o)); - - config.set_default_layout(layout_mdndclab); // playing board - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mdndclab ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_mdndclab_output.pla", 0, 365, CRC(592b40ba) SHA1(63a2531278a665ace54c541101e052eb84413511) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Comp IV - * TMC0904NL CP0904A (die label 4A0970D-04A) - * 10 LEDs behind bezel, no sound - - This is small tabletop Mastermind game; a code-breaking game where the player - needs to find out the correct sequence of colours (numbers in our case). - Press the R key to start, followed by a set of unique numbers and E. - Refer to the official manual for more information. - - known releases: - - USA: Comp IV (two versions, different case), published by MB - - Europe: Logic 5, published by MB - - Japan: Pythaligoras, published by Takara - -***************************************************************************/ - -class comp4_state : public hh_tms1k_state -{ -public: - comp4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void comp4(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void comp4_state::write_r(u16 data) -{ - // leds: - // R4 R9 - // R10! R8 - // R2 R7 - // R1 R6 - // R0 R5 - m_display->matrix(m_o, data); -} - -void comp4_state::write_o(u16 data) -{ - // O1-O3: input mux - m_inp_mux = data >> 1 & 7; - - // O0: leds common - // other bits: N/C - m_o = data; -} - -u8 comp4_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( comp4 ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("R") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("E") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") -INPUT_PORTS_END - -void comp4_state::comp4(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(comp4_state::read_k)); - m_maincpu->r().set(FUNC(comp4_state::write_r)); - m_maincpu->o().set(FUNC(comp4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_comp4); - - // no sound! -} - -// roms - -ROM_START( comp4 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0904nl_cp0904a", 0x0000, 0x0400, CRC(6233ee1b) SHA1(738e109b38c97804b4ec52bed80b00a8634ad453) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_comp4_micro.pla", 0, 860, CRC(ee9d7d9e) SHA1(25484e18f6a07f7cdb21a07220e2f2a82fadfe7b) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_comp4_output.pla", 0, 352, CRC(144ce2d5) SHA1(459b92ad62421932df61b7e3965f1821f9636a2c) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_comp4_segment.pla", 0, 157, CRC(73426b07) SHA1(311be3f95a97936b6d1a4dcfa7746da26318ce54) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1977 version, model 4750A) - * PCB label 4750A - * TMS1000NL MP3201 (die label 1000C, MP3201) - * LM324N, MC14016CP/TP4016AN, NE555P, discrete sound - * 4 sliding buttons, light bulb - - This is a 2-player electronic board game. It still needs game pieces like the - original Battleship board game. - - It went through at least 5 hardware revisions (not counting Talking Battleship): - 1977: model 4750A, TMS1000 discrete sound, see notes above - 1977: model 4750B, TMS1000 SN76477 sound, see notes at bshipb (driver below this) - 1979: model 4750C: cost-reduced single-chip design, lesser quality game board. - The chip is assumed to be custom, no MCU: 28-pin DIP, label 4750, SCUS 0462 - 1982: similar custom single-chip hardware, chip label MB4750 SCUS 0562 - 1982: back to MCU, COP420 instead of choosing TI, emulated in hh_cop400.cpp - -***************************************************************************/ - -class bship_state : public hh_tms1k_state -{ -public: - bship_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void bship(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bship_state::write_r(u16 data) -{ - // R0-R10: input mux - m_inp_mux = data; -} - -void bship_state::write_o(u16 data) -{ - // O4: explosion light bulb - m_display->matrix(1, data >> 4 & 1); - - // other: sound -} - -u8 bship_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[11]->read() | read_inputs(11); -} - -// config - -static INPUT_PORTS_START( bship ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 A") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 A") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P1 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("P1 B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 B") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P1 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("P1 C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 C") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P1 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P1 D") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 D") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P1 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P1 E") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 E") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P1 6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("P1 F") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 F") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P1 7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("P1 G") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 G") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P1 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("P1 H") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 H") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P1 9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 I") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 I") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P1 10") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 J") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 J") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P1 Fire") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_TOGGLE PORT_CODE(KEYCODE_F1) PORT_NAME("Load/Go") // switch - - PORT_START("IN.11") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("P1 Clear Memory") // CM - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 Clear Last Entry") // CLE - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Memory") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P2 Clear Last Entry") -INPUT_PORTS_END - -void bship_state::bship(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set(FUNC(bship_state::read_k)); - m_maincpu->r().set(FUNC(bship_state::write_r)); - m_maincpu->o().set(FUNC(bship_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship); - - // sound hardware - // TODO -} - -// roms - -ROM_START( bship ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3201", 0x0000, 0x0400, CRC(bf6104a6) SHA1(8d28b43a2aa39dcbbe71f669cdafc518715812c9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bship_output.pla", 0, 365, CRC(ea0570b0) SHA1(6eb803b40717486d7b24939985f245327ac8a7e9) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Battleship (1977 version, model 4750B) - * PCB label MB 4750B - * TMS1000NLL MP3208 (die label 1000C, MP3208) - * SN75494N (acting as inverters), SN76477 sound - * 4 sliding buttons, light bulb - - This is the 2nd version. The sound hardware was changed to a SN76477. - -***************************************************************************/ - -class bshipb_state : public hh_tms1k_state -{ -public: - bshipb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_sn(*this, "sn76477") - { } - - void bshipb(machine_config &config); - -private: - required_device m_sn; - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bshipb_state::write_r(u16 data) -{ - // R0-R10: input mux - m_inp_mux = data; - - // R4: 75494 to R12 33K to SN76477 pin 20 - m_sn->slf_res_w((data & 0x10) ? RES_INF : RES_K(33)); -} - -void bshipb_state::write_o(u16 data) -{ - //printf("%X ", m_maincpu->debug_peek_o_index() & 0xf); - - // O0: SN76477 pin 9 - m_sn->enable_w(data & 1); - - // O1: 75494 to R4 100K to SN76477 pin 18 - // O2: 75494 to R3 150K to SN76477 pin 18 - double o12 = RES_INF; - switch (~data >> 1 & 3) - { - case 0: o12 = RES_INF; break; - case 1: o12 = RES_K(100); break; - case 2: o12 = RES_K(150); break; - case 3: o12 = RES_2_PARALLEL(RES_K(100), RES_K(150)); break; - } - m_sn->vco_res_w(o12); - - // O2,O6: (TODO) to SN76477 pin 21 - //m_sn->slf_cap_w(x); - - // O4: SN76477 pin 22 - m_sn->vco_w(data >> 4 & 1); - - // O5: R11 27K to SN76477 pin 23 - m_sn->one_shot_cap_w((data & 0x20) ? RES_K(27) : 0); - - // O6: SN76477 pin 25 - m_sn->mixer_b_w(data >> 6 & 1); - - // O7: 75494 to light bulb - m_display->matrix(1, data >> 7 & 1); -} - -u8 bshipb_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[11]->read() | read_inputs(11); -} - -// config - -// buttons are same as bship set - -void bshipb_state::bshipb(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set(FUNC(bshipb_state::read_k)); - m_maincpu->r().set(FUNC(bshipb_state::write_r)); - m_maincpu->o().set(FUNC(bshipb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 1); - config.set_default_layout(layout_bship); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SN76477(config, m_sn); - m_sn->set_noise_params(RES_K(47), RES_K(100), CAP_P(47)); // R18, R17, C8 - m_sn->set_decay_res(RES_M(3.3)); // R16 - m_sn->set_attack_params(CAP_U(0.47), RES_K(15)); // C7, R20 - m_sn->set_amp_res(RES_K(100)); // R19 - m_sn->set_feedback_res(RES_K(39)); // R7 - m_sn->set_vco_params(5.0 * RES_VOLTAGE_DIVIDER(RES_K(47), RES_K(33)), CAP_U(0.01), RES_K(270)); // R15/R14, C5, switchable R5/R3/R4 - m_sn->set_pitch_voltage(5.0); - m_sn->set_slf_params(CAP_U(22), RES_K(750)); // switchable C4, switchable R13/R12 - m_sn->set_oneshot_params(0, RES_INF); // NC, switchable R11 - m_sn->set_vco_mode(0); // switchable - m_sn->set_mixer_params(0, 0, 0); // switchable, GND, GND - m_sn->set_envelope_params(1, 0); // Vreg, GND - m_sn->set_enable(0); // switchable - m_sn->add_route(ALL_OUTPUTS, "mono", 0.35); -} - -// roms - -ROM_START( bshipb ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3208", 0x0000, 0x0400, CRC(982fa720) SHA1(1c6dbbe7b9e55d62a510225a88cd2de55fe9b181) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bshipb_output.pla", 0, 365, BAD_DUMP CRC(74a9a244) SHA1(479c1f1e37cf8f75352e10226b20322906bee813) ) // part of decap photo was obscured -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Simon (model 4850), created by Ralph Baer - * TMS1000 (die label MP3226), or MP3300 (die label 1000C, MP3300) - * DS75494 Hex digit LED driver, 4 big lamps, 1-bit sound - - known revisions: - - 1978: Rev A: TMS1000(no label) - - 198?: Rev B: MB4850 SCUS0640(16-pin custom ASIC), PCB label REV.B, - cost-reduced, same hardware as Pocket Simon - - 1979: Rev F: TMS1000(MP3300), PCB label 4850 Rev F - - The semi-sequel Super Simon uses a TMS1100 (see next minidriver). - -***************************************************************************/ - -class simon_state : public hh_tms1k_state -{ -public: - simon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void simon(machine_config &config); - -private: - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void simon_state::write_r(u16 data) -{ - // R4-R8 go through an 75494 IC first: - // R4 -> 75494 IN6 -> green lamp - // R5 -> 75494 IN3 -> red lamp - // R6 -> 75494 IN5 -> yellow lamp - // R7 -> 75494 IN2 -> blue lamp - m_display->matrix(1, data >> 4); - - // R8 -> 75494 IN0 -> speaker out - m_speaker->level_w(data >> 8 & 1); - - // R0-R2,R9: input mux - // R3: GND - // other bits: N/C - m_inp_mux = (data & 7) | (data >> 6 & 8); -} - -u8 simon_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( simon ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x07, 0x02, "Game Select") - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Green Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Blue Button") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R9 - PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x01, "4" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x07) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x07) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) -INPUT_PORTS_END - -void simon_state::simon(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(simon_state::read_k)); - m_maincpu->r().set(FUNC(simon_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_simon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( simon ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1000.u1", 0x0000, 0x0400, CRC(9961719d) SHA1(35dddb018a8a2b31f377ab49c1f0cb76951b81c0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) -ROM_END - -ROM_START( simonf ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3300", 0x0000, 0x0400, CRC(b9fcf93a) SHA1(45960e4242a08495f2a99fc5d44728eabd93cd9f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common3_micro.pla", 0, 867, CRC(52f7c1f1) SHA1(dbc2634dcb98eac173ad0209df487cad413d08a5) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1000_simon_output.pla", 0, 365, CRC(2943c71b) SHA1(bd5bb55c57e7ba27e49c645937ec1d4e67506601) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Super Simon - * TMS1100 MP3476NLL (die label MP3476) - * 8 big lamps(2 turn on at same time), 1-bit sound - - The semi-squel to Simon, not as popular. It includes more game variations - and a 2-player head-to-head mode. - -***************************************************************************/ - -class ssimon_state : public hh_tms1k_state -{ -public: - ssimon_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ssimon(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(speed_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void write_r(u16 data); - u8 read_k(); -}; - -void ssimon_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void ssimon_state::set_clock() -{ - // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch: - // 0 Simple: R=51K -> ~200kHz - // 1 Normal: R=37K -> ~275kHz - // 2 Super: R=22K -> ~400kHz - u8 inp = m_inputs[6]->read(); - m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000)); -} - -void ssimon_state::write_r(u16 data) -{ - // R0-R3,R9,R10: input mux - m_inp_mux = (data & 0xf) | (data >> 5 & 0x30); - - // R4: yellow lamps - // R5: green lamps - // R6: blue lamps - // R7: red lamps - m_display->matrix(1, data >> 4); - - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); -} - -u8 ssimon_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ssimon ) - PORT_START("IN.0") // R0 - PORT_CONFNAME( 0x0f, 0x01, "Game Select") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x00, "5" ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("P2 Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME("P2 Green Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME("P2 Blue Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME("P2 Red Button") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Last") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Longest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Decision") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Green Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Blue Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Red Button") - - PORT_START("IN.4") // R9 - PORT_CONFNAME( 0x0f, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Head-to-Head" ) // this sets R10 K2, see below - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFSETTING( 0x08, "3" ) - PORT_CONFSETTING( 0x01, "4" ) - - PORT_START("IN.5") // R10 - PORT_BIT( 0x02, 0x02, IPT_CUSTOM ) PORT_CONDITION("IN.4", 0x0f, EQUALS, 0x00) - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // fake - PORT_CONFNAME( 0x03, 0x01, "Speed" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ssimon_state, speed_switch, 0) - PORT_CONFSETTING( 0x00, "Simple" ) - PORT_CONFSETTING( 0x01, "Normal" ) - PORT_CONFSETTING( 0x02, "Super" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<0>, 0x0f) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<0>, 0x0f) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<4>, 0x0f) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<4>, 0x0f) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<6>, 0x03) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<6>, 0x03) -INPUT_PORTS_END - -void ssimon_state::ssimon(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 275000); // see set_clock - m_maincpu->k().set(FUNC(ssimon_state::read_k)); - m_maincpu->r().set(FUNC(ssimon_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ssimon); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssimon ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3476", 0x0000, 0x0800, CRC(98200571) SHA1(cbd0bcfc11a534aa0be5d011584cdcac58ff437a) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) // unused - ROM_LOAD( "tms1100_ssimon_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Big Trak - * TMS1000NLL MP3301A or MP3301ANLL E (rev. E!) (die label 1000E MP3301) - * SN75494N Hex digit LED driver, 1 lamp, 3-level sound - * gearbox with magnetic clutch, 1 IR led+sensor, 2 motors(middle wheels) - * 24-button keypad, ext in/out ports - - Big Trak is a programmable toy car, up to 16 steps. Supported commands include - driving and turning, firing a photon cannon(hey, have some imagination!), - and I/O ports. The output port was used for powering the dump truck accessory. - - The In command was canceled midst production, it is basically a nop. Newer - releases and the European version removed the button completely. - -***************************************************************************/ - -class bigtrak_state : public hh_tms1k_state -{ -public: - bigtrak_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_left_motor_forward(*this, "left_motor_forward"), - m_left_motor_reverse(*this, "left_motor_reverse"), - m_right_motor_forward(*this, "right_motor_forward"), - m_right_motor_reverse(*this, "right_motor_reverse"), - m_ext_out(*this, "ext_out") - { } - - void bigtrak(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); - - int m_gearbox_pos = 0; - bool sensor_state() { return m_gearbox_pos < 0 && m_display->element_on(0, 0); } - TIMER_DEVICE_CALLBACK_MEMBER(gearbox_sim_tick); - - output_finder<> m_left_motor_forward; - output_finder<> m_left_motor_reverse; - output_finder<> m_right_motor_forward; - output_finder<> m_right_motor_reverse; - output_finder<> m_ext_out; -}; - -void bigtrak_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // resolve handlers - m_left_motor_forward.resolve(); - m_left_motor_reverse.resolve(); - m_right_motor_forward.resolve(); - m_right_motor_reverse.resolve(); - m_ext_out.resolve(); - - // register for savestates - save_item(NAME(m_gearbox_pos)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(bigtrak_state::gearbox_sim_tick) -{ - // the last gear in the gearbox has 12 evenly spaced holes, it is located - // between an IR emitter and receiver - static const int speed = 17; - if (m_gearbox_pos >= speed) - m_gearbox_pos = -speed; - - if (m_o & 0x1e) - m_gearbox_pos++; -} - -void bigtrak_state::write_r(u16 data) -{ - // R0-R5,R8: input mux (keypad, ext in enable) - m_inp_mux = (data & 0x3f) | (data >> 2 & 0x40); - - // R6: N/C - // R7: IR led on - // R9: lamp on - m_display->matrix(1, (data >> 7 & 1) | (data >> 8 & 2)); - - // (O0,O7,)R10(tied together): speaker out - m_speaker->level_w((m_o & 1) | (m_o >> 6 & 2) | (data >> 8 & 4)); - m_r = data; -} - -void bigtrak_state::write_o(u16 data) -{ - // O1: left motor forward - // O2: left motor reverse - // O3: right motor reverse - // O4: right motor reverse - // O5: ext out - // O6: N/C - m_left_motor_forward = data >> 1 & 1; - m_left_motor_reverse = data >> 2 & 1; - m_right_motor_forward = data >> 3 & 1; - m_right_motor_reverse = data >> 4 & 1; - m_ext_out = data >> 5 & 1; - - // O0,O7(,R10)(tied together): speaker out - m_speaker->level_w((data & 1) | (data >> 6 & 2) | (m_r >> 8 & 4)); - m_o = data; -} - -u8 bigtrak_state::read_k() -{ - // K: multiplexed inputs - // K8: IR sensor - return read_inputs(7) | (sensor_state() ? 8 : 0); -} - -// config - -/* physical button layout and labels are like this: - - USA version: UK version: - - [^] [CLR] [^] [CM] - [<] [HOLD] [>] [FIRE] [<] [P] [>] [\|/] - [v] [CLS] [v] [CE] - [7] [8] [9] [RPT] [7] [8] [9] [x2] - [4] [5] [6] [TEST] [4] [5] [6] [TEST] - [1] [2] [3] [CK] [1] [2] [3] [checkmark] - [IN] [0] [OUT] [GO] [0] [OUT] [GO] -*/ - -static INPUT_PORTS_START( bigtrak ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hold") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("Forward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Fire") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear Memory") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("Backward") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("Right") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear Last Step") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Test") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Check") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("In") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Out") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.6") // R8 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CODE(KEYCODE_F1) PORT_NAME("Input Port") - PORT_BIT( 0x0b, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bigtrak_state::bigtrak(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=83K, C=100pF - m_maincpu->k().set(FUNC(bigtrak_state::read_k)); - m_maincpu->r().set(FUNC(bigtrak_state::write_r)); - m_maincpu->o().set(FUNC(bigtrak_state::write_o)); - - TIMER(config, "gearbox").configure_periodic(FUNC(bigtrak_state::gearbox_sim_tick), attotime::from_msec(1)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 2); - config.set_default_layout(layout_bigtrak); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bigtrak ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3301a", 0x0000, 0x0400, CRC(1351bcdd) SHA1(68865389c25b541c09a742be61f8fb6488134d4e) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common4_micro.pla", 0, 867, CRC(80912d0a) SHA1(7ae5293ed4d93f5b7a64d43fe30c3639f39fbe5a) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_bigtrak_output.pla", 0, 365, CRC(63be45f6) SHA1(918e38a223152db883c1a6f7acf56e87d7074734) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Dark Tower - * TMS1400NLL MP7332-N1.U1(Rev. B) or MP7332-N2LL(Rev. C) (die label MP7332) - (assume same ROM contents between revisions) - * SN75494N MOS-to-LED digit driver - * motorized rotating reel + lightsensor, 1bit-sound - - This is a board game, it obviously requires game pieces and the board. - The emulated part is the centerpiece, a black tower with a rotating card - panel and LED digits for displaying health, amount of gold, etc. As far - as MAME is concerned, the game works fine. - - To start up the game, first press [MOVE], the machine now does a self-test. - Then select level and number of players and the game will start. Read the - official manual on how to play the game. - -***************************************************************************/ - -class mbdtower_state : public hh_tms1k_state -{ -public: - mbdtower_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_motor_pos_out(*this, "motor_pos"), - m_card_pos_out(*this, "card_pos"), - m_motor_on_out(*this, "motor_on") - { } - - void mbdtower(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - void update_display(); - bool sensor_led_on() { return m_display->element_on(0, 0); } - - output_finder<> m_motor_pos_out; - output_finder<> m_card_pos_out; - output_finder<> m_motor_on_out; - - int m_motor_pos = 0; - int m_motor_pos_prev = -1; - int m_motor_decay = 0; - bool m_motor_on = false; - bool m_sensor_blind = false; - - TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick); - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void mbdtower_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - m_motor_pos_out.resolve(); - m_card_pos_out.resolve(); - m_motor_on_out.resolve(); - - // register for savestates - save_item(NAME(m_motor_pos)); - /* save_item(NAME(m_motor_pos_prev)); */ // don't save! - save_item(NAME(m_motor_decay)); - save_item(NAME(m_motor_on)); - save_item(NAME(m_sensor_blind)); -} - -// handlers - -TIMER_DEVICE_CALLBACK_MEMBER(mbdtower_state::motor_sim_tick) -{ - // it rotates counter-clockwise (when viewed from above) - if (m_motor_on) - { - m_motor_pos = (m_motor_pos - 1) & 0x7f; - - // give it some time to spin out when it's turned off - if (m_r & 0x200) - m_motor_decay += (m_motor_decay < 4); - else if (m_motor_decay > 0) - m_motor_decay--; - else - m_motor_on = false; - } - - // 8 evenly spaced holes in the rotation disc for the sensor to 'see' through. - // The first hole is much bigger, enabling the game to determine the position. - if ((m_motor_pos & 0xf) < 4 || m_motor_pos < 0xc) - m_sensor_blind = false; - else - m_sensor_blind = true; - - // on change, output info - if (m_motor_pos != m_motor_pos_prev) - m_motor_pos_out = 100 * (m_motor_pos / (float)0x80); - - /* 3 display cards per hole, like this: - - (0) <---- display increments this way <---- (7) - - CURSED VICTORY WIZARD DRAGON GOLD KEY SCOUT WARRIOR (void) - LOST WARRIORS BAZAAR CLOSED SWORD SILVER KEY HEALER FOOD (void) - PLAGUE BRIGANDS KEY MISSING PEGASUS BRASS KEY GOLD BEAST (void) - */ - int card_pos = m_motor_pos >> 4 & 7; - if (card_pos != (m_motor_pos_prev >> 4 & 7)) - m_card_pos_out = card_pos; - - m_motor_pos_prev = m_motor_pos; -} - -void mbdtower_state::update_display() -{ - // update current state - if (~m_r & 0x10) - { - u8 o = bitswap<8>(m_o,7,0,4,3,2,1,6,5) & 0x7f; - m_display->write_row(2, (m_o & 0x80) ? o : 0); - m_display->write_row(1, (m_o & 0x80) ? 0 : o); - m_display->write_row(0, (m_r >> 8 & 1) | (m_r >> 4 & 0xe)); - } - else - { - // display items turned off - m_display->clear(); - } -} - -void mbdtower_state::write_r(u16 data) -{ - // R0-R2: input mux - m_inp_mux = data & 7; - - // R9: motor on - if ((m_r ^ data) & 0x200) - m_motor_on_out = data >> 9 & 1; - if (data & 0x200) - m_motor_on = true; - - // R3: N/C - // R4: 75494 /EN (speaker, lamps, digit select go through that IC) - // R5-R7: tower lamps - // R8: rotation sensor led - m_r = data; - update_display(); - - // R10: speaker out - m_speaker->level_w(~data >> 4 & data >> 10 & 1); -} - -void mbdtower_state::write_o(u16 data) -{ - // O0-O6: led segments A-G - // O7: digit select - m_o = data; - update_display(); -} - -u8 mbdtower_state::read_k() -{ - // K: multiplexed inputs - // K8: rotation sensor - return read_inputs(3) | ((!m_sensor_blind && sensor_led_on()) ? 8 : 0); -} - -// config - -/* physical button layout and labels are like this: - - (green) (l.blue) (red) - [YES/ [REPEAT] [NO/ - BUY] END] - - (yellow) (blue) (white) - [HAGGLE] [BAZAAR] [CLEAR] - - (blue) (blue) (blue) - [TOMB/ [MOVE] [SANCTUARY/ - RUIN] CITADEL] - - (orange) (blue) (d.yellow) - [DARK [FRONTIER] [INVENTORY] - TOWER] -*/ - -static INPUT_PORTS_START( mbdtower ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Inventory") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("No/End") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Clear") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Sanctuary/Citadel") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Frontier") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Repeat") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Bazaar") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Move") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Dark Tower") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Yes/Buy") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Haggle") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Tomb/Ruin") -INPUT_PORTS_END - -void mbdtower_state::mbdtower(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=43K, C=56pF - m_maincpu->k().set(FUNC(mbdtower_state::read_k)); - m_maincpu->r().set(FUNC(mbdtower_state::write_r)); - m_maincpu->o().set(FUNC(mbdtower_state::write_o)); - - TIMER(config, "tower_motor").configure_periodic(FUNC(mbdtower_state::motor_sim_tick), attotime::from_msec(3500/0x80)); // ~3.5sec for a full rotation - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(6, 0x7f); - config.set_default_layout(layout_mbdtower); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mbdtower ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7332", 0x0000, 0x1000, CRC(ebeab91a) SHA1(7edbff437da371390fa8f28b3d183f833eaa9be9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_mbdtower_output.pla", 0, 557, CRC(64c84697) SHA1(72ce6d24cedf9c606f1742cd5620f75907246e87) ) -ROM_END - - - - - -/*************************************************************************** - - Milton Bradley Electronic Arcade Mania - * TMS1100 M34078A-N2LL (die label 1100G, M34078A) - * 9 LEDs, 3-bit sound - - This is a board game. The mini arcade machine is the emulated part here. - External artwork is needed for the game overlays. - -***************************************************************************/ - -class arcmania_state : public hh_tms1k_state -{ -public: - arcmania_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void arcmania(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void arcmania_state::write_r(u16 data) -{ - // R1-R9: leds - m_display->matrix(1, data >> 1); -} - -void arcmania_state::write_o(u16 data) -{ - // O0-O2(tied together): speaker out - m_speaker->level_w(data & 7); - - // O3,O4,O6: input mux - m_inp_mux = (data >> 3 & 3) | (data >> 4 & 4); - - // O5: power off when low (turn back on with button row 1) - if (~data & 0x20) - power_off(); -} - -u8 arcmania_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -/* physical button layout and labels are like this: - - (orange) (orange) (orange) - [1] [2] [3] - - (red) (yellow) (blue) - [RUN] [SNEAK - AMUK] ATTACK] - - (green) (yellow) (purple) - [Alien [Rattler] - Raiders] -*/ - -static INPUT_PORTS_START( arcmania ) - PORT_START("IN.0") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Alien Raiders") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Yellow Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Rattler") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Run Amuk") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Yellow Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Sneak Attack") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // O6 (also O5 to power) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Orange Button 1") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Orange Button 2") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Orange Button 3") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void arcmania_state::arcmania(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 250000); // approximation - RC osc. R=56K, C=100pF - m_maincpu->k().set(FUNC(arcmania_state::read_k)); - m_maincpu->r().set(FUNC(arcmania_state::write_r)); - m_maincpu->o().set(FUNC(arcmania_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 9); - config.set_default_layout(layout_arcmania); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( arcmania ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34078a", 0x0000, 0x0800, CRC(90ea0087) SHA1(9780c9c1ba89300b1bbe72c47e5fec68d8bb6a77) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_arcmania_output.pla", 0, 365, CRC(a1517b15) SHA1(72eedd7fd41de9c9102219f325fe8668a7c02663) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Code Name: Sector, by Bob Doyle - * TMS0970 MCU, MP0905BNL ZA0379 (die label 0970F-05B) - * 6-digit 7seg LED display + 4 LEDs for compass, no sound - - This is a tabletop submarine pursuit game. A grid board and small toy - boats are used to remember your locations (a Paint app should be ok too). - Refer to the official manual for more information, it is not a simple game. - -***************************************************************************/ - -class cnsector_state : public hh_tms1k_state -{ -public: - cnsector_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void cnsector(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void cnsector_state::write_r(u16 data) -{ - // R0-R5: select digit - // R6-R9: direction leds - m_display->matrix(data, m_o); -} - -void cnsector_state::write_o(u16 data) -{ - // O0-O4: input mux - m_inp_mux = data & 0x1f; - - // O0-O7: digit segments - m_o = data; -} - -u8 cnsector_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - COMBAT INFORMATION CENTER - [NEXT SHIP] [RECALL] [MOVE SHIP] - - [LEFT] [RIGHT] o [SLOWER] [FASTER] - STEERING EVASIVE SUB SPEED o (on/off switch) - NAVIGATIONAL PROGRAMMING | - - [RANGE] [AIM] [FIRE] o [TEACH MODE] - SONAR CONTROL SUB FINDER -*/ - -static INPUT_PORTS_START( cnsector ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Next Ship") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Left") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode") -INPUT_PORTS_END - -void cnsector_state::cnsector(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(cnsector_state::read_k)); - m_maincpu->r().set(FUNC(cnsector_state::write_r)); - m_maincpu->o().set(FUNC(cnsector_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 8); - m_display->set_segmask(0x3f, 0xff); - config.set_default_layout(layout_cnsector); - - // no sound! -} - -// roms - -ROM_START( cnsector ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0905bnl_za0379", 0x0000, 0x0400, CRC(201036e9) SHA1(b37fef86bb2bceaf0ac8bb3745b4702d17366914) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_cnsector_micro.pla", 0, 860, CRC(059f5bb4) SHA1(2653766f9fd74d41d44013bb6f54c0973a6080c9) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_cnsector_output.pla", 0, 352, CRC(c8bfb9d2) SHA1(30c3c73cec194debdcb1dd01b4adfefaeddf9516) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Merlin handheld game, by Bob Doyle - * TMS1100NLL MP3404 or MP3404A-N2 - * 11 LEDs behind buttons, 3-level sound - - Also published in Japan by Tomy as "Dr. Smith", white case instead of red. - The one with dark-blue case is the rare sequel Master Merlin, see below. - More sequels followed too, but on other hardware. - - To start a game, press NEW GAME, followed by a number: - 1: Tic-Tac-Toe - 2: Music Machine - 3: Echo - 4: Blackjack 13 - 5: Magic Square - 6: Mindbender - - Refer to the official manual for more information on the games. - -***************************************************************************/ - -class merlin_state : public hh_tms1k_state -{ -public: - merlin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void merlin(machine_config &config); - -protected: - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void merlin_state::write_r(u16 data) -{ - /* leds: - - R0 - R1 R2 R3 - R4 R5 R6 - R7 R8 R9 - R10 - */ - m_display->matrix(1, data); -} - -void merlin_state::write_o(u16 data) -{ - // O4-O6(tied together): speaker out - m_speaker->level_w(data >> 4 & 7); - - // O0-O3: input mux - // O7: N/C - m_inp_mux = data & 0xf; -} - -u8 merlin_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( merlin ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("Button 0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 2") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Same Game") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Comp Turn") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Hit Me") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game") -INPUT_PORTS_END - -void merlin_state::merlin(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=33K, C=100pF - m_maincpu->k().set(FUNC(merlin_state::read_k)); - m_maincpu->r().set(FUNC(merlin_state::write_r)); - m_maincpu->o().set(FUNC(merlin_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_merlin); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[8] = { 0.0, 1.0/3.0, 1.0/3.0, 2.0/3.0, 1.0/3.0, 2.0/3.0, 2.0/3.0, 1.0 }; - m_speaker->set_levels(8, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( merlin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3404a", 0x0000, 0x0800, CRC(7515a75d) SHA1(76ca3605d3fde1df62f79b9bb1f534c2a2ae0229) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) -ROM_END - -ROM_START( merlina ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp3404", 0x0000, 0x0800, CRC(9362d9f9) SHA1(266d2a4a98cc33944a4fc7ed073ba9321bba8e05) ) // 1 bit different - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common3_micro.pla", 0, 867, CRC(03574895) SHA1(04407cabfb3adee2ee5e4218612cb06c12c540f4) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_merlin_output.pla", 0, 365, CRC(3921b074) SHA1(12bd58e4d6676eb8c7059ef53598279e4f1a32ea) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Master Merlin - * TMS1400 MP7351-N2LL (die label 1400CR MP7351) - * 11 LEDs behind buttons, 3-level sound - - The TMS1400CR MCU has the same pinout as a standard TMS1100. The hardware - outside of the MCU is exactly the same as Merlin. - - The included minigames are: - 1: Three Shells - 2: Hi/Lo - 3: Match It - 4: Hit or Miss - 5: Pair Off - 6: Tempo - 7: Musical Ladder - 8: Patterns - 9: Hot Potato - -***************************************************************************/ - -class mmerlin_state : public merlin_state -{ -public: - mmerlin_state(const machine_config &mconfig, device_type type, const char *tag) : - merlin_state(mconfig, type, tag) - { } - - void mmerlin(machine_config &config); -}; - -// handlers: uses the ones in merlin_state - -// config - -static INPUT_PORTS_START( mmerlin ) - PORT_INCLUDE( merlin ) - - PORT_MODIFY("IN.3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Score") // instead of Hit Me -INPUT_PORTS_END - -void mmerlin_state::mmerlin(machine_config &config) -{ - merlin(config); - - // basic machine hardware - TMS1400(config.replace(), m_maincpu, 425000); // approximation - RC osc. R=30K, C=100pF - m_maincpu->k().set(FUNC(mmerlin_state::read_k)); - m_maincpu->r().set(FUNC(mmerlin_state::write_r)); - m_maincpu->o().set(FUNC(mmerlin_state::write_o)); - - config.set_default_layout(layout_mmerlin); -} - -// roms - -ROM_START( mmerlin ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7351", 0x0000, 0x1000, CRC(0f7a4c83) SHA1(242c1278ddfe92c28fd7cd87300e48e7a4827831) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_mmerlin_output.pla", 0, 557, CRC(fd3dcd93) SHA1(f2afc52df700daa0eb7356c7876af9b2966f971b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Electronic Master Mind - * TMS1000NLL MP3200 (die label 1000E, MP3200) - * 5 red leds, 5 green leds - - This is a board game, it came with 4 plug boards and a lot of colored pegs. - It's not related to the equally named Electronic Master Mind by Invicta, - that one is on a Rockwell MM75. - -***************************************************************************/ - -class pbmastm_state : public hh_tms1k_state -{ -public: - pbmastm_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void pbmastm(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void pbmastm_state::write_r(u16 data) -{ - // R1-R10: leds (direct) - m_display->matrix(1, data >> 1); -} - -void pbmastm_state::write_o(u16 data) -{ - // O0-O5: input mux - m_inp_mux = data & 0x3f; -} - -u8 pbmastm_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( pbmastm ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("A") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("B") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("D") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Red") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Blue") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Brown") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Black") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Yellow") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("White") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Pink") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Gray") - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Green") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Orange") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Blank") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Delete") - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Battery Test") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Code") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Check") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void pbmastm_state::pbmastm(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=56K, C=47pF - m_maincpu->k().set(FUNC(pbmastm_state::read_k)); - m_maincpu->r().set(FUNC(pbmastm_state::write_r)); - m_maincpu->o().set(FUNC(pbmastm_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 10); - config.set_default_layout(layout_pbmastm); - - // no sound! -} - -// roms - -ROM_START( pbmastm ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3200", 0x0000, 0x0400, CRC(059dbb88) SHA1(20e3f6aeecce167371bda914f263daf53c50c839) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_pbmastm_output.pla", 0, 365, CRC(b355c4d9) SHA1(43cc971a4feacfddfe810c8983c65d9eef3ed57b) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Stop Thief, by Bob Doyle - * TMS0980NLL MP6101B (die label 0980B-01A) - * 3-digit 7seg LED display, 6-level sound - - Stop Thief is actually a board game, the electronic device emulated here - (called Electronic Crime Scanner) is an accessory. To start a game, press - the ON button. Otherwise, it is in test-mode where you can hear all sounds. - For the patent romset, it needs to be turned off and on to exit test mode. - -***************************************************************************/ - -class stopthief_state : public hh_tms1k_state -{ -public: - stopthief_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void stopthief(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void stopthief_state::write_r(u16 data) -{ - // R0-R2: select digit - m_display->matrix(data & 7, bitswap<8>(m_o,3,5,2,1,4,0,6,7) & 0x7f); - - // R3-R8(tied together): speaker out - int level = 0; - for (int i = 0; m_o & 8 && i < 6; i++) - level += (data >> (i+3) & 1); - m_speaker->level_w(level); -} - -void stopthief_state::write_o(u16 data) -{ - // O0,O6: input mux - m_inp_mux = (data & 1) | (data >> 5 & 2); - - // O3: speaker on - // O0-O2,O4-O7: led segments A-G - m_o = data; -} - -u8 stopthief_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - [1] [2] [OFF] - [3] [4] [ON] - [5] [6] [T, TIP] - [7] [8] [A, ARREST] - [9] [0] [C, CLUE] -*/ - -static INPUT_PORTS_START( stopthief ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.1") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.2") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Tip") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Arrest") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Clue") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void stopthief_state::stopthief(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 425000); // approximation - m_maincpu->k().set(FUNC(stopthief_state::read_k)); - m_maincpu->r().set(FUNC(stopthief_state::write_r)); - m_maincpu->o().set(FUNC(stopthief_state::write_o)); - m_maincpu->power_off().set(FUNC(stopthief_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(3, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_stopthief); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[7] = { 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; - m_speaker->set_levels(7, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( stopthief ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp6101b", 0x0000, 0x1000, CRC(b9c9d64a) SHA1(481f8653064c142fe5d9314b750bcd73797b92b2) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( stopthiefp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "us4341385", 0x0000, 0x1000, CRC(07aec38a) SHA1(0a3d0956495c0d6d9ea771feae6c14a473a800dc) ) // from patent US4341385, data should be correct (it included checksums) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_stopthief_output.pla", 0, 352, CRC(680ca1c1) SHA1(dea6365f2e6b50a52f1a8f1d8417176b905d2bc9) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Bank Shot (known as Cue Ball in the UK), by Garry Kitchen - * TMS1400NLL MP7313-N2 (die label MP7313) - * LED grid display, 1-bit sound - - Bank Shot is an electronic pool game. To select a game, repeatedly press - the [SELECT] button, then press [CUE UP] to start. Refer to the official - manual for more information. The game selections are: - 1: Straight Pool (1 player) - 2: Straight Pool (2 players) - 3: Poison Pool - 4: Trick Shots - - BTANB: Some of the other (not cue) balls temporarily flash brighter sometimes, - eg. the bottom one when they're placed. This happens on the real device. - -***************************************************************************/ - -class bankshot_state : public hh_tms1k_state -{ -public: - bankshot_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void bankshot(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void bankshot_state::update_display() -{ - m_display->matrix(m_r & ~3, m_o); -} - -void bankshot_state::write_r(u16 data) -{ - // R0: speaker out - m_speaker->level_w(data & 1); - - // R2,R3: input mux - m_inp_mux = data >> 2 & 3; - - // R2-R10: led select - m_r = data; - update_display(); -} - -void bankshot_state::write_o(u16 data) -{ - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 bankshot_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - (note: remember that you can rotate the display in MAME) - - [SELECT [BALL UP] [BALL OVER] - SCORE] - - ------ led display ------ - - [ANGLE] [AIM] [CUE UP - SHOOT] -*/ - -static INPUT_PORTS_START( bankshot ) - PORT_START("IN.0") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Angle") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Aim") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Cue Up/Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Select/Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Ball Up") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Ball Over") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void bankshot_state::bankshot(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF - m_maincpu->k().set(FUNC(bankshot_state::read_k)); - m_maincpu->r().set(FUNC(bankshot_state::write_r)); - m_maincpu->o().set(FUNC(bankshot_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_bri_levels(0.01, 0.08); // cue ball is brigher - config.set_default_layout(layout_bankshot); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bankshot ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7313", 0x0000, 0x1000, CRC(7a5016a9) SHA1(a8730dc8a282ffaa3d89e675f371d43eb39f39b4) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_bankshot_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Split Second - * TMS1400NLL MP7314-N2 (die label MP7314) - * LED grid display(default round LEDs, and rectangular shape ones), 1-bit sound - - This is an electronic handheld reflex gaming device, it's straightforward - to use. The included mini-games are: - 1, 2, 3: Mad Maze* - 4, 5: Space Attack* - 6: Auto Cross - 7: Stomp - 8: Speedball - - *: higher number indicates higher difficulty - - display layout, where number yx is lamp R(y).O(x) - - 00 02 04 - 10 01 12 03 14 05 16 - 11 13 15 - 20 21 22 23 24 25 26 - 31 33 35 - 30 41 32 43 34 45 36 - 51 53 55 - 40 61 42 63 44 65 46 - 71 73 75 - 50 60 52 62 54 64 56 - 70 72 74 - -***************************************************************************/ - -class splitsec_state : public hh_tms1k_state -{ -public: - splitsec_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void splitsec(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void splitsec_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void splitsec_state::write_r(u16 data) -{ - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // R9,R10: input mux - m_inp_mux = data >> 9 & 3; - - // R0-R7: led select - m_r = data; - update_display(); -} - -void splitsec_state::write_o(u16 data) -{ - // O0-O6: led state - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 splitsec_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( splitsec ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void splitsec_state::splitsec(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 475000); // approximation - RC osc. R=24K, C=100pF - m_maincpu->k().set(FUNC(splitsec_state::read_k)); - m_maincpu->r().set(FUNC(splitsec_state::write_r)); - m_maincpu->o().set(FUNC(splitsec_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 7); - config.set_default_layout(layout_splitsec); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( splitsec ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7314", 0x0000, 0x1000, CRC(e94b2098) SHA1(f0fc1f56a829252185592a2508740354c50bedf8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_splitsec_output.pla", 0, 557, CRC(7539283b) SHA1(f791fa98259fc10c393ff1961d4c93040f1a2932) ) -ROM_END - - - - - -/*************************************************************************** - - Parker Brothers Lost Treasure - The Electronic Deep-Sea Diving Game, - Featuring The Electronic Dive-Control Center - * TMS1100 M34038-NLL (die label 1100E, M34038) - * 11 LEDs, 4-bit sound - - This is a board game. The electronic accessory is the emulated part here. - -***************************************************************************/ - -class lostreas_state : public hh_tms1k_state -{ -public: - lostreas_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void lostreas(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void lostreas_state::write_r(u16 data) -{ - // R0-R10: leds - m_display->matrix(1, data); -} - -void lostreas_state::write_o(u16 data) -{ - // O0-O3: input mux - m_inp_mux = data & 0xf; - - // O4: 330 ohm resistor - speaker out - // O5: 220 ohm resistor - speaker out - // O6: 180 ohm resistor - speaker out - // O7: 68 ohm resistor - speaker out - m_speaker->level_w(data >> 4 & 0xf); -} - -u8 lostreas_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - (note: Canadian version differs slightly to accomodoate dual-language) - - [N-S(gold)] [1] [2] [3] [AIR] - [E-W(gold)] [4] [5] [6] [UP] - [N-S(silv)] [7] [8] [9] [$ VALUE] - [E-W(silv)] [CLEAR] -*/ - -static INPUT_PORTS_START( lostreas ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // air/up - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("$ Value") - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("E-W (silver)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("N-S (silver)") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("E-W (gold)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("N-S (gold)") - - PORT_START("FAKE") // Air/Up buttons share the same position on the matrix - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Air") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up") -INPUT_PORTS_END - -void lostreas_state::lostreas(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 425000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(lostreas_state::read_k)); - m_maincpu->r().set(FUNC(lostreas_state::write_r)); - m_maincpu->o().set(FUNC(lostreas_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 11); - config.set_default_layout(layout_lostreas); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // set volume levels - static const double speaker_levels[0x10] = - { 1.0/16.0, 1.0/15.0, 1.0/14.0, 1.0/13.0, 1.0/12.0, 1.0/11.0, 1.0/10.0, 1.0/9.0, 1.0/8.0, 1.0/7.0, 1.0/6.0, 1.0/5.0, 1.0/4.0, 1.0/3.0, 1.0/2.0, 1.0 }; - m_speaker->set_levels(16, speaker_levels); -} - -// roms - -ROM_START( lostreas ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "m34038", 0x0000, 0x0800, CRC(4c996f63) SHA1(ebbaa8b2f909f4300887aa2dbdb7185eedc75d3f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_lostreas_output.pla", 0, 365, CRC(c62d850f) SHA1(d25974e6901eb10c52cdda12e6d4a13e26745e6f) ) -ROM_END - - - - - -/*************************************************************************** - - Playskool Alphie - * TMS1000 (label not known yet) - * 5 LEDs, 1-bit sound - - This is an educational toy robot for young kids. It has 2 sliding arms: - the left arm(Alphie's right arm) is for questions, the other for answers. - Cardboard inlays are used for arm position labels. - - There are 4 play modes: - - S symbol: Alphie answers questions. The answers are always the same, - no matter the inlay: Q1=A3, Q2=A5, Q3=A4, Q4=A1, Q5=A2. - - * symbol: used with Lunar Landing board game - - X symbol: used with Robot Land board game - - music note: play a selection of 5 tunes - -***************************************************************************/ - -class alphie_state : public hh_tms1k_state -{ -public: - alphie_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void alphie(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void alphie_state::write_r(u16 data) -{ - // R1-R5, input mux (using d5 for Vss) - m_inp_mux = (data >> 1 & 0x1f) | 0x20; - - // R6-R10: leds - m_display->matrix(1, data >> 6); - - // R0: power off on falling edge (turn back on with button) - if (~data & m_r & 1) - power_off(); - - m_r = data; -} - -void alphie_state::write_o(u16 data) -{ - // O?: speaker out - m_speaker->level_w(data & 1); -} - -u8 alphie_state::read_k() -{ - // K: multiplexed inputs, rotated matrix - return read_rotated_inputs(6); -} - -// config - -static INPUT_PORTS_START( alphie ) - PORT_START("IN.0") // K1 - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - - PORT_START("IN.1") // K2 - PORT_CONFNAME( 0x1f, 0x01, "Question" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x10, "5" ) - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x1f, 0x01, "Answer" ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - PORT_CONFSETTING( 0x10, "5" ) - - PORT_START("IN.3") // K8 - PORT_CONFNAME( 0x0f, 0x01, "Activity" ) - PORT_CONFSETTING( 0x01, "Questions" ) - PORT_CONFSETTING( 0x02, "Lunar Landing" ) - PORT_CONFSETTING( 0x04, "Robot Land" ) - PORT_CONFSETTING( 0x08, "Tunes" ) - - PORT_START("SWITCH") // fake - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<1>, 0x1f) PORT_NAME("Question Arm Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<1>, 0x1f) PORT_NAME("Question Arm Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<2>, 0x1f) PORT_NAME("Answer Arm Up") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<2>, 0x1f) PORT_NAME("Answer Arm Down") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_prev<3>, 0x0f) PORT_NAME("Activity Selector Left") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, switch_next<3>, 0x0f) PORT_NAME("Activity Selector Right") -INPUT_PORTS_END - -// output PLA is guessed -static const u16 alphie_output_pla[0x20] = -{ - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 -}; - -void alphie_state::alphie(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 350000); // approximation - m_maincpu->set_output_pla(alphie_output_pla); - m_maincpu->k().set(FUNC(alphie_state::read_k)); - m_maincpu->r().set(FUNC(alphie_state::write_r)); - m_maincpu->o().set(FUNC(alphie_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 5); - config.set_default_layout(layout_alphie); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alphie ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "us4280809", 0x0000, 0x0400, CRC(f8f14013) SHA1(bf31b929fcbcb189bbe4623104e1da0a639b5954) ) // from patent US4280809, should be good - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent description - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1000_alphie_output.pla", 0, 365, NO_DUMP ) // " -ROM_END - - - - - -/*************************************************************************** - - Tandy Championship Football (model 60-2150) - * PCB label CYG-316 - * TMS1100NLL MP1193 (die label 1100B, MP1193) - * 7-digit 7seg LED display + LED grid, 1-bit sound - - Another clone of Mattel Football II. The original manufacturer is unknown, but - suspected to be Conic/E.R.S.(Electronic Readout Systems). - -***************************************************************************/ - -class tcfball_state : public hh_tms1k_state -{ -public: - tcfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tcfball(machine_config &config); - -protected: - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void tcfball_state::update_display() -{ - // R8 enables leds, R9 enables digits - u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780); - u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask; - - m_display->matrix(sel, m_o); -} - -void tcfball_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R5-R7: input mux - m_inp_mux = data >> 5 & 7; - - // R8+R0-R3: select led - // R9+R0-R6: select digit - m_r = data; - update_display(); -} - -void tcfball_state::write_o(u16 data) -{ - // O0-O7: digit segments/led data - m_o = data; - update_display(); -} - -u8 tcfball_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(3); -} - -// config - -static INPUT_PORTS_START( tcfball ) - PORT_START("IN.0") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Score") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Kick") - - PORT_START("IN.2") // R7 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // college - PORT_CONFSETTING( 0x08, "2" ) // professional -INPUT_PORTS_END - -void tcfball_state::tcfball(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=56K, C=24pF - m_maincpu->k().set(FUNC(tcfball_state::read_k)); - m_maincpu->r().set(FUNC(tcfball_state::write_r)); - m_maincpu->o().set(FUNC(tcfball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 8); - m_display->set_segmask(0x77, 0x7f); - m_display->set_segmask(0x08, 0xff); // R3 has DP - m_display->set_bri_levels(0.003, 0.03); // offense leds are brighter - config.set_default_layout(layout_tcfball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tcfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1193", 0x0000, 0x0800, CRC(7d9f446f) SHA1(bb6af47b42d989494f21475a73f072cddf58c99f) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_tcfball_output.pla", 0, 365, CRC(26b2996e) SHA1(df0e706c552bf74123aa65e71b0c9b4d33cddb2b) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy Championship Football (model 60-2151) - * TMS1100NLL MP1183 (no decap) - * 7-digit 7seg LED display + LED grid, 1-bit sound - - The hardware is almost the same as the MP1193 one, they added an extra row of leds. - - known releases: - - World(1): Superbowl XV Football, published by E.R.S.(Electronic Readout Systems) - - World(2): Super-Pro Football, no brand - - USA: Championship Football (model 60-2151), published by Tandy - -***************************************************************************/ - -class tcfballa_state : public tcfball_state -{ -public: - tcfballa_state(const machine_config &mconfig, device_type type, const char *tag) : - tcfball_state(mconfig, type, tag) - { } - - void tcfballa(machine_config &config); -}; - -// handlers: uses the ones in tcfball_state - -// config - -static INPUT_PORTS_START( tcfballa ) - PORT_INCLUDE( tcfball ) - - PORT_MODIFY("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Display") -INPUT_PORTS_END - -void tcfballa_state::tcfballa(machine_config &config) -{ - tcfball(config); - - // basic machine hardware - m_maincpu->set_clock(375000); // approximation - RC osc. R=47K, C=50pF - - config.set_default_layout(layout_tcfballa); -} - -// roms - -ROM_START( tcfballa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1183", 0x0000, 0x0800, CRC(2a4db1d5) SHA1(5df15d1115bb425578ad522d607a582dd478f35c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_tcfballa_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_tcfballa_output.bin", 0, 0x20, CRC(887ad9a5) SHA1(a2bac48f555df098c1f1f0fa663e5bcb989b8987) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy Computerized Arcade (model 60-2159 or 60-2159A) - * TMS1100 MCU, label CD7282SL - * 12 lamps behind buttons, 1-bit sound - - known releases: - - World: Tandy-12: Computerized Arcade, published by Tandy - - World: Computerized Arcade, published by Tandy, Radio Shack brand. - This one is model 60-2495 from the mid-90s, perhaps different hardware! - - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as - 9-button version, a clone of Mego Fabulous Fred) - - This handheld contains 12 minigames. It looks and plays like Game Robot 9 by - Takatoku Toys (aka Mego's Fabulous Fred) from 1980, which in turn is a mix of - Merlin and Simon. Unlike Merlin and Simon, spin-offs were not as successful in - the USA. There were releases with and without the prefix "Tandy-12", I don't - know which name was more common. Also not worth noting is that it needed five - batteries; four C-cells and a 9-volt. - - Some of the games require accessories included with the toy (eg. the Baseball - game is played with a board representing the playing field). To start a game, - hold the [SELECT] button, then press [START] when the game button lights up. - As always, refer to the official manual for more information. - - See below at the input defs for a list of the games. - -***************************************************************************/ - -class tandy12_state : public hh_tms1k_state -{ -public: - tandy12_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tandy12(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tandy12_state::update_display() -{ - m_display->matrix(1, (m_o << 1 & 0x1fe) | (m_r << 9 & 0x1e00)); -} - -void tandy12_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R5-R9: input mux - m_inp_mux = data >> 5 & 0x1f; - - // R0-R3: button lamps 9-12 - m_r = data; - update_display(); -} - -void tandy12_state::write_o(u16 data) -{ - // O0-O7: button lamps 1-8 - m_o = data; - update_display(); -} - -u8 tandy12_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -/* physical button layout and labels are like this: - - REPEAT-2 SPACE-2 - [O] OFF--ON [O] - - [purple]1 [blue]5 [l-green]9 - ORGAN TAG-IT TREASURE HUNT - - [l-orange]2 [turquoise]6 [red]10 - SONG WRITER ROULETTE COMPETE - - [pink]3 [yellow]7 [violet]11 - REPEAT BASEBALL FIRE AWAY - - [green]4 [orange]8 [brown]12 - TORPEDO REPEAT PLUS HIDE 'N SEEK - - [O] [O] [O] - START SELECT PLAY-2/HIT-7 -*/ - -static INPUT_PORTS_START( tandy12 ) - PORT_START("IN.0") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Button 12") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Button 11") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Button 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("Button 9") - - PORT_START("IN.1") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Space-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Play-2/Hit-7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Select") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Start") - - PORT_START("IN.2") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat-2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Button 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Button 1") - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Button 8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("Button 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Button 5") -INPUT_PORTS_END - -// output PLA is not decapped, this was made by hand -static const u16 tandy12_output_pla[0x20] = -{ - // these are certain - 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, - 0x80, 0x00, 0x00, 0x00, 0x00, - - // rest is unused? - 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -void tandy12_state::tandy12(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->set_output_pla(tandy12_output_pla); - m_maincpu->k().set(FUNC(tandy12_state::read_k)); - m_maincpu->r().set(FUNC(tandy12_state::write_r)); - m_maincpu->o().set(FUNC(tandy12_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 13); - config.set_default_layout(layout_tandy12); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tandy12 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd7282sl", 0x0000, 0x0800, CRC(a10013dd) SHA1(42ebd3de3449f371b99937f9df39c240d15ac686) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, BAD_DUMP CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_tandy12_output.pla", 0, 365, NO_DUMP ) -ROM_END - - - - - -/*************************************************************************** - - Tandy(Radio Shack division) Monkey See (1982 version) - * TMS1000 MP0271 (die label 1000E, MP0271), only half of ROM space used - * 2 LEDs(one red, one green), 1-bit sound - - This is the TMS1000 version, the one from 1977 has a MM5780. - To play, enter an equation followed by the ?-key, and the calculator will - tell you if it was right(green) or wrong(red). For example 1+2=3? - - known releases: - - USA(1): Monkey See, published by Tandy - - USA(2): Heathcliff, published by McNaught Syndicate in 1983 - -***************************************************************************/ - -class monkeysee_state : public hh_tms1k_state -{ -public: - monkeysee_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void monkeysee(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void monkeysee_state::write_r(u16 data) -{ - // R0-R4: input mux - m_inp_mux = data & 0x1f; - - // R5: speaker out - m_speaker->level_w(data >> 5 & 1); -} - -void monkeysee_state::write_o(u16 data) -{ - // O6,O7: leds - // other: N/C - m_display->matrix(1, data >> 6); -} - -u8 monkeysee_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( monkeysee ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") -INPUT_PORTS_END - -void monkeysee_state::monkeysee(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 250000); // approximation - RC osc. R=68K, C=47pF - m_maincpu->k().set(FUNC(monkeysee_state::read_k)); - m_maincpu->r().set(FUNC(monkeysee_state::write_r)); - m_maincpu->o().set(FUNC(monkeysee_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 2); - config.set_default_layout(layout_monkeysee); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( monkeysee ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0271", 0x0000, 0x0400, CRC(acab0f05) SHA1(226f7688caf4a94a88241d3b61ddc4254e4a918c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_monkeysee_micro.pla", 0, 867, CRC(368d878f) SHA1(956e700a04f453c1610cfdb974fce898ba4cf01f) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_monkeysee_output.pla", 0, 365, CRC(8a010e89) SHA1(3ffbabc5d6c9b34cc06d290817d15b2be42d8b17) ) -ROM_END - - - - - -/*************************************************************************** - - Tandy 3 in 1 Sports Arena (model 60-2178) - * PCB label HP-804 - * TMS1100 (just a datestamp label (8331), die label 1100B MP1231) - * 2x2-digit 7seg LED display + 47 other LEDs, 1-bit sound - - For Tandy Sports Arena (model 60-2158), see cmsport, this is a different game. - This version is very similar to ssports4 released a few years earlier. - - 3 overlays were included for the games (Tandy calls them graphic sheets), - MAME external artwork is needed for those. - - It is always in 2-player head-to-head mode, the Player switch is just meant - for allowing the other player to have full control over 2 defense spots. - -***************************************************************************/ - -class t3in1sa_state : public hh_tms1k_state -{ -public: - t3in1sa_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void t3in1sa(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void t3in1sa_state::update_display() -{ - m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); -} - -void t3in1sa_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0,R1,R5,R7-R9: input mux - m_inp_mux = (data & 3) | (data >> 3 & 4) | (data >> 4 & 0x38); - - // R2: led data high - // R3-R7: led select - // R0,R1,R8,R9: digit select - m_r = data; - update_display(); -} - -void t3in1sa_state::write_o(u16 data) -{ - // O0-O7: led data low - m_o = data; - update_display(); -} - -u8 t3in1sa_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -/* physical button layout and labels are like this: - - ↑ - [ ] [ ] [ ] - TEAM-MATE PASS - ←[ ] [ ]→ shoot - ↗ ↖ - [ ] [ ] [ ] - STATUS ↓ KICK - pass - shoot - -Game and difficulty switches are under the yellow buttons, -player switch is under the red buttons. P1 is yellow, P2 is red. - -*/ - -static INPUT_PORTS_START( t3in1sa ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R5 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) // AMATEUR - PORT_CONFSETTING( 0x01, "2" ) // PRO - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x0e, 0x08, "Game Select" ) - PORT_CONFSETTING( 0x08, "Football" ) // F - PORT_CONFSETTING( 0x04, "Basketball" ) // B - PORT_CONFSETTING( 0x02, "Soccer" ) // S - - PORT_START("IN.4") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Up-Right / Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Team-Mate") - - PORT_START("IN.5") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Up-Right / Status") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass / Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Team-Mate") -INPUT_PORTS_END - -void t3in1sa_state::t3in1sa(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(t3in1sa_state::read_k)); - m_maincpu->r().set(FUNC(t3in1sa_state::write_r)); - m_maincpu->o().set(FUNC(t3in1sa_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x303, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_t3in1sa); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( t3in1sa ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1231", 0x0000, 0x0800, CRC(1c24e5c2) SHA1(0b6c2edea27eba15e890d82475b91a5e9ef6c4b9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_t3in1sa_output.pla", 0, 365, CRC(de82a294) SHA1(7187666a510919b90798b92b9104ac5d6820d559) ) -ROM_END - - - - - -/*************************************************************************** - - Telesensory Systems, Inc.(TSI) Speech+ - * TMS1000 MCU, label TMS1007NL (die label 1000B, 1007A) - * TSI S14001A speech chip, GI S14007-A 2KB maskrom for samples - * 9-digit 7seg LED display - - This is a speaking calculator for the blind, the instructions that came - with it were on audio cassette. It was also released in 1978 by APH - (American Printing House for the Blind). - -***************************************************************************/ - -class speechp_state : public hh_tms1k_state -{ -public: - speechp_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_speech(*this, "speech") - { } - - void speechp(machine_config &config); - -private: - required_device m_speech; - - void update_display(); - virtual void write_r(u16 data); - virtual void write_o(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void speechp_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void speechp_state::write_r(u16 data) -{ - // R5-R9: TSI C0-C5 - m_speech->data_w(data >> 5 & 0x3f); - - // R10: TSI START line - m_speech->start_w(data >> 10 & 1); - - // R0-R9: input mux - m_inp_mux = data & 0x3ff; - - // R0-R8: select digit - m_r = data; - update_display(); -} - -void speechp_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 speechp_state::read_k() -{ - // K: multiplexed inputs - return m_inputs[10]->read() | (read_inputs(10) & 7); -} - -// config - -static INPUT_PORTS_START( speechp ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("S") // Swap - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") // Clear - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speak") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("M") // Memory - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.9") // R9 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x00, "Verbose" ) - PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("IN.10") // K8 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Battery Status" ) - PORT_CONFSETTING( 0x08, "Low" ) - PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) -INPUT_PORTS_END - -void speechp_state::speechp(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 400000); // approximation - RC osc. R=39K, C=47pF - m_maincpu->k().set(FUNC(speechp_state::read_k)); - m_maincpu->r().set(FUNC(speechp_state::write_r)); - m_maincpu->o().set(FUNC(speechp_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_speechp); - - // sound hardware - SPEAKER(config, "mono").front_center(); - S14001A(config, m_speech, 25000); // approximation - m_speech->add_route(ALL_OUTPUTS, "mono", 0.75); -} - -// roms - -ROM_START( speechp ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1007nl", 0x0000, 0x0400, CRC(c2669d5c) SHA1(7943d6f39508a9a82bc21e4fe34a5b9f86e3add2) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_speechp_output.pla", 0, 365, CRC(e1b4197f) SHA1(258f4276a9f15c9bfbfa58df2f7202aed1542fdc) ) - - ROM_REGION( 0x0800, "speech", 0 ) - ROM_LOAD("s14007-a", 0x0000, 0x0800, CRC(543b46d4) SHA1(99daf7fe3354c378b4bd883840c9bbd22b22ebe7) ) -ROM_END - - - - - -/*************************************************************************** - - TI SR-16 (1974, first consumer product with TMS1000 series MCU) - * TMS1000 MCU label TMS1001NL (die label 1000, 1001A) - * 12-digit 7seg LED display - - TI SR-16 II (1975 version) - * TMS1000 MCU label TMS1016NL (die label 1000B, 1016A) - * notes: cost-reduced 'sequel', [10^x] was removed, and [pi] was added. - -***************************************************************************/ - -class tisr16_state : public hh_tms1k_state -{ -public: - tisr16_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void tisr16(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void tisr16_state::update_display() -{ - m_display->matrix(m_r, m_o); - - // exponent sign is from R10 O1, and R10 itself only uses segment G - u8 r10 = m_display->read_row(10); - m_display->write_row(11, r10 << 5 & 0x40); - m_display->write_row(10, r10 & 0x40); -} - -void tisr16_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void tisr16_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 tisr16_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( tisr16 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("10" UTF8_POW_X) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( tisr16ii ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CD") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("e" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") -INPUT_PORTS_END - -void tisr16_state::tisr16(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 300000); // approximation - RC osc. R=43K, C=68pf (note: tisr16ii MCU RC osc. is different: R=30K, C=100pf, same freq) - m_maincpu->k().set(FUNC(tisr16_state::read_k)); - m_maincpu->o().set(FUNC(tisr16_state::write_o)); - m_maincpu->r().set(FUNC(tisr16_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 8); - m_display->set_segmask(0xfff, 0xff); - config.set_default_layout(layout_tisr16); - - // no sound! -} - -// roms - -ROM_START( tisr16 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1001nl", 0x0000, 0x0400, CRC(b7ce3c1d) SHA1(95cdb0c6be31043f4fe06314ed41c0ca1337bc46) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_sr16_micro.pla", 0, 867, CRC(5b35019c) SHA1(730d3b9041ed76d57fbedd73b009477fe432b386) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_sr16_output.pla", 0, 365, CRC(29b08739) SHA1(d55f01e40a2d493d45ea422f12e63b01bcde08fb) ) -ROM_END - -ROM_START( tisr16ii ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1016nl", 0x0000, 0x0400, CRC(c07a7b27) SHA1(34ea4d3b59871e08db74f8c5bfb7ff00d1f0adc7) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_sr16ii_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_sr16ii_output.pla", 0, 365, CRC(c45dfbd0) SHA1(5d588c1abc317134b51eb08ac3953f1009d80056) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1250/TI-1200 (1975 version), Spirit of '76 - * TMS0950 MCU label TMC0952NL, K0952 (die label 0950A 0952) - * 9-digit 7seg LED display - - TI-1250/TI-1200 (1976 version), TI-1400, TI-1450, TI-1205, TI-1255, LADY 1200, ABLE - * TMS0970 MCU label TMS0972NL ZA0348, JP0972A (die label 0970D-72A) - * 8-digit 7seg LED display, or 9 digits with leftmost unused - - As seen listed above, the basic 4-function TMS0972 calculator MCU was used - in many calculators. It was licensed to other manufacturers too, one funny - example being a Mattel Barbie handheld calculator. - - Some cheaper models lacked the memory buttons (the function itself still works). - The ABLE series was for educational purposes, with each having a small subset of - available buttons. - - TI-1270 - * TMS0970 MCU label TMC0974NL ZA0355, DP0974A (die label 0970D-74A) - * 8-digit 7seg LED display - * notes: almost same hardware as TMS0972 TI-1250, minor scientific functions - -***************************************************************************/ - -class ti1250_state : public hh_tms1k_state -{ -public: - ti1250_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti1270(machine_config &config); - void ti1250(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti1250_state::write_r(u16 data) -{ - // R0-R8: select digit - m_display->matrix(data, m_o); -} - -void ti1250_state::write_o(u16 data) -{ - // O1-O5,O7: input mux - // O0-O7: digit segments - m_inp_mux = (data >> 1 & 0x1f) | (data >> 2 & 0x20); - m_o = data; -} - -u8 ti1250_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ti1250 ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("CS") // named either CS(Change Sign) or +/- - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("MC") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") -INPUT_PORTS_END - -static INPUT_PORTS_START( ti1270 ) - PORT_INCLUDE( ti1250 ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("CE/C") - - PORT_MODIFY("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") -INPUT_PORTS_END - -void ti1250_state::ti1250(machine_config &config) -{ - // basic machine hardware - TMS0950(config, m_maincpu, 200000); // approximation - RC osc. R=68K, C=68pf - m_maincpu->k().set(FUNC(ti1250_state::read_k)); - m_maincpu->o().set(FUNC(ti1250_state::write_o)); - m_maincpu->r().set(FUNC(ti1250_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0xff, 0xff); - m_display->set_segmask(0x100, 0x40); // R8 only has segment G connected - config.set_default_layout(layout_ti1250); - - // no sound! -} - -void ti1250_state::ti1270(machine_config &config) -{ - ti1250(config); - - // basic machine hardware - TMS0970(config.replace(), m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti1250_state::read_k)); - m_maincpu->o().set(FUNC(ti1250_state::write_o)); - m_maincpu->r().set(FUNC(ti1250_state::write_r)); - - config.set_default_layout(layout_ti1270); -} - -// roms - -ROM_START( ti1250 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0952nl", 0x0000, 0x0400, CRC(fc0cee65) SHA1(1480e4553181f081281d3b78457721b9ecb20173) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti1250_micro.pla", 0, 867, CRC(cb3fd2d6) SHA1(82cf36a65dfc3ccb9dd08e48f45ac4d90f693238) ) - ROM_REGION( 195, "maincpu:opla", 0 ) - ROM_LOAD( "tms0950_ti1250_output.pla", 0, 195, CRC(31570eb8) SHA1(c1cb17c31367b65aa777925459515c3d5c565508) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - -ROM_START( ti125076 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0972nl_za0348", 0x0000, 0x0400, CRC(6e3f8add) SHA1(a249209e2a92f5016e33b7ad2c6c2660df1df959) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - -ROM_START( ti1270 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0974nl_za0355", 0x0000, 0x0400, CRC(48e09b4b) SHA1(17f27167164df223f9f06082ece4c3fc3900eda3) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1270_output.pla", 0, 352, CRC(472f95a0) SHA1(32adb17285f2f3f93a4b027a3dd2156ec48000ec) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI-2550 III, TI-1650/TI-1600, TI-1265 (they have the same chip) - * TMS1040 MCU label TMS1043NL ZA0352 (die label 1040A, 1043A) - * 9-digit cyan VFD display - - Only the TI-2550 III has the top button row (RV, SQRT, etc). - TI-1600 doesn't have the memory buttons. - -***************************************************************************/ - -class ti25503_state : public hh_tms1k_state -{ -public: - ti25503_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti25503(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti25503_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void ti25503_state::write_r(u16 data) -{ - // R0-R6: input mux - // R0-R8: select digit - m_r = m_inp_mux = data; - update_display(); -} - -void ti25503_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 ti25503_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(7); -} - -// config - -static INPUT_PORTS_START( ti25503 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("C") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("RV") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") -INPUT_PORTS_END - -void ti25503_state::ti25503(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti25503_state::read_k)); - m_maincpu->o().set(FUNC(ti25503_state::write_o)); - m_maincpu->r().set(FUNC(ti25503_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0xff); - config.set_default_layout(layout_ti25503); - - // no sound! -} - -// roms - -ROM_START( ti25503 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1043nl_za0352", 0x0000, 0x0400, CRC(434c2684) SHA1(ff566f1991f63cfe057879674e6bc7ccd580a919) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti25503_micro.pla", 0, 867, CRC(65d274ae) SHA1(33d77efe38f8b067096c643d71263bb5adde0ca9) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ti25503_output.pla", 0, 365, CRC(ac43b768) SHA1(5eb19b493328c73edab73e44591afda0fbe4965f) ) -ROM_END - - - - - -/*************************************************************************** - - TI-5100, more (see below) - * TMS1070 MCU label TMS1073NL or TMC1073NL (die label 1070B, 1073) - * 11-digit 7seg VFD (1 custom digit) - - This chip was also used in 3rd-party calculators, such as Toshiba BC-1015, - Panasonic JE1601U, Radio Shack EC2001, Triumph-Adler D100. The original - TI version did not have the 3 buttons at R4. - -***************************************************************************/ - -class ti5100_state : public hh_tms1k_state -{ -public: - ti5100_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti5100(machine_config &config); - -private: - void update_display(); - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti5100_state::update_display() -{ - // extra segment on R10 - m_display->matrix(m_r, (m_r >> 2 & 0x100) | m_o); -} - -void ti5100_state::write_r(u16 data) -{ - // R0-R10: input mux, select digit - m_r = m_inp_mux = data; - update_display(); -} - -void ti5100_state::write_o(u16 data) -{ - // O0-O7: digit segments - m_o = data; - update_display(); -} - -u8 ti5100_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(11); -} - -// config - -static INPUT_PORTS_START( ti5100 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "K" ) // constant mode - PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) - PORT_CONFSETTING( 0x08, DEF_STR( On ) ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "DP" ) // display point - PORT_CONFSETTING( 0x00, "F" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // clear all? - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("EX") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("GPM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME(UTF8_CAPITAL_DELTA"%") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/CE") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("CM") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R8 0x01 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // duplicate of R9 0x02 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.10") // R10 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M+=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_INSERT) PORT_NAME("M-=") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("RM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) -INPUT_PORTS_END - -void ti5100_state::ti5100(machine_config &config) -{ - // basic machine hardware - TMS1070(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti5100_state::read_k)); - m_maincpu->o().set(FUNC(ti5100_state::write_o)); - m_maincpu->r().set(FUNC(ti5100_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 9); - m_display->set_segmask(0x7ff, 0xff); - config.set_default_layout(layout_ti5100); - - // no sound! -} - -// roms - -ROM_START( ti5100 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms1073nl", 0x0000, 0x0400, CRC(94185933) SHA1(d2d9432f857b8530ac399f5097c6d412f06d8814) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ti5100_micro.pla", 0, 867, CRC(31b43e95) SHA1(6864e4c20f3affffcd3810dcefbc9484dd781547) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ti5100_output.pla", 0, 365, CRC(11f6f0f4) SHA1(f25cf6bd284ab4614746b2e3f98d42d2585e425a) ) -ROM_END - - - - - -/*************************************************************************** - - TMC098x series Majestic-line calculators - - TI-30, SR-40, TI-15(less buttons) and several by Koh-I-Noor - * TMS0980 MCU label TMC0981NL (die label 0980B-81F) - * 9-digit 7seg LED display - - Of note is a peripheral by Schoenherr, called the Braillotron. It acts as - a docking station to the TI-30, with an additional display made of magnetic - refreshable Braille cells. The TI-30 itself is slightly modified to wire - the original LED display to a 25-pin D-Sub connector. - - TI Business Analyst, TI Business Analyst-I, TI Money Manager, TI-31, TI-41 - * TMS0980 MCU label TMC0982NL (die label 0980B-82F) - - TI Programmer - * TMS0980 MCU label ZA0675NL, JP0983AT (die label 0980B-83) - -***************************************************************************/ - -class ti30_state : public hh_tms1k_state -{ -public: - ti30_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti30(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti30_state::write_r(u16 data) -{ - // R0-R8: select digit - m_display->matrix(data, m_o); -} - -void ti30_state::write_o(u16 data) -{ - // O0-O2,O4-O7: input mux - // O0-O7: digit segments - m_inp_mux = (data & 7) | (data >> 1 & 0x78); - m_o = bitswap<8>(data,7,5,2,1,4,0,6,3); -} - -u8 ti30_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[7]->read() | read_inputs(7); -} - -// config - -static INPUT_PORTS_START( ti30 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("log") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("EE" UTF8_DOWN) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x)") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME(UTF8_SMALL_PI) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("DRG") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("INV") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("cos") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("sin") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_NAME("tan") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("1/x") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_NAME(UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -static INPUT_PORTS_START( tiprog ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_NAME("K") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("SHF") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("E") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_NAME("d") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("F") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_NAME("OR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("AND") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_NAME("1'sC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_NAME("b") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_NAME("A") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("C") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("XOR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(")") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("SUM") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("(") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("CE") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("C/ON") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_NAME("DEC") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_NAME("OCT") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_NAME("HEX") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -static INPUT_PORTS_START( tibusan ) - // PORT_NAME lists functions under [2nd] as secondaries. - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_NAME("y" UTF8_POW_X" " UTF8_POW_X"" UTF8_SQUAREROOT"y") // 2nd one implies xth root of y - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("% " UTF8_CAPITAL_DELTA"%") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_NAME("SEL") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_NAME("CST") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_NAME("MAR") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("STO m") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("RCL b") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME(UTF8_CAPITAL_SIGMA"+ " UTF8_CAPITAL_SIGMA"-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("( AN-CI\"") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("x<>y L.R.") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME(") 1/x") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_NAME("SUM x" UTF8_PRIME) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - - PORT_START("IN.5") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_NAME("FV") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_NAME("N") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_NAME("PMT") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_NAME("%i") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_NAME("PV") - - PORT_START("IN.6") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_NAME("EXC x" UTF8_PRIME) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("2nd") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_NAME("x" UTF8_POW_2" " UTF8_SQUAREROOT"x") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_NAME("ln(x) e" UTF8_POW_X) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) -INPUT_PORTS_END - -void ti30_state::ti30(machine_config &config) -{ - // basic machine hardware - TMS0980(config, m_maincpu, 400000); // guessed - m_maincpu->k().set(FUNC(ti30_state::read_k)); - m_maincpu->o().set(FUNC(ti30_state::write_o)); - m_maincpu->r().set(FUNC(ti30_state::write_r)); - m_maincpu->power_off().set(FUNC(ti30_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1fe, 0xff); - m_display->set_segmask(0x001, 0xe2); // 1st digit only has segments B,F,G,DP - config.set_default_layout(layout_ti30); - - // no sound! -} - -// roms - -ROM_START( ti30 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc0981nl", 0x0000, 0x1000, CRC(41298a14) SHA1(06f654c70add4044a612d3a38b0c2831c188fd0c) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( tibusan ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc0982nl", 0x0000, 0x1000, CRC(6954560a) SHA1(6c153a0c9239a811e3514a43d809964c06f8f88e) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_common1_micro.pla", 0, 1982, CRC(3709014f) SHA1(d28ee59ded7f3b9dc3f0594a32a98391b6e9c961) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti30_output.pla", 0, 352, CRC(00475f99) SHA1(70e04c1472639bd35d4adaab0b9f1ae4a0e394be) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - -ROM_START( tiprog ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "za0675nl", 0x0000, 0x1000, CRC(82355854) SHA1(03fab373bce04df8ea3fe25352525e8539213626) ) // tmc0983 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 1982, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0980_tiprog_micro.pla", 0, 1982, CRC(57043284) SHA1(0fa06d5865830ecdb3d870271cb92ac917bed3ca) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_tiprog_output.pla", 0, 352, BAD_DUMP CRC(125c4ee6) SHA1(b8d865c42fd37c3d9b92c5edbecfc831be558597) ) // corrected by hand - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common1_segment.pla", 0, 157, CRC(399aa481) SHA1(72c56c58fde3fbb657d69647a9543b5f8fc74279) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1000 (1977 version) - * TMS1990 MCU label TMC1991NL (die label 1991-91A) - * 8-digit 7seg LED display - - TI-1000 (1978 version) - * TMS1990 MCU label TMC1992-4NL **not dumped yet - -***************************************************************************/ - -class ti1000_state : public hh_tms1k_state -{ -public: - ti1000_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ti1000(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void ti1000_state::write_r(u16 data) -{ - // R0-R7: select digit - m_display->matrix(data, m_o); -} - -void ti1000_state::write_o(u16 data) -{ - // O0-O3,O5(?): input mux - // O0-O7: digit segments - m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); - m_o = bitswap<8>(data,7,4,3,2,1,0,6,5); -} - -u8 ti1000_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( ti1000 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.3") // O3 or O4? - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void ti1000_state::ti1000(machine_config &config) -{ - // basic machine hardware - TMS1990(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(ti1000_state::read_k)); - m_maincpu->o().set(FUNC(ti1000_state::write_o)); - m_maincpu->r().set(FUNC(ti1000_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 8); - m_display->set_segmask(0xff, 0xff); - config.set_default_layout(layout_ti1270); - - // no sound! -} - -// roms - -ROM_START( ti1000 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1991nl", 0x0000, 0x0400, CRC(2da5381d) SHA1(b5dc14553db2068ed48e130e5ec9109930d8cda9) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_ti1000_output.pla", 0, 352, CRC(a936631e) SHA1(1f900b12a41419d6e1ffbddd5cf72be3adaa4435) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) -ROM_END - - - - - -/*************************************************************************** - - TI WIZ-A-TRON - * TMS0970 MCU label TMC0907NL ZA0379, DP0907BS (die label 0970F-07B) - * 9-digit 7seg LED display(one custom digit) - -***************************************************************************/ - -class wizatron_state : public hh_tms1k_state -{ -public: - wizatron_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void wizatron(machine_config &config); - -protected: - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void wizatron_state::write_r(u16 data) -{ - // R0-R8: select digit - - // 3rd digit only has A and G for =, though some newer hardware revisions - // (goes for both wizatron and lilprof) use a custom equals-sign digit here - - // 6th digit is custom(not 7seg), for math symbols, like this: - // \./ GAB - // --- F - // /.\ EDC - m_display->matrix(data, m_o); -} - -void wizatron_state::write_o(u16 data) -{ - // O1-O4: input mux - // O0-O6: digit segments A-G - // O7: N/C - m_inp_mux = data >> 1 & 0xf; - m_o = data & 0x7f; -} - -u8 wizatron_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( wizatron ) - PORT_START("IN.0") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.1") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.2") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) -INPUT_PORTS_END - -void wizatron_state::wizatron(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(wizatron_state::read_k)); - m_maincpu->o().set(FUNC(wizatron_state::write_o)); - m_maincpu->r().set(FUNC(wizatron_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1ff^8, 0x7f); - m_display->set_segmask(8, 0x41); // equals sign - config.set_default_layout(layout_wizatron); - - // no sound! -} - -// roms - -ROM_START( wizatron ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0907nl_za0379", 0x0000, 0x0400, CRC(5a6af094) SHA1(b1f27e1f13f4db3b052dd50fb08dbf9c4d8db26e) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_wizatron_output.pla", 0, 352, CRC(c0ee5c04) SHA1(e9fadcef688309adbe6c1c0545aac6883ce4a1ac) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI Little Professor (1976 version) - * TMS0970 MCU label TMS0975NL ZA0356, GP0975CS (die label 0970D-75C) - * 9-digit 7seg LED display(one custom digit) - - The hardware is nearly identical to Wiz-A-Tron (or vice versa, since this - one is older). - -***************************************************************************/ - -class lilprof_state : public wizatron_state -{ -public: - lilprof_state(const machine_config &mconfig, device_type type, const char *tag) : - wizatron_state(mconfig, type, tag) - { } - - void lilprof(machine_config &config); - -private: - virtual void write_o(u16 data) override; - virtual u8 read_k() override; -}; - -// handlers - -void lilprof_state::write_o(u16 data) -{ - // O1-O4,O7: input mux - // O0-O6: digit segments A-G - m_inp_mux = (data >> 1 & 0xf) | (data >> 3 & 0x10); - m_o = data; -} - -u8 lilprof_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( lilprof ) - PORT_INCLUDE( wizatron ) - - PORT_MODIFY("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_CODE(KEYCODE_DEL) PORT_NAME("Set") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - - PORT_START("IN.4") // O7 - PORT_CONFNAME( 0x0f, 0x01, "Level") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) -INPUT_PORTS_END - -void lilprof_state::lilprof(machine_config &config) -{ - wizatron(config); - - // basic machine hardware - m_maincpu->k().set(FUNC(lilprof_state::read_k)); - m_maincpu->o().set(FUNC(lilprof_state::write_o)); -} - -// roms - -ROM_START( lilprof ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tms0975nl_za0356", 0x0000, 0x0400, CRC(fef9dd39) SHA1(5c9614c9c5092d55dabeee2d6e0387d50d6ad4d5) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common1_micro.pla", 0, 860, CRC(6ff5d51d) SHA1(59d3e5de290ba57694068ddba78d21a0c1edf427) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprof_output.pla", 0, 352, CRC(73f9ca93) SHA1(9d6c559e2c1886c62bcd57e3c3aa897e8829b4d2) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - TI Little Professor (1978 version) - * TMS1990 MCU label TMC1993NL (die label 1990C-c3C) - * 9-digit 7seg LED display(one custom digit) - - 1978 re-release, with on/off and level select on buttons instead of - switches. The casing was slightly revised in 1980 again, but same rom. - -***************************************************************************/ - -class lilprof78_state : public hh_tms1k_state -{ -public: - lilprof78_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void lilprof78(machine_config &config); - -private: - void write_o(u16 data); - void write_r(u16 data); - u8 read_k(); -}; - -// handlers - -void lilprof78_state::write_r(u16 data) -{ - // update leds state - u8 seg = bitswap<8>(m_o,7,4,3,2,1,0,6,5) & 0x7f; - u16 r = (data & 7) | (data << 1 & 0x1f0); - m_display->matrix(r, seg); - - // 3rd digit A/G(equals sign) is from O7 - m_display->write_row(3, (r != 0 && m_o & 0x80) ? 0x41 : 0); - - // 6th digit is a custom 7seg for math symbols (see wizatron_state write_r) - m_display->write_row(6, bitswap<8>(m_display->read_row(6),7,6,1,4,2,3,5,0)); -} - -void lilprof78_state::write_o(u16 data) -{ - // O0-O3,O5(?): input mux - // O0-O6: digit segments A-G - // O7: 6th digit - m_inp_mux = (data & 0xf) | (data >> 1 & 0x10); - m_o = data; -} - -u8 lilprof78_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( lilprof78 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.3") // O3 or O4? - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Set") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Level") - - PORT_START("IN.4") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") -INPUT_PORTS_END - -void lilprof78_state::lilprof78(machine_config &config) -{ - // basic machine hardware - TMS1990(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(lilprof78_state::read_k)); - m_maincpu->o().set(FUNC(lilprof78_state::write_o)); - m_maincpu->r().set(FUNC(lilprof78_state::write_r)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 7); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_wizatron); - - // no sound! -} - -// roms - -ROM_START( lilprof78 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc1993nl", 0x0000, 0x0400, CRC(e941316b) SHA1(7e1542045d1e731cea81a639c9ac9e91bb233b15) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common1_instr.pla", 0, 782, CRC(05306ef8) SHA1(60a0a3c49ce330bce0c27f15f81d61461d0432ce) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_common2_micro.pla", 0, 860, CRC(7f50ab2e) SHA1(bff3be9af0e322986f6e545b567c97d70e135c93) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_lilprof78_output.pla", 0, 352, CRC(b7416cc0) SHA1(57891ffeaf34aafe8a915086c6d2feb78f5113af) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common3_segment.pla", 0, 157, CRC(b5b3153f) SHA1(e0145c729695a4f962970aee0571d42cee6f5a9e) ) -ROM_END - - - - - -/*************************************************************************** - - TI-1680, TI-2550-IV - * TMS1980 MCU label TMC1981NL (die label 1980A 81F) - * TMC0999NL 256x4 RAM (die label 0999B) - * 9-digit cyan VFD display(leftmost digit is custom) - - The extra RAM is for scrolling back through calculations. For some reason, - TI-2550-IV has the same hardware, this makes it very different from II and III. - -***************************************************************************/ - -class ti1680_state : public hh_tms1k_state -{ -public: - ti1680_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_ram(*this, "ram") - { } - - void ti1680(machine_config &config); - -private: - required_device m_ram; - - virtual void update_display(); - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void ti1680_state::update_display() -{ - // note the extra segments on R9 and R3 - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80) | (m_r << 5 & 0x100)); -} - -void ti1680_state::write_r(u16 data) -{ - // R8,R0,R5,R6: TMC0999 data inputs - // R2,R4+R1/R7: TMC0999 control pins - m_ram->di_w(bitswap<4>(data,8,0,5,6)); - m_ram->adr_w(BIT(data, 2)); - m_ram->wr_w(BIT(data, 4) & BIT(data, 7)); - m_ram->rd_w(BIT(data, 4) & BIT(data, 1)); - - // R3-R8: input mux - m_inp_mux = data >> 3 & 0x3f; - - // R0-R8: select digit - // R9: digit DP segment - m_r = data; - update_display(); -} - -void ti1680_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; - update_display(); -} - -u8 ti1680_state::read_k() -{ - // K: multiplexed inputs, RAM data - return read_inputs(6) | m_ram->do_r(); -} - -// config - -static INPUT_PORTS_START( ti1680 ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("M") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("MR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("BST") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("RPL") - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_DEL) PORT_NAME("On/C") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("%") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - - PORT_START("IN.4") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - - PORT_START("IN.5") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("+/-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") -INPUT_PORTS_END - -void ti1680_state::ti1680(machine_config &config) -{ - // basic machine hardware - TMS1980(config, m_maincpu, 300000); // approximation - m_maincpu->k().set(FUNC(ti1680_state::read_k)); - m_maincpu->o().set(FUNC(ti1680_state::write_o)); - m_maincpu->r().set(FUNC(ti1680_state::write_r)); - m_maincpu->power_off().set(FUNC(ti1680_state::auto_power_off)); - - TMC0999(config, m_ram); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 9); - m_display->set_segmask(0x1fe, 0xff); - config.set_default_layout(layout_ti1680); - - // no sound! -} - -// roms - -ROM_START( ti1680 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1981nl", 0x0000, 0x1000, CRC(8467c5a1) SHA1(d3a48f6c9dd41e2dc0e0cfafa84dac8d21aacaa3) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_ti1680_output.pla", 0, 525, CRC(188af340) SHA1(eaf707266dde0d708870ef5d8f985ce88d35b43e) ) -ROM_END - - - - - -/*************************************************************************** - - TI DataMan - * TMS1980 MCU label TMC1982NL (die label 1980A 82B) - * 10-digit cyan VFD display(3 digits are custom) - -***************************************************************************/ - -class dataman_state : public hh_tms1k_state -{ -public: - dataman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void dataman(machine_config &config); - -protected: - virtual void update_display(); - virtual void write_o(u16 data); - virtual void write_r(u16 data); - virtual u8 read_k(); -}; - -// handlers - -void dataman_state::update_display() -{ - // note the extra segment on R9 - m_display->matrix(m_r & 0x1ff, m_o | (m_r >> 2 & 0x80)); -} - -void dataman_state::write_r(u16 data) -{ - // R0-R4: input mux - // R0-R8: select digit - // R9: =(equals sign) segment - m_r = m_inp_mux = data; - update_display(); -} - -void dataman_state::write_o(u16 data) -{ - // O0-O6: digit segments A-G - m_o = bitswap<8>(data,7,1,6,5,4,3,2,0) & 0x7f; - update_display(); -} - -u8 dataman_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[5]->read() | read_inputs(5); -} - -// config - -static INPUT_PORTS_START( dataman ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("=") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Memory Bank") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Go") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(UTF8_MULTIPLY) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(UTF8_DIVIDE) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Force Out") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Number Guesser") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wipe Out") - - // note: even though power buttons are on the matrix, they are not CPU-controlled - PORT_START("IN.5") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_U) PORT_NAME("On/User Entry") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, false) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("?") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Electro Flash") -INPUT_PORTS_END - -void dataman_state::dataman(machine_config &config) -{ - // basic machine hardware - TMS1980(config, m_maincpu, 300000); // patent says 300kHz - m_maincpu->k().set(FUNC(dataman_state::read_k)); - m_maincpu->o().set(FUNC(dataman_state::write_o)); - m_maincpu->r().set(FUNC(dataman_state::write_r)); - m_maincpu->power_off().set(FUNC(dataman_state::auto_power_off)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0x1ff, 0x7f); - config.set_default_layout(layout_dataman); - - // no sound! -} - -// roms - -ROM_START( dataman ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1982nl", 0x0000, 0x1000, CRC(3521f53f) SHA1(c46fe7fe20715fdf5aed65833fb867cfd3938062) ) // matches patent US4340374 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_dataman_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) -ROM_END - - - - - -/*************************************************************************** - - TI Math Marvel - * TMS1980 MCU label TMC1986A-NL (die label 1980A 86A) - * 9-digit cyan VFD display(2 digits are custom), 1-bit sound - - This is the same hardware as DataMan, with R8 connected to a piezo. - -***************************************************************************/ - -class mathmarv_state : public dataman_state -{ -public: - mathmarv_state(const machine_config &mconfig, device_type type, const char *tag) : - dataman_state(mconfig, type, tag) - { } - - void mathmarv(machine_config &config); - -private: - virtual void write_r(u16 data) override; -}; - -// handlers - -void mathmarv_state::write_r(u16 data) -{ - // R8: speaker out - m_speaker->level_w(data >> 8 & 1); - - // rest is same as dataman - dataman_state::write_r(data); -} - -// config - -static INPUT_PORTS_START( mathmarv ) - PORT_INCLUDE( dataman ) - - PORT_MODIFY("IN.4") // R4 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Quest") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Checker") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Review") - - PORT_MODIFY("IN.5") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_N) PORT_NAME("On/Numberific") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Zap") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Flash") -INPUT_PORTS_END - -void mathmarv_state::mathmarv(machine_config &config) -{ - dataman(config); - - // basic machine hardware - m_maincpu->r().set(FUNC(mathmarv_state::write_r)); - - config.set_default_layout(layout_mathmarv); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mathmarv ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD16_WORD( "tmc1986anl", 0x0000, 0x1000, CRC(79fda72d) SHA1(137852b29d9136459f78e29e7810195a956a5903) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "maincpu:opla", 0 ) - ROM_LOAD( "tms1980_mathmarv_output.pla", 0, 525, CRC(5fc6f451) SHA1(11475c785c34eab5b13c5dc67f413c709cd4bd4d) ) -ROM_END - - - - - -/*************************************************************************** - - Texas Instruments maze game (unreleased, from patent GB2040172A) - * TMS1000 (development version) - * 1 7seg LED digit, no sound - - The title of this game is unknown, the patent describes it simply as a maze game. - Several electronic maze game concepts are listed in the patent. The PCB schematic - and program source code is included for one of them: A predefined 12*8 maze, - walls close to the player are displayed on a 7seg digit. - - In the end Texas Instruments didn't release any electronic maze game. This version - is too simple and obviously unfinished, start and goal positions are always the same - and there is a lot of ROM space left for more levels. - -***************************************************************************/ - -class timaze_state : public hh_tms1k_state -{ -public: - timaze_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void timaze(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void timaze_state::write_r(u16 data) -{ - // R0: input mux - m_inp_mux = data & 1; -} - -void timaze_state::write_o(u16 data) -{ - // O3210: 7seg EGCD? - m_display->matrix(1, bitswap<8>(data, 7,1,6,0,3,2,5,4)); -} - -u8 timaze_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(1); -} - -// config - -static INPUT_PORTS_START( timaze ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY -INPUT_PORTS_END - -void timaze_state::timaze(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 200000); // approximation - RC osc. R=80K, C=27pF - m_maincpu->k().set(FUNC(timaze_state::read_k)); - m_maincpu->r().set(FUNC(timaze_state::write_r)); - m_maincpu->o().set(FUNC(timaze_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 8); - m_display->set_segmask(1, 0x5c); - config.set_default_layout(layout_timaze); - - // no sound! -} - -// roms - -ROM_START( timaze ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "gb2040172a", 0x0000, 0x0400, CRC(0bab4dc6) SHA1(c9d40649fbb27a8b7cf7460d66c7e217b63376f0) ) // from patent GB2040172A, verified with source code - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, BAD_DUMP CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) // not in patent, use default one - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_timaze_output.pla", 0, 365, BAD_DUMP CRC(f0f36970) SHA1(a6ad1f5e804ac98e5e1a1d07466b3db3a8d6c256) ) // described in patent, but unsure about pin order -ROM_END - - - - - -/*************************************************************************** - - Texas Instruments Electronic Digital Thermostat - * TMS0970 MCU, label TMS0970NLL TMC0910B (die label 0970F-10E) - * 9-digit 7seg LED display, only 4 used - * temperature sensor, heat/cool/fan outputs - - This is a thermostat and digital clock. It's the 2nd one described in - patents US4388692 and US4298946. - -***************************************************************************/ - -class tithermos_state : public hh_tms1k_state -{ -public: - tithermos_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_60hz(*this, "ac_line") - { } - - void tithermos(machine_config &config); - -private: - required_device m_60hz; - - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void tithermos_state::write_r(u16 data) -{ - // D1-D4: select digit - m_display->matrix(data, m_o); - - // D6: heat/cool - // D8: A/D reset - m_r = data; -} - -void tithermos_state::write_o(u16 data) -{ - // SA-SP: input mux - // SA-SG: digit segments - m_o = m_inp_mux = data; -} - -u8 tithermos_state::read_k() -{ - // K: multiplexed inputs - u8 data = read_inputs(8); - - // when SB/SD/SP is high: - if (m_inp_mux & 0x8a) - { - // K1: 60hz from AC line - // K2: battery low? - // K8: A/D output (TODO) - data |= (m_60hz->signal_r()) ? 1 : 0; - } - - return data; -} - -// config - -static INPUT_PORTS_START( tithermos ) - PORT_START("IN.0") // SA - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Temp Row PM 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Time Row PM 2") - - PORT_START("IN.1") // SB - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // SC - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Temp Row PM 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Time Row PM 1") - - PORT_START("IN.3") // SD - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line - PORT_CONFNAME( 0x06, 0x04, "System") - PORT_CONFSETTING( 0x04, "Heat" ) - PORT_CONFSETTING( 0x00, "Off" ) - PORT_CONFSETTING( 0x02, "Cool" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output - - PORT_START("IN.4") // SE - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Temp Row AM 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Time Row AM 2") - - PORT_START("IN.5") // SF - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Temp Row AM 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Time Row AM 1") - - PORT_START("IN.6") // SG - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Temp / Actual") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Time / Clock") - - PORT_START("IN.7") // SP - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // AC line - PORT_CONFNAME( 0x06, 0x04, "Mode") - PORT_CONFSETTING( 0x04, "Constant" ) - PORT_CONFSETTING( 0x00, "Day/Night" ) - PORT_CONFSETTING( 0x02, "Night" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // A/D output - - PORT_START("IN.8") - PORT_CONFNAME( 0x01, 0x00, "Fan") - PORT_CONFSETTING( 0x00, "On" ) - PORT_CONFSETTING( 0x01, "Auto" ) // same output as heat/cool -INPUT_PORTS_END - -void tithermos_state::tithermos(machine_config &config) -{ - // basic machine hardware - TMS0970(config, m_maincpu, 250000); // approximation - m_maincpu->k().set(FUNC(tithermos_state::read_k)); - m_maincpu->r().set(FUNC(tithermos_state::write_r)); - m_maincpu->o().set(FUNC(tithermos_state::write_o)); - - CLOCK(config, "ac_line", 60); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_tithermos); - - // no sound! -} - -// roms - -ROM_START( tithermos ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "tmc0910b", 0x0000, 0x0400, CRC(232011cf) SHA1(598ae8cecd98226fb5056c99ce9f47fd23785fd7) ) - - ROM_REGION( 782, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0970_common2_instr.pla", 0, 782, CRC(e038fc44) SHA1(dfc280f6d0a5828d1bb14fcd59ac29caf2c2d981) ) - ROM_REGION( 860, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0970_tithermos_micro.pla", 0, 860, CRC(a3bb8ca5) SHA1(006ea733440001c37a77d4ffbc4bd2a8fee212ac) ) - ROM_REGION( 352, "maincpu:opla", 0 ) - ROM_LOAD( "tms0980_tithermos_output.pla", 0, 352, CRC(eb3598fd) SHA1(2372ae17fb982cae2710bf8c348bf02b767daabd) ) - ROM_REGION( 157, "maincpu:spla", 0 ) - ROM_LOAD( "tms0980_common2_segment.pla", 0, 157, CRC(c03cccd8) SHA1(08bc4b597686a7aa8b2c9f43b85b62747ffd455b) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Sub Wars (model 7-490) - * PCB label CSG201A(main), CSG201B(leds) - * TMS1200N2LL MP3352 (die label 1000C, MP3352) - * 4-digit 7seg LED display + 55 other LEDs, 1-bit sound - - Tiger/Yeno also published an LCD handheld called Sub Wars, it's not related. - - This handheld was modified and used as a prop in the 1981 movie Escape from - New York, Snake Plissken uses it as a homing device. - -***************************************************************************/ - -class subwars_state : public hh_tms1k_state -{ -public: - subwars_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void subwars(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void subwars_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void subwars_state::write_r(u16 data) -{ - // R0-R3: digit select - // R4-R12: led select - m_r = data; - update_display(); -} - -void subwars_state::write_o(u16 data) -{ - // O0-O6: led data - m_o = data; - update_display(); - - // O7: speaker out - m_speaker->level_w(BIT(data, 7)); -} - -// config - -static INPUT_PORTS_START( subwars ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void subwars_state::subwars(machine_config &config) -{ - // basic machine hardware - TMS1200(config, m_maincpu, 550000); // approximation - RC osc. R=24K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(subwars_state::write_r)); - m_maincpu->o().set(FUNC(subwars_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(13, 7); - m_display->set_segmask(0xf, 0x7f); - config.set_default_layout(layout_subwars); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( subwars ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp3352", 0x0000, 0x0400, CRC(5dece1e4) SHA1(65ef77b063c94ff4b6c83dace54ea2f75bd3d6a9) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common1_micro.pla", 0, 867, CRC(4becec19) SHA1(3c8a9be0f00c88c81f378b76886c39b10304f330) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_subwars_output.pla", 0, 365, CRC(372b9bbc) SHA1(06a875e114b7757c6f4f1727416d1739ebe60931) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Playmaker: Hockey, Soccer, Basketball (model 7-540 or 7-540A) - * TMS1100 MP1215 (die label 1100B MP1215) - * 2-digit 7seg LED display + 40 other LEDs, 1-bit sound - - The games are on playcards(Tiger calls them that), the hardware detects which - game is inserted from a notch at the lower-right. The playcards also function - as an overlay. MAME external artwork is needed for those. - - Booting the handheld with no playcard inserted will initiate a halftime show. - - "Playmaker" is actually Tiger's trademark for the d-pad controller, this - controller term was also used in for example Deluxe Football, and 7 in 1 Sports - Stadium. The d-pad has a ball shape at the bottom that sits on a concave base. - It is patented under US4256931 (mid-1979, a couple of years before Nintendo's - Game & Watch d-pad with US4687200). - -***************************************************************************/ - -class playmaker_state : public hh_tms1k_state -{ -public: - playmaker_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void playmaker(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - u8 m_notch = 0; // cartridge K1/K2 - - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void playmaker_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_notch)); -} - -// handlers - -DEVICE_IMAGE_LOAD_MEMBER(playmaker_state::cart_load) -{ - if (!image.loaded_through_softlist()) - { - image.seterror(image_error::UNSUPPORTED, "Can only load through softwarelist"); - return image_init_result::FAIL; - } - - // get cartridge notch - const char *notch = image.get_feature("notch"); - m_notch = notch ? strtoul(notch, nullptr, 0) & 3 : 0; - - return image_init_result::PASS; -} - -void playmaker_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void playmaker_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R3: input mux - m_inp_mux = data & 0xf; - - // R0-R7: led select - // R8,R9: digit select - m_r = data; - update_display(); -} - -void playmaker_state::write_o(u16 data) -{ - // O0-O6: led data - m_o = data; - update_display(); -} - -u8 playmaker_state::read_k() -{ - // K: multiplexed inputs, cartridge notch from R3 - return read_inputs(3) | ((m_inp_mux & 8) ? m_notch : 0); -} - -// config - -static INPUT_PORTS_START( playmaker ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Shoot") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Shoot / P1 Skill") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass / P2 Skill") -INPUT_PORTS_END - -void playmaker_state::playmaker(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=20K, C=250pF - m_maincpu->k().set(FUNC(playmaker_state::read_k)); - m_maincpu->r().set(FUNC(playmaker_state::write_r)); - m_maincpu->o().set(FUNC(playmaker_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 7); - m_display->set_segmask(0x300, 0x7f); - m_display->set_bri_levels(0.004, 0.04); // player 1 leds are brighter - config.set_default_layout(layout_playmaker); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); - - // cartridge - generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "playmaker_cart")); - cartslot.set_must_be_loaded(false); - cartslot.set_device_load(FUNC(playmaker_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("playmaker"); -} - -// roms - -ROM_START( playmaker ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1215", 0x0000, 0x0800, CRC(bfc7b6c8) SHA1(33f6e2b86fae2fd9e4b0a4b8dc842c257ca3047d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_playmaker_output.pla", 0, 365, CRC(0cd484d6) SHA1(4a9af9f3d18af504145690cb0f6444ff1aef26ca) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Deluxe Football with Instant Replay (model 7-550) - * TMS1400NLL MP7302 (die label TMS1400 MP7302) - * 4-digit 7seg LED display, 80 red/green LEDs, 1-bit sound - - According to the manual, player 1 is green, player 2 is red. But when - playing a 1-player game, the CPU controls green, so on MAME, player 1 - is the red side. - - Booting the handheld with the Score and Replay buttons held down will - initiate a halftime show. - -***************************************************************************/ - -class dxfootb_state : public hh_tms1k_state -{ -public: - dxfootb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void dxfootb(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void dxfootb_state::update_display() -{ - // 2 led groups (double multiplexed) - u16 g1 = (m_r & 0x100) ? 0x7f : 0; - u16 g2 = (m_r & 0x80) ? 0x7f << 7 : 0; - m_display->matrix((m_r & g1) | (m_r << 7 & g2), m_o); -} - -void dxfootb_state::write_r(u16 data) -{ - // R9,R10: speaker out - m_speaker->level_w(data >> 9 & 3); - - // R3-R6: input mux - m_inp_mux = data >> 3 & 0xf; - - // R0-R6: led select - // R7,R8: group select - m_r = data; - update_display(); -} - -void dxfootb_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 dxfootb_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( dxfootb ) - PORT_START("IN.0") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Replay / Skill (Green)") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Score / Skill (Red)") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Pass") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Kick") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pass") - - PORT_START("IN.2") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - - PORT_START("IN.3") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) -INPUT_PORTS_END - -void dxfootb_state::dxfootb(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(dxfootb_state::read_k)); - m_maincpu->r().set(FUNC(dxfootb_state::write_r)); - m_maincpu->o().set(FUNC(dxfootb_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(7+7, 8); - m_display->set_segmask(0x3c00, 0x7f); - config.set_default_layout(layout_dxfootb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( dxfootb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7302", 0x0000, 0x1000, CRC(a8077062) SHA1(c1318fe5c8f2db021d7d1264fc70158944045fa3) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_dxfootb_output.pla", 0, 557, CRC(a1b3d2c0) SHA1(8030e6dcd3878b58668c98cff36d93b764e1d67f) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Copy Cat (model 7-520) - * PCB label CC REV B - * TMS1000 MCU, label 69-11513 MP0919 (die label MP0919) - * 4 LEDs, 1-bit sound - - known releases: - - World: Copy Cat, published by Tiger - - USA(1): Follow Me, published by Sears - - USA(2): Electronic Repeat, published by Tandy - -***************************************************************************/ - -class copycat_state : public hh_tms1k_state -{ -public: - copycat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void copycat(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void copycat_state::write_r(u16 data) -{ - // R0-R3: leds - m_display->matrix(1, data & 0xf); - - // R4-R7: input mux - // R8-R10: N/C - m_inp_mux = data >> 4 & 0xf; -} - -void copycat_state::write_o(u16 data) -{ - // O0,O1: speaker out - // O2,O7: N/C, O3-O6: tied together but unused - m_speaker->level_w(data & 3); -} - -u8 copycat_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( copycat ) - PORT_START("IN.0") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - - PORT_START("IN.1") // R5 - PORT_CONFNAME( 0x0f, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_CONFSETTING( 0x08, "4" ) - - PORT_START("IN.2") // R6 - PORT_CONFNAME( 0x07, 0x01, "Game Select") - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Best Play") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Play") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Replay") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void copycat_state::copycat(machine_config &config) -{ - // basic machine hardware - TMS1000(config, m_maincpu, 320000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(copycat_state::read_k)); - m_maincpu->r().set(FUNC(copycat_state::write_r)); - m_maincpu->o().set(FUNC(copycat_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_copycat); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( copycat ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp0919", 0x0000, 0x0400, CRC(92a21299) SHA1(16daadb8dbf53aaab8a71833017b4a578d035d6d) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_copycat_output.pla", 0, 365, CRC(b1d0c96d) SHA1(ac1a003eab3f69e09e9050cb24ea17211e0523fe) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Electronics Copy Cat (model 7-522) - * PCB label WS 8107-1 - * TMS1730 MCU, label MP3005N (die label 1700 MP3005) - * 4 LEDs, 1-bit sound - - This is a simplified rerelease of Copy Cat, 10(!) years later. The gameplay - is identical to Ditto. - - 3 variations exist, each with a different colored case. Let's assume that - they're on the same hardware. - - white case, yellow orange green red buttons and leds (same as model 7-520) - - yellow case, purple orange blue pink buttons, leds are same as older version - - transparent case, transparent purple orange blue red buttons, leds same as before - -***************************************************************************/ - -class copycatm2_state : public hh_tms1k_state -{ -public: - copycatm2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void copycatm2(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void copycatm2_state::write_r(u16 data) -{ - // R1-R4: leds - m_display->matrix(1, data >> 1 & 0xf); -} - -void copycatm2_state::write_o(u16 data) -{ - // O0,O6: speaker out - m_speaker->level_w((data & 1) | (data >> 5 & 2)); -} - -// config - -static INPUT_PORTS_START( copycatm2 ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Orange Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Red Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Green Button") -INPUT_PORTS_END - -void copycatm2_state::copycatm2(machine_config &config) -{ - // basic machine hardware - TMS1730(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(copycatm2_state::write_r)); - m_maincpu->o().set(FUNC(copycatm2_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_copycatm2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( copycatm2 ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "mp3005n", 0x0000, 0x0200, CRC(a87649cb) SHA1(14ef7967a80578885f0b905772c3bb417b5b3255) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_copycatm2_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_copycatm2_output.pla", 0, 365, CRC(d1999aaf) SHA1(0c27789b349e491d5230f9c75c4741e621f5a14e) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger Ditto (model 7-530) - * TMS1700 MCU, label MP1801-N2LL (die label 1700 MP1801) - * 4 LEDs, 1-bit sound - - known releases: - - World: Ditto, published by Tiger - - USA: Electronic Pocket Repeat (model 60-2152/60-2468A), published by Tandy - note: 1996 model 60-2482 MCU is a Z8, and is assumed to be a clone of Tiger Copycat Jr. - -***************************************************************************/ - -class ditto_state : public hh_tms1k_state -{ -public: - ditto_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ditto(machine_config &config); - -private: - void write_r(u16 data); - void write_o(u16 data); -}; - -// handlers - -void ditto_state::write_r(u16 data) -{ - // R0-R3: leds - m_display->matrix(1, data & 0xf); -} - -void ditto_state::write_o(u16 data) -{ - // O5,O6: speaker out - m_speaker->level_w(data >> 5 & 3); -} - -// config - -static INPUT_PORTS_START( ditto ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Blue Button") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Orange Button") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Red Button") -INPUT_PORTS_END - -void ditto_state::ditto(machine_config &config) -{ - // basic machine hardware - TMS1700(config, m_maincpu, 275000); // approximation - RC osc. R=100K, C=47pF - m_maincpu->k().set_ioport("IN.0"); - m_maincpu->r().set(FUNC(ditto_state::write_r)); - m_maincpu->o().set(FUNC(ditto_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 4); - config.set_default_layout(layout_ditto); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ditto ) - ROM_REGION( 0x0200, "maincpu", 0 ) - ROM_LOAD( "mp1801", 0x0000, 0x0200, CRC(cee6043b) SHA1(4ec334be6835688413637ff9d9d7a5f0d61eba27) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_ditto_micro.pla", 0, 867, CRC(2710d8ef) SHA1(cb7a13bfabedad43790de753844707fe829baed0) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_ditto_output.pla", 0, 365, CRC(2b708a27) SHA1(e95415e51ffbe5da3bde1484fcd20467dde9f09a) ) -ROM_END - - - - - -/*************************************************************************** - - Tiger 7 in 1 Sports Stadium (model 7-555) - * TMS1400 MP7304 (die label TMS1400 MP7304A) - * 2x2-digit 7seg LED display + 39 other LEDs, 1-bit sound - - This handheld includes 7 games: 1: Basketball, 2: Hockey, 3: Soccer, - 4: Maze, 5: Baseball, 6: Football, 7: Raquetball. - MAME external artwork is needed for the switchable overlays. - - known releases: - - World: 7 in 1 Sports Stadium, published by Tiger - - USA: 7 in 1 Sports, published by Sears - -***************************************************************************/ - -class t7in1ss_state : public hh_tms1k_state -{ -public: - t7in1ss_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void t7in1ss(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void t7in1ss_state::update_display() -{ - m_display->matrix(m_r, m_o); -} - -void t7in1ss_state::write_r(u16 data) -{ - // R9: speaker out - m_speaker->level_w(data >> 9 & 1); - - // R0-R2,R10: input mux - m_inp_mux = (data & 7) | (data >> 7 & 8); - - // R0-R3: digit select - // R4-R8: led select - m_r = data; - update_display(); -} - -void t7in1ss_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 t7in1ss_state::read_k() -{ - // K: multiplexed inputs - return read_inputs(4); -} - -// config - -static INPUT_PORTS_START( t7in1ss ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - - PORT_START("IN.3") // R10 - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -void t7in1ss_state::t7in1ss(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, 425000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(t7in1ss_state::read_k)); - m_maincpu->r().set(FUNC(t7in1ss_state::write_r)); - m_maincpu->o().set(FUNC(t7in1ss_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(9, 8); - m_display->set_segmask(0xf, 0x7f); - m_display->set_bri_levels(0.004, 0.04); // player led is brighter - config.set_default_layout(layout_t7in1ss); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( t7in1ss ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7304", 0x0000, 0x1000, CRC(2a1c8390) SHA1(fa10e60686af6828a61f05046abc3854ab49af95) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_t7in1ss_output.pla", 0, 557, CRC(6b7660f7) SHA1(bb7d58fa04e7606ccdf5b209e1b089948bdd1e7c) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronics) Break Up (manufactured in Japan) - * PCB label TOMY B.O. - * TMS1040 MP2726 TOMY WIPE (die label MP2726A) - * TMS1025N2LL I/O expander - * 2-digit 7seg display, 46 other leds, 1-bit sound - - known releases: - - USA: Break Up, published by Tomy - - Japan: Block Attack, published by Tomy - - UK: Break-In, published by Tomy - - led translation table: led zz from game PCB = MAME y.x: - - 00 = - 10 = 5.0 20 = 4.2 - 01 = 7.0 11 = 5.1 21 = 3.3 - 02 = 7.1 12 = 5.2 22 = 2.2 - 03 = 7.2 13 = 5.3 - 04 = 7.3 14 = 4.3 - 05 = 6.0 15 = 3.1 - 06 = 6.1 16 = 3.2 - 07 = 6.2 17 = 3.0 - 08 = 6.3 18 = 4.1 - 09 = 4.0 19 = 2.1 - - the 7seg panel is 0.* and 1.*(aka digit0/1), - and the 8(2*4) * 3 rectangular leds panel, where x=0,1,2,3: - - 9.* 11.* - 8.* 13.* - 10.* 12.* - -***************************************************************************/ - -class tbreakup_state : public hh_tms1k_state -{ -public: - tbreakup_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_expander(*this, "expander") - { } - - void tbreakup(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(skill_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - virtual void machine_start() override; - -private: - required_device m_expander; - u8 m_exp_port[7] = { }; - void expander_w(offs_t offset, u8 data); - - void set_clock(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void tbreakup_state::machine_start() -{ - hh_tms1k_state::machine_start(); - save_item(NAME(m_exp_port)); -} - -void tbreakup_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - set_clock(); -} - -// handlers - -void tbreakup_state::set_clock() -{ - // MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K - m_maincpu->set_unscaled_clock((m_inputs[3]->read() & 1) ? 500000 : 325000); -} - -void tbreakup_state::update_display() -{ - // 7seg leds from R0,R1 and O0-O6 - m_display->matrix_partial(0, 2, m_r, m_o & 0x7f); - - // 22 round leds from O2-O7 and expander port 7 - m_display->matrix_partial(2, 6, m_o >> 2, m_exp_port[6]); - - // 24 rectangular leds from expander ports 1-6 (not strobed) - for (int y = 0; y < 6; y++) - m_display->write_row(y+8, m_exp_port[y]); -} - -void tbreakup_state::expander_w(offs_t offset, u8 data) -{ - // TMS1025 port 1-7 data - m_exp_port[offset] = data; -} - -void tbreakup_state::write_r(u16 data) -{ - // R6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // R7,R8: input mux - m_inp_mux = data >> 7 & 3; - - // R3-R5: TMS1025 port S - // R2: TMS1025 STD pin - m_expander->write_s(data >> 3 & 7); - m_expander->write_std(data >> 2 & 1); - - // R0,R1: select digit - m_r = ~data; - update_display(); -} - -void tbreakup_state::write_o(u16 data) -{ - // O0-O3: TMS1025 port H - m_expander->write_h(data & 0xf); - - // O0-O7: led state - m_o = data; - update_display(); -} - -u8 tbreakup_state::read_k() -{ - // K4: fixed input - // K8: multiplexed inputs - return (m_inputs[2]->read() & 4) | (read_inputs(2) & 8); -} - -// config - -static INPUT_PORTS_START( tbreakup ) - PORT_START("IN.0") // R7 K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Ball") - - PORT_START("IN.1") // R8 K8 - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hit") - - PORT_START("IN.2") // K4 - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Lives ) ) - PORT_CONFSETTING( 0x00, "3" ) - PORT_CONFSETTING( 0x04, "5" ) - - PORT_START("IN.3") // fake - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tbreakup_state, skill_switch, 0) - PORT_CONFSETTING( 0x00, "Pro 1" ) - PORT_CONFSETTING( 0x01, "Pro 2" ) -INPUT_PORTS_END - -void tbreakup_state::tbreakup(machine_config &config) -{ - // basic machine hardware - TMS1040(config, m_maincpu, 325000); // see set_clock - m_maincpu->k().set(FUNC(tbreakup_state::read_k)); - m_maincpu->r().set(FUNC(tbreakup_state::write_r)); - m_maincpu->o().set(FUNC(tbreakup_state::write_o)); - - TMS1025(config, m_expander).set_ms(1); // MS tied high - m_expander->write_port1_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port2_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port3_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port4_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port5_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port6_callback().set(FUNC(tbreakup_state::expander_w)); - m_expander->write_port7_callback().set(FUNC(tbreakup_state::expander_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(2+6+6, 8); - m_display->set_segmask(3, 0x7f); - config.set_default_layout(layout_tbreakup); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tbreakup ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp2726a", 0x0000, 0x0400, CRC(1f7c28e2) SHA1(164cda4eb3f0b1d20955212a197c9aadf8d18a06) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000_tbreakup_output.pla", 0, 365, CRC(a1ea035e) SHA1(fcf0b57ed90b41441a8974223a697f530daac0ab) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Power House Pinball - * PCB label TOMY P-B - * TMS1100 MP1180 TOMY PINB (die label MP1180) - * 3 7seg LEDs, and other LEDs behind bezel, 1-bit sound - - known releases: - - USA: Power House Pinball, published by Tomy - - Japan: Pinball, published by Tomy - - Europe: Flipper, published by Tomy - - led translation table: led zz from game PCB = MAME y.x: - - 0 = - 10 = 5.0 20 = 6.4 A = 3.0 - 1 = 3.3 11 = 5.5 21 = 6.5 B = 3.4 - 2 = 3.1 12 = 5.1 22 = 7.0 C = 3.5 - 3 = 3.2 13 = 5.2 23 = 7.1 D = 8.0 - 4 = 4.0 14 = 5.3 24 = 7.2 E = 8.1 - 5 = 4.1 15 = 6.0 25 = 7.3 F = 8.2 - 6 = 4.2 16 = 5.4 26 = 7.4 G = 8.3 - 7 = 4.3 17 = 6.1 - 8 = 4.4 18 = 6.2 - 9 = 4.5 19 = 6.3 - - NOTE!: MAME external artwork is required - -***************************************************************************/ - -class phpball_state : public hh_tms1k_state -{ -public: - phpball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void phpball(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(flipper_button) { update_display(); } - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void phpball_state::update_display() -{ - // rectangular LEDs under LEDs D,F and E,G are directly connected - // to the left and right flipper buttons - output them to 10.a and 9.a - u16 in1 = m_inputs[1]->read() << 7 & 0x600; - m_display->matrix((m_r & 0x1ff) | in1, m_o); -} - -void phpball_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R9: input mux - m_inp_mux = data >> 9 & 1; - - // R0-R2: digit select - // R0-R8: led select - m_r = data; - update_display(); -} - -void phpball_state::write_o(u16 data) -{ - // O0-O6: digit segment/led data - // O7: N/C - m_o = data & 0x7f; - update_display(); -} - -u8 phpball_state::read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[1]->read() | read_inputs(1); -} - -// config - -static INPUT_PORTS_START( phpball ) - PORT_START("IN.0") // R9 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Plunger") - PORT_BIT( 0x0d, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // Vss! - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Flipper") PORT_CHANGED_MEMBER(DEVICE_SELF, phpball_state, flipper_button, 0) -INPUT_PORTS_END - -void phpball_state::phpball(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 375000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(phpball_state::read_k)); - m_maincpu->r().set(FUNC(phpball_state::write_r)); - m_maincpu->o().set(FUNC(phpball_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(11, 7); - m_display->set_segmask(7, 0x7f); - config.set_default_layout(layout_phpball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( phpball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1180", 0x0000, 0x0800, CRC(2163b92d) SHA1(bc53d1911e88b4e89d951c6f769703105c13389c) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_phpball_output.pla", 0, 365, CRC(87e67aaf) SHA1(ebc7bae1352f39173f1bf0dc10cdc6f635dedab4) ) -ROM_END - - - - - -/*************************************************************************** - - U.S. Games Super Sports-4 - * TMS1100 MP1219 (no decap) - * 4 7seg LEDs, 49 other LEDs, 1-bit sound - - The game is very similar to t3in1sa, even parts of the ROM match. But by - the time that one was released (in 1983 or 1984), U.S. Games did not exist - anymore. I suspect t3in1sa was programmed by the same (Hong Kong) company. - - This handheld includes 4 games: Basketball, Football, Soccer, Hockey. - MAME external artwork is needed for the switchable overlays. - -***************************************************************************/ - -class ssports4_state : public hh_tms1k_state -{ -public: - ssports4_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void ssports4(machine_config &config); - -private: - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -// handlers - -void ssports4_state::update_display() -{ - // note: R2 is an extra column - m_display->matrix(m_r, m_o | (m_r << 6 & 0x100)); -} - -void ssports4_state::write_r(u16 data) -{ - // R10: speaker out - m_speaker->level_w(data >> 10 & 1); - - // R0-R9: led select/data - // R0,R1 and R8,R9 are 7segs - m_r = data; - update_display(); -} - -void ssports4_state::write_o(u16 data) -{ - // O0-O7: led data - m_o = data; - update_display(); -} - -u8 ssports4_state::read_k() -{ - // input mux is from R0,1,5,8,9 and O7 - m_inp_mux = (m_r & 3) | (m_r >> 3 & 4) | (m_r >> 5 & 0x18) | (m_o >> 2 & 0x20); - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ssports4 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY - - PORT_START("IN.2") // R5 - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x04, "2" ) - PORT_CONFNAME( 0x08, 0x08, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x08, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - - PORT_START("IN.3") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_16WAY PORT_NAME("P1 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_16WAY PORT_NAME("P1 Up-Right / Info") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_16WAY PORT_NAME("P1 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_16WAY PORT_NAME("P1 O.P.") // offensive player (modifier button) - - PORT_START("IN.4") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Left / Kick") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Up-Right / Info") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 Pass") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_16WAY PORT_NAME("P2 O.P.") - - PORT_START("IN.5") // O7 - PORT_CONFNAME( 0x03, 0x00, "Game Select" ) - PORT_CONFSETTING( 0x02, "Basketball" ) - PORT_CONFSETTING( 0x00, "Football" ) - PORT_CONFSETTING( 0x01, "Soccer" ) - PORT_CONFSETTING( 0x03, "Hockey" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ssports4_state::ssports4(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, 350000); // approximation - RC osc. R=47K, C=47pF - m_maincpu->k().set(FUNC(ssports4_state::read_k)); - m_maincpu->r().set(FUNC(ssports4_state::write_r)); - m_maincpu->o().set(FUNC(ssports4_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 9); - m_display->set_segmask(0x303, 0x7f); - m_display->set_bri_levels(0.005, 0.05); // offense leds are brighter - config.set_default_layout(layout_ssports4); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssports4 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mp1219", 0x0000, 0x0800, CRC(865c06d6) SHA1(12a625a13bdb57b82b35c42b175d38756a1e2e04) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, BAD_DUMP CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) ) // not verified - ROM_REGION( 365, "maincpu:opla", ROMREGION_ERASE00 ) - ROM_LOAD( "tms1100_ssports4_output.pla", 0, 365, NO_DUMP ) - - ROM_REGION16_LE( 0x40, "maincpu:opla_b", ROMREGION_ERASE00 ) // verified, electronic dump - ROM_LOAD16_BYTE( "tms1100_ssports4_output.bin", 0, 0x20, CRC(cd6f162f) SHA1(3348edb697e996b5ab82be54076b9cd444e0f2b1) ) -ROM_END - - - - - -/*************************************************************************** - - Vulcan XL 25 - * TMS1000SLC MP4486A (die label 1000C/, MP4486A) - * 28 LEDs, 1-bit sound - - This game is the same logic puzzle as Tiger's Lights Out, except that - all 25 lights need to be turned on instead of off. - -***************************************************************************/ - -class xl25_state : public hh_tms1k_state -{ -public: - xl25_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag) - { } - - void xl25(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(k4_button) { update_halt(); } - -protected: - virtual void machine_reset() override; - -private: - void update_halt(); - void update_display(); - void write_r(u16 data); - void write_o(u16 data); - u8 read_k(); -}; - -void xl25_state::machine_reset() -{ - hh_tms1k_state::machine_reset(); - update_halt(); -} - -// handlers - -void xl25_state::update_halt() -{ - // O5+K4 go to HALT pin (used when pressing store/recall button) - bool halt = !((m_o & 0x20) || (read_k() & 4)); - m_maincpu->set_input_line(INPUT_LINE_HALT, halt ? ASSERT_LINE : CLEAR_LINE); -} - -void xl25_state::update_display() -{ - m_display->matrix(m_r, m_o >> 1); -} - -void xl25_state::write_r(u16 data) -{ - // R0-R9: input mux, led select - m_inp_mux = data; - m_r = data; - update_display(); -} - -void xl25_state::write_o(u16 data) -{ - // O1-O3: led data - m_o = data; - update_display(); - - // O6: speaker out - m_speaker->level_w(data >> 6 & 1); - - // O5(+K4): MCU halt - update_halt(); -} - -u8 xl25_state::read_k() -{ - // K: multiplexed inputs - // K4 also goes to MCU halt - return read_inputs(10); -} - -// config - -static INPUT_PORTS_START( xl25 ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 11") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 12") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 13") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 14") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 10") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 15") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 16") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 21") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Store / Recall") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 17") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 22") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Cross / Knight / Score") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 18") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 23") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Clear") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 19") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 24") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Random") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.9") // R9 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 20") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 25") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Sound") PORT_CHANGED_MEMBER(DEVICE_SELF, xl25_state, k4_button, 0) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void xl25_state::xl25(machine_config &config) -{ - // basic machine hardware - TMS1000C(config, m_maincpu, 300000); // approximation - RC osc. R=5.6K, C=47pF - m_maincpu->k().set(FUNC(xl25_state::read_k)); - m_maincpu->r().set(FUNC(xl25_state::write_r)); - m_maincpu->o().set(FUNC(xl25_state::write_o)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 3); - config.set_default_layout(layout_xl25); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( xl25 ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "mp4486a", 0x0000, 0x0400, CRC(bd84b515) SHA1(377fcc68a517260acd51eb9746cd62914a75d739) ) - - ROM_REGION( 922, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1000c_xl25_micro.pla", 0, 922, CRC(8823e7f2) SHA1(676b0eace9d8730f2caa9087e8c51e540c7fabf8) ) - ROM_REGION( 558, "maincpu:opla", 0 ) - ROM_LOAD( "tms1000c_xl25_output.pla", 0, 558, CRC(06ecc6e0) SHA1(e0fa1b9388948197b4de2edd3cd02fbde1dbabbb) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, matchnum, 0, 0, matchnum, matchnum, matchnum_state, empty_init, "A-One LSI", "Match Number", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, arrball, 0, 0, arrball, arrball, arrball_state, empty_init, "A-One LSI", "Arrange Ball", MACHINE_SUPPORTS_SAVE ) - -COMP( 1980, mathmagi, 0, 0, mathmagi, mathmagi, mathmagi_state, empty_init, "APF Electronics Inc.", "Mathemagician", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1979, bcheetah, 0, 0, bcheetah, bcheetah, bcheetah_state, empty_init, "Bandai", "System Control Car: Cheetah", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_MECHANICAL ) // *** -CONS( 1981, tc7atc, 0, 0, tc7atc, tc7atc, tc7atc_state, empty_init, "Bandai", "TC7: Air Traffic Control", MACHINE_SUPPORTS_SAVE ) - -COMP( 1977, palmf31, 0, 0, palmf31, palmf31, palmf31_state, empty_init, "Canon", "Palmtronic F-31", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, palmmd8, 0, 0, palmmd8, palmmd8, palmmd8_state, empty_init, "Canon", "Palmtronic MD-8 (Multi 8)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, amaztron, 0, 0, amaztron, amaztron, amaztron_state, empty_init, "Coleco", "Amaze-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** -COMP( 1979, zodiac, 0, 0, zodiac, zodiac, zodiac_state, empty_init, "Coleco", "Zodiac - The Astrology Computer", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, cqback, 0, 0, cqback, cqback, cqback_state, empty_init, "Coleco", "Electronic Quarterback", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hfootb, 0, 0, h2hfootb, h2hfootb, h2hfootb_state, empty_init, "Coleco", "Head to Head: Electronic Football", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Basketball (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, h2hhockey, 0, 0, h2hhockey, h2hhockey, h2hbaskb_state, empty_init, "Coleco", "Head to Head: Electronic Hockey (TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, h2hbaseb, 0, 0, h2hbaseb, h2hbaseb, h2hbaseb_state, empty_init, "Coleco", "Head to Head: Electronic Baseball", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, h2hboxing, 0, 0, h2hboxing, h2hboxing, h2hboxing_state, empty_init, "Coleco", "Head to Head: Electronic Boxing", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, quizwizc, 0, 0, quizwizc, quizwizc, quizwizc_state, empty_init, "Coleco", "Quiz Wiz Challenger", MACHINE_SUPPORTS_SAVE ) // *** -CONS( 1981, tc4, 0, 0, tc4, tc4, tc4_state, empty_init, "Coleco", "Total Control 4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, cnbaskb, 0, 0, cnbaskb, cnbaskb, cnbaskb_state, empty_init, "Conic", "Electronic Basketball (Conic)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, cmsport, 0, 0, cmsport, cmsport, cmsport_state, empty_init, "Conic", "Electronic Multisport", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1979, cnfball, 0, 0, cnfball, cnfball, cnfball_state, empty_init, "Conic", "Electronic Football (Conic, TMS1000 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, cnfball2, 0, 0, cnfball2, cnfball2, cnfball2_state, empty_init, "Conic", "Electronic Football II (Conic)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, eleciq, 0, 0, eleciq, eleciq, eleciq_state, empty_init, "Conic", "Electronic I.Q.", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, qfire, 0, 0, qfire, qfire, qfire_state, empty_init, "Electroplay", "Quickfire", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, esoccer, 0, 0, esoccer, esoccer, esoccer_state, empty_init, "Entex", "Electronic Soccer (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ebball, 0, 0, ebball, ebball, ebball_state, empty_init, "Entex", "Electronic Baseball (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ebball2, 0, 0, ebball2, ebball2, ebball2_state, empty_init, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ebball3, 0, 0, ebball3, ebball3, ebball3_state, empty_init, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, esbattle, 0, 0, esbattle, esbattle, esbattle_state, empty_init, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, blastit, 0, 0, blastit, blastit, blastit_state, empty_init, "Entex", "Blast It", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, einvader, 0, 0, einvader, einvader, einvader_state, empty_init, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, efootb4 , 0, 0, efootb4, efootb4, efootb4_state, empty_init, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, ebaskb2_state, empty_init, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, raisedvl_state, empty_init, "Entex", "Raise The Devil Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1982, ebknight, 0, 0, ebknight, raisedvl, raisedvl_state, empty_init, "Entex", "Black Knight Pinball (Entex)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, mmarvin, 0, 0, mmarvin, mmarvin, mmarvin_state, empty_init, "Entex", "Musical Marvin", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, f2pbball_state, empty_init, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, f3in1, 0, 0, f3in1, f3in1, f3in1_state, empty_init, "Fonas", "3 in 1: Football, Basketball, Soccer", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, gpoker, 0, 0, gpoker, gpoker, gpoker_state, empty_init, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, gjackpot_state, empty_init, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, ginv, 0, 0, ginv, ginv, ginv_state, empty_init, "Gakken", "Invader (Gakken, cyan version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, ginv1000, 0, 0, ginv1000, ginv1000, ginv1000_state, empty_init, "Gakken", "Galaxy Invader 1000", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, ginv2000, 0, 0, ginv2000, ginv2000, ginv2000_state, empty_init, "Gakken", "Invader 2000", MACHINE_SUPPORTS_SAVE ) -COMP( 1983, fxmcr165, 0, 0, fxmcr165, fxmcr165, fxmcr165_state, empty_init, "Gakken", "FX-Micom R-165", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -CONS( 1979, elecdet, 0, 0, elecdet, elecdet, elecdet_state, empty_init, "Ideal Toy Corporation", "Electronic Detective", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1979, starwbc, 0, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, starwbcp, starwbc, 0, starwbc, starwbc, starwbc_state, empty_init, "Kenner", "Star Wars - Electronic Battle Command (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, liveafb, 0, 0, liveafb, liveafb, liveafb_state, empty_init, "Kenner", "Live Action Football", MACHINE_SUPPORTS_SAVE ) - -COMP( 1979, astro, 0, 0, astro, astro, astro_state, empty_init, "Kosmos", "Astro", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, elecbowl_state, empty_init, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_CONTROLS | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // *** - -COMP( 1979, horseran, 0, 0, horseran, horseran, horseran_state, empty_init, "Mattel Electronics", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -CONS( 1980, mdndclab, 0, 0, mdndclab, mdndclab, mdndclab_state, empty_init, "Mattel Electronics", "Dungeons & Dragons - Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) // *** - -CONS( 1977, comp4, 0, 0, comp4, comp4, comp4_state, empty_init, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) -CONS( 1977, bship, 0, 0, bship, bship, bship_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // *** -CONS( 1977, bshipb, bship, 0, bshipb, bship, bshipb_state, empty_init, "Milton Bradley", "Electronic Battleship (1977 version, model 4750B)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // *** -CONS( 1978, simon, 0, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev A)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, simonf, simon, 0, simon, simon, simon_state, empty_init, "Milton Bradley", "Simon (Rev F)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, ssimon, 0, 0, ssimon, ssimon, ssimon_state, empty_init, "Milton Bradley", "Super Simon", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1979, bigtrak, 0, 0, bigtrak, bigtrak, bigtrak_state, empty_init, "Milton Bradley", "Big Trak", MACHINE_SUPPORTS_SAVE | MACHINE_MECHANICAL ) // *** -CONS( 1981, mbdtower, 0, 0, mbdtower, mbdtower, mbdtower_state, empty_init, "Milton Bradley", "Dark Tower (Milton Bradley)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL ) // *** -CONS( 1983, arcmania, 0, 0, arcmania, arcmania, arcmania_state, empty_init, "Milton Bradley", "Electronic Arcade Mania (Arcade Machine)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // *** - -CONS( 1977, cnsector, 0, 0, cnsector, cnsector, cnsector_state, empty_init, "Parker Brothers", "Code Name: Sector", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW ) // *** -CONS( 1978, merlin, 0, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, merlina, merlin, 0, merlin, merlin, merlin_state, empty_init, "Parker Brothers", "Merlin - The Electronic Wizard (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1978, pbmastm, 0, 0, pbmastm, pbmastm, pbmastm_state, empty_init, "Parker Brothers", "Electronic Master Mind (Parker Brothers)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) // *** -CONS( 1979, stopthief, 0, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** -CONS( 1979, stopthiefp, stopthief, 0, stopthief, stopthief, stopthief_state, empty_init, "Parker Brothers", "Stop Thief - Electronic Cops and Robbers (Electronic Crime Scanner) (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** -CONS( 1980, bankshot, 0, 0, bankshot, bankshot, bankshot_state, empty_init, "Parker Brothers", "Bank Shot - Electronic Pool", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, splitsec, 0, 0, splitsec, splitsec, splitsec_state, empty_init, "Parker Brothers", "Split Second", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, mmerlin, 0, 0, mmerlin, mmerlin, mmerlin_state, empty_init, "Parker Brothers", "Master Merlin", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, lostreas, 0, 0, lostreas, lostreas, lostreas_state, empty_init, "Parker Brothers", "Lost Treasure - The Electronic Deep-Sea Diving Game (Electronic Dive-Control Center)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1978, alphie, 0, 0, alphie, alphie, alphie_state, empty_init, "Playskool", "Alphie - The Electronic Robot (patent)", MACHINE_SUPPORTS_SAVE ) // *** - -CONS( 1980, tcfball, 0, 0, tcfball, tcfball, tcfball_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2150)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, tcfballa, tcfball, 0, tcfballa, tcfballa, tcfballa_state, empty_init, "Tandy Corporation", "Championship Football (model 60-2151)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, tandy12, 0, 0, tandy12, tandy12, tandy12_state, empty_init, "Tandy Corporation", "Tandy-12: Computerized Arcade", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** -CONS( 1982, monkeysee, 0, 0, monkeysee, monkeysee, monkeysee_state, empty_init, "Tandy Corporation", "Monkey See (1982 version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, t3in1sa, 0, 0, t3in1sa, t3in1sa, t3in1sa_state, empty_init, "Tandy Corporation", "3 in 1 Sports Arena", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1976, speechp, 0, 0, speechp, speechp, speechp_state, empty_init, "Telesensory Systems, Inc.", "Speech+", MACHINE_SUPPORTS_SAVE ) - -COMP( 1974, tisr16, 0, 0, tisr16, tisr16, tisr16_state, empty_init, "Texas Instruments", "SR-16", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, tisr16ii, 0, 0, tisr16, tisr16ii, tisr16_state, empty_init, "Texas Instruments", "SR-16 II", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1975, ti1250, 0, 0, ti1250, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1975 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti125076, ti1250, 0, ti1270, ti1250, ti1250_state, empty_init, "Texas Instruments", "TI-1250 (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti1270, 0, 0, ti1270, ti1270, ti1250_state, empty_init, "Texas Instruments", "TI-1270", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti25503, 0, 0, ti25503, ti25503, ti25503_state, empty_init, "Texas Instruments", "TI-2550 III", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti5100, 0, 0, ti5100, ti5100, ti5100_state, empty_init, "Texas Instruments", "TI-5100", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, ti30, 0, 0, ti30, ti30, ti30_state, empty_init, "Texas Instruments", "TI-30", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, tibusan, 0, 0, ti30, tibusan, ti30_state, empty_init, "Texas Instruments", "TI Business Analyst", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, tiprog, 0, 0, ti30, tiprog, ti30_state, empty_init, "Texas Instruments", "TI Programmer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, ti1000, 0, 0, ti1000, ti1000, ti1000_state, empty_init, "Texas Instruments", "TI-1000 (1977 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, wizatron, 0, 0, wizatron, wizatron, wizatron_state, empty_init, "Texas Instruments", "Wiz-A-Tron", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1976, lilprof, 0, 0, lilprof, lilprof, lilprof_state, empty_init, "Texas Instruments", "Little Professor (1976 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1978, lilprof78, lilprof, 0, lilprof78, lilprof78, lilprof78_state, empty_init, "Texas Instruments", "Little Professor (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, ti1680, 0, 0, ti1680, ti1680, ti1680_state, empty_init, "Texas Instruments", "TI-1680", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1977, dataman, 0, 0, dataman, dataman, dataman_state, empty_init, "Texas Instruments", "DataMan", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1980, mathmarv, 0, 0, mathmarv, mathmarv, mathmarv_state, empty_init, "Texas Instruments", "Math Marvel", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, timaze, 0, 0, timaze, timaze, timaze_state, empty_init, "Texas Instruments", "unknown electronic maze game (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -SYST( 1979, tithermos, 0, 0, tithermos, tithermos, tithermos_state, empty_init, "Texas Instruments", "Electronic Digital Thermostat", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING ) - -CONS( 1979, subwars, 0, 0, subwars, subwars, subwars_state, empty_init, "Tiger Electronics", "Sub Wars (LED version)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, playmaker, 0, 0, playmaker, playmaker, playmaker_state, empty_init, "Tiger Electronics", "Playmaker: Hockey, Soccer, Basketball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) -CONS( 1980, dxfootb, 0, 0, dxfootb, dxfootb, dxfootb_state, empty_init, "Tiger Electronics", "Deluxe Football with Instant Replay", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, copycat, 0, 0, copycat, copycat, copycat_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-520)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1989, copycatm2, copycat, 0, copycatm2, copycatm2, copycatm2_state, empty_init, "Tiger Electronics", "Copy Cat (model 7-522)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1981, ditto, 0, 0, ditto, ditto, ditto_state, empty_init, "Tiger Electronics", "Ditto", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1982, t7in1ss, 0, 0, t7in1ss, t7in1ss, t7in1ss_state, empty_init, "Tiger Electronics", "7 in 1 Sports Stadium", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1979, tbreakup, 0, 0, tbreakup, tbreakup, tbreakup_state, empty_init, "Tomy", "Break Up (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, phpball, 0, 0, phpball, phpball, phpball_state, empty_init, "Tomy", "Power House Pinball", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1980, ssports4, 0, 0, ssports4, ssports4, ssports4_state, empty_init, "U.S. Games", "Super Sports-4", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) - -CONS( 1983, xl25, 0, 0, xl25, xl25, xl25_state, empty_init, "Vulcan Electronics", "XL 25", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) - -// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction -// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/hh_tms1k.h b/src/mame/misc_handheld/hh_tms1k.h deleted file mode 100644 index 7d9904e4377..00000000000 --- a/src/mame/misc_handheld/hh_tms1k.h +++ /dev/null @@ -1,73 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -/* - - TMS1000 MCU series tabletops/handhelds or other simple devices. - -*/ - -#ifndef MAME_INCLUDES_HH_TMS1K_H -#define MAME_INCLUDES_HH_TMS1K_H - -#pragma once - -#include "cpu/tms1000/tms1000.h" -#include "cpu/tms1000/tms1000c.h" -#include "cpu/tms1000/tms1100.h" -#include "cpu/tms1000/tms1400.h" -#include "cpu/tms1000/tms0970.h" -#include "cpu/tms1000/tms0980.h" -#include "cpu/tms1000/tms0270.h" -#include "cpu/tms1000/tp0320.h" -#include "video/pwm.h" -#include "sound/spkrdev.h" - - -class hh_tms1k_state : public driver_device -{ -public: - hh_tms1k_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0), - m_out_power(*this, "power") - { } - - virtual DECLARE_INPUT_CHANGED_MEMBER(reset_button); - virtual DECLARE_INPUT_CHANGED_MEMBER(power_button); - - template DECLARE_INPUT_CHANGED_MEMBER(switch_next) { if (newval) switch_change(Sel, param, true); } - template DECLARE_INPUT_CHANGED_MEMBER(switch_prev) { if (newval) switch_change(Sel, param, false); } - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<18> m_inputs; // max 18 - output_finder<> m_out_power; // power state, eg. led - - // misc common - u16 m_r = 0U; // MCU R-pins data - u16 m_o = 0U; // MCU O-pins data - u32 m_inp_mux = 0U; // multiplexed inputs mask - bool m_power_on = false; - - u32 m_grid = 0U; // VFD/LED current row data - u32 m_plate = 0U; // VFD/LED current column data - - u8 read_inputs(int columns); - u8 read_rotated_inputs(int columns, u8 rowmask = 0xf); - virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off); - virtual void power_off(); - void set_power(bool state); - void switch_change(int sel, u32 mask, bool next); -}; - - -#endif // MAME_INCLUDES_HH_TMS1K_H diff --git a/src/mame/misc_handheld/hh_ucom4.cpp b/src/mame/misc_handheld/hh_ucom4.cpp deleted file mode 100644 index d270d5ce7c2..00000000000 --- a/src/mame/misc_handheld/hh_ucom4.cpp +++ /dev/null @@ -1,3060 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton, Sean Riddle -/*************************************************************************** - -NEC uCOM4 MCU tabletops/handhelds or other simple devices, -most of them (emulated ones) are VFD electronic games/toys. - -known chips: - - serial device etc. ----------------------------------------------------------------- - 055 uPD546C 1978, Fidelity Checker Challenger (CR) -> fidel_checkc2.cpp - - @017 uPD552C 1979, Bambino UFO Master-Blaster Station (ET-02) - @042 uPD552C 1980, Tomy Cosmic Combat (TN-??) - @043 uPD552C 1979, Bambino Kick The Goal Soccer (ET-10) - *044 uPD552C 1979, Bambino Lucky Puck Ice Hockey (ET-08) - @048 uPD552C 1980, Tomy Tennis (TN-04) - @049 uPD552C 1981, Bambino Safari (ET-11) - @054 uPD552C 1980, Epoch Invader From Space - - @031 uPD553C 1979, Bambino Superstar Football (ET-03) - @049 uPD553C 1979, Mego Mini-Vid: Break Free - @055 uPD553C 1980, Bambino Space Laser Fight (ET-12) - *073 uPD553C 1980, Sony ST-J75 FM Stereo Tuner - @080 uPD553C 1980, Epoch Electronic Football - *102 uPD553C 1981, Bandai Block Out - @153 uPD553C 1981, Epoch Galaxy II - @160 uPD553C 1982, Tomy Pac Man (TN-08) - *167 uPD553C 1982, Sony SL models (betamax) (have dump) - @170 uPD553C 1982, Bandai Crazy Climber - @192 uPD553C 1982, Tomy Scramble (TN-10) - @202 uPD553C 1982, Epoch Astro Command - @206 uPD553C 1982, Epoch Dracula - *207 uPD553C 1982, Sony SL-J30 (tape/cd deck) - @209 uPD553C 1982, Tomy Caveman (TN-12) - @258 uPD553C 1984, Tomy Alien Chase (TN-16) - *296 uPD553C 1984, Epoch Computer Beam Gun Professional - - @511 uPD557LC 1980, Takatoku Toys Game Robot 9/Mego Fabulous Fred - @512 uPD557LC 1980, Castle Toy Tactix - @513 uPD557LC 1980, Castle Toy Name That Tune - - @060 uPD650C 1979, Mattel Computer Gin - 085 uPD650C 1980, Roland TR-808 -> roland_tr808.cpp - *127 uPD650C 198?, Sony OA-S1100 Typecorder (subcpu, have dump) - 128 uPD650C 1981, Roland TR-606 -> roland_tr606.cpp - 133 uPD650C 1982, Roland TB-303 -> roland_tb303.cpp - - (* means undumped unless noted, @ denotes it's in this driver) - - -Commonly used VFD(vacuum fluorescent display) are by NEC or Futaba. - -NEC FIP9AM20T (example, Epoch Astro Command) - grcss - -FIP = fluorescent indicator panel -g = number of grids -r = revision of the VFD -c = custom display -s = unique display part number - -============================================================================ - -ROM source notes when dumped from another publisher, but confident it's the same: -- astrocmd: Tandy Astro Command -- caveman: Tandy Caveman -- grobot9: Mego Fabulous Fred - -TODO: -- get rid of hardcoded color overlay from SVGs, use MAME internal artwork - -***************************************************************************/ - -#include "emu.h" - -#include "cpu/ucom4/ucom4.h" -#include "video/pwm.h" -#include "video/hlcd0515.h" -#include "sound/spkrdev.h" - -#include "screen.h" -#include "speaker.h" - -// internal artwork (complete) -#include "ctntune.lh" // clickable -#include "efball.lh" -#include "grobot9.lh" // clickable -#include "mcompgin.lh" -#include "mvbfree.lh" -#include "tactix.lh" // clickable - -// internal artwork (bezel overlay) -#include "tmtennis.lh" - -//#include "hh_ucom4_test.lh" // common test-layout - no svg artwork(yet), use external artwork - - -class hh_ucom4_state : public driver_device -{ -public: - hh_ucom4_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - - // devices - required_device m_maincpu; - optional_device m_display; - optional_device m_speaker; - optional_ioport_array<6> m_inputs; // max 6 - - // misc common - u8 m_port[9] = { }; // MCU port A-I write data (optional) - u8 m_int = 0; // MCU INT pin state - u16 m_inp_mux = 0; // multiplexed inputs mask - - u32 m_grid = 0; // VFD current row data - u32 m_plate = 0; // VFD current column data - - u8 read_inputs(int columns); - void refresh_interrupts(void); - void set_interrupt(int state); - - enum - { - PORTA = 0, - PORTB, - PORTC, - PORTD, - PORTE, - PORTF, - PORTG, - PORTH, - PORTI - }; -}; - - -// machine start/reset - -void hh_ucom4_state::machine_start() -{ - // register for savestates - save_item(NAME(m_port)); - save_item(NAME(m_int)); - save_item(NAME(m_inp_mux)); - save_item(NAME(m_grid)); - save_item(NAME(m_plate)); -} - -void hh_ucom4_state::machine_reset() -{ - refresh_interrupts(); -} - - - -/*************************************************************************** - - Helper Functions - -***************************************************************************/ - -// generic input handlers - -u8 hh_ucom4_state::read_inputs(int columns) -{ - u8 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux >> i & 1) - ret |= m_inputs[i]->read(); - - return ret; -} - - -// interrupt handling - -void hh_ucom4_state::refresh_interrupts() -{ - m_maincpu->set_input_line(0, m_int ? ASSERT_LINE : CLEAR_LINE); -} - -void hh_ucom4_state::set_interrupt(int state) -{ - state = state ? 1 : 0; - - if (state != m_int) - { - if (machine().phase() >= machine_phase::RESET) - m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); - m_int = state; - } -} - -INPUT_CHANGED_MEMBER(hh_ucom4_state::single_interrupt_line) -{ - set_interrupt(newval); -} - - - -/*************************************************************************** - - Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) - -***************************************************************************/ - -namespace { - -/*************************************************************************** - - Bambino UFO Master-Blaster Station (manufactured in Japan) - * PCB label Emix Corp. ET-02 - * NEC uCOM-44 MCU, label EMIX D552C 017 - * cyan VFD display Emix-101, with blue color overlay - - This is Bambino's first game, it is not known if ET-01 exists. Emix Corp. - wasn't initially a toy company, the first release was through Tomy. Emix - created the Bambino brand afterwards. It is claimed to be the first - computerized VFD game (true, unless TI Speak & Spell or M.E.M. Memoquiz - from 1978 are considered VFD games) - - known releases: - - Japan: "Missile Guerilla Warfare Maneuvers", published by Tomy - - World: UFO Master-Blaster Station, published by Bambino - -***************************************************************************/ - -class ufombs_state : public hh_ucom4_state -{ -public: - ufombs_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ufombs(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void ufombs_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3); - m_display->matrix(grid, plate); -} - -void ufombs_state::grid_w(offs_t offset, u8 data) -{ - // F,G,H0: vfd grid - int shift = (offset - PORTF) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ufombs_state::plate_w(offs_t offset, u8 data) -{ - // C,D012,I: vfd plate - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ufombs_state::speaker_w(u8 data) -{ - // E01: speaker out - m_speaker->level_w(data & 3); -} - -// config - -static INPUT_PORTS_START( ufombs ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x04, 0x04, IPT_CUSTOM ) PORT_CONDITION("IN.0", 0x0a, EQUALS, 0x00) // pad in the middle, pressed when joystick is centered - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - - PORT_START("IN.1") // port B - PORT_CONFNAME( 0x07, 0x01, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x04, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ufombs_state::ufombs(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(ufombs_state::plate_w)); - m_maincpu->write_d().set(FUNC(ufombs_state::plate_w)); - m_maincpu->write_e().set(FUNC(ufombs_state::speaker_w)); - m_maincpu->write_f().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_g().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_h().set(FUNC(ufombs_state::grid_w)); - m_maincpu->write_i().set(FUNC(ufombs_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(243, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 10); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ufombs ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-017", 0x0000, 0x0400, CRC(0e208cb3) SHA1(57db6566916c94325e2b67ccb94b4ea3b233487d) ) - - ROM_REGION( 222395, "screen", 0) - ROM_LOAD( "ufombs.svg", 0, 222395, CRC(ae9fb93f) SHA1(165ea78eee93c503dbd277a56c41e3c63c534e38) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Superstar Football (manufactured in Japan) - * PCB label Emix Corp. ET-03 - * NEC uCOM-43 MCU, label D553C 031 - * cyan VFD display Emix-102, with bezel - - The game was rereleased in 1982 as Classic Football (ET-0351), with an - improved cyan/green/red VFD. - - Press the Kick button to start the game, an automatic sequence follows. - Then choose a formation(A,B,C) and either pass the ball, and/or start - running. For more information, refer to the official manual. - -***************************************************************************/ - -class ssfball_state : public hh_ucom4_state -{ -public: - ssfball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ssfball(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_b_r(); -}; - -// handlers - -void ssfball_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); - m_display->matrix(m_grid, plate); -} - -void ssfball_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid 0-7(,8) - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void ssfball_state::plate_w(offs_t offset, u8 data) -{ - m_port[offset] = data; - - // E,F,G,H,I(not all!): vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // F3,G3: input mux + speaker - m_inp_mux = (m_port[PORTF] >> 3 & 1) | (m_port[PORTG] >> 2 & 2); - m_speaker->level_w(m_inp_mux); - - // E3: vfd grid 8 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -u8 ssfball_state::input_b_r() -{ - // B: input port 2, where B3 is multiplexed - return m_inputs[2]->read() | read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - [A] [B] [C] [PASS] [KICK/ - ^FORMATION^ DISPLAY] - - [^] - [<>] - (game lvl sw) [v] - 1<---OFF--->2 -*/ - -static INPUT_PORTS_START( ssfball ) - PORT_START("IN.0") // F3 port B3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Formation A") - - PORT_START("IN.1") // G3 port B3 - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_CONFNAME( 0x08, 0x00, "Game Level" ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x08, "2" ) - - PORT_START("IN.2") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Kick/Display") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Formation C") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Formation B") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed, handled in input_b_r - - PORT_START("IN.3") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Forward") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Pass") -INPUT_PORTS_END - -void ssfball_state::ssfball(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.3"); - m_maincpu->read_b().set(FUNC(ssfball_state::input_b_r)); - m_maincpu->write_c().set(FUNC(ssfball_state::grid_w)); - m_maincpu->write_d().set(FUNC(ssfball_state::grid_w)); - m_maincpu->write_e().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_f().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_g().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_h().set(FUNC(ssfball_state::plate_w)); - m_maincpu->write_i().set(FUNC(ssfball_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 482); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ssfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) - - ROM_REGION( 331352, "screen", 0) - ROM_LOAD( "ssfball.svg", 0, 331352, CRC(10cffb85) SHA1(c875f73a323d976088ffa1bc19f7bc865d4aac62) ) -ROM_END - -ROM_START( bmcfball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-031", 0x0000, 0x0800, CRC(ff5d91d0) SHA1(9b2c0ae45f1e3535108ee5fef8a9010e00c8d5c3) ) - - ROM_REGION( 331352, "screen", 0) - ROM_LOAD( "bmcfball.svg", 0, 331352, CRC(43fbed1e) SHA1(28160e14b0879cd4dd9dab770c52c98f316ab653) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Kick The Goal Soccer - * PCB label Emix Corp. ET-10/08 (PCB is for 2 possible games) - * NEC uCOM-44 MCU, label D552C 043 - * cyan VFD display Emix-105, with bezel overlay - - Press the Display button twice to start the game. Action won't start until - player 1 presses one of the directional keys. In 2-player mode, player 2 - controls the goalkeeper, defensive players are still controlled by the CPU. - -***************************************************************************/ - -class bmsoccer_state : public hh_ucom4_state -{ -public: - bmsoccer_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bmsoccer(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_a_r(); -}; - -// handlers - -void bmsoccer_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2); - m_display->matrix(m_grid, plate); -} - -void bmsoccer_state::grid_w(offs_t offset, u8 data) -{ - // C01: input mux - if (offset == PORTC) - m_inp_mux = data & 3; - - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmsoccer_state::plate_w(offs_t offset, u8 data) -{ - // G3: speaker out - if (offset == PORTG) - m_speaker->level_w(data >> 3 & 1); - - // E012,F012,G012,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // E3: grid 8 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -u8 bmsoccer_state::input_a_r() -{ - // port A: multiplexed inputs - return read_inputs(2); -} - -// config - -static INPUT_PORTS_START( bmsoccer ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_NAME("Ball-carrier Right") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_NAME("Ball-carrier Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_NAME("Ball-carrier Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY PORT_NAME("Ball-carrier Up") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Left") // note: swap buttons if viewed from the same angle as player 1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL PORT_16WAY PORT_NAME("Goalkeeper Right") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // port B - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Display/Banana Shoot") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Shoot") -INPUT_PORTS_END - -void bmsoccer_state::bmsoccer(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set(FUNC(bmsoccer_state::input_a_r)); - m_maincpu->read_b().set_ioport("IN.2"); - m_maincpu->write_c().set(FUNC(bmsoccer_state::grid_w)); - m_maincpu->write_d().set(FUNC(bmsoccer_state::grid_w)); - m_maincpu->write_e().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_f().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_g().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_h().set(FUNC(bmsoccer_state::plate_w)); - m_maincpu->write_i().set(FUNC(bmsoccer_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(271, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmsoccer ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-043", 0x0000, 0x0400, CRC(10c2a4ea) SHA1(6ebca7d406e22ff7a8cd529579b55a700da487b4) ) - - ROM_REGION( 273796, "screen", 0) - ROM_LOAD( "bmsoccer.svg", 0, 273796, CRC(4c88d9f8) SHA1(b4b82f26a09f54cd0b6a9d1c1a46796fbfcb578a) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Safari (manufactured in Japan) - * PCB label Emix Corp. ET-11 - * NEC uCOM-44 MCU, label EMIX D552C 049 - * cyan VFD display Emix-108 - -***************************************************************************/ - -class bmsafari_state : public hh_ucom4_state -{ -public: - bmsafari_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bmsafari(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void bmsafari_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3); - m_display->matrix(grid, plate); -} - -void bmsafari_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bmsafari_state::plate_w(offs_t offset, u8 data) -{ - // E012,H,I: vfd plate - int shift = (offset == PORTE) ? 8 : (offset - PORTH) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - // E3: grid 0 - if (offset == PORTE) - grid_w(offset, data >> 3 & 1); - else - update_display(); -} - -void bmsafari_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -// config - -static INPUT_PORTS_START( bmsafari ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x07, 0x04, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_CONFSETTING( 0x01, "3" ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY -INPUT_PORTS_END - -void bmsafari_state::bmsafari(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(bmsafari_state::grid_w)); - m_maincpu->write_d().set(FUNC(bmsafari_state::grid_w)); - m_maincpu->write_e().set(FUNC(bmsafari_state::plate_w)); - m_maincpu->write_g().set(FUNC(bmsafari_state::speaker_w)); - m_maincpu->write_h().set(FUNC(bmsafari_state::plate_w)); - m_maincpu->write_i().set(FUNC(bmsafari_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(248, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 10); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bmsafari ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-049", 0x0000, 0x0400, CRC(82fa3cbe) SHA1(019e7ec784e977eba09997fc46af253054fb222c) ) - - ROM_REGION( 275386, "screen", 0) - ROM_LOAD( "bmsafari.svg", 0, 275386, CRC(c24badbc) SHA1(b191f34155d6d4e834e7c6fe715d4bb76198ad72) ) -ROM_END - - - - - -/*************************************************************************** - - Bambino Space Laser Fight (manufactured in Japan) - * PCB label Emix Corp. ET-12 - * NEC uCOM-43 MCU, label D553C 055 - * cyan VFD display Emix-104, with blue or green color overlay - - This is basically a revamp of their earlier Boxing game (ET-06), case and - buttons are exactly the same. - -***************************************************************************/ - -class splasfgt_state : public hh_ucom4_state -{ -public: - splasfgt_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void splasfgt(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - u8 input_b_r(); -}; - -// handlers - -void splasfgt_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); - m_display->matrix(m_grid, plate); -} - -void splasfgt_state::grid_w(offs_t offset, u8 data) -{ - // G,H,I0: vfd grid - int shift = (offset - PORTG) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // G(grid 0-3): input mux - m_inp_mux = m_grid & 0xf; - - // I2: vfd plate 6 - if (offset == PORTI) - plate_w(4 + PORTC, data >> 2 & 1); - else - update_display(); -} - -void splasfgt_state::plate_w(offs_t offset, u8 data) -{ - // F01: speaker out - if (offset == PORTF) - m_speaker->level_w(data & 3); - - // C,D,E,F23(,I2): vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -u8 splasfgt_state::input_b_r() -{ - // B: multiplexed buttons - return read_inputs(4); -} - -// config - -/* physical button layout and labels are like this: - - * left = P1 side * * right = P2 side * (note: in 1P mode, switch sides between turns) - - [ JUMP ] [ HIGH ] (players sw) [ HIGH ] [ JUMP ] - 1<--->2 [START/ - [STRAIGHT] [MEDIUM] RESET] [MEDIUM] [STRAIGHT] - 1<---OFF--->2 - [ STOOP ] [ LOW ] (skill lvl sw) [ LOW ] [ STOOP ] -*/ - -static INPUT_PORTS_START( splasfgt ) - PORT_START("IN.0") // G0 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Position Straight") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Position Jump") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Position Stoop") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // G1 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Beam High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Beam Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Beam Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // G2 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Position Straight") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Position Jump") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 Position Stoop") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // G3 port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Beam High") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Beam Medium") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Beam Low") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x01, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void splasfgt_state::splasfgt(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.4"); - m_maincpu->read_b().set(FUNC(splasfgt_state::input_b_r)); - m_maincpu->write_c().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_d().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_e().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_f().set(FUNC(splasfgt_state::plate_w)); - m_maincpu->write_g().set(FUNC(splasfgt_state::grid_w)); - m_maincpu->write_h().set(FUNC(splasfgt_state::grid_w)); - m_maincpu->write_i().set(FUNC(splasfgt_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 476); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 16); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( splasfgt ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-055", 0x0000, 0x0800, CRC(eb471fbd) SHA1(f06cfe567bf6f9ed4dcdc88acdcfad50cd370a02) ) - - ROM_REGION( 246609, "screen", 0) - ROM_LOAD( "splasfgt.svg", 0, 246609, CRC(365fae43) SHA1(344c120c2efa92ada9171047affac801a06cf303) ) -ROM_END - - - - - -/*************************************************************************** - - Bandai Crazy Climber (manufactured in Japan) - * PCB labels SM-020/SM-021 - * NEC uCOM-43 MCU, label D553C 170 - * cyan/red/green VFD display NEC FIP6AM2-T no. 1-8 2, with partial color overlay and bezel - - known releases: - - Japan: FL Crazy Climbing, published by Bandai - - USA: Crazy Climber, published by Bandai - -***************************************************************************/ - -class bcclimbr_state : public hh_ucom4_state -{ -public: - bcclimbr_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void bcclimbr(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void bcclimbr_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,7,6,0,1,2,3,4,5); - u32 plate = bitswap<24>(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0); - m_display->matrix(grid, plate); -} - -void bcclimbr_state::grid_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // H,I01: vfd grid - int shift = (offset - PORTH) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void bcclimbr_state::plate_w(offs_t offset, u8 data) -{ - // C,D,E,F: vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( bcclimbr ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) -INPUT_PORTS_END - -void bcclimbr_state::bcclimbr(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_d().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_e().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_f().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_g().set(FUNC(bcclimbr_state::plate_w)); - m_maincpu->write_h().set(FUNC(bcclimbr_state::grid_w)); - m_maincpu->write_i().set(FUNC(bcclimbr_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(310, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(6, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( bcclimbr ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-170", 0x0000, 0x0800, CRC(fc2eabdb) SHA1(0f5cc854be7fdf105d9bd2114659d40c65f9d782) ) - - ROM_REGION( 219971, "screen", 0) - ROM_LOAD( "bcclimbr.svg", 0, 219971, CRC(9c9102f4) SHA1(6a7e02fd1467a26c734b01724e23cef9e4917805) ) -ROM_END - - - - - -/*************************************************************************** - - Castle Toy Tactix - * NEC uCOM-43 MCU, label D557LC 512 - * 16 LEDs behind buttons - - Tactix is similar to Merlin, for 1 or 2 players. In 2-player mode, simply - don't press the Comp Turn button. The four included minigames are: - 1: Capture (reversi) - 2: Jump-Off (peg solitaire) - 3: Triple Play (3 in a row) - 4: Concentration (memory) - -***************************************************************************/ - -class tactix_state : public hh_ucom4_state -{ -public: - tactix_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tactix(machine_config &config); - -private: - void leds_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void tactix_state::leds_w(offs_t offset, u8 data) -{ - // D,F: 4*4 led matrix - m_port[offset] = data; - m_display->matrix(m_port[PORTF], m_port[PORTD]); -} - -void tactix_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -void tactix_state::input_w(offs_t offset, u8 data) -{ - // C,E0: input mux - m_port[offset] = data; - m_inp_mux = (m_port[PORTE] << 4 & 0x10) | m_port[PORTC]; -} - -u8 tactix_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( tactix ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Button 9") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 13") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Button 2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Button 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Button 10") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Button 14") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Button 3") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Button 7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Button 11") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Button 15") - - PORT_START("IN.3") // C3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Button 4") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Button 8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Button 12") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Button 16") - - PORT_START("IN.4") // E0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("New Game") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Comp Turn") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tactix_state::tactix(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 200000); // approximation - m_maincpu->read_a().set(FUNC(tactix_state::input_r)); - m_maincpu->write_c().set(FUNC(tactix_state::input_w)); - m_maincpu->write_d().set(FUNC(tactix_state::leds_w)); - m_maincpu->write_e().set(FUNC(tactix_state::input_w)); - m_maincpu->write_f().set(FUNC(tactix_state::leds_w)); - m_maincpu->write_g().set(FUNC(tactix_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(4, 4); - config.set_default_layout(layout_tactix); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tactix ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d557lc-512", 0x0000, 0x0800, CRC(1df738cb) SHA1(15a5de28a3c03e6894d29c56b5b424983569ccf2) ) -ROM_END - - - - - -/*************************************************************************** - - Castle Toy Name That Tune - * NEC uCOM-43 MCU, label D557LC 513 - * 2 lamps, 1 7seg(+2 fake 7segs above a power-on lamp, showing "0") - - This is a tabletop multiplayer game. Players are meant to place a bid, - and guess the song (by announcing it to everyone). - -***************************************************************************/ - -class ctntune_state : public hh_ucom4_state -{ -public: - ctntune_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void ctntune(machine_config &config); - - // start button powers unit back on - DECLARE_INPUT_CHANGED_MEMBER(start_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); } - -private: - void update_display(); - void _7seg_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void ctntune_state::update_display() -{ - u8 sel = m_port[PORTD] >> 3 & 1; // turn off display when power is off - u8 lamps = m_port[PORTD] & 3; - u8 digit = (m_port[PORTF] << 4 | m_port[PORTE]) & 0x7f; - - m_display->matrix(sel, lamps << 7 | digit); -} - -void ctntune_state::_7seg_w(offs_t offset, u8 data) -{ - // E,F012: 7seg data, F3: N/C - m_port[offset] = data; - update_display(); -} - -void ctntune_state::speaker_w(u8 data) -{ - // G0: speaker out - m_speaker->level_w(data & 1); -} - -void ctntune_state::input_w(offs_t offset, u8 data) -{ - // D3: trigger power-off on falling edge - if (offset == PORTD && ~data & m_port[PORTD] & 8) - m_maincpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - - // C,D23: input mux - // D0,D1: yellow, red lamp - m_port[offset] = data; - m_inp_mux = (m_port[PORTD] << 2 & 0x30) | m_port[PORTC]; - update_display(); -} - -u8 ctntune_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(6); -} - -// config - -static INPUT_PORTS_START( ctntune ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Button 1") // defaults to keyboard Z row - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Button 5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Button 9") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Button 6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON14 ) PORT_NAME("Button 10") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Button 3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Yellow Button") - - PORT_START("IN.3") // C3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Button 4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Button 8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red Button") - - PORT_START("IN.4") // D2 port A - PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("Play Button") - - PORT_START("IN.5") // D3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_MEMBER(DEVICE_SELF, ctntune_state, start_button, 0) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void ctntune_state::ctntune(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 200000); // approximation - m_maincpu->read_a().set(FUNC(ctntune_state::input_r)); - m_maincpu->write_c().set(FUNC(ctntune_state::input_w)); - m_maincpu->write_d().set(FUNC(ctntune_state::input_w)); - m_maincpu->write_e().set(FUNC(ctntune_state::_7seg_w)); - m_maincpu->write_f().set(FUNC(ctntune_state::_7seg_w)); - m_maincpu->write_g().set(FUNC(ctntune_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 7+2); - m_display->set_segmask(1, 0x7f); - config.set_default_layout(layout_ctntune); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( ctntune ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d557lc-513", 0x0000, 0x0800, CRC(cd85ee23) SHA1(32b8fc8cb92fc1fd27da9148788a09d3bcd46a92) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Invader From Space (manufactured in Japan) - * PCB labels 36010(A/B) - * NEC uCOM-44 MCU, label D552C 054 - * cyan VFD display NEC FIP9AM18T tube no. 0D, with color overlay - - known releases: - - USA: Invader From Space, published by Epoch - - UK: Invader From Space, published by Grandstand - -***************************************************************************/ - -class invspace_state : public hh_ucom4_state -{ -public: - invspace_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void invspace(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void invspace_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8); - m_display->matrix(grid, plate); -} - -void invspace_state::grid_w(offs_t offset, u8 data) -{ - // I0: speaker out - if (offset == PORTI) - m_speaker->level_w(data & 1); - - // C,D,I1: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void invspace_state::plate_w(offs_t offset, u8 data) -{ - // E,F,G,H123: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( invspace ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void invspace_state::invspace(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(invspace_state::grid_w)); - m_maincpu->write_d().set(FUNC(invspace_state::grid_w)); - m_maincpu->write_e().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_f().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_g().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_h().set(FUNC(invspace_state::plate_w)); - m_maincpu->write_i().set(FUNC(invspace_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(289, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( invspace ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-054", 0x0000, 0x0400, CRC(913d9c13) SHA1(f20edb5458e54d2f6d4e45e5d59efd87e05a6f3f) ) - - ROM_REGION( 110899, "screen", 0) - ROM_LOAD( "invspace.svg", 0, 110899, CRC(ae794333) SHA1(3552215389f02e4ef1d608f7dfc84f0499a78ee2) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Electronic Football (manufactured in Japan) - * PCB labels 36020(A/B/C) - * NEC uCOM-43 MCU, label D553C 080 - * cyan VFD display NEC FIP10AM15T tube no. 0F, with bezel overlay - - known releases: - - USA: Electronic Football (aka Pro-Bowl Football), published by Epoch - - Japan: American Football, published by Epoch - -***************************************************************************/ - -class efball_state : public hh_ucom4_state -{ -public: - efball_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void efball(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void efball_state::update_display() -{ - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7); - m_display->matrix(m_grid, plate); -} - -void efball_state::grid_w(offs_t offset, u8 data) -{ - // H2: speaker out - if (offset == PORTH) - m_speaker->level_w(data >> 2 & 1); - - // F,G,H01: vfd grid - int shift = (offset - PORTF) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void efball_state::plate_w(offs_t offset, u8 data) -{ - // D,E,I: vfd plate - int shift = (offset == PORTI) ? 8 : (offset - PORTD) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( efball ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Down-Field") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P1 Score-Time") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Forward") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pass") - - PORT_START("IN.2") // port C - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Kick Return") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Kick") -INPUT_PORTS_END - -void efball_state::efball(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->read_c().set_ioport("IN.2"); - m_maincpu->write_d().set(FUNC(efball_state::plate_w)); - m_maincpu->write_e().set(FUNC(efball_state::plate_w)); - m_maincpu->write_f().set(FUNC(efball_state::grid_w)); - m_maincpu->write_g().set(FUNC(efball_state::grid_w)); - m_maincpu->write_h().set(FUNC(efball_state::grid_w)); - m_maincpu->write_i().set(FUNC(efball_state::plate_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(10, 11); - config.set_default_layout(layout_efball); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( efball ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-080", 0x0000, 0x0800, CRC(54c1027f) SHA1(6cc98074dae9361fa8c0ed6501b6a57ad325ccbd) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Galaxy II (manufactured in Japan) - * PCB labels 19096/96062 - * NEC uCOM-43 MCU, label D553C 153 - * cyan/red VFD display NEC FIP10xM20T, with color overlay. x = multiple VFD - revisions exist, with different graphics: rev B no. 1-8, rev. D no. 2-21. - - known releases: - - USA: Galaxy II, published by Epoch - - Japan: Astro Wars, published by Epoch - - UK: Astro Wars, published by Grandstand - -***************************************************************************/ - -class galaxy2_state : public hh_ucom4_state -{ -public: - galaxy2_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void galaxy2b(machine_config &config); - void galaxy2(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void galaxy2_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - u16 plate = bitswap<16>(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9); - m_display->matrix(grid, plate); -} - -void galaxy2_state::grid_w(offs_t offset, u8 data) -{ - // E3: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 3 & 1); - - // C,D,E01: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void galaxy2_state::plate_w(offs_t offset, u8 data) -{ - // F,G,H,I: vfd plate - int shift = (offset - PORTF) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( galaxy2 ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void galaxy2_state::galaxy2(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_d().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_e().set(FUNC(galaxy2_state::grid_w)); - m_maincpu->write_f().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_g().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_h().set(FUNC(galaxy2_state::plate_w)); - m_maincpu->write_i().set(FUNC(galaxy2_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(304, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 15); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void galaxy2_state::galaxy2b(machine_config &config) -{ - galaxy2(config); - - // video hardware - screen_device *screen = subdevice("screen"); - screen->set_size(306, 1080); - screen->set_visarea_full(); -} - -// roms - -ROM_START( galaxy2 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) - - ROM_REGION( 325057, "screen", 0) - ROM_LOAD( "galaxy2d.svg", 0, 325057, CRC(b2d27a0e) SHA1(502ec22c324903ffe8ff235b9a3b8898dce17a64) ) -ROM_END - -ROM_START( galaxy2b ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-153.s01", 0x0000, 0x0800, CRC(70d552b3) SHA1(72d50647701cb4bf85ea947a149a317aaec0f52c) ) - - ROM_REGION( 266377, "screen", 0) - ROM_LOAD( "galaxy2b.svg", 0, 266377, CRC(8633cebb) SHA1(6c41f5e918e1522eb55ef24270900a1b2477722b) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Astro Command (manufactured in Japan) - * PCB labels 96111/96112 - * NEC uCOM-43 MCU, label D553C 202 - * cyan/red VFD display NEC FIP9AM20T no. 42-42, with color overlay + bezel - - known releases: - - Japan: Astro Command, published by Epoch - - USA: Astro Command, published by Tandy - - UK: Scramble, published by Grandstand - -***************************************************************************/ - -class astrocmd_state : public hh_ucom4_state -{ -public: - astrocmd_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void astrocmd(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void astrocmd_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10); - m_display->matrix(grid, plate); -} - -void astrocmd_state::grid_w(offs_t offset, u8 data) -{ - // C,D(,E3): vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void astrocmd_state::plate_w(offs_t offset, u8 data) -{ - // E01,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - - if (offset == PORTE) - { - // E2: speaker out - m_speaker->level_w(data >> 2 & 1); - - // E3: vfd grid 8 - grid_w(offset, data >> 3 & 1); - } - else - update_display(); -} - -// config - -static INPUT_PORTS_START( astrocmd ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Missile") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Bomb") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void astrocmd_state::astrocmd(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(astrocmd_state::grid_w)); - m_maincpu->write_d().set(FUNC(astrocmd_state::grid_w)); - m_maincpu->write_e().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_f().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_g().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_h().set(FUNC(astrocmd_state::plate_w)); - m_maincpu->write_i().set(FUNC(astrocmd_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 525); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( astrocmd ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-202.s01", 0x0000, 0x0800, CRC(b4b34883) SHA1(6246d561c2df1f2124575d2ca671ef85b1819edd) ) - - ROM_REGION( 335362, "screen", 0) - ROM_LOAD( "astrocmd.svg", 0, 335362, CRC(fe2cd30f) SHA1(898a3d9afc5dca6c63ae28aed2c8530716ad1c45) ) -ROM_END - - - - - -/*************************************************************************** - - Epoch Dracula (manufactured in Japan) - * PCB label 96121 - * NEC uCOM-43 MCU, label D553C 206 - * cyan/red/green VFD display NEC FIP8BM20T no. 2-42 - - known releases: - - Japan: Dracula House, yellow case, published by Epoch - - USA: Dracula, red case, published by Epoch - - Other: Dracula, yellow case, published by Hales - -***************************************************************************/ - -class edracula_state : public hh_ucom4_state -{ -public: - edracula_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void edracula(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void edracula_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void edracula_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void edracula_state::plate_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // E,F,G,H,I01: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( edracula ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) -INPUT_PORTS_END - -void edracula_state::edracula(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(edracula_state::grid_w)); - m_maincpu->write_d().set(FUNC(edracula_state::grid_w)); - m_maincpu->write_e().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_f().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_g().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_h().set(FUNC(edracula_state::plate_w)); - m_maincpu->write_i().set(FUNC(edracula_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 526); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 18); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( edracula ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-206.s01", 0x0000, 0x0800, CRC(b524857b) SHA1(c1c89ed5dd4bb1e6e98462dc8fa5af2aa48d8ede) ) - - ROM_REGION( 794532, "screen", 0) - ROM_LOAD( "edracula.svg", 0, 794532, CRC(d20e018c) SHA1(7f70f1d373c034ec8c93e27b7e3371578ddaf61b) ) -ROM_END - - - - - -/*************************************************************************** - - Mattel Computer Gin - * NEC uCOM-43 MCU, label D650C 060 (die label same) - * Hughes HLCD0530 LCD driver, 5 by 14 segments LCD panel, no sound - -***************************************************************************/ - -class mcompgin_state : public hh_ucom4_state -{ -public: - mcompgin_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag), - m_lcd(*this, "lcd") - { } - - void mcompgin(machine_config &config); - -private: - required_device m_lcd; - - void lcd_output_w(offs_t offset, u32 data); - void lcd_w(u8 data); -}; - -// handlers - -void mcompgin_state::lcd_output_w(offs_t offset, u32 data) -{ - // uses ROW0-4, COL11-24 - m_display->matrix(1 << offset, data); -} - -void mcompgin_state::lcd_w(u8 data) -{ - // E0: HLCD0530 _CS - // E1: HLCD0530 clock - // E2: HLCD0530 data in - m_lcd->cs_w(data & 1); - m_lcd->data_w(data >> 2 & 1); - m_lcd->clock_w(data >> 1 & 1); -} - -// config - -static INPUT_PORTS_START( mcompgin ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Deal / Gin") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Discard") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Draw") - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Compare") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Score") - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void mcompgin_state::mcompgin(machine_config &config) -{ - // basic machine hardware - NEC_D650(config, m_maincpu, 400_kHz_XTAL); // TDK FCR400K - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_e().set(FUNC(mcompgin_state::lcd_w)); - - // video hardware - HLCD0530(config, m_lcd, 500); // C=0.01uF - m_lcd->write_cols().set(FUNC(mcompgin_state::lcd_output_w)); - - PWM_DISPLAY(config, m_display).set_size(8, 24); - - config.set_default_layout(layout_mcompgin); - - // no sound! -} - -// roms - -ROM_START( mcompgin ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d650c-060", 0x0000, 0x0800, CRC(985e6da6) SHA1(ea4102a10a5741f06297c5426156e4b2f0d85a68) ) -ROM_END - - - - - -/*************************************************************************** - - Mego Mini-Vid: Break Free (manufactured in Japan) - * PCB label Mego 79 rev F - * NEC uCOM-43 MCU, label D553C 049 - * cyan VFD display Futaba DM-4.5 91 - -***************************************************************************/ - -class mvbfree_state : public hh_ucom4_state -{ -public: - mvbfree_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void mvbfree(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void speaker_w(u8 data); -}; - -// handlers - -void mvbfree_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); - u16 plate = bitswap<16>(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9); - m_display->matrix(grid, plate); -} - -void mvbfree_state::grid_w(offs_t offset, u8 data) -{ - // E23,F,G,H: vfd grid - int shift = (offset - PORTE) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // E01: plate 0,1 - if (offset == PORTE) - plate_w(2 + PORTC, data & 3); - else - update_display(); -} - -void mvbfree_state::plate_w(offs_t offset, u8 data) -{ - // C,D(,E01): vfd plate - int shift = (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void mvbfree_state::speaker_w(u8 data) -{ - // I0: speaker out - m_speaker->level_w(data & 1); -} - -// config - -static INPUT_PORTS_START( mvbfree ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - - PORT_START("IN.1") // port B - PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) // unimplemented p1/p2 buttons - PORT_CONFNAME( 0x0c, 0x04, "Game Select") - PORT_CONFSETTING( 0x04, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFSETTING( 0x08, "3" ) -INPUT_PORTS_END - -void mvbfree_state::mvbfree(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(mvbfree_state::plate_w)); - m_maincpu->write_d().set(FUNC(mvbfree_state::plate_w)); - m_maincpu->write_e().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_f().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_g().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_h().set(FUNC(mvbfree_state::grid_w)); - m_maincpu->write_i().set(FUNC(mvbfree_state::speaker_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(14, 10); - config.set_default_layout(layout_mvbfree); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( mvbfree ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-049", 0x0000, 0x0800, CRC(d64a8399) SHA1(97887e486fa29b1fc4a5a40cacf3c960f67aacbf) ) -ROM_END - - - - - -/*************************************************************************** - - Takatoku Toys(T.T) Game Robot 9 「ゲームロボット九」 - * PCB label GAME ROBOT 7520 - * NEC uCOM-43 MCU, label TTGR-512 (die label NEC D557 511) - * 9 lamps behind buttons - - known releases: - - Japan: Game Robot 9, published by Takatoku Toys - - USA: Fabulous Fred - The Ultimate Electronic Game, published by Mego - - Mexico: Fabuloso Fred, published by Ensueño Toys (also released as - 12-button version, a clone of Tandy-12) - - Accessories were included for some of the minigames. - -***************************************************************************/ - -class grobot9_state : public hh_ucom4_state -{ -public: - grobot9_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void grobot9(machine_config &config); - -private: - void lamps_w(offs_t offset, u8 data); - void speaker_w(u8 data); - void input_w(u8 data); - u8 input_r(); -}; - -// handlers - -void grobot9_state::lamps_w(offs_t offset, u8 data) -{ - if (offset == PORTE) - { - // E1: speaker out - m_speaker->level_w(data >> 1 & 1); - - // E3: input mux high bit - m_inp_mux = (m_inp_mux & 7) | (data & 8); - } - - // D,F,E0: lamps - m_port[offset] = data; - m_display->matrix(1, m_port[PORTD] | m_port[PORTF] << 4 | m_port[PORTE] << 8); -} - -void grobot9_state::input_w(u8 data) -{ - // C012: input mux low - m_inp_mux = (m_inp_mux & 8) | (data & 7); -} - -u8 grobot9_state::input_r() -{ - // A: multiplexed inputs - return read_inputs(5); -} - -// config - -static INPUT_PORTS_START( grobot9 ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_Q) PORT_NAME("Button 1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_W) PORT_NAME("Button 2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_E) PORT_NAME("Button 3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_D) PORT_NAME("Button 4") - - PORT_START("IN.1") // C1 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_C) PORT_NAME("Button 5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_X) PORT_NAME("Button 6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_Z) PORT_NAME("Button 7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_A) PORT_NAME("Button 8") - - PORT_START("IN.2") // C2 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_S) PORT_NAME("Button 9") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Rest") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Eighth Note") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // E3 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Hit") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Repeat") - - PORT_START("IN.4") // INT - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_CHANGED_MEMBER(DEVICE_SELF, hh_ucom4_state, single_interrupt_line, 0) PORT_NAME("Start-Pitch") -INPUT_PORTS_END - -void grobot9_state::grobot9(machine_config &config) -{ - // basic machine hardware - NEC_D557L(config, m_maincpu, 160000); // approximation - m_maincpu->read_a().set(FUNC(grobot9_state::input_r)); - m_maincpu->write_c().set(FUNC(grobot9_state::input_w)); - m_maincpu->write_d().set(FUNC(grobot9_state::lamps_w)); - m_maincpu->write_e().set(FUNC(grobot9_state::lamps_w)); - m_maincpu->write_f().set(FUNC(grobot9_state::lamps_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(1, 9); - config.set_default_layout(layout_grobot9); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( grobot9 ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "ttgr-511", 0x0000, 0x0800, CRC(1f25b2bb) SHA1(55ae7e23f6dd46cc6e1a65839327726678410c3a) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Cosmic Combat (manufactured in Japan) - * PCB label 2E1019-E01 - * NEC uCOM-44 MCU, label D552C 042 - * cyan VFD display NEC FIP32AM18Y tube no. 0E, with color overlay - - known releases: - - USA: Cosmic Combat, published by Tomy - - Japan: Space Attack, published by Tomy - -***************************************************************************/ - -class tccombat_state : public hh_ucom4_state -{ -public: - tccombat_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tccombat(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tccombat_state::update_display() -{ - u16 grid = bitswap<16>(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4); - u32 plate = bitswap<24>(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6); - m_display->matrix(grid, plate); -} - -void tccombat_state::grid_w(offs_t offset, u8 data) -{ - // I1: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 1 & 1); - - // C,D,I0: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tccombat_state::plate_w(offs_t offset, u8 data) -{ - // E,F123,G,H: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tccombat ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x02, 0x02, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x02, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY -INPUT_PORTS_END - -void tccombat_state::tccombat(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 400000); // approximation - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_c().set(FUNC(tccombat_state::grid_w)); - m_maincpu->write_d().set(FUNC(tccombat_state::grid_w)); - m_maincpu->write_e().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_f().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_g().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_h().set(FUNC(tccombat_state::plate_w)); - m_maincpu->write_i().set(FUNC(tccombat_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(300, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 20); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tccombat ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-042", 0x0000, 0x0400, CRC(d7b5cfeb) SHA1(a267be8e43b7740758eb0881b655b1cc8aec43da) ) - - ROM_REGION( 210960, "screen", 0) - ROM_LOAD( "tccombat.svg", 0, 210960, CRC(03e9eba6) SHA1(d558d3063da42dc7cc02b769bca06a3732418837) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Tennis (manufactured in Japan) - * PCB label TOMY TN-04 TENNIS - * NEC uCOM-44 MCU, label D552C 048 - * cyan VFD display NEC FIP11AM15T tube no. 0F, with overlay - - The initial release of this game was in 1979, known as Pro-Tennis, - it has a D553 instead of D552, with just a little over 50% ROM used. - - Press the Serve button to start, then hit the ball by pressing one of the - positional buttons when the ball flies over it. - -***************************************************************************/ - -class tmtennis_state : public hh_ucom4_state -{ -public: - tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmtennis(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(difficulty_switch) { set_clock(); } - -protected: - virtual void machine_reset() override; - -private: - void set_clock(); - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); - void port_e_w(u8 data); - u8 input_r(offs_t offset); -}; - -void tmtennis_state::machine_reset() -{ - hh_ucom4_state::machine_reset(); - set_clock(); -} - -// handlers - -void tmtennis_state::set_clock() -{ - // MCU clock is from an LC circuit oscillating by default at ~360kHz, - // but on PRO1, the difficulty switch puts a capacitor across the LC circuit - // to slow it down to ~260kHz. - m_maincpu->set_unscaled_clock((m_inputs[1]->read() & 0x100) ? 260000 : 360000); -} - -void tmtennis_state::update_display() -{ - m_display->matrix(m_grid, m_plate); -} - -void tmtennis_state::grid_w(offs_t offset, u8 data) -{ - // G,H,I: vfd grid - int shift = (offset - PORTG) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtennis_state::plate_w(offs_t offset, u8 data) -{ - // C,D,F: vfd plate - int shift = (offset == PORTF) ? 8 : (offset - PORTC) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmtennis_state::port_e_w(u8 data) -{ - // E01: input mux - // E2: speaker out - // E3: N/C - m_inp_mux = data & 3; - m_speaker->level_w(data >> 2 & 1); -} - -u8 tmtennis_state::input_r(offs_t offset) -{ - // A,B: multiplexed buttons - return ~read_inputs(2) >> (offset*4); -} - -// config - -/* Pro-Tennis physical button layout and labels are like this: - - * left = P2/CPU side * * right = P1 side * - - [SERVE] [1] [2] [3] [3] [2] [1] [SERVE] - [4] [5] [6] [6] [5] [4] - - PRACTICE<--PRO1-->PRO2 1PLAYER<--OFF-->2PLAYER -*/ - -static INPUT_PORTS_START( tmtennis ) - PORT_START("IN.0") // E0 port A/B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Serve") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Serve") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("P1 Button 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("P1 Button 4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("P1 Button 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("P1 Button 5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("P1 Button 3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("P1 Button 6") - - PORT_START("IN.1") // E1 port A/B - PORT_CONFNAME( 0x101, 0x100, DEF_STR( Difficulty ) ) PORT_CHANGED_MEMBER(DEVICE_SELF, tmtennis_state, difficulty_switch, 0) - PORT_CONFSETTING( 0x001, "Practice" ) - PORT_CONFSETTING( 0x100, "Pro 1" ) // -> difficulty_switch - PORT_CONFSETTING( 0x000, "Pro 2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x00, "1" ) - PORT_CONFSETTING( 0x02, "2" ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("P2 Button 1") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("P2 Button 4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("P2 Button 2") - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("P2 Button 5") - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("P2 Button 3") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("P2 Button 6") -INPUT_PORTS_END - -void tmtennis_state::tmtennis(machine_config &config) -{ - // basic machine hardware - NEC_D552(config, m_maincpu, 360000); // see set_clock - m_maincpu->read_a().set(FUNC(tmtennis_state::input_r)); - m_maincpu->read_b().set(FUNC(tmtennis_state::input_r)); - m_maincpu->write_c().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_d().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_e().set(FUNC(tmtennis_state::port_e_w)); - m_maincpu->write_f().set(FUNC(tmtennis_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmtennis_state::grid_w)); - m_maincpu->write_h().set(FUNC(tmtennis_state::grid_w)); - m_maincpu->write_i().set(FUNC(tmtennis_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 417); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(12, 12); - config.set_default_layout(layout_tmtennis); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmtennis ) - ROM_REGION( 0x0400, "maincpu", 0 ) - ROM_LOAD( "d552c-048", 0x0000, 0x0400, CRC(78702003) SHA1(4d427d4dbeed901770c682338867f58c7b54eee3) ) - - ROM_REGION( 204490, "screen", 0) - ROM_LOAD( "tmtennis.svg", 0, 204490, CRC(ed0086e9) SHA1(26a5b2f0a9cd70401187146e1495aee80020658b) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Pac-Man (manufactured in Japan) - * PCB label TN-08 2E108E01 - * NEC uCOM-43 MCU, label D553C 160 - * cyan/red/green VFD display NEC FIP8AM18T no. 2-21 - * bright yellow round casing - - known releases: - - Japan: Puck Man, published by Tomy - - USA: Pac Man, published by Tomy - - UK: Puckman (Tomy), and also published by Grandstand as Munchman - - Australia: Pac Man-1, published by Futuretronics - - The game will start automatically after turning it on. This Pac Man refuses - to eat dots with his butt, you can only eat them going right-to-left. - -***************************************************************************/ - -class tmpacman_state : public hh_ucom4_state -{ -public: - tmpacman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmpacman(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tmpacman_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100; - m_display->matrix(grid, plate); -} - -void tmpacman_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmpacman_state::plate_w(offs_t offset, u8 data) -{ - // E1: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 1 & 1); - - // E023,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tmpacman ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_16WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_16WAY - - PORT_START("IN.1") // port B - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tmpacman_state::tmpacman(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 430_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(tmpacman_state::grid_w)); - m_maincpu->write_d().set(FUNC(tmpacman_state::grid_w)); - m_maincpu->write_e().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_f().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_h().set(FUNC(tmpacman_state::plate_w)); - m_maincpu->write_i().set(FUNC(tmpacman_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 508); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmpacman ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-160", 0x0000, 0x0800, CRC(b21a8af7) SHA1(e3122be1873ce76a4067386bf250802776f0c2f9) ) - - ROM_REGION( 230216, "screen", 0) - ROM_LOAD( "tmpacman.svg", 0, 230216, CRC(2ab5c0f1) SHA1(b2b6482b03c28515dc76fd3d6034c8b7e6bf6efc) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Scramble (manufactured in Japan) - * PCB label TN-10 2E114E01 - * NEC uCOM-43 MCU, label D553C 192 - * cyan/red/green VFD display NEC FIP10CM20T no. 2-41 - - known releases: - - World: Scramble, published by Tomy - - USA: Scramble, published by Tandy - - UK: Astro Blaster, published by Hales (Epoch Astro Command was named Scramble) - - Germany: Rambler, published by Tomy - -***************************************************************************/ - -class tmscramb_state : public hh_ucom4_state -{ -public: - tmscramb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tmscramb(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tmscramb_state::update_display() -{ - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400; - m_display->matrix(m_grid, plate); -} - -void tmscramb_state::grid_w(offs_t offset, u8 data) -{ - // I2: speaker out - if (offset == PORTI) - m_speaker->level_w(data >> 2 & 1); - - // C,D,I01: vfd grid - int shift = (offset == PORTI) ? 8 : (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tmscramb_state::plate_w(offs_t offset, u8 data) -{ - // E,F,G,H: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tmscramb ) - PORT_START("IN.0") // port A - PORT_CONFNAME( 0x01, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x01, "Professional" ) - PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - - PORT_START("IN.1") // port B - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void tmscramb_state::tmscramb(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->read_b().set_ioport("IN.1"); - m_maincpu->write_c().set(FUNC(tmscramb_state::grid_w)); - m_maincpu->write_d().set(FUNC(tmscramb_state::grid_w)); - m_maincpu->write_e().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_f().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_g().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_h().set(FUNC(tmscramb_state::plate_w)); - m_maincpu->write_i().set(FUNC(tmscramb_state::grid_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 556); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(10, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tmscramb ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-192", 0x0000, 0x0800, CRC(00fcc501) SHA1(a7771e934bf8268c83f38c7ec0acc668836e0939) ) - - ROM_REGION( 243830, "screen", 0) - ROM_LOAD( "tmscramb.svg", 0, 243830, CRC(300b098a) SHA1(9fde58ac0f4e4cfea05301346cbf5b1ced9fe973) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy(tronic) Caveman (manufactured in Japan) - * PCB label TN-12 2E114E03 - * NEC uCOM-43 MCU, label D553C 209 - * cyan/red/green VFD display NEC FIP8AM20T no. 2-42 - - known releases: - - World: Caveman, published by Tomy - - USA: Caveman, published by Tandy - - UK: Cave Man - Jr. Caveman vs Dinosaur, published by Grandstand - -***************************************************************************/ - -class tcaveman_state : public hh_ucom4_state -{ -public: - tcaveman_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void tcaveman(machine_config &config); - -private: - void update_display(); - void grid_w(offs_t offset, u8 data); - void plate_w(offs_t offset, u8 data); -}; - -// handlers - -void tcaveman_state::update_display() -{ - u8 grid = bitswap<8>(m_grid,0,1,2,3,4,5,6,7); - u32 plate = bitswap<24>(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40; - m_display->matrix(grid, plate); -} - -void tcaveman_state::grid_w(offs_t offset, u8 data) -{ - // C,D: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - update_display(); -} - -void tcaveman_state::plate_w(offs_t offset, u8 data) -{ - // E3: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 3 & 1); - - // E012,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = (m_plate & ~(0xf << shift)) | (data << shift); - update_display(); -} - -// config - -static INPUT_PORTS_START( tcaveman ) - PORT_START("IN.0") // port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_CONFNAME( 0x08, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x08, "Professional" ) -INPUT_PORTS_END - -void tcaveman_state::tcaveman(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set_ioport("IN.0"); - m_maincpu->write_c().set(FUNC(tcaveman_state::grid_w)); - m_maincpu->write_d().set(FUNC(tcaveman_state::grid_w)); - m_maincpu->write_e().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_f().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_g().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_h().set(FUNC(tcaveman_state::plate_w)); - m_maincpu->write_i().set(FUNC(tcaveman_state::plate_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1920, 559); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(8, 19); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( tcaveman ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-209", 0x0000, 0x0800, CRC(d230d4b7) SHA1(2fb12b60410f5567c5e3afab7b8f5aa855d283be) ) - - ROM_REGION( 306952, "screen", 0) - ROM_LOAD( "tcaveman.svg", 0, 306952, CRC(a0588b14) SHA1(f67edf579963fc19bc7f9d268329cbc0230712d8) ) -ROM_END - - - - - -/*************************************************************************** - - Tomy Alien Chase (manufactured in Japan) - * PCB label TN-16 2E121B01 - * NEC uCOM-43 MCU, label D553C 258 - * red/green VFD display NEC FIP9AM24T, with color overlay, 2-sided* - - *Player one views the VFD from the front (grid+filament side) while the - opposite player views it from the back side (through the conductive traces), - basically a mirror-image. - - To start the game, simply press [UP]. Hold a joystick direction to move around. - -***************************************************************************/ - -class alnchase_state : public hh_ucom4_state -{ -public: - alnchase_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_ucom4_state(mconfig, type, tag) - { } - - void alnchase(machine_config &config); - -private: - void output_w(offs_t offset, u8 data); - u8 input_r(); -}; - -// handlers - -void alnchase_state::output_w(offs_t offset, u8 data) -{ - if (offset <= PORTE) - { - // C,D,E0: vfd grid - int shift = (offset - PORTC) * 4; - m_grid = (m_grid & ~(0xf << shift)) | (data << shift); - - // C0(grid 0): input enable PL1 - // D0(grid 4): input enable PL2 - m_inp_mux = (m_grid & 1) | (m_grid >> 3 & 2); - - // E1: speaker out - if (offset == PORTE) - m_speaker->level_w(data >> 1 & 1); - } - - if (offset >= PORTE) - { - // E23,F,G,H,I: vfd plate - int shift = (offset - PORTE) * 4; - m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; - } - - m_display->matrix(m_grid, m_plate); -} - -u8 alnchase_state::input_r() -{ - // A: multiplexed buttons - return read_inputs(2); -} - -// config - -/* physical button layout and labels are like this: - - POWER SOUND LEVEL PLAYER - ON ON PRO TWO START - o o | | - | | | | [joystick] - | | o o - OFF OFF AMA ONE GAME 0,1,2,3 - - 1 PLAYER SIDE - - other player side only has a joystick -*/ - -static INPUT_PORTS_START( alnchase ) - PORT_START("IN.0") // C0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - - PORT_START("IN.1") // D0 port A - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) // on non-mirrored view, swap P2 left/right - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) // " - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) - - PORT_START("IN.2") // port B - PORT_CONFNAME( 0x01, 0x01, DEF_STR( Players ) ) - PORT_CONFSETTING( 0x01, "1" ) - PORT_CONFSETTING( 0x00, "2" ) - PORT_CONFNAME( 0x02, 0x00, DEF_STR( Difficulty ) ) - PORT_CONFSETTING( 0x00, "Amateur" ) - PORT_CONFSETTING( 0x02, "Professional" ) - PORT_BIT( 0x0c, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - -void alnchase_state::alnchase(machine_config &config) -{ - // basic machine hardware - NEC_D553(config, m_maincpu, 400_kHz_XTAL); - m_maincpu->read_a().set(FUNC(alnchase_state::input_r)); - m_maincpu->read_b().set_ioport("IN.2"); - m_maincpu->write_c().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_d().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_e().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_f().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_g().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_h().set(FUNC(alnchase_state::output_w)); - m_maincpu->write_i().set(FUNC(alnchase_state::output_w)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(365, 1080); - screen.set_visarea_full(); - - PWM_DISPLAY(config, m_display).set_size(9, 17); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25); -} - -// roms - -ROM_START( alnchase ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "d553c-258", 0x0000, 0x0800, CRC(c5284ff5) SHA1(6a20aaacc9748f0e0335958f3cea482e36153704) ) - - ROM_REGION( 576864, "screen", 0) - ROM_LOAD( "alnchase.svg", 0, 576864, CRC(fe7c7078) SHA1(0d201eeaeb291ded14c0759d1d3d5b2491cf0792) ) -ROM_END - - - -} // anonymous namespace - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, ufombs, 0, 0, ufombs, ufombs, ufombs_state, empty_init, "Bambino", "UFO Master-Blaster Station", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, ssfball, 0, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Superstar Football (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, bmcfball, ssfball, 0, ssfball, ssfball, ssfball_state, empty_init, "Bambino", "Classic Football (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1979, bmsoccer, 0, 0, bmsoccer, bmsoccer, bmsoccer_state, empty_init, "Bambino", "Kick The Goal Soccer", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, bmsafari, 0, 0, bmsafari, bmsafari, bmsafari_state, empty_init, "Bambino", "Safari (Bambino)", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, splasfgt, 0, 0, splasfgt, splasfgt, splasfgt_state, empty_init, "Bambino", "Space Laser Fight", MACHINE_SUPPORTS_SAVE ) - -CONS( 1982, bcclimbr, 0, 0, bcclimbr, bcclimbr, bcclimbr_state, empty_init, "Bandai", "Crazy Climber (Bandai)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, tactix, 0, 0, tactix, tactix, tactix_state, empty_init, "Castle Toy", "Tactix (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1980, ctntune, 0, 0, ctntune, ctntune, ctntune_state, empty_init, "Castle Toy", "Name That Tune (Castle Toy)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // *** - -CONS( 1980, invspace, 0, 0, invspace, invspace, invspace_state, empty_init, "Epoch", "Invader From Space", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, efball, 0, 0, efball, efball, efball_state, empty_init, "Epoch", "Electronic Football (Epoch)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, galaxy2, 0, 0, galaxy2, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. D)", MACHINE_SUPPORTS_SAVE ) -CONS( 1981, galaxy2b, galaxy2, 0, galaxy2b, galaxy2, galaxy2_state, empty_init, "Epoch", "Galaxy II (VFD Rev. B)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, astrocmd, 0, 0, astrocmd, astrocmd, astrocmd_state, empty_init, "Epoch", "Astro Command", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, edracula, 0, 0, edracula, edracula, edracula_state, empty_init, "Epoch", "Dracula (Epoch)", MACHINE_SUPPORTS_SAVE ) - -CONS( 1979, mcompgin, 0, 0, mcompgin, mcompgin, mcompgin_state, empty_init, "Mattel Electronics", "Computer Gin", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) - -CONS( 1979, mvbfree, 0, 0, mvbfree, mvbfree, mvbfree_state, empty_init, "Mego", "Mini-Vid: Break Free", MACHINE_SUPPORTS_SAVE ) - -CONS( 1980, grobot9, 0, 0, grobot9, grobot9, grobot9_state, empty_init, "Takatoku Toys", "Game Robot 9", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // some of the minigames: *** - -CONS( 1980, tccombat, 0, 0, tccombat, tccombat, tccombat_state, empty_init, "Tomy", "Cosmic Combat", MACHINE_SUPPORTS_SAVE ) -CONS( 1980, tmtennis, 0, 0, tmtennis, tmtennis, tmtennis_state, empty_init, "Tomy", "Tennis (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tmpacman, 0, 0, tmpacman, tmpacman, tmpacman_state, empty_init, "Tomy", "Pac Man (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tmscramb, 0, 0, tmscramb, tmscramb, tmscramb_state, empty_init, "Tomy", "Scramble (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1982, tcaveman, 0, 0, tcaveman, tcaveman, tcaveman_state, empty_init, "Tomy", "Caveman (Tomy)", MACHINE_SUPPORTS_SAVE ) -CONS( 1984, alnchase, 0, 0, alnchase, alnchase, alnchase_state, empty_init, "Tomy", "Alien Chase", MACHINE_SUPPORTS_SAVE ) - -// ***: As far as MAME is concerned, the game is emulated fine. But for it to be playable, it requires interaction -// with other, unemulatable, things eg. game board/pieces, book, playing cards, pen & paper, etc. diff --git a/src/mame/misc_handheld/monty.cpp b/src/mame/misc_handheld/monty.cpp deleted file mode 100644 index 8a2718a167a..00000000000 --- a/src/mame/misc_handheld/monty.cpp +++ /dev/null @@ -1,296 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Andrew Gardner, hap -/*************************************************************************** - -Driver for Ritam Monty Plays Scrabble Brand Crossword Game - Portable Computer Console - -Scrabble computer that allows you play a game of Scrabble by yourself (or you -can play with up to 3 players). Has a built-in 12,000 vocabulary, expandable -to 44,000 by way of 2 expansion modules each containing 16,000 more obscure words. -You can use the included 'score cards' (which look like little Scrabble boards), -or you can use a real Scrabble board and tiles to play. Also note, Monty -apparently originally came with a little pen. - -This game was later upgraded by Ritam to Master Monty which had 24,000 words -built-in (expandable to a total of 56,000 with the same 2 expansion modules). -Two variations on Master Monty have been seen: one looks exactly the same as the -Monty but the electronics on the inside have been upgraded. The later version -is blue and says Master Monty at the top. Both of these versions are hand-upgraded -by adding chips and wires to the inside of the game. - -Hardware notes: -- Z80 @ ~3.58MHz -- 2KB SRAM, 16KB ROM(32KB on mmonty) -- 2*16KB ROM sockets for vocabulary expansion -- 2*SED1503F, 40*32 LCD screen, beeper - -TODO: -- put expansion roms in softwarelist? (note: slot #1 only accepts rom #1, - slot #2 only accepts rom #2), they can be disabled in-game with option M - -****************************************************************************/ - -#include "emu.h" - -#include "cpu/z80/z80.h" -#include "sound/dac.h" -#include "video/sed1500.h" - -#include "screen.h" -#include "speaker.h" - -#include "monty.lh" - - -namespace { - -class monty_state : public driver_device -{ -public: - monty_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_lcd(*this, "lcd%u", 0) - , m_dac(*this, "dac") - , m_inputs(*this, "IN.%u", 0) - { } - - DECLARE_WRITE_LINE_MEMBER(key_pressed); - - void monty(machine_config &config); - void mmonty(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device_array m_lcd; - required_device m_dac; - required_ioport_array<6> m_inputs; - - void monty_mem(address_map &map); - void mmonty_mem(address_map &map); - void monty_io(address_map &map); - - template void lcd_output_w(offs_t offset, u64 data) { m_lcd_data[N << 4 | offset] = data; } // buffer for screen_update - u32 screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect); - - void control_w(offs_t offset, u8 data); - void lcd_w(offs_t offset, u8 data) { m_lcd[m_lcd_cs]->write(offset, data); } - u8 input_r(offs_t offset); - DECLARE_WRITE_LINE_MEMBER(halt_changed) { m_halt = state; } - - u64 m_lcd_data[32]; - int m_lcd_cs = 0; - int m_halt = 0; -}; - -void monty_state::machine_start() -{ - memset(m_lcd_data, 0, sizeof(m_lcd_data)); - - save_item(NAME(m_lcd_data)); - save_item(NAME(m_lcd_cs)); - save_item(NAME(m_halt)); -} - - - -/****************************************************************************** - Video -******************************************************************************/ - -u32 monty_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) -{ - bitmap.fill(0xffffff); - - // letters with width 5 with space in between them - for (int y = 0; y < 32; y++) - for (int x = 0; x < 40; x++) - bitmap.pix(y + 1, x + x/5 + 1) = BIT(m_lcd_data[y], x) ? 0 : 0xffffff; - - return 0; -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void monty_state::control_w(offs_t offset, u8 data) -{ - // a0: speaker out - m_dac->write(BIT(offset, 0)); - - // a1: lcd chip select - m_lcd_cs = BIT(offset, 1); -} - -u8 monty_state::input_r(offs_t offset) -{ - u8 data = 0; - - // a0-a5, d0-d4: multiplexed inputs - for (int i = 0; i < 6; i++) - if (BIT(offset, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - -WRITE_LINE_MEMBER(monty_state::key_pressed) -{ - if (state && m_halt) - m_maincpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void monty_state::monty_mem(address_map &map) -{ - map(0x0000, 0x3fff).rom(); - map(0x4000, 0x7fff).rom(); // slot 1 - map(0x8000, 0xbfff).rom(); // slot 2 - map(0xf800, 0xffff).ram(); -} - -void monty_state::mmonty_mem(address_map &map) -{ - map(0x0000, 0x77ff).rom(); - map(0x7800, 0x7fff).ram(); - map(0x8000, 0xbfff).rom(); // slot 2 - map(0xc000, 0xffff).rom(); // slot 1 -} - -void monty_state::monty_io(address_map &map) -{ - map.global_mask(0xff); - map(0x00, 0xff).r(FUNC(monty_state::input_r)); - map(0x00, 0x03).w(FUNC(monty_state::control_w)); - map(0x80, 0xff).w(FUNC(monty_state::lcd_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -static INPUT_PORTS_START( monty ) - PORT_START("IN.0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Erase") PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Option") PORT_CODE(KEYCODE_SPACE) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Blank") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_DOWN) PORT_CHAR('M') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR('I') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_LEFT) PORT_CHAR('G') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - - PORT_START("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_UP) PORT_CHAR('C') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, monty_state, key_pressed) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void monty_state::monty(machine_config &config) -{ - // Basic machine hardware - Z80(config, m_maincpu, 3.579545_MHz_XTAL); // Ceramic resonator labeled 3.58MT - m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::monty_mem); - m_maincpu->set_addrmap(AS_IO, &monty_state::monty_io); - m_maincpu->halt_cb().set(FUNC(monty_state::halt_changed)); - - // Video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(60); - screen.set_vblank_time(0); - screen.set_size(40+8+1, 32+1); - screen.set_visarea_full(); - screen.set_screen_update(FUNC(monty_state::screen_update)); - - SED1503(config, m_lcd[0], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<0>)); - SED1503(config, m_lcd[1], 32768).write_segs().set(FUNC(monty_state::lcd_output_w<1>)); - config.set_default_layout(layout_monty); - - // Sound hardware - SPEAKER(config, "speaker").front_center(); - DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); -} - -void monty_state::mmonty(machine_config &config) -{ - monty(config); - m_maincpu->set_addrmap(AS_PROGRAM, &monty_state::mmonty_mem); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( monty ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "monty_main.bin", 0x0000, 0x4000, CRC(720b4f55) SHA1(0106eb88d3fbbf25a745b9b6ee785ba13689d095) ) // 27128 - ROM_LOAD( "monty_module1.bin", 0x4000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 - ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 -ROM_END - -ROM_START( mmonty ) - ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD( "master_monty_main.bin", 0x0000, 0x8000, CRC(bb5ef4d4) SHA1(ba2c759e429f8740df419f9abb60832eddfba8ab) ) // 27C256 - ROM_LOAD( "monty_module2.bin", 0x8000, 0x4000, CRC(db672e47) SHA1(bb14fe86df06cfa4b19625ba417d1a5bc8eae155) ) // 27128 - ROM_LOAD( "monty_module1.bin", 0xc000, 0x4000, CRC(2725d8c3) SHA1(8273b9779c0915f9c7c43ea4fb460f43ce036358) ) // 27128 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1983, monty, 0, 0, monty, monty, monty_state, empty_init, "Ritam", "Monty Plays Scrabble", MACHINE_SUPPORTS_SAVE ) -COMP( 1987, mmonty, 0, 0, mmonty, monty, monty_state, empty_init, "Ritam", "Master Monty", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/rzone.cpp b/src/mame/misc_handheld/rzone.cpp deleted file mode 100644 index abae24156fb..00000000000 --- a/src/mame/misc_handheld/rzone.cpp +++ /dev/null @@ -1,355 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - - ** subclass of hh_sm510_state (includes/hh_sm510.h, drivers/hh_sm510.cpp) ** - - Tiger R-Zone driver - - This is a backwards console, the heart of the machine is the cartridge. - The console houses the controller, speaker, power, backlight, and a - polarizer filter for the screen. The cartridge has the MCU, optional - sound ROM, and the LCD screen in a translucent window. - - Console family: - - 1995: R-Zone HeadGear: Wearable headset, controller is separate, - red-on-black screen is reflected in front of the right eye. - 1996: R-Zone SuperScreen: Handheld console, inverted filter(aka black - LCD segments), optional background sheet as with standalone handhelds. - 1997: R-Zone X.P.G - Xtreme Pocket Game: Handheld version of HeadGear. - 1997: R-Zone DataZone: PDA with a built-in SuperScreen. - - TODO: - - softwarelist? it's impossible right now due to SVG initialization - - support for SuperScreen. SVG colors will need to be inverted, or maybe - with artwork or HLSL? - - add DataZone, will get its own driver - -***************************************************************************/ - -#include "emu.h" -#include "hh_sm510.h" - -#include "machine/timer.h" -#include "screen.h" -#include "speaker.h" - -// internal artwork -#include "rzone.lh" - - -namespace { - -class rzone_state : public hh_sm510_state -{ -public: - rzone_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_sm510_state(mconfig, type, tag), - m_led_out(*this, "led"), - m_led_off(*this, "led_off") - { } - - void rzbatfor(machine_config &config); - void rztoshden(machine_config &config); - void rzindy500(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - output_finder<> m_led_out; - required_device m_led_off; - - int m_led_pin = 0; - int m_sctrl = 0; - int m_sclock = 0; - - TIMER_DEVICE_CALLBACK_MEMBER(led_off_callback) { m_led_out = m_led_pin ? 1 : 0; } - DECLARE_WRITE_LINE_MEMBER(led_w); - DECLARE_WRITE_LINE_MEMBER(audio_w); - DECLARE_WRITE_LINE_MEMBER(sctrl_w); - DECLARE_WRITE_LINE_MEMBER(sclock_w); - DECLARE_READ_LINE_MEMBER(sdata_r); - - void t1_write_r(u8 data); - void t1_write_s(u8 data); - virtual u8 input_r() override; - - void t2_update_audio(); - void t2_write_r(u8 data); - void t2_write_s(u8 data); -}; - - -// machine start - -void rzone_state::machine_start() -{ - hh_sm510_state::machine_start(); - - // resolve handlers - m_led_out.resolve(); - - // register for savestates - save_item(NAME(m_led_pin)); - save_item(NAME(m_sctrl)); - save_item(NAME(m_sclock)); -} - - -/*************************************************************************** - I/O -***************************************************************************/ - -// console - -WRITE_LINE_MEMBER(rzone_state::led_w) -{ - // LED: enable backlight - if (state) - m_led_out = 1; - - // delay led off to prevent flickering - if (!state && m_led_pin) - m_led_off->adjust(attotime::from_msec(30)); - - m_led_pin = state; -} - -WRITE_LINE_MEMBER(rzone_state::audio_w) -{ - // Audio: speaker out - m_speaker->level_w(state ? 1 : 0); -} - -WRITE_LINE_MEMBER(rzone_state::sctrl_w) -{ - // SCTRL: 74165 SH/LD: reload inputs while low - if (!state || !m_sctrl) - m_inp_mux = m_inputs[0]->read(); - - m_sctrl = state; -} - -WRITE_LINE_MEMBER(rzone_state::sclock_w) -{ - // SCLOCK: 74165 CLK: shift inputs on rising edge when 74165 SH/LD is high - if (m_sctrl && !m_sclock && state) - m_inp_mux >>= 1; - - m_sclock = state; -} - -READ_LINE_MEMBER(rzone_state::sdata_r) -{ - // SDATA: 74165 Q - sctrl_w(m_sctrl); // reload inputs if needed - return m_inp_mux & 1; -} - - -// cartridge type 1: simple SM510 - -void rzone_state::t1_write_r(u8 data) -{ - // R1: Audio - audio_w(data & 1); - - // R2: SCTRL - sctrl_w(data >> 1 & 1); -} - -void rzone_state::t1_write_s(u8 data) -{ - // S1: LED - led_w(data & 1); - - // S2: SCLOCK - sclock_w(data >> 1 & 1); -} - -u8 rzone_state::input_r() -{ - // K1: SDATA - return sdata_r(); -} - - -// cartridge type 2: simple SM512, 2 audio lines - -void rzone_state::t2_update_audio() -{ - audio_w((m_s >> 2 & 1) | (m_r & 1)); -} - -void rzone_state::t2_write_r(u8 data) -{ - // R: Audio - m_r = data; - t2_update_audio(); -} - -void rzone_state::t2_write_s(u8 data) -{ - // S1: SCTRL - sctrl_w(data & 1); - - // S2: SCLOCK - sclock_w(data >> 1 & 1); - - // S3: Audio - m_s = data; - t2_update_audio(); - - // S4: LED - led_w(data >> 3 & 1); -} - - - -/*************************************************************************** - Inputs -***************************************************************************/ - -static INPUT_PORTS_START( rzone ) - PORT_START("IN.0") - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // A - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_CHANGED_CB(input_changed) // B - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CHANGED_CB(input_changed) // C - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_CHANGED_CB(input_changed) // D - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound") - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_CHANGED_CB(input_changed) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Pause") - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_START ) PORT_CHANGED_CB(input_changed) -INPUT_PORTS_END - - - -/*************************************************************************** - Machine Configs -***************************************************************************/ - -void rzone_state::rzbatfor(machine_config &config) -{ - // basic machine hardware - SM512(config, m_maincpu); // no external XTAL - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t2_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t2_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1368, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void rzone_state::rztoshden(machine_config &config) -{ - // basic machine hardware - SM510(config, m_maincpu); - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1392, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - -void rzone_state::rzindy500(machine_config &config) -{ - // basic machine hardware - SM510(config, m_maincpu); // no external XTAL - m_maincpu->set_r_mask_option(sm510_base_device::RMASK_DIRECT); // confirmed - m_maincpu->write_segs().set(FUNC(rzone_state::sm510_lcd_segment_w)); - m_maincpu->read_k().set(FUNC(rzone_state::input_r)); - m_maincpu->write_s().set(FUNC(rzone_state::t1_write_s)); - m_maincpu->write_r().set(FUNC(rzone_state::t1_write_r)); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(1425, 1080); - screen.set_visarea_full(); - - TIMER(config, m_led_off).configure_generic(FUNC(rzone_state::led_off_callback)); - config.set_default_layout(layout_rzone); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/*************************************************************************** - ROM Definitions -***************************************************************************/ - -ROM_START( rzbatfor ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-231, SM512 under epoxy (die label KMN1202) (not the same game as the standalone Tiger handheld) - ROM_LOAD( "12_02.program", 0x0000, 0x1000, CRC(27abdb52) SHA1(b356ff80b628244da588b4748404b78d7a57eccd) ) - - ROM_REGION( 0x100, "maincpu:melody", 0 ) - ROM_LOAD( "12_02.melody", 0x000, 0x100, CRC(d794746c) SHA1(f0706c5100c090c65fcb2d768b5a5b4a55b29e04) ) - - ROM_REGION( 652556, "screen", 0) - ROM_LOAD( "rzbatfor.svg", 0, 652556, CRC(4d850489) SHA1(31a2a1e9209c0f77dbc268cddbfa4a67478734a7) ) -ROM_END - -ROM_START( rztoshden ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-241, SM510 under epoxy (die label ML4) - ROM_LOAD( "ml4", 0x0000, 0x1000, CRC(282c641f) SHA1(f94e4a17ffe90adcc6046070034be9b777f72288) ) - - ROM_REGION( 857474, "screen", 0) - ROM_LOAD( "rztoshden.svg", 0, 857474, CRC(e4340f84) SHA1(4f040d3c7dc06d66b4f06942e610a64c11e5cd4d) ) -ROM_END - -ROM_START( rzindy500 ) - ROM_REGION( 0x1000, "maincpu", 0 ) // model 71-312, SM510 under epoxy (die label KMS10 22) - ROM_LOAD( "10_22", 0x0000, 0x1000, CRC(99a746d0) SHA1(64264499d45a566fa9a0801c20e7fa27eac18da6) ) - - ROM_REGION( 533411, "screen", 0) - ROM_LOAD( "rzindy500.svg", 0, 533411, CRC(cfc85677) SHA1(014b9123d81fba1488b4a22a6b6fd0c09e22c1ea) ) -ROM_END - -} // anonymous namespace - - - -/*************************************************************************** - Drivers -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1995, rzbatfor, 0, 0, rzbatfor, rzone, rzone_state, empty_init, "Tiger Electronics", "R-Zone: Batman Forever", MACHINE_SUPPORTS_SAVE ) -CONS( 1996, rztoshden, 0, 0, rztoshden, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Takara)", "R-Zone: Battle Arena Toshinden", MACHINE_SUPPORTS_SAVE ) -CONS( 1996, rzindy500, 0, 0, rzindy500, rzone, rzone_state, empty_init, "Tiger Electronics (licensed from Sega)", "R-Zone: Indy 500", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/scrablex.cpp b/src/mame/misc_handheld/scrablex.cpp deleted file mode 100644 index 15b69e7f947..00000000000 --- a/src/mame/misc_handheld/scrablex.cpp +++ /dev/null @@ -1,229 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/******************************************************************************* - -Selchow & Righter Scrabble Lexor -It's a tabletop scrabble game/scorekeeper. - -Hardware notes: -- PCB label: PB-074 -- Fujitsu MB8841 MCU -- 8-digit 14-seg LEDs, 2-bit sound - -There's also a version of this game on a Panasonic MN1405 MCU. - -*******************************************************************************/ - -#include "emu.h" -#include "cpu/mb88xx/mb88xx.h" -#include "sound/spkrdev.h" -#include "video/pwm.h" -#include "speaker.h" - -#include "scrablex.lh" - - -namespace { - -class scrablex_state : public driver_device -{ -public: - scrablex_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_inputs(*this, "IN.%u", 0) - { } - - void scrablex(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device m_display; - required_device m_speaker; - required_ioport_array<5> m_inputs; - - void write_o(u8 data); - void write_p(u8 data); - template u8 read_r(); - template void write_r(u8 data); - - u8 m_inp_mux = 0; - u16 m_r = 0; -}; - -void scrablex_state::machine_start() -{ - // register for savestates - save_item(NAME(m_inp_mux)); - save_item(NAME(m_r)); -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -void scrablex_state::write_o(u8 data) -{ - // O0-O7: digit select (uses index 8-15) - m_display->write_my((1 << (data & 0xf)) >> 8); -} - -void scrablex_state::write_p(u8 data) -{ - // P0-P3: input mux part - m_inp_mux = (m_inp_mux & ~0xf) | (~data & 0xf); -} - -template -u8 scrablex_state::read_r() -{ - u16 data = 0; - - // R0-R8: multiplexed inputs - for (int i = 0; i < 5; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data >> (N * 4) & 0xf; -} - -template -void scrablex_state::write_r(u8 data) -{ - // R0-R13: digit segments - m_r = (m_r & ~(0xf << (N * 4))) | ((~data & 0xf) << (N * 4)); - m_display->write_mx(bitswap<14>(m_r,10,8,6,12,11,7,9,13,5,4,3,2,1,0)); - - // R14,R15: speaker out - m_speaker->level_w(m_r >> 14 & 3); - - // R15: input mux part - m_inp_mux = (m_inp_mux & 0xf) | (m_r >> 11 & 0x10); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( scrablex ) - PORT_START("IN.0") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.1") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - - PORT_START("IN.2") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR('*') - - PORT_START("IN.3") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Double") - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("Triple") - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Word") - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Bonus") - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_NAME("Minus") - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_NAME("Clear") - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter") - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") - PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("Flash") - PORT_BIT( 0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Solo") - PORT_BIT( 0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_NAME("Score") - PORT_BIT( 0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') - PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') - PORT_BIT( 0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') - PORT_BIT( 0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') - PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Timer") - PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Review") -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -void scrablex_state::scrablex(machine_config &config) -{ - // basic machine hardware - MB8841(config, m_maincpu, 500000); // approximation - RC osc. R=15K, C=100pF - m_maincpu->write_o().set(FUNC(scrablex_state::write_o)); - m_maincpu->write_p().set(FUNC(scrablex_state::write_p)); - m_maincpu->read_r<0>().set(FUNC(scrablex_state::read_r<0>)); - m_maincpu->read_r<1>().set(FUNC(scrablex_state::read_r<1>)); - m_maincpu->read_r<2>().set(FUNC(scrablex_state::read_r<2>)); - m_maincpu->read_r<3>().set(FUNC(scrablex_state::read_r<3>)); - m_maincpu->write_r<0>().set(FUNC(scrablex_state::write_r<0>)); - m_maincpu->write_r<1>().set(FUNC(scrablex_state::write_r<1>)); - m_maincpu->write_r<2>().set(FUNC(scrablex_state::write_r<2>)); - m_maincpu->write_r<3>().set(FUNC(scrablex_state::write_r<3>)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(8, 14); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_scrablex); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker); - static const double speaker_levels[4] = { 0.0, 1.0, -1.0, 0.0 }; - m_speaker->set_levels(4, speaker_levels); - m_speaker->add_route(ALL_OUTPUTS, "mono", 0.125); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( scrablex ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "mb8841_320m", 0x0000, 0x0800, CRC(bef4ab5a) SHA1(44e385225c5e8818ed93c3654a294aa412042e34) ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1980, scrablex, 0, 0, scrablex, scrablex, scrablex_state, empty_init, "Selchow & Righter", "Scrabble Lexor - Computer Word Game", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/talkingbb.cpp b/src/mame/misc_handheld/talkingbb.cpp deleted file mode 100644 index 1118559e70c..00000000000 --- a/src/mame/misc_handheld/talkingbb.cpp +++ /dev/null @@ -1,351 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/****************************************************************************** - -Parker Brothers Starting Lineup Talking Baseball - -Hardware notes: -- PCB label KPT-349 REV 6C<1> -- 80C31 MCU @ 12MHz -- 2KB RAM, 128KB ROM, 2 cartridge slots -- 12 leds, 2 16-button keypads - -ROM chip has (C) 1987 Tonka (Kenner Parker Toys was acquired by Tonka in 1987, Parker -Brothers itself was acquired by Kenner in 1985) - -The speech driver is by Forrest S. Mozer's company. - -The cartridge slots are for extra teams. There are around 8 cartridges, each one -included 3 or 4 baseball teams, with exception to the "Hall of Fame" cartridge. -Players enter a 3-digit code to select the team. - -TODO: -- add cartridge slots -- Buttons are unresponsive at initial game setup, you need to hold the yes/no button - until it responds. The keypad reading routine is at $1A5D, it gets skipped for several - seconds at a time. Once in-game, everything is fine though. BTANB or different cause? - -******************************************************************************* - -Field positions (used when substituting): - -1: Pitcher -2: Catcher -3: First Base -4: Second Base -5: Third Base -6: Shortstop -7: Left Field -8: Center Field -9: Right Field - -The game includes baseball cards with player stats. At the very least, the roster -cards are needed to play the game properly. See below for the default teams. - -American Team: --------------- - -Starting lineup batting order: - -1: #23 Rickey Henderson, CF -2: #14 Don Mattingly, 1B -3: #18 Wade Boggs, 3B -4: #22 George Bell, LF -5: #24 Dave Winfield, RF -6: #16 Cal Ripken, SS -7: #11 Terry Kennedy, C -8: #15 Willie Randolph, 2B -9: #20 Alan Trammell, SS & DH -10:#27 Roger Clemens, P - -Substitutes: - -#19: George Brett, 3B -#12: Carlton Fisk, C -#25: Jack Morris, P -#13: Eddie Murray, 1B -#21: Kirby Puckett, OF -#30: Dan Quisenberry, P -#29: Dave Righetti, P -#28: Bret Saberhagen, P -#17: Lou Whitaker, 2B -#26: Robin Yount, SS - -National Team: --------------- - -Starting lineup batting order: - -1: #23: Tim Raines, LF -2: #16: Ryne Sandberg, 2B -3: #22: Darryl Strawberry, RF -4: #19: Mike Schmidt, 3B -5: #13: Jack Clark, 1B -6: #20: Eric Davis, CF -7: #11: Gary Carter, C -8: #17: Ozzie Smith, SS -9: #18: Dale Murphy, OF & DH -10:#25: Mike Scott, P - -Substitutes: - -#15: Buddy Bell, 3B -#26: Jody Davis, C -#24: Andre Dawson, CF -#29: Dwight Gooden, P -#21: Tony Gwynn, OF -#14: Keith Hernandez, 1B -#30: Nolan Ryan, P -#12: Steve Sax, 2B -#28: Fernando Valenzuela, P -#27: Todd Worrell, P - -******************************************************************************/ - -#include "emu.h" -#include "cpu/mcs51/mcs51.h" -#include "video/pwm.h" -#include "sound/dac.h" -#include "speaker.h" - -// internal artwork -#include "talkingbb.lh" - - -namespace { - -class talkingbb_state : public driver_device -{ -public: - talkingbb_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_rom(*this, "maincpu"), - m_display(*this, "display"), - m_inputs(*this, "IN.%u", 0) - { } - - void talkingbb(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_region_ptr m_rom; - required_device m_display; - required_ioport_array<5> m_inputs; - - void main_map(address_map &map); - void main_io(address_map &map); - - u8 m_bank = 0; - u8 m_inp_mux = 0; - - // I/O handlers - void bank_w(u8 data); - u8 bank_r(offs_t offset); - void input_w(u8 data); - u8 input_r(); - u8 switch_r(); -}; - -void talkingbb_state::machine_start() -{ - // register for savestates - save_item(NAME(m_bank)); - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void talkingbb_state::bank_w(u8 data) -{ - // d0-d1: upper rom bank - // d2-d4: upper rom enable (bus conflict possible) - // d2: internal rom, d3: cart slot 1, d4: cart slot 2 - m_bank = data; -} - -u8 talkingbb_state::bank_r(offs_t offset) -{ - u32 hi = (~m_bank & 3) << 15; - u8 data = (m_bank & 4) ? 0xff : m_rom[offset | hi]; - - // TODO: cartridge - - return data; -} - -void talkingbb_state::input_w(u8 data) -{ - // no effect if P30 is low (never happens though) - if (~m_bank & 1) - return; - - // d4-d7: led select (also input mux) - // d0-d2: led data - m_inp_mux = data >> 4; - m_display->matrix(m_inp_mux, ~data & 7); -} - -u8 talkingbb_state::input_r() -{ - // open bus if P30 is low (never happens though) - if (~m_bank & 1) - return 0xff; - - u8 data = 0; - - // multiplexed inputs - for (int i = 0; i < 4; i++) - if (BIT(m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - -u8 talkingbb_state::switch_r() -{ - // d5: mode switch - return ~m_inputs[4]->read(); -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void talkingbb_state::main_map(address_map &map) -{ - map(0x0000, 0x7fff).rom().region("maincpu", 0x18000); - map(0x8000, 0xffff).r(FUNC(talkingbb_state::bank_r)); -} - -void talkingbb_state::main_io(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x7800).ram(); - map(0x8000, 0x8000).mirror(0x7fff).rw(FUNC(talkingbb_state::input_r), FUNC(talkingbb_state::input_w)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -/* keypad layout: **** P1 = Batter **** | **** P2 = Pitcher **** - | -[PINCH [1 [2] [3 [TIME OUT] | [INFIELD [1 [2 [3 [TIME OUT] - HITTER] BUNT] POWER] | IN] FAST] CURVE] CHANGE] - | -[SCORE] [4] [5 [6] [NO | [SCORE] [4 [5 [6 [NO - SQUEEZE] CANCEL] | PTCHOUT] PICKOFF] INTWALK] CANCEL] - | -[PINCH [7 [8] [9 [YES | [INSTANT [7 [8] [9 [YES - RUNNER] STEAL] X-BASE] ENTER] | REPLAY] RELIEF] SUB] ENTER] - | - [0 | [0 - SWING] | BALL] -*/ - -static INPUT_PORTS_START( talkingbb ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_R) PORT_NAME("P1 3 / Power") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F) PORT_NAME("P1 6") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_V) PORT_NAME("P1 9 / Extra Base") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_NAME("P1 Time Out") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_O) PORT_NAME("P2 3 / Change") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_L) PORT_NAME("P2 6 / Intentional Walk") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_STOP) PORT_NAME("P2 9 / Sub") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("P2 Time Out") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_E) PORT_NAME("P1 2") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_D) PORT_NAME("P1 5 / Squeeze") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_C) PORT_NAME("P1 8") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_LALT) PORT_NAME("P1 0 / Swing") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 2 / Curve") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 5 / Pickoff") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_COMMA) PORT_NAME("P2 8") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_RALT) PORT_NAME("P2 0 / Ball") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_W) PORT_NAME("P1 1 / Bunt") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_S) PORT_NAME("P1 4") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_X) PORT_NAME("P1 7 / Steal") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 1 / Fast") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 4 / Pitchout") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 7 / Relief") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Pinch Hitter") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pinch Runner") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Infield In") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Instant Replay") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") - - PORT_START("IN.4") - PORT_CONFNAME( 0x20, 0x00, "Mode" ) - PORT_CONFSETTING( 0x00, "Player" ) - PORT_CONFSETTING( 0x20, "Coach" ) -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void talkingbb_state::talkingbb(machine_config &config) -{ - /* basic machine hardware */ - I80C31(config, m_maincpu, 12_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &talkingbb_state::main_map); - m_maincpu->set_addrmap(AS_IO, &talkingbb_state::main_io); - m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); - m_maincpu->port_out_cb<3>().set(FUNC(talkingbb_state::bank_w)); - m_maincpu->port_in_cb<3>().set(FUNC(talkingbb_state::switch_r)); - - /* video hardware */ - PWM_DISPLAY(config, m_display).set_size(4, 3); - config.set_default_layout(layout_talkingbb); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( talkingbb ) - ROM_REGION( 0x20000, "maincpu", 0 ) - ROM_LOAD("sp17208-002", 0x0000, 0x20000, CRC(e0e56217) SHA1(24a06b5c94a5c750799f61e3eb865e02d6cea68a) ) // GM231000-110 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1988, talkingbb, 0, 0, talkingbb, talkingbb, talkingbb_state, empty_init, "Parker Brothers", "Starting Lineup Talking Baseball", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/talkingfb.cpp b/src/mame/misc_handheld/talkingfb.cpp deleted file mode 100644 index 46dc83b6a00..00000000000 --- a/src/mame/misc_handheld/talkingfb.cpp +++ /dev/null @@ -1,256 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Kevin Horton -/****************************************************************************** - -Parker Brothers Superstar Lineup Talking Football - -Hardware notes: -- PCB label KPT-410 REV B1 (*KPT = Kenner Parker Toys) -- 80C31 MCU @ 12MHz -- 2KB RAM, 256KB ROM, 2 cartridge slots -- two 20-button keypads - -Like Baseball, The ROM chip has (C) Tonka. -The speech driver is by Mozer, the ROM data includes employees names. - -The cartridge slots are probably meant for extra teams. I can't find anything -about it in the manual or any proof that cartridges were released for this. -Maybe the toy went out of production soon after release. - -The game includes formation cards, refer to the manual on which number is which strategy. - -TODO: -- add cartridge slots (no need if no carts exist?) -- verify keypad (everything seems ok, but "Pursue" and "Go For Turnover" might - be swapped, their function is nearly identical so it's hard to test) - -******************************************************************************/ - -#include "emu.h" -#include "cpu/mcs51/mcs51.h" -#include "sound/dac.h" -#include "speaker.h" - - -namespace { - -class talkingfb_state : public driver_device -{ -public: - talkingfb_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_rom(*this, "maincpu"), - m_inputs(*this, "IN.%u", 0) - { } - - void talkingfb(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - // devices/pointers - required_device m_maincpu; - required_region_ptr m_rom; - required_ioport_array<5> m_inputs; - - void main_map(address_map &map); - void main_io(address_map &map); - - u8 m_bank = 0; - u8 m_inp_mux = 0; - - // I/O handlers - void bank_w(u8 data); - template u8 bank_r(offs_t offset); - void input_w(u8 data); - u8 input_r(); -}; - -void talkingfb_state::machine_start() -{ - // register for savestates - save_item(NAME(m_bank)); - save_item(NAME(m_inp_mux)); -} - - - -/****************************************************************************** - I/O -******************************************************************************/ - -void talkingfb_state::bank_w(u8 data) -{ - // d0-d2: upper rom bank - // d3-d5: upper rom enable (bus conflict possible) - // d3: cart slot 1, d4: cart slot 2, d5: internal rom - m_bank = data; -} - -template -u8 talkingfb_state::bank_r(offs_t offset) -{ - u32 hi = (m_bank & 7) << 15; - u8 data = (m_bank & 0x20) ? 0xff : m_rom[offset | hi]; - - // cartridge slots are only enabled if PSEN is high - // TODO - - return data; -} - -void talkingfb_state::input_w(u8 data) -{ - // d3-d7: input mux - m_inp_mux = data >> 3; -} - -u8 talkingfb_state::input_r() -{ - u8 data = 0; - - // multiplexed inputs - for (int i = 0; i < 5; i++) - if (BIT(~m_inp_mux, i)) - data |= m_inputs[i]->read(); - - return ~data; -} - - - -/****************************************************************************** - Address Maps -******************************************************************************/ - -void talkingfb_state::main_map(address_map &map) -{ - map(0x0000, 0x7fff).rom(); - map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<0>)); -} - -void talkingfb_state::main_io(address_map &map) -{ - map(0x0000, 0x07ff).mirror(0x3800).ram(); - map(0x4000, 0x4000).mirror(0x3fff).rw(FUNC(talkingfb_state::input_r), FUNC(talkingfb_state::input_w)); - map(0x8000, 0xffff).r(FUNC(talkingfb_state::bank_r<1>)); -} - - - -/****************************************************************************** - Input Ports -******************************************************************************/ - -/* keypad layout is like this: (P1 = Home, P2 = Away, both keypads are same) - -OFFENSIVE [1 [2 [3 DEFENSIVE - ACTION HB] FB] ST] ACTION - -[SCRAM/ [SCORE] [4 [5 [6 [PURSUE] - EVADE] FL] WR] TE] - -[PASS OUT/ [TIME [7] [8 [9] [GO FOR - RUN OUT] OUT] SE] TURNOVER] - -[CHECK OFF [REPLAY] [YES/ [0 [NO/ - TO BACK] ENTER] DEMO] CANCEL] - -*/ - -static INPUT_PORTS_START( talkingfb ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("P2 Pursue") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("P2 Scram / Evade") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("P2 Pass Out / Run Out") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("P2 Check Off To Back") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("P1 Pursue") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("P1 Scram / Evade") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("P1 Pass Out / Run Out") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("P1 Check Off To Back") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("P2 Go For Turnover") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("P2 Score") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("P2 Time Out") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("P2 Replay") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("P1 Go For Turnover") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("P1 Score") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("P1 Time Out") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("P1 Replay") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P2 1 / HB") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("P2 4 / FL") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("P2 7") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("P2 Yes / Enter") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("P1 1 / HB") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("P1 4 / FL") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("P1 7") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_ENTER) PORT_NAME("P1 Yes / Enter") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("P2 2 / FB") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("P2 5 / WR") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("P2 8 / SE") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("P2 0 / Demo") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("P1 2 / FB") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("P1 5 / WR") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("P1 8 / SE") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_0) PORT_NAME("P1 0 / Demo") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("P2 3 / ST") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("P2 6 / TE") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("P2 9") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("P2 No / Cancel") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("P1 3 / ST") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("P1 6 / TE") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_9) PORT_NAME("P1 9") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("P1 No / Cancel") -INPUT_PORTS_END - - - -/****************************************************************************** - Machine Configs -******************************************************************************/ - -void talkingfb_state::talkingfb(machine_config &config) -{ - /* basic machine hardware */ - I80C31(config, m_maincpu, 12_MHz_XTAL); - m_maincpu->set_addrmap(AS_PROGRAM, &talkingfb_state::main_map); - m_maincpu->set_addrmap(AS_IO, &talkingfb_state::main_io); - m_maincpu->port_out_cb<1>().set("dac", FUNC(dac_8bit_r2r_device::write)); - m_maincpu->port_out_cb<3>().set(FUNC(talkingfb_state::bank_w)); - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); - DAC_8BIT_R2R(config, "dac").add_route(ALL_OUTPUTS, "speaker", 0.5); -} - - - -/****************************************************************************** - ROM Definitions -******************************************************************************/ - -ROM_START( talkingfb ) - ROM_REGION( 0x40000, "maincpu", 0 ) - ROM_LOAD("sp17492-001", 0x0000, 0x40000, CRC(d03851c6) SHA1(e8ac9c342bee987657c3c18f24d466b3906d6fb0) ) // Sharp LH532378 -ROM_END - -} // anonymous namespace - - - -/****************************************************************************** - Drivers -******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1989, talkingfb, 0, 0, talkingfb, talkingfb, talkingfb_state, empty_init, "Parker Brothers", "Superstar Lineup Talking Football", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/tispeak.cpp b/src/mame/misc_handheld/tispeak.cpp deleted file mode 100644 index 667647474f1..00000000000 --- a/src/mame/misc_handheld/tispeak.cpp +++ /dev/null @@ -1,1909 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap, Jonathan Gevaryahu -// thanks-to:Sean Riddle, David Viens, Kevin Horton -/*************************************************************************** - - ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** - - Texas Instruments 1st-gen. handheld speech devices. - - These devices, mostly edu-toys, are based around an MCU(TMS0270/TMS1100), - TMS51xx speech, and VSM ROM(s). Newer devices, such as Speak & Music, - are based around the TMP50C40 and belong in another driver, probably. - - note: except for tntell, MAME external artwork is not required. But it - is objectively a large improvement. - ----------------------------------------------------------------------------- - -Known devices on this hardware: (* denotes not dumped) - - -ROM (and/or source) code obtained from patents: -Some of these may have pre-release bugs. - - Speak & Spell: US4189779 - Speak & Math: US4946391 - Touch & Tell: US4403965, EP0048835A2 (patent calls it "Speak & Seek") - Language Translator: US4631748 - - -Speak & Spell: - -This is the original Speak & Spell. TI had done educational toys before, like -Wiz-A-Tron or Little Professor. But the popularity of this product was much -above expectations. TI continued to manufacture many products for this line. - - Speak & Spell (US), 1978 - - MCU: TMC0271, label TMC0271NL DBS (die label 0271B T0270B) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB TMC0351NL - - VSM(2/2): 16KB TMC0352NL - - VFD: NEC FIP8A5AR no. 3A - - notes: keyboard has buttons instead of cheap membrane - - Speak & Spell (US), 1979 - - MCU: TMC0271, label TMC0271H-N2L FDS (die label 0271H T0270D) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB TMC0351N2L - - VSM(2/2): 16KB TMC0352N2L - - notes: fixed a funny bug with gibberish-talk when Module button is pressed - with no module inserted, MCU ROM contents differs from 1978 version - - Speak & Spell (US), 1980 - - MCU: same as 1979 version - - TMS51xx: TMC0281D - - VSM: 16KB CD2350(rev.A) - - notes: only 1 VSM, meaning much smaller internal vocabulary - - Speak & Spell (Japan), 1980 - - MCU: TMC0271 (assume same as US 1979 version) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2321 - - VSM(2/2): 16KB CD2322 - - notes: no local name for the product, words are in English but very low difficulty - - Speak & Spell (UK), 1978 - - MCU: TMC0271 (assume same as US 1978 version) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2303 - - VSM(2/2): 16KB CD2304 - - notes: voice data was manually altered to give it a UK accent, - here's a small anecdote from developer: - "(...) I cannot bear to listen the product even now. I remember the - word 'butcher' took 3 days - I still don't know if it sounds right." - - Speak & Spell (UK), 1981 - - MCU: TMC0271 (assume same as US 1979 version) - - TMS51xx: CD2801 - - VSM: 16KB CD62175 - - VFD: some seen with the one from Speak & Math(!) - - notes: this one has a dedicated voice actor - - Speak & Spell (Spanish, prototype), 1981 - - MCU: CD2701N2L P (die label T0270D 2701) - - TMS51xx: TMC0281 - - VSM(1/2): 16KB CD2319 - - VSM(2/2): 16KB CD2320 - - VFD: 8 digits with 14 segments, DP and accent mark - - Speak & Spell (France) "La Dictée Magique", 1980 - - MCU: CD2702, label CD2702AN2L (die label TMC0270F 2702A) - - TMS51xx: CD2801 - - VSM: 16KB CD2352 - - Speak & Spell (Germany) "Buddy", 1980 - - MCU & TMS51xx: same as French 1980 version - - VSM(1/2): 16KB CD2345* - - VSM(2/2): 16KB CD2346* - - Speak & Spell (Italy) "Grillo Parlante", 1982 - - MCU & TMS51xx: same as French 1980 version - - VSM: 16KB CD62190 - - VFD: same as Speak & Math - - notes: it appears that TI ran out of original snspell VFDs in the early 80s? - - Speak & Spell Compact (US), 1981 - - MCU: CD8011, label CD8011A-NL (die label 1100B) - - TMS51xx: TMC0281D - - VSM: 16KB CD2354, CD2354(rev.A) - - notes: no display, MCU is TMS1100 instead of TMS0270, overall similar to Touch & Tell - - Speak & Spell Compact (UK) "Speak & Write", 1981 - - MCU: same as US 1981 version - - TMS51xx: CD2801A - - VSM: 16KB CD62174(rev.A) - - notes: BTANB: gibberish when the module button is pressed (with module present), - anecdotes from the developer, the same person working on the original UK version: - "We included a pencil and writing pad - it was now about 'writing'.", - and one about the welcome message: - "I had to manually create a sentence of digital speech from thin air. - I had to write down a 20 character code which would create each 10/s - sound bite that made up the phrase "Welcome to Speak and Write". - It took me 1 week. (...) Even Larry Brantingham was amazed." - -Speak & Spell modules: -Note that they are interchangeable, eg. you can use a French module on a US Speak & Spell. - - English: - - Vowel Power: VSM: 16KB CD2302 - - Number Stumpers 4-6: VSM: 16KB CD2305 - - Number Stumpers 7-8: VSM: 16KB CD2307(rev.A) - - Basic Builders: VSM: 16KB CD2308 - - Mighty Verbs: VSM: 16KB CD2309(rev.B) - - Homonym Heroes: VSM: 16KB CD2310 - - Vowel Ventures: VSM: 16KB CD2347(rev.C) - - Noun Endings: VSM: 16KB CD2348 - - Magnificent Modifiers: VSM: 16KB CD2349 - - E.T. Fantasy: VSM: 16KB CD2360 - - French: - - No.1: Les Mots de Base: VSM: 16KB CD2353 (1st release was called "Module No. 1 de Jacques Capelovici") - - No.2: Les Mots Difficiles (aka Les Mots de Base): VSM: 16KB CD62177A - - No.3: Les Animaux Familiers: VSM: 16KB? CD62047* - - No.4: Les Magasins de la Rue: VSM: 16KB CD62048 - - No.5: Les Extra-Terrestres: VSM: 16KB? CD62178* - - Italian: - - Super Modulo: VSM: 16KB? CD62313* - - -Speak & Math: - - Speak & Math (US), 1980 (renamed to "Speak & Maths" in UK, but is the same product) - - MCU: CD2704, label CD2704B-N2L (die label TMC0270F 2704B) - 2nd revision?(mid-1982) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2392 - - VSM(2/2): 16KB CD2393 - - VFD: Futaba 9SY -02Z 7E - - notes: As with the Speak & Spell, the voice actor was a radio announcer. - However, the phrase "is greater than or less than" had to be added by one - of the TI employees in a hurry, the day before a demo. Apparently QA - never found out and it ended up in the final product. - - Speak & Math (US), 1986 - - MCU: CD2708, label CD2708N2L (die label TMC0270F 2708A) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2381 - - VSM(2/2): 4KB CD2614 - - Speak & Math 'Compact' (France) "Les Maths Magiques", 1986? - - MCU: CP3447-NL* (TMS1100?) - - TMS51xx: CD2801 - - VSM: 16KB? CD62173* - - notes: this is not the same as "Le Calcul Magique", that's from a - series centered around a TMS50C40 instead of MCU+TMS51xx - - -Speak & Read: - - Speak & Read (US), 1980 - - MCU: CD2705, label CD2705B-N2L (die label TMC0270E 2705B) - 2nd revision?(late-1981) - - TMS51xx: CD2801 - - VSM(1/2): 16KB CD2394(rev.A) - - VSM(2/2): 16KB CD2395(rev.A) - - VFD: same as Language Tutor, rightmost digit unused - -Speak & Read modules: - - English: - - Sea Sights: VSM: 16KB CD2396(rev.A) - - Who's Who at the Zoo: VSM: 16KB CD2397 - - A Dog on a Log: VSM: 16KB CD3534(rev.A) - - The Seal That Could Fly: VSM: 16KB CD3535 - - A Ghost in the House: VSM: 16KB CD3536 - - On the Track: VSM: 16KB CD3538 - - The Third Circle: VSM: 16KB CD3539 - - The Millionth Knight: VSM: 16KB CD3540 - - -Touch & Tell: - - Touch & Tell (US), 1981 - - MCU: CD8012, label CD8012NL (die label 1100G CD8012) - - TMS51xx: CD2802 - - VSM: 4KB CD2610 - - notes: MCU is TMS1100 instead of TMS0270. CD8010 is seen in some devices - too, maybe an earlier version? - - Touch & Tell (UK), 1981 - - MCU & TMS51xx: same as US version - - VSM: 16KB CD62170 - - Touch & Tell (France) "Le Livre Magique", 1981 - - MCU & TMS51xx: same as US version - - VSM: 16KB CD62171 - - Touch & Tell (Germany) "Tipp & Sprich", 1981 - - MCU & TMS51xx: same as US version - - VSM: ?KB CD62172* - - Touch & Tell (Italy) "Libro Parlante", 1982 - - MCU & TMS51xx: same as US version - - VSM: ?KB CD62176* - - Vocaid (US), 1982 - - MCU & TMS51xx: same as Touch & Tell (US) - - VSM: 16KB CD2357 - - notes: MCU is the same as in Touch & Tell, but instead of a toddler's toy, - you get a serious medical aid device for the voice-impaired. The PCB is - identical, it includes the edge connector for modules but no external slot. - -Touch & Tell modules: - - English: - - Alphabet Fun: VSM: 4KB CD2611 - - Animal Friends: VSM: 16KB CD2355 - - Number Fun: VSM: 4KB CD2612*, CD2612(rev.A) - - All About Me: VSM: 4KB CD2613 - - World of Transportation: VSM: 16KB CD2361 - - Little Creatures: VSM: 16KB CD2362 - - E.T.: VSM: 16KB CD2363 - -Touch & Tell/Vocaid overlay reference: - - tntell CD2610: - - $04: a - Colors - - $01: b - Objects - - $05: c - Shapes - - $09: d - Home Scene - tntelluk CD62170, tntellfr CD62171: - - see tntell - - see numfun(not A) - - see animalfr - - $08: ? - Clown Face - - $0B: ? - Body Parts - vocaid CD2357: - - $1C: 1 - Leisure - - $1E: 2 - Telephone - - $1B: 3 - Bedside - - $1D: 4 - Alphabet - alphabet CD2611: - - $0E: 1a - Alphabet A-M - - $0D: 1b - Alphabet N-Z - - $0C: 1c - Letter Jumble A-M - - $0B: 1d - Letter Jumble N-Z - animalfr CD2355: - - $0A: 2a - Farm Animals - - $0F: 2b - At The Farm - - $0E: 2c - Animal Babies - - $0D: 2d - In The Jungle - numfun CD2612: - - $02/$0A(rev.A): 3a - Numbers 1-10 - - $03/$0F(rev.A): 3b - Numbers 11-30 - - $07/$0D(rev.A): 3c - How Many? - - $06/$0E(rev.A): 3d - Hidden Numbers - aboutme CD2613: - - $0E: 4a - Clown Face - - $0B: 4b - Body Parts - - $0D: 4c - Things to Wear - - $0C: 4d - Just For Me - wot CD2361: - - $0A: 5a - On Land - - $0B: 5b - In The Air - - $0C: 5c - On The Water - - $0D: 5d - In Space - - $10: 5e - What Belongs Here? - - $11: 5f - How It Used To Be - - $12: 5g - Word Fun - - $13: 5h - In the Surprise Garage - lilcreat CD2362: - - $14: 6a - In The Park - - $15: 6b - In The Sea - - $16: 6c - In The Woods - - $17: 6d - Whose House? - - $18: 6e - Hide & Seek - - $1A: 6f - Who Is It? - - $19: 6g - But It's Not - - $1B: 6h - Word Fun - et CD2363: - - $0F: 7a - The Adventure On Earth I - - $10: 7b - The Adventure On Earth II - - $11: 7c - Fun And Friendship I - - $12: 7d - Fun And Friendship II - - $13: 7e - E.T. The Star I - - $14: 7f - E.T. The Star II - - $15: 7g - Do You Remember? I - - $16: 7h - Do You Remember? II - - $00: none inserted, and $1F is for diagnostics - - -Magic Wand "Speaking Reader" or "Speak & Learn": - -Limited release barcode reader text-to-speech device, meant for children. -The text is coded as phonemes. Books were sold separately. - - Magic Wand "Speaking Reader" (US), 1982 - - MCU: C14007* (TMS1400?) - - TMS5220 - - VSM: 4KB? CD2228* - - Magic Wand "Speak & Learn" (US), 1983 - - notes: same hardware - - -Language Tutor/Translator: - -A later device, called Language Teacher, was released without speech hardware. - - Language Tutor (US), 1978 - - MCU: TMC0275* - - TMS51xx: CD2801 - - VFD: NEC FIP10xxx? - - notes: external module is required (see below) - -Language Tutor modules: - - - Ingles(1/4): VSM: 16KB CD2311 - - Ingles(2/4): VSM: 16KB CD2312 - - Ingles(3/4): VSM: 16KB CD2313 - - Ingles(4/4): VSM: 16KB CD2314 - - - Spanish(1/4): VSM: 16KB CD2315 - - Spanish(2/4): VSM: 16KB CD2316 - - Spanish(3/4): VSM: 16KB CD2317 - - Spanish(4/4): VSM: 16KB CD2318 - - - French(1/4): VSM: 16KB CD2327 - - French(2/4): VSM: 16KB CD2328 - - French(3/4): VSM: 16KB CD2329 - - French(4/4): VSM: 16KB CD2330 - - - German(1/4): VSM: 16KB CD2331 - - German(2/4): VSM: 16KB CD2332 - - German(3/4): VSM: 16KB CD2333 - - German(4/4): VSM: 16KB CD2334 - - - English(1/4): VSM: 16KB CD3526 - - English(2/4): VSM: 16KB CD3527 - - English(3/4): VSM: 16KB CD3528 - - English(4/4): VSM: 16KB CD3529 - - -Other manufacturers: - -Tiger Electronics K28 (model 7-232) Sold in Hong Kong, distributed in US as: -- Coleco: Talking Teacher -- Sears: Talkatron - Learning Computer - -1981 K28 models 7-230 and 7-231 are on different hardware, showing a different -keyboard, VFD display, and use the SC-01 speech chip. --> driver k28.cpp - - K28 model 7-232 (HK), 1985 - - MCU: TMS1400 MP7324 - - TMS51xx: TMS5110A - - VSM: 16KB CM62084 - - LCD: SMOS SMC1112 MCU to 8*14-seg display - -K28 modules: - - - Spelling I: VSM: 16KB CM62086 - - Spelling II: VSM: 16KB CM62085? - - Spelling III: VSM: 16KB CM62087 - - Expansion Module 1: VSM: 16KB CM62214? - assumed same VSM as CM62086 - - Expansion Module 2: VSM: 16KB CM62216 - assumed same VSM as the one in Spelling II - - Expansion Module 3: VSM: 16KB CM62215 - same VSM as CM62087 - - Expansion Module 4: VSM: 16KB CM62217 - - Expansion Module 5: VSM: 16KB CM62218* - - Expansion Module 6: VSM: 16KB CM62219 - - note: these won't work on the 1981 version(s) - ----------------------------------------------------------------------------- - - TODO: - - why doesn't lantutor work? - - emulate k28 LCD - - emulate other known devices - - -Dick Smith catalog numbers, taken from advertisements: - -X-1300, Y-1300 : T.I. Speak & Spell -X-1301 : Super Stumper 1 (for Speak & Spell) -X-1302 : Super Stumper 2 (for Speak & Spell) -X-1305 : Vowell Power (for Speak & Spell) -Y-1310 : T.I. Speak & Math -Y-1313 : T.I. Speak & Read -Y-1320 : T.I. Dataman - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "bus/generic/carts.h" -#include "bus/generic/slot.h" -#include "machine/timer.h" -#include "machine/tms6100.h" -#include "sound/tms5110.h" -#include "softlist_dev.h" -#include "speaker.h" -#include "render.h" - -// internal artwork -#include "k28m2.lh" -#include "snmath.lh" -#include "snread.lh" -#include "snspell.lh" -#include "snspellsp.lh" -#include "tntell.lh" // keyboard overlay - -namespace { - -// The master clock is a single stage RC oscillator into TMS5100 RCOSC: -// In an early 1979 Speak & Spell, C is 68pf, R is a 50kohm trimpot which is set to around 33.6kohm -// (measured in-circuit). CPUCLK is this osc freq /2, ROMCLK is this osc freq /4. -// The typical osc freq curve for TMS5100 is unknown. Let's assume it is set to the default frequency, -// which is 640kHz for 8KHz according to the TMS5100 documentation. - -#define MASTER_CLOCK 640000 - - -class tispeak_state : public hh_tms1k_state -{ -public: - tispeak_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_tms5100(*this, "tms5100"), - m_tms6100(*this, "tms6100"), - m_cart(*this, "cartslot"), - m_ol_out(*this, "ol%u", 1U) - { } - - void init_snspell(); - void init_tntell(); - void init_lantutor(); - - // machine configs - void tms5110_route(machine_config &config); - void sns_tmc0281(machine_config &config); - void sns_tmc0281d(machine_config &config); - void sns_cd2801(machine_config &config); - void snspellit(machine_config &config); - void snspellsp(machine_config &config); - void snspellc(machine_config &config); - void snspellcuk(machine_config &config); - void snmath(machine_config &config); - void snread(machine_config &config); - void tntell(machine_config &config); - void vocaid(machine_config &config); - void lantutor(machine_config &config); - void k28m2(machine_config &config); - -private: - virtual void power_off() override; - void update_display(); - - u8 snspell_read_k(); - void snmath_write_o(u16 data); - void snspell_write_o(u16 data); - void snspell_write_r(u16 data); - void lantutor_write_r(u16 data); - - u8 snspellc_read_k(); - void snspellc_write_o(u16 data); - void snspellc_write_r(u16 data); - u8 tntell_read_k(); - - void k28_update_display(u8 old, u8 data); - u8 k28_read_k(); - void k28_write_o(u16 data); - void k28_write_r(u16 data); - - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); - - u8 tntell_get_hexchar(const char c); - TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay); - - void init_cartridge(); - - virtual void machine_start() override; - - // devices - required_device m_tms5100; - required_device m_tms6100; - optional_device m_cart; - - output_finder<5> m_ol_out; - - // cartridge - u32 m_cart_max_size = 0; - u8 *m_cart_base = nullptr; - - u8 m_overlay = 0; -}; - -void tispeak_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - m_ol_out.resolve(); - init_cartridge(); -} - - - -/*************************************************************************** - - Cartridge Handling - -***************************************************************************/ - -void tispeak_state::init_cartridge() -{ - if (m_cart != nullptr && m_cart->exists()) - { - std::string region_tag; - memory_region *src = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); - if (src) - memcpy(m_cart_base, src->base(), src->bytes()); - } -} - -DEVICE_IMAGE_LOAD_MEMBER(tispeak_state::cart_load) -{ - u32 size = m_cart->common_get_size("rom"); - - if (size > m_cart_max_size) - { - image.seterror(image_error::INVALIDIMAGE, "Invalid file size"); - return image_init_result::FAIL; - } - - m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE); - m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); - - return image_init_result::PASS; -} - - -void tispeak_state::init_snspell() -{ - m_cart_max_size = 0x4000; - m_cart_base = memregion("tms6100")->base() + 0x8000; -} - -void tispeak_state::init_tntell() -{ - m_cart_max_size = 0x4000; - m_cart_base = memregion("tms6100")->base() + 0x4000; -} - -void tispeak_state::init_lantutor() -{ - m_cart_max_size = 0x10000; - m_cart_base = memregion("tms6100")->base(); -} - - - -/*************************************************************************** - - I/O - -***************************************************************************/ - -// common/snspell - -void tispeak_state::power_off() -{ - hh_tms1k_state::power_off(); - m_tms5100->reset(); -} - -void tispeak_state::update_display() -{ - u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; - m_display->matrix(m_grid & gridmask, m_plate); -} - -void tispeak_state::snspell_write_r(u16 data) -{ - // R13: power-off request, on falling edge - if (~data & m_r & 0x2000) - power_off(); - - // R0-R7: input mux and select digit (+R8 if the device has 9 digits) - // R15: filament on - // other bits: MCU internal use - m_r = m_inp_mux = data; - m_grid = data & 0x81ff; - update_display(); -} - -void tispeak_state::snspell_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and AP as d15: - // note: lantutor and snread VFD has an accent triangle instead of DP, and no AP - // E,D,C,G,B,A,I,M,L,K,N,J,[AP],H,F,[DP] (sidenote: TI KLMN = MAME MLNK) - m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); - update_display(); -} - -u8 tispeak_state::snspell_read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[8]->read() | read_inputs(8); -} - - -// snmath specific - -void tispeak_state::snmath_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and CT as d15: - // [DP],D,C,H,F,B,I,M,L,K,N,J,[CT],E,G,A (sidenote: TI KLMN = MAME MLNK) - m_plate = bitswap<16>(data,12,0,10,7,8,9,11,6,3,14,4,13,1,2,5,15); - update_display(); -} - - -// lantutor specific - -void tispeak_state::lantutor_write_r(u16 data) -{ - // same as default, except R13 is used for an extra digit - m_r = m_inp_mux = data; - m_grid = data & 0xa1ff; - update_display(); -} - - -// snspellc specific - -void tispeak_state::snspellc_write_r(u16 data) -{ - // R10: TMS5100 PDC pin - m_tms5100->pdc_w(data >> 10 & 1); - - // R9: power-off request, on falling edge - if (~data & m_r & 0x200) - power_off(); - - // R0-R8: input mux - m_r = m_inp_mux = data; -} - -void tispeak_state::snspellc_write_o(u16 data) -{ - // O3210: TMS5100 CTL8124 - m_tms5100->ctl_w(bitswap<4>(data,3,0,1,2)); - m_o = data; -} - -u8 tispeak_state::snspellc_read_k() -{ - // K4: TMS5100 CTL1 - u8 k4 = m_tms5100->ctl_r() << 2 & 4; - - // K: multiplexed inputs (note: the Vss row is always on) - return k4 | m_inputs[9]->read() | read_inputs(9); -} - - -// tntell specific - -u8 tispeak_state::tntell_read_k() -{ - // K8: overlay code from R5,O4-O7 - u8 k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0; - - // rest is same as snpellc - return k8 | snspellc_read_k(); -} - -u8 tispeak_state::tntell_get_hexchar(const char c) -{ - if (c >= '0' && c <= '9') return c - '0'; - if (c >= 'A' && c <= 'F') return c - 'A' + 10; - if (c >= 'a' && c <= 'f') return c - 'a' + 10; - - return 0; -} - -TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay) -{ - // Each keyboard overlay insert has 5 holes, used by the game to determine - // which one is active(if any). If it matches with the internal ROM or - // external module, the game continues. - - // pick overlay code from machine config, see comment section above for reference - m_overlay = m_inputs[10]->read(); - - // try to get it from (external) layout - if (m_overlay == 0x20) - { - // as output value, eg. with defstate (in decimal) - m_overlay = output().get_value("overlay_code") & 0x1f; - - // and from current view name ($ + 2 hex digits) - render_target *target = machine().render().first_target(); - const char *name = target->view_name(target->view()); - - for (int i = 0; name && i < strlen(name); i++) - if (name[i] == '$' && strlen(&name[i]) > 2) - m_overlay = (tntell_get_hexchar(name[i + 1]) << 4 | tntell_get_hexchar(name[i + 2])) & 0x1f; - } - - // overlay holes - for (int i = 0; i < 5; i++) - m_ol_out[i] = BIT(m_overlay, i); -} - - -// k28 specific - -void tispeak_state::k28_update_display(u8 old, u8 data) -{ - // ? -} - -void tispeak_state::k28_write_r(u16 data) -{ - // R1234: TMS5100 CTL8421 - u16 r = bitswap<5>(data,0,1,2,3,4) | (data & ~0x1f); - m_tms5100->ctl_w(r & 0xf); - - // R0: TMS5100 PDC pin - m_tms5100->pdc_w(data & 1); - - // R5: input mux high bit - m_inp_mux = (m_inp_mux & 0xff) | (data << 3 & 0x100); - - // R6: power-off request, on falling edge - if (~data & m_r & 0x40) - power_off(); - - // R7-R10: LCD data - k28_update_display(m_r >> 7 & 0xf, data >> 7 & 0xf); - m_r = r; -} - -void tispeak_state::k28_write_o(u16 data) -{ - // O0-O7: input mux low - m_inp_mux = (m_inp_mux & ~0xff) | data; -} - -u8 tispeak_state::k28_read_k() -{ - // K: TMS5100 CTL, multiplexed inputs (also tied to R1234) - return m_tms5100->ctl_r() | read_inputs(9) | (m_r & 0xf); -} - - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - -static INPUT_PORTS_START( snspell ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module Select") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Clue") - - PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mystery Word") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Secret Code") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Say It") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellfr ) // French button names - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module 2") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Efface") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Essaie") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME(u8"Arrét") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME(u8"Départ") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Rejoue") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repete") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aide") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Mot Mystere") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Code Secret") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Lettre") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Dis-le") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Epelle/Marche") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellit ) // Italian button names - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Moduli") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Cancella") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Controllo") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Stop") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Via") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Ritorno") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Replica") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Aiuto") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Indovina") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Codice") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Alfabeto") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Ripeti") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Scrivi") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellsp ) // Spanish button names, different alphabet - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("CH") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("LL") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME(u8"Ñ") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("RR") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Entra") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_NAME("Acento") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Listo") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Programa") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Borra") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Repite") - - PORT_START("IN.8") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Otra Vez") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Palabra Secreta") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Dilo") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Deletrea/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - - -static INPUT_PORTS_START( snmath ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME(".") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("<") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME(">") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Repeat") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("+") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("-") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME(u8"×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME(u8"÷") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Mix It") - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Number Stumper") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Write It") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Greater/Less") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Word Problems") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_F1) PORT_NAME("Solve It/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - - PORT_START("IN.7") - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.8") - PORT_BIT( 0x1f, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( snread ) - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.7") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Word Zapper") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Word Maker") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Read It") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("Picture Read") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("Letter Stumper") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("Hear It") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_F1) PORT_NAME("Word Zap/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) -INPUT_PORTS_END - - -static INPUT_PORTS_START( lantutor ) - PORT_INCLUDE( snspell ) - - PORT_MODIFY("IN.5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Diacritical") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Space") - - PORT_MODIFY("IN.6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_NAME("1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("3") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("4") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("5") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_NAME("6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_NAME("7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_NAME("8") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_NAME("9") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("0") - - PORT_MODIFY("IN.8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("Translate") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("Learn") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("Phrase") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Link") - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("Repeat") -INPUT_PORTS_END - - -static INPUT_PORTS_START( snspellc ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Stumper") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Review") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Repeat") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_NAME("Module") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - - PORT_START("IN.9") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Spell/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off -INPUT_PORTS_END - -static INPUT_PORTS_START( snspellcuk ) - PORT_INCLUDE( snspellc ) - - PORT_MODIFY("IN.9") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_F1) PORT_NAME("Write/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) // just the label changed from Spell to Write -INPUT_PORTS_END - - -static INPUT_PORTS_START( tntell ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Grid 1-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Grid 1-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Grid 1-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Grid 1-3") - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Grid 2-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Grid 2-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Grid 2-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Grid 2-3") - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Grid 3-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Grid 3-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Grid 3-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("Grid 3-3") - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Grid 4-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Grid 4-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Grid 4-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Grid 4-3") - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_NAME("Grid 5-1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_NAME("Grid 5-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Grid 5-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Grid 5-3") - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("Grid 5-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("Grid 6-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("Grid 5-5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) // overlay code - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Grid 3-5") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Grid 2-5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Grid 4-5") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("Grid 1-5") - - PORT_START("IN.7") // R7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("Grid 3-6") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Grid 2-6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("Grid 4-6") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_NAME("Grid 1-6") - - PORT_START("IN.8") // R8 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_F2) PORT_NAME("Grid 6-1 (Off)") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("Grid 6-2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Grid 6-4") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("Grid 6-3") - - PORT_START("IN.9") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_F1) PORT_NAME("Grid 6-6 (On)") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) // speech chip data - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.10") - PORT_CONFNAME( 0x3f, 0x20, "Overlay Code" ) - PORT_CONFSETTING( 0x20, "From Artwork View" ) - PORT_CONFSETTING( 0x00, "$00 (None)" ) - PORT_CONFSETTING( 0x01, "$01" ) - PORT_CONFSETTING( 0x02, "$02" ) - PORT_CONFSETTING( 0x03, "$03" ) - PORT_CONFSETTING( 0x04, "$04" ) - PORT_CONFSETTING( 0x05, "$05" ) - PORT_CONFSETTING( 0x06, "$06" ) - PORT_CONFSETTING( 0x07, "$07" ) - PORT_CONFSETTING( 0x08, "$08" ) - PORT_CONFSETTING( 0x09, "$09" ) - PORT_CONFSETTING( 0x0a, "$0A" ) - PORT_CONFSETTING( 0x0b, "$0B" ) - PORT_CONFSETTING( 0x0c, "$0C" ) - PORT_CONFSETTING( 0x0d, "$0D" ) - PORT_CONFSETTING( 0x0e, "$0E" ) - PORT_CONFSETTING( 0x0f, "$0F" ) - PORT_CONFSETTING( 0x10, "$10" ) - PORT_CONFSETTING( 0x11, "$11" ) - PORT_CONFSETTING( 0x12, "$12" ) - PORT_CONFSETTING( 0x13, "$13" ) - PORT_CONFSETTING( 0x14, "$14" ) - PORT_CONFSETTING( 0x15, "$15" ) - PORT_CONFSETTING( 0x16, "$16" ) - PORT_CONFSETTING( 0x17, "$17" ) - PORT_CONFSETTING( 0x18, "$18" ) - PORT_CONFSETTING( 0x19, "$19" ) - PORT_CONFSETTING( 0x1a, "$1A" ) - PORT_CONFSETTING( 0x1b, "$1B" ) - PORT_CONFSETTING( 0x1c, "$1C" ) - PORT_CONFSETTING( 0x1d, "$1D" ) - PORT_CONFSETTING( 0x1e, "$1E" ) - PORT_CONFSETTING( 0x1f, "$1F (Diagnostic)" ) -INPUT_PORTS_END - - -static INPUT_PORTS_START( k28m2 ) - PORT_START("IN.0") // O0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('A') PORT_NAME("A/1") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('J') PORT_NAME("J/0") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - - PORT_START("IN.1") // O1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_NAME("On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispeak_state, power_button, true) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('B') PORT_NAME("B/2") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('K') PORT_NAME("K/+") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - - PORT_START("IN.2") // O2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Repeat") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('C') PORT_NAME("C/3") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('L') PORT_NAME("L/-") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.3") // O3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Prompt") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('D') PORT_NAME("D/4") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('M') PORT_NAME(u8"M/×") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - - PORT_START("IN.4") // O4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("Menu") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('E') PORT_NAME("E/5") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('N') PORT_NAME(u8"N/÷") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - - PORT_START("IN.5") // O5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_END) PORT_NAME("Module") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('F') PORT_NAME("F/6") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - - PORT_START("IN.6") // O6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Select") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('G') PORT_NAME("G/7") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - - PORT_START("IN.7") // O7 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Clear") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('H') PORT_NAME("H/8") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.8") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('I') PORT_NAME("I/9") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter") -INPUT_PORTS_END - - - -/*************************************************************************** - - Machine Config - -***************************************************************************/ - -void tispeak_state::tms5110_route(machine_config &config) -{ - // sound hardware - m_tms5100->m0().set(m_tms6100, FUNC(tms6100_device::m0_w)); - m_tms5100->m1().set(m_tms6100, FUNC(tms6100_device::m1_w)); - m_tms5100->addr().set(m_tms6100, FUNC(tms6100_device::add_w)); - m_tms5100->data().set(m_tms6100, FUNC(tms6100_device::data_line_r)); - m_tms5100->romclk().set(m_tms6100, FUNC(tms6100_device::clk_w)); - m_tms5100->add_route(ALL_OUTPUTS, "mono", 0.5); -} - -void tispeak_state::snmath(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r)); - - m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r)); - m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w)); - m_maincpu->write_pdc().set("tms5100", FUNC(tms5110_device::pdc_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0x21ff, 0x3fff); - config.set_default_layout(layout_snmath); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - CD2801(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - - -void tispeak_state::sns_cd2801(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - - config.set_default_layout(layout_snspell); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snspell"); -} - -void tispeak_state::snspellit(machine_config &config) -{ - sns_cd2801(config); - - // basic machine hardware - config.set_default_layout(layout_snmath); -} - -void tispeak_state::sns_tmc0281(machine_config &config) -{ - sns_cd2801(config); - - // sound hardware - TMC0281(config.replace(), m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - -void tispeak_state::snspellsp(machine_config &config) -{ - sns_tmc0281(config); - - // basic machine hardware - config.set_default_layout(layout_snspellsp); -} - -void tispeak_state::sns_tmc0281d(machine_config &config) -{ - sns_cd2801(config); - - // sound hardware - TMC0281D(config.replace(), m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - - -void tispeak_state::snread(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - - config.set_default_layout(layout_snread); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snread", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snread"); -} - - -void tispeak_state::lantutor(machine_config &config) -{ - snmath(config); - - // basic machine hardware - m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::lantutor_write_r)); - - config.set_default_layout(layout_snread); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "lantutor", "vsm,bin"); - m_cart->set_must_be_loaded(true); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("lantutor"); -} - - -void tispeak_state::snspellc(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::snspellc_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); - - // no visual feedback! - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - TMC0281D(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "snspell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("snspell"); -} - -void tispeak_state::snspellcuk(machine_config &config) -{ - snspellc(config); - - // sound hardware - CD2801(config.replace(), m_tms5100, MASTER_CLOCK); // CD2801A! - tms5110_route(config); -} - - -void tispeak_state::vocaid(machine_config &config) -{ - // basic machine hardware - TMS1100(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::tntell_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); - - TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50)); - config.set_default_layout(layout_tntell); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - CD2802(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); -} - -void tispeak_state::tntell(machine_config &config) -{ - vocaid(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "tntell", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("tntell"); -} - - -void tispeak_state::k28m2(machine_config &config) -{ - // basic machine hardware - TMS1400(config, m_maincpu, MASTER_CLOCK/2); - m_maincpu->k().set(FUNC(tispeak_state::k28_read_k)); - m_maincpu->o().set(FUNC(tispeak_state::k28_write_o)); - m_maincpu->r().set(FUNC(tispeak_state::k28_write_r)); - - config.set_default_layout(layout_k28m2); - - // sound hardware - TMS6100(config, m_tms6100, MASTER_CLOCK/4); - - SPEAKER(config, "mono").front_center(); - TMS5110A(config, m_tms5100, MASTER_CLOCK); - tms5110_route(config); - - // cartridge - GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "k28m2", "vsm"); - m_cart->set_device_load(FUNC(tispeak_state::cart_load)); - - SOFTWARE_LIST(config, "cart_list").set_original("k28m2"); -} - - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( snspell ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351n2l.vsm", 0x0000, 0x4000, CRC(2d03b292) SHA1(a3e9a365307ae936c7472f720a7a8240741531d6) ) - ROM_LOAD( "tmc0352n2l.vsm", 0x4000, 0x4000, CRC(a6d56883) SHA1(eebf9c07f2f9001679dec06c2367d4a50596d04b) ) -ROM_END - -ROM_START( snspellp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "us4189779_tmc0271", 0x0000, 0x1000, CRC(d3f5a37d) SHA1(f75ab617a6067d4d3a954a9f86126d2089554df8) ) // typed in from patent US4189779, verified by 2 sources - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // " -ROM_END - -ROM_START( snspellua ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) - ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) -ROM_END - -ROM_START( snspellub ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2350a.vsm", 0x0000, 0x4000, CRC(2adda742) SHA1(3f868ed8284b723c815a30343057e03467c043b5) ) -ROM_END - -ROM_START( snspelluk ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271nl_dbs", 0x0000, 0x1000, CRC(c2a7b747) SHA1(05f3716cd3cc33b8dc897e75301efdd531932ec5) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2303.vsm", 0x0000, 0x4000, CRC(0fae755c) SHA1(b68c3120a63a61db474feb5d71a6e5dd67910d80) ) - ROM_LOAD( "cd2304.vsm", 0x4000, 0x4000, CRC(e2a270eb) SHA1(c13c95ad15f1923a4841f66504e0f22646e71d99) ) -ROM_END - -ROM_START( snspelluka ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62175.vsm", 0x0000, 0x4000, CRC(6e1063d4) SHA1(b5c66c51148c5921ecb8ffccd7a460ae639cdb68) ) -ROM_END - -ROM_START( snspelljp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0271h-n2l_fds", 0x0000, 0x1000, CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270d_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2321.vsm", 0x0000, 0x4000, CRC(ac010cce) SHA1(c0200d857b62be696248ac2d684a390c66ab0c31) ) - ROM_LOAD( "cd2322.vsm", 0x4000, 0x4000, CRC(b6f4bba4) SHA1(65d686a9385b5ef3f080a5f47c6b2418bb9455b0) ) -ROM_END - -ROM_START( snspellsp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2701n2l_p", 0x0000, 0x1000, CRC(5230612a) SHA1(3ec75b207380af2efe84e865fe83ea29e79e8eea) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2701_output.pla", 0, 1246, CRC(f26980bd) SHA1(8d0c98fe5240541cb53c1e1d14c2a4560e7a7f32) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2319.vsm", 0x0000, 0x4000, CRC(f293ac2f) SHA1(6f941743efcc2f05e514ce07167c094c554dca5d) ) - ROM_LOAD( "cd2320.vsm", 0x4000, 0x4000, CRC(16b68766) SHA1(a9ea335b4487cc333268bfd2e71428258968461d) ) -ROM_END - -ROM_START( snspellfr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) ) -ROM_END - -ROM_START( snspellit ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) ) -ROM_END - - -ROM_START( snspellc ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354.vsm", 0x0000, 0x4000, CRC(3af3232e) SHA1(f89d90dca209ee612634d664d5d4562f1d1786cf) ) -ROM_END - -ROM_START( snspellca ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2354a.vsm", 0x0000, 0x4000, CRC(548a940c) SHA1(c37e620c4c70a05cbaaff9a166c6da2e2420196f) ) -ROM_END - -ROM_START( snspellcuk ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8011a-nl", 0x0000, 0x0800, CRC(8a82a467) SHA1(fa4f8a232392603721bd8136c141a340fd5936a0) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8011_micro.pla", 0, 867, CRC(bbb64ddc) SHA1(602cd5eef897c9115c12db7367c5654ab2297fa1) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8011_output.pla", 0, 365, CRC(b400dd75) SHA1(5a4b5d4532a8932cf4b469ddb71ad6b3b9911672) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd62174a.vsm", 0x0000, 0x4000, CRC(b7bbaaf3) SHA1(9eb949fcf522982f9c3c4649f207703b746b90ef) ) -ROM_END - - -ROM_START( snmath ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2704b-n2l", 0x0000, 0x1000, CRC(7e06c7c5) SHA1(d60a35a8163ab593c31afc840a0d8a9b3a762f29) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) -ROM_END - -ROM_START( snmatha ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2708-n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2381.vsm", 0x0000, 0x4000, CRC(f048dc81) SHA1(e97667d1002de40ab3d702c63b82311480032e0f) ) - ROM_LOAD( "cd2614.vsm", 0x4000, 0x1000, CRC(11989074) SHA1(0e9cf906de9bcdf4acb425535dc442846fc48fa2) ) - ROM_RELOAD( 0x5000, 0x1000 ) - ROM_RELOAD( 0x6000, 0x1000 ) - ROM_RELOAD( 0x7000, 0x1000 ) -ROM_END - -ROM_START( snmathp ) - ROM_REGION( 0x1000, "maincpu", 0 ) - // typed in from patent 4946391, verified with source code - // BTANB note: Mix It does not work at all, this is an original bug in the patent listing. There are probably other minor bugs too. - ROM_LOAD( "us4946391_t2074", 0x0000, 0x1000, CRC(011f0c2d) SHA1(d2e14d72e03ca864abd51da78ffb71a9da82f624) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) - ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version - ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // " -ROM_END - - -ROM_START( snread ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "cd2705b-n2l", 0x0000, 0x1000, CRC(c235636e) SHA1(57b24dd8414bf76ec786a51d10cb8a5898b60e18) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_cd2705_output.pla", 0, 1246, CRC(bf859848) SHA1(66b297fbf534968fa6db7413b99ef0e81cc35ddc) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge - ROM_LOAD( "cd2394a.vsm", 0x0000, 0x4000, CRC(cbb0e2b1) SHA1(5e322c683baf806523de171310258ae371671327) ) - ROM_LOAD( "cd2395a.vsm", 0x4000, 0x4000, CRC(3d519504) SHA1(76b19ba5a9a3486005e09c98e8a6abc8b88288dd) ) -ROM_END - - -ROM_START( lantutor ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "us4631748_tmc0275", 0x0000, 0x1000, CRC(22818845) SHA1(1a84f15fb18ca66b1f2bf7491d76fbc56068984d) ) // extracted visually from patent US4631748, verified with source code - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // not verified - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_t0270b_output.pla", 0, 1246, BAD_DUMP CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // taken from snspell, mostly looks correct - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // cartridge area -ROM_END - - -ROM_START( tntell ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) -ROM_END - -ROM_START( tntelluk ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62170.vsm", 0x0000, 0x4000, CRC(6dc9d072) SHA1(9d2c9ff57c4f8fe69768666ffa41fcac649279ef) ) -ROM_END - -ROM_START( tntellfr ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd62171.vsm", 0x0000, 0x4000, CRC(cc26f7d1) SHA1(2b03e37b3bf3cbeca36980acfc45246dac706b83) ) -ROM_END - -ROM_START( tntellp ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "us4403965_cd1100", 0x0000, 0x0800, BAD_DUMP CRC(863a1c9e) SHA1(f2f9eb0ae17eedd4ef2b887b34601e75b4f6c720) ) // typed in from patent US4403965/EP0048835A2, may have errors - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) // from cd8012, matches patent source code - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_us4403965_output.pla", 0, 365, CRC(66cfb3c3) SHA1(80a05e5d729518e1f35d8f26438f56e80ffbd003) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // 4000-7fff = space reserved for cartridge - ROM_LOAD( "cd2610.vsm", 0x0000, 0x1000, CRC(6db34e5a) SHA1(10fa5db20fdcba68034058e7194f35c90b9844e6) ) -ROM_END - - -ROM_START( vocaid ) - ROM_REGION( 0x0800, "maincpu", 0 ) - ROM_LOAD( "cd8012nl", 0x0000, 0x0800, CRC(3d0fee24) SHA1(8b1b1df03d50ffe8adea59ece212dece5245fe86) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_cd8012_micro.pla", 0, 867, CRC(46d936c8) SHA1(b0aad486a90a5dec7fd2fb07caa503be771f91c8) ) - ROM_REGION( 365, "maincpu:opla", 0 ) - ROM_LOAD( "tms1100_cd8012_output.pla", 0, 365, CRC(5ada9306) SHA1(a4140118dd535af45a691832530d55cd86a23510) ) - - ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF ) // same hw as tntell, but no external slot - ROM_LOAD( "cd2357.vsm", 0x0000, 0x4000, CRC(19c251fa) SHA1(8f8163069f32413379e7e1681ce6a4d0819d4ebc) ) -ROM_END - - -ROM_START( k28m2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "mp7324", 0x0000, 0x1000, CRC(08d15ab6) SHA1(5b0f6c53e6732a362c4bb25d966d4072fdd33db8) ) - - ROM_REGION( 867, "maincpu:mpla", 0 ) - ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) ) - ROM_REGION( 557, "maincpu:opla", 0 ) - ROM_LOAD( "tms1400_k28m2_output.pla", 0, 557, CRC(3a5c7005) SHA1(3fe5819c138a90e7fc12817415f2622ca81b40b2) ) - - ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff? = space reserved for cartridge - ROM_LOAD( "cm62084.vsm", 0x0000, 0x4000, CRC(cd1376f7) SHA1(96fa484c392c451599bc083b8376cad9c998df7d) ) -ROM_END - -} // anonymous namespace - - - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1979, snspell, 0, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspellp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snspellub, snspell, 0, sns_tmc0281d, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspellua, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1978, snspelluk, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1981, snspelluka, snspell, 0, sns_cd2801, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (UK, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1979, snspelljp, snspell, 0, sns_tmc0281, snspell, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1981, snspellsp, snspell, 0, snspellsp, snspellsp, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell (Spanish, prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snspellfr, snspell, 0, sns_cd2801, snspellfr, tispeak_state, init_snspell, "Texas Instruments", u8"La Dictée Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellit, snspell, 0, snspellit, snspellit, tispeak_state, init_snspell, "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1981, snspellc, 0, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellca, snspellc, 0, snspellc, snspellc, tispeak_state, init_snspell, "Texas Instruments", "Speak & Spell Compact (US, 1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1982, snspellcuk, snspellc, 0, snspellcuk, snspellcuk, tispeak_state, init_snspell, "Texas Instruments", "Speak & Write (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1980, snmath, 0, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1986, snmatha, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -COMP( 1980, snmathp, snmath, 0, snmath, snmath, tispeak_state, empty_init, "Texas Instruments", "Speak & Math (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IS_INCOMPLETE ) - -COMP( 1980, snread, 0, 0, snread, snread, tispeak_state, init_snspell, "Texas Instruments", "Speak & Read (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) - -COMP( 1979, lantutor, 0, 0, lantutor, lantutor, tispeak_state, init_lantutor, "Texas Instruments", "Language Tutor (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) - -COMP( 1981, tntell, 0, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -COMP( 1980, tntellp, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING ) -COMP( 1981, tntelluk, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) -COMP( 1981, tntellfr, tntell, 0, tntell, tntell, tispeak_state, init_tntell, "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1982, vocaid, 0, 0, vocaid, tntell, tispeak_state, empty_init, "Texas Instruments", "Vocaid", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_REQUIRES_ARTWORK ) - -COMP( 1985, k28m2, 0, 0, k28m2, k28m2, tispeak_state, init_snspell, "Tiger Electronics", "K28: Talking Learning Computer (model 7-232)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/misc_handheld/tispellb.cpp b/src/mame/misc_handheld/tispellb.cpp deleted file mode 100644 index 3826fcae96c..00000000000 --- a/src/mame/misc_handheld/tispellb.cpp +++ /dev/null @@ -1,452 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/*************************************************************************** - - ** subclass of hh_tms1k_state (includes/hh_tms1k.h, drivers/hh_tms1k.cpp) ** - - Texas Instruments Spelling B hardware - - The Spelling B was introduced together with the Speak & Spell. It is a - handheld educational toy with booklet. Two revisions of the hardware exist. - (* indicates not dumped) - - 1st revision: - - Spelling B (US), 1978 - - TMS0270 MCU TMC0272 (die label 0272A T0270B) - - TMS1980 MCU TMC1984 (die label 1980A 84A) - - 8-digit cyan VFD display (seen with and without apostrophe) - - Spelling ABC (UK), 1979: exact same hardware as US version - - 2nd revision: - - Spelling B (US), 1979 - - TMS0270 MCU TMC0274 - - TMC0355 4KB VSM ROM CD2602 - - 8-digit cyan VFD display - - 1-bit sound (indicated by a music note symbol on the top-right of the casing) - - note: much rarer than the 1978 version, not much luck finding one on eBay - - Spelling ABC (UK), 1979: exact same hardware as US version - - Spelling ABC (Germany), 1979: different VSM - - TMC0355 4KB VSM ROM CD2607* - - Mr. Challenger (US), 1979 - - TMS0270 MCU TMC0273 - - TMC0355 4KB VSM ROM CD2601 - - 8-digit cyan VFD display - - 1-bit sound - - Letterlogic (UK), 1980: exact same hardware as US Mr. Challenger - - Letterlogic (France), 1980: different VSM - - TMC0355 4KB VSM ROM CD2603* - - Letterlogic (Germany), 1980: different VSM - - TMC0355 4KB VSM ROM CD2604* - - ----------------------------------------------------------------------------- - - TODO: - - spellb fetches wrong word sometimes (on lv1 SPOON and ANT) - roms were doublechecked - - -***************************************************************************/ - -#include "emu.h" -#include "hh_tms1k.h" - -#include "machine/tms6100.h" -#include "speaker.h" - -// internal artwork -#include "spellb.lh" - - -class tispellb_state : public hh_tms1k_state -{ -public: - tispellb_state(const machine_config &mconfig, device_type type, const char *tag) : - hh_tms1k_state(mconfig, type, tag), - m_subcpu(*this, "subcpu"), - m_tms6100(*this, "tms6100") - { } - - void rev1(machine_config &config); - void rev2(machine_config &config); - - virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override; - -private: - // devices - optional_device m_subcpu; - optional_device m_tms6100; - - u8 m_rev1_ctl = 0; - u16 m_sub_o = 0; - u16 m_sub_r = 0; - - virtual void power_off() override; - void power_subcpu(); - void update_display(); - - u8 main_read_k(); - void main_write_o(u16 data); - void main_write_r(u16 data); - - u8 rev1_ctl_r(); - void rev1_ctl_w(u8 data); - u8 sub_read_k(); - void sub_write_o(u16 data); - void sub_write_r(u16 data); - - void rev2_write_o(u16 data); - void rev2_write_r(u16 data); - - virtual void machine_start() override; -}; - -void tispellb_state::machine_start() -{ - hh_tms1k_state::machine_start(); - - // register for savestates - save_item(NAME(m_rev1_ctl)); - save_item(NAME(m_sub_o)); - save_item(NAME(m_sub_r)); -} - - - -/*************************************************************************** - - I/O - -***************************************************************************/ - -// common - -void tispellb_state::power_subcpu() -{ - if (m_subcpu) - m_subcpu->set_input_line(INPUT_LINE_RESET, m_power_on ? CLEAR_LINE : ASSERT_LINE); -} - -void tispellb_state::power_off() -{ - hh_tms1k_state::power_off(); - power_subcpu(); -} - -void tispellb_state::update_display() -{ - // almost same as snspell - u16 gridmask = m_display->row_on(15) ? 0xffff : 0x8000; - m_display->matrix(m_grid & gridmask, m_plate); -} - -void tispellb_state::main_write_o(u16 data) -{ - // reorder opla to led14seg, plus DP as d14 and AP as d15, same as snspell - m_plate = bitswap<16>(data,12,15,10,7,8,9,11,6,13,3,14,0,1,2,4,5); - update_display(); -} - -void tispellb_state::main_write_r(u16 data) -{ - // R13: power-off request, on falling edge - if (~data & m_r & 0x2000) - power_off(); - - // R0-R6: input mux - // R0-R7: select digit - // R15: filament on - m_r = data; - m_inp_mux = data & 0x7f; - m_grid = data & 0x80ff; - update_display(); -} - -u8 tispellb_state::main_read_k() -{ - // K: multiplexed inputs (note: the Vss row is always on) - return m_inputs[7]->read() | read_inputs(7); -} - - -// 1st revision mcu/mcu comms - -void tispellb_state::rev1_ctl_w(u8 data) -{ - // main CTL write data - m_rev1_ctl = data & 0xf; -} - -u8 tispellb_state::sub_read_k() -{ - // sub K8421 <- main CTL3210 - return m_rev1_ctl; -} - -void tispellb_state::sub_write_o(u16 data) -{ - // sub O write data - m_sub_o = data; -} - -u8 tispellb_state::rev1_ctl_r() -{ - // main CTL3210 <- sub O6043 - return bitswap<4>(m_sub_o,6,0,4,3); -} - -void tispellb_state::sub_write_r(u16 data) -{ - // sub R: unused? - m_sub_r = data; -} - - -// 2nd revision specifics - -void tispellb_state::rev2_write_o(u16 data) -{ - // SEG DP: speaker out - m_speaker->level_w(data >> 15 & 1); - - // SEG DP and SEG AP are not connected to VFD, rest is same as rev1 - main_write_o(data & 0x6fff); -} - -void tispellb_state::rev2_write_r(u16 data) -{ - // R12: TMC0355 CS - // R4: TMC0355 M1 - // R6: TMC0355 M0 - m_tms6100->cs_w(data >> 12 & 1); - m_tms6100->m1_w(data >> 4 & 1); - m_tms6100->m0_w(data >> 6 & 1); - m_tms6100->clk_w(1); - m_tms6100->clk_w(0); - - // rest is same as rev1 - main_write_r(data); -} - - - -/*************************************************************************** - - Inputs - -***************************************************************************/ - -INPUT_CHANGED_MEMBER(tispellb_state::power_button) -{ - hh_tms1k_state::power_button(field, param, oldval, newval); - power_subcpu(); -} - -static INPUT_PORTS_START( spellb ) - PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('B') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('C') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('D') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('E') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('A') - - PORT_START("IN.1") // R1 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('G') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('H') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('I') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('J') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F') - - PORT_START("IN.2") // R2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('L') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('M') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('N') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('O') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('K') - - PORT_START("IN.3") // R3 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('R') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('S') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('T') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('P') - - PORT_START("IN.4") // R4 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('V') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('W') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('X') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('U') - - PORT_START("IN.5") // R5 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("Memory") PORT_CHAR('=') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("Clue") PORT_CHAR('-') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("Erase") PORT_CHAR(8) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Enter") PORT_CHAR(13) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') - - PORT_START("IN.6") // R6 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_HOME) PORT_NAME("Go") PORT_CHAR('7') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_NAME("Off") // -> auto_power_off - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("Level") PORT_CHAR('/') - - PORT_START("IN.7") // Vss! - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Missing Letter") PORT_CHAR('3') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Mystery Word") PORT_CHAR('4') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Scramble") PORT_CHAR('5') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Spelling B/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Starts With") PORT_CHAR('2') -INPUT_PORTS_END - - -static INPUT_PORTS_START( mrchalgr ) - PORT_INCLUDE( spellb ) // same key layout as spellb - - PORT_MODIFY("IN.5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("2nd Player") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("Score") - - PORT_MODIFY("IN.7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_NAME("Crazy Letters") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_NAME("Letter Guesser") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_NAME("Word Challenge") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_F1) PORT_NAME("Mystery Word/On") PORT_CHANGED_MEMBER(DEVICE_SELF, tispellb_state, power_button, true) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_NAME("Replay") -INPUT_PORTS_END - - - -/*************************************************************************** - - Machine Config - -***************************************************************************/ - -void tispellb_state::rev1(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); - m_maincpu->o().set(FUNC(tispellb_state::main_write_o)); - m_maincpu->r().set(FUNC(tispellb_state::main_write_r)); - m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r)); - m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w)); - - TMS1980(config, m_subcpu, 350000); // approximation - m_subcpu->k().set(FUNC(tispellb_state::sub_read_k)); - m_subcpu->o().set(FUNC(tispellb_state::sub_write_o)); - m_subcpu->r().set(FUNC(tispellb_state::sub_write_r)); - - config.set_perfect_quantum(m_maincpu); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_spellb); - - // no sound! -} - - -void tispellb_state::rev2(machine_config &config) -{ - // basic machine hardware - TMS0270(config, m_maincpu, 350000); // approximation - m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); - m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o)); - m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r)); - m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r)); - m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w)); - - TMS6100(config, m_tms6100, 350000); - m_tms6100->enable_4bit_mode(true); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(16, 16); - m_display->set_segmask(0xff, 0x3fff); - config.set_default_layout(layout_spellb); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -ROM_START( spellb ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0272nl", 0x0000, 0x1000, CRC(f90318ff) SHA1(7cff03fafbc66b0e07b3c70a513fbb0b11eef4ea) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_spellb_output.pla", 0, 1246, CRC(3e021cbd) SHA1(c9bdfe10601b8a5a70442fe4805e4bfed8bbed35) ) - - ROM_REGION( 0x1000, "subcpu", 0 ) - ROM_LOAD( "tmc1984nl", 0x0000, 0x1000, CRC(78c9c83a) SHA1(6307fe2a0228fd1b8d308fcaae1b8e856d40fe57) ) - - ROM_REGION( 1246, "subcpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "subcpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 525, "subcpu:opla", 0 ) - ROM_LOAD( "tms1980_spellb_output.pla", 0, 525, CRC(1e26a719) SHA1(eb031aa216fe865bc9e40b070ca5de2b1509f13b) ) -ROM_END - -ROM_START( spellb79 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0274n2l", 0x0000, 0x1000, CRC(98e3bd32) SHA1(e79b59ac29b0183bf1ee8d84b2944450c5e5d8fb) ) - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_spellb79_output.pla", 0, 1246, CRC(b95e35e6) SHA1(430917486856c9e6c28af10ff3758242048096c4) ) - - ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2602.vsm", 0x0000, 0x1000, CRC(dd1fff8c) SHA1(f1760b29aa50fc96a1538db814cc73289654ac25) ) -ROM_END - - -ROM_START( mrchalgr ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "tmc0273nll", 0x0000, 0x1000, CRC(ef6d23bd) SHA1(194e3b022c299e99a731bbcfba5bf8a3a9f0d07e) ) // matches patent US4421487 - - ROM_REGION( 1246, "maincpu:ipla", 0 ) - ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) ) - ROM_REGION( 2127, "maincpu:mpla", 0 ) - ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) - ROM_REGION( 1246, "maincpu:opla", 0 ) - ROM_LOAD( "tms0270_mrchalgr_output.pla", 0, 1246, CRC(4785289c) SHA1(60567af0ea120872a4ccf3128e1365fe84722aa8) ) - - ROM_REGION( 0x1000, "tms6100", 0 ) - ROM_LOAD( "cd2601.vsm", 0x0000, 0x1000, CRC(a9fbe7e9) SHA1(9d480cb30313b8cbce2d048140c1e5e6c5b92452) ) -ROM_END - - - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1978, spellb, 0, 0, rev1, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW ) -COMP( 1979, spellb79, spellb, 0, rev2, spellb, tispellb_state, empty_init, "Texas Instruments", "Spelling B (1979 version)", MACHINE_SUPPORTS_SAVE ) - -COMP( 1979, mrchalgr, 0, 0, rev2, mrchalgr, tispellb_state, empty_init, "Texas Instruments", "Mr. Challenger", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/misc_handheld/wildfire.cpp b/src/mame/misc_handheld/wildfire.cpp deleted file mode 100644 index a680974da95..00000000000 --- a/src/mame/misc_handheld/wildfire.cpp +++ /dev/null @@ -1,212 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:Sean Riddle -/******************************************************************************* - -Parker Brothers Wildfire, by Bob and Holly Doyle (prototype), and Garry Kitchen - -This is an electronic handheld pinball game. It has dozens of small leds to -create the illusion of a moving ball, and even the flippers are leds. A drawing -of a pinball table is added as overlay. - -Hardware notes: -- AMI S2150, labeled C10641 -- RC circuit for speaker volume decay (see patent US4334679 FIG.5, - the 2 resistors at A12 are 10K and the cap is 4.7uF) - -led translation table: led Lzz from patent US4334679 FIG.4* = MAME y.x: -*note: 2 mistakes in it: L19 between L12 and L14 should be L13, and L84 should of course be L48 - - 0 = - 10 = 6.6 20 = 4.5 30 = 5.3 40 = 5.7 50 = 11.6 - 1 = 10.7 11 = 5.6 21 = 4.4 31 = 4.3 41 = 6.0 51 = 11.5 - 2 = 10.0 12 = 6.5 22 = 5.4 32 = 5.2 42 = 7.0 52 = 11.4 - 3 = 10.1 13 = 7.5 23 = 6.3 33 = 5.1 43 = 8.0 53 = 11.3 - 4 = 10.2 14 = 8.5 24 = 7.3 34 = 11.7 44 = 9.0 60 = 3.6 - 5 = 10.3 15 = 9.4 25 = 11.1 35 = 7.1 45 = 6.7 61 = 3.6(!) - 6 = 10.4 16 = 8.4 26 = 9.3 36 = 9.1 46 = 7.7 62 = 3.5 - 7 = 10.5 17 = 7.4 27 = 9.2 37 = 5.0 47 = 8.7 63 = 3.5(!) - 8 = 8.6 18 = 11.2 28 = 8.2 38 = 6.1 48 = 9.7 70 = 3.3 - 9 = 7.6 19 = 5.5 29 = 11.0 39 = 8.1 49 = - - -NOTE!: MAME external artwork is required - -TODO: -- sound can be improved, volume decay should be more steep at the start, and the - pitch sounds wrong too (latter is an MCU emulation problem) - -*******************************************************************************/ - -#include "emu.h" - -#include "cpu/amis2000/amis2000.h" -#include "machine/timer.h" -#include "sound/flt_vol.h" -#include "sound/spkrdev.h" -#include "video/pwm.h" -#include "speaker.h" - -#include "wildfire.lh" - - -namespace { - -class wildfire_state : public driver_device -{ -public: - wildfire_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_display(*this, "display"), - m_speaker(*this, "speaker"), - m_volume(*this, "volume") - { } - - void wildfire(machine_config &config); - -protected: - virtual void machine_start() override; - -private: - required_device m_maincpu; - required_device m_display; - required_device m_speaker; - required_device m_volume; - - void update_display(); - void write_d(u8 data); - void write_a(u16 data); - - void speaker_update(); - TIMER_DEVICE_CALLBACK_MEMBER(speaker_decay_sim); - double m_speaker_volume = 0.0; - - u16 m_a = 0; - u8 m_d = 0; -}; - -void wildfire_state::machine_start() -{ - // register for savestates - save_item(NAME(m_a)); - save_item(NAME(m_d)); - save_item(NAME(m_speaker_volume)); -} - - - -/******************************************************************************* - I/O -*******************************************************************************/ - -void wildfire_state::speaker_update() -{ - if (~m_a & 0x1000) - m_speaker_volume = 1.0; - - m_volume->flt_volume_set_volume(m_speaker_volume); -} - -TIMER_DEVICE_CALLBACK_MEMBER(wildfire_state::speaker_decay_sim) -{ - // volume decays when speaker is off (divisor and timer period determine duration) - speaker_update(); - m_speaker_volume /= 1.0025; -} - -void wildfire_state::update_display() -{ - m_display->matrix(~m_a, m_d); -} - -void wildfire_state::write_d(u8 data) -{ - // D0-D7: led/7seg data - m_d = bitswap<8>(data,7,0,1,2,3,4,5,6); - update_display(); -} - -void wildfire_state::write_a(u16 data) -{ - // A0-A2: digit select - // A3-A11: led select - m_a = data; - update_display(); - - // A12: speaker on - speaker_update(); -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -static INPUT_PORTS_START( wildfire ) - PORT_START("IN.0") // I - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Shooter Button") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Left Flipper") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Right Flipper") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -// 7seg decoder table differs from default, this one is made by hand -static const u8 wildfire_7seg_table[0x10] = -{ - 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, // 0, 1, 2, 3, 4, 5, 6, 7 - 0x7f, 0x6f, 0x77, 0x73, 0x39, 0x38, 0x79, 0x40 // 8, 9, ?, P, ?, L, ?, - -}; - -void wildfire_state::wildfire(machine_config &config) -{ - // basic machine hardware - AMI_S2152(config, m_maincpu, 850000); // approximation - RC osc. R=?, C=? - m_maincpu->set_7seg_table(wildfire_7seg_table); - m_maincpu->read_i().set_ioport("IN.0"); - m_maincpu->write_d().set(FUNC(wildfire_state::write_d)); - m_maincpu->write_a().set(FUNC(wildfire_state::write_a)); - m_maincpu->write_f().set(m_speaker, FUNC(speaker_sound_device::level_w)); - - // video hardware - PWM_DISPLAY(config, m_display).set_size(12, 8); - m_display->set_segmask(7, 0x7f); - m_display->set_bri_levels(0.01, 0.1); // bumpers are dimmed - config.set_default_layout(layout_wildfire); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "volume", 0.25); - FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "mono", 1.0); - - TIMER(config, "speaker_decay").configure_periodic(FUNC(wildfire_state::speaker_decay_sim), attotime::from_usec(100)); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( wildfire ) - ROM_REGION( 0x0800, "maincpu", ROMREGION_ERASE00 ) - // Typed in from patent US4334679, data should be correct(it included checksums). 1st half was also dumped/verified with release version. - ROM_LOAD( "us4341385", 0x0000, 0x0400, CRC(84ac0f1f) SHA1(1e00ddd402acfc2cc267c34eed4b89d863e2144f) ) - ROM_CONTINUE( 0x0600, 0x0200 ) -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT CMP MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS -CONS( 1979, wildfire, 0, 0, wildfire, wildfire, wildfire_state, empty_init, "Parker Brothers", "Wildfire (patent)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) // note: pretty sure that it matches the commercial release diff --git a/src/mame/pc/README.md b/src/mame/pc/README.md new file mode 100644 index 00000000000..ea9e4fcc428 --- /dev/null +++ b/src/mame/pc/README.md @@ -0,0 +1,3 @@ +# **src/mame/pc** # + +Generic folder with MAME drivers for IBM PC, PC compatibles, or PC-based arcade hardware. \ No newline at end of file diff --git a/src/mame/pc/at.cpp b/src/mame/pc/at.cpp new file mode 100644 index 00000000000..18ef2ee0e7a --- /dev/null +++ b/src/mame/pc/at.cpp @@ -0,0 +1,6389 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol, Miodrag Milanovic +/*************************************************************************** + + IBM AT Compatibles + +Commodore PC 30-III and PC 40-III +================================= +Links: http://www.richardlagendijk.nl/cip/computer/item/pc30iii/en , ftp://ftp.zimmers.net/pub/cbm-pc/firmware/pc30/ +Info: The PC 30-III and PC 40-III share the same mainboard. On a PC 30-III the onboard Paradise VGA is not populated. +Form factor: Desktop PC +CPU: Siemens SAB 80286-12 (PC 30-III), Intel 80286-12 (PC 40-III) +RAM: 1MB on board +Chipset: Faraday FE3020, MOS 5720 1788 41, Faraday FE3000, FE3010B, +Bus: 3x16 bit ISA, 1x8 bit ISA +Video: PC 30-III: ATI EGA Wonder 800+, PC 40-III: Onboard Paradise VGA, 256KB +Mass storage: One HD disk drive standard, second drive optional; PC 30-III: 20MB, PC 40-III: 40MB AT-IDE HD standard, 80MB or 100MB optional +On board: Serial, Parallel, Commodore 1532 Mouse port (MS Bus mouse compatible), Keyboard, Beeper, Floppy (2 devices), AT-IDE (1 device) +Options: 80287 + +Sanyo MBC-28 +============ +Links: http://www.cc-computerarchiv.de/CC-Archiv/bc-alt/gb-san/gb-san-12_91.html +Form factor: Desktop +CPU: 80386sx-20 +RAM: 1MB - 8MB on board +Mass storage: 1.44MB Floppy disk drive and 80MB IDE hard disk +On board: 2xserial, parallel, bus mouse, keyboard +To-Do: Complains about missing mouse hardware (Bus Mouse), hangs in POST + +Siemens PCD-2 +============= +Links: http://www.z80.eu/siemenspcd2.html , http://www.z80.eu/downloads/Siemens_PCD-2_SW-Monitor-Buchse-Belegung.pdf , https://www.computerwoche.de/a/at-klon-und-lan-ergaenzen-siemens-palette,1166395 +Form factor: low profile desktop +CPU: 80286-12 on a Tandon supplied slot CPU card +RAM: 1MB - 4MB in four SIMM modules +Mass storage: 1.2MB Floppy disk drive and 20MB or 40MB MFM harddisk +Bus: Vertical passive ISA backplane with six slots +On board: 2xserial, parallel, floppy, keyboard, RTC, MFM harddisk controller piggybacked to bus extension on slot CPU +Options: 80287 + +Compaq Portable II +================== +Links: http://tkc8800.com/post/compaq-portable-ii-restoration , https://www.seasip.info/VintagePC/compaq2.html , https://en.wikipedia.org/wiki/Compaq_Portable_II +Form factor: Luggable +CPU: 80286-8 +RAM: 256K or 640K on board, 512kB and 2048kB ISA memory cards and 512kB and 1536kB memory boards that attached to the back of the motherboard, 4.2M max. +Display: Green-screen CRT +Mass storage: one or two 5.25" floppy drives, 10MB or 20MB mfm harddisk connected via an MFM=>IDE bridgeboard +Bus: two 8bit and two 16bit ISA slots +On board: Serial, parallel +Standard cards: Floppy/IDE combo card, special Compaq CGA/MDA hybrid video card +Options: Compaq EGA card (drives internal monitor), 80287, floppy drives (360K, 1.2M, 1.44M) + +Compaq Portable III +=================== +Links: http://www.old-computers.com/museum/computer.asp?c=1064 , http://www.freakedenough.at/infoseiten/read.php?id=66 , http://www.1000bit.it/ad/bro/compaq/CompaqProtable3.pdf , http://oldcomputers.net/compaqiii.pdf +Info: The later Compaq Portable 386 uses the same case, screen and video adapter; Models: 1 (no), 20 (20MB) and 40 (40MB harddisk) +Form factor: Luggable +CPU: AMD N80L286-12/S 12MHz (could be downclocked to 8MHz) +RAM: 640KB, attitional RAM cards were 512KB or 2MB to give 1.1MB, 1.6MB, 2.1MB, 2.6MB, 4.6MB or 6.6MB of total RAM +Video: AT&T 6300/Olivetti M24 driver compatible "Super CGA" with a 640x400 red/amber Plasma screen +Mass storage: One 1.2MB floppy disk drive, no/20MB/40MB hard disk +On board: Serial, Parallel, RTC, RGBI (external Monitor), keyboard +Options: 80827, Expansion box with 2 ISA slots, 300/1200Baud internal Modem, Compaq EGA Board +To-Do: Emulate Graphics card fully + +Ericsson/Nokia Data/ICL WS286 +============================= +Links: http://oju.mbnet.fi/retro/EricssonPC_eng.html +Info: WS286 was introduced 1986 as first 8Mhz AT in the world a few weeks ahead competition, aquired by Nokia Data 1988 which in turn was aquired by ICL 1990 +Form factor: Desktop PC +CPU: Intel 286, 8MHz +RAM: 640KB +Mass storage: Floppy: 5.25" 1.2Mb, HDD: 40Mb + +Nixdorf 8810 M55 +================ +Links: https://www.computerwoche.de/a/auch-nixdorf-nun-in-der-at-clone-riege,1166613 +Info: Rebadged NCR PC-8, an AT-clone in a huge desktop case +Form factor: Desktop PC +CPU: Intel 286; CPU card has a 20Mhz, a 12 MHz and a 14.31818 crystal +RAM: 512K on CPU card, 128K on a piggyback card and a memory expansion board +Bus: Passive backplane, ISA +Video: Paradise EGA on another piggyback board +Mass storage: Floppy: 5.25" 1.2MB, MFM HDD + +Lion 3500C/T +========== +Info: BIOS saved according to http://mess.redump.net/dumping/dump_bios_using_debug from a 3560C machine +Form factor: notebook +CPU: Intel 486DX2-66 +RAM: 2MB, 4MB, 8MB or 16MB +Chipset: ETEQ ET/486H (ET82C491 & ET82C492), 82C206, 82C712 +ROM: 128K Video (E0000-EFFFF) & BIOS ROM (F0000-FFFFF) +Video: Cirrus Logic GD-6420BF/6430 6342 internal VGA, 640x480 256 color display +Mass storage: Floppy 3.5" 1.44MB, 3.5" HDD, 120MB +Input: Trackball connected as a PS/2 mouse +Options: 100 pin expansion port for 3305 Docking station (2xISA16 slots), external keypad +Ports: External VGA, external keyboard, COM1, external keypad, COM2, LPT1, buzzer +Variants: T denotes an active 8.4" display, C a passive 9.5" color display. 3560T/C (486DX2-66), 3530T/C(486DX2-50), 3500T/C (486DX-33), 3500SXT/SXC(486SX-25) + +***************************************************************************/ + +#include "emu.h" + +/* mingw-gcc defines this */ +#ifdef i386 +#undef i386 +#endif /* i386 */ + +#include "bus/isa/isa_cards.h" +#include "bus/lpci/pci.h" +#include "bus/lpci/vt82c505.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "cpu/i386/i386.h" +#include "cpu/i86/i286.h" +#include "machine/at.h" +#include "machine/cs8221.h" +#include "machine/ds128x.h" +#include "machine/idectrl.h" +#include "machine/nvram.h" +#include "machine/ram.h" +#include "machine/vt82c496.h" +#include "machine/wd7600.h" +#include "emupal.h" +#include "softlist_dev.h" +#include "speaker.h" + +class at_state : public driver_device +{ +public: + at_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mb(*this, "mb"), + m_ram(*this, RAM_TAG) + { } + + void pc30iii(machine_config &config); + void k286i(machine_config &config); + void ibm5170(machine_config &config); + void ct386sx(machine_config &config); + void xb42639(machine_config &config); + void at486l(machine_config &config); + void comportii(machine_config &config); + void comportiii(machine_config &config); + void comslt286(machine_config &config); + void dsys200(machine_config &config); + void ibm5162(machine_config &config); + void neat(machine_config &config); + void at386l(machine_config &config); + void ibm5170a(machine_config &config); + void ec1842(machine_config &config); + void at486(machine_config &config); + void ficpio2(machine_config &config); + void at386sx(machine_config &config); + void pc40iii(machine_config &config); + void pc45iii(machine_config &config); + void c286lt(machine_config &config); + void csl286(machine_config &config); + void c386sx16(machine_config &config); + void atturbo(machine_config &config); + void at386(machine_config &config); + void m290(machine_config &config); + void ncrpc8(machine_config &config); + void n8810m15(machine_config &config); + void n8810m55(machine_config &config); + void ews286(machine_config &config); + void olyport40(machine_config &config); + void micral45(machine_config &config); + void euroat(machine_config &config); + void pg750(machine_config &config); + + void init_at(); + void init_atpci(); + +protected: + required_device m_maincpu; + required_device m_mb; + required_device m_ram; + uint16_t ps1_unk_r(offs_t offset); + void ps1_unk_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + uint8_t ps1_portb_r(); + + void init_at_common(int xmsbase); + uint16_t m_ps1_reg[2]; + + static void cfg_single_360K(device_t *device); + static void cfg_single_1200K(device_t *device); + static void cfg_single_1440K(device_t *device); + static void cfg_dual_1440K(device_t *device); + void at16_io(address_map &map); + void at16_map(address_map &map); + void at16l_map(address_map &map); + void at32_io(address_map &map); + void at32_map(address_map &map); + void at32l_map(address_map &map); + void ficpio_io(address_map &map); + void ficpio_map(address_map &map); + void neat_io(address_map &map); + void ps1_16_io(address_map &map); +}; + +class at_vrom_fix_state : public at_state +{ +public: + using at_state::at_state; + + void init_megapcpla(); + + void ibmps1(machine_config &config); + void megapcpla(machine_config &config); + +protected: + virtual void machine_start() override; +}; + +class megapc_state : public driver_device +{ +public: + megapc_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_ram(*this, RAM_TAG), + m_wd7600(*this, "wd7600"), + m_isabus(*this, "isabus"), + m_speaker(*this, "speaker") + { } + + void megapcpl(machine_config &config); + void megapc(machine_config &config); + + void init_megapc(); + void init_megapcpl(); + +private: + required_device m_maincpu; + required_device m_ram; + required_device m_wd7600; + required_device m_isabus; + required_device m_speaker; + + uint16_t wd7600_ior(offs_t offset); + void wd7600_iow(offs_t offset, uint16_t data); + DECLARE_WRITE_LINE_MEMBER( wd7600_hold ); + void wd7600_tc(offs_t offset, uint8_t data) { m_isabus->eop_w(offset, data); } + DECLARE_WRITE_LINE_MEMBER( wd7600_spkr ) { m_speaker->level_w(state); } + void megapc_io(address_map &map); + void megapc_map(address_map &map); + void megapcpl_io(address_map &map); + void megapcpl_map(address_map &map); +}; + + +void at_state::at16_map(address_map &map) +{ + map.unmap_value_high(); + map(0x000000, 0x09ffff).bankrw("bank10"); + map(0x0e0000, 0x0fffff).rom().region("bios", 0); + map(0xfe0000, 0xffffff).rom().region("bios", 0); +} + +void at_state::at16l_map(address_map &map) +{ + map.unmap_value_high(); + map(0x000000, 0x09ffff).bankrw("bank10"); + map(0x0e0000, 0x0fffff).rom().region("bios", 0x20000); + map(0xfe0000, 0xffffff).rom().region("bios", 0x20000); +} + +void at_state::at32_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00000000, 0x0009ffff).bankrw("bank10"); + map(0x000e0000, 0x000fffff).rom().region("bios", 0); + map(0x00800000, 0x00800bff).ram().share("nvram"); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0); +} + +void at_state::at32l_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00000000, 0x0009ffff).bankrw("bank10"); + map(0x000e0000, 0x000fffff).rom().region("bios", 0x20000); + map(0x00800000, 0x00800bff).ram().share("nvram"); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0x20000); +} + +void at_state::ficpio_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00000000, 0x0009ffff).bankrw("bank10"); + map(0x00800000, 0x00800bff).ram().share("nvram"); + map(0xfffe0000, 0xffffffff).rom().region("isa", 0x20000); +} + +void at_state::at16_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); +} + +uint16_t at_state::ps1_unk_r(offs_t offset) +{ + return m_ps1_reg[offset]; +} + +void at_state::ps1_unk_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + if((offset == 0) && (data == 0x60)) + data = 0x68; + + COMBINE_DATA(&m_ps1_reg[offset]); +} + +uint8_t at_state::ps1_portb_r() +{ + uint8_t data = m_mb->portb_r(); + /* 0x10 is the dram refresh line bit, 15.085us. */ + data = (data & ~0x10) | ((machine().time().as_ticks(66291) & 1) ? 0x10 : 0); + + return data; +} + +void at_state::ps1_16_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); + map(0x0061, 0x0061).r(FUNC(at_state::ps1_portb_r)); + map(0x0102, 0x0105).rw(FUNC(at_state::ps1_unk_r), FUNC(at_state::ps1_unk_w)); +} + +void at_state::neat_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); + map(0x0022, 0x0023).m("cs8221", FUNC(cs8221_device::map)); +} + +void at_state::at32_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); +} + +void at_state::ficpio_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); + map(0x00a8, 0x00af).rw("chipset", FUNC(vt82c496_device::read), FUNC(vt82c496_device::write)); + map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); + map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); + map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); + map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); + map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); +} + +void megapc_state::init_megapc() +{ + uint8_t* ROM = memregion("bios")->base(); + ROM[0x19145] = 0x45; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped + ROM[0x1fea0] = 0x20; // to correct checksum +} + +void megapc_state::init_megapcpl() +{ + uint8_t* ROM = memregion("bios")->base(); + ROM[0x187b1] = 0x55; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped + ROM[0x1fea0] = 0x20; // to correct checksum +} + +void at_vrom_fix_state::init_megapcpla() +{ + uint8_t* ROM = memregion("bios")->base(); + + init_at_common(0xa0000); + + ROM[0x33c2a] = 0x45; // hack to fix keyboard. To be removed when the keyboard controller from the MegaPC is dumped + ROM[0x3af37] = 0x45; + ROM[0x3cf1b] = 0x54; // this will allow the keyboard to work during the POST memory test + ROM[0x3fffe] = 0x1c; + ROM[0x3ffff] = 0x41; // to correct checksum +} + +uint16_t megapc_state::wd7600_ior(offs_t offset) +{ + if (offset < 4) + return m_isabus->dack_r(offset); + else + return m_isabus->dack16_r(offset); +} + +void megapc_state::wd7600_iow(offs_t offset, uint16_t data) +{ + if (offset < 4) + m_isabus->dack_w(offset, data); + else + m_isabus->dack16_w(offset, data); +} + +WRITE_LINE_MEMBER( megapc_state::wd7600_hold ) +{ + // halt cpu + m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + // and acknowledge hold + m_wd7600->hlda_w(state); +} + +void megapc_state::megapc_map(address_map &map) +{ +} + +void megapc_state::megapcpl_map(address_map &map) +{ +} + +void megapc_state::megapc_io(address_map &map) +{ + map.unmap_value_high(); +} + +void megapc_state::megapcpl_io(address_map &map) +{ + map.unmap_value_high(); +} + +/********************************************************** + * + * Init functions + * + **********************************************************/ + +void at_state::init_at_common(int xmsbase) +{ + address_space& space = m_maincpu->space(AS_PROGRAM); + + /* managed RAM */ + membank("bank10")->set_base(m_ram->pointer()); + + if (m_ram->size() > xmsbase) + { + offs_t ram_limit = 0x100000 + m_ram->size() - xmsbase; + space.install_ram(0x100000, ram_limit - 1, m_ram->pointer() + xmsbase); + } +} + +void at_state::init_at() +{ + init_at_common(0xa0000); +} + +void at_state::init_atpci() +{ + init_at_common(0x100000); +} + +void at_vrom_fix_state::machine_start() +{ + at_state::machine_start(); + + address_space& space = m_maincpu->space(AS_PROGRAM); + space.install_rom(0xc0000, 0xcffff, memregion("bios")->base()); +} + +void at_state::cfg_single_1200K(device_t *device) +{ + dynamic_cast(*device->subdevice("fdc:0")).set_default_option("525hd"); + dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); +} + +void at_state::cfg_single_360K(device_t *device) +{ + dynamic_cast(*device->subdevice("fdc:0")).set_default_option("525dd"); + dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); +} + +void at_state::cfg_single_1440K(device_t *device) +{ + dynamic_cast(*device->subdevice("fdc:0")).set_default_option("35hd"); + dynamic_cast(*device->subdevice("fdc:1")).set_default_option(nullptr); +} + +void at_state::cfg_dual_1440K(device_t *device) +{ + dynamic_cast(*device->subdevice("fdc:0")).set_default_option("35hd"); + dynamic_cast(*device->subdevice("fdc:1")).set_default_option("35hd"); +} + +static void pci_devices(device_slot_interface &device) +{ + device.option_add_internal("vt82c505", VT82C505); +} + +void at_state::ibm5170(machine_config &config) +{ + /* basic machine hardware */ + i80286_cpu_device &maincpu(I80286(config, m_maincpu, 12_MHz_XTAL / 2)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); + maincpu.set_addrmap(AS_IO, &at_state::at16_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + // FIXME: determine ISA bus clock + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "ega", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "fdc", false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, "comat", false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, "ide", false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("1664K").set_extra_options("640K,1024K,2M,4M,8M,15M"); +} + +void at_state::ibm5170a(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(16_MHz_XTAL / 2); +} + +void at_state::ews286(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(16_MHz_XTAL / 2); // Exact crystal needs to be verified, 8 MHz according to specification + + subdevice("isa2")->set_option_machine_config("fdc", cfg_single_1200K); // From pictures but also with a 3.5" as second floppy + + SOFTWARE_LIST(config, "ews286_disk_list").set_original("ews286_flop"); + + m_ram->set_default_size("640K"); +} + +void at_state::ec1842(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(12'000'000); +} + +void at_state::ibm5162(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(6'000'000); + subdevice("isa1")->set_default_option("cga"); +} + +void at_vrom_fix_state::ibmps1(machine_config &config) +{ + ibm5170(config); + + m_maincpu->set_clock(10_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &at_vrom_fix_state::at16l_map); + m_maincpu->set_addrmap(AS_IO, &at_vrom_fix_state::ps1_16_io); + + subdevice("isa1")->set_default_option("vga"); + subdevice("isa1")->set_fixed(true); + subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); +} + +void at_state::atturbo(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(12'000'000); + subdevice("isa1")->set_default_option("svga_et4k"); + subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); // FIXME: determine ISA bus clock +} + +void at_state::neat(machine_config &config) +{ + atturbo(config); + m_maincpu->set_addrmap(AS_IO, &at_state::neat_io); + + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); // TODO: move this into the cs8221 + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb + rtc.set_century_index(0x32); + + CS8221(config, "cs8221", 0, "maincpu", "mb:isa", "bios"); +} + +void at_state::xb42639(machine_config &config) +{ + atturbo(config); + m_maincpu->set_clock(12'500'000); +} + +void at_state::k286i(machine_config &config) +{ + ibm5162(config); + subdevice("kbd")->set_default_option(STR_KBD_MICROSOFT_NATURAL); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); // FIXME: determine ISA bus clock + ISA16_SLOT(config, "isa6", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa7", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa8", 0, "mb:isabus", pc_isa16_cards, nullptr, false); +} + +void at_state::at386(machine_config &config) +{ + i386_device &maincpu(I386(config, m_maincpu, 12'000'000)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); + maincpu.set_addrmap(AS_IO, &at_state::at32_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // on-board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: deteremine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("1664K").set_extra_options("2M,4M,8M,15M,16M,32M,64M"); +} + +void at_state::at386l(machine_config &config) +{ + at386(config); + m_maincpu->set_addrmap(AS_PROGRAM, &at_state::at32l_map); +} + +void at_state::at486(machine_config &config) +{ + i486_device &maincpu(I486(config, m_maincpu, 25'000'000)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); + maincpu.set_addrmap(AS_IO, &at_state::at32_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // on-board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: deteremine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,16M,20M,32M,64M,128M"); +} + +void at_state::at486l(machine_config &config) +{ + at486(config); + m_maincpu->set_addrmap(AS_PROGRAM, &at_state::at32l_map); +} + +void at_state::at386sx(machine_config &config) +{ + atturbo(config); + i386sx_device &maincpu(I386SX(config.replace(), m_maincpu, 16'000'000)); /* 386SX */ + maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); + maincpu.set_addrmap(AS_IO, &at_state::at16_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); +} + +void at_state::ct386sx(machine_config &config) +{ + at386sx(config); + m_maincpu->set_addrmap(AS_IO, &at_state::neat_io); + CS8221(config, "cs8221", 0, "maincpu", "mb:isa", "maincpu"); +} + +// Commodore PC 30-III +void at_state::pc30iii(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(6'000'000); // should be 24_MHz_XTAL / 2, but doesn't post with that setting + subdevice("isa1")->set_default_option("vga"); // should be ATI EGA Wonder 800+ +} + +// Commodore PC 40-III +void at_state::pc40iii(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(6'000'000); // should be 24_MHz_XTAL / 2, but doesn't post with that setting + subdevice("isa1")->set_default_option("vga"); // should be onboard Paradise VGA, see ROM declarations +} + +void megapc_state::megapc(machine_config &config) +{ + i386sx_device &maincpu(I386SX(config, m_maincpu, 50_MHz_XTAL / 2)); + maincpu.set_addrmap(AS_PROGRAM, &megapc_state::megapc_map); + maincpu.set_addrmap(AS_IO, &megapc_state::megapc_io); + maincpu.set_irq_acknowledge_callback("wd7600", FUNC(wd7600_device::intack_cb)); + + WD7600(config, m_wd7600, 50_MHz_XTAL / 2); + m_wd7600->set_cputag(m_maincpu); + m_wd7600->set_isatag("isa"); + m_wd7600->set_ramtag(m_ram); + m_wd7600->set_biostag("bios"); + m_wd7600->set_keybctag("keybc"); + m_wd7600->hold_callback().set(FUNC(megapc_state::wd7600_hold)); + m_wd7600->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + m_wd7600->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); + m_wd7600->cpureset_callback().set_inputline(m_maincpu, INPUT_LINE_RESET); + m_wd7600->a20m_callback().set_inputline(m_maincpu, INPUT_LINE_A20); + // isa dma + m_wd7600->ior_callback().set(FUNC(megapc_state::wd7600_ior)); + m_wd7600->iow_callback().set(FUNC(megapc_state::wd7600_iow)); + m_wd7600->tc_callback().set(FUNC(megapc_state::wd7600_tc)); + // speaker + m_wd7600->spkr_callback().set(FUNC(megapc_state::wd7600_spkr)); + + // on board devices + ISA16(config, m_isabus, 0); + m_isabus->set_memspace(m_maincpu, AS_PROGRAM); + m_isabus->set_iospace(m_maincpu, AS_IO); + m_isabus->iochck_callback().set(m_wd7600, FUNC(wd7600_device::iochck_w)); + m_isabus->irq2_callback().set(m_wd7600, FUNC(wd7600_device::irq09_w)); + m_isabus->irq3_callback().set(m_wd7600, FUNC(wd7600_device::irq03_w)); + m_isabus->irq4_callback().set(m_wd7600, FUNC(wd7600_device::irq04_w)); + m_isabus->irq5_callback().set(m_wd7600, FUNC(wd7600_device::irq05_w)); + m_isabus->irq6_callback().set(m_wd7600, FUNC(wd7600_device::irq06_w)); + m_isabus->irq7_callback().set(m_wd7600, FUNC(wd7600_device::irq07_w)); + m_isabus->irq10_callback().set(m_wd7600, FUNC(wd7600_device::irq10_w)); + m_isabus->irq11_callback().set(m_wd7600, FUNC(wd7600_device::irq11_w)); + m_isabus->irq12_callback().set(m_wd7600, FUNC(wd7600_device::irq12_w)); + m_isabus->irq14_callback().set(m_wd7600, FUNC(wd7600_device::irq14_w)); + m_isabus->irq15_callback().set(m_wd7600, FUNC(wd7600_device::irq15_w)); + m_isabus->drq0_callback().set(m_wd7600, FUNC(wd7600_device::dreq0_w)); + m_isabus->drq1_callback().set(m_wd7600, FUNC(wd7600_device::dreq1_w)); + m_isabus->drq2_callback().set(m_wd7600, FUNC(wd7600_device::dreq2_w)); + m_isabus->drq3_callback().set(m_wd7600, FUNC(wd7600_device::dreq3_w)); + m_isabus->drq5_callback().set(m_wd7600, FUNC(wd7600_device::dreq5_w)); + m_isabus->drq6_callback().set(m_wd7600, FUNC(wd7600_device::dreq6_w)); + m_isabus->drq7_callback().set(m_wd7600, FUNC(wd7600_device::dreq7_w)); + + ISA16_SLOT(config, "board1", 0, "isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock + ISA16_SLOT(config, "board2", 0, "isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "isabus", pc_isa16_cards, "lpt", true); + ISA16_SLOT(config, "board5", 0, "isabus", pc_isa16_cards, "vga", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "isabus", pc_isa16_cards, nullptr, false); + + at_keyboard_controller_device &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", 12_MHz_XTAL)); + keybc.hot_res().set("wd7600", FUNC(wd7600_device::kbrst_w)); + keybc.gate_a20().set("wd7600", FUNC(wd7600_device::gatea20_w)); + keybc.kbd_irq().set("wd7600", FUNC(wd7600_device::irq01_w)); + keybc.kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + keybc.kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set("keybc", FUNC(at_keyboard_controller_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,15M,16M"); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50); + + // video hardware + PALETTE(config, "palette").set_entries(256); // todo: really needed? + + /* software lists */ + SOFTWARE_LIST(config, "disk_list").set_original("megapc"); +} + +void megapc_state::megapcpl(machine_config &config) +{ + megapc(config); + i486_device &maincpu(I486(config.replace(), m_maincpu, 66'000'000 / 2)); + maincpu.set_addrmap(AS_PROGRAM, &megapc_state::megapcpl_map); + maincpu.set_addrmap(AS_IO, &megapc_state::megapcpl_io); + maincpu.set_irq_acknowledge_callback("wd7600", FUNC(wd7600_device::intack_cb)); +} + +void at_vrom_fix_state::megapcpla(machine_config &config) +{ + i486_device &maincpu(I486(config, m_maincpu, 66'000'000 / 2)); // 486SLC + maincpu.set_addrmap(AS_PROGRAM, &at_vrom_fix_state::at32l_map); + maincpu.set_addrmap(AS_IO, &at_vrom_fix_state::at32_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // on board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_dm", false); // closest to the CL-GD5420 + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("4M").set_extra_options("2M,8M,15M,16M,32M,64M,128M,256M"); + + /* software lists */ + SOFTWARE_LIST(config, "disk_list").set_original("megapc"); +} + +void at_state::ficpio2(machine_config &config) +{ + i486_device &maincpu(I486(config, m_maincpu, 25'000'000)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::ficpio_map); + maincpu.set_addrmap(AS_IO, &at_state::ficpio_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb + rtc.set_century_index(0x32); + + RAM(config, m_ram).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M"); + + // on board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + + ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true)); + ide.irq_handler().set("mb:pic8259_slave", FUNC(pic8259_device::ir6_w)); + ide_controller_32_device &ide2(IDE_CONTROLLER_32(config, "ide2").options(ata_devices, "cdrom", nullptr, true)); + ide2.irq_handler().set("mb:pic8259_slave", FUNC(pic8259_device::ir7_w)); + + PCI_BUS(config, "pcibus", 0).set_busnum(0); + PCI_CONNECTOR(config, "pcibus:0", pci_devices, "vt82c505", true); + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + vt82c496_device &chipset(VT82C496(config, "chipset")); + chipset.set_cputag(m_maincpu); + chipset.set_ramtag(m_ram); + chipset.set_isatag("isa"); +} + +// Compaq Portable III +void at_state::comportiii(machine_config &config) +{ + /* basic machine hardware */ + i80286_cpu_device &maincpu(I80286(config, m_maincpu, 48_MHz_XTAL / 4 /*12000000*/)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::at16_map); + maincpu.set_addrmap(AS_IO, &at_state::at16_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + // FIXME: determine ISA bus clock + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdc", true).set_option_machine_config("fdc", cfg_single_1200K); + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "hdc", true); + ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "cga_cportiii", true); + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("640K").set_extra_options("1152K,1664K,2176K,2688K,4736K,6784K"); +} + +void at_state::comportii(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(48_MHz_XTAL / 6); + + subdevice("isa2")->set_option_machine_config("fdc", cfg_single_360K); + subdevice("isa4")->set_default_option("hdc"); + m_ram->set_default_size("640K").set_extra_options("1152K,1664K,2176K,2688K,4224K"); +} + +// Nixdorf 8810 M55 +void at_state::n8810m15(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(6'000'000); + subdevice("isa1")->set_default_option("cga"); +} + +// Nixdorf 8810 M55 +void at_state::n8810m55(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(6'000'000); + subdevice("isa1")->set_default_option("ega"); +} + +// AEG Olympia Olyport 40-21 +void at_state::olyport40(machine_config &config) +{ + neat(config); + m_maincpu->set_clock(12'000'000); + subdevice("isa1")->set_default_option("cga"); +} + +// Bull Micral 45 +void at_state::micral45(machine_config &config) +{ + atturbo(config); + m_maincpu->set_clock(12'000'000); + subdevice("isa1")->set_default_option("ega"); +} + +void at_state::euroat(machine_config &config) +{ + ibm5170(config); + m_maincpu->set_clock(24_MHz_XTAL / 2); // Bus speed can be set up to CPU speed + + subdevice("isa2")->set_option_machine_config("fdc", cfg_single_1440K); // From pictures but also with a 3.5" as second floppy + + m_ram->set_default_size("640K"); +} + +// Siemens PG 750 +void at_state::pg750(machine_config &config) +{ + i386_device &maincpu(I386(config, m_maincpu, 12'000'000)); + maincpu.set_addrmap(AS_PROGRAM, &at_state::at32_map); + maincpu.set_addrmap(AS_IO, &at_state::at32_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + AT_MB(config, m_mb).at_softlists(config); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + ds12885_device &rtc(DS12885(config.replace(), "mb:rtc")); // TODO: move this into the cs8221 + rtc.irq().set("mb:pic8259_slave", FUNC(pic8259_device::ir0_w)); // this is in :mb + rtc.set_century_index(0x32); + + // on-board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdc", true).set_option_machine_config("fdc", cfg_dual_1440K); // FIXME: deteremine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "ega", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "hdc", false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + pc_kbdc.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, m_ram).set_default_size("3712K"); +} + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +//************************************************************************** +// IBM systems +//************************************************************************** +ROM_START( ibm5170 ) + ROM_REGION16_LE(0x20000, "bios", 0) // - IBM 5170, 6 Mhz, one wait state RAM or 8 Mhz, one wait state RAM + + ROM_SYSTEM_BIOS( 0, "rev1", "IBM PC/AT 5170 01/10/84") + ROMX_LOAD( "6181028.u27", 0x10000, 0x8000, CRC(f6573f2a) SHA1(3e52cfa6a6a62b4e8576f4fe076c858c220e6c1a), ROM_SKIP(1) | ROM_BIOS(0)) /* T 6181028 8506AAA // TMM23256P-5878 // (C)IBM CORP 1981,-1984 */ + ROMX_LOAD( "6181029.u47", 0x10001, 0x8000, CRC(7075fbb2) SHA1(a7b885cfd38710c9bc509da1e3ba9b543a2760be), ROM_SKIP(1) | ROM_BIOS(0)) /* T 6181029 8506AAA // TMM23256P-5879 // (C)IBM CORP 1981,-1984 */ + + ROM_SYSTEM_BIOS( 1, "rev2", "IBM PC/AT 5170 06/10/85") /* Another verification of these crcs would be nice */ + ROMX_LOAD( "6480090.u27", 0x10000, 0x8000, CRC(99703aa9) SHA1(18022e93a0412c8477e58f8c61a87718a0b9ab0e), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "6480091.u47", 0x10001, 0x8000, CRC(013ef44b) SHA1(bfa15d2180a1902cb6d38c6eed3740f5617afd16), ROM_SKIP(1) | ROM_BIOS(1)) + + ROM_SYSTEM_BIOS( 2, "landmark", "Landmark/Supersoft diagnostic ROMs") // use Hercules or MDA + ROMX_LOAD( "5170_even_u27_ 27256.bin", 0x10000, 0x8000, CRC(6790392d) SHA1(c4a5310341f346dd072d096152060ef5e4430a7f), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "5170_odd_u47_ 27256.bin", 0x10001, 0x8000, CRC(4c0f3db4) SHA1(97a0cf589b93551ed1d03bd622cbc8fd5634512f), ROM_SKIP(1) | ROM_BIOS(2)) + +// ROM_SYSTEM_BIOS( 3, "atdiag", "IBM PC/AT 5170 w/Super Diagnostics") +// ROMX_LOAD( "atdiage.bin", 0xf8000, 0x4000, CRC(e8855d0c) SHA1(c9d53e61c08da0a64f43d691bf6cadae5393843a), ROM_SKIP(1) | ROM_BIOS(3)) +// ROMX_LOAD( "atdiago.bin", 0xf8001, 0x4000, CRC(606fa71d) SHA1(165e45bae7ae2da274f1e645c763c5bfcbde027b), ROM_SKIP(1) | ROM_BIOS(3)) + + /* Mainboard PALS */ + ROM_REGION( 0x2000, "pals", 0 ) + ROM_LOAD( "1501824_717750.mmipal14l4.u87.jed", 0x0000, 0x02E7, CRC(3c819a27) SHA1(d2f4889e628dbbef50b7f48cb1d1a313232bacc8)) /* MMI 1501824 717750 // (C)1983 IBM(M) */ + ROM_LOAD( "1503135_705075.mmipal14l4.u130.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 705075 // (C) IBM CORP 83 */ + /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ + ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ + + /* Mainboard PROMS */ + ROM_REGION( 0x2000, "proms", 0 ) + ROM_LOAD( "1501814.82s123an.u115", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8713 // SK-D 1501814 */ + ROM_LOAD( "55x8041.82s147an.u72", 0x0020, 0x0200, CRC(f2cc4fe6) SHA1(e285468516bd05083155a8a272583deef655315a)) /* S N82S147AN 8709 // V-C55X8041 */ +ROM_END + +ROM_START( ibm5170a ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS( 0, "rev3", "IBM PC/AT 5170 11/15/85") + ROMX_LOAD( "61x9266.u27", 0x10000, 0x8000, CRC(4995be7a) SHA1(8e8e5c863ae3b8c55fd394e345d8cca48b6e575c), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "61x9265.u47", 0x10001, 0x8000, CRC(c32713e4) SHA1(22ed4e2be9f948682891e2fd056a97dbea01203c), ROM_SKIP(1) | ROM_BIOS(0)) + + ROM_SYSTEM_BIOS( 1, "3270at", "IBM 3270 PC/AT 5281 11/15/85") /* pretty much just a part string and checksum change from the 5170 rev3 */ + ROMX_LOAD( "62x0820.u27", 0x10000, 0x8000, CRC(e9cc3761) SHA1(ff9373c1a1f34a32fb6acdabc189c61b01acf9aa), ROM_SKIP(1) | ROM_BIOS(1)) /* T 62X0820-U27 8714HAK // TMM23256P-6746 // (C)IBM CORP 1981,-1985 */ + ROMX_LOAD( "62x0821.u47", 0x10001, 0x8000, CRC(b5978ccb) SHA1(2a1aeb9ae3cd7e60fc4c383ca026208b82156810), ROM_SKIP(1) | ROM_BIOS(1)) /* T 62X0821-U47 8715HAK // TMM23256P-6747 // (C)IBM CORP 1981,-1985 */ + + /* Mainboard PALS */ + ROM_REGION( 0x2000, "pals", 0 ) + ROM_LOAD( "1501824_717750.mmipal14l4.u87.jed", 0x0000, 0x02E7, CRC(3c819a27) SHA1(d2f4889e628dbbef50b7f48cb1d1a313232bacc8)) /* MMI 1501824 717750 // (C)1983 IBM(M) */ + ROM_LOAD( "1503135_705075.mmipal14l4.u130.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 705075 // (C) IBM CORP 83 */ /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ + ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ + + /* Mainboard PROMS */ + ROM_REGION( 0x2000, "proms", 0 ) + ROM_LOAD( "1501814.82s123an.u115", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8713 // SK-D 1501814 */ + ROM_LOAD( "55x8041.82s147an.u72", 0x0020, 0x0200, CRC(f2cc4fe6) SHA1(e285468516bd05083155a8a272583deef655315a)) /* S N82S147AN 8709 // V-C55X8041 */ +ROM_END + + +ROM_START( ibm5162 ) //MB p/n 62x1168 - IBM 5162, 6 Mhz, zero wait state RAM + ROM_REGION16_LE(0x20000, "bios", 0) + + ROM_LOAD16_BYTE( "78x7460.u34", 0x10000, 0x8000, CRC(1db4bd8f) SHA1(7be669fbb998d8b4626fefa7cd1208d3b2a88c31)) /* 78X7460 U34 // (C) IBM CORP // 1981-1986 */ + ROM_LOAD16_BYTE( "78x7461.u35", 0x10001, 0x8000, CRC(be14b453) SHA1(ec7c10087dbd53f9c6d1174e8f14212e2aec1818)) /* 78X7461 U35 // (C) IBM CORP // 1981-1986 */ + + /* Mainboard PALS */ + ROM_REGION( 0x2000, "pals", 0 ) + ROM_LOAD( "59x7599.mmipal20l8.u27.jed", 0x0000, 0x02E7, NO_DUMP) /* MMI PAL20L8ACN5 8631 // N59X7599 IBM (C)85 K3 */ + ROM_LOAD( "1503135.mmipal14l4.u81.jed", 0x02E7, 0x02E7, CRC(aac77198) SHA1(b318da3a1fbe5402836c1b548e231e0794d0c032)) /* MMI 1503135 8625 // (C) IBM CORP 83 */ + /* P/N 6320947 Serial/Parallel ISA expansion card PAL */ + ROM_LOAD( "1503085.mmipal.u14.jed", 0x1000, 0x0800, NO_DUMP) /* MMI 1503085 8449 // (C) IBM CORP 83 */ /* Not sure of type */ + + /* Mainboard PROMS */ + ROM_REGION( 0x2000, "proms", 0 ) + ROM_LOAD( "1501814.82s123an.u72", 0x0000, 0x0020, CRC(849c9217) SHA1(2955ae1705c3b59170f1373f99b3ea5c174c4544)) /* N82S123AN 8623 // SK-U 1501814 */ + ROM_LOAD( "59x7594.82s147an.u90", 0x0020, 0x0200, NO_DUMP) /* S N82S147AN 8629 // VCT 59X7594 */ +ROM_END + + +// According to http://nerdlypleasures.blogspot.com/2014/04/the-original-8-bit-ide-interface.html +// the IBM PS/1 Model 2011 use a customised version of the XTA (8-bit IDE) harddisk interface + +// https://en.wikipedia.org/wiki/IBM_PS/1 +// http://ps-2.kev009.com/pcpartnerinfo/ctstips/937e.htm +// https://ps1stuff.wordpress.com/documentation/ibm-ps1-model-2011/ +// https://barotto.github.io/IBMulator/#download + +ROM_START( ibm2011 ) + ROM_REGION16_LE( 0x40000, "bios", 0) + // Spanish version + ROM_SYSTEM_BIOS( 0, "2011es", "IBM PS/1 2011 ES") + ROMX_LOAD( "ibm_1057757_24-05-90.bin", 0x00000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "ibm_1057757_29-15-90.bin", 0x00001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(0)) + // US version + ROM_SYSTEM_BIOS( 1, "2011us", "IBM PS/1 2011 US") // constant resets + ROMX_LOAD( "1057754.bin", 0x00000, 0x20000, CRC(648a6a61) SHA1(6cebaf9f2431e67fea37f34b06916264d6737ab6), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "1057756.bin", 0x00001, 0x20000, CRC(862f94ac) SHA1(1eba7fa20301403db7c4f53032267902191ea2c7), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +ROM_START( ibm2011rd ) // these international versions were shipped with DOS in a ROM disk and require a different memory map, they don't yet load properly + ROM_REGION16_LE( 0x80000, "bios", 0) + // Swedish version + ROM_SYSTEM_BIOS( 0, "2011se", "IBM PS/1 2011 SE") + ROMX_LOAD( "ibm2011se_f80000.bin", 0x00000, 0x40000, CRC(1b90693b) SHA1(2cdcfda55fea25a991c1568ff398d97c5e07e96d), ROM_BIOS(0)) + ROMX_LOAD( "ibm2011se_fc0000.bin", 0x40000, 0x40000, CRC(ef7aa453) SHA1(993dd6e17c6fd5c2ef513d94383f36b1929d1936), ROM_BIOS(0)) + // Portuguese version + ROM_SYSTEM_BIOS( 1, "2011pt", "IBM PS/1 2011 PT") + ROMX_LOAD( "u18_x1_1057451.bin", 0x00000, 0x20000, CRC(0484e15d) SHA1(39fb05843c8371f4b716679e6ce512bcf5a05dac), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "u36_x4_1057449.bin", 0x00001, 0x20000, CRC(23d7e4fe) SHA1(9c89efa61fc77485b65fff9133d6a19caca553e9), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "u23_x2_1057757.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "u28_x3_1057759.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(1)) + // German version + ROM_SYSTEM_BIOS( 2, "2011de", "IBM PS/1 2011 DE") + ROMX_LOAD( "x1_1057866_u10.bin", 0x00000, 0x20000, CRC(ef0f0bb4) SHA1(d1e4c081f1a74732eb6e37a3bfb9403819b7d891), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "x4_1057864_u36.bin", 0x00001, 0x20000, CRC(16d357ff) SHA1(6521b160bf0dd05b890ad197d9c9359d806da18a), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "x2_1057757_u23.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "x3_1057759_u28.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(2)) + // Italian version + ROM_SYSTEM_BIOS( 3, "2011it", "IBM_PS/1 2011 IT") + ROMX_LOAD( "x1-1057630-u18.bin", 0x00000, 0x20000, CRC(3843830c) SHA1(68b2f443b6ceadbc94a725fe66ad9c9685490dcb), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "x4-1057628-u36.bin", 0x00001, 0x20000, CRC(1ddf3afb) SHA1(da55abaf4f775e2e3efdd952beb9f97769e3cac3), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "x2_1057757_u23.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "x3_1057759_u28.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(3)) + // UK version + ROM_SYSTEM_BIOS( 4, "2011uk", "IBM_PS/1 2011 UK") + ROMX_LOAD( "u18_x1.bin", 0x00000, 0x20000, CRC(029c4d8a) SHA1(bf2f56ac2e03098144b3dcc34f7daa09c8e08288), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "u36_x4.bin", 0x00001, 0x20000, CRC(bf6c5631) SHA1(68cbff7e229cd77ae8c2e8835dbb9b3047f41e4c), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "u23_x2.bin", 0x40000, 0x20000, CRC(c8f81ea4) SHA1(925ed0e98f9f2997cb86554ef384bcfaf2a4ecbe), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "u28_x3.bin", 0x40001, 0x20000, CRC(c2dd6b5c) SHA1(f6b5785002dd628b6b1fb3bb101e076299eba3b6), ROM_SKIP(1) | ROM_BIOS(4)) +ROM_END + +// From Wikipedia: +// Model MB FRU CPU ISA Sl. RAM VRAM Hard-Drive Serial/Modem +// 2121-C42 92F9690 Intel 80386SX @ 16 MHz 0 2 MB 256KB 95F4720 40MB IDE 2400 baud modem +// 2121-B82 92F9690 Intel 80386SX @ 16 MHz 2 2 MB 256KB 92F9943 80MB IDE 2400 baud modem +// 2121-C92 Intel 80386SX @ 16 MHz 0 2 MB 256KB 129MB IDE 2400 baud modem +// 2121-G42 Intel 80386SX @ 20 MHz 0 2 MB 256KB 40MB IDE 2400 baud modem +// 2121-A82 Intel 80386SX @ 20 MHz 2 2 MB 256KB 40MB IDE 2400 baud modem +// 2121-S92 Intel 80386SX @ 20 MHz 0 2 MB 256KB 129MB IDE 2400 baud modem +// 2121-M82 Intel 80386SX @ 20 MHz 2 2 MB 256KB 80MB IDE 2400 baud modem +// 2121-A62 2 256KB 56F8863 160MB IDE 2400 baud modem +// 2121-A92 256KB serial port +// 2121-A94 Intel 80386SX @ 20 MHz 2 6 MB 256KB 129MB IDE 2400 baud modem + +ROM_START( ibm2121 ) + ROM_REGION16_LE( 0x40000, "bios", 0) + ROM_SYSTEM_BIOS( 0, "2121", "IBM PS/1 2121" ) + ROMX_LOAD( "fc0000.bin", 0x00000, 0x40000, CRC(96bbaf52) SHA1(8737d805444837023a58702279f8fe6e7f08e7ba), ROM_BIOS(0)) + ROM_SYSTEM_BIOS( 1, "2121us", "IBM PS/1 2121 US" ) + ROMX_LOAD( "ibm2121us_fc0000.bin", 0x00000, 0x40000, CRC(817aad71) SHA1(43b7b84390fcc081a946cdb4bdce4ba7a4a88074), ROM_BIOS(1)) +ROM_END + +ROM_START( ibm2121rd ) // international versions shipped with ROM DOS, need a different memory map at least + ROM_REGION16_LE( 0x80000, "bios", 0) + ROM_SYSTEM_BIOS( 0, "2121sp", "IBM PS/1 2121 Spanish" ) + ROMX_LOAD( "ibm2121sp_f80000.bin", 0x00000, 0x40000, CRC(90505c4b) SHA1(59becaec25644820a78464d66e472a8a225d94cc), ROM_BIOS(0)) + ROMX_LOAD( "ibm2121sp_fc0000.bin", 0x40000, 0x40000, CRC(f83fac75) SHA1(a42b1b9465983392eaa0159d4bfc30620a7af499), ROM_BIOS(0)) + ROM_SYSTEM_BIOS( 1, "2121fr", "IBM PS/1 2121 French" ) + ROMX_LOAD( "ibm2121fr_f80000.bin", 0x00000, 0x40000, CRC(9c6de65d) SHA1(6b219c9480a06bc9218e8212acc7cfd1ceaccd4b), ROM_BIOS(1)) + ROMX_LOAD( "ibm2121fr_fc0000.bin", 0x40000, 0x40000, CRC(f83fac75) SHA1(a42b1b9465983392eaa0159d4bfc30620a7af499), ROM_BIOS(1)) +ROM_END + +// http://ps-2.kev009.com/pcpartnerinfo/ctstips/937e.htm +ROM_START( ibm2123 ) + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD( "ps1_2123_87f4794_rom.bin", 0x00000, 0x20000, CRC(64f921b8) SHA1(e1856bf3dd3ce21f44078aeca1f58c491b202ad2)) +ROM_END + +// From Wikipedia: +// 2133 Desktop case. The 3x3 references the available slots and drive bays. +// 2155 Desktop case larger than 2133. The 5x5 references the available slots and drive bays. Including a 5.25" bay. +// 2168 Tower unit. The 6x8 references the available slots and bays. Including 5.25" bays. +// Model MB FRU CPU RAM SIMM Video chip VRAM Hard-Drive Notes +// 2133-711 93F2397 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM 256KB 59G9567 85MB IDE +// 2133-811 Intel 80386SX @ 25 MHz 4 MB 85MB IDE +// 2133-13 ??? Intel 80386SX @ 25 MHz 2 MB 2x72 Pin FPM 256KB +// 2133-W13 Intel 80386SX @ 25 MHz 2 MB 129MB IDE +// 2133-13T 65G3766 Intel 80486SX @ 25 MHz 4 MB 2×72 Pin FPM 256KB 93F2329 129MB IDE +// 2133-?43 34G1885 Intel 80486SX @ 20 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE +// 2133-?50 34G1848 Intel 80486SX @ 25 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE +// 2133-?53 34G1848 Intel 80486SX @ 25 MHz 4 MB 2×30 Pin FPM 512KB 93F2329 129MB IDE +// 2133-652 Intel 80486SX @ 33 MHz 4 MB 4×72 Pin FPM Cirrus CL-GD5424 512KB 84G3927 171MB IDE +// 2133-575 Intel 80486DX @ 33 MHz 4 MB 4×72 Pin FPM 512KB 170MB IDE +// 2133-594 Intel 80486DX2 @66 MHz 4 MB 4×72 Pin FPM 512KB 253MB IDE +// 2133-E11 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM Cirrus CL-GD5424 512 KB 85MB IDE Canada models, English model +// 2133-F11 Intel 80386SX @ 25 MHz 2 MB 2×72 Pin FPM Cirrus CL-GD5424 512 KB 85MB IDE Canada models, French model +// 2133-E43 Intel 80486SX @ 20 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, English model +// 2133-F43 Intel 80486SX @ 20 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, French model +// 2133-E53 Intel 80486SX @ 25 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, English model +// 2133-F53 Intel 80486SX @ 25 MHz 2 MB 8×30 Pin FPM Tseng ET4000 512KB 129MB IDE Canada models, French model + +ROM_START( ibm2133 ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "ps1_2133_52g2974_rom.bin", 0x00000, 0x20000, CRC(89fc7600) SHA1(758e161353f6781c39ac67f1ba293c14038b17dc)) +ROM_END + + +//************************************************************************** +// Apricot systems +// +// http://bbs.actapricot.org/files/ , http://insight.actapricot.org/insight/products/main.htm +// +//************************************************************************** + +// Apricot XEN-S (Venus I Motherboard 286) +// BIOS-String: apricot / Phoenix ROM BIOS PLUS Version 3.10.17 / Apricot XEN-S 25th June 1992 +// Gate A20 failure - MAME message: char SEL checker, contact MAMEdev +ROM_START( xb42639 ) + /* actual VGA BIOS not dumped*/ + ROM_REGION16_LE(0x20000, "bios", 0) + // XEN-S (Venus I Motherboard) + ROM_LOAD16_BYTE( "3-10-17i.lo", 0x10000, 0x8000, CRC(3786ca1e) SHA1(c682d7c76f234559d03bcf21010c13c4dbeafb69)) + ROM_LOAD16_BYTE( "3-10-17i.hi", 0x10001, 0x8000, CRC(d66710eb) SHA1(e8c1cd5f9ecfbd8825655e416d7ddf2ae362e69b)) +ROM_END + +// Apricot XEN-S (Venus II Motherboard 286) +// BIOS-String: apricot XEN-S Series Personal Computer / Phoenix ROM BIOS PLUS Version 3.10.04 / XEN-S II BIOS VR 1.2.17 16th October 1990 +// Gate A20 failure +ROM_START( xb42639a ) + /* actual VGA BIOS not dumped*/ + ROM_REGION16_LE(0x20000, "bios", 0) + // XEN-S (Venus II Motherboard) + ROM_LOAD16_BYTE( "10217.lo", 0x10000, 0x8000, CRC(ea53406f) SHA1(2958dfdbda14de4e6b9d6a8c3781131ab1e32bef)) + ROM_LOAD16_BYTE( "10217.hi", 0x10001, 0x8000, CRC(111725cf) SHA1(f6018a45bda4476d40c5881fb0a506ff75ec1688)) +ROM_END + +// Apricot XEN-S (Venus I Motherboard 386) +// BIOS-String: apricot / Phoenix ROM BIOS PLUS Version 3.10.17 / Apricot XEN-S 25th June 1992 +// MAME message: char SEL checker, contact MAMEdev +ROM_START( xb42664 ) + /* actual VGA BIOS not dumped */ + ROM_REGION32_LE(0x20000, "bios", 0) + // XEN-S (Venus I Motherboard) + ROM_LOAD16_BYTE( "3-10-17i.lo", 0x10000, 0x8000, CRC(3786ca1e) SHA1(c682d7c76f234559d03bcf21010c13c4dbeafb69)) + ROM_LOAD16_BYTE( "3-10-17i.hi", 0x10001, 0x8000, CRC(d66710eb) SHA1(e8c1cd5f9ecfbd8825655e416d7ddf2ae362e69b)) +ROM_END + +// Apricot XEN-S (Venus II Motherboard 386) +// BIOS-String: apricot XEN-S Series Personal Computer / Phoenix ROM BIOS PLUS VERSION 3.10.04 / XEN-S II BIOS VR 1.2.17 16th October 1990 +ROM_START( xb42664a ) + /* actual VGA BIOS not dumped*/ + ROM_REGION32_LE(0x20000, "bios", 0) + // XEN-S (Venus II Motherboard) + ROM_LOAD16_BYTE( "10217.lo", 0x10000, 0x8000, CRC(ea53406f) SHA1(2958dfdbda14de4e6b9d6a8c3781131ab1e32bef)) + ROM_LOAD16_BYTE( "10217.hi", 0x10001, 0x8000, CRC(111725cf) SHA1(f6018a45bda4476d40c5881fb0a506ff75ec1688)) +ROM_END + +// Apricot Qi 300 (Rev D,E & F Motherboard) - no display +ROM_START( xb42663 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "qi310223.lo", 0x00000, 0x10000, CRC(53047f49) SHA1(7b38e533f7f27295269549c63e5477d950239167)) + ROM_LOAD16_BYTE( "qi310223.hi", 0x00001, 0x10000, CRC(4852869f) SHA1(98599d4691d40b3fac2936034c70b386ce4caf77)) +ROM_END + +// Apricot Qi 600 (Neptune Motherboard) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) +ROM_START( qi600 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "qi610223.lo", 0x00000, 0x10000, CRC(563114a9) SHA1(62932b3bf0b5502ff708f604c21773f00afda58e)) + ROM_LOAD16_BYTE( "qi610223.hi", 0x00001, 0x10000, CRC(0ae133f6) SHA1(6039c366f7fe0ebf60b34c1a7d6b2d781b664001)) +ROM_END + +// Apricot Qi 900 (Scorpion Motherboard) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) +ROM_START( qi900 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "qi910224.lo", 0x00000, 0x10000, CRC(b012ad3c) SHA1(807e788a6bd03f5e983fe503af3d0b202c754b8a)) + ROM_LOAD16_BYTE( "qi910224.hi", 0x00001, 0x10000, CRC(36e66d56) SHA1(0900c5272ec3ced550f18fb08db59ab7f67a621e)) +ROM_END + +// Apricot FTs (Scorpion) - no display, beep code L-1-1-3 (Extended CMOS RAM failure) +ROM_START( ftsserv ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "fts10226.lo", 0x00000, 0x10000, CRC(efbd738f) SHA1(d5258760bafdaf1bf13c4a49da76d4b5e7b4ccbd)) + ROM_LOAD16_BYTE( "fts10226.hi", 0x00001, 0x10000, CRC(2460853f) SHA1(a6bba8d2f800140afd129c4d5278f7ae8fe7e63a)) + /* FT Server series Front Panel */ + ROM_REGION(0x10000,"front", 0) + ROM_LOAD( "fp10009.bin", 0x0000, 0x8000, CRC(8aa7f718) SHA1(9ee6c6a5bb92622ea8d3805196d42ff68887d820)) +ROM_END + +// Apricot XEN-LS (Venus IV Motherboard) - no display +ROM_START( apxenls3 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "31020.lo", 0x10000, 0x8000, CRC(a19678d2) SHA1(d13c12fa7e94333555eabf58b81bad421e21cd91)) + ROM_LOAD16_BYTE( "31020.hi", 0x10001, 0x8000, CRC(4922e020) SHA1(64e6448323dad2209e004cd93fa181582e768ed5)) +ROM_END + +// Apricot LANstation (Krypton Motherboard) - no display +ROM_START( aplanst ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "31024", "Bios 3-10-24") + ROMX_LOAD( "31024.lo", 0x10000, 0x8000, CRC(e52b59e1) SHA1(cfcaa4d8d658df8df463108ef30695bd4ee7a617), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "31024.hi", 0x10001, 0x8000, CRC(7286aefa) SHA1(dfc0e3f4936780fa62ae9ec392ce17aa65e717cd), ROM_SKIP(1) | ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "31025", "Bios 3-10-25") + ROMX_LOAD( "31025.lo", 0x10000, 0x8000, CRC(1aec09bc) SHA1(51d56c97c7c1674554aa89b68945329ea967a8bc), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "31025.hi", 0x10001, 0x8000, CRC(0763caa5) SHA1(48510a933dcd6efea3b14d04444f584c3e6fefeb), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "31026", "Bios 3-10-26i") + ROMX_LOAD( "31026i.lo", 0x10000, 0x8000, CRC(670b6ab4) SHA1(8d61a0edf187f99b67eb58f5e11276deee801d17), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "31026i.hi", 0x10001, 0x8000, CRC(ef01c54f) SHA1(911f95d65ab96878e5e7ebccfc4b329db47a1351), ROM_SKIP(1) | ROM_BIOS(2)) +ROM_END + +// Apricot LANstation (Novell Remote Boot) - no display +ROM_START( aplannb ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "lsl31025.lo", 0x00000, 0x10000, CRC(8bb7229b) SHA1(31449d12884ec4e7752e6c1ce7ce9e0d044eadf2)) + ROM_LOAD16_BYTE( "lsh31025.hi", 0x00001, 0x10000, CRC(09e5c1b9) SHA1(d42be83b4181d3733268c29df04a4d2918370f4e)) +ROM_END + +// Apricot VX FT server - no display +ROM_START( apvxft ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "ft10221.lo", 0x00000, 0x10000, CRC(8f339de0) SHA1(a6542406746eaf1ff7f9e3678c5cbe5522fb314a)) + ROM_LOAD16_BYTE( "ft10221.hi", 0x00001, 0x10000, CRC(3b16bc31) SHA1(0592d1d81e7fd4715b0612083482db122d78c7f2)) +ROM_END + +// Apricot LS Pro (Caracal Motherboard,Chipset: VLSI VL82C483, ROM: 256KB Flash ROM, PCMCIA Type 2/3 slots) +ROM_START( aplscar ) + ROM_REGION32_LE(0x40000, "bios", 0) + // 0: MAME exits with "Fatal error: i386: Called modrm_to_EA with modrm value C8!" + ROM_SYSTEM_BIOS(0, "car306", "Caracal 3.06") + ROMX_LOAD( "car306.bin", 0x00000, 0x40000, CRC(fc271dea) SHA1(6207cfd312c9957243b8157c90a952404e43b237), ROM_BIOS(0)) + // 1: no display + ROM_SYSTEM_BIOS(1, "car307", "Caracal 3.07") + ROMX_LOAD( "car307.bin", 0x00000, 0x40000, CRC(66a01852) SHA1(b0a68c9d67921d27ba483a1c50463406c08d3085), ROM_BIOS(1)) +ROM_END + +// Apricot XEN PC (A1 Motherboard) - no display +ROM_START( apxena1 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "a1-r26.bin", 0x00000, 0x20000, CRC(d29e983e) SHA1(5977df7f8d7ac2a154aa043bb6f539d96d51fcad)) +ROM_END + +// Apricot XEN PC (P2 Motherboard, Chipset: M1429G/31, ROM: 128KB Flash ROM, on board: graphics Cirrus Logic GD5434 (via VL)) +ROM_START( apxenp2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: ACR97E00-M00-951005-R02-G2 / BIOS V2.0 - Keyboard Interface Error - Pointing DeviceInterface Error + // after a while the boot continues to the message "Password Violated, System Halted !" + ROM_SYSTEM_BIOS(0, "p2r02g2", "p2r02g2") + ROMX_LOAD( "p2r02g2.bin", 0x00000, 0x20000, CRC(311bcc5a) SHA1(be6fa144322077dcf66b065e7f4e61aab8c278b4), ROM_BIOS(0)) + // 1: BIOS-String: ACR97E00-M00-951005-R01-F0 / BIOS V2.0 (error messages as above) + ROM_SYSTEM_BIOS(1, "lep121s", "SCSI-Enabling ROMs") + ROMX_LOAD("p2r01f0.bin", 0x00000, 0x20000, CRC(bbc68f2e) SHA1(6954a52a7dda5521794151aff7a04225e9c7df77), ROM_BIOS(1)) +ROM_END + +// Apricot XEN-i 386 (Leopard Motherboard) +ROM_START( apxeni ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Phoenix 80386 ROM BIOS PLUS Version 1.10.01 / XEN-i 386 Business Microcomputer / VR 1.2.1 22nd July 1988 + ROM_SYSTEM_BIOS(0, "lep121", "Rom Bios 1.2.1") + ROMX_LOAD( "lep121.bin", 0x18000, 0x8000, CRC(948c1927) SHA1(d06bdbd6292db73c815ad1060daf055293dfddf5), ROM_BIOS(0)) + // 1: Phoenix 80386 ROM BIOS PLUS Version 1.10.01 / XEN-i 386 Business Microcomputer / VR 1.2.1 22nd January 1991 + ROM_SYSTEM_BIOS(1, "lep121s", "SCSI-Enabling ROMs") + ROMX_LOAD( "lep121s.bin", 0x18000, 0x8000, CRC(296118e4) SHA1(d1feaa9704e6ce3bc10c900bdd310d9494b02304), ROM_BIOS(1)) +ROM_END + +// Apricot LS Pro (Bonsai Motherboard, on board: ethernet (Intel 82596), Chipset: VLSI SCAMP VL82C311 / VL82C333, ROM: 128KB) +ROM_START( aplsbon ) + ROM_REGION32_LE(0x20000 ,"bios", 0) + // 0: BIOS-String: Phoenix BIOS A486 Version 1.01 / LS Pro BIOS Version 1.06, 4th July 1994 - Pointer device failure + ROM_SYSTEM_BIOS(0, "bon106", "Bonsai 1-06") + ROMX_LOAD( "bon106.bin", 0x00000, 0x20000, CRC(98a4eb76) SHA1(e0587afa78aeb9a8803f9b9f9e457e9847b0a2b2), ROM_BIOS(0)) + // 1: flashing screen + ROM_SYSTEM_BIOS(1, "bon203", "Bonsai 2-03") + ROMX_LOAD( "bon203.bin", 0x00000, 0x20000, CRC(32a0e125) SHA1(a4fcbd76952599993fa8b76aa36a96386648abb2), ROM_BIOS(1)) + // 2: BIOS-String: Phoenix BIOS A486 Version 1.01 / LS Pro BIOS Version 1.07.03, 2nd February 1995 + ROM_SYSTEM_BIOS(2, "bon10703", "Bonsai 1-07-03") + ROMX_LOAD( "bon10703.bin", 0x00000, 0x20000, CRC(0275b3c2) SHA1(55ef4cbb7f3166f678aaa478234a42049deaba5f), ROM_BIOS(2)) + // 3: flashing screen + ROM_SYSTEM_BIOS(3, "bon20402", "Bonsai 2.03") + ROMX_LOAD( "bon20402.bin", 0x00000, 0x20000, CRC(ac5803fb) SHA1(b8fe92711c6a38a5d9e6497e76a0929c1685c631), ROM_BIOS(3)) +ROM_END + +// Apricot XEN-LS II (Samurai Motherboard, on board: CD-ROM, graphics, ethernet (Intel 82596), Chipset: VLSI 82C425, VLSI 82C486) +ROM_START( apxlsam ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "sam107", "ROM BIOS Version 1-07") + ROMX_LOAD( "sam1-07.bin", 0x00000, 0x20000, CRC(65e05a8e) SHA1(c3cd198a129122cb05a28798e54331b06cfdd310), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "sam206", "ROM BIOS Version 2-06") + ROMX_LOAD( "sam2-06.bin", 0x00000, 0x20000, CRC(9768bb0f) SHA1(8166b77b133072f72f23debf85984eb19578ffc1), ROM_BIOS(1)) +ROM_END + +// Apricot FTs (Panther Rev F 1.02.26) +ROM_START( aprpand ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "pf10226.std", 0x00000, 0x10000, CRC(7396fb87) SHA1(a109cbad2179eec55f86c0297a59bb015461da21)) + ROM_CONTINUE( 0x00001, 0x10000 ) +ROM_END + +// Apricot FT//ex 486 (J3 Motherboard, Chipset: Opti 82C696) +ROM_START( aprfte ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "1-2r2-4.486", 0x00000, 0x20000, CRC(bccc236d) SHA1(0765299363e68cf65710a688c360a087856ece8f)) +ROM_END + + +//************************************************************************** +// Amstrad systems +//************************************************************************** + +// Amstrad MegaPC +ROM_START( megapc ) + ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) + ROM_REGION(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "41651-bios lo.u18", 0x00000, 0x10000, CRC(1e9bd3b7) SHA1(14fd39ec12df7fae99ccdb0484ee097d93bf8d95)) + ROM_LOAD16_BYTE( "211253-bios hi.u19", 0x00001, 0x10000, CRC(6acb573f) SHA1(376d483db2bd1c775d46424e1176b24779591525)) +ROM_END + +// Amstrad MegaPC Plus +ROM_START( megapcpl ) + ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) + ROM_REGION(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "41652.u18", 0x00000, 0x10000, CRC(6f5b9a1c) SHA1(cae981a35a01234fcec99a96cb38075d7bf23474)) + ROM_LOAD16_BYTE( "486slc.u19", 0x00001, 0x10000, CRC(6fb7e3e9) SHA1(c439cb5a0d83176ceb2a3555e295dc1f84d85103)) +ROM_END + +// Amstrad MegaPC Plus (Winbond chipset) +ROM_START( megapcpla ) + ROM_REGION32_LE(0x40000, "bios", 0) + ROM_LOAD( "megapc_bios.bin", 0x00000, 0x10000, CRC(b84938a2) SHA1(cecab72a96993db4f7c648c229b4211a8c53a380)) + ROM_CONTINUE(0x30000, 0x10000) +ROM_END + +// Amstrad PC2386 +ROM_START( pc2386 ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "c000.bin", 0x00000, 0x4000, CRC(33145bbf) SHA1(c49eaec19f656482e12c8bf282cd4ee5986d227d) ) + ROM_LOAD( "f000.bin", 0x30000, 0x10000, CRC(f54a063c) SHA1(ce70ec493053afab662f51199ef9c9304a209b8e) ) + ROM_FILL(0x3fff1, 1, 0x5b) // f000:e05b is the standard at reset vector jump address + ROM_FILL(0x3fff2, 1, 0xe0) // why does this rom's point to nowhere sane? + ROM_FILL(0x3fff3, 1, 0x00) // and why does the rest of the rom look okay? + ROM_FILL(0x3fff4, 1, 0xf0) + + ROM_REGION( 0x1000, "keyboard", 0 ) // PC2286 / PC2386 102-key keyboard + ROM_LOAD( "40211.ic801", 0x000, 0x1000, CRC(4440d981) SHA1(a76006a929f26c178e09908c66f28abc92e7744c) ) +ROM_END + + +//************************************************************************** +// Commodore systems +//************************************************************************** + +// Commodore Laptop C286-LT - screen remains blank - CPU: AMD N80C286-12 - Chipset: OAK OTI054 (J9105), OTI055 (FOY 107), OTI053 (J9105), OTI051(J9107) +ROM_START( c286lt ) + ROM_REGION16_LE(0x20000, "bios", 0) // BIOS contains Cirrus Logic VGA firmware, rebadged Sanyo MBC-17NB + ROM_SYSTEM_BIOS(0, "c286lt13", "C286-LT V1.3") + ROMX_LOAD( "cbm-c286lt-bios-v1.3-390854-01-1200.bin", 0x00000, 0x20000, CRC(785e87d2) SHA1(e271500169955473d44102a60f051b5f6cfae589), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "c286v17-854", "C286-LT V1.7 390854") + ROMX_LOAD( "cbm-c286lt-bios-v1.7-390854-04.bin", 0x00000, 0x20000, CRC(2f762ab1) SHA1(d6cb37f0dcb261df86c01d4e1eabe10a52b2070f), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "c286v17-940", "C286-LT V1.7 390940") + ROMX_LOAD( "cbm-c286lt-bios-v1.7-390940-04.bin", 0x00000, 0x20000, CRC(22d45839) SHA1(bc7159440c52c1f69957da8fdfa76ac0a42ebd16), ROM_BIOS(2)) +ROM_END + +// Commodore SL 286-16 - this is the wider one, the "slimline model" has only two ISA slots on a riser, an online OTI VGA and a Headland chipset +ROM_START( csl286 ) // continuous short beeps after POST - Chipset is marked "Chips", one IC is P82C212B-12 (16MHz) - system has a WDC VGA card + ROM_REGION16_LE(0x20000, "bios", 0) // one ISA slot with a riser providing five slots - is or is similar to a DTK PTM 1661c + ROM_LOAD16_BYTE( "cbm-sl286-16-bios-lo-v1.02-390958-03.bin", 0x10000, 0x8000, CRC(7d0c9472) SHA1(1d614f6835a388f67ece73f40d8a9f65cca3e855)) + ROM_LOAD16_BYTE( "cbm-sl286-16-bios-hi-v1.02-390959-03.bin", 0x10001, 0x8000, CRC(b6d81ddd) SHA1(9478bb846bd1e0dc1904f21d43c6df01ecbc9c83)) +ROM_END + +// Commodore SL 386SX +ROM_START( c386sx16 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // actual VGA BIOS not dumped - uses a WD Paradise according to http://www.cbmhardware.de/pc/pc.php + // complains "Time-of-day clock stopped" + // photos of the system show one ISA16 slot for a riser card, an Acumos AVGA2 chip, a VLSI 82C311 IC, one other VLSI and an Acer chip. + ROM_SYSTEM_BIOS(0, "c386sxv100", "SL 386SX V1.00") // Commodore 80386SX BIOS Rev. 1.00 - 390914-01/390915-01 - continuous beeps after POST + ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.0-390914-01.bin", 0x10000, 0x8000, CRC(03e00583) SHA1(8be8478cabd9de3d547a08207ffdcd39bf1bcd94), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.0-390915-01.bin", 0x10001, 0x8000, CRC(cbe31594) SHA1(d6ace0b5ae4a0f63d047c2918210188f4c77c0c0), ROM_SKIP(1) | ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "c386sxv101", "SL 386SX V1.01") // Rev. 1.01 - 390914-02/390915-02 - continuous beeps after POST + ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.01-390914-02-2700.bin", 0x10000, 0x8000, CRC(711f1523) SHA1(5318127cd42e60dabd221ae8dd16812726a0e889), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.01-390915-02-3b00.bin", 0x10001, 0x8000, CRC(a1390cbc) SHA1(12aef4b95581e8c4489036c75697f18e9f3727b5), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "c386sxv102", "SL 386SX V1.02") // Rev. 1.02 - 390914-03/390914-03/390915-03 + ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.02-390914-03-0300.bin", 0x10000, 0x8000, CRC(301eb832) SHA1(6c599792b254b6d98dc130040d4f7858fd504f15), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.02-390915-03-3800.bin", 0x10001, 0x8000, CRC(01815d9d) SHA1(0af291626e71ed65ff6dfee2fe4776a29f2bbb97), ROM_SKIP(1) | ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "c386sxv103", "SL 386SX V1.03") // Commodore 80386SX BIOS Rev. 1.03 - + // this was replaced with the consistently named ROMs from http://www.zimmers.net/cbmpics/cpcs3.html, the 'hi' ROM looks like a bad dump, with its alternative the POST comes up + // ROMX_LOAD( "390914-01.u39", 0x10000, 0x8000, CRC(8f849198) SHA1(550b04bac0d0807d6e95ec25391a81272779b41b), ROM_SKIP(1) | ROM_BIOS(3)) /* 390914-01 V1.03 CS-2100 U39 Copyright (C) 1990 CBM */ + // ROMX_LOAD( "390915-01.u38", 0x10001, 0x8000, CRC(ee4bad92) SHA1(6e02ef97a7ce336485814c06a1693bc099ce5cfb), ROM_SKIP(1) | ROM_BIOS(3)) /* 390915-01 V1.03 CS-2100 U38 Copyright (C) 1990 CBM */ + ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.03-390914-03.bin", 0x10000, 0x8000, CRC(8f849198) SHA1(550b04bac0d0807d6e95ec25391a81272779b41b), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.03-390915-03.bin", 0x10001, 0x8000, CRC(ebdd5097) SHA1(2e4d2375efb9c1ebc0ccf3bb1ff2bb64c449af32), ROM_SKIP(1) | ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "c386sxv104", "SL 386SX V1.04") // Rev. 1.04 - 390914-04/390915-04 + ROMX_LOAD( "cbm-sl386sx-bios-lo-v1.04-390914-04.bin", 0x10000, 0x8000, CRC(377a8e1c) SHA1(9a36f10ad496e44f190937426f3e7de368d6ab7b), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "cbm-sl386sx-bios-hi-v1.04-390915-04.bin", 0x10001, 0x8000, CRC(4149f5d9) SHA1(9a62b235ac45145ca6720d11b2cbc17b8c25704a), ROM_SKIP(1) | ROM_BIOS(4)) +ROM_END + +// Commodore 386SX-25 - Form factor: slimline desktop - Chipset: : VLSI 82C311, unreadable, Acer - CPU: i386sx-25, FPU socket provided - On board: Keyboard (DIN), mouse (mini DIN), par, +// 2xser, beeper, Floppy, IDE - VGA on board: acumos AVGA2-340-1 - Mass storage: 3.5" FDD, 80MB IDE HDD - RAM: 8xSIMM30 - OSC: 24.000MHz, 50.000MHz, unreadable - ISA16: 1 (for riser card) +ROM_START( c386sx25 ) // BIOS-String: Award Modular BIOS v4.20 (80386DX) Commodore 386sx-25 BIOS-Version 1.09 391443-09 + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "c386sx25_f000.rom", 0x10000, 0x10000, CRC(1322064d) SHA1(6ce16a956b8454d3746ccb923fac45924e4302a4)) + + ROM_REGION( 0x8000, "vga", 0) + ROM_LOAD( "c386sx25_c000.rom", 0x0000, 0x8000, CRC(92212c6b) SHA1(61d222872bf4e21de053705c267103e409adb0ab)) +ROM_END + +// Commodore Laptop C386SX-LT - screen remains blank +ROM_START( c386sxlt ) + ROM_REGION16_LE(0x20000, "bios", 0) // BIOS contains Cirrus Logic VGA firmware, rebadged Sanyo MBC-18NB, but different versions exist + ROM_SYSTEM_BIOS(0, "c386sxlt_b400", "C386SX-LT V1.2 B400") + ROMX_LOAD( "cbm-386lt-bios-v1.2-390981-03-b400.bin", 0x00000, 0x20000, CRC(b84f6883) SHA1(3f31060726c7c49a891b35ab024524a4239eb4d0), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "c386sxlt_cf00", "C386SX-LT V1.2 CF00") + ROMX_LOAD( "cbm-386lt-bios-v1.2-390982-03-cf00.bin", 0x00000, 0x20000, CRC(c8cd2641) SHA1(18e55bff494c42389dfb445f2bc11e78db30e5f7), ROM_BIOS(1)) +ROM_END + +// Commodore DT386 +ROM_START( dt386 ) + // BIOS-String: 40-0502-DG1112-00101111-070791-SOLUTION-0 / 386DX-33 BIOS V1.00 #391560-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "dt386vp10", "DT386 V.pre 1.0") + ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-vpre1.0-391560-01.bin", 0x10000, 0x10000, CRC(600472f4) SHA1(2513c8bdb24fe27f73c82cbca9e1a983e4a0ba10), ROM_BIOS(0)) + // BIOS-String: 40-0500-DG112-00101111-070791-SOLUTION-0 / 386DX-33 Rev.1E (091592) + ROM_SYSTEM_BIOS(1, "dt386v1e", "DT386 V.1e") + ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v-xxxxxx-xx.bin", 0x10000, 0x10000, CRC(dc1ca1b5) SHA1(7441cb9d5ad5ca6e6425de73295eb74d1281929f), ROM_BIOS(1)) + // BIOS-String: 40-0500-DG1112-00101111-070791-SOLUTION-0 / 386DX-33 Rev.1E (091592) / Commodore BIOS Version 1.0 391560-01 + ROM_SYSTEM_BIOS(2, "dt386v10", "DT386 V.1.0") + ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v1.00-391560-01.bin", 0x10000, 0x10000, CRC(da1f7e6d) SHA1(b825fc015233e7eef93a3abbdfc3eeb0da096f50), ROM_BIOS(2)) + // BIOS-String: 40-0501-DG1112-00101111-070791-SOLUTION-0 / Commodore 386DX-33 BIOS Rev. 1.01 391560-02 + ROM_SYSTEM_BIOS(3, "dt386v101", "DT386 V.1.01") + ROMX_LOAD( "cbm-dt386dx-33c-bios-hi-v1.01-391560-02.bin", 0x10000, 0x10000, CRC(b3157f57) SHA1(a1a96c8d111e3c1da8f655b4b7e1c5be4af140e9), ROM_BIOS(3)) +ROM_END + +// Commodore DT486 - BIOS contains Paradise VGA ROM - Keyboard error +ROM_START( dt486 ) // BIOS string: 41-0102-001283-00111111-060692-SYM_486-0 - Commodore 486DX-33 BIOS Version 1.01 391521-02 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "dt486", "DT486") + ROM_LOAD( "cbm-dt486dx-33c-bios-u32--v1.01-391521-02.bin", 0x00000, 0x20000, BAD_DUMP CRC(a3977625) SHA1(83bc563fb41eae3dd5d260f13c6fe8979a77e99c)) +ROM_END + +// Commodore PC 30-III +ROM_START( pc30iii ) // Chipset: MOS 5720 1788 41, Faraday FE3010B, FE3020, FE3000A, FE3030 - ISA8: 1, ISA16: 3 + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "pc30iii_v200", "PC 30-III v2.00") + ROMX_LOAD( "pc30iii_390339-02_3e58.bin", 0x18000, 0x4000, CRC(f4a5860e) SHA1(b843744fe928bcfd8e037b0208cc85c0746535cf),ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "pc30iii_390340-02_42a8.bin", 0x18001, 0x4000, CRC(934df54a) SHA1(3b1c8916ba2b2517bc9f26dd74254586bcf0e91d),ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "pc30iii_v201", "PC 30-III v2.01") + ROMX_LOAD( "cbm-pc30c-bios-lo-v2.01-390339-03-35c1.bin", 0x18000, 0x4000, CRC(36307aa9) SHA1(50237ffea703b867de426ab9ebc2af46bac1d0e1),ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "cbm-pc30c-bios-hi-v2.01-390340-03-3f3f.bin", 0x18001, 0x4000, CRC(41bae42d) SHA1(27d6ad9554be86359d44331f25591e3122a31519),ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Commodore PC 40-III +// Chipset: MOS 5720 3888 41, Faraday FE3010B, FE3000A, FE3030, FE3020 - onboard VGA is a Paradise PVGA1A - ISA8: 1, ISA16: 3 +ROM_START( pc40iii ) + // VGA BIOS + // ROM_LOAD( "pc40iii_390337-01_v2.0_f930.bin", 0x00000, 0x4000, CRC(82b210d3) SHA1(1380107deef02455c6ce4d12162fdc32e375cbde)) + // ROM_LOAD( "pc40iii_390338-01_v2.0_b6d0.bin", 0x00001, 0x4000, CRC(526d7424) SHA1(60511ca0e856b7611d556aa82219d646f96c9b94)) + + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "pc40iii_v200", "PC 40-III v2.00") + ROMX_LOAD( "pc40iii_390339-01_v2.0_473a.bin", 0x18000, 0x4000, CRC(2ad2dc0f) SHA1(b41d5988fda8cc23418c3f665d780c617aa3fc2b),ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "pc40iii_390340-01_v2.0_4bc6.bin", 0x18001, 0x4000, CRC(62dc7d93) SHA1(e741528697b1d00450fd18e3db8b925606e0bd22),ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "pc40iii_v201", "PC 40-III v2.03") + ROMX_LOAD( "cbm-pc40c-bios-lo-v2.03-390339-04-03bc.bin", 0x18000, 0x4000, CRC(e5fd11c6) SHA1(18c21d9a4ae687eef5464b76a0d614b9dfd30ec8),ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "cbm-pc40c-bios-hi-v2.03-390340-04-3344.bin", 0x18001, 0x4000, CRC(63d6f0f7) SHA1(a88dee7694baa71913acbe76cb4e2a4e95979ad9),ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Commodore PC 45-III - this is a PC 40-III with a BIOS update and a bigger, 52MB, harddisk +ROM_START( pc45iii ) + ROM_REGION16_LE(0x20000, "bios", 0) // Commodore 286 BIOS Rev. 2.04 - 390339-05/390340-05 + ROM_LOAD16_BYTE( "cbm-pc45c-bios-lo-v2.04-390339-05.bin", 0x18000, 0x4000, CRC(b87b4cd1) SHA1(a6723d63a255b4010ad32b5dc9797e4724a64c14)) + ROM_LOAD16_BYTE( "cbm-pc45c-bios-hi-v2.04-390340-05.bin", 0x18001, 0x4000, CRC(b6976111) SHA1(e7c92307db3969a6a50ffd8cbc3d2ed16b4df6ad)) +ROM_END + +// Commodore PC 50-II - a photo of the mainboard shows four ROMs (two each for BIOS and VGA), so the 128K dumps available were probably made from a running system. +ROM_START( pc50ii ) // Chipset: Chips P82C211-12 C(16MHz), P82C212B-12 (16MHz), P82C215-12, P82C206, VLSI 8942VT - ISA8: 1, ISA16: 5 + ROM_REGION16_LE(0x20000, "bios", 0) // keyboard MCU is P8042AH MITAC V2.48 (undumped), onboard video PVGA1A-JK + // 0: Commodore PC50-II BIOS Rev1.0 - 609200-03 + ROM_SYSTEM_BIOS(0, "pc50iiv100", "PC 50-II V1.00") // complains "Time-of-day clock stopped" and reboots + ROMX_LOAD( "cbm-pc50b-bios-lo-v1.00-390339-01.bin", 0x10001, 0x8000, CRC(0f0e2fd6) SHA1(61a8043ac919c2a8fe668bf25e5f0b67868d11ae),ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "cbm-pc50b-bios-hi-v1.00-390340-01.bin", 0x10000, 0x8000, CRC(87008421) SHA1(cf41973a7bd439441baec1138dd63044fafe7391),ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: Commodore PC50-II BIOS Rev1.01 - 609200-03 + ROM_SYSTEM_BIOS(1, "pc50iiv101", "PC 50-II V1.01") // same behaviour as above + ROMX_LOAD( "cbm-pc50b-bios-lo-u31-v1.01-xxxxxx-xx-a800.bin", 0x10001, 0x8000, CRC(bf2c7009) SHA1(6b94df37861b30ef6a39a4ed64d4c9ac1e96043a),ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "cbm-pc50b-bios-hi-u28-v1.01-xxxxxx-xx-cd00.bin", 0x10000, 0x8000, CRC(628fcb2f) SHA1(74241cbcb4e183015d5e7a516d46b08d6f47504a),ROM_SKIP(1) | ROM_BIOS(1) ) + // 2: Commodore PC50-II BIOS Rev1.02 - 609200-03 + ROM_SYSTEM_BIOS(2, "pc50iiv102", "PC 50-II V1.02") // same behaviour as above + ROMX_LOAD( "cbm-pc50b-bios-lo-u32-v1.02-609200-03o-9e00.bin", 0x10001, 0x8000, CRC(57225c22) SHA1(3b2ded119480ce2dd5bb7c113c5814ce47e17d4c),ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "cbm-pc50b-bios-hi-u27-v1.02-609200-03e-c400.bin", 0x10000, 0x8000, CRC(4ec903af) SHA1(fb70e22c0538d7310c9034626d4d9c0e4f63dfd7),ROM_SKIP(1) | ROM_BIOS(2)) + + // VGA BIOS + // ROM_LOAD( "m_pc50-ii_1bad_pvgadk_odd.bin", 0x00000, 0x8000, CRC(f36eca7e) SHA1(4335fa4a4567cbc010ff2ffeb97a536ed93b0219)) + // ROM_LOAD( "m_pc50-ii_54e3_pvgadk_even.bin", 0x00001, 0x8000, CRC(01f6b964) SHA1(799a84ddde8a7672a6df9439bad6198ec3ff98ec)) +ROM_END + +// Commodore PC-60-III - complaining "time-of-day-clock stopped" - Phoenix P8242 '87 keyboard BIOS +ROM_START( pc60iii ) // onboard Paradise PVGA1A-JK, 2xRS232, 1xparallel, keyboard + ROM_REGION32_LE(0x20000, "bios", 0) // Chipset: Chips P82C301C, P82B305, P82A303, P82A304, Chips F82307, 25531/390423-1 COMBO SMC B9016, Commodore CSG, four MOSEL MS82C308-35JC, ISA16: 7, RAM card: 2 (up to 8MB, extended ISA connector) + // 0: Commodore PC60-III 80386 BIOS Rev. 1.2 - 390473-01/390474-01 + ROM_SYSTEM_BIOS(0, "pc60iiiv12", "PC60-III V1.2") + ROMX_LOAD( "cbm-pc60c-bios-lo_u73-v1.2-390473-01.bin", 0x00000, 0x10000, CRC(ff2cd8b3) SHA1(62e95f818c5016f4be2741872dc644999dee33ce),ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "cbm-pc60c-bios-hi_u67-v1.2-390474-01.bin", 0x00001, 0x10000, CRC(690fff4b) SHA1(adc262d40da64354c7c76b61f46d2c7ed35e9df9),ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: Commodore PC-60-III 80386/25MHz BIOS Rev. 1.3 390473-02/390474-02 + ROM_SYSTEM_BIOS(1, "pc60iiiv13", "PC60-III V1.3") + ROMX_LOAD( "cbm-pc60c-bios-lo-v1.30-390473-02.bin", 0x00000, 0x10000, CRC(3edd83e0) SHA1(3ebf393d6c33d9b8600f56c7be9eedb5aefb2645),ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "cbm-pc60c-bios-hi-v1.30-390474-02.bin", 0x00001, 0x10000, CRC(12209ac4) SHA1(76f271944894c77dde735da2b2ba065e81a99564),ROM_SKIP(1) | ROM_BIOS(1) ) + // 2: Commodore PC60-III 80386/25MHz BIOS rev.1.33 390473-04/390474-04 + ROM_SYSTEM_BIOS(2, "pc60iiiv133", "PC60-III V1.33") + ROMX_LOAD( "cbm-pc60-bios-lo-v1.33-390473-04.bin", 0x00000, 0x10000, CRC(afd0aae0) SHA1(7fa4388c939f30e603f0fc90f9512e500b282432),ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "cbm-pc60-bios-hi-v1.33-390474-04.bin", 0x00001, 0x10000, CRC(7b7958db) SHA1(d542c63ec0d17e1e87403ac01735e75ce58302a9),ROM_SKIP(1) | ROM_BIOS(2) ) + // 3: Commodore PC60-III 80386-25MHz BIOS Rev.1.3.5 - 390473-06/390474-06 + ROM_SYSTEM_BIOS(3, "pc60iiiv135", "PC60-III V1.3.5") + ROMX_LOAD( "cbm-pc60c-bios-lo-v1.35-390473-06.bin", 0x00000, 0x10000, CRC(6ff4aea9) SHA1(3fcb3a5c275dbfb93c3e55224d731f1b52343d4b),ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "cbm-pc60c-bios-hi-v1.35-390474-06.bin", 0x00001, 0x10000, CRC(5a04e3f0) SHA1(311a3ff3e578ecbce0ecd9f3b006ab772623255a),ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: Commodore 80386 BIOS Rev.1.36 - 390473-07/390474-07 + ROM_SYSTEM_BIOS(4, "c386v136", "Commodore 386 V1.3.6") + ROMX_LOAD( "cbm-pc60c-bios-lo-v1.36-390473-07-9b0e.bin", 0x00000, 0x10000, CRC(be7504f8) SHA1(a45f7690a41d416bc10ca6f583b8fdd2219a3d8a),ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "cbm-pc60c-bios-hi-v1.36-390474-07-ddf2.bin", 0x00001, 0x10000, CRC(d8e08ffa) SHA1(fb5fb973b01df6e486d76076d3373583758b1d01),ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: Commodore 80386 BIOS Rev.1.36.03 - 390473-07/390474-07 + ROM_SYSTEM_BIOS(5, "c386v13603", "Commodore 386 V1.3.603") + ROMX_LOAD( "cbm-pc60c-bios-lo-v1.3603-390473-07.bin", 0x00000, 0x10000, CRC(2cda07c7) SHA1(01fd6260192541dd73f88d2cc0f99fe5603efc81),ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "cbm-pc60c-bios-hi-v1.3603-390474-07.bin", 0x00001, 0x10000, CRC(39845b9b) SHA1(9d3cbfde4b2acc1d576aafa80126b75a49d3d8df),ROM_SKIP(1) | ROM_BIOS(5) ) +ROM_END + +// Commodore PC-70-III - complaining "time-of-day-clock stopped" +ROM_START( pc70iii ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Commodore 80486 BIOS Rev.1.00 - 390934-01/390935-01 + ROM_SYSTEM_BIOS(0, "pc70v100", "PC70 V1.00") + ROMX_LOAD("cbm-pc70c_bios-u117-lo-v1.00-390934-01.bin", 0x00000, 0x10000, CRC(3eafd811) SHA1(4deecd5dc429ab09e7c0d308250cb716f8b8e42a), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("cbm-pc70c_bios-u112-hi-v1.00-390935-01.bin", 0x00001, 0x10000, CRC(2d1dfec9) SHA1(d799b3579577108549d9d4138a8a32c35ac3ce1c), ROM_SKIP(1) | ROM_BIOS(0)) + // 1: Commodore PC70-III 80486/25MHz BIOS Rev.1.00.01 - xxxxxx - 00/xxxxxx-00 + ROM_SYSTEM_BIOS(1, "pc70v101", "PC70 V1.00.01") + ROMX_LOAD("cbm-pc70c-bios-lo-v1.00.01-xxxxxx-00.bin", 0x00000, 0x10000, CRC(6c8bbd31) SHA1(63d1739a58a0d441ebdd543e3994984c433aedb4), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("cbm-pc70c-bios-hi-v1.00.01-xxxxxx-00.bin", 0x00001, 0x10000, CRC(ef279cdd) SHA1(d250368b2f731e842d6f280a6134f1e38846874b), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +// Commodore Tower 386 +ROM_START( comt386 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // Phoenix 80386 ROM BIOS PLUS Version 1.10 22 - Twinhead International Corporation + ROM_LOAD16_BYTE( "cbm-t386-bios-lo-v1.1022c-.bin", 0x10000, 0x8000, CRC(6857777e) SHA1(e80dbffd3523c9a1b027f57138c55768fc8328a6)) + ROM_LOAD16_BYTE( "cbm-t386-bios-hi-v1.1022c-.bin", 0x10001, 0x8000, CRC(6a321a7e) SHA1(c350fb273522f742c6008deda00ed13947a269b7)) +ROM_END + +// Commodore Tower 486 +ROM_START( comt486 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0500-DG1112-00101111-070791-SOLUTION-0 - 4D3FF Rev.D (092892) + ROM_SYSTEM_BIOS(0, "v0", "Tower 486 V0") + ROMX_LOAD( "cbm-t486dx-bios-v-xxxxxx-xx.bin", 0x10000, 0x10000, CRC(f51c0ca0) SHA1(2b08a606ae2f37b3e72d687f890d729a58fd3ccd), ROM_BIOS(0)) + // continuous chirps + ROM_SYSTEM_BIOS(1, "v1", "Tower 486 V1") + ROMX_LOAD( "cbm-t486dx-66-bios-v1.01-391566-02.bin", 0x10000, 0x10000, CRC(3d740698) SHA1(888f23d85b41c07e15e2811b76194cf478bc80cd), ROM_BIOS(1)) + // BIOS-String: 40-0103-001283-00101111-0606-SYM_486-0 - Commodore 486DX2-66 BIOS Version 1.03 391684-02 + ROM_SYSTEM_BIOS(2, "v2", "Tower 486 V2") + ROMX_LOAD( "cbm-t486dx-66-bios-v1.03-391684-02.bin", 0x10000, 0x10000, CRC(13e8b04b) SHA1(dc5c84d228f802f7580b3f3b8e70cf8f74de5d79), ROM_BIOS(2)) + // BIOS-String: 40-0103-001283-00101111-060692-SYM_486-0 - Commodore 486DX-50 BIOS Version 1.03 391522-03 + ROM_SYSTEM_BIOS(3, "v3", "Tower 486 V3") + ROMX_LOAD( "cbm-t486dx-50-bios-v1.03-.bin", 0x10000, 0x10000, CRC(e02bb928) SHA1(6ea121b214403390d382ca4685cfabcbcca1a28b), ROM_BIOS(3)) +ROM_END + + +//************************************************************************** +// 80286 BIOS +//************************************************************************** + +ROM_START( at ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS-String: D286-0011-110387 + ROM_SYSTEM_BIOS(0, "at", "PC 286") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 03-11-1987)*/ + ROMX_LOAD( "at110387.1", 0x10001, 0x8000, CRC(679296a7) SHA1(ae891314cac614dfece686d8e1d74f4763cf40e3),ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "at110387.0", 0x10000, 0x8000, CRC(65ae1f97) SHA1(91a29c7deecf7a9afbba330e64e0eee9aafee4d1),ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS-String: S286-6181-101590-K0 - additional info from chukaev.ru54.com: UMC chipset + ROM_SYSTEM_BIOS(1, "ami206", "AMI C 206.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 15-10-1990)*/ + ROMX_LOAD( "amic206.bin", 0x10000, 0x10000,CRC(25a67c34) SHA1(91e9d8cdc2f1b40a601a23ceaff2189fd1245f3b), ROM_BIOS(1) ) + // 2: (BIOS release date:: 07-07-1991) - Chipset: Headland HT21/E + ROM_SYSTEM_BIOS(2, "amiht21", "AMI HT 21.1") /* as above */ + ROMX_LOAD( "ht21e.bin", 0x10000, 0x10000, CRC(e80f7fed) SHA1(62d958d98c95e9e4d1b290a6c1054ae98770f276), ROM_BIOS(2) ) + // 3: BIOS-String: D286-1430-040990-K0 - additional info from chukaev.ru54.com: Chipset: TI TACT8230... 1BPB, 2BPB, 3EPB - ISA8: 3, ISA16: 5 + ROM_SYSTEM_BIOS(3, "amip1", "AMI P.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 09-04-1990)*/ + ROMX_LOAD( "poisk-h.bin", 0x10001, 0x8000, CRC(83fd3f8c) SHA1(ca94850bbd949b97b11710629886b0ee69489a81),ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "poisk-l.bin", 0x10000, 0x8000, CRC(0b2ed291) SHA1(bb51a3f317cf4d429a6cfb44a46ca0ac39d9aaa7),ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: Award 286 Modular BIOS Version 3.11 - WINBOND + ROM_SYSTEM_BIOS(4, "aw201", "Award 201") /* (BIOS release date:: 21-11-1990) */ + ROMX_LOAD( "83201-5h.bin", 0x10001, 0x8000, CRC(968d1fc0) SHA1(dc4122a6c696f0b43e7894dc1b669346eed755d5),ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "83201-5l.bin", 0x10000, 0x8000, CRC(bf50a89a) SHA1(2349a1db6017a7fb0673e99d3680c8753407be8d),ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: Award 286 Modular BIOS V3.03 NFS 11/10/87" - T.M.C + ROM_SYSTEM_BIOS(5, "aw303", "Award 303 NFS") /* (BIOS release date:: 15-11-1985) */ + ROMX_LOAD( "aw303-hi.bin", 0x18001, 0x4000, CRC(78f32d7e) SHA1(1c88398fb171b33b7e6191bad63704ae85bfed8b), ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "aw303-lo.bin", 0x18000, 0x4000, CRC(3d2a70c0) SHA1(1329113bec514ed2a6d803067b1132744ef534dd), ROM_SKIP(1) | ROM_BIOS(5) ) + // 6: Award 286 Modular BIOS Version 3.03GS + ROM_SYSTEM_BIOS(6, "aw303gs", "Award 303GS") /* (BIOS release date:: 15-11-1985) */ + ROMX_LOAD( "aw303gs-hi.bin", 0x18001, 0x4000, CRC(82392e18) SHA1(042453b7b29933a1b72301d21fcf8fa6b293c9c9), ROM_SKIP(1) | ROM_BIOS(6) ) + ROMX_LOAD( "aw303gs-lo.bin", 0x18000, 0x4000, CRC(a4cf8ba1) SHA1(b73e34be3b2754aaed1ac06471f4441fea06c67c), ROM_SKIP(1) | ROM_BIOS(6) ) + // 7: BIOS-String: D286-6069-040990-K0 + ROM_SYSTEM_BIOS(7, "ami_200960", "AMI 200960") /* (BIOS release date:: 09-04-1990 */ + ROMX_LOAD( "ami_286_bios_sn200960_even.bin", 0x10000, 0x8000, CRC(67745815) SHA1(ca6886c7a0716a92a8720fc71ff2d95328c467a5), ROM_SKIP(1) | ROM_BIOS(7) ) + ROMX_LOAD( "ami_286_bios_sn200960_odd.bin", 0x10001, 0x8000, CRC(360a5f73) SHA1(1b1980fd99779d0cdc4764928a641e081b35ee9f), ROM_SKIP(1) | ROM_BIOS(7) ) + // 8: BIOS-String: DVL2-1160-040990-K0 + ROM_SYSTEM_BIOS(8, "dvl2", "DVL2") /* (BIOS release date:: 09-04-1990) */ + ROMX_LOAD( "ami_dvl2-1160-040990-k8_even.bin", 0x10000, 0x8000, CRC(86093016) SHA1(f60b2679c8c23a34bdd64f25d83cb5a5a337bd57), ROM_SKIP(1) | ROM_BIOS(8) ) + ROMX_LOAD( "ami_dvl2-1160-040990-k8_odd.bin", 0x10001, 0x8000, CRC(4e1c944a) SHA1(0763a0a1002baced071fea301f627d2e550878b8), ROM_SKIP(1) | ROM_BIOS(8) ) + // 9: DTK 286 BIOS Ver 3.18 07/01/88 + ROM_SYSTEM_BIOS(9, "dtk318", "DTK v3.18") /* (BIOS release date:: 11-03-1986) */ + ROMX_LOAD( "dtk_286_bios_ver3.18.bin", 0x18000, 0x8000, CRC(b4b8b59a) SHA1(73c12222f5003fdc8bbfee178b20c8dda2fe5cb4), ROM_BIOS(9) ) + // 10: BIOS-String: D286-6061-040990-K0 + ROM_SYSTEM_BIOS(10, "d286-k0", "AMI D286-K0") /* (BIOS release date:: 09-04-1990) */ + ROMX_LOAD( "ami_d286-6061-040990-k0.bin", 0x10000, 0x10000, CRC(1679c1b5) SHA1(9d95da3b40c5f13d096823f383aba099b3a77183), ROM_BIOS(10) ) + // 11: BIOS-String: S286-1169-030389-K0 for ACHIEVE MICROSYSTEMS + ROM_SYSTEM_BIOS(11, "s286-k0", "Achieve S286-K0") /* (BIOS release date:: 03-03-1989) */ + ROMX_LOAD( "ach_s286-1169-030389-k0_ev.bin", 0x10000, 0x8000, CRC(58f1f29c) SHA1(42f5189d12b75fad5e53ff472b4603c6fcbd46cd), ROM_SKIP(1) | ROM_BIOS(11) ) + ROMX_LOAD( "ach_s286-1169-030389-k0_od.bin", 0x10001, 0x8000, CRC(84bfc180) SHA1(2daa51b09c449712c9a737793b83754951e53a41), ROM_SKIP(1) | ROM_BIOS(11) ) + // 12: Award BIOS Version 3.01B + ROM_SYSTEM_BIOS(12, "awa301b", "Award BIOS Version 3.01B") /* (BIOS release date:: 01-01-1988) */ + ROMX_LOAD( "aw286lo.rom", 0x18000, 0x4000, CRC(5afbb4a2) SHA1(513fd75d90720820484fdd280e4a6c22a0ef238c), ROM_SKIP(1) | ROM_BIOS(12) ) + ROMX_LOAD( "aw286hi.rom", 0x18001, 0x4000, CRC(b2551251) SHA1(0c8bd12a3d54ae6d2ad0210b9ca4deca94be10ed), ROM_SKIP(1) | ROM_BIOS(12) ) + // 13: no screen display + ROM_SYSTEM_BIOS(13, "awa286", "awa286") /* (BIOS release date:: 21-11-1990) */ + ROMX_LOAD( "awd286lo.rom", 0x18000, 0x4000, CRC(d1a9c01f) SHA1(9123c6f76d85725036a0f8b9c6480142abea478f), ROM_SKIP(1) | ROM_BIOS(13) ) + ROMX_LOAD( "awd286hi.rom", 0x18001, 0x4000, CRC(b0bde4cc) SHA1(9c3fd2c0f69dde905d4e8f3be421374ef99682df), ROM_SKIP(1) | ROM_BIOS(13) ) + // 14: DTK 286 BIOS Ver. 3.01 07/24/87 - no screen display + ROM_SYSTEM_BIOS(14, "dtk286", "dtk286") /* (BIOS release date:: 11-03-1986) */ + ROMX_LOAD( "dtk286lo.rom", 0x18000, 0x4000, CRC(dfc70856) SHA1(39158e6ed50236d371277631e77d06f77fb0531e), ROM_SKIP(1) | ROM_BIOS(14) ) + ROMX_LOAD( "dtk286hi.rom", 0x18001, 0x4000, CRC(a98fc743) SHA1(fb9e330148cb5584f61c1febea71c53b6f9d61b7), ROM_SKIP(1) | ROM_BIOS(14) ) + // 15: Phoenix 80286 ROM BIOS Version 3.07 (R04) + ROM_SYSTEM_BIOS(15, "mitph307", "Mitac Phoenix v3.07") /* (BIOS release date:: 30-07-1987) */ + ROMX_LOAD( "mitac_phoenix_v3.07_even.bin", 0x10000, 0x8000, CRC(1c4becc9) SHA1(bfdea3f2a248312ed8cf4765a1a7dc1a2f7cecd8), ROM_SKIP(1) | ROM_BIOS(15) ) + ROMX_LOAD( "mitac_phoenix_v3.07_odd.bin", 0x10001, 0x8000, CRC(3ee16ed1) SHA1(b77e18e10e9187a01cb55c05b2a6e5311981ab56), ROM_SKIP(1) | ROM_BIOS(15) ) + // 16: BIOS-String: Pyramid Software Development Personal Computer AT Bios Version 2.14 + ROM_SYSTEM_BIOS(16, "precise", "Precise") /* (no regular BIOS release date) */ + ROMX_LOAD( "precise 860407_low.bin", 0x10000, 0x8000, CRC(d839c074) SHA1(473ca7b42914ce12f2d6c91afb0b2c2e65194489), ROM_SKIP(1) | ROM_BIOS(16) ) + ROMX_LOAD( "precise 860407_high.bin", 0x10001, 0x8000, CRC(b5e13c54) SHA1(07f5806fb53d0cb7ef7b54312fd6aa163d58b9a5), ROM_SKIP(1) | ROM_BIOS(16) ) + // ROM_LOAD( "precise_860407_keyboard_mcu.bin", 0x0000, 0x800, CRC(d1faad5c) SHA1(cb315a3da632c969012c298bb8e1cf8883b70501)) + // 17: Access Methods Inc. for Flying Triumph (AMI before they became American Megatrends) - BIOS String: Ref. no. 1406-061296 + // complains about "Channel-2 timer not funcional but boots + ROM_SYSTEM_BIOS(17, "ami_ft", "AMI Flying Triumph") /* (BIOS release date:: 12-06-1986) */ + ROMX_LOAD( "286_access_methods_rom2_32k.bin", 0x10000, 0x8000, CRC(749c65af) SHA1(7c6e9e217afe020b7b36785549fdbfb89de8f872), ROM_SKIP(1) | ROM_BIOS(17) ) + ROMX_LOAD( "286_access_methods_rom4_32k.bin", 0x10001, 0x8000, CRC(0f15581a) SHA1(2a22635f30388ca371f0f1f31652cfa647bb322d), ROM_SKIP(1) | ROM_BIOS(17) ) + // 18: MS-0010-2 - Phoenix ROM BIOS Version 3.06 + ROM_SYSTEM_BIOS(18, "ms-0010-2", "MS-0010-2") /* (BIOS release date:: 19-01-1987) (ISA8: 3, ISA16: 5) */ + ROMX_LOAD( "286-ms0010-2-lo_32k.bin", 0x10000, 0x8000, CRC(2c381474) SHA1(94b9825d412ea39d67857102a0375852b349fcd6), ROM_SKIP(1) | ROM_BIOS(18) ) + ROMX_LOAD( "286-ms0010-2-hi_32k.bin", 0x10001, 0x8000, CRC(4fdb8c64) SHA1(c2e7f88f0ac97ee5eed0c97864b7f1810e99ea26), ROM_SKIP(1) | ROM_BIOS(18) ) + // 19: M219 V2.1 - chipset: Toshiba CHIP2 TC6154AF + // BIOS-String: X0-0100-001437-00101111-060692-M219-0 + ROM_SYSTEM_BIOS(19, "m219", "Toshiba M219") + ROMX_LOAD( "3tcm001.bin", 0x10000, 0x10000, CRC(146a42e9) SHA1(cf511919f271e868e34881912c0a1a859d80f91e), ROM_BIOS(19)) + // ***** Motherboards using the original Chips CS8220 chipset: P82C202, P82C201, P82A203, P82A204, P82A205 + // 20: AL-6410 (found online, no markings on the board itself), Chipset: Chips P82A204, P82A203, P82A205, P82C201, P82C202 + ROM_SYSTEM_BIOS(20, "al6410", "AL-6410") /* (BIOS-String: D286-1103-110387-K0) (BIOS release date:: 03-11-1987) (ISA8: 2, ISA16: 6) */ + ROMX_LOAD( "al-6410_ami_bios_low.bin", 0x10000, 0x8000, CRC(50c4e121) SHA1(5f9c27aabdc6bb810e90bced2053b7c21c4994dd), ROM_SKIP(1) | ROM_BIOS(20) ) + ROMX_LOAD( "al-6410_ami_bios_high.bin", 0x10001, 0x8000, CRC(a44be083) SHA1(99f73d7ceb315eb3770c94d90228f8859cadc610), ROM_SKIP(1) | ROM_BIOS(20) ) + // 21: AT SYSTEM 6M/8M/10M - Chipset: Chips P82A205; P82C201; P82A203; P82A204 - ISA8:2, ISA16: 6 + ROM_SYSTEM_BIOS(21, "at6m8m10m", "AT SYSTEM 6M/8M/10M") // (BIOS release date:: 04-02-1987) - OSC: 20.000000MHz - MQ-14.3 - 12.000 + ROMX_LOAD( "286-at system 6m8m10m-l_32k.bin", 0x10000, 0x8000, CRC(37e0e1c1) SHA1(f5cd17658554a73bb86c5c8e630dac3e34b38e51), ROM_SKIP(1) | ROM_BIOS(21) ) + ROMX_LOAD( "286-at system 6m8m10m-r_32k.bin", 0x10001, 0x8000, CRC(c672efff) SHA1(7224bb6b4d25ef34bc0aa9d7c450baf9b47fd917), ROM_SKIP(1) | ROM_BIOS(21) ) + // 22: CDTEK - BIOS-String: DSUN-1202-042088-K0 286-BIOS AMI for CDTEK - ISA8:2, ISA16:6 - Chipset ICs plus SN76LS612N, RTC MC146818P + ROM_SYSTEM_BIOS(22, "cdtekchips", "CDTEK 286") // ISA8:2, ISA16: 6 - OSC: 12.000, 14.31818, 16000.00KHz + ROMX_LOAD( "286-cdtek2-even_32k.bin", 0x10000, 0x8000, CRC(94867e8d) SHA1(12e61cc8b875b57324c93276c9f6093f2bd0e277), ROM_SKIP(1) | ROM_BIOS(22) ) + ROMX_LOAD( "286-cdtek2-odd_32k.bin", 0x10001, 0x8000, CRC(153ed3bd) SHA1(10b711e0f0d79e0b6d181f24fe66544d2d72a310), ROM_SKIP(1) | ROM_BIOS(22) ) + // 23: This board looks identical to #2 but has different chips fitted: SN76LS612N = Zymos HCT612, Chips P82A204 = TACT80204FN, P82A203 = STK-5134, P82A205 = STK-5135, + // P82C201 = STK-5132, P82C202 = STK-5133 - BIOS-String: Phoenix 80286 ROM BIOS Version 3.06 + ROM_SYSTEM_BIOS(23, "286tact", "286 TACT") // OSC: 20.0000MHz, 14.31818 - 24.000MHz + ROMX_LOAD( "286-tact-320548-1_32k.bin", 0x10000, 0x8000, CRC(0b528d19) SHA1(15f5a94d89461655c0f74681bbae5745db009ac2), ROM_SKIP(1) | ROM_BIOS(23) ) + ROMX_LOAD( "286-tact-320548-2_32k.bin", 0x10001, 0x8000, CRC(418aa2d0) SHA1(b6af0b8aa595d8f8de6c0fc851bf1c226dcc7ca7), ROM_SKIP(1) | ROM_BIOS(23) ) + // 24: Tulip 286 CPU card - Chipset: TACT 82204FN, 82202N, Chips P82A205, P82C201, P82A203, SN74LS612N, HD146818P, 2xAM9517A-5PC, 2xP8259A + // CPU: AND N80L286-10, FPU socket provided - OSC: 16.000 - BIOS-String: + ROM_SYSTEM_BIOS(24, "286tu", "Tulip 286 CPU card") // no display + ROMX_LOAD( "tc7be.bin", 0x18000, 0x4000, CRC(260c6994) SHA1(a7e28c2978faaa9c5ccab32932ef1391c1b3d35a), ROM_SKIP(1) | ROM_BIOS(24) ) + ROMX_LOAD( "tc7bo.bin", 0x18001, 0x4000, CRC(c8373edc) SHA1(77ce220914863f482a3a983b43ff8ca8c72b470c), ROM_SKIP(1) | ROM_BIOS(24) ) +ROM_END + +ROM_START( atturbo ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS-String: 20-0001-001223-00101111-050591-KB-8042--0 - additional info from chukaev.ru54.com: Chipset: VLSI VL82C311L-FC4, VL82C113A-FC + ROM_SYSTEM_BIOS(0, "vl82c", "VL82C311L-FC4")/*(Motherboard Manufacturer: Biostar Microtech Corp.) (BIOS release date: 05-05-1991)*/ + ROMX_LOAD( "2vlm001.bin", 0x10000, 0x10000, CRC(f34d800a) SHA1(638aca592a0e525f957beb525e95ca666a994ee8), ROM_BIOS(0) ) + // 1: same as BIOS '1' in at + ROM_SYSTEM_BIOS(1, "ami206", "AMI C 206.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 15-10-1990)*/ + ROMX_LOAD( "amic206.bin", 0x10000, 0x10000,CRC(25a67c34) SHA1(91e9d8cdc2f1b40a601a23ceaff2189fd1245f3b), ROM_BIOS(1) ) + // 2: same as BIOS '7' in at + ROM_SYSTEM_BIOS(2, "amiht21", "AMI HT 21.1") /* not a bad dump, sets unknown probably chipset related registers at 0x1e8 before failing post */ + ROMX_LOAD( "ht21e.bin", 0x10000, 0x10000, CRC(e80f7fed) SHA1(62d958d98c95e9e4d1b290a6c1054ae98770f276), ROM_BIOS(2) ) + // 3: same as BIOS '8' in at + ROM_SYSTEM_BIOS(3, "amip1", "AMI P.1") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 09-04-1990)*/ + ROMX_LOAD( "poisk-h.bin", 0x10001, 0x8000, CRC(83fd3f8c) SHA1(ca94850bbd949b97b11710629886b0ee69489a81),ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "poisk-l.bin", 0x10000, 0x8000, CRC(0b2ed291) SHA1(bb51a3f317cf4d429a6cfb44a46ca0ac39d9aaa7),ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: BIOS-String: DG22-1131-040990-K0 / 286-BIOS G2 V1.1 6-28-90 - Headland GC102/GC113-PC/HT101A - CPU/FPU: N80286-12, IIT2C87-10 + ROM_SYSTEM_BIOS(4, "ami1131", "AMI-1131") /*(Motherboard Manufacturer: Elitegroup Computer Co., Ltd.) (BIOS release date:: 09-04-1990)*/ + ROMX_LOAD( "2hlm003h.bin", 0x10001, 0x8000, CRC(2babb42b) SHA1(3da6538f44b434cdec0cbdddd392ccfd34666f06),ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "2hlm003l.bin", 0x10000, 0x8000, CRC(317cbcbf) SHA1(1adad6280d8b07c2921fc5fc13ecaa10e6bfebdc),ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: same as BIOS '0' in at + ROM_SYSTEM_BIOS(5, "at", "PC 286") /*(Motherboard Manufacturer: Unknown.) (BIOS release date:: 03-11-1987)*/ + ROMX_LOAD( "at110387.1", 0x10001, 0x8000, CRC(679296a7) SHA1(ae891314cac614dfece686d8e1d74f4763cf40e3),ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "at110387.0", 0x10000, 0x8000, CRC(65ae1f97) SHA1(91a29c7deecf7a9afbba330e64e0eee9aafee4d1),ROM_SKIP(1) | ROM_BIOS(5) ) + // 6 + ROM_SYSTEM_BIOS(6, "bravo", "AST Bravo/286") // fails with keyboard controller test, probably expects specific kbdc rom + ROMX_LOAD( "107000-704.bin", 0x10000, 0x8000, CRC(94faf87e) SHA1(abaafa6c2ae9b9fba95b244dcbcc1c752ac6c0a0),ROM_SKIP(1) | ROM_BIOS(6) ) + ROMX_LOAD( "107000-705.bin", 0x10001, 0x8000, CRC(e1263c1e) SHA1(b564f1043ef45ecbdf4f06bb500150ad992c2931),ROM_SKIP(1) | ROM_BIOS(6) ) + // ***** Motherboards using the original Chips CS8220 chipset: P82C202, P82C201, P82A203, P82A204, P82A205 + // 7 same as BIOS '20' in at + ROM_SYSTEM_BIOS(7, "al6410", "AL-6410") + ROMX_LOAD( "al-6410_ami_bios_low.bin", 0x10000, 0x8000, CRC(50c4e121) SHA1(5f9c27aabdc6bb810e90bced2053b7c21c4994dd), ROM_SKIP(1) | ROM_BIOS(7) ) + ROMX_LOAD( "al-6410_ami_bios_high.bin", 0x10001, 0x8000, CRC(a44be083) SHA1(99f73d7ceb315eb3770c94d90228f8859cadc610), ROM_SKIP(1) | ROM_BIOS(7) ) + // 8: same as BIOS '21' in at + ROM_SYSTEM_BIOS(8, "at6m8m10m", "AT SYSTEM 6M/8M/10M") + ROMX_LOAD( "286-at system 6m8m10m-l_32k.bin", 0x10000, 0x8000, CRC(37e0e1c1) SHA1(f5cd17658554a73bb86c5c8e630dac3e34b38e51), ROM_SKIP(1) | ROM_BIOS(8) ) + ROMX_LOAD( "286-at system 6m8m10m-r_32k.bin", 0x10001, 0x8000, CRC(c672efff) SHA1(7224bb6b4d25ef34bc0aa9d7c450baf9b47fd917), ROM_SKIP(1) | ROM_BIOS(8) ) + // 9: same as BIOS '22' in at + ROM_SYSTEM_BIOS(9, "cdtekchips", "CDTEK 286") + ROMX_LOAD( "286-cdtek2-even_32k.bin", 0x10000, 0x8000, CRC(94867e8d) SHA1(12e61cc8b875b57324c93276c9f6093f2bd0e277), ROM_SKIP(1) | ROM_BIOS(9) ) + ROMX_LOAD( "286-cdtek2-odd_32k.bin", 0x10001, 0x8000, CRC(153ed3bd) SHA1(10b711e0f0d79e0b6d181f24fe66544d2d72a310), ROM_SKIP(1) | ROM_BIOS(9) ) + // 10: same as BIOS '23' in at + ROM_SYSTEM_BIOS(10, "286tact", "286 TACT") + ROMX_LOAD( "286-tact-320548-1_32k.bin", 0x10000, 0x8000, CRC(0b528d19) SHA1(15f5a94d89461655c0f74681bbae5745db009ac2), ROM_SKIP(1) | ROM_BIOS(10) ) + ROMX_LOAD( "286-tact-320548-2_32k.bin", 0x10001, 0x8000, CRC(418aa2d0) SHA1(b6af0b8aa595d8f8de6c0fc851bf1c226dcc7ca7), ROM_SKIP(1) | ROM_BIOS(10) ) + // 11: BIOS-String: DG22-6080-091991-K0 / 286-BIOS (C) 1989 American Megatrends Inc / (C) 1991 TriGem Corporation + ROM_SYSTEM_BIOS(11, "tg286m", "TG286M") + ROMX_LOAD( "ami.bin", 0x10000, 0x10000, CRC(5751542a) SHA1(0fa0e86a0599e8500bb9ca9efa77cfc9c82a9dc0), ROM_BIOS(11)) + // 12: BIOS-String: 286 Modular BIOS Version B3.11.03 - REFRESH TIMING ERROR + ROM_SYSTEM_BIOS(12, "cl286", "CL286") + ROMX_LOAD( "award.bin", 0x10000, 0x10000, CRC(839a30b3) SHA1(c40a15c2636cf734e83ddf22213f637766f6456e), ROM_BIOS(12)) + // 13: BIOS-String: 286 Modular BIOS Version 3.03 Copyright Award Software Inc. - DIGICOM + // ID: Digicom DIGIS 286S Turbo8/10MHz - Chipset: Chips P82C201-10, P82A205, P82A204, P82C202, NS16450N, HCT612, MC146818P, 2xNEC D8237AC-5 + // FPU socket provided - RAM: 1MB (4x9xTMS4256-12) - BIOS: Award 286 BIOS - OSC: 20.000MHz, 16000.00KHz, 1.8432MHz, 14.31818 - ISA8: 3, ISA16: 4 + // Keyboard BIOS: AWARD + ROM_SYSTEM_BIOS(13, "digis286s", "DIGICOM DIGIS 286S") + ROMX_LOAD( "80286-286s_turbo_lo.bin", 0x10000, 0x8000, CRC(7ecc1082) SHA1(eb5231e169ab550749c44383da20ab049cdf2a6d), ROM_SKIP(1) | ROM_BIOS(13) ) + ROMX_LOAD( "80286-286s_turbo_hi.bin", 0x10001, 0x8000, CRC(bea8047e) SHA1(17eb6ab8dbc61e372acdda060b84bc4914980322), ROM_SKIP(1) | ROM_BIOS(13) ) +ROM_END + + +//************************************************************************** +// 80286 motherboard +//************************************************************************** + +// ID: Peacock computer S-286 Rev A - CPU: 80286, FPU socket provided - Chipset: TI TACT82204FN, STK5134, STK-5136, STK-5132, STK-5133 +// RAM: no onboard RAM, ISA8 socket marked "RAM-1" and "RAM-4", matching card "RAM-1A" with 1MB DIP - BIOS: Award 286 BIOS Q2093374 +// Keyboard BIOS: Award Q2093198 - OSC: "clock II F22/F28", "clock II F19/F29" - ISA8: 3, ISA16: 4 - DIP8: 01101000 +ROM_START( peas286 ) // BIOS-String: 286 Modular BIOS Version - REFRESH TIMING ERROR + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-s-286-peacock-lo.bin", 0x10000, 0x08000, CRC(78efd1d5) SHA1(3b6c5c6e77a3f77de1c81c0936d7fb2eab7b2487), ROM_SKIP(1) ) + ROMX_LOAD( "286-s-286-peacock-hi.bin", 0x10001, 0x08000, CRC(5b8ba43a) SHA1(a38ebb1d21f051065ede45643ed394cc5ac1dbf2), ROM_SKIP(1) ) +ROM_END + +// ID: PC CHIPS M209 - Chipset: UMC UM82C206L, PC 4L50F2052 - BIOS: AMI 286 BIOS 162020 CDTEK - Keyboard BIOS: AMI KEY BOARD BIOS 162020 CDTEK +// CPU:AMD N80L286-16/S - RAM: SIPP30x4, 1MB DIP - BIOS-ID: S286-6181-101590-K0 - ISA8: 1, ISA16: 6 - OSC: 33.333MHz, 14.31818 +ROM_START( pccm209 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "pcchips_m209_gq4x.bin", 0x10000, 0x08000, CRC(d1a68208) SHA1(58285d293f723507a5401e55c5e4e5d27681d824)) + ROM_CONTINUE( 0x10001, 0x08000 ) +ROM_END + +// ID: unknown - ASI 100B0, identified as “HAM 12 TI 286 Motherboard ZERO WAIT” - Chipset: Texas Instruments TACT82301PB, TACT82302PB, TACT82303PB (cf. at386sx) +// CPU: xxx, FPU: IIT 2C87-12 - RAM: 1MB in DIP, 4xSIPP30 - OSC: 24.000MHz, 14.31818 - ISA8: 3, ISA16: 5 +ROM_START( asi100b0 ) // BIOS-String: D286-1112-040990-K0 + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "asi286_signetics_s-27c256-20fa-l.bin", 0x10000, 0x08000, CRC(54505e72) SHA1(024edd1b435252db38274626c84904422cdb8787), ROM_SKIP(1) ) + ROMX_LOAD( "asi286_signetics_s-27c256-20fa-h.bin", 0x10001, 0x08000, CRC(9aff417a) SHA1(f74da97c797b0856ee6ff634c40eee6403416e4c), ROM_SKIP(1) ) +ROM_END + +// ID: Wearnes CL286-12/16S (CL286-12S and CL286-16S) - Chipset: Texas Instruments TACT82206FN / Micrel MIC9212CP, MIC9211CP, MIC9215CP, WD16C785-JT +// BIOS/Version: AMI 080190 - Keyboard BIOS: KB-BIOS-VER-F - Rom Type : NMC27C256Q x 2, CL286-12S 080190 EVEN CS8A11, CL286-12S 080190 ODD CSD77D +// CPU: AMD N80L286-12/S, FPU socket provided - RAM: 1MB (8xKM44C256AP-8), 4xSIMM30 - ISA8: 1, ISA18: 5 - On board: Floppy, IDE, par, 2xser +ROM_START( cl28612s ) // dies after initialising the graphics card + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "cl286-12s16s_even.bin", 0x10000, 0x08000, CRC(0e8d1b02) SHA1(43339afd2ce0acc38074359b81629658cc6936f6), ROM_SKIP(1) ) + ROMX_LOAD( "cl286-12s16s_odd.bin", 0x10001, 0x08000, CRC(09e35644) SHA1(cc5ca52cbf0b5fe4c315ce725715f759e6ca4f63), ROM_SKIP(1) ) +ROM_END + +// TD60C - chipset: CITYGATE D90-272 - BIOS: AMI 286 BIOS, EE265746 - Keyboard-BIOS: JETkey V3.0 +// BIOS-String: 30-0101-429999-00101111-050591-D90-0 / TD60C BIOS VERSION 2.42B - ISA16: 6 - CPU: CS80C286, FPU: i287XL +ROM_START( td60c ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "2cgm001.bin", 0x10000, 0x8000, CRC(35e4898b) SHA1(7ef8e097e010ec8dff9e33c4b42a278ff736059c)) + ROM_CONTINUE( 0x10001, 0x8000 ) +ROM_END + +// BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10.01 - CPU: AMD N80L286-16/S / FPU: socket provided - RAM: 640KB DIP / 4xSIPP30 +// Chipset: SUNTAC ST62??? ST62C303-A - BIOS: Phoenix - Keyboard-BIOS: NEC D8041AHC - ISA16: 4 - ISA8: 2 - OSC: [unreadable] - 32.000 MHz +ROM_START( suntac303 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "286-suntac-2055712.bin", 0x10000, 0x8000, CRC(407b89d8) SHA1(d419bdd8bfb6191c68254204efdd756c5131701c)) + ROM_CONTINUE( 0x10001, 0x8000 ) +ROM_END + +// Olivetti M203 motherboard - complains about "Timer Sync Error" +// on board Paradise PVGA1A VGA chip - Chipset: 2 TACT chips, one VLSI chip - one 16bit ISA "slot" in pin strip form intended for an expansion module +ROM_START( olim203 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-olivetti-m203-low.bin", 0x00000, 0x10000, CRC(d683dc20) SHA1(04271529139724d7a091490658b186b59a83676f), ROM_SKIP(1) ) + ROMX_LOAD( "286-olivetti-m203-high.bin", 0x00001, 0x10000, CRC(c7324ecf) SHA1(fa5ee92c21e54ec711d01b211760521a71ef424d), ROM_SKIP(1) ) +ROM_END + +// Snobol Mini 286 - BIOS-String: DGS2-1402-101090-K0 +// Chipset: GST GOLD GS62C101 and GS62C102 +ROM_START( snomi286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "gst_286.bin", 0x10000, 0x8000, CRC(89db769b) SHA1(3996856d637dc379978c0b5eb79362f46b60a80f) ) + ROM_CONTINUE( 0x10001, 0x8000) +ROM_END + +// PC-Chips M205 - Chipset: PCChips 4L50F2052 aka PCCHIP1 - ISA8: 3, ISA16: 5 +// the 64K ROM has first the 32K even, then the 32K odd part +// BIOS-String: S286-6181-101590-K0 +ROM_START( pccm205 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: v2.25, 17 January, 1991 (C) 1990 PC Chips INC. + ROM_SYSTEM_BIOS(0, "v225", "PC Chips v2.25") + ROMX_LOAD( "m205.bin", 0x10000, 0x8000, CRC(6f7bc8d6) SHA1(14062505b316e0d4409fb4e502651e09fea0a4c1), ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_CONTINUE( 0x10001, 0x8000) + // 1: v2.23, 29 December, 1990 (C) 1990 EVER-SUCCESS SYSTEMS LTD. + ROM_SYSTEM_BIOS(1, "v223", "Ever-Success Systems v2.23") + ROMX_LOAD( "m205_odd.bin", 0x10000, 0x8000, CRC(3a8ed558) SHA1(0648a2f1674bb07a175b983f107bb72c38ac1e61), ROM_SKIP(1) | ROM_BIOS(1) ) + ROM_CONTINUE( 0x10001, 0x8000) +ROM_END + +// PC-Chips M216 REV 1.2 - Chipset PC CHIPS CHIP 3 - CPU: Harris CS80C286-20, IIT 2C87-10 +// BIOS: AMI ; 07/07/91; S/NO. 0245157 - ISA16: 6 - BIOS-String: 30-0000-ZZ1437-00101111-070791-PC CHIPS-8 +ROM_START( pccm216 ) // no display + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "2pcm001.bin", 0x10000, 0x10000, CRC(9c7c9f05) SHA1(39cb6645d9aab846f7e64d1d44610ea3cbe52581)) +ROM_END + +// Unknown 80C286 motherboard (RAM: 4xSIMM30, 1MB DIP, ISA16: 6) - CPU: Harris CS80C286-16, FPU: 80287 - OSC: 32.000MHz, 14.31818 +// SARC RC2015; HM6818P; 82C042 or JETkey Keyboard BIOS; 1MB onboard RAM (8x LH64256AD-80) +ROM_START( sarcpc ) + ROM_REGION16_LE(0x20000, "bios", 0) // 27C512 + // BIOS-String: 20-0300-00834-00101111-050591-SARC286 / [80286 Standard System 2V1] + //ROM_SYSTEM_BIOS(0, "sarcrev12", "SARC Rev. 1.2") + ROM_LOAD( "sarcrev12.bin", 0x10000, 0x10000, CRC(1c5e3f2d) SHA1(1fcc8b1b9d9383467223dd41e420f9352beca654) ) +ROM_END + +// Everex EV-1806 (6 16-bit ISA, 1 8-bit ISA) - OSC: 14.31818MHz, 24.000MHz, 30.000MHz - RAM: 4 banks of 9xKM41C256P-8, sockets for 1MBit chips provided +// Everex IC-00121-0 + IC-00122-0; CHIPS P82C206; Intel 8272A(?); 146818A RTC +ROM_START( ev1806 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "everex_ev-1806_rev-f1a-21_even_u62.bin", 0x18000, 0x4000, CRC(7364e49b) SHA1(e8f5f41514005da0e36792e009cf3eae51c19c20), ROM_SKIP(1) ) + ROMX_LOAD( "everex_ev-1806_rev-f1a-21_odd_u61.bin", 0x18001, 0x4000, CRC(05c87bf7) SHA1(8c2243d9ee3d2af1517dc1134a22a7d1ed11262f), ROM_SKIP(1) ) +ROM_END + + +// MAT286 REV.D (5 16-bit ISA, 1 8-bit ISA, RAM: DIP 1MB, 2xSIPP30) - CPU: Siemens SAB 80286-16-N - OSC: 32.000MHz, 14.31818 +// Headland Technology HT12P-16/A; HM6818P RTC; JETkey keyboard BIOS; unmarked 40-pin DIP (prob. 80287) +ROM_START( mat286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // BIOS-String: DH12-1112-061390-K0 - HT-12 286 BIOS - Board is also used in Polish Optimus 286 computer with a special Hercules character ROM (also available) + // Files separated from single BIOS64 dump (PCB photo shows split ROMs are used) + ROMX_LOAD( "9221fkf_imp23256_ami-l.bin", 0x10000, 0x08000, CRC(55deb5c2) SHA1(19ce1a7cc985b5895c585e39211475de2e3b0dd1), ROM_SKIP(1) ) + ROMX_LOAD( "9221gjf_imp23256_ami-h.bin", 0x10001, 0x08000, CRC(04a2cec4) SHA1(564d37a8b2c0f4d0e23cd1e280a09d47c9945da8), ROM_SKIP(1) ) +ROM_END + +ROM_START( ec1842 ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "4202004.bin", 0x1c001, 0x2000, CRC(33fb5382) SHA1(35eb62328324d93e7a06f2f9d1ad0002f83fc99b)) + ROM_LOAD16_BYTE( "4202005.bin", 0x1c000, 0x2000, CRC(8e05c119) SHA1(9d81613b4fc305c14ae9fda0b1dd97a290715530)) + ROM_LOAD16_BYTE( "4202006.bin", 0x18001, 0x2000, CRC(6da537ef) SHA1(f79feb433dcf41f5cdef52b845e3550d5f0fb5c0)) + ROM_LOAD16_BYTE( "4202007.bin", 0x18000, 0x2000, CRC(d6ee0e95) SHA1(6fd4c42190e879501198fede70ae43bc420681d0)) + // EGA ROM + //ROM_LOAD16_BYTE( "4200009.bin", 0xc0000, 0x2000, CRC(9deeb39f) SHA1(255b859d3ea05891aa65a4a742ecaba744dfc923)) + //ROM_LOAD16_BYTE( "4200010.bin", 0xc0001, 0x2000, CRC(f2c38d93) SHA1(dcb3741d06089bf1a80cb766a6b94029ad698d73)) +ROM_END + +ROM_START( ec1849 ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "cpu-card_27c256_015.rom", 0x10000, 0x8000, CRC(68eadf0a) SHA1(903a7f1c3ebc6b27c31b512b2908c483608b5c13)) + ROM_LOAD16_BYTE( "cpu-card_27c256_016.rom", 0x10001, 0x8000, CRC(bc3924d6) SHA1(596be415e6c2bc4ff30a187f146664531565712c)) + //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_040.rom", 0xc0001, 0x2000, CRC(a3ece315) SHA1(e800e11c3b1b6fcaf41bfb7d4058a9d34fdd2b3f)) + //ROM_LOAD16_BYTE( "video-card_573rf6(2764)_041.rom", 0xc0000, 0x2000, CRC(b0a2ba7f) SHA1(c8160e8bc97cd391558f1dddd3fd3ec4a19d030c)) +ROM_END + +// Morse KP-286 +// BIOS-String: DS24-1216-061390-K0 +// Chipset: SUNTAC ST62C211 and ST62C203-A +ROM_START ( mkp286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-morse_kp286_lo.bin", 0x10000, 0x8000, CRC(0d35d2c9) SHA1(52b366608ea25a96d8e27c5d77689688fff38609), ROM_SKIP(1) ) + ROMX_LOAD( "286-morse_kp286_hi.bin", 0x10001, 0x8000, CRC(a5f640e0) SHA1(7bbb7fce54079005cb691816d2301a3eda475a82), ROM_SKIP(1) ) +ROM_END + + +// WYSEpc 286 - motherboard: WY-2200-01 - continuous ticks from the speaker +ROM_START( wy220001 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "wyse_tech_rev.a_250325-02_27128-15.bin", 0x18000, 0x4000, CRC(010f1c4d) SHA1(712d6ca4e4bdbc6b105c8691d612407edcfd9cf7), ROM_SKIP(1)) + ROMX_LOAD( "wyse_tech_rev.a_250326-02_27128-15.bin", 0x18001, 0x4000, CRC(37fcd62b) SHA1(ada0e232387c8ba7067168f50f8b7a89eb824c44), ROM_SKIP(1)) +ROM_END + + +// ***** 286 mainboards using the Chips & Technologies CS8221 NEAT chipset: P82C211 + P82C212 + P82C215 + P82C206 + +ROM_START( neat ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS-String: ENET-1131-030389-K0 + ROM_SYSTEM_BIOS(0, "neat286", "NEAT 286") + ROMX_LOAD( "at030389.0", 0x10000, 0x8000, CRC(4c36e61d) SHA1(094e8d5e6819889163cb22a2cf559186de782582),ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "at030389.1", 0x10001, 0x8000, CRC(4e90f294) SHA1(18c21fd8d7e959e2292a9afbbaf78310f9cad12f),ROM_SKIP(1) | ROM_BIOS(0)) + // 1: Phoenix 80286 ROM BIOS PLUS Version 3.10 12 - High Performance 286 ROM BIOS Ver C.12 + ROM_SYSTEM_BIOS(1, "pb800", "Packard Bell PB800") + ROMX_LOAD( "3.10.12-1.bin", 0x10001, 0x8000, CRC(e6bb54c5) SHA1(fa5a376dd44696c78dcc8994e18938b5e1b3e45a),ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "3.10.12-2.bin", 0x10000, 0x8000, CRC(bde46933) SHA1(c7221192f48d6f2f5b773c3c7d2a52b635cb473e),ROM_SKIP(1) | ROM_BIOS(1)) + // 2: DTK Corp. 286 Computer - DTK 286 Chipset ROM BIOS Version 3.26 - #24062890N - ISA8: 3, ISA16: 5, RAM: 1MB DIP, 4xSIMM30 + ROM_SYSTEM_BIOS(2, "ptm1632c", "UNIT PTM1632C DTK V.3.26") + ROMX_LOAD( "ptm1632c_l.bin", 0x10000, 0x8000, CRC(df0bc27c) SHA1(f94e2decd13c285c23b6a61c035cab88fa00ba6e), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "ptm1632c_h.bin", 0x10001, 0x8000, CRC(a80136e0) SHA1(5edc2d387efb42cf70361197de808ce1b06d8aec), ROM_SKIP(1) | ROM_BIOS(2)) + // 3: BIOS-String: DTK Corp. 286 COMPUTER - (C) DTK NEAT BIOS Ver 3.25N2 06/06/89 - DTK PTM-1233C - Chipset: P82C211; P82C212B; P82C215 - BIOS: dtk 286E 8864 - IS8: 3 - ISA16: 5 + ROM_SYSTEM_BIOS(3, "ptm1233c", "DTK PTM-1233C") + ROMX_LOAD( "286-dtk ptm-1233c-low_32k.bin", 0x10000, 0x8000, CRC(8909164c) SHA1(51978929a690746c1956ca6b1f0412777dc5d35b), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "286-dtk ptm-1233c-high_32k.bin", 0x10001, 0x8000, CRC(9105968c) SHA1(737d4df8040655315a648fed8a8d574f39e7dc35), ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: 286-NEAT - BIOS-String: ENET-1131-040990-K0 - NEAT V3.2 6-18-90 - ISA8: 3, ISA16: 5 + ROM_SYSTEM_BIOS(4, "286neat", "286-NEAT") + ROMX_LOAD( "286-neat_neat012-l-verify.bin", 0x10000, 0x8000, CRC(591d226c) SHA1(7f42797ead8213022192bb2bbbe2de7f6796ac6f), ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "286-neat_neat012-h-verify.bin", 0x10001, 0x8000, CRC(0198e2e4) SHA1(10ced383b6dc00c2e98b7bed0782f59a9c266625), ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: AUVA VIP BAM/16-11 - BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 20 - ISA8:1, ISA16: 5, Memory Slot: 1 + ROM_SYSTEM_BIOS(5, "bam1611", "VIP BAM/16-11") // OSC: 18.432 - 14.318 - 32.000MHz + ROMX_LOAD( "286-vip bam-6-11 m215100-lo_32k.bin", 0x10000, 0x8000, CRC(b51b8bc1) SHA1(a7ebbced98aca32a7f0cdf80d1b832dfeb92d5e7), ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "286-vip bam-6-11 m215100-hi_32k.bin", 0x10001, 0x8000, CRC(46ddd5a6) SHA1(fd4267af298c7f70e062a7c4e023caf852bbf082), ROM_SKIP(1) | ROM_BIOS(5) ) + // 6: CP-805 - BIOS-String: ENET-1138-030390-K0 + ROM_SYSTEM_BIOS(6, "cp805", "CP-805") + ROMX_LOAD( "286-chips ami78384 even.bin", 0x10000, 0x8000, CRC(5280fee0) SHA1(25051ad6bbccddc0738861b614dbafbca5c3bff5), ROM_SKIP(1) | ROM_BIOS(6) ) + ROMX_LOAD( "286-chips ami78384 odd.bin", 0x10001, 0x8000, CRC(24526bf3) SHA1(8f8b46fe2e708fa53d0eeb44a16924cd878bdd33), ROM_SKIP(1) | ROM_BIOS(6) ) + // 7: BIOS-String: ENET-1107-040990-K0 + ROM_SYSTEM_BIOS(7, "ami211", "AMI 21.1") /*(Motherboard Manufacturer: Dataexpert Corp. Motherboard) (Neat 286 Bios, 82c21x Chipset ) (BIOS release date:: 09-04-1990)*/ + ROMX_LOAD( "ami211.bin", 0x10000, 0x10000,CRC(a0b5d269) SHA1(44db8227d35a09e39b93ed944f85dcddb0dd0d39), ROM_BIOS(7)) + // 8: BIOS-String: ENET-1230-043089-K0 + ROM_SYSTEM_BIOS(8, "amic21", "AMI C 21.1") /* (Motherboard Manufacturer: Unknown.) (Neat 286 Bios, 82c21x Chipset ) (BIOS release date:: 30-04-1989) */ + ROMX_LOAD( "amic21-2.bin", 0x10001, 0x8000, CRC(8ffe7752) SHA1(68215f07a170ee7bdcb3e52b370d470af1741f7e),ROM_SKIP(1) | ROM_BIOS(8) ) + ROMX_LOAD( "amic21-1.bin", 0x10000, 0x8000, CRC(a76497f6) SHA1(91b47d86967426945b2916cb40e76a8da2d31d54),ROM_SKIP(1) | ROM_BIOS(8) ) + // 9: BIOS-String: - AGC N286 - CPU: AMD N80L286-16/S, FPU socket provided - RAM: 36xTMC64C1024-80N (18pin), 36x16pin sockets provided as an alternative (2xBank 0, 2xBank 1), 4xSIPP30 (2xBank 0/2 and 2xBank 1/3) + // Chipset: Chips P82C212B-12, P82C206 H, P82C211-12 C, P82C215-12 - OSC: 20.000, 32.000MHz, 24.0000MHz, 32.768KHz, 14.31818 - BIOS: AMI 286 BIOS PLUS CO.NO.1190 + // Keyboard-BIOS: AMI KEYBOARD BIOS PLUS CO.NO. 1190 - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS(9, "n286", "N286")// stops after initialising the graphics card + ROMX_LOAD( "286-chips-ami1190-even_32k.bin", 0x10000, 0x8000, CRC(db941036) SHA1(994cced82b5fb5f8833c718b4226a7e9620b56df),ROM_SKIP(1) | ROM_BIOS(9) ) + ROMX_LOAD( "286-chips-ami1190-odd_32k.bin", 0x10001, 0x8000, CRC(71cfc2d1) SHA1(8b8cf81161aec3e2c7f653e5d3a6b4e9627663c6),ROM_SKIP(1) | ROM_BIOS(9) ) +ROM_END + +// Chaintech ELT-286B-160B(E) mainboards - NEAT chipset: Chips P82C206, P82C211C, P82C212B, P82C215 +ROM_START( elt286b ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS/Version: AWARD A2133130/21323132 - BIOS-String: 286 Modular BIOS Version 0N3.03 NFS / ELT + // Keyboard-BIOS: AWARD A21266586 - OSC: 24.000MHz, 12.000MHz, 20.000MHz, 14(... unreadable) - ISA8: 2, ISA16: 5 + ROM_SYSTEM_BIOS(0, "160b", "ELT-286B-160B") + ROMX_LOAD( "286-elt-286b-160b_l_32k.bin", 0x10000, 0x8000, CRC(4514a284) SHA1(0f9d4a24bdd0fb6aa15c7c1db860c4e6df632091), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "286-elt-286b-160b_h_32k.bin", 0x10001, 0x8000, CRC(109bbf7c) SHA1(88b6b1c7c08739f8b198f05adbe6edc24be35fd0), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS/Version: Phoenix 2061618 BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 20 / Phoenix C&T 8221 NEAT Dual Mode BIOS / ELT + // Keyboard-BIOS: Phoenix/Intel i8242 - ISA8: 2, ISA16: 5 - OSC: 32.000MHz, 24.000MHz, 14.31818MHz + ROM_SYSTEM_BIOS(1, "160eb", "ELT-286B-160BE") + ROMX_LOAD( "286-2061618 l_32k.bin", 0x10000, 0x8000, CRC(f89aabc4) SHA1(94472edc9692b9da6450fb12994d62230c8cc5c5), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "286-2061618 h_32k.bin", 0x10001, 0x8000, CRC(e23a60bf) SHA1(48af3f123d30cd2fde9e42f2c9a57eec143287b6), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Advanced Logic Research PWB 7270 REV E - Chipset: Chips P82C212B-12 A, P82C211-12 C, P82C215 A 16 MHz, P62C206 H1, UMC xxx, DP8473V +// CPU: AMD N80L286-16/S, FPU: Intel D80287, Conntector for 386/486 FEATURE - RAM: 1MB (8x514256), 2xSIMM30 - OSC: 32.000MHz, 24.0000MHz, 1.8432MHz, 14.31818 MHz +// BIOS: POWER FLEX+ 3.10.09 ODD CS0F00, POWER FLEX+ 3.10.09 EVEN CS8A00 - Keyboard BIOS: M5L8042 - On board: IDE, keyboard, 2x25pin (ser/par?) - ISA16: 5 +// BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 09 - Advanced Logic Research, Inc. PowerFlex PLUS 286/386sx +// Timer chip counter 2 failed, Keyboard failure +ROM_START( pwb7270e ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "alreven.bin", 0x10000, 0x08000, CRC(b6428bae) SHA1(4e6e6eec67ff62cf8b4a3ce500bd15a54ee3d5fe), ROM_SKIP(1) ) + ROMX_LOAD( "alrodd.bin", 0x10001, 0x08000, CRC(6eedbcf0) SHA1(58173b6f749d40aa294747823d4b442c8938710e), ROM_SKIP(1) ) +ROM_END + + +// ***** 286 motherboards using the Acer (ALi) M1207 chipset + +// CMP enterprise CO.LTD. Phoenix 80286 ROM BIOS Version 3.00 +// ROM_SYSTEM_BIOS(26, "cmpa286", "CMP A286") /* (Chipset Acer (ALi) M1207-12) (BIOS release date:: 01-09-1986) (ISA8: 2, ISA16: 6) */ +ROM_START ( cmpa286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-a286-even_16k.bin", 0x18000, 0x4000, CRC(30809487) SHA1(413de43ca7e1930cdf3c006718d8baf743a9ff1e), ROM_SKIP(1) ) + ROMX_LOAD( "286-a286-odd_16k.bin", 0x18001, 0x4000, CRC(3a11aacf) SHA1(23185531ae10912b974048d3607b563e55d3fa96), ROM_SKIP(1) ) +ROM_END + +// AUVA VIP-M21502A BAM16-A0 - BIOS-String: DAR2-1105-061390-K0 - 286-BIOS AMI for AUVA 286, 02/08/1991 - ISA8:2, ISA16:5 +ROM_START( bam16a0 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-vip-m21502a-lo_32k.bin", 0x10000, 0x8000, CRC(413692db) SHA1(54bf664526b137cabf974c1fc659493e76243a88), ROM_SKIP(1) ) + ROMX_LOAD( "286-vip-m21502a-hi_32k.bin", 0x10001, 0x8000, CRC(5db9db04) SHA1(8085384b943454a708be3104b47f6793d0040ab1), ROM_SKIP(1) ) +ROM_END + + +// ***** 286 motherboards using the Chips SCAT 82C235 chipset + +// Biostar MB-1212C - ISA8:2, ISA16:5 +ROM_START ( mb1212c ) + // 0: BIOS-String: ESC2-1223-083090-K2 - 286 BIOS AMI for MB-1212C version 1.1 + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "mb1212_1", "mb1212_1") + ROMX_LOAD( "biostar mb-1212c.bin", 0x10000, 0x10000, CRC(153a783a) SHA1(acad4a3ffe93d3884dcb743c32d6317a132cda7b), ROM_BIOS(0) ) + // 1: CHIPS SCAT BIOS Version 125D - MB-1212C + ROM_SYSTEM_BIOS(1, "mb1212_2", "mb1212_2") + ROMX_LOAD( "mb-1212c.bin", 0x10000, 0x10000, CRC(4675530a) SHA1(c34b1c67ac29695e565363f484e17ab5f8ddaad5), ROM_BIOS(1) ) +ROM_END + + +// ***** 286 motherboards using the Headland G2 chipset + +// LM-103S - 1 8-bit ISA, 6 16-bit ISA - RAM: 4xSIPP30, 2 banks DIP (each bank has 4xV53C104AP80 and 2x16pin empty sockets) +// Headland Technology G2 chipset: HT101A + 2x HT102; HM6818P RTC; AMI keyboard BIOS 904189, BIOS AMI 904189 +// BIOS-String: D286-1234-121589-K0 - CPU: AMD N80L286-16/S - OSC: 32.000MHz, 14.31818MHz +ROM_START( lm103s ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "ami_lm103-s_lo.bin", 0x10000, 0x8000, CRC(a24be20b) SHA1(ffc5faf6d773154bf2f037556d2e381e81a28a58), ROM_SKIP(1) ) + ROMX_LOAD( "ami_lm103-s_hi.bin", 0x10001, 0x8000, CRC(7b63e60c) SHA1(da78b95b12051b6d4701a412fdc5e7874595c188), ROM_SKIP(1) ) +ROM_END + +// CDTEK board with Headland G2 chipset - ISA8:1, ISA16:5 +ROM_START ( cdtekg2 ) // BIOS-String: D286-1435-040990-K0 - Board is used in Polish California Access 286 with a special Hercules character ROM (also available) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286_cdtek headland-l_32k.bin", 0x10000, 0x8000, CRC(341fe2a3) SHA1(f8e10aea477c2b3c92b28a7e0fd0adf8ade22b9e), ROM_SKIP(1) ) + ROMX_LOAD( "286_cdtek headland-h_32k.bin", 0x10001, 0x8000, CRC(bd6fd54f) SHA1(72500ebe4041fbe635562bf55c5d3635257e38f1), ROM_SKIP(1) ) +ROM_END + +// Octek board with Headland G2 chipset - ISA8:2, ISA16:6 +//BIOS-String: 286 Modular BIOS Version 3.03 - O.O.A.L. +ROM_START ( octekg2 ) // BIOS-String: D286-1435-040990-K0 + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-octek-g2_u44_32k.bin", 0x10000, 0x8000, CRC(05892a08) SHA1(e12795524d87c422b0b5d660b36139592893e9c6), ROM_SKIP(1) ) + ROMX_LOAD( "286-octek-g2_u45_32k.bin", 0x10001, 0x8000, CRC(2f81de14) SHA1(952d9e35a6f8ea74eb8b4bf7ea80d7c358474cb8), ROM_SKIP(1) ) +ROM_END + +// Octek Fox M 286 Rev 1.1 - Chipset: Headland HT101A/2xHT102 - CPU: AMD N80L286-16/S, FPU socket provided - RAM: 514256x8 (4 empty tag sockets provided), 4xSIMM30 +// BIOS: AMI 286 BIOS 212491, Keyboard BIOS: AMI Keyboard BIOS setup - OSC: 32.000MHz, 14.31818 - ISA8: 2, ISA16: 4 - undumped PAL: PAL 090-103, 089-001, 090-011 +// BIOS-String: D286-6069-040990-K0 - BIOS release date:: 09-04-1990 +ROM_START( ocfoxm ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "ami_286_bios_sn200960_even.bin", 0x10000, 0x8000, CRC(67745815) SHA1(ca6886c7a0716a92a8720fc71ff2d95328c467a5), ROM_SKIP(1) ) + ROMX_LOAD( "ami_286_bios_sn200960_odd.bin", 0x10001, 0x8000, CRC(360a5f73) SHA1(1b1980fd99779d0cdc4764928a641e081b35ee9f), ROM_SKIP(1) ) +ROM_END + +ROM_START( headg2 ) + ROM_REGION16_LE( 0x20000, "bios", 0) + // 0: 286 board with Headland GC101A-PC; GC102-PC chipset and Phoenix BIOS 2493119, ISA8: 2, ISA16: 5 + ROM_SYSTEM_BIOS(0, "head_ph_1", "Headland/Phoenix #1") // Phoenix 80286 ROM BIOS PLUS Version 3.10.21 ((BIOS release date:: 15-01-1988) + ROMX_LOAD( "286-headland-lo_32k.bin", 0x10000, 0x8000, CRC(21b68bed) SHA1(1e4acda50b12ad463c169ba615805f5dcf257b18), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "286-headland-hi_32k.bin", 0x10001, 0x8000, CRC(04c8ab12) SHA1(b46c14528aca15464e4050b423c2f621a4313a85), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS-String: 286 Modular BIOS Version 3.03HL - ISA16: 5 + ROM_SYSTEM_BIOS(1, "head4530", "Headland 4530") + ROMX_LOAD( "286-headland 4530-high_32k.bin", 0x10001, 0x8000, CRC(f84c0e75) SHA1(42dc068d1cd5105cd576b023e2ccfe0f0646d4e3), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "286-headland 4530-low_32k.bin", 0x10000, 0x8000, CRC(0856dde8) SHA1(cee5d6002c405df984f3c7fa83c4f3e034f1e586), ROM_SKIP(1) | ROM_BIOS(1) ) + // 2: Quadtel Enhanced 286 BIOS Version 3.04.02 - Headland HT101, HT102 + ROM_SYSTEM_BIOS(2, "ami101", "AMI HT 101.1") /* (Quadtel Enhanced 286 Bios Version 3.04.02) (BIOS release date:: 09/11/1989) */ + ROMX_LOAD( "amiht-h.bin", 0x10001, 0x8000, CRC(8022545f) SHA1(42541d4392ad00b0e064b3a8ccf2786d875c7c19),ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "amiht-l.bin", 0x10000, 0x8000, CRC(285f6b8f) SHA1(2fce4ec53b68c9a7580858e16c926dc907820872),ROM_SKIP(1) | ROM_BIOS(2) ) +ROM_END + + +// ***** 286 motherboards using the Headland HT12/A chipset + +// Octek Fox II - Chipset: Headland HT12/A - BIOS String: DH1X-6069-113090-K0 - HT-1X 286 BIOS +ROM_START( o286foxii ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-fox2-even_32k.bin", 0x10000, 0x8000, CRC(54dc119f) SHA1(4bc543beef0d2201fa20eac90a0a6ca38ebf0dbf), ROM_SKIP(1)) + ROMX_LOAD( "286-fox2-odd_32k.bin", 0x10001, 0x8000, CRC(e5db7775) SHA1(2bd0572b9f7c76eff51375b551586ca8484e2a74), ROM_SKIP(1)) +ROM_END + +// BI-025C HT12 286 - Chipset: Headland HT12/A - BIOS-String: DH12-1103-061390-K0 - ISA8: 2, ISA16: 5 +ROM_START( bi025c ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "bi-025c-ht12_even.bin", 0x10000, 0x8000, CRC(7ea7e088) SHA1(e245b3ecce39e85cacb17abf60d2cee000d1750d), ROM_SKIP(1)) + ROMX_LOAD( "bi-025c-ht12_odd.bin", 0x10001, 0x8000, CRC(f18b3eef) SHA1(e14d4b3ea0234613e60512cf79e5580c9ce7f3f6), ROM_SKIP(1)) +ROM_END + +ROM_START( ht12a ) + ROM_REGION16_LE(0x20000, "bios", 0) + //0: BIOS-String: DH12-1343-061390-K0 + // Original BIOS64 dump split into even and odd bytes (matches another dump of the same BIOS) + // ROM at U6 has sticker with AMI 253770 label; "BB012" at U8 is probably other half of BIOS, though not clear which half is which + // Unknown motherboard (similar layout to LM-103S; 4 SIMM, 5 16-bit ISA, 2 8-bit ISA) + // Headland HT12/A; HM6818A RTC; AMI K053770 keyboard BIOS + // Jumpers at right edge of board are labeled "KEYLOCK" (J6), "SPEAKER" (J7), "TURBO LED" (J8), "TURBO S.W." (J9), "RESET" (J10) + // XTALs X3 and X4 in top right corner (behind 80C287) are both unpopulated + ROM_SYSTEM_BIOS(0, "dh12-k0", "AMI DH12-K0") + ROMX_LOAD( "286_headland_even.bin", 0x10000, 0x8000, CRC(a2530914) SHA1(1aca289240caa6d4bf811d301c338c157b6902a1), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "286_headland_odd.bin", 0x10001, 0x8000, CRC(b5f69002) SHA1(ee9ceef1fc7a328ee82006cd504e72e16f21b3c8), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: 286 board with Headland Headland HT12/A chipset, one ROM market IQS, Phoenix BIOS 3479808 - ISA8: 1, ISA16: 6 + ROM_SYSTEM_BIOS(1, "head_ph_2", "Headland/Phoenix #2") // Phoenix BIOS A286 Version 1.01 - BIOS ID JLI01101 - IT9109 - Reference ID 01 - (BIOS release date:: 19-04-1990) + ROMX_LOAD( "286-headland-iqs-lo_32k.bin", 0x10000, 0x8000, CRC(60424e9d) SHA1(aa813bf48939fe7fcbbfec3133e702bfdff6234e), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "286-headland-iqs-hi_32k.bin", 0x10001, 0x8000, CRC(e56212e0) SHA1(2441845d632d19adc0592e094beb5ec1fbe074f6), ROM_SKIP(1) | ROM_BIOS(1) ) + // BIOS-String: Quadtel HT12 286 BIOS Versio 3.05.03 + // 2: Same board as #1, CPU: AMD N80L286-16S, FPU socket provided, Chipset: Headland HT12 - OSC: 14.31818, 8.000, 32.000MHZ, unpopulated: ASYN BUS CLK + // RAM: 8xHYB514256B-60 (8x20pin, alternativelx 4x18pin), Parity (2x16pin, 2x18pin) empty, 4xSIMM30 (Bank0 SIMM, Bank1 SIMM) - BIOS: Quadtel BIOS Software 286 253893 + // Keyboard-BIOS: Quadtel BIOS Software KEY 316018 (undumped) - JP7: NO ASYN CLK, JP4: CMOS RAM CLEAR, JP3: COLOR - JP: 80287CLK=ASYN CLK + ROM_SYSTEM_BIOS(2, "quadtel", "Quadtel") + ROMX_LOAD( "bios-lo.bin", 0x10000, 0x8000, CRC(433d8044) SHA1(3435d51fad97247b4bcfdb2f3fdb358d99b0e6ea), ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "bios-hi.bin", 0x10001, 0x8000, CRC(fe124da4) SHA1(b3e4e598cf1f5cada1b101d0c6434770017de3c6), ROM_SKIP(1) | ROM_BIOS(2) ) + // 3: BIOS-String: DH12-1164-083090-K0 - CPU/FPU: N80L286-16/S, P80C287-10 - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS(3, "head12a01", "Headland HT12/A #1") + ROMX_LOAD( "2hlm002l.bin", 0x10000, 0x8000, CRC(345b9ea1) SHA1(868cc309e433e0dcc9f3aa147263017b7f822461), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "2hlm002h.bin", 0x10001, 0x8000, CRC(35eed8b8) SHA1(119f2676aef038301c3e0bcdb999da6fd740e6a5), ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: MBL M21 - BIOS-String: DH12-1211-061390-K0 / HT-12 286 BIOS - Chipset: Headland HT12/A + ROM_SYSTEM_BIOS(4, "ami121", "AMI HT 12.1") /* (BIOS release date:: 13-06-1990) */ + ROMX_LOAD( "ami2od86.bin", 0x10001, 0x8000, CRC(04a2cec4) SHA1(564d37a8b2c0f4d0e23cd1e280a09d47c9945da8),ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "ami2ev86.bin", 0x10000, 0x8000, CRC(55deb5c2) SHA1(19ce1a7cc985b5895c585e39211475de2e3b0dd1),ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: SPEC 286 rev 4a - BIOS-String: DH12-1120-061390-K0 + ROM_SYSTEM_BIOS(5, "ami122", "AMI HT 12.2") /* (BIOS release date:: 13-06-1990) */ + ROMX_LOAD( "ami2ev89.bin", 0x10000, 0x8000, CRC(705d36e0) SHA1(0c9cfb71ced4587f109b9b6dfc2a9c92302fdb99),ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "ami2od89.bin", 0x10001, 0x8000, CRC(7c81bbe8) SHA1(a2c7eca586f6e2e76b9101191e080a1f1cb8b833),ROM_SKIP(1) | ROM_BIOS(5) ) + // 6: BIOS-String: DH12-1112-061390-K0 + ROM_SYSTEM_BIOS(6, "ami123", "AMI HT 12.3") /*(Motherboard Manufacturer: Aquarius Systems USA Inc.) (BIOS release date:: 13-06-1990)*/ + ROMX_LOAD( "ht12h.bin", 0x10001, 0x8000, CRC(db8b471e) SHA1(7b5fa1c131061fa7719247db3e282f6d30226778),ROM_SKIP(1) | ROM_BIOS(6) ) + ROMX_LOAD( "ht12l.bin", 0x10000, 0x8000, CRC(74fd178a) SHA1(97c8283e574abbed962b701f3e8091fb82823b80),ROM_SKIP(1) | ROM_BIOS(6) ) + // 7: ID: H286-C3 158 - Chipset: Headland HT12/A3A0050 - BIOS: AMI 286 BIOS SETUP 649963 - Keyboard BIOS: JET ELECTRONICS CO LTD SN 9 0922133 + // BIOS-String: DH12-1164-083090-K - CPU: AMD N80L286-12/S, FPU socket provided - RAM: SIMM30: 4, 1MB DIP - OSC: 8.000MHZ - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS(7, "h286c3", "H286-C3") + ROMX_LOAD( "h286-c3-158-hi.bin", 0x10001, 0x8000, CRC(ec0cbbba) SHA1(97d7f32cb9c622cfbd08909ac67d09a8aa734430),ROM_SKIP(1) | ROM_BIOS(7) ) + ROMX_LOAD( "h286-c3-158-lo.bin", 0x10000, 0x8000, CRC(dedcf41a) SHA1(ede2c852b3e947ce4efa54640b2e37db83355a6c),ROM_SKIP(1) | ROM_BIOS(7) ) + // 8: CPU: Harris 286-16, FPU socket provided - Chipset: Headland HT12P-16/A - BIOS: AMIBIOS 03/15/91 - BIOS-String: 20-0000-428022-00101111-031591-HT12-F + // RAM: 1MB DIP, 4xSIMM30 - ISA8: 1, ISA16: 6 - OSC: 32.000MHz, 14.31818 + ROM_SYSTEM_BIOS(8, "8022", "8022") // no display + ROMX_LOAD( "20-0000-428022-00101111-031591-ht12 low.bin", 0x10000, 0x8000, CRC(cb74f8e3) SHA1(fc874787f960587ba37442d59af1beebcfd798b9),ROM_SKIP(1) | ROM_BIOS(8) ) + ROMX_LOAD( "h20-0000-428022-00101111-031591-ht12 high.bin", 0x10001, 0x8000, CRC(36179ed9) SHA1(25968319bcd35ff06a0f0edac6ff0246f3f79c25),ROM_SKIP(1) | ROM_BIOS(8) ) +ROM_END + + +// ***** motherboards using the six chip SUNTAC chipset: ST62BC001-B, ST62BC002-B, ST62BC003-B, ST62C006, ST62BC004-B1, ST62BC005-B + +// Magitronic B233 (8 ISA slots) +// SUNTAC Chipset, http://toastytech.com/manuals/Magitronic%20B233%20Manual.pdf +// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 +ROM_START( magb233 ) + ROM_REGION16_LE(0x20000, "bios", 0) // BIOS-String: DSUN-1105-043089-K0 + ROMX_LOAD( "magitronic_b233_ami_1986_286_bios_plus_even_sa027343.bin", 0x10000, 0x8000, CRC(d4a18444) SHA1(d95242104fc9b51cf26de72ef5b6c52d99ccce30), ROM_SKIP(1) ) + ROMX_LOAD( "magitronic_b233_ami_1986_286_bios_plus_odd_sa027343.bin", 0x10001, 0x8000, CRC(7ac3db56) SHA1(4340140450c4f8b4f6a19eae50a5dc5449edfdf6), ROM_SKIP(1) ) + // ROM_LOAD("magitronic_b233_ami_1986_keyboard_bios_plus_a025352.bin", 0x0000, 0x0800), CRC(84fd28fd) SHA1(43da0f49e52c921844e60b6f3d22f2a316d865cc) ) +ROM_END + +// Magitronic B236 (ISA8: 2, ISA16: 6) - 286 Modular BIOS Version 3.03GX +// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 +ROM_START( magb236 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "sunt-lo.rom", 0x18000, 0x4000, CRC(d05c0edf) SHA1(bfd9c68cd5dc874b9519056b3a8cc6ea504b0be3), ROM_SKIP(1) ) + ROMX_LOAD( "sunt-hi.rom", 0x18001, 0x4000, CRC(e5dce491) SHA1(282ad2da0ef47147cbc0c68295e3d4249f4147b2), ROM_SKIP(1) ) +ROM_END + +// AUVA COMPUTER, INC. BAM/12-S2 - VIP - Phoenix 80286 ROM BIOS PLUS Version 3.10 10 +// Chipset: SUNTAC ST62BC004-B1, ST62BC001-B, ST62BC002-B, ST62BC003-B, ST62BC005-B - ISA8: 3, ISA16: 5 +ROM_START( aubam12s2 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "st-ph-l.rom", 0x00001, 0x10000, CRC(7f60168c) SHA1(a6d8dafa6319753466243dbde9676fa0e402f5fe), ROM_SKIP(1)) + ROMX_LOAD( "st-ph-h.rom", 0x00000, 0x10000, CRC(5b4fd7ee) SHA1(821fe868da5c7ff28f2c7b9bae03d0b8a76af796), ROM_SKIP(1)) +ROM_END + +// HLB-286 MBA-009 - BIOS: 286 Modular BIOS Version 3.03 HL - HLB-286 System +// SUNTAC ST62BC002-B, ST62BC005-B, ST62BC003-B, ST62BC001-B, ST62C00B, ST62BC004-B1 +ROM_START( mba009 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "hlb-286l.bin", 0x18000, 0x4000, CRC(9085b21c) SHA1(4f264612c458ab03f94dbac9852fcf9dea2065cc), ROM_SKIP(1)) + ROMX_LOAD( "hlb-286h.bin", 0x18001, 0x4000, CRC(03cdbee8) SHA1(9ea5f91a76bc8861fdc7e5381e8dc15f8fb428f5), ROM_SKIP(1)) +ROM_END + +// Everex EV-1815 (C & T/Suntac) - RAM: 4xSIMM30, 512KB or 1MB total (2/4 SIMMs) +ROM_START( ev1815 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: Award 286 Modular BIOS Version 3.03 - GCH + // additional info from chukaev.ru54.com: SUNTAC ST62BC... 001-B, 002-B, 003-B, 004-B1, 005 - ISA8: 3, ISA16: 5 - CPU/FPU: N80L286-10, 80287 + ROM_SYSTEM_BIOS(0, "ev1815303", "Everex EV-1815 V3.03") /* (BIOS release date:: 15-11-1985) */ + ROMX_LOAD( "award_v3.03_ev1815_even.bin", 0x18000, 0x4000, CRC(dd64bdd6) SHA1(b3108b692d2aa03701ac894602e9418ae0779702), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "award_v3.03_ev1815_odd.bin", 0x18001, 0x4000, CRC(29f023fb) SHA1(873561bb7087483c0c763ef9cd32c1adf0f7cb5e), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: Award 286 Modular BIOS Version 3.03GS + ROM_SYSTEM_BIOS(1, "ev1815303gs", "Everex EV-1815 V3.03GS") /* (BIOS release date:: 15-11-1985) */ + ROMX_LOAD( "award_v3.03gs_ev1815_even.bin", 0x10000, 0x8000, CRC(59489ec2) SHA1(b3c13ba53d4c4ee75a15703236a748121102ce84), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "award_v3.03gs_ev1815_odd.bin", 0x10001, 0x8000, CRC(5bcd9421) SHA1(f32e5a39da593c6982f964fb05b0802d54c3de45), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Mintek BAY-1000C V1.01 - Chipset: SUNTAC ST62BC002-B, ST62C005-B, ST62BC001-B, ST62BC003-B, ST62BC004-B1, ST62C008 +// CPU: AMD N80L286-12/S - RAM: 4xSIMM30, 18x18pin/16pin, 8x20pin, 4x16pin - OSC: 12.000, 14.31818, 25.000MHz - ISA8: 2, ISA16: 6 +// BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 00 / LYI-CHENG ENTERPRISE CO., LTD. +ROM_START( bay1000c ) + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD16_BYTE( "286-suntac_bay-1000c-ic22_32k.bin", 0x10000, 0x8000, CRC(105d3257) SHA1(cf10d09db57f65fee649adcb39058d9d9aefe9e9)) + ROM_LOAD16_BYTE( "286-suntac_bay-1000c-ic23_32k.bin", 0x10001, 0x8000, CRC(3b997bb1) SHA1(70d3bb9e57624c9f64d70bc5f3c00305a08a8b2e)) +ROM_END + +ROM_START( suntac6 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // CPU: AMD N80L286-12/S - RAM: 36 sockets 18pin/16pin, fitted: 36x41C256P-8 - BIOS: Award 286 - Keyboard-BIOS: M5L8042-165P + // ISA8: 2, ISA16: 6 - OSC: 12.000 MHz, 24.000, 14.31818 + // 0: BIOS-String: 286 Modular BIOS Version 3.03 01 Copyright Award Software Inc. + ROM_SYSTEM_BIOS(0, "terraat", "Terra AT") + ROMX_LOAD( "286-suntac-award_a2132439lo.bin", 0x18000, 0x4000, CRC(5fa269f8) SHA1(4167017aaeb63f4eedde155ba29f33ae2a94403b), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "286-suntac-award_a2132439hi.bin", 0x18001, 0x4000, CRC(114604c3) SHA1(db957783e6b16f6e1b8a831130d37fe51da84430), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS-String: 286 Modular BIOS Version 0N3.03 NFS / ELT - board is identical to #0 + ROM_SYSTEM_BIOS(1, "286suntacelt", "286 SUNTAC ELT") + ROMX_LOAD( "286-suntac-award_a2184058lo.bin", 0x18000, 0x4000, CRC(dbf48678) SHA1(75cb7971519cf55f9bb024eed70b831af1799506), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "286-suntac-award_a2184058hi.bin", 0x18001, 0x4000, CRC(2abea425) SHA1(1183d1fc665eab11042643c4f2e0eaa0490bb3df), ROM_SKIP(1) | ROM_BIOS(1) ) + // 2: BIOS-String: DSUN-1105-043089-K0 - Keyboard-BIOS: AMI Keyboard BIOS PLUS A086031 + // CPU: Intel N80286-12 - RAM: 36x16pin/16pin, used 36xTC511000AP-80 - ISA8: 2, ISA16: 6 - BIOS: AMI 286 BIOS PLUS SA073155 + ROM_SYSTEM_BIOS(2, "sa073155", "SA073155") + ROMX_LOAD( "286-suntac_sa073155_ic22.bin", 0x00000, 0x10000, CRC(abf6c367) SHA1(79a07b9b9af2e1963cfcae75fafc3478885237cb), ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "286-suntac_sa073155_ic23.bin", 0x00001, 0x10000, CRC(1d286cd9) SHA1(31be40c5008dc67cb24f4418cffaa57682e654c0), ROM_SKIP(1) | ROM_BIOS(2) ) + // 3: BIOS ROMs are marked TCI, Award 286 Modular BIOS Version 3.03HLS + // complains about "refresh timing error, but works - BIOS release date:: 15-11-1985 + ROM_SYSTEM_BIOS(3, "tci", "TCI") + ROMX_LOAD( "suntac_80286_lo.bin", 0x18000, 0x4000, CRC(f7bf6c49) SHA1(d8e813c264008f096006f46b90769c0927e44da9), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "suntac_80286_hi.bin", 0x18001, 0x4000, CRC(5f382e78) SHA1(8ba222df9d7028513e37978598d8139906e8834c), ROM_SKIP(1) | ROM_BIOS(3) ) + // 4: BIOS-String: D286-5017-011388 + ROM_SYSTEM_BIOS(4, "st62m02", "ST62M-02-B") + ROMX_LOAD( "7_st62m02-b_l.bin", 0x10000, 0x8000, CRC(fd24911f) SHA1(71ab1177d0b6b9482353e3b405f4b332cbeecfc3), ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "7_st62m02-b_h.bin", 0x10001, 0x8000, CRC(fca78c7b) SHA1(35e892bf52fb1cbc9bfaed7866c2ef7a31d4b762), ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 00 - LYI-CHENG ENTERPRISE CO., LTD. + ROM_SYSTEM_BIOS(5, "bay1000", "Bay 1000") + ROMX_LOAD( "286-suntac-bay-1000c-ic22.bin", 0x18000, 0x4000, CRC(7f3ef79e) SHA1(d4f7086e2902d3b264b1fff76d1bea811aa58fc5), ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "286-suntac-bay-1000c-ic23.bin", 0x18001, 0x4000, CRC(cca972a4) SHA1(22bd712700bfacd34070e704e901623ecc37a390), ROM_SKIP(1) | ROM_BIOS(5) ) + // 6: BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10.22 - Personal computer 286 + ROM_SYSTEM_BIOS(6, "st2806036", "Suntac ST2806036") + ROMX_LOAD( "286-suntac-2806036-lo.bin", 0x10000, 0x8000, CRC(907dcbf7) SHA1(8782e49926366d7a640c60b875e6c091091a2f54), ROM_SKIP(1) | ROM_BIOS(6) ) + ROMX_LOAD( "286-suntac-2806036-hi.bin", 0x10001, 0x8000, CRC(ba24e88f) SHA1(07983752c8128ae62391737f428d6db42fefdbb8), ROM_SKIP(1) | ROM_BIOS(6) ) + // 7: BIOS-String: 286 Modular BIOS Version 3.03YK2 Copyright Award Software Inc. - YOUTH KEEP ENTERPRISE CO., LTD. + ROM_SYSTEM_BIOS(7, "youth", "Suntac Youth") + ROMX_LOAD( "286-suntac-youth-rom1-128.bin", 0x18000, 0x4000, CRC(f232c31b) SHA1(49b9990c951a61bde10478cbb5db4b913baae1e2), ROM_SKIP(1) | ROM_BIOS(7) ) + ROMX_LOAD( "286-suntac-youth-rom3-128.bin", 0x18001, 0x4000, CRC(0735b127) SHA1(0c79cbd7d40b75dcba5fe33bf8e3a96050e12af5), ROM_SKIP(1) | ROM_BIOS(7) ) + // 8: BIOS-String: 286 Modular BIOS Version 3.01, Copyright Award Software Inc. - ECS + // complains about Refresh Timing Error + ROM_SYSTEM_BIOS(8, "ecs", "Suntac ECS") + ROMX_LOAD( "st62_award_3.01_ecs_suntac_rom1.bin", 0x18000, 0x4000, CRC(17296492) SHA1(3a3bf7c20946ef56b767f54c8de45cd46d5c1167), ROM_SKIP(1) | ROM_BIOS(8) ) + ROMX_LOAD( "st62_award_3.01_ecs_suntac_rom3.bin", 0x18001, 0x4000, CRC(5f0aa2d9) SHA1(5ed5897adb4507c399f200dad9337c1c8b246a48), ROM_SKIP(1) | ROM_BIOS(8) ) + // 9: AMI 286 BIOS for MORSE Personal Computer - BIOS-String: DSUN-1216-091589-K0 + ROM_SYSTEM_BIOS(9, "stmorse", "ST-Morse") + ROMX_LOAD( "st-morse.bio", 0x10000, 0x10000, CRC(7136e89f) SHA1(50d15f96dba855e58bb39c937ad9358fc0084b10), ROM_BIOS(9) ) + // 10: 286-BIOS (C)1987 AMI, for CDTEK - BIOS-String: DSUN-1202-043089-K0 + ROM_SYSTEM_BIOS(10, "sunami", "Suntac AMI") + ROMX_LOAD( "suntac_ami_286_even_bios.bin", 0x10001, 0x8000, CRC(acdffb05) SHA1(180fd693bf86a6fdecc713d5873f3c0950b56c98), ROM_SKIP(1) | ROM_BIOS(10) ) + ROMX_LOAD( "suntac_ami_286_odd_bios.bin", 0x10000, 0x8000, CRC(9003d5ad) SHA1(6a2de572d11625ecdacc4ad7b5c324b160540541), ROM_SKIP(1) | ROM_BIOS(10) ) + // 11: BIOS-String: Phoenix 286 ROM BIOS PLUS Version 3.10 10 - VIP + ROM_SYSTEM_BIOS(11, "sunphovip", "Suntac Phoenix VIP") + ROMX_LOAD( "st-ph-l.rom", 0x10001, 0x8000, CRC(ebb6446f) SHA1(086a8f016c2c0cc56d3bd7ea4e152ae215d4e5ce), ROM_SKIP(1) | ROM_BIOS(11) ) + ROMX_LOAD( "st-ph-h.rom", 0x10000, 0x8000, CRC(1c77bd34) SHA1(0dea2dd8ba69fdfb829d152840817bcbdcc3e394), ROM_SKIP(1) | ROM_BIOS(11) ) + // 12: BIOS-String: 286-BIOS (C) AMI, for SUPERCOM - SSUN-1120-042589-K0 + ROM_SYSTEM_BIOS(12, "supercom", "Suntac Supercom") + ROMX_LOAD( "supercom_lo.bin", 0x18000, 0x4000, CRC(6c8ce417) SHA1(fc2cdc9d23e9d75bb48d26b102873a9964871f52), ROM_SKIP(1) | ROM_BIOS(12) ) + ROMX_LOAD( "supercom_hi.bin", 0x18001, 0x4000, CRC(6c1b645d) SHA1(0def25267428338804c5858e3f536720a2b7d349), ROM_SKIP(1) | ROM_BIOS(12) ) + // 13: + ROM_SYSTEM_BIOS(13, "suntacmr", "Suntac MR BIOS") + ROMX_LOAD( "v000v200-1.bin", 0x10000, 0x8000, CRC(1a34d56e) SHA1(ae950de20641c6394485d891e50136b1dc5261e3), ROM_SKIP(1) | ROM_BIOS(13) ) + ROMX_LOAD( "v000b200-2.bin", 0x10001, 0x8000, CRC(2aeea8bd) SHA1(e6c306cc56dd614d704262a087dcc07b75fd9ac6), ROM_SKIP(1) | ROM_BIOS(13) ) +ROM_END + +// ***** 286 motherboards using the 5 chip VLSI chipset + +ROM_START( vlsi5 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: MG Products (Japanese) - Chipset: VLSI VL82C102A; VLSI VL82C101B; VLSI VL82C104; VLSI VL82C103A; VLSI VL82C100; (VLSI 8908BT; 8906BT; 8852BT; 8907BT; 8906BT) + // BIOS: AMI 286 BIOS+ - BIOS-String: D286-9987-092588-K0 - ISA8: 2, ISA16: 8 + // (BIOS release date:: 25-09-1988) (ISA8: 3, ISA16: 5) + ROM_SYSTEM_BIOS(0, "286vlsij", "Japanese 286 VLSI") + ROMX_LOAD( "286-vlsi_japan-2-even_32k.bin", 0x10000, 0x8000, CRC(e3e64cbc) SHA1(5259e3c8686f2239a5fb0dc38aa80380ef9ec5fa), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "286-vlsi_japan-2-odd_32k.bin", 0x10001, 0x8000, CRC(aa533f39) SHA1(d88c7d4029a283b94b99e2017d29fbf9eb9105b1), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS-String: D286-1223-121589-K0 - 286-BIOS AMI for MBVLSI-168 - ISA8: 3, ISA16: 5 + ROM_SYSTEM_BIOS(1, "mbvlsi168", "MBVLSI-168") + ROMX_LOAD( "286-vlsi-002350-041_32k.bin", 0x10000, 0x8000, CRC(0e0e2bc9) SHA1(0af05b15ea8141ece84fb4420e6a21720f01c7a6), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "286-vlsi-002350-042_32k.bin", 0x10001, 0x8000, CRC(5ef7b91d) SHA1(d57c7f4c8d28708f128c5f0b1251d5943c7cdf76), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Uniron U3911-V3 - Chipset as above - BIOS-String: Phoenix 80286 ROM BIOS PLUS Version 3.10 00 - P/N 891012 - 80286 +ROM_START( u3911v3 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286-uniron-u13_32k.bin", 0x10001, 0x8000, CRC(c1acdf6d) SHA1(cb064dac00620588f66f850fee91ef6b47e57012), ROM_SKIP(1) ) + ROMX_LOAD( "286-uniron-u14_32k.bin", 0x10000, 0x8000, CRC(d2e9c52a) SHA1(ff6726b527b0bebed50c053a698e1b61aada3043), ROM_SKIP(1) ) +ROM_END + +// Toptek 286 Turbo (board name somewhat uncertain; 5x 8-bit ISA, 3x 16-bit ISA, 2 banks of onboard RAM + 2 banks expansion RAM) +// VLSI VL82C100 + VL82C101B + VL82C102A + VL82C103A + VL82C104; MC146818 or HM6818P RTC; unidentified keyboard controller +ROM_START( toptek286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // BIOS-String: D286-1295-091589-K0 + // Original BIOS64 dump split into even and odd bytes based on available PCB info + ROM_LOAD16_BYTE( "toptek_vlsi_even.bin", 0x10000, 0x8000, CRC(f35465e8) SHA1(c85afc2168e355120c63b68d5c11fce7770fe1b7) ) + ROM_LOAD16_BYTE( "toptek_vlsi_odd.bin", 0x10001, 0x8000, CRC(b7272729) SHA1(686c976b9b7989862846a79d00f1f9116f03bc17) ) +ROM_END + + +// ***** 286 motherboards using the 5 chip Winbond chipset W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP + +// KT216WB5-HI Rev.2 (1 8-bit ISA, 5 16-bit ISA) - CPU: Harris CS80C286-16, FPU: 80287 - OSC: 32.000MHz, 14.31818 +// Winbond W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP; MC146818AP RTC; JETkey keyboard BIOS - RAM: 1MB DIP, 4xSIPP30 +ROM_START( kt216wb5 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // BIOS-String: D286-1149-083090-K0 - WIN 286 BIOS + ROMX_LOAD( "kt216wb5_even.bin", 0x10000, 0x8000, CRC(6b5509c0) SHA1(73b303b90cc0cd23b7e13362019193c938a2e502), ROM_SKIP(1) ) + ROMX_LOAD( "kt216wb5_odd.bin", 0x10001, 0x8000, CRC(af541ada) SHA1(26d2617dbe8c15f1b0d4782375bcb291a7923703), ROM_SKIP(1) ) +ROM_END + +// KMA-202F-12R - ISA16:7 - BIOS-String: 286 Modular BIOS Version 3.11 +// Winbond W83C201P + W83C202AP + W83C203AP + W83C204P + W83C205AP; DS12887+ RTC; AWARD keyboard BIOS +ROM_START( kma202f ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "286_lo.bin", 0x10000, 0x8000, CRC(0ce69691) SHA1(6904ac54f30f2244058653aaa623804dd02b4332), ROM_SKIP(1) ) + ROMX_LOAD( "286_hi.bin", 0x10001, 0x8000, CRC(1330b6f2) SHA1(691bb4a51ce3d9a026ee33c3fd02fc4e13b4a184), ROM_SKIP(1) ) +ROM_END + + +//************************************************************************** +// 80286 Desktop +//************************************************************************** + +// SIIG MiniSys 2000 - Motherboard ID: Labway MS101V1.2 - This is a tiny 286 system, the width of a 3.5" disk drive with an external power supply. +// A physical switch allows to change between VGA and composite video output. +// CPU: Intel 286-12 - BIOS: AMIBIOS - Bios string: DH12-1422-061390-K0 - Chipset: Headland HT12/A, Acer M5105 - RAM: 2xSIMM30 +// OSC: 14.31818MHz, 24.000MHz, 24.000, another unreadable - ISA16: 1 (on riser board) - on board: IDE, Floppy, 2xser, par, game, composite, VGA, +// ext. FDD (motherboard and I/O board connected with a riser board - Mass storage: 3.5" FDD, 3.5" HDD (e.g. Seagate ST351A/X in AT mode) +ROM_START( minisys2k ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "minisys2000_even.bin", 0x10001, 0x8000, CRC(a4c3eade) SHA1(ea6d19fa12994882f8a77f67c2c358bba57abe28), ROM_SKIP(1) ) + ROMX_LOAD( "minisys2000_odd.bin", 0x10000, 0x8000, CRC(0e904497) SHA1(a55de8fdaf0442cc7c640dfc88daa37c851fd324), ROM_SKIP(1) ) +ROM_END + + +// ICL DRS M40 (motherboard: ICL M40/M45/915V) +// Chipset: Chips and Technologies NEAT, WD37C65C-PL - CPU: - FPU socket provided - BIOS: Acer (made by Phoenix) - Keyboard BIOS: KBC V4 82HV +// OSC: 10.000000MHz, 16.000MHz, 25.175999MHz, 32.000000MHz, 14.31818 - RAM: DIP 640KB, 4xSIMM30, 2xSIMM/SIPP30 no sockets - VGA on board: PVGA1A-JK, 256KB RAM +// no regular ISA slots, ISA8: 1, ISA16: 1 on a riser card - On board: IDE, floppy, par, 2xser +ROM_START( icldrsm40 ) // no POST, halts + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "icl_m40_l_bin", 0x10000, 0x8000, CRC(1b493570) SHA1(2a3cee0e7a45f07439c54970513e85c9134fee32), ROM_SKIP(1) ) + ROMX_LOAD( "icl_m40_h.bin", 0x10001, 0x8000, CRC(451421af) SHA1(82d3c94cf04df1b48540fbb3c4d9ad4d6eac8823), ROM_SKIP(1) ) + + ROM_REGION( 0x8000, "vga", 0) // WDC WD90C11-LR VGA BIOS + ROMX_LOAD( "icl_m40_vga_bios_l.bin", 0x0000, 0x4000, CRC(522c5c02) SHA1(37f8299a0dcf6b028e1012313ae787bc389ed1f2), ROM_SKIP(1) ) + ROMX_LOAD( "icl_m40_vga_bios_h.bin", 0x0001, 0x4000, CRC(ed29de22) SHA1(80a508a42dc731fc33584ba2da9e478c401e5d47), ROM_SKIP(1) ) +ROM_END + +// Twinhead PS-286V Rev 0.1 (used in Twinhead Netstation PC) - Chipset: Twinhead TH4100, TH6260, Zilog Z0765A08PSG FDC, 2x16C450PC, +// BIOS: Phoenix NEAT - BIOS Version: 3.1003D 3462421, Keyboard BIOS: Phoenix - CPU: Intel N80286-12, FPU socket provided +// RAM: 8xiT21014-08, 8xSIMM30 - ISA16: 1 - On board: WD VGA, floppy, ide, 2xser, par - Video: WD90C11-LR, IMSG176J-50Z, Twinhead VGA BIOS V1.20, RAM: 2xIntel T21014-08 +// OSC: 14.31818, 24.000MHz - DIP8: on-off-off-off-on-on-on-on +ROM_START( twinnet ) // BIOS-String: Phoenix ROM BIOS PLUS Version 3.10 03 - Twinhead International Corporation + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "ps-286v_lo.bin", 0x10000, 0x8000, CRC(71920f1b) SHA1(f6d76d10b17df7488c5c70a912403dd45f0afbc3), ROM_SKIP(1) ) + ROMX_LOAD( "ps-286v_hi.bin", 0x10001, 0x8000, CRC(d79495e3) SHA1(e5d53ae7059502b2259d575ca8e8fdff7f712389), ROM_SKIP(1) ) + + ROM_REGION( 0x8000, "vga", 0) // WDC WD90C11-LR VGA BIOS + ROM_LOAD( "wdc_vga.bin", 0x0000, 0x8000, CRC(f897048e) SHA1(3baeb553dae4f1c641fb01a16bfe4ae3ca95b13d)) +ROM_END + +// Zenith Z-248 - Motherboard: 85-3379-01 CPU BOARD 113087 - CPU: AMD N80L286-12/C, FPU socket provided - Chipset: Zymos Poach 1 and 2 +// RAM: 6xSIMM30 - OSC: 24.000MHz, 16.000MHz, 14.31818MHz - ISA8: 2, ISA16: 5 - on board diagnostic LEDs: red: CPU D101, ROM D102, RAM D103, INT D104, DSK D105, RDY D106, green: DCOK D107 +// Cards in system documented: DTC 5280 CRA MFM HD controller, Graphics card HEATH P/N150-307-3 L1A2334/Chips P82C434A (undumped), Logitech mouse/hand scanner controller, GW302 Parallel Printer Card, Chips P82C605 Dual Serial Printer Card +// "+++ ERROR: Fatal Slushware RAM Error +++" / "--- Fatal Error: Cannot Continue! ---" (cf. olyport40) +ROM_START( zdz248 ) // use CGA + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "zenith_z-248.bin", 0x10000, 0x10000, CRC(e2042dd9) SHA1(bd51cc74b0b7bd42c449bc4b5702274f766e8ea5)) +ROM_END + +// Samsung Deskmaster 286-12, Microfive motherboard - Chipset: Chips F82C451C, F82C235-12 286 SCAT - CPU: Intel 80286-12, FPU socket provided +// RAM: 6xSIMM40 - BIOS: Phoenix ROM BIOS PLUS 3.10 02M, Chips and Technologies VGA 411 BIOS v211 (one 27C512 EPROM) - Keyboard-BIOS: Intel P8942AN - ISA16: 1 +// OSC: 14.31818, 24.000000MHz, 24.000000MHz, 25.175000MHz, 40.000000MHz - on board: FDD, IDE, beeper, keyboard, mouse, ser, par - VGA Video RAM: 8x41C464J-10 (256K) +ROM_START( samdm286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "samsung-deskmaster-28612-rom.bin", 0x10000, 0x10000, CRC(785d3196) SHA1(214a933d8fa86bfdb633fb5e8595a18a58cdba7d)) +ROM_END + +// Schneider EuroAT - Uses the same case as the Schneider EuroXT, a compact desktop with room for a single floppy drive and an AT IDE harddisk (Seagate ST-142A, ST-157A) +// Mainboard: Baugr.Nr. 51513 with internal EGA, 52591 EGA components omitted (see: EURO VGA) +// Chipset: 2xHeadland GC102-PC, HT101A/B1A4924, Schneider BIGJIM 30773 (cf. EuroPC 2/EuroXT), WD37C65BJM, Siemens SAB 16C450-N +// EGA chipset (mainboard 51513): G2 GC201-PC, 64K RAM - Main RAM: 1MB +// CPU: Siemens SAB 80286-12, Keyboard-BIOS: Schneider ROM BIOS 1985, 1989 Phoenix +// Connectors: Keyboard, Printer, Serial, Floppy (can use the same external floppy disk drives as the EuroXT), EGA monitor +// OSC: 34.0000, 19.2000MHz, 24.0000, 16.000MHz +// BUS: proprietary connectors, ISA riser (ISA8x1, ISA16x1), BIOS can set CPU and BUS speed up to 12MHz +// Proprietary EURO VGA card: 256KB RAM, ATI 18800-1 chipset +// blank screen, beeps 1-2-4 +ROM_START( euroat ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_SYSTEM_BIOS( 0, "v201", "V2.01" ) // also used on Tower AT + ROMX_LOAD( "euro_at_v201a_l.bin", 0x10000, 0x8000, CRC(0f8a2688) SHA1(95db9010b1c0465f878e5036bcf242ddf0a3be6a), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "euro_at_v201a_h.bin", 0x10001, 0x8000, CRC(75b6771b) SHA1(3aa0921914ea6e24249ce3f995fdcb341124d7e9), ROM_SKIP(1) | ROM_BIOS(0) ) + // EGA ROM dump missing + + ROM_SYSTEM_BIOS( 1, "v203", "V2.03" ) + ROMX_LOAD( "80286at_bioslow_schneider_ag_id50444_v2.03.bin", 0x10000, 0x8000, CRC(de356110) SHA1(6bed59a756afa0b6181187d202b325e35afadd55), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "80286at_bioshigh_schneider_ag_id50445_v2.03.bin", 0x10001, 0x8000, CRC(c4c9c840) SHA1(09deaa659191075b6ccc58403979d61bdf990dcd), ROM_SKIP(1) | ROM_BIOS(1) ) + + ROM_REGION( 0x10000, "vga", 0 ) + ROM_LOAD( "euro-vga_52255_bios_v1.02_row.bin", 0x00000, 0x10000, CRC(71d42e58) SHA1(be64990325f52128e102dfc3ed87d2d831183ddc)) +ROM_END + +// Schneider Tower AT 220 (other designations for the 10 MHz 80826, 512KB RAM series are 201, 202, 240), the last two digits are related to the originally installed +// number of 3.5" 720K floppy drives or the size of the MFM harddisk), Model 260 has a 60MB harddisk and can have a 12.5 MHz CPU (depending on where you look and +// probably what was available in Schneider's part bin), systems with a "mega" in the name have 1MB RAM and 1.44MB floppy drives. All have an EGA graphics card on board +// The case looks like a stack of three thinner slices, and extra modules were available that clamped on: a tape streamer, and a 5.25" 1.2MB or a 360KB drive. They were +// connected to the "External drive" port of the Tower AT, much like with Schneider's other PCs. The mainboard as such is divided between the I/O and video portion that resides on +// the backplane board and the CPU and RAM on the CPU card that also contains the keyboard connector. +// Model 220, Schneider Tower-EGA I/O: Chipset: JIM 50101-1 (cf. EuroPC), WD37C65BJM, Gemini VC-001, VLSI VL16C450-PC, Paradise Systems Inc PPC1 38302C +// 104 pin CPU card connector (ISA without the key), 3xISA16, 1xISA8 - on board: parallel, serial, bus mouse (Atari compatible), EGA, internal floppy (26pin), external floppy (DB25) +// Model 220, Schneider Tower-CPU 286 (Baugr.Nr. 50229 Rev.3B): Dallas DS1287, MBL8042H (Compatibility Software 1986/K Phoenix Technologies Ltd - 805931) - Chipset: 2x G2 GC102, G2 GC101 +// OSC: 20.000MHz, 14.318180, beeper, CPU: AMD N80L286-10/S, FPU socket provided - RAM: solder pads for 4xSIMM30, 4x16pin (empty), 4x or 8x51C4256 (512KB or 1MB) +// The Tower AT was available with the Schneider VGA I/O that is described in the tower386sx section. The Tower VGA System 40 and System 70 models had the 12.5MHz CPU card. +// Its BIOS version 2.03 is undumped so far. +// blank screen, beeps 1-2-4 +ROM_START( towerat2xx ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_SYSTEM_BIOS(0, "v2.02", "V2.02" ) // from a model 220 + ROM_SYSTEM_BIOS(1, "v2.01", "V2.01" ) + ROM_SYSTEM_BIOS(2, "v1.07", "V1.07" ) // seen on a model 240 "mega" + ROM_SYSTEM_BIOS(3, "v1.06", "V1.06" ) // from a model 220 + ROM_SYSTEM_BIOS(4, "v1.05a", "V1.05a" ) + ROM_SYSTEM_BIOS(5, "v1.01a", "V1.01a" ) // from a model 220 + + ROMX_LOAD( "phoenix_860376_schneider_ag_tower_at_bios_0_id.nr.50445_v2.02.bin", 0x10000, 0x8000, CRC(8566b3f2) SHA1(a12b5e9e848de123c62374f78ee1d2b4b53dd468), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "phoenix_860376_schneider_ag_tower_at_bios_1_id.nr.50445_v2.02.bin", 0x10001, 0x8000, CRC(7d8249cf) SHA1(d894332aad4c26798e6b41a5e94c471b0235bd50), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "schneider_tower_at_bios_0_low_v2.01a.bin", 0x10000, 0x8000, CRC(0f8a2688) SHA1(95db9010b1c0465f878e5036bcf242ddf0a3be6a), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "schneider_tower_at_bios_1_high_v2.01a.bin", 0x10001, 0x8000, CRC(75b6771b) SHA1(3aa0921914ea6e24249ce3f995fdcb341124d7e9), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "schneider_tower_at_bios_0_low_v1.07.bin", 0x10000, 0x8000, CRC(70a9421d) SHA1(bf6529f259d5bc7c28df19655c57ecce1c57260f), ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "schneider_tower_at_bios_1_high_v1.07.bin", 0x10001, 0x8000, CRC(995a62db) SHA1(42e9a866b5f02509d3094c42842eafed1d577f4e), ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "schneider_ag_50444_v1.06.u3", 0x10000, 0x8000, CRC(42891d5a) SHA1(d94292b14f9155b4e05c78960f9722fffca976be), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "schneider_ag_50445_v1.06.u4", 0x10001, 0x8000, CRC(bdced2b9) SHA1(cba58c70420695ec69dbb4817d0c6b14b8bdbadd), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "schneider_tower_at_bios_low_v1.05a.bin", 0x10000, 0x8000, CRC(94ad1628) SHA1(bf7319ed9b37a57e67b0b4bf7845d95d0f593d68), ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "schneider_tower_at_bios_high_v1.05a.bin", 0x10001, 0x8000, CRC(f3d48773) SHA1(9386313b6d05acb30e7ba7e1353c259deaaa77bc), ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "schneider_tower_at_bios_low_v1.01.bin", 0x10000, 0x8000, CRC(a94ca070) SHA1(2acca0601c00e76d510c81dfe92d33397fbeccd1), ROM_SKIP(1) | ROM_BIOS(5) ) + ROMX_LOAD( "schneider_tower_at_bios_high_v1.01.bin", 0x10001, 0x8000, CRC(d8f67320) SHA1(3ddf7fdb1370f745c4f1902101605477ee0bb392), ROM_SKIP(1) | ROM_BIOS(5) ) + + // todo: find matching EGA ROMs for BIOS V2.01, 1.07 and 1.05 + ROM_REGION( 0x8000, "gfx", 0) + ROMX_LOAD( "schneider_ag_tower_ega-bios_50477_v1.04.bin", 0x0000, 0x8000, CRC(aabd1017) SHA1(e019c21d6108a0387f7c98e92e4dbc32ab19929f), ROM_BIOS(0) ) // R1.04 matched with system BIOS V2.02 + ROMX_LOAD( "schneider_ag_tower_ega-bios_50477_v1.04.bin", 0x0000, 0x8000, CRC(aabd1017) SHA1(e019c21d6108a0387f7c98e92e4dbc32ab19929f), ROM_BIOS(1) ) + ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(2) ) + ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(3) ) // R1.02 matched with system BIOS V1.06 + ROMX_LOAD( "schneider_ag_tower_ega_bios_id.nr._50447_r1.02.bin", 0x0000, 0x8000, CRC(1c43aaf6) SHA1(cf98dd8f0d8258761e36e70f086b1234ec703823), ROM_BIOS(4) ) + ROMX_LOAD( "schneider_ega_r1.00.bin", 0x0000, 0x8000, CRC(4e14cb0a) SHA1(6cef69274a52b11201a3477631fa343a7e1a5970), ROM_BIOS(5) ) // R1.00 matched with system BIOS V1.01 */ +ROM_END + + +// Victor V286C - a VGA version exists as well +// CPU: AMD 802L86-10/S - one ISA16 extended to ISA8: 1, ISA16: 3 on a riser card - Keyboard-BIOS: AT-KB M5L8042 +// Chipset: Kyocera AT-S.C.1 VER.A 9771A 89432EAI, Kyocera EAST-2A 9850 8938EAI, MB621103 M AT-1A 8944 Z67, MB622436 MAT-2E 8943 W02 +// On board video EGA/CGA/Hercules based on a L1A2919 PARADISE PBI-38306A controller +// RAM: 640KB on board - OSC: 48.000, 32.0000MHz, 40MHz, 18.63636MHz +// Options: Sockets for a Microsoft 900110003 Bus Mouse controller, FPU 80287 and a DS1287 RTC - 2 DIP switches with 12 positions combined +// Mass storage: 1.2MB floppy, Kyocera KC-30A harddisk on a DTC5187CRH RLL controller +ROM_START( v286c ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "system-bios_kyocera_a2-2_lo.bin", 0x18000, 0x4000, CRC(160c4759) SHA1(937c1bb9483efeba895e038b7132e0e7e5a9aaa4) ) + ROM_LOAD16_BYTE( "system-bios_kyocera_a2-2_hi.bin", 0x18001, 0x4000, CRC(cfe0cbef) SHA1(2610d727d13fa67c7bd9b3545d7846e880c3da37) ) + + ROM_REGION(0x4000, "pega", 0) + ROM_LOAD( "ega-bios_paradise_video-1.bin", 0x0000, 0x4000, CRC(2db77b0b) SHA1(d31ddbbde5be0b0603e9f569c3f924e0afc7c8e4) ) +ROM_END + +// Atari PC 4, PC4X motherboard - Chipset: NEAT CS8221 (P82C206, P82C211, P82C212, P82C215) - ISA8: 1, ISA16: 4 - RAM: 8XSIPP30 +// Paradise Systems PVGA1A-JK, IMSG171P +// on board: external and internal floppy, digital and analog video, ser, par, keyboard, mouse +ROM_START( ataripc4 ) // initializes video, then halts + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "ami_pc4x_1.7_even.bin", 0x10000, 0x8000, CRC(9f142377) SHA1(b3e5c5dfaec133646295d9a16bc1eec54fe2bc35)) + ROM_LOAD16_BYTE( "ami_pc4x_1.7_odd.bin", 0x10001, 0x8000, CRC(ae3d4cb6) SHA1(d7915ef013462aff4f189cda8f6dc0a486777b63)) + + ROM_REGION16_LE(0x10000, "pvga", 0) + ROM_LOAD16_BYTE( "pvga_pc4x_even.bin", 0x00000, 0x8000, CRC(ff222896) SHA1(e22cdcd9c69fc4feef6b8c2903e3506c79ff531b)) + ROM_LOAD16_BYTE( "pvga_pc4x_odd.bin", 0x00001, 0x8000, CRC(8ca04b2f) SHA1(7705d866ecf366bd6ea95071bf5767877461d2d5)) +ROM_END + +// Atari ABC 286/30, PC4LC motherboard (low cost, compared to PC4) - BIOS-String: DNET-0000-092588-K0- ISA16: 3 - RAM: 4xSIPP30 +// NEAT CS8221 (P82C206, P82C211, P82C212, P82C215) - http://www.atari-computermuseum.de/abc286.htm +// on board: internal floppy, digital video (EGA), ser, par, keyboard, mouse +ROM_START( atariabc286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "ami_pc4x_1.x_even.bin", 0x10000, 0x8000, CRC(930447c7) SHA1(fb7212b413ff8aa056bd23baadc22691ce714f8d)) + ROM_LOAD16_BYTE( "ami_pc4x_1.x_odd.bin", 0x10001, 0x8000, CRC(0891fd25) SHA1(4722b1db1b2c985c67f9a9b807ce68c06a905232)) + + // ROM_REGION(0x40000, "ega", 0) + // ROM_LOAD( "p82c441_ega_bios_v1.0.6.bin", 0x00000, 0x08001, BAD_DUMP CRC(80c11ef2) SHA1(90852d3cbb64504c8d57b469a594c22c247c9a39)) +ROM_END + +// Profex PC 33 - Chipset: SUNTAC ST62BC004-B1, ST62BC003-B, ST62C008, ST62C005-B, ST62BC001-B, ST72BC002-B +// RAM: 2xSIPP30, 18x18pin/16pin, 8x20pin, 4x16pin - OSC: 12.000, 14.31818, 24.000MHz - ISA8: 2, ISA16: 6 +// BIOS: Award A2245250 - Keyboard-BIOS: Award - BIOS-String: 286 Modular BIOS 3.03 Copyright Award Software Inc. / GCH +ROM_START( profpc33 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "st62-pro.bio", 0x10000, 0x10000, CRC(a42f9d0e) SHA1(384f4ddaf92307a5eeb70646a85ad991d904c2d2)) +ROM_END + +// Epson PC AX / Equity III+ - 102-System Board Error (according to the technical manual this means +// "TlMER SPEED CHECK: An error was detected in timer controller counter 0." +ROM_START( epsax ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "evax.bin", 0x18000, 0x4000, CRC(5f9e5fc9) SHA1(5dbe414b762494fa65df6ac0391b2281f452f3e9)) + ROM_LOAD16_BYTE( "odax.bin", 0x18001, 0x4000, CRC(e9cba352) SHA1(22be1457332a62ae789e779e9666ffd63c91d010)) +ROM_END + +// Epson PC AX2e +ROM_START( epsax2e ) // see epsax + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "evaxe.bin", 0x10000, 0x8000, CRC(1251f3e9) SHA1(52456943ee4d83c2a3d46e75d292f4fb57a5a2d8)) + ROM_LOAD16_BYTE( "odaxe.bin", 0x10001, 0x8000, CRC(ce08f140) SHA1(1c6e62f2ab45e9574691224dd6a6ab2a823e85cc)) +ROM_END + +// Bull Micral 45 - Chipset: VLSI 8842AV / R2622 / VC2730-0001, VLSI 8832VB / L81711 / VL16C452-QC, MBL8042N, MC146818AP, ???, 900110003 V1.1 1986 MICROSOFT, FDC9268, NCR 53C80, +// CPU: 286, FPU socket proided, 12MHz/8MHz RAM: 6xSIMM30 (1.152MB - 6MB) - ROM: 64KB, 16KB Video BIOS - On board video: Paradise PEGA2A, 256KB video RAM +// On board: Floppy (2xint, 2xext), SCSI, par, ser, CP8, Microsoft Inport - OSC: 16.257MHz, 48MHz, 14.318180MHz - ISA16: 1, riser card with 1xISA8 and 2xISA16 +ROM_START( micral45 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "vu12", "Version U1.2") + ROMX_LOAD( "bm45_u1.2_p665.bin", 0x10000, 0x8000, CRC(046ab44a) SHA1(06e44b0bd8ae77c12319e11f629338651d53141d), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "bm45_u1.2_p664.bin", 0x10001, 0x8000, CRC(5729c972) SHA1(40b2dbc53829384e54cf953ed8b39e5d424bbff2), ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "vu20", "Versio U2.0") + ROMX_LOAD( "even.fil", 0x10000, 0x8000, CRC(438a7b36) SHA1(b5c9a71cfd7e87cc91453a73f17e93527c5ac7ac), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "odd.fil", 0x10001, 0x8000, CRC(9decd446) SHA1(dcbd305f065382f5327296391da388c50bb1b734), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Wang PC-250/16 +// Phoenix 80286 ROM BIOS PLUS Version 3.10 07 / ROMBIOS Version 03.13.00 (c) Copyright Wang Laboratories, Inc. 1991 +ROM_START( wpc250 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "wang_pc_250-16_bios_vers_03.13.00_chip_l47_9514rol_lo.bin", 0x10000, 0x8000, CRC(8f3a3061) SHA1(42b13f662f1f0b00748e21b4aa60cfcbc4b098c0)) + ROM_LOAD16_BYTE( "wang_pc_250-16_bios_vers_03.13.00_chip_l46_9514roh_hi.bin", 0x10001, 0x8000, CRC(3ba0cb84) SHA1(09111f9a6672fad58b11dc1f22240c78521bcc1c)) + + // Wang PC-250/16 graphics card using a Chips F82C452 + ROM_REGION(0x8000, "gfx1", 0) + ROM_LOAD( "wang_3050_bios_rom.bin", 0x0000, 0x8000, CRC(a895ad45) SHA1(afeacfffdf32f225c604d28580327e9ecfa96ea5)) +ROM_END + +// Philips PCD204 (PCD200 series) +// Chipset: Paradise PVGA1A-JK, Faraday FE3031-JK - BIOS: M1212 U66/U67 R1.00.01 CKS:056B/617D - Keyboard-BIOS: Phoenix 1072217 +// BIOS-String: - - On board: Floppy, 1xIDE, VGA, Parallel, Serial - Slot for ISA slot adapter: 1 - HD: Maxtor 7060AT (C/H/S: 1024/7/17) +// OSC: 30.000MHz, 16.000MHz, 1.8432MHz, 28.3220MHz, 25.1750MHz, 10.000, 42.000MHz, 25.000MHz - CPU: Intel 80286-12 +ROM_START( pcd204 ) // => emulation runs into hlt + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "u66_mi212_r1.00.01.bin", 0x00001, 0x10000, CRC(e99f817a) SHA1(5cf8556fa4ef5c314d5450756c042f5e3cde09b4) ) + ROM_LOAD16_BYTE( "u67_mi212_r1.00.01.bin", 0x00000, 0x10000, CRC(d879f99f) SHA1(04c09b46c4a67701257f819d66002b8e93f0a391) ) +ROM_END + +// Leanord Elan High Tech 286 - Octek VGA-16 using Chips F82C451 +// Chipset: Chips, passive backplane and slot CPU +// complains about "0000-55AA - Error Base RAM (64Kb) - Halt*" +ROM_START( elanht286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "elan_s_ leanord_rom-bios_286_v3.50.bin", 0x10000, 0x10000, CRC(53dc0965) SHA1(13f352ee9eda008d8ddcc7ed06325dd2513ad378) ) +ROM_END + +// Kaypro 286i +ROM_START( k286i ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "81_1598", 0x18000, 0x4000, CRC(e25a1e43) SHA1(d00b976ac94323f3867b1c256e315839c906dd5a) ) + ROM_LOAD16_BYTE( "81_1599", 0x18001, 0x4000, CRC(08e2a17b) SHA1(a86ef116e82eb9240e60b52f76e5e510cdd393fd) ) +ROM_END + +// Sanyo MBC-28 +ROM_START( mbc28 ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "mbc-28_sl-dt_ver.1620_low_din_checksum,454f00,27c256-15.bin", 0x10000, 0x8000, CRC(423b4693) SHA1(08e877baa59ebd9a1817dcdd27138c638edcbb84) ) + ROM_LOAD16_BYTE( "mbc-28_sl-dt_ver.1620_high_din_checksum,45ae00,27c256-15.bin", 0x10001, 0x8000, CRC(557b7346) SHA1(c0dca88627f8451211172441fefb4020839fb87f) ) +ROM_END + +// Siemens PCD-2 - Harddisk: NEC D5126 +// CPU card W26361-D458-Z4-06-05, Piggyback MFM controller with WDC WD42C22A-JU PROTO chip W26361-D477-Z2-04-05 +// Chips: Intel N82230-2, Intel N82231-2, WDC WD37C65BJM, VLSI 8831AM/X12012/VL16C452-QC +// VGA card: S26361-D463 GS3 using a Video Seven 458-0023 + // ROM_LOAD( "vga_nmc27c256q_435-0029-04_1988_video7_arrow.bin", 0x8000, 0x8000, CRC(0d8d7dff) SHA1(cb5b2ab78d480ec3164d16c9c75f1449fa81a0e7) ) // Video7 VGA card + // ROM_LOAD( "vga_nmc27c256q_435-0030-04_1988_video7_arrow.bin", 0x8000, 0x4000, CRC(0935c003) SHA1(35ac571818f616b856da8bbf6a7a9172f68b3ab6) ) +ROM_START( pcd2 ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_LOAD16_BYTE( "bios_tandon_188782-032a_rev_5.21_low.bin", 0x10000, 0x8000, CRC(a8fbffd3) SHA1(8a3ad5bc7f86ff984be10a8b1ae4542be4c80e5f) ) + ROM_LOAD16_BYTE( "bios_tandon_188782-031a_rev_5.21_high.bin", 0x10001, 0x8000, CRC(8d7dfdcc) SHA1(d1d58c0ad7db60399f9a93db48feb10e44ffd624) ) + + ROM_REGION( 0x0800, "keyboard", 0 ) // reporting keyboard controller failure + ROM_LOAD( "kbd_8742_award_upi_1.61_rev_1.01.bin", 0x000, 0x800, CRC(bb8a1979) SHA1(43d35ecf76e5e8d5ddf6c32b0f6f628a7542d6e4) ) // 8742 keyboard controller +ROM_END + +// Siemens PCD-2M/-2L - Board : CPUAZ-S26361-D458-V30 + W26361-D458-Z4-09-05 (ISA16 slot CPU) - Chipset : Intel/Zymos N82230-2, Intel/Zymos N82231-2, VLSI VL16C452-QC +// BIOS : Copyright (C) 1985 Tandon Corporation, Al Rights Reserved. BIOS Version 5.2 - Keyboard BIOS: Award: UPI 1.61 REV 1.01 - CPU: Siemens SAB 80286-12-N/S, FPU socket provided +// RAM: 4xSIMM30 - DIP8: EN0, EN1, EN2, 256, 640, 1MB, MAP, COL - OSC: 90.0000, 24.0000, 14.31818, 16.0000 - On board: Floppy, 2xpar, 2xser, ISA16 piggyback connector +ROM_START( pcd2m ) // constant beeps, doesn't work + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "tandon188782-032a_rev_5.23_low.bin", 0x10000, 0x8000, CRC(1c922f7a) SHA1(f405ce0bf29c8e86efda964308e8f58f7ef0e5ca) ) + ROM_LOAD16_BYTE( "tandon_188782-031a_rev_5.23_high.bin", 0x10001, 0x8000, CRC(ee31d405) SHA1(2630d73ddd55e82857c5ff4547d69ad7f5d5d1ca) ) +ROM_END + +// Compaq SLT/286 - complains about "102 - System board failure" - CPU: Harris CS80C286-12 +// Chips: Dallas DS1287, Compaq 109778-001/4758, Bt478KPJ35, S8852C4/DP8473V, Fujitsu 8904 Q16/109445-001, Fujitsu 8850 W00/109444-002, Compaq 19034/8846KK/10452-002 +// NS16C450V, Fujitsu 8850 W73/110110-001 +ROM_START( comslt286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "compaq_slt286-bios-revision_j.2-even.bin", 0x10000, 0x8000, CRC(77e894e0) SHA1(e935e62e203ec67eaab198c15a36cc0078fd35b0)) + ROM_LOAD16_BYTE( "compaq_slt286-bios-revision_j.2-odd.bin", 0x10001, 0x8000, CRC(4a0febac) SHA1(7da5ac4bc50f25063a1d1e382b8cff9b297976f8)) +ROM_END + +// Dell System 200 - complains about "memory overlap at 400000" but seems to work otherwise +ROM_START( dsys200 ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_LOAD16_BYTE( "version_3.10_a12_even.bin", 0x10000, 0x8000, CRC(5aa81939) SHA1(d9029d3708c49e72f57ae2a340429c28ec39acab)) + ROM_LOAD16_BYTE( "version_3.10_a12_odd.bin", 0x10001, 0x8000, CRC(942416cb) SHA1(b321704471e159030af82556ff25ac46c27a807e)) + + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "20575_b47-00.bin", 0x000, 0x0800, CRC(148187db) SHA1(0d7542dd0b2bc3d6724ae3618a8543cb84a30e92) ) +ROM_END + +// NCR, probably PC-8 - should get a "NGA" extended CGA graphics card once it's emulated +ROM_START( ncrpc8 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "pc8main", "NCR PC-8 mainboard") // large full size AT mainboard - Setup Version 2.3 + ROMX_LOAD( "ncr_35117_u127_vers.4-2.bin", 0x10000, 0x8000, CRC(f4338669) SHA1(c1d6e714591c8d7ab966acfdbc3b463e06fbd073), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "ncr_35116_u113_vers.4-2.bin", 0x10001, 0x8000, CRC(b1b6a2e2) SHA1(5b2c0a2be59e064076ed757d84f61bf955ceca08), ROM_SKIP(1) | ROM_BIOS(0)) + // Chips: NCR 006-3500404, NCR 006-3500447D, NCR 006-3500402PT, M5L8042-235P, SN76LS612N + ROM_SYSTEM_BIOS(1, "pc8card", "NCR PC-8 CPU card") // passive backplane and CPU card - Setup Version 2.1 + ROMX_LOAD( "ncr_u127-30_v.4.bin", 0x10000, 0x8000, CRC(33121525) SHA1(11f8d8af4dad432f558c646d7d0ff23eb642a815), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "ncr_u113-27_v.4.bin", 0x10001, 0x8000, CRC(87424492) SHA1(5b7aba5678fe55c81fee2e07730b8ae03a23160f), ROM_SKIP(1) | ROM_BIOS(1)) + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD ("ncr_keyboard_mcu_35091.bin", 0x0000, 0x800, CRC(632556cc) SHA1(b35f30bd0664fc1c2775a594f248d1e30237900a)) +ROM_END + +// NCR Class 3302 - CPU: AMD N80L286-12/S, FPU socket provided - Chipset: Chips & Technologies NEAT (82C206, 82C211, 82C212, 82C215), VLSI VL16C452-QC, INMOS IMSG176J-50Z +// Motherboard: PN-386XV REV R4.B - RAM: SIMM30x4, On board: 8x4C4256DJ-10, 4x41C256-10 - BIOS: NCR 3.5 - Keyboard BIOS: M5L8042-277P +// OSC: 24.000MHz, 32.000MHz, 36.000MHz, 1.8432MHz, 25.175/28.322, 14.31818, ISA16: 1 on board, used for a riser with 2 slots +ROM_START( ncr3302 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "f000-flex_drive_test.bin", 0x10000, 0x8000, CRC(09c9eb6b) SHA1(5eb00f65659cee018726e7a4122da1c42b2bbef9)) + ROM_LOAD( "f800-setup_ncr3.5-013190.bin", 0x18000, 0x8000, CRC(31e6a1ba) SHA1(2ff7dc233d167775ec3641c7a4b2d891db5f8ba7)) + + // on board Paradise VGA PVGA1A-JK + // DIP switches (x8 near the Paradise PVGA1A-JK) are undocumented. Setting switch 7 to 'open' generates VGA compatible (yet monochrome) signal, closing switch 7 + // causes 'out of range' on a fixed frequency VGA LCD - Graphics RAM: 8xD6164, 8 empty sockets (18 pin) provided + ROM_REGION(0x8000, "video", 0) + ROM_LOAD( "c000-wd_1987-1989-740011-003058-019c.bin", 0x0000, 0x8000, CRC(658da782) SHA1(6addcf24795c2e8004c21a8e546b53de41766420)) +ROM_END + +// Nixdorf 8810 M30 +// Chipset: Chips P82C211-12 P82C215, P82C212B-12, Zilog Z0853006VSC, L5A0757/NC-LSI56A-SCC1, Chips P82C604A, P82C206 H1 +ROM_START( n8810m30 ) + ROM_REGION16_LE(0x20000, "bios", 0 ) + ROM_LOAD( "at286bios_53889.00.0.17jr.bin", 0x00000, 0x20000, CRC(74870212) SHA1(adb3f379c9aeee6a5beb946d23af6eea706aca1d) ) +ROM_END + +// Nixdorf 8810 M55 - Paradise PEGA 1A383048 piggybacked onto MFM/Floppy controller card +// Chips: M5L8042-235P, NCR 006-3500402PT, 2xAMD AM9517A-5JC, NCR 006-3500447 D, NCR 006-3500404 +ROM_START( n8810m55 ) + ROM_REGION16_LE(0x20000, "bios", 0 ) + ROM_LOAD16_BYTE( "150-3872_u113_27_4.5.1.bin", 0x10001, 0x8000, CRC(35ff4fba) SHA1(557f0f98c27af76f6fa6990592e7150f5fc1fc02)) + ROM_LOAD16_BYTE( "150-3873_u127_30_4.5.1.bin", 0x10000, 0x8000, CRC(5a7e6643) SHA1(f3890919a772eead7232bd227b2c8677377f6e24)) +ROM_END + +// Olivetti M290 - has an Olivetti branded Paradise PVGA1A-JK VGA card - locks up with "Error 2" and a key symbol +// Chipset: Olivetti GA099-B/28927F74AT, Olivetti GA098-B 28909F74AS, TI TACT82206FN, Olivetti 8920K5 +// Floppy/IDE card: WD37C65BJM, NS16C450V +ROM_START( m290 ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "m290_pep3_1.25.bin", 0x10000, 0x10000, CRC(cb57d677) SHA1(4bdf5c52567c129b413c866c63b5fb3562fccd23)) + + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "m290_csl0_1.10.bin", 0x000, 0x0800, CRC(d767d496) SHA1(84246f7b39e0a005425948931cf93624b831e121) ) +ROM_END + +// Ericsson WS286 +ROM_START( ews286 ) // Computer is brown/yellow-ish with Ericsson logo + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "rys_103_1002_r8a_3c00_ic-pos_71.bin", 0x18000, 0x4000, CRC(af179e56) SHA1(58b1df46d6e68eef472a0529cb9317abaf17880f)) // Last ROM set and has Nokia + ROM_LOAD16_BYTE( "rys_103_1003_r8a_8600_ic-pos_69.bin", 0x18001, 0x4000, CRC(555502cb) SHA1(1977fe54b69c5e52731bf3eb8bdabe777aac014b)) // copyright patched in both roms +ROM_END + +// Nokia Data WS286 +//ROM_START(nws286 ) // Computer is grey with Nokia logo. +// ROM_REGION(0x20000,"bios", 0) +// ROM_LOAD16_BYTE( "rys_103_1002_r8a_3c00_ic-pos_71.bin", 0x18000, 0x4000, NO_DUMP) +// ROM_LOAD16_BYTE( "rys_103_1003_r8a_8600_ic-pos_69.bin", 0x18001, 0x4000, NO_DUMP) +//ROM_END + + +//************************************************************************** +// 80286 Notebook/Laptop/Portable +//************************************************************************** + +// CAF Prolite 286/16 - Chipset: CHIPS P82C06, P82C211-12, P82C215-12, P82C212B-17 16MHz, WD47C65BJM, Acer M2201 - on board: beeper, floppy (FDC1.0 undumped) +// CPU: 286, FPU: Socket provided - RAM: 8xSIMM30 - BIOS: CAF Computer Corporation AMI BIOS - Keyboard BIOS: FONTEX TECH.CORP. AMI 286 BIOS PLUS KEYBOARD 07327 +// OSC: 32.768KHz, 16MHz, 9.6MHz, 39.000MHz, 18.000000MHz, 16.257MHz, 1.8432MHz, 32.00MHz, 20MHz +// Video on board: Genoa 7017417 BIOS (undumped), GRAY1.1 (undumped), Genoa GN006001-B, GN006002-B, GN006003-A, 256KB Video RAM - DIP10: off-on-on-off-on-on-on-off-off-off +ROM_START( prolite286 ) // Initialises graphics card, then dies + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "caf_prolite_even.bin", 0x10000, 0x8000, CRC(c3f4b360) SHA1(958fde7fa12425f6ac14fee6ebfd1b1f535c66eb)) + ROM_LOAD16_BYTE( "caf_prolite_odd.bin", 0x10001, 0x8000, CRC(7c2f6f9f) SHA1(6e72f1458308e521e5715cedb83f40ebe0cc4ad7)) +ROM_END + +// AEG Olympia Olyport 40-21 aka Zenith SuperSport - CPU: AMD N80L286-12/8 - Chipset: Chips P82C2185, P82C211C, P82C206 F-1, P82C212B, P82C604, WD37C65BFM, Hitachi HD6305VOP +// OSC: 22.500, 24.000 - Video: CGA, LCD with 16 grey intensities - Connectors: CRT, Ext. Bus, RS232C, Printer, Ext.FDD - Mass storage: FDD 1.44MB, HD: Conner CP-323 (IDE with detached controller PCB) +ROM_START( olyport40 ) // "+++ ERROR: Fatal Slushware RAM Error +++" / "--- Fatal Error: Cannot Continue! ---" - slushware is a ROM shadowing concept cropping up in Zenith brochures + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "mbevn_v2.7b.bin", 0x10000, 0x8000, CRC(eaf0d73c) SHA1(d642afe8a72b95e5e9d9cdc8cf8db833df54eaf0)) + ROM_LOAD16_BYTE( "mbodd_v2.7b.bin", 0x10001, 0x8000, CRC(a750d652) SHA1(c9a3cca535f6e7c44b83d87efcc289afda71b62f)) + + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "nec_d80c42c.bin", 0x000, 0x0800, CRC(49ae4c38) SHA1(d5e6463d1dbcc7d68ef6b9222ff02102918f41b7)) +ROM_END + +// Compaq Portable II +// Chips: Intel D8742, SN76LS612N, 2x NEC D8237AC-5, 2xIntel P8259A-2, MC146818AP, Intel P8254 +// Enhanced Color Graphics board: Chips P82C431, P82C434A +ROM_START( comportii ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_SYSTEM_BIOS(0,"105620-001", "Ver. D (105620/105622)") + ROMX_LOAD( "comportii_105622-001.bin", 0x18000, 0x4000, CRC(30804fa4) SHA1(204d16dac4db4df0ba23a336af62da3f66aa914c), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "comportii_105620-001.bin", 0x18001, 0x4000, CRC(45fe43e8) SHA1(f74c2e30f7bd162be4042946ebcefeb236bd2fe7), ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1,"106437-001", "Ver. F (106437/106438)") + ROMX_LOAD( "106438-001.bin", 0x18000, 0x4000, CRC(616361de) SHA1(ce1a6f9be9d374b76a83856f176aaa993d1dd46c), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "106437-001.bin", 0x18001, 0x4000, CRC(b50881ae) SHA1(2a79b39f77b0d3e94e4f765ed6c1961746dad563), ROM_SKIP(1) | ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2,"109739-001", "Ver. P.1 (109739/109740)") + ROMX_LOAD( "109740-001.rom", 0x18000, 0x4000, CRC(0c032f12) SHA1(3ae7833d7f92d6495e2e57caa0260b573187eb72), ROM_SKIP(1) | ROM_BIOS(2) ) + ROMX_LOAD( "109739-001.rom", 0x18001, 0x4000, CRC(83698b85) SHA1(3d3cff84a747aea3db2612a7ac3ebe9cb4700b33), ROM_SKIP(1) | ROM_BIOS(2) ) +ROM_END + +// Compaq Portable III +// Chipset: Fujitsu MB672318, MB672316U, 2x Intel P8237A-5, Compaq 8731KX 104111-002, Intel 8272A, 2xAMD P8259A, Graphics: M77H010 +// MC146818P, Intel D8742, Fujitsu MB672322 +ROM_START( comportiii ) + ROM_REGION16_LE(0x20000,"bios", 0) + ROM_SYSTEM_BIOS(0, "106779-002", "106779-002") + ROMX_LOAD( "cpiii_87c128_106779-002.bin", 0x18000, 0x4000, CRC(aef8f532) SHA1(b0374d5aa8766f11043cbaee007e6d311f792e44), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "cpiii_87c128_106778-002.bin", 0x18001, 0x4000, CRC(c259f628) SHA1(df0ca8aaead617114fbecb4ececbd1a3bb1d5f30), ROM_SKIP(1) | ROM_BIOS(0) ) + // ROM_LOAD( "cpiii_106436-001.bin", 0x0000, 0x0800, CRC(5acc716b) SHA1(afe166ecf99136d15269e44ebf2d66317945bf9c) ) // keyboard + ROM_SYSTEM_BIOS(1, "109737-002", "109737-002") + ROMX_LOAD( "109738-002.bin", 0x10000, 0x8000, CRC(db131b8a) SHA1(6a8517a771272edf16870501fc1ed94c7555ef45), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "109737-002.bin", 0x10001, 0x8000, CRC(8463cc41) SHA1(cb9801591e4a2cd13bbcc40739c9e675ba84c079), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// Nixdorf 8810 M15 Laptop - PC07 - boot from harddisk doesn't work +// Chipset: Faraday FE3020, FE3000A, FE3010EB, FE3030, NEC D65013GF280, Toshiba TC8566AF, MC146818A, NEC D65013GF328, D65013GF371, D65013GF356, NS16C450V, Yamaha V6366C-F, MEI DA7116AFPBW +ROM_START( n8810m15 ) + // ROM_LOAD("charagene_v1.1_daft2c2.bin", 0x00000, 0x4000, CRC(dd324efd) SHA1(67fd91277733596bfad8506dc92d9f776e563dda)) // CGA chargen + + ROM_REGION16_LE(0x20000, "bios", 0 ) + ROM_LOAD16_BYTE( "rbios_even_daft2a3.bin", 0x10000, 0x8000, CRC(790abf68) SHA1(fbdb5e628ee9a605c8c1485a3fbb67736ff03153)) + ROM_LOAD16_BYTE( "rbios_odd_daft2b3.bin", 0x10001, 0x8000, CRC(b09a812a) SHA1(c1b3321715260f9cd8c810325dc10c674ea05174)) +ROM_END + +// Nixdorf 8810 M16 Laptop - PC17 - CGA version - boot from harddisk doesn't work +// Chipset: Chips P82xxxx, Chips P82C211-12, P82C215, P82C212B-12, MX9007G/MX1 16C4522QC, WD37C65BJM, Yamaha V6366C-F +ROM_START( n8810m16c ) + // ROM_LOAD("201cg rev 1.0.u78", 0x00000, 0x4000, CRC(3e31143b) SHA1(489da357e0ab8a469a3fb81cce160637486c87bc)) // CGA chargen + ROM_REGION16_LE(0x20000, "bios", 0 ) + ROM_LOAD16_BYTE( "nmc27c256.u35", 0x10000, 0x8000, CRC(51acd116) SHA1(1a0bf24af4eba48d0deb0132a523e131902d2bcd)) + ROM_LOAD16_BYTE( "nmc27c256.u36", 0x10001, 0x8000, CRC(fb47f9da) SHA1(d9bd4aea850a83764454a5c86c8da09f7c640fd6)) + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "d8749h.u69", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) ) +ROM_END + +// Nixdorf 8810 M16 Laptop - PC17 - VGA version - boot from harddisk doesn't work +// Chipset: MX8945G/MX16C4520C, Chps P82C212B-12, P82C215, P82C206, WD37C65BJM, P82C211-12, Chips F82C455, +ROM_START( n8810m16v ) + // ROM_LOAD("8810m16vga_27c256_221vb_123g1.bin", 0x00000, 0x8000, CRC(3bc80739) SHA1(3d6d7fb01681eccbc0b560818654d5aa1e3c5230)) // C&T VGA BIOS for 82C455 + ROM_REGION16_LE(0x20000, "bios", 0 ) + ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_a.bin", 0x10000, 0x8000, CRC(1de5e49b) SHA1(759878e13801278de96700bbef318a49cca68054)) + ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_b.bin", 0x10001, 0x8000, CRC(a65cf1f8) SHA1(30d46b49e87f272540e24a278848122b3c40bdaf)) + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "8810m16vga_8749_201kb_rev3a.bin", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) ) +ROM_END + + +//************************************************************************** +// 80386 SX and DX BIOS +//************************************************************************** + +ROM_START( at386sx ) + ROM_REGION16_LE(0x20000, "bios", 0 ) + // 0: NCR 386 CPU card - Chipset: TACT82301PB, TACT82302PB, TACT82303PB + ROM_SYSTEM_BIOS( 0, "ncr386sx", "NCR 386sx card" ) // Upgrade card for e.g. NCR PC-8 - Setup Version 2.7.1 + ROMX_LOAD( "ncr_386sx_u12-19_7.3.bin", 0x10001, 0x8000, CRC(9e4c9a2a) SHA1(0a45d9f04f03b7ae39734916af7786bc52e5e917), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "ncr_386sx_u46-17_7.3.bin", 0x10000, 0x8000, CRC(73ad83a2) SHA1(bf6704fb4a0da37251f192cea3af2bc8cc2e9cdb), ROM_SKIP(1) | ROM_BIOS(0)) + // ROM_LOAD( "ncr_386sx_card_150-0004508_u1_v1.1.bin", 0x0000, 0x800, CRC(dd591ac1) SHA1(5bc40ca7340fa57aaf5d707be45a288f14085807)) + // 1: Dell 386SX-33 with 2x 72-pin SIMMs, ISA riser slot - Chipset: VLSI 82C311, Cirrus Logic GD5420 - BIOS: 27C010 EPROM containing Quadtel VGA BIOS and Phoenix system BIOS 02/09/93 + // BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 J01 - Copyrights by Phoenix and Dell - Jostens Learning Corporation 386/33SX - CPU: Intel 386sx + ROM_SYSTEM_BIOS( 1, "dell386sx", "Dell 386sx" ) // emulate integrated VGA card + ROMX_LOAD( "dell386.bin", 0x00000, 0x20000, CRC(d670f321) SHA1(72ba3a76874e0c76231dc6138eb56a8ca46b4b12), ROM_BIOS(1)) + // 2: A3286/A3886-01 COMP V4.0 - Chipset: Intel S82344A (VLSI), S82343 (VLSI) - BIOS: AMI P9 (386SX) BIOS 910520 + // BIOS-String: - 30-05T1-425004-00101111-050591-ITOPSX-0 / MULTITRONIC PERSONAL COMPUTER - Keyboard-BIOS: AMI P9(386SX) Keyboard BIOS 910520 - OSC: 8.000, 14.318180MHz, (unreadable) - CPU: Intel SMD, unreadable - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS( 2, "a3286a3886", "A3286/A3886-01 COMP V4.0") + ROMX_LOAD( "386-a3286-a3886-01-even_32k.bin", 0x10000, 0x8000, CRC(56ed3332) SHA1(9d113e57228ee596c0c24eabb193d3670fb9a309), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD( "386-a3286-a3886-01-odd_32k.bin", 0x10001, 0x8000, CRC(9dbe4874) SHA1(589379055cfedd4268d8b1786491e80527f7fad5), ROM_SKIP(1) | ROM_BIOS(2)) + // 3: CPU/FPU: 386SX/486SLC - Chipset: ALD 93C308-A (93C206 ???) + // BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / CC-070794-P01 + ROM_SYSTEM_BIOS( 3, "ald93c308", "ALD 93C308" ) + ROMX_LOAD( "3ldm001.bin", 0x10000, 0x10000, CRC(56bab3c7) SHA1(6970bdc7407b4b57c8e1d493f9e3d9ae70671b9c), ROM_BIOS(3)) + // 4: BIOS: Phoenix; 01/15/88 - CPU: 386sx-16 - Chipset: Intel - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 02 / 386SX, ADI CORP. + ROM_SYSTEM_BIOS( 4, "intel", "Intel chipset") + ROMX_LOAD( "3iip001l.bin", 0x10000, 0x8000, CRC(f7bef447) SHA1(a6d34c3bf0de93c2b71010948c1f16354996b5ab), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "3iip001h.bin", 0x10001, 0x8000, CRC(f46dc8a2) SHA1(b6566fd761e2e6ec34b61ee3bb043ef62d696b5e), ROM_SKIP(1) | ROM_BIOS(4)) + // 5: BIOS-String: X0-0100-000000-00101111-060692-386sx-0 / Ver. 5.14 - continuous reset + ROM_SYSTEM_BIOS( 5, "v514", "V. 5.14") + ROMX_LOAD( "3zzm001.bin", 0x10000, 0x10000, CRC(f465b03d) SHA1(8294825dcaa254c606cee21db7c74f61c1394ade), ROM_BIOS(5)) +ROM_END + +// NEATsx chipset: Chips 82C811 CPU/Bus controller, 82C812 Page interleave/EMS memory controller, 82C215 Data/Address buffer and 82C206 Integrated Peripheral Controller +ROM_START( ct386sx ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS-String: ENSX-1131-0040990-K0 / AMI 386SX-BIOS / NEATSX V1.1 05-31-90 + ROM_SYSTEM_BIOS(0, "neatsx", "NEATsx 386sx") + ROMX_LOAD( "012l-u25.bin", 0x10000, 0x8000, CRC(4ab1862d) SHA1(d4e8d0ff43731270478ca7671a129080ff350a4f),ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "012h-u24.bin", 0x10001, 0x8000, CRC(17472521) SHA1(7588c148fe53d9dc4cb2d0ab6e0fd51a39bb5d1a),ROM_SKIP(1) | ROM_BIOS(0)) + ROM_FILL(0x1e2c9, 1, 0x00) // skip incompatible keyboard controller test + ROM_FILL(0x1e2cb, 1, 0xbb) // fix checksum + // 1: VIP-M345000 NPM-16 - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 20 / AUVA - Keyboard-BIOS: M5L8042-165P + // ISA8: 2, ISA16: 5, Memory: 1 - OSC: 32.000MHz, 14.31818 + ROM_SYSTEM_BIOS(1, "m345000", "VIP-M345000 NPM-16") + ROMX_LOAD( "386-vip-m345000 a1_32k.bin", 0x10001, 0x8000, CRC(8119667f) SHA1(343221a9729f841eb23eafe5505f1216783e5550), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "386-vip-m345000 a2_32k.bin", 0x10000, 0x8000, CRC(ada1a375) SHA1(74128270aa8fed504e8785c5d490b0fa25cc3895), ROM_SKIP(1) | ROM_BIOS(1)) + // 2: DTK Corp. 386sx COMPUTER / DTK 386sx Chipset ROM BIOS Version 4.26 / #96120590N + ROM_SYSTEM_BIOS(2, "dtk386sx", "DTK 386sx") + ROMX_LOAD( "3cso001.bin", 0x10000, 0x10000, CRC(8a0e26da) SHA1(94aefc745b51015426a73015ab7892b88e7c8bcf), ROM_BIOS(2)) + // 3: Chipset is labeled SOLUTIONS 88C211, 88C212, 88C215, P82C206 + // BIOS-String: ENSX-1107-040990-K0 - CPU: 386SX-16 + ROM_SYSTEM_BIOS(3, "solutions", "SOLUTIONS NEATsx") + ROMX_LOAD( "3som001l.bin", 0x10000, 0x8000, CRC(ecec5d42) SHA1(b1aaed408fe9c3b73dff3fa8b19e62600a49cdb2), ROM_SKIP(1) | ROM_BIOS(3)) + ROMX_LOAD( "3som001h.bin", 0x10001, 0x8000, CRC(85d64a86) SHA1(528506724668ea3aef6aa0bd8d68cfcaa58bf519), ROM_SKIP(1) | ROM_BIOS(3)) + // 4: Manufacturer/Identifier: ELITEGROUP COMPUTER SYSTEMS, INC. NEATSX REV 1.0. - Chipset: NEATsx: Chips P82C206, Chips P82C215, Chips P82C811, Chips P82C812 + // CPU: Intel NC80386sx-20, FPU socket provided - RAM: DIP 1MB (DIP sockets for up to 4MB), 4xSIPP30 - BIOS EPROMs: 2x S27C256 NEATsx-013 PLUS + // Keyboard BIOS: 1988 AMI 1131 KEYBOARD BIOS PLUS - OSC: 32.0000MHz, 40.000MHz, 14.31818 - ISA8: 3, ISA16: 5 + ROM_SYSTEM_BIOS(4, "neatsx013", "NEATsx-013 PLUS") // initializes the graphics card, then dies + ROMX_LOAD( "neatsx-013_l.bin", 0x10000, 0x8000, CRC(7cd4d870) SHA1(c7a5b629dadb43779939043ae4adb5e78c770dc3), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "neatsx-013_h.bin", 0x10001, 0x8000, CRC(388587d4) SHA1(8ae6f6b14a2f53438b6a02c4f032088edb2df484), ROM_SKIP(1) | ROM_BIOS(4)) +ROM_END + +ROM_START( at386 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / AMIBIOS Ver 5.19a + ROM_SYSTEM_BIOS(0, "ami386", "AMI 386") + ROMX_LOAD( "ami386.bin", 0x10000, 0x10000, CRC(3a807d7f) SHA1(8289ba36a3dfc3324333b1a834bc6b0402b546f0), ROM_BIOS(0)) + // 1: Phoenix 80386 ROM BIOS PLUS Verson 1.10 (R22) + ROM_SYSTEM_BIOS(1, "at386", "unknown 386") // This dump possibly comes from a MITAC INC 386 board, given that the original driver had it as manufacturer + ROMX_LOAD( "at386.bin", 0x10000, 0x10000, CRC(3df9732a) SHA1(def71567dee373dc67063f204ef44ffab9453ead), ROM_BIOS(1)) + // 2: BIOS-String: 30-0101-429999-00101111-050591-D90-0 / AMI TD60C BIOS VERSION 2.42B + ROM_SYSTEM_BIOS(2, "amicg", "AMI CG") + ROMX_LOAD( "amicg.1", 0x10000, 0x10000,CRC(8408965a) SHA1(9893d3ac851e01b06a68a67d3721df36ca2c96f5), ROM_BIOS(2)) + // 3: + ROM_SYSTEM_BIOS(3, "msi386", "MSI 386") // MSI 386 mainboard, initializes graphics card, then hangs - Chipset: Chips P82A304, P82A303, P82A302C, 2xP82B305, P82C301C, P82A306A, + ROMX_LOAD( "ami_386_msi_02297_even.bin", 0x10000, 0x8000, CRC(768590a0) SHA1(90c5203d78591a093fd4f54ceb8d9827f1e64f39), ROM_SKIP(1) | ROM_BIOS(3) ) + ROMX_LOAD( "ami_386_msi_02297_odd.bin", 0x10001, 0x8000, CRC(7b1360dc) SHA1(552ccda9f90826621e88d9abdc47306b9c2b2b15), ROM_SKIP(1) | ROM_BIOS(3) ) + // 4 + ROM_SYSTEM_BIOS(4, "ami2939", "AMI2939") // no display + ROMX_LOAD( "ami2939e.rom", 0x10000, 0x8000, CRC(65cbbd32) SHA1(d7d26b496f8e86f01722ad9f171a68f9fcdc477c), ROM_SKIP(1) | ROM_BIOS(4) ) + ROMX_LOAD( "ami2939o.rom", 0x10001, 0x8000, CRC(8db6e739) SHA1(cdd47709d6036fad4be40c15bff41752d831d4b8), ROM_SKIP(1) | ROM_BIOS(4) ) + // 5: NCR 386 slot CPU - Upgrade card for e.g. NCR PC-8 - set graphics card to CGA to see a "Timer One Error" message + ROM_SYSTEM_BIOS(5, "ncr386", "NCR 386 CPU card") // Chipset: SN76LS612PN, 2xAM9517A-5JC, NCR 006-3500402PT M472018 8650A + ROMX_LOAD( "ncr_386_card_04152_u44_ver5.0.bin", 0x10000, 0x10000, CRC(80e44318) SHA1(54e1d4d646a577c53c65b2292b383ed6d91b65b2), ROM_BIOS(5)) + // ROM_LOAD ("ncr_386_card_keyboard_04181_u27_ver5.6.bin", 0x0000, 0x800, CRC(6c9004e7) SHA1(0fe77f47ff77333d1ff9bfcf8d6d92193ab1f208)) + // 6: BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 22 + ROM_SYSTEM_BIOS(6, "cbm386", "Commodore 386") + ROMX_LOAD( "cbm-386-bios-lo-v1.022e-8100.bin", 0x10000, 0x8000, CRC(a054a1b8) SHA1(d952b02cc10534325c1c5aaa8b6dfb77bc20a179), ROM_SKIP(1) | ROM_BIOS(6)) + ROMX_LOAD( "cbm-386-bios-hi-v1.022e-d100.bin", 0x10001, 0x8000, CRC(b9541f3d) SHA1(e37c704521e85b07369d21b0521f4d1871c318dd), ROM_SKIP(1) | ROM_BIOS(6)) + // 7: BIOS-String: X0-0100-000000-00101111-060692-RC2018A-0 / Ver 1.4b / Texas Instruments 486 DLC [S3Q] + ROM_SYSTEM_BIOS(7, "ti486dlc", "TI 486DLC") // board is equipped with a TI486DLC + ROMX_LOAD( "ti_486dlc_rev.s3q.bin", 0x10000, 0x10000, CRC(39b150ed) SHA1(5fc96c6232dd3a066349d8e707e938af55893297), ROM_BIOS(7)) + // 8: BIOS-String: 305-3.2 000-00 - Chipset: TACT82206FN; Intel A82385-33 - Keyboard Controller: P/N: 191106-2 C/S E4F4 Rev. 1.4 + // Board with Tandon and Micronics stickers - BIOS: 192475-305A V305 3.2 + // ISA8: 2, ISA16: 5 - OSC: 14.31818 MHz - 66.0000 MHz, CPU: Intel 80386DX-33, FPU: Intel 80387DX-33 + ROM_SYSTEM_BIOS(8, "tanmic385", "Tandon/Micronics with 385") + ROMX_LOAD( "386-micronics-09-00021-even_32k.bin", 0x10000, 0x8000, CRC(0d4f0093) SHA1(f66364a82c957862a0e54afc3a2f85f911adfd49), ROM_SKIP(1) | ROM_BIOS(8)) + ROMX_LOAD( "386-micronics-09-00021-odd_32k.bin", 0x10001, 0x8000, CRC(54195986) SHA1(f3536340ef1697763e5cd70d0de7bb9b2a4ecde9), ROM_SKIP(1) | ROM_BIOS(8)) + // 9: Biostar MB1325PM - Chipset: Chips P82C206 µIC MI9382 MI9381A + // BIOS: AMI 386 BIOS - BIOS-String: 30-0101-D61223-00101111-050591-OPBC-F / MB-1325PM. - Keyboard-BIOS: AMI + // CPU: AMD 386DX/DXL-25 - ISA8: 1, ISA16: 6, ISA8/Memory: 1 + ROM_SYSTEM_BIOS(9, "mb1325pm", "MB1325PM") + ROMX_LOAD( "386-mb1325pm ok.bin", 0x10000, 0x10000, CRC(768689c1) SHA1(ce46b3baf3cd2586ffaccdded789a54583b73a3b), ROM_BIOS(9)) + // 10: Intel SSBC 386AT - Chipset: Intel P8237A, P8254; P8259A, SN74LS612N - BIOS: 380892-01 Rev. 1.04 U53 L - 380892-02 Rev. 1.04 U52 H + // Keyboard BIOS: Intel 453775-001 - ISA8: 2, ISA16: 4, Memory expansion: 2 - OSC: 1.8432 MHz - 32.000 - 14.31818 + ROM_SYSTEM_BIOS(10, "ssbc386at", "Intel SSBC 386AT" ) // no display + ROMX_LOAD( "386-intel-u53-l_32k.bin", 0x10001, 0x8000, CRC(5198a767) SHA1(03dd494e3a218c59c82ebd7b1dd16905bca30773), ROM_SKIP(1) | ROM_BIOS(10)) + ROMX_LOAD( "386-intel-u52-h_32k.bin", 0x10000, 0x8000, CRC(cedbad7a) SHA1(e1365f5a183a342fe58205679a512c4ccd2a705a), ROM_SKIP(1) | ROM_BIOS(10)) + // 11: BEK P405 clone - BIOS-String: 30-0201-428029-00101111-070791-OPWB-0 - was found as a stray ROM - possibly from a 486 board + ROM_SYSTEM_BIOS(11, "opwb", "OPWB") + ROMX_LOAD( "opwb.bin", 0x10000, 0x10000, CRC(e7597fb6) SHA1(2f1eb88138b400cc3ad554d03e532b5d3b0b11ad), ROM_BIOS(11)) + // 12: unknown manufacturer, Logo could be a "J7" - COPYRIGHT (C) 89 REV.C MADE IN TAIWAN - Chipset: Chips P82C206 + // BIOS: AMI 386 BIOS PLUS 896818 - BIOS-String: DINT-6102-091589-K0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS 896819 + // CPU: Intel 386DX-25 FPU: i386DX-33 - OSC: 54.0000MHz, 16.000MHz, 14.31818MHz + ROM_SYSTEM_BIOS(12, "386atj7", "386AT J7" ) + ROMX_LOAD( "386-big_ami_896818_even.bin", 0x10000, 0x8000, CRC(096e99c4) SHA1(29ff718362af4f5d7c0173f4de84290cec60dded), ROM_SKIP(1) | ROM_BIOS(12)) + ROMX_LOAD( "386-big_ami_896818_odd.bin", 0x10001, 0x8000, CRC(6f92634d) SHA1(e36d401975690043c5d5cb1f781036b319e57f37), ROM_SKIP(1) | ROM_BIOS(12)) + // 13: BIOS-String: DAMI-0000-040990-K0 - silkscreen on board: 17:35-2495-02 - 702430D - H8010-30 - ISA8:2, ISA16: 8 - OSC: 14.31818, 50.000MHz + // Chipset:Laser 27-2024-00 4L40F1028, Laser 27-2025-00 4L40F1026, 2xKS82C37A, KS92C59A, KS82C54-10P - CPU: Intel 386DX-33, FPU socket provided + ROM_SYSTEM_BIOS(13, "vt386vt", "VT386VT" ) + ROMX_LOAD( "vt386vt-702430d-rom0_32k.bin", 0x10000, 0x8000, CRC(00013ee6) SHA1(7fed0b176911a94e8127b01bb77445c78f283ff7), ROM_SKIP(1) | ROM_BIOS(13)) + ROMX_LOAD( "vt386vt-702430d-rom1_32k.bin", 0x10001, 0x8000, CRC(c817ec57) SHA1(acdd0e28cb4798059c02e1342da7efe3eaf2c5cb), ROM_SKIP(1) | ROM_BIOS(13)) + // 14: Micronics I-Cache 09-00021-L8949 - Chipset: Chips P82C206 - RAM: M500/385 Memory Board, Cache: 8xCXK5863P-25 + // BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 10a - Keyboard-BIOS: Intel - CPU/FPU: sockets provided, empty + // ISA8: 2, ISA16: 4, Memory: 1 - OSC: 66.0000MHz, unreadable + ROM_SYSTEM_BIOS(14, "l8949", "L8949" ) + ROMX_LOAD( "386-micronics 09-00021-lo_32k.bin", 0x10000, 0x8000, CRC(3a8743e3) SHA1(42262f60cb655ab120d968dbf9eb03387424bf14), ROM_SKIP(1) | ROM_BIOS(14)) + ROMX_LOAD( "386-micronics 09-00021-hi_32k.bin", 0x10001, 0x8000, CRC(c7fce430) SHA1(e0d6e8dbb8b6d68bd92dab63a259d2c9293f5571), ROM_SKIP(1) | ROM_BIOS(14)) + // 15: BIOS-String: 30-0200-ZZ1453-00101111-050591-SCAT3.04-0 + ROM_SYSTEM_BIOS( 15, "kmxc02", "KMX-C-02" ) + ROMX_LOAD( "3ctm005.bin", 0x10000, 0x10000, CRC(cfba6b2a) SHA1(001642016a3c02b031d739bd8b0fcff9470e86d2), ROM_BIOS(15)) + // 16: BIOS: AMI; 11/11/92 - ISA16: 5 - CPU/FPU: Am386DX-40, IIT 3C87-40 - Chipset: FOREX FRX46C521, KS83C206Q + // BIOS-String: 40-0G00-009999-00101111-111192-4X521-F + ROM_SYSTEM_BIOS( 16, "frx521", "using the Forex FRX46C521" ) // no display + ROMX_LOAD( "3fom001.bin", 0x10000, 0x10000, CRC(8fa851c8) SHA1(68ac21357558d98aee4e2ffb903791e4198e0dd0), ROM_BIOS(16)) + // 17: FOREX 386 Super DX System S3B + ROM_SYSTEM_BIOS( 17, "frxs3b", "Forex Super DX System S3B") // no display + ROMX_LOAD( "3fom003.bin", 0x10000, 0x10000, CRC(4e164e0a) SHA1(dc2d08061c443a3e4ced3ab11f1fa094585cbbba), ROM_BIOS(17)) + // 18: BIOS: AMI; 06/06/92 - BIOS-String: 40-0101-001107-00001111-060692-OPWB4SXB-0 / OPTI-495SX (471WB) BIOS VER 1.0 + // cf. driver hot409 - BIOS is capable of detecting 386sx => 486DX2, this particular BIOS was sorted with the 386s on chukaev + ROM_SYSTEM_BIOS( 18, "495sx", "OPTi 82C495SX") + ROMX_LOAD( "3opm009.bin", 0x10000, 0x10000, CRC(2abe36eb) SHA1(d113527ebd06f0359f2decd4ac0c6202f982d45e), ROM_BIOS(18)) + // 19: BIOS-String: EEMI-0386-030891-K0 - Chipset: 88C311 + ROM_SYSTEM_BIOS( 19, "eemi", "EEMI") + ROMX_LOAD( "3zzm002", 0x10000, 0x10000, CRC(c2a7ff22) SHA1(af2e321d3245ad839a41666917bb24cca0f7884d), ROM_BIOS(19)) + // 20: BIOS-String: 30-0300-ZZ1425-00101111-020291-ITOPDX / 23L-1-0000-00-00-0000-00-00-000-K0 + // 000-0-0000-00-00-0000-00-00-00-2 + ROM_SYSTEM_BIOS( 20, "topcat", "TOPCAT") + ROMX_LOAD( "ami_386_vl82c330_even.bin", 0x10000, 0x8000, CRC(a6f3d881) SHA1(40672d58f79d232dbda9685b9aa20533029fbdfc), ROM_SKIP(1) | ROM_BIOS(20)) + ROM_CONTINUE( 0x10001, 0x8000 ) + // 21: BIOS-String: MR BIOS (tm) V1.35 - RAM Pattern Test Failed at 0F0000H + ROM_SYSTEM_BIOS( 21, "mrv135", "MR BIOS V1.35") + ROMX_LOAD( "mrbios_v1.35_opti324_4floppy.bin", 0x10000, 0x10000, CRC(9a21dcd3) SHA1(dcab673fd2df621839671ef8f6a2eff443de39df), ROM_BIOS(21)) + // 22: BIOS-String: SINT-1185-040990-K0 - Chipset: VIA SL9030, SL9010, SL9025, SL9020, SL9020, SL9350, SL9090A + ROM_SYSTEM_BIOS( 22, "3vim002", "3VIM002") + ROMX_LOAD( "3vim002l.bin", 0x10000, 0x8000, CRC(368b66df) SHA1(1bef1e8e1818513061f0c7cf3c731da360c8400b), ROM_SKIP(1) | ROM_BIOS(22)) + ROMX_LOAD( "3vim002h.bin", 0x10001, 0x8000, CRC(02dbb9fe) SHA1(cfce750a4a019c71e59011fb7a7d891b40f61c61), ROM_SKIP(1) | ROM_BIOS(22)) + // 23: BIOS-String: 30-0201-ZZ1343-00101111-050591-OPWB-0 + ROM_SYSTEM_BIOS( 23, "zz1343", "zz1343") + ROMX_LOAD( "ami_zz1343.bin", 0x10000, 0x10000, CRC(f5464c1f) SHA1(cb069c3d1d322aa769d46749716a35259f78264a), ROM_BIOS(23)) + // 24: ID: AT046DX3-B2.1(PQFP) - CPU: AMD Am386DX/DXL-33, FPU socket provided - Keyboard BIOS: JETkey V3 - Chipset: ACC Micro 2168 F9217D103 SC00 333MHz + // RAM: 8xSIMM30, Cache: 64KB - OSC: 14.31818, 66.660MHz - ISA8: 1, ISA16: 5 + // BIOS-String: 30-004-428002-00101111-070791-ACC2046-0 + ROM_SYSTEM_BIOS( 24, "acc386", "AT046DX3-B2.1") + ROMX_LOAD( "acc386.bin", 0x10000, 0x10000, CRC(2177c9ac) SHA1(2e320dcd173137b9b0cbf92602e9b77398921aaf), ROM_BIOS(24)) +ROM_END + + +//************************************************************************** +// 80386 SX and DX motherboard +//************************************************************************** + +// 486MMBO4088 - Chipset : ETEQ ET486SLC2 A, P82C206 - BIOS : MR 386SX/86SLC BIOS V.1.61 +// Keyboard-BIOS: AMI MEGA-KB-F-WP - CPU: TI 486 TX486SLC/E -33MAB / FPU: IIT XC87SLC-33 - RAM: 8xSIMM30, Cache: 3xISSI IS61C256AH-15N, 2xIS61C256A-20N +// OSC: 14.31818MHz, 66.666MHz - ISA16: 7 +ROM_START( mmbo4088 ) // screen remains blank + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "eteq-mrb.bin", 0x10000, 0x10000, CRC(10267465) SHA1(9cc1e7e8b0ec6e0798229489dce5b2b0300bfbd8)) +ROM_END + +// ILON USA, INC. M-396B - Chipset: PC Chip (silk screen sanded off), KS82C6818A - BIOS: AMIBIOS - BIOS-string: 30-0500-ZZ1437-001001111-070791-PC CHIP-F +// Keyboard-BIOS: Regional HT6542 - CPU: i386sx-25, FPU socket provided - RAM: 4xSIMM30, 8x20pin DIP - OSC: 14.31818, 50.000MHz - ISA16: 6 +ROM_START( ilm396b ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "m396b.bin", 0x10000, 0x10000, CRC(e46bd610) SHA1(e5899f126ae6478f4db238cd1db835e0d1877893)) +ROM_END + +// Prolink P386SX-25PW VER:2.00 - Chipset: OPTi 82C281, F82C206 - BIOS/Version: AMI V007B316 - Keyboard-BIOS: AMI KB-BIOS-VER-F - OSC: 14.31818MHz, 50.000000MHz +// CPU: AMD Am386SX-25, FPU: IIT 3C87SX-33 - RAM: 8xSIMM30, Cache: 4x28pin, 2x24pin - ISA16: 8 - +// BIOS-String: 30-0100-008003-00101111-042591-OPSX-0 / OPSX 386SX BIOS / P386SX/25 PW IVN 1.0 1991.7 +ROM_START( p386sx25pw ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "p386sx25pw.bin", 0x10000, 0x10000, CRC(9cbebe61) SHA1(ef90c1a9cc7fc3accdac9738aaf519c1b3d8260d)) +ROM_END + +// ELT-P9 / Most likely ELT-386SX-160D - Chipset: NEC ELT3000A - CPU: Intel 80386sx-16 - RAM: 8xSIPP30, 1MB DIP - BIOS: Phoenix +// Keyboard BIOS: Intel P8242 - DIP6: 000000 - OSC: 14.31818MHz, 32.000MHz - ISA8: 1, ISA16: 6, ISA8/RAM: 1 +ROM_START( eltp9 ) // Phoenix 80386 ROM BIOS PLUS Version 1.10.20 + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "386_676849_l.bin", 0x10000, 0x8000, CRC(ab477e5e) SHA1(78d784f9c320fe7206c2601c4dbb47a90e5cbf96), ROM_SKIP(1)) + ROMX_LOAD( "386_676849_h.bin", 0x10001, 0x8000, CRC(02241258) SHA1(2bd80bab573cd88829edfb85522e978e5e477806), ROM_SKIP(1)) +ROM_END + +// QTC-SXM KT X20T02/HI Rev.3 - Chipset: VLSI / Intel S82343 + S82344A - BIOS Version: QTC-SXN 03.05.07 +// Keyboard BIOS: NEC Performance 204 (c) Quadtel 265 - CPU: i386sx-20, FPU: Intel 387sx +// RAM: 4xSIMM30, sockets for 1MB DIP - ISA8: 2, ISA16: 4 - OSC: 15.31818MHz, 16.000MHz, 40.0000 +ROM_START( ktx20t02 ) // BIOS-String: Quadtel VL82C286 386SX BIOS Version 3.05.07 + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "qtc-sxm-even-u3-05-07.bin", 0x10000, 0x8000, CRC(21f2ca4c) SHA1(7131de700cb95c825e61d611001bab1d3d3bb195), ROM_SKIP(1)) + ROMX_LOAD( "qtc-sxm-odd-u3-05-07.bin", 0x10001, 0x8000, CRC(1543d0f7) SHA1(12281ef81d7aabf291586f96b678074216f0c23a), ROM_SKIP(1)) +ROM_END + +// PC-CHIPS M317 - Chipset: PC Chip CHIP 5 (14L40F2054) / CHIP 6 (14L50F2053), UMC 82C206F - CPU: 80386, FPU socket privided +// BIOS: AMI 386 BIOS PLUS - Keyboard BIOS: AMI Keyboard BIOS Plus - RAM: 8xSIMM30 - Cache: 64K - solder pads for a memory card connector +// ISA8: 2, ISA16: 6 - OSC: 66.6670MHz, 14.318MHz +ROM_START( pccm317 ) // 40-0300-ZZ1347-00101111-031591-UMCWB-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386_pcchips.bin", 0x10000, 0x10000, CRC(8a6046ea) SHA1(1e6c5dacdb5f9a36e558e44466bcd9182d849932)) +ROM_END + +// ZEOS 386 SX-16 - Chipset: VLSI VL82C201-16QC, 82C202, 82C203, 82C204, 82C205A, 82C100 +// DVLX-6099-091589-K0 - AMI 386 BIOS for ZEOS INTERNATIONAL, LTD. / ST. PAUL, MINNESOTA 55112 USA +// (C)1987 American Megatrends Inc.386-BIOS (C) 1989 AMI, for ZEOS INTERNATIONAL - CPU: Intel 386sx-33, FPU sockets provided +// RAM: 36x16/18pin - ISA8: 2, ISA16: 6 - OSC: 64.000000, 14.31818 +ROM_START( zeos386sx ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "zeos_386_16 even.bin", 0x10000, 0x8000, CRC(9897f140) SHA1(b01de83d438ceda4a80e92dc1fc7d725323427b6), ROM_SKIP(1)) + ROMX_LOAD( "zeos_386_16 odd.bin", 0x10001, 0x8000, CRC(0f930857) SHA1(c63670eb336f1998532a4f601d1845902be279e7), ROM_SKIP(1)) +ROM_END + +// Packard Bell PCB-303 Rev.01 - Chipset: ACC Micro 2036 25MHz, UM82C862F - CPU: i386sx-25, FPU socket provided - RAM: 6xSIMM30 - ISA16: 1 +// VGA on board: OTI 512KB - on board: Floppy, IDE, ser, par, PS/2 mouse and keyboard - OSC: 50.000MHz x2 +ROM_START( pcb303 ) // Phoenix 80386 ROM BIOS PLUS Version 1.10 2715 - 19920411102517 - Error 8602 - Auxiliary Device Failure + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "386-packard-pcb-303.bin", 0x00000, 0x20000, CRC(bbb18c76) SHA1(94f3785c3b96dfe7ab53a97d097bfb17c57229b7)) +ROM_END + +// Philips P3239 (aka Headstart / MaxStation / Magnum / Professional 1200, 48CD, 1600, 64CD, P160, SR16CDPhilips 5107-100-36154 (motherboard), +// 5107-200-35452 (CPU card) - Chipset: VLSI VL82C311-FC2, VL82C107-VC, WD37C65CJM +// CPU (on card): Intel 386sx-20, FPU socket provided - BIOS: M27C1001, 48805 P3239 - on board: 2xser, par, VGA, Floppy, IDE +// RAM: 1MB, 1xSIMM72 - VGA on board: CL-GD5325-40QC-A, MUSIC TR9CI710-50DCA, 256KB - OSC: 9.600, 1.8432MHz, 14.31818, 16.000, 40.000 (on CPU card) +// DIP4: 0001 +ROM_START( php3239 ) // no display, beep code sounds like morse + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "386-philips_p3239.bin", 0x00000, 0x20000, CRC(9178e136) SHA1(e3bad39fcf028f459516d4e9a895035891eb801e)) +ROM_END + +// SOYO 386DX Baby-AT - Chipset: ETEQ ET82C4901 C, ET82C4903 A, Chips P82C206 H1 - CPU: Am386DX/DXL-40, FPU: Cyrix 387DX+ +// RAM: 8xSIMM30, Cache: 8x5C6408-12, 1x ATT7C185P-15 - BIOS: AMI 386 BIOS 336468 - BIOS-String: 41-0100-001102-00101111-121291-BENGAUTO-F - REV: C *** 40MHZ *** +// Keyboard BIOS: AMI KB BIOS-VER-F - ISA8: 1, ISA16: 6 - OSC: 8.000MHz, 80.000MHz +ROM_START( sybaby386 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386dx.bin", 0x10000, 0x10000, CRC(9fcfd21f) SHA1(5e7b42be55a45b0b51d2a7e8bd8d6405dbe69129)) +ROM_END + +// Diamond Flower International 386SX-16/20CN Rev 1.0 - Chipset : CHIPS P82C206, P82C215A, P82C812,P82C811 - BIOS: AMI +// CPU: Intel 80386SX-20, FPU socket privided - RAM: 8xSIMM30 - ISA8: 2, ISA16: 6 +ROM_START( dfi386sx ) // Hangs after initialising the graphics card + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "dfi_386sx_16cn_20cn_27c256_low.bin", 0x10000, 0x8000, CRC(58456dc1) SHA1(51f7052366106fe564aedb99ddf6974f6ad4c5cc), ROM_SKIP(1)) + ROMX_LOAD( "dfi_386sx_16cn_20cn_27c256_high.bin", 0x10001, 0x8000, CRC(1ab36d4b) SHA1(640af1c333255cca85543bc369cb0cede45e1ef6), ROM_SKIP(1)) +ROM_END + +// 3SIUD-1.1 - CPU: AMD Am386SX/SXL-25 - Chipset: SiS 85C206, UMC (unreadable) - RAM: SIMM30x4, 8x20pin, 4x16pin +// BIOS: AMI 386SX BIOS 70167 - Keyboard-BIOS: NEC KB-BIOS VER7 - ISA8: 1, ISA16: 5 - OSC: 50.000000MHz, 14.31818MHz +// BIOS-String: 30-0200-ZZ1266-00101111-050591-UMC386SX-0 / 3SIUD-1.0 +ROM_START( 3siud ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "3siud_bios.bin", 0x10000, 0x10000, CRC(24fa8491) SHA1(635ce3db872e39d84f299356b960b0a16e2cf082)) +ROM_END + +// AMI 386 BABY SCREAMER - BIOS: AMI MARK V BABY SCREAMER - Chipset: VLSI VL82C331-FC, VL82C332-FC, Megatrends MG-9275, Chips ??? - OSC: 14.31818, 66.666, 24.000MHz +// BIOS-String: 40-0301-000000-00101111-070791-SCREAMER-0 / BIOS RELEASE 42121691 - On board: 2xserial, parallel, floppy, 1xIDE +ROM_START( amibaby ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROMX_LOAD( "ami_mark_v_baby_screamer_even.bin", 0x00000, 0x10000, CRC(50baacb7) SHA1(c9cb6bc3ab23f35050a7f079109005331eb5de2c), ROM_SKIP(1)) + ROMX_LOAD( "ami_mark_v_baby_screamer_odd.bin", 0x00001, 0x10000, CRC(42050eed) SHA1(c5e1ed9717acb2e3adcb388ccecf90a74d495132), ROM_SKIP(1)) +ROM_END + +// AUVA TAM/25-P2 M31720P - Chipset: µC M19382, M19381A, Chips - CPU: 386DX 25Mhz - BIOS: DA058290 - Keyboard-BIOS: A179859 +// BIOS-String: 30-0101-D81105-00101111-050591-OPBC-0 / AUVA 386 TAM/25/P2(P2,A1,A2), 01/10/1992- ISA8: 1, ISA16: 6, ISA16/Memory: 1 +ROM_START( tam25p2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "tam25-p2.bin", 0x10000, 0x10000, CRC(0ea69975) SHA1(cb7f071a36653cf4f00a8b158a4900efb8f8b8e8)) +ROM_END + +// Elitegroup ELT-386SX-160BE - Chips P82C206 - CPU: Intel 386sx-16, FPU: socket provided - BIOS:Phoenix 679006 - Keyboard-BIOS: Intel P8242/Phoenix +// ISA8: 2, ISA16: 5 - OSC: 14.31818MHz, 32.000MHz - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 22 / ELT-386SX(P9) +ROM_START( elt386sx ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "elt386l.bin", 0x10000, 0x8000, CRC(95fd5508) SHA1(a66cd78f52f3931c6f8486db0d39f4e55244dcea), ROM_SKIP(1)) + ROMX_LOAD( "elt386h.bin", 0x10001, 0x8000, CRC(90c0597a) SHA1(b67b39662a0bb8c0cde1635d3fd3c1f9fbaad3c0), ROM_SKIP(1)) +ROM_END + +// TD70N motherboard - Chipset: Citygate D100-011 - ISA16: 6 - Keyboard-BIOS: JETkey V5.0 - CPU/FPU: Am386SX/SXL-33, i387SX +ROM_START( td70n ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: BIOS: AMI, Version 3.10 - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70N BIOS VERSION 3.10 + ROM_SYSTEM_BIOS( 0, "td70nv310", "TD70N V3.10" ) + ROMX_LOAD( "3cgm001.bin", 0x10000, 0x8000, CRC(8e58f42c) SHA1(56e2833457424d7176f8360470556629115493df), ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_CONTINUE( 0x10001, 0x8000 ) + // 1: BIOS: AMI, Version 3.23T - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / BIOS VERSION 3.23T + ROM_SYSTEM_BIOS( 1, "td70nv323", "TD70N V3.23T" ) + ROMX_LOAD( "3cgm002.bin", 0x10000, 0x8000, CRC(bca54fd8) SHA1(35b568c675e58965074162a93cf04918fc8d240f), ROM_SKIP(1) | ROM_BIOS(1) ) + ROM_CONTINUE( 0x10001, 0x8000 ) +ROM_END + +// TD70A and TD70AN motherboards - Chipset: Citygate D110-014, KS83C206Q - ISA8: 1, ISA16: 5 - Keyboard-BIOS: JETkey V5.0 - CPU: Am386SX-40 +ROM_START( td70a ) // 8042 GATE-A20 ERROR - SYSTEM HALTED + ROM_REGION16_LE(0x20000, "bios", 0) + // BIOS: AMI, Version 2.60 - BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70A BIOS VERSION 2.60 + ROM_SYSTEM_BIOS( 0, "td70a", "TD70A" ) + ROMX_LOAD( "3cgm003.bin", 0x10000, 0x8000, CRC(1a92bf18) SHA1(520cd6923dd7b42544f8874813fbf81841778519), ROM_SKIP(1) | ROM_BIOS(0) ) + ROM_CONTINUE( 0x10001, 0x8000 ) + // 1: BIOS-String: 20-0100-009999-00101111-060692-CGD90-F / TD70A BIOS VERSION 2.60G + ROM_SYSTEM_BIOS( 1, "td70an", "TD70AN") + ROMX_LOAD( "bios.bin", 0x10000, 0x8000, CRC(0924948b) SHA1(e66b5223a7fb0b3ddb30ad0873ff099abf331262), ROM_SKIP(1) | ROM_BIOS(1) ) + ROM_CONTINUE( 0x10001, 0x8000 ) +ROM_END + +// MORSE KP 386SX V2.21 - Chipset: MORSE 91A300 (sticker), UMC UM82C206L - BIOS: AMI 386SX BIOS (Ver. 2.10) C-1216 - ISA8: 2, ISA16: 6 +// BIOS-String: - 30-0200-ZZ1216-00101111-050591-386SX-0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS C-1216 - CPU: AM-386SX/SXL-25, FPU: iN80287-12 - OSC: 8.000, 14.31818, 50.000 MHz +ROM_START( mokp386sx ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "386-morse_kp386sx.bin", 0x10000, 0x10000, CRC(f3a9c69f) SHA1(6e028a11f3770d7cda814dfa698f2ab5d6dba535)) +ROM_END + +// ID: Morse KP920121523 V2.20 - Chipset: UMC UM82C206L MORSE 91A311 91A310 - CPU: AM386DX/DXL-40, FPU socket provided - RAM: 8xSIMM30, Cache: 32K/64K/128K +// BIOS: AMI 386DX BIOS Ver. 2.11 C-1216 - Keyboard BIOS: KB-BIOS-VER F MEGATRENDS - OSC: 14.31818MHz, 80.000MHz - ISA16: 8, solder pads for a memory extension card +ROM_START( mokp386 ) // BIOS-String: 30-0200-ZZ1216-00101111-050591-KP386DX-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386-morse-kp920121523.bin", 0x10000, 0x10000, CRC(9392e265) SHA1(1df163bef6cf73a1d2a40ac997b96f93d1f2f4d1)) +ROM_END + +// UNICHIP 386W 367C REV 1.0 - Chipset: UNIchip U4800-VLX/9351EAI/4L04F1914, HMC HM82C206 - CPU: AM386DX-40, FPU socket provided - ISA8: 1, ISA16: 5 - OSC: 14.31818 +ROM_START( uni386w ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS: AMI 386C BIOS 2116295 - + // BIOS-String: 40-0400-001107-00101111-111192-U4800VLX-0 / UNICHIP BIOS VER 2.0A 09/27/1993 - Keyboard-BIOS: AMI 386C BIOS KEYBOARD 2116295 - + ROM_SYSTEM_BIOS(0, "ver20a", "Ver. 2.0A") + ROMX_LOAD( "386-2116295.bin", 0x10000, 0x10000, CRC(7922a8f9) SHA1(785008e10edfd393dc39e921a12d1a07a14bac25), ROM_BIOS(0)) + // 1: AMI, 367 UNICHIP 386 BIOS VER 1.0 (1886636) / BIOS-String: 40-0300-001107-00101111-111192-U4800VLX-0 + ROM_SYSTEM_BIOS(1, "ver10", "Ver. 1.0") + ROMX_LOAD( "3ucm002.bin", 0x10000, 0x10000, CRC(9f2e19da) SHA1(ef64c6ad9d02db849d29e3b998ca42b663656bad), ROM_BIOS(1)) +ROM_END + +// SCsxAIO - Chipset: Chips 82C236 (SCATsx), Acer M5105 A3E - On board: 2xCOM, Floppy, ISA +// BIOS-String: Peacock 386sx Ver. 2.0 24.03.92 30-0000-D01131-00101111-070797-SCATsx-8 - ISA16: 6 +ROM_START( scsxaio ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "386-peacock_scsxaio.bin", 0x10000, 0x10000, CRC(54c3cacd) SHA1(b3c821b30052d0c771b5004a3746eb2cfd186c79)) +ROM_END + +// Shuttle 386SX REV 2.0A - Chipset: KU82335 SX042, Intel N82230-2 (Zymos); Intel N82231-2 (Zymos), BIOS: AMI 80386SX BIOS PLUS Ser #039747 +// BIOS-String: - DINT-1216-073089-K0 / 386-BIOS AMI for MORSE 386SX Personal Computer +// Keyboard-BIOS: AMI 386 Keyboard BIOS PLUS Ser.# 039747, CPU: unreadable (SMD), FPU: empty socket - OSC: 32.000 MHz, 14.31818 - ISA8: 2, ISA16: 6 +ROM_START( sh386sx20 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROMX_LOAD( "386-shuttle386sx-even_32k.bin", 0x10000, 0x8000, CRC(8b0c3d96) SHA1(73b6315928161a013cfe81b226606dfae5a8ef94), ROM_SKIP(1) ) + ROMX_LOAD( "386-shuttle386sx-odd_32k.bin", 0x10001, 0x8000, CRC(9c547735) SHA1(3cef5290324aab9d7523e98bf511eaea351e580d), ROM_SKIP(1) ) +ROM_END + +// Alaris Cougar - Chipset: OPTi 82C499 - ISA16: 5, ISA16/VL: 2 +// BIOS: MR BIOS (r) V1.65 - CPU: 75MHz IBM Blue Lightning +ROM_START( alacou ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "cougrmrb.bin", 0x10000, 0x10000, CRC(c018f1ff) SHA1(92c4689e31b367baf42b12cad8800a851cc3e828)) +ROM_END + +// Alaris Tornado 2 - CPU: 486 - Chipset: Opti/EFAR/SMC - ISA16: 4, PCI: 3, ISA16/VL: 2 - On board: Floppy, 1xIDE, parallel, 2xserial +ROM_START( alator2 ) // unknown beep code LH-HL + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "tornado2.bin", 0x00000, 0x20000, CRC(2478136d) SHA1(4078960032ca983e183b1c39ae98f7cdc34735d0)) +ROM_END + +// DTK PEM 2530 - Chipset: VLSI 9032BT/217203/VL82C100-0C +// Board's original ROMs were damaged (Datatech dtk 386 V4.26 A1763), "original" ROMs came from another user, V3.10 ROMs from a different board +// ISA8: 2, ISA16: 5, Memory connector: 1 - OSC: 40.000 MHz - 14.31818 MHz +ROM_START( pem2530 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // Phoenix 80386 ROM BIOS PLUS Version 1.10 01 KENITEC TECHNOLOGIES + ROM_SYSTEM_BIOS(0, "pem2530ori", "DTK PEM 2530 original") + ROMX_LOAD( "386-dtk_pem-2530_bios-low.bin", 0x10000, 0x8000, CRC(d9aad218) SHA1(a7feaad2889820852e3543229b0b103288470732), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "386-dtk_pem-2530_bios-high.bin", 0x10001, 0x8000, CRC(550c4d77) SHA1(05aba1a98e738f9b706b5a8f09b5b6c86bd336e2), ROM_SKIP(1) | ROM_BIOS(0)) + // 80386 BIOS Version 3.10 Rev. 2.06 (BIOS not original, works in PEM 2530) + // additional info from chukaev.ru54.com: CPUBT-S26361-D548 (Siemens?) - Chipset: VL82C320A, VL82C331, VL16C452B - CPU: NG80386SX-20, socket for 80387SX + ROM_SYSTEM_BIOS(1, "pem2530", "DTK PEM 2530") + ROMX_LOAD( "386-dtk pem-2530-high_32k.bin", 0x10000, 0x8000, CRC(56a822c0) SHA1(b65797c0f87a0815b393758af9c059e6d7172ae9), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "386-dtk pem-2530-low_32k.bin", 0x10001, 0x8000, CRC(8688d883) SHA1(c3034c8b343786cb89de48fb2f4992160414f89e), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +// SM 386-40F - MR BIOS (r) V1.40 - Ver: V1.40-FORX300 +// Chipset: SIS 85C206, FOREX FRX36C200, FOREX FRX36C300 +ROM_START( sm38640f ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "forex300.bin", 0x10000, 0x10000, CRC(8d6c20e6) SHA1(cd4944847d112a8d46612e28b97e7366aaee1eea)) +ROM_END + +// Soyo SY-019H and SY-019I BIOS-String: 30-0200-DH1102-00101111-070791-ETEQ386-0 / REV C3 +// Chipset: SIS 85C206, ETEQ ET82C493, ET82C491 +ROM_START ( sy019hi ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ami_soyo_sy-19i.bin", 0x10000, 0x10000, CRC(369a040f) SHA1(3dbcbcb8b8a50717cae3b17f44ca1b7c394b75fc)) +ROM_END + +// PC-Chips M321 - RAM: 8xSIMM30, Cache: 8 sockets, 4 sockets occupied by CY71C199-25PC - CPU: AM386-DX40, FPU: socket provided - OSC: 80.000MHz, 14.31818 +// Chipset: PCChips C206/306, CHIP6/4L04F1666, CHIP5/4L04F1282 (rev. 2.3, 2.5 and 2.7 boards) - ISA8: 2, ISA16: 6 +ROM_START( pccm321 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 30-0201-ZZ1347-00101111-050591-M320-0 + ROM_SYSTEM_BIOS(0, "m321_23", "PCChips M321 Rev.2.3") // also on a rev. 2.5 board with C&T J38600DX-33, ULSI MathCo-DX33 + ROMX_LOAD( "pcchips_m321_rev2.3.bin", 0x10000, 0x10000, CRC(ca0542e4) SHA1(8af9f88e022f8115708178c6c0b313ea0423a2b5), ROM_BIOS(0) ) + // BIOS-String: 30-0100-001437-00101111-060692-PC CHIP-0 + ROM_SYSTEM_BIOS(1, "m321_27_1", "PCChips M321 Rev.2.7 #1") + ROMX_LOAD( "3pcm002.bin", 0x10000, 0x10000, CRC(0525220a) SHA1(5565daea1db67fb2e6f5e7f5ddf5333569e74ab3), ROM_BIOS(1) ) + // BIOS-String: 30-0100-001437-00101111-060692-PC CHIP-0 - TRANS-AMERITECH ENTERPRISES, Inc. + ROM_SYSTEM_BIOS(2, "m321_27_2", "PCChips M321 Rev.2.7 #2") + ROMX_LOAD( "3pcm004.bin", 0x10000, 0x10000, CRC(d7957833) SHA1(b512d9fc404c4282fb964444aa70a9760edad7db), ROM_BIOS(2) ) + // BIOS-String: 30-0100-ZZ1437-00101111-070791-PC CHIP-0 + ROM_SYSTEM_BIOS(3, "m321_27_3", "PCChips M321 Rev.2.7 #3") + ROMX_LOAD( "pcchips_m321_rev2.7_2.bin", 0x10000, 0x10000, CRC(1c529364) SHA1(a0cb0dc31b34377024efb3124f4167a8e1d748e6), ROM_BIOS(3) ) +ROM_END + +// Morse M3 V3.00 - Chipset: Morse 4L04F1282 + 4L04F1666 + 92A206S / possibly a rebranded OPTi 82C391 chipset - CPU: Am386DX/DXL-33, +// CPU (80386DX) and FPU socket (W3167) provided - RAM: 8xSIMM30, Cache: 4xMOSEL MS62256-A-25NC, 1xT6C6408-20 - BIOS: AMI 386DX BIOS PLUS Ver.3.00 386DX C-1216 +// BIOS-string: 30-0201-ZZ1216-00101111-050591-386DX-0 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS C-1216 - OSC: 66.667MHz, 14.31818MHz - ISA8: 1, ISA16: 6 +ROM_START( mom3v3 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "morse_m3_v3.00.bin", 0x10000, 0x10000, CRC(4748a084) SHA1(169696ea08f25e05928c48cc8328c67c51789f0d)) +ROM_END + +// PC-Chips M326 +// Chipset: SARC RC4018A4/9324 and SARC RC6206A4/9408-AHS or SARC RC4018A4/9324 and RC4919A4-9323 (v5.5 board) or SARC RC2016A4-9320 and RC4019A4-9324 (v5.3) +ROM_START( pccm326 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Award Modular BIOS 4.50 + ROM_SYSTEM_BIOS(0, "pccm326", "PCChips M326 V5.2") // BIOS reports a 66MHz 386DX original board has a TI TX486DLC/E-40PCE and IIT 4C87DLC-40 CPU/FPU combo + ROMX_LOAD( "m326_v5.2_m601-326.bin", 0x10000, 0x10000, CRC(cca6a443) SHA1(096c8bfa000c682d6c801da27c7fd14243ebb63b), ROM_BIOS(0) ) + // 1: BIOS-String: 40-0100-001437-001001111-080893-4386-0 / Release 10/01/93 - also on an "M601 Rev. 1.3" board with a i486DX-33 (BIOS AMI AB0077440 - Keyboard-BIOS: Regional HT6542) + ROM_SYSTEM_BIOS(1, "m326r53", "PC-Chips M326 Rev. 5.3") + ROMX_LOAD( "m326_rev.5.3.bin", 0x10000, 0x10000, CRC(6c156064) SHA1(362ce5a2333641083706a878b807ab87537ca1e6), ROM_BIOS(1) ) + // 2: BIOS: AMI; 08/08/93; Release 10/01/93 + ROM_SYSTEM_BIOS(2, "m326", "M326") // no display + ROMX_LOAD( "3sam005.bin", 0x10000, 0x10000, CRC(f232cd4b) SHA1(e005aa3a7d160223fb2912cf2cd5cc8af49e79a5), ROM_BIOS(2) ) +ROM_END + +// Elitegroup UM386 Rev. 1.1 - UMC UM82C482AF, UM82C391A, UM82C206F - OSC: 80.000MHz, 14.31818MHz +// BIOS: AMI-1131 E-91844945 - Keyboard-BIOS: AMI KEYBOARD-BIOS-VER-F / Intel P8942AHP +// RAM: SIMM30x8, Cache: 9xW2464AK-20, 1x ISA8, 7xISA16 - CPU: AM386DX/DXL-40 +ROM_START( ecsum386 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 30-0500-D01131-00101111-070791-UMCWB-0 / UM386 V1.1 03-06-92 + ROM_LOAD( "ami_um386_rev1.1.bin", 0x10000, 0x10000, CRC(81fe4297) SHA1(efb2ba2be6f08cb487ee1b867a2456ed6b5975ad)) +ROM_END + + +// ***** 386sx motherboards using the ALi 1217 chipset + +ROM_START( alim1217 ) + ROM_REGION16_LE(0x20000, "bios", 0) + //0: BIOS-String: 30-0100-ZZ1453-00101111-070791-ACER1217-0 / CPU: 386SX-40 + ROM_SYSTEM_BIOS( 0, "m121701", "ALi M1217 #1" ) + ROMX_LOAD( "3alm005.bin", 0x10000, 0x10000, CRC(8708727c) SHA1(9be25b1af080aee863441cf0d25d0f984accb086), ROM_BIOS(0)) + // 1: BIOS-String: 30-0100-D01131-00101111-070791-ALI1217-F + ROM_SYSTEM_BIOS( 1, "m121702", "ALi M1217 #2" ) + ROMX_LOAD( "3alm006.bin", 0x10000, 0x10000, CRC(e448c436) SHA1(dd37127920a945f1273c70c41e79e4fc70a5de01), ROM_BIOS(1)) + // 2: BIOS-String: 30-0501-D81105-00101111-070791-ACER1217-0 - 386SX NPM/33,40-A0(2) 05/12/1993 + ROM_SYSTEM_BIOS( 2, "m919a00", "386SX NPM/33,40-A0" ) + ROMX_LOAD( "m919a00_npm-40.bin", 0x10000, 0x10000, CRC(4f330d82) SHA1(08224c7bcfb2a859b682bf44ac1ac7fd9f2ade78),ROM_BIOS(2)) + // 3: GMB-386SAT - Am386SX-40, IIT 3C87SX-33 - flashing "K/B controller incorrect" - Chipset: ALi M1217-40 - ISA8: 1, ISA16: 5 + // BIOS: AMI 386SX BIOS AA1280569 - BIOS-String: 30-0100-428036-00101111-111192-ALI1217-F - Keyboard-BIOS: JETkey V5 + ROM_SYSTEM_BIOS( 3, "gmb386sat", "GMB-386SAT_V1.0" ) + ROMX_LOAD( "gmb-386sat_v1.0.bin", 0x10000, 0x10000, CRC(59ecc773) SHA1(f2007fce76b3a91f51bfb5f43c1539d5ae06d35f), ROM_BIOS(3)) + // 4: ML-765 V2 - BIOS: AMI AA0508210 - BIOS-String: 30-0103-DJ1113-00101111-070791-ACER1217-0 + ROM_SYSTEM_BIOS( 4, "ml765", "ML-765" ) + ROMX_LOAD( "3alm011.bin", 0x10000, 0x10000, CRC(27a799d4) SHA1(873cf5968923c5a655ff32f3d968b7cddcb08e76), ROM_BIOS(4)) + // 5: BIOS: AA0030659 - BIOS-String: 30-0100-428029-00101111-070791-ACER1217-0 + ROM_SYSTEM_BIOS( 5, "m121703", "ALi M1217 #3" ) + ROMX_LOAD( "3alm012.bin", 0x10000, 0x10000, CRC(5b822a2a) SHA1(e61b27f06cfec54973fbabff277bde617847b1e2), ROM_BIOS(5)) + // 6: 303N1 - Chipset: ALi M1217, M5818 - BIOS: MR BIOS MR001-SX V.1.41 - Keyboard BIOS: JETkey V3.0 - CPU: i386sx, FPU socket provided + // RAM: 4xSIMM30 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS( 6, "acer310", "Acer 310" ) + ROMX_LOAD( "3alr001.bin", 0x10000, 0x10000, CRC(b45e5c73) SHA1(81ef79faed3914ccff23b3da5e831d7a99626538), ROM_BIOS(6)) + // 7: 8517 V3.2 - Chipset : ALI M1217-40, M5818 A1 - CPU: AMD Am386SX-40, FPU: ULSI Advanced Math Coprocessor SX/SLC US83S87 - BIOS : MR 386SX BIOS V.1.40 SX M1217 + // BIOS-String: - Keyboard-BIOS: JETkey V3.0 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS( 7, "8517v32", "8517 V3.2" ) // MR BIOS (r) V1.40 + ROMX_LOAD( "m1217mrb.bin", 0x10000, 0x10000, CRC(8ac66b9d) SHA1(909e5129066d1b0563b03c4834f9894c9291c287), ROM_BIOS(7)) +ROM_END + +// Computechnik ASC486SLC, 386sx slot CPU - Chipset: ALi M1217-40, PIC P4020 - CPU: TI 486SLC/E -33P AF - RAM: 4xSIMM30 +// OSC: 66.000 - BIOS: AMI 386SX BIOS AA1330085 - Keyboard-BIOS: AMI MEGAKEY - On board: 2xser, par, Floppy, IDE +// BIOS-String: 30-0100-001588-00101111-111192-ALI1217-0 / A-03 +ROM_START( asc486slc ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD("asc486slc.bin", 0x10000, 0x10000, CRC(aadbd3b6) SHA1(635df5b3cfd4525bc8ad9067703c8860dacd987a)) +ROM_END + +// Manufacturer/Identifier: ECS 8517 v3.3 - Chipset: ALI-M1217-40, M5818 A1 9347 TS 10 A45296 - CPU: 386sx, FPU socket provided +// RAM: 4xSIMM30 - BIOS Version: AMI 386sx BIOS AA1021639 - Keyboard BIOS: JETkey V5 - BIOS String: 40-0000-zz1218-00101111-070791-ALI1217-0 +// Board marking: 8517 V3.3 and 200-03690-341-4 - OSC: 80.000MHz - ISA8: 1, ISA16: 5 +ROM_START( ecs8517 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD("8517_v33.bio", 0x10000, 0x10000, CRC(c2b18ace) SHA1(fb10108a8d7a4782442f7a518e0ebab01f2e54bd)) +ROM_END + + +// 386 motherboards using the ALi M1419 chipset + +ROM_START( alim1419 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: KMC-A419-8 VER 1.0 - Chipset: M5818 A1, ALi M1421 A1, M1419 A0 - OSC: 14.31818, 80.000MHz + // BIOS-String: 40-0100-001453-00101111-121291-ALI1419-0 / 486DLC/386DX, ISA8: 1, ISA16: 6 + ROM_SYSTEM_BIOS ( 0, "kmca419", "KMC-A419-8 VER 1.0" ) + ROMX_LOAD( "3alm010.bin", 0x10000, 0x10000, CRC(733d0704) SHA1(b5724f98047e95ea41aaa396a0374357f20cf2de), ROM_BIOS(0)) + // 1: BIOS: Award Modular BIOS v4.50 - BIOS-String: 06/22/93-ACER-M1419-214k6000-00 + ROM_SYSTEM_BIOS( 1, "alim141901", "ALi M1419 #1" ) + ROMX_LOAD( "3alw001.bin", 0x10000, 0x10000, CRC(15bd5c90) SHA1(abe2a8613d2950b27701468144fe9de8063d6e57), ROM_BIOS(1)) + // 2: 386AC P102 - CPU: Am386DX-40, FPU socket provided - Chipset: ALi M1419 A1, M1421 A1 - BIOS: AMI 386DX ISA BIOS AA1226493 - + // Keyboard-BIOS: JETkey V3 - RAM: 8xSIMM30, Cache: 9x28pin - ISA8: 8, ISA16: 7 - OSC: 14.31818, 80.000MHz + // BIOS-String: 40-0102-001128-00101111-121291-ALI1419-0 + ROM_SYSTEM_BIOS( 2, "386acp102", "386AC P102") + ROMX_LOAD( "386ac_p102_ami_aa1226493.bin", 0x10000, 0x10000, CRC(43ba9775) SHA1(9f80ebf1e7ef1d7e5b7c2aad5839b4f982db75d1), ROM_BIOS(2)) + //3: ID: Unknown C3404 Rev:B - Chipset: ALI M1419 A1, M5818 A1, another unreadable (silk screen: M1421) - RAM: 8xSIMM30, Cache: 8x28pin DIP, 64K or 256K + // CPU: AMD Am386DX-40, solder pads for Intel 80386 socket provided, FPU socket provided - BIOS: AMI 386DX ISA BIOS AA1458354 + // BIOS Version: "386DX Subversion 13.19.02 3/23/1993" - BIOS String: 40-0100-001374-00101111-121291-ALI1419-F - Keyboard BIOS: JETkey V3 + // ISA8: 1, ISA16: 6 - OSC: 14.31818, 80.000 MHz + ROM_SYSTEM_BIOS( 3, "c3404", "C3404") // displayed BIOS-String in MAME has -0 instead of -F: this denotes the keyboard controller version http://www.idhw.com/textual/guide/inst_mobo_ami.html + ROMX_LOAD( "386c3404.bio", 0x10000, 0x10000, CRC(8005f1f6) SHA1(1c78a7a3f134fd1299b48cd12b08b013c212fa59), ROM_BIOS(3)) +ROM_END + + +// ***** 386 Motherboards using the Ali M1429 A1 and M1431 A2 chipsets ... they hang before initializing the graphics card + +ROM_START( alim1429 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS( 0, "386ali", "386 board with Ali chipset" ) + ROMX_LOAD( "386_ali_ami_511767.bin", 0x10000, 0x10000, CRC(3c218db4) SHA1(785ea7c36e8be5e7410524e90170d4985cbc9c24), ROM_BIOS(0)) + // 1: Seritech SER-386AD III (written on the underside of the board) - CPU: AMD Am386DX-40 - ISA16: 5 + // BIOS : AMIBIOS 04/04/1993 Ser.# 579092 - BIOS-String : 40-0212-001133-00101111-040493-ALI1429-F - Keyboard BIOS: Regional HT6542 + ROM_SYSTEM_BIOS( 1, "ser386ad", "SER-386AD III" ) + ROMX_LOAD( "ser386ad3.bin", 0x10000, 0x10000, CRC(d80d6deb) SHA1(9f889f7464255431c13ac91d7df31b325447fef5), ROM_BIOS(1)) + // 2: ISA8: 1, ISA16: 5, BIOS-String: 40-0103-001256-00101111-080893-ALI1429-H, BIOS: AMIBIOS, 08/08/93, 386DX ISA BIOS, AA2722981 + ROM_SYSTEM_BIOS( 2, "revb", "REV:B") + ROMX_LOAD( "3alm001.bin", 0x10000, 0x10000, CRC(56ea4d9d) SHA1(0633f78a0013a62be974233a3cad6a5d3cbe90d1), ROM_BIOS(2)) + // 3: CPU: 386DX-40 - + ROM_SYSTEM_BIOS( 3, "alim142901", "ALi M1429 #1" ) + ROMX_LOAD( "3alm007.bin", 0x10000, 0x10000, CRC(b72d754a) SHA1(364a976eac61bc923b76ccddd13f80e0727e5df5), ROM_BIOS(3)) + // 4: REV:8 - CPU: 386DX-40 + ROM_SYSTEM_BIOS( 4, "alim142902", "ALi M1429 #2" ) + ROMX_LOAD( "3alm008.bin", 0x10000, 0x10000, CRC(4cb1052d) SHA1(995a590beb0654c5e784f10019c10bd4b0278d9b), ROM_BIOS(4)) + // 5: ??? REV 2.3, Chipset: Asaki 3A029, 3A031 (= ALi 1429) - BIOS: AMI 386 BIOS S/N: 254468 + // BIOS-String: 40-0215-001926-00101111-040493-ALI1429 - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS( 5, "asaki", "386 with Asaki chipset" ) + ROMX_LOAD( "3asm001.bin", 0x10000, 0x10000, CRC(57c72c4d) SHA1(934223fcd39533bca2e7e57406b1800d9e900ef0), ROM_BIOS(5)) +ROM_END + +// Daewoo AL486V-D Rev:1.1 - BIOS/Version: AMI v299 08/08/93, BIOS-String: 40-0100-001131-00101111-080893-ALI1429 - Keyboard-BIOS: MEGAKEY +// BIOS: AMI v1.9 299 WinPro-d S/No. E-94237376 - OSC: 14.31818 +ROM_START( al486vd ) // this is a 386 class board despite the name + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "al486v-d_v299.bin", 0x10000, 0x10000, CRC(75c75d58) SHA1(50e314cdefe39e8e6f74b9b045a15cc53b3f16ba)) +ROM_END + + +// 386 motherboards using the Chips & Technologies P82C351, P82C355, P82C356 chipset + +// ABIT FU340 - 6x 16-bit ISA + 2x 8-bit ISA - RAM: SIMM30x8, Cache: 32/64/128/256KB with TAG (TULARC info) +// BIOS-String: 30-0200-D01247-00101111-050591-PEAKDM_B-0 / FU340 REV-B PAGE MODE BIOS +ROM_START( fu340 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ami_abit_fu340.bin", 0x10000, 0x10000, CRC(9ea90d90) SHA1(091bdae7b1e36ac5168823d80d5907af2a95e583)) +ROM_END + +// GES 9051N-386C VER -0.01 - CPU/FPU: i386DX-33, i387DX 16-33 - Chipset: Chips F82C351, F82C355, F82C356 - BIOS: AMI 386DX ISA BIOS (AA0365368) +// BIOS-String: 30-1113-002101-00001111-050591-PEAKDM_B-0 / GES 9051N BIOS VERSION 2.0 - ISA8: 3, ISA16: 5 +ROM_START( ges9051n ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3ctm001.bin", 0x10000, 0x10000, CRC(7f03f606) SHA1(d03d5b6541bc7f41d78159f82aa8057229516c37)) +ROM_END + + +// ***** 386sx motherboards using the Chips SCAMPSX chipset + +// ANIX CH-386S-16/20/25G P/N:001-0386S-016 VER 1.0 - Chipset: CHIPS F82C836 - BIOS: AMI 386sx BIOS PLUS S/NO. 141334 +// BIOS-String: 30-0100-D01425-00101111-050591-SCAMPSX-0 - Keyboard-BIOS: Intel/AMI - CPU: Intel (SMD), label not readable - FPU: socket available - ISA16: 6 - OSC: 14.31818 - 32.000 MHz +ROM_START( anch386s ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "386-ch-386s.bin", 0x10000, 0x10000, CRC(8902c64b) SHA1(3234bac6240a3a0bd05302c9ca587f5ae083f2f4)) +ROM_END + +// 80386SX-VH-COM - Chipset: VLSI VL82C311 VL82C113 - BIOS: Award 386SX-BIOS - BIOS-String: 386SX Modular BIOS v3.15 Copyright(c)1984-91 Award Software Inc. +// CPU: i386sx-25, FPU socket provided - RAM: 8xSIMM8 - OSC: 16MHz, 14.31818, 50.000MHz - ISA8: 2, ISA16: 6 +ROM_START( 386sxvhcom ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "80386sx-vh-com.bin", 0x10000, 0x10000, CRC(65f5d279) SHA1(81c40ad1f7dde3235a074d97768ed7e09cf05f52)) +ROM_END + +ROM_START( scamp386sx ) + ROM_REGION16_LE(0x20000,"bios", 0) + // 0: BIOS-String: 30-0100-D61204-00101111-050591-SCAMPSX-0 / MB-1316/20/25VST + ROM_SYSTEM_BIOS(0, "mb386sx", "mb386sx-25spb") // VLSI SCAMPSX + ROMX_LOAD( "386sx_bios_plus.bin", 0x10000, 0x10000, CRC(f71e5a8d) SHA1(e73fda2547d92bf578e93623d5f2349b97e22393), ROM_BIOS(0)) + // 1: BIOS-String: 30-0400-428027-00101111-070791-SCMPSX-0 / VLSI SCAMP 386SX 16/20/25MHz - seen on a PC-Chips/Amtron board + ROM_SYSTEM_BIOS(1, "scamp01", "VLSI SCAMPSX #1") + ROMX_LOAD( "ami_386sx_vlsi_scamp_070791.bin", 0x10000, 0x10000, CRC(082d071c) SHA1(69af9a951f138146036b3c9ac3761cc6589b6cf5), ROM_BIOS(1)) + // 2: Dataexpert (Unknown model) - Chipset: VLSI VL82C311-25FC2 (SCAMPSX), HM6818P - BIOS: AMI 05/05/1991 on a 64KB "Fairchild FM27C512" + // BIOS-String: 30-0100-D41107-00101111-050591-SCAMPSX-0 - SCAMP 386SX WITHOUT COMBO - Keyboard BIOS: 247076 - CPU: AM386SX/SXL-25 - OSC: 50.000MHz, 16.000MHz, 14.31818 - ISA16: 7 + ROM_SYSTEM_BIOS(2, "datax386sx", "Dataexpert 386sx") + ROMX_LOAD( "bios.bin", 0x10000, 0x10000, CRC(0ba46059) SHA1(b152796e9ace0cd17c413df14d989b9cb23aa529), ROM_BIOS(2)) + // 3: VLSI 311 386SX VER 1.0 - CPU: AM386 SX/SXL-25 - Chipset: VPL201, VPL101 - BIOS: AMI 386sx 409425 - OSC: 50.000 MHz - ISA16: 6 + // BIOS-String: 30-0400-D41107-00101111-070791-SCMPSX-0 + ROM_SYSTEM_BIOS( 3, "vlsi311", "VLSI 311") + ROMX_LOAD( "vlsi_311_386sx_ver_1.0_bios.bin", 0x10000, 0x10000, CRC(98056235) SHA1(3a3ff07808c4d43e4935c7463741e3ed8e515af9), ROM_BIOS(3)) + // 4: BIOS-String: 30-0100-ZZ1379-00101111-050591-SCAMPSX-0 / SCAMP 386SX - Chipset: (VLSI ???) 82C310, 82C311 - CPU: 386SX-25 + ROM_SYSTEM_BIOS(4, "scamp02", "VLSI SCAMPSX #2") + ROMX_LOAD( "3vlm002.bin", 0x10000, 0x10000, CRC(4d2b27b3) SHA1(3c67d7bd507ceb4d1762866f69c2cb94cd799a15), ROM_BIOS(4)) +ROM_END + + +// ***** 386 Motherboards using the Chips & Technologies CS8230 chip set: P82C301C, P82C302C, P82A303, P82A304, 2x P82B305, P82A306 A, P82C206 + +// ECS (Elitegroup) 386A - Chipset: CHIPS P82C301/2/5 + P82A303/4/6 + P82C206 - BIOS/Version: AMI 386-BIOS / 386A V1.1 05-19-90 (2 x 27C256) +// BIOS String: EC&T-1131-040990-K8 - Keyboard BIOS: AMI Keyboard BIOS PLUS - CPU: Intel 80386DX-25, FPU: 80387DX-25 - RAM: 8xSIMM30 +// ISA8: 2, ISA8/RAM: 1, ISA16: 5 - OSC: 32.0000MHz, 50.0000MHz, 14.31818 +ROM_START( ecs386a ) // hangs after initialising the graphics card + ROM_REGION32_LE(0x20000, "bios", 0) + ROMX_LOAD( "386a012l.bin", 0x10000, 0x8000, CRC(8a067777) SHA1(aadc84867155e4e167a0380bd409dba62fd238a1), ROM_SKIP(1)) + ROMX_LOAD( "386a012h.bin", 0x10001, 0x8000, CRC(525fc3bd) SHA1(3ab8cb5989933edc6aa9f99fcab518307b60552b), ROM_SKIP(1)) +ROM_END + +ROM_START( cs8230 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: EC&T-1332-040990-K0 + ROM_SYSTEM_BIOS(0, "cs823001", "CS8230 #1") + ROMX_LOAD( "ami_386_cs8230_chipset.bin", 0x10000, 0x10000, CRC(1ee766d0) SHA1(75dba3c9817dfe6caca46f5f4f2f1d76ba88d3c7), ROM_BIOS(0) ) + // 1: BIOS-String: EC&T-1197-022589-K0 + ROM_SYSTEM_BIOS(1, "cs823002", "CS8230 #2") + ROMX_LOAD( "3ctm004l.bin", 0x10000, 0x8000, CRC(b6efc361) SHA1(88d89bf5e7c57ffe4751e14220ac82a2d0a12994), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "3ctm004h.bin", 0x10001, 0x8000, CRC(f26c2672) SHA1(1d3a2554bbf3dc554970e0d62d9c5fad24977f55), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// ECS-386/32 - OSC: 40.000MHz, 32.000MHz, 14.318MHz - CPU: 386DX-20, FPU socket provided +// 8x SIMM, 5x 16-bit ISA, 2x 8-bit ISA, 1x 32-bit proprietary memory expansion slot +ROM_START( ecs38632 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: EC&T-1131-030389-K0 + ROM_SYSTEM_BIOS( 0, "030389", "030389") + ROMX_LOAD( "ami_ecs-386_32_lo.bin", 0x10000, 0x8000, CRC(e119d6a4) SHA1(bcc6164173b44832b8ebfa1883e22efc167e2cd4), ROM_SKIP(1) | ROM_BIOS(0) ) + ROMX_LOAD( "ami_ecs-386_32_hi.bin", 0x10001, 0x8000, CRC(e3072bf8) SHA1(74eec72e190f682cfd5ae5425ebdc854e0ba7bc9), ROM_SKIP(1) | ROM_BIOS(0) ) + // 1: BIOS-String: EC&T-1131-092588-K0 + ROM_SYSTEM_BIOS( 1, "092588", "092588") + ROMX_LOAD( "ami_1131_bios_l.bin", 0x10000, 0x8000, CRC(145c3905) SHA1(9ee2615982e28082971bae8ef8a1f936313ac8c8), ROM_SKIP(1) | ROM_BIOS(1) ) + ROMX_LOAD( "ami_1131_bios_h.bin", 0x10001, 0x8000, CRC(73d57778) SHA1(176c90134540d5054c99c077126c7c5a65199175), ROM_SKIP(1) | ROM_BIOS(1) ) +ROM_END + +// SY-012 16/25 386MB VER: 5.2 - Chipset: Chips P82C301C; P82A306; P82A303; P82C206; P82A304; P82C302; P82B305 +// BIOS: AMI 386 BIOS 10084 - BIOS-String: DC&T-1102-082588-K0 - CPU: i386DX-33, ISA8: 2, ISA16: 5, Memory: 1 +// OSC: 14.31818 - 20.000 MHz - 50.000 MHz - 32.000 MHz +ROM_START( sy012 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROMX_LOAD( "386-sy-012-l_32k.bin", 0x10000, 0x8000, CRC(6ab197f4) SHA1(7efd9033af3a0b36bc5be64cb28c6218cda4d13c), ROM_SKIP(1) ) + ROMX_LOAD( "386-sy-012-h_32k.bin", 0x10001, 0x8000, CRC(61aedfdb) SHA1(0f492dc8102386a1c475c5637fb7853d81d3efb6), ROM_SKIP(1) ) +ROM_END + +// Goldstar 611-606A - Chipset: CHIPS P82C206 P82C301 P82A303 P82C302 P82A304 2xP82A305 - +// OSC: 14.318 - 9.6000000 MHz - 40.000000 MHz - 16.000000 MHz +// BIOS: TI CMC3000 - BIOS-String: Phoenix 80386 ROM BIOS PLUS Version 1.10 01 - release 2.7B +ROM_START( gs611606a ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROMX_LOAD( "386-goldstar-e_32k.bin", 0x10000, 0x8000, CRC(3f358257) SHA1(1570f3de1955895c29c1c4240e1cd47aadff1be0), ROM_SKIP(1) ) + ROMX_LOAD( "386-goldstar-o_32k.bin", 0x10001, 0x8000, CRC(c5d75635) SHA1(70ceb4089bfd3af6853c3d6e28dbded0c43f6a40), ROM_SKIP(1) ) +ROM_END + +// DFI386-20.REV0 - Chipset: Chips 2xP82B305 P82A304, P82C302 P82C301 P82C206, two unreadable - initializes graphics card then hangs +// BIOS: AMI 386 BIOS PLUS Ser.#: 102856 - Keyboard BIOS: AMI 386 BIOS PLUS Ser.#:102856 +// CPU: i386DX-20 - ISA8: 1, ISA16: 5, Memory: 1 - Memory card shown in photos +// OSC: OSC1: 14.31818, OSC2: 16.000MHz, OSC3: unreadable, OSC4: 40.000MHz +ROM_START( dfi386 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROMX_LOAD( "386-dfi-386-20_even_32k.bin", 0x10000, 0x8000, CRC(2d1309f8) SHA1(a75816b97d1f763dba39bdccf8e58729a58b0e56), ROM_SKIP(1) ) + ROMX_LOAD( "386-dfi-386-20_odd_32k.bin", 0x10001, 0x8000, CRC(1968fe11) SHA1(b5662daa57751859d2cfa7740f708277cbe35080), ROM_SKIP(1) ) +ROM_END + + +// ***** 386 Motherboards using the Forex FRX36C300 + FRX46C402; SiS 85C206 chipset + +// Chipset: FOREX FRX46C402 FRX36C300 SIS 85C206 SiS 85C206 - CPU: Intel 80386DX-16 - ISA16: 7, ISA16/Memory: 1 - OSC: 66.000MHz +ROM_START( frxc402 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS: AMI 386 BIOS PLUS - Ser. 006707 - BIOS-String: 30-0400-ZZ1266-00101111-070791-FORX-0 / FRX/386DX CACHE SYSTEM + ROM_SYSTEM_BIOS(0, "frx386", "FRX/386") + ROMX_LOAD( "386-forex.bin", 0x10000, 0x10000, CRC(4a883c14) SHA1(1c2de190ccd152ff894f9fd128e028d4fa63109a), ROM_BIOS(0)) + // 1: Chipset: Forex FRX36C300 + FRX46C402; IMP 82C206 - ISA16: 8, memory extension connector on board but not fitted + // BIOS: AMI - BIOS-String: - 30-0400-ZZ1139-00101111-070791-FORX-0, FRX/386DX CACHE SYSTEM - Keyboard BIOS: Intel P8942HP with AMI KB-BIOS-VER-F - OSC: 14.31818MHz, 66,667MHz + ROM_SYSTEM_BIOS(1, "frximp", "Forex 386 with IMP chip") + ROMX_LOAD( "386-imp82c206p.bin", 0x10000, 0x10000, CRC(6f340961) SHA1(393720e1bfe3d323a34106992a65dd593284bf95), ROM_BIOS(1)) +ROM_END + +// RAM: 8xSIMM30, Cache: 10 sockets, 5xATT7C199P occupied - ISA8: 2, ISA16: 6 - CPU: AM386DX/DXL-40, FPU: IIT 3C87-25 +// OSC: 80.000MHz, 14.318180MHz - Keyboard-BIOS: AMI 386 BIOS ZA902884 +ROM_START( smih0107 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 30-0400-428005-00101111-070791-FORX-0 / BIOS ID SMIH0107 / IT9112 + ROM_LOAD( "ami_smih0107.bin", 0x10000, 0x10000, CRC(970bb0c0) SHA1(4a958887485f7239d25fa7b0c98569b97ce93800)) +ROM_END + + +// ***** 386 Motherboards using the Forex FRX46C402 + FRX46C411 + SiS 85C206 chipset + +// PT-581392 - CPU: AMD 386DX-40 FPU: ULSI Advanced Math Coprocessor DX/DLC 40MHz US83C87 +// BIOS : AMI 07/07/1991, on a 27C512 type EPROM (64KB) Ser.# 007139, BIOS-String : 30-0400-ZZ1101-00101111-070791-FORX-0 FRX/386DX CACHE SYSTEM +// Keyboard-BIOS: AMI, Ser.# 007139 - OSC: 14.31818, 80.000MHz - ISA16: 8 +ROM_START( pt581392 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pt-581392 386dx.bin", 0x10000, 0x10000, CRC(389a93de) SHA1(8f1320b1d163167272cfad073f58c355e31fcf6f)) +ROM_END + +// Micro-Express Inc. Forex 386 Cache - Chipset: Forex FRX46C402, FRX46C411, Morse 92A206S - Keyboard BIOS: Lance LT38C41 +// BIOS: EPROM, AMI 386 BIOS, #ZA605315 - CPU: AM386DX-40 - OSC: 66.6670MHz - ISA8: 2, ISA16: 5 +// BIOS-String: 30-0701-001585-00101111-121291-microtel-0 / Microtel Computer products present C3HF/09/92 +ROM_START( frx386c ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "forex386.bin", 0x10000, 0x10000, CRC(007b5565) SHA1(cf749fe05cacebb2230cd7493523ae55e80eea8b)) +ROM_END + + +// ***** 386sx motherboards using the Headland HT18/C chipset +// moved here from 286, original comment: not a bad dump, sets unknown probably chipset related registers at 0x1e8 before failing post +ROM_START( ht18c ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: (BIOS release date:: 07-07-1991) - Chipset: Headland HT18/C + ROM_SYSTEM_BIOS(0, "ami181", "AMI HT 18.1") + ROMX_LOAD( "ht18.bin", 0x10000, 0x10000, CRC(f65a6f9a) SHA1(7dfdf7d243f9f645165dc009c5097dd515f86fbb), ROM_BIOS(0) ) + // 1: CPU: 386SX-25 - BIOS: AMI; 12/12/91 + ROM_SYSTEM_BIOS(1, "ami182", "AMI HT 18.2") + ROMX_LOAD( "3hlm001.bin", 0x10000, 0x10000, CRC(b1434d6f) SHA1(1863dd60ad2b494141b4b30fe7b02f454bec82a3), ROM_BIOS(1) ) + // 2: CPU: 386SX-25 - BIOS: AMI; 07/07/91 + ROM_SYSTEM_BIOS(2, "ami183", "AMI HT 18.3") + ROMX_LOAD( "3hlm002.bin", 0x10000, 0x10000, CRC(10a78d11) SHA1(0500d92e2691164bdc5c71b3d6fd0a154f7279d4), ROM_BIOS(2) ) + // 3: CPU: 386SX-25 - BIOS: AMI; 04/30/91 + // BIOS-String: 30-01]1-ZZ1372-00101111-0403091-HT18SX-0 + ROM_SYSTEM_BIOS( 3, "ami184", "AMI HT 18.4") // marked as BAD_DUMP for the "]" in the BIOS string ... and because it actually runs :) + ROMX_LOAD( "3hlm003.bin", 0x10000, 0x10000, BAD_DUMP CRC(50f7a543) SHA1(8962f7ce2fc5c60059894cae04cf5fccd6cee279), ROM_BIOS(3) ) + // 4: MBA-025 - Chipset: Headland HT18/B, HM6818A - BIOS: AMI 386SX BIOS PLUS T.B 238958 - BIOS-String: 30-0100-009999-00101111-043091-HT18SX-0 + // Keyboard-BIOS: AMI Keyboard BIOS PLUS T.B. 238958 - CPU: AMD AM386 SX/SXL-25 - FPU: empty socket - OSC: 32.000 MHz - 50.000 MHz - 14.31818 - ISA8: 1, ISA16: 6 + ROM_SYSTEM_BIOS( 4, "mba025", "MBA-025" ) + ROMX_LOAD( "386-mba-025-low_32k.bin", 0x10000, 0x8000, CRC(4df55219) SHA1(7dc1adb130ae8c3c88e2c58bde6e3b793fa0c78e), ROM_SKIP(1) | ROM_BIOS(4)) + ROMX_LOAD( "386-mba-025-high_32k.bin", 0x10001, 0x8000, CRC(0406fdc9) SHA1(ee21d584c98b0c11ec2cfb609de83c38b0a893c7), ROM_SKIP(1) | ROM_BIOS(4)) +ROM_END + + +// ***** 386 Motherboards using the Macronix MX83C305(A)(FC), MX83C06(A)(FC) chipset + +// CACHING TECH CORPORATION C386MX - Chipset: MX83C306 MX - BIOS: AMI - BIOS-ID: 31-0100-001190-00101111-121291-MXIC +// CPU: 386DX, FPU: Cyrix - RAM: 8xSIMM30 - ISA8: 2, ISA16: 6 +ROM_START( ctcc386mx ) // nine short beeps, no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "c386mx.bio", 0x10000, 0x10000, CRC(9b24ce11) SHA1(d027da188cbdfbe34b279bd3bd84eccda75b4a5a)) +ROM_END + +// TAM/33/40-MA0 (CM318R00,M31-R00) - Chipset: MX83C305, MX83C306 - CPU: AMD Am386DX-40 - ISA16:8 +// OSC: 80.000MHz - 14.31818 - BIOS: AMI 386 BIOS PLUS S/N OA2050592 - BIOS-String: 31-0100-001105-00101111-121291-MXIC-0 - 386DX/Cx486DLX TAM/33,30-MA0/MA01, 09/10/1992 +ROM_START( tam3340ma0 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "tam_33_40-ma0.bin", 0x10000, 0x10000, CRC(56411a9f) SHA1(a6c80ea531912b758fd5b573d4fa125172cacce7)) +ROM_END + +// Octek Jaguar V rev.1.4 - Chipset: MX83C: MX83C305FC, MX83C306FC +// CPU: AMD 386DX-40, FPU socket provided - OSC: 80.000MHz, 14.31818 +ROM_START( ocjagv ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: MR BIOS (r) V1.40 + ROM_SYSTEM_BIOS(0, "jagvmr14", "Jaguar V MR-BIOS 1.40") + ROMX_LOAD( "bios.bin", 0x10000, 0x10000, CRC(a552d6ad) SHA1(91bae14c3ec7edbc9ef240fec1be17f3582d7ec2), ROM_BIOS(0)) + //1: AMI BIOS// BIOS: AMI 386DX ISA BIOS AA0797325 - BIOS-String: 31-0100-426069-00101111-121291-MXIC-0 MX-DIR_001 + // Keyboard-BIOS: Intel + ROM_SYSTEM_BIOS(1, "jagvami", "Jaguar V AMI BIOS") + ROMX_LOAD( "octek_jaguar_v_ami_bios_isa386dx.bin", 0x10000, 0x10000, CRC(f8d14914) SHA1(14e8ecc4794920dc530fc6bd12ad64494e2544e5), ROM_BIOS(1)) +ROM_END + +// DTK MBA-032Q TK83305-4N-D-03 - Chipset: MACRONIX MX83C305FC, MX83C306FC, HM6818A - BIOS/Version: Award v4.20, MXIC 80386 CACHE SYSTEM, S/N 0089082653 +// BIOS string: 08/07/92-MX83C305/306-113b0000-00 (113B00AC) - Keyboard BIOS: Award, S/N: 008902654 - CPU: i386DX-25, solder pads for 80386, FPU socket provided +// RAM: 8xSIMM39 - OSC: 14.31818M, 80.000MHz - ISA8: 2, ISA16: 6 +ROM_START( mba032q ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "mba-032q.bin", 0x10000, 0x10000, CRC(23481187) SHA1(1b6d0f54ce73853fcdd43588196bb6072b39d068)) +ROM_END + +ROM_START( mx83c305 ) + // 0: AMI BIOS, BIOS-String: 31-0101-009999-00101111-121291-MXIC-0 / 09/02/1992 - Keyboard-BIOS: JETkey V5.0 + // Chipset MX83C05AFC, MX8306AFC - CPU: AMD AM386DX-40, OSC: 14.31818 - ISA8: 1, ISA16: 5 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS( 0, "mxic01", "MXIC #1") + ROMX_LOAD( "mxic.bin", 0x10000, 0x10000, CRC(81853049) SHA1(d855b8d935417cfcfd6580fe3ed4ea393dd49b35), ROM_BIOS(0)) + // 1: BIOS-String: 30-0200-009999-00101111-111192-MXIC-0 / 12/15/1993 + ROM_SYSTEM_BIOS( 1, "mxic02", "MXIC #2") + ROMX_LOAD( "3mxm001.bin", 0x10000, 0x10000, CRC(62fcd52b) SHA1(fa34c27be4627c68fe5c828451d86cbfad0ba358), ROM_BIOS(1)) +ROM_END + + +// ***** 386sx motherboards using the Opti F82C206, Opti 82C283 chipset +ROM_START( op82c283 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: Chipset: Opti F82C206, Opti 82C283 - BIOS: ARMAS AMI 386SX BIOS PLUS 9014775 - Keyboard-BIOS: NEC D80C42C + // BIOS-String: 30-013X-D21185-00001111-031591-OPSX-0 - OSC: 50.000MHz, 14.31818MHz - CPU: AM386 SX/SXL-25 - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS( 0, "armas", "386sx ARMAS" ) + ROMX_LOAD( "386-opti-armas.bin", 0x10000, 0x10000, CRC(d9c696bc) SHA1(467617ab4a211ce460766daa3e5803e190368703), ROM_BIOS(0)) + // 1: 386SX MAIN BOARD REV:A1-1M/N: 3805 - Chipset: OPTi F82C206 / OPTi (unreadable) - BIOS:AMI 386SX BIOS ZZ908380 + // BIOS-String: 30-0100-DG112-00101111-031591-OPSX-0 / A10001B / 128KB RESERVED FOR RAM SHADOW. + // Keyboard-BIOS: AMI KB-BIOS-VER-F (Intel P8942AHP) - CPU: AM386 SX/SXL-25 - OSC: 14.31818MHz, 50.000MHz - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS( 1, "3805", "386sx 3805" ) + ROMX_LOAD( "386sx-opti-908380.bin", 0x10000, 0x10000, CRC(38502567) SHA1(d65d272aa60642197c9b639a8679f8f41c4a697b), ROM_BIOS(1)) + // 2: CPU: 386SX-20 - BIOS: AMI; 03/15/91 - no display - unknown ASI motherboard + // BIOS-String: 30-0100-DG1112-00101111-031591-OPSX + ROM_SYSTEM_BIOS( 2, "c28301", "OPTi 82C283 #1") + ROMX_LOAD( "3opm010.bin", 0x10000, 0x10000, CRC(7c2acf57) SHA1(d40605621da40204dc6370d2d00b783b3a7f8dce), ROM_BIOS(2)) +ROM_END + +// Octek Panther II - Chipset: OPTi 82C283, F82C206L/Chips 82C206 - CPU: 386sx - BIOS: AMI 386sx BIOS - Keyboard-BIOS: Intel/AMI +// BIOS-String: 30-0200-420000-00101111-050591-OPSX-0 / OPSX 386SX PAGE INTERLEAVE BIOS - ISA8: 2, ISA16: 4 +ROM_START( ocpanii ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "octek_panther_ii_386sx.bin", 0x10000, 0x10000, CRC(866192d5) SHA1(fe6133ee3ba0d71c0d4690a0843ca82106effcf6)) +ROM_END + +// RYC Alaris LEOPARD LX REV D - Chipset: Opti 82C283 82C206Q - CPU: 486SLC2 (IBM 14 Q) - ISA16: 7 +// BIOS: AMI 486SLC ISA BIOS AA0735388 - Keyboard-BIOS: Intel/AMI MEGA-KB-H-WP +// BIOS-String: 30-0100-006328-00101111-060692-OPSXPI-0 +ROM_START( alaleolx ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "486-ryc-leopard-lx.bin", 0x10000, 0x10000, CRC(bbc7bfd2) SHA1(49833b482efb8e361be88f48e252621b147a3b1b)) +ROM_END + + +// ***** 386 motherboards using the OPTi 82C381/382 "HiD/386 AT chipset" + +// CPU: 386DX-25 - Chipset: OPTI 82C382 25MHz, 82C381P, 82C206 - BIOS: AMI; 09/15/90 +// BIOS-String: EOX3-6069-083090-K0 +ROM_START( op82c381 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3opm004.bin", 0x10000, 0x10000, CRC(933c2c2b) SHA1(191a1a80c128430a0a461ff9202d27969a715d9d)) +ROM_END + +// Shuttle HOT-304 - Chipset: Opti F82C382, Opti (erased), UMC UM82C206L - OSC: 14.31818MHz, 50.000MHz +// BIOS: AMI, Ser.Nr. 150796 - BIOS-String: 30-0101-DK1343-00001111-050591-OPBC-0 - Keyboard BIOS: AMI Ser.Nr. 209210 - ISA8: 1, ISA16: 6, ISA16/Memory: 1 +ROM_START( hot304 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386-hot-304.bin", 0x10000, 0x10000, CRC(cd4ad4ec) SHA1(50f1b7a15096fff7442d575a47728ba4709b2f39)) +ROM_END + +// Arche Technologies Inc. KMA-300G-25 - Chipset: OPTi 82C381, 82C382, UMC206L - CPU: i386-25, FPU: socket provided - RAM: SIMM30x8, Cache: 8x5C6408-35 +// ISA8: 1, ISA16: 6, ISA16/Memory: 1 - OSC: 50.000MHz, 14.31818 MHz +// BIOS-String: EOPG-3700-040990-K0 +ROM_START( kma300g ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "bios.bin", 0x10000, 0x10000, CRC(3149a4a4) SHA1(6a027ed94568a89a800360119da0c568a2a29e19)) +ROM_END + + +// ***** 386sx motherboards using the OPTi 82C291 chipset + +ROM_START( op82c291 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: MR BIOS (r) V1.43 + ROM_SYSTEM_BIOS(0, "mr", "MR") + ROMX_LOAD( "opti_82c291_mr-bios_v143.bin", 0x10000, 0x10000, CRC(f7989a65) SHA1(cc729b6baac486ac3116f08e78eb58bb39365dd5), ROM_BIOS(0)) + // 1: CPU: 386SX-40 - BIOS: AMI - no display, nine beeps, so probably bad dump + ROM_SYSTEM_BIOS( 1, "ami", "AMI") + ROMX_LOAD( "3opm007.bin", 0x10000, 0x10000, CRC(eed82365) SHA1(45f5a608740d161c5a74415ff3f7b573d7e61f58), ROM_BIOS(1)) + +ROM_END + +// DTK Computer PPM-3333P - Chipset: OPTi 82C291 - Opti F82C206 - ISA16: 6 - CPU: AMD Am386SX/SXL-33, FPU: empty socket - OSC: 14.31818 - 66.0000 MHz +ROM_START( ppm3333p ) + ROM_REGION16_LE(0x20000, "bios", 0) + //0: Award Modular BIOS v4.20 (80386DX) / (119U906X) DTK Computer + ROM_SYSTEM_BIOS(0, "ppmawa", "PPM-3333P Award") + ROMX_LOAD( "386sx_opti291-award.bin", 0x10000, 0x10000, CRC(4855b394) SHA1(94dd1a38852eecac538ef4b8bf04bb7c1e4317d2), ROM_BIOS(0)) + //1: BIOS-String: 30-0200-001107-00001111-121291-OPTX 291-0 / OPTI-291WB BIOS VER 1.2 + ROM_SYSTEM_BIOS(1, "ppmami", "PPM-3333P AMI") + ROMX_LOAD( "386sx_opti291-ami.bin", 0x10000, 0x10000, CRC(35727f8f) SHA1(3fb14cd6ea0d7a2bd545beb1586403cc36a77668), ROM_BIOS(1)) +ROM_END + + +// ***** 386 motherboards using the Opti F82C206, 82C391B, 82C392 chipset + +ROM_START( op82c391 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: CPU: 386DX - Chipset: OPTi 82C391 B2, 82C392 B - BIOS: AMI; 07/07/91; AA 0571504 + // BIOS-String: 30-0100-DK1343-00101111-070791-OPWB3/B-0 + ROM_SYSTEM_BIOS(0, "39101", "82C391 #1") + ROMX_LOAD( "3opm001.bin", 0x10000, 0x10000, CRC(3cb65e60) SHA1(c91deaba1b34008449d6cc2aa94d115c47e0640a), ROM_BIOS(0)) + // 1: BIOS: AMI; 05/05/91; AMI 386C BIOS; #1023992 + ROM_SYSTEM_BIOS(1, "39102", "82C391 #2") // no display, nine beeps + ROMX_LOAD( "3opm005.bin", 0x10000, 0x10000, CRC(ef3dcdde) SHA1(53a8d0af776362d5b92d1cce92d6ca8dbeb33398), ROM_BIOS(1)) + // 2: BIOS: AMI; 07/07/91 - no display + ROM_SYSTEM_BIOS(2, "39103", "82C391 #3") + ROMX_LOAD( "3opm011.bin", 0x10000, 0x10000, CRC(6706c85a) SHA1(70af6de83e59df3d9b74e904fde98d0b9cbdaae9), ROM_BIOS(2)) + // 3: BIOS-String: 30-0100-000000-00101111-070791-OPTi391-0 + ROM_SYSTEM_BIOS(3, "39104", "92C391 #4") + ROMX_LOAD( "3opm12.bin", 0x10000, 0x10000, CRC(fa9592c5) SHA1(f9042163e7e2762e999687c3ec94d576f5b7c499), ROM_BIOS(3)) + // 4: BIOS-String: MR BIOS (tm) V1.30 - RAM Pattern Test Failed at 0F0000H + ROM_SYSTEM_BIOS(4, "mrv130", "MR BIOS V1.30") + ROMX_LOAD( "opti_82c391_386_mr_bios_v130.rom", 0x10000, 0x10000, CRC(458c9405) SHA1(845ea33e4e228aa98d1bd3b0148fa306754e3d78), ROM_BIOS(4)) +ROM_END + +ROM_START( op386wb ) + ROM_REGION32_LE(0x20000, "bios", 0) + // OPTi 386WB VER.1.0 - OSC: 66.6670MHz, 50.000MHz, 14,31818 - ISA8: 1, ISA16: 7 + // BIOS: 1006229 - Keyboard-BIOS: Intel P8942AHP + // 0: BIOS-String: 30-0201-D41107-00101111-050591-OPWB-0 + ROM_SYSTEM_BIOS( 0, "1006229", "1006220") + ROMX_LOAD( "386-opti-386wb-10.bin", 0x10000, 0x10000, CRC(1a5dd6b2) SHA1(9e6b556bfdf21d6f3cba6a05a3092887a71a24a8), ROM_BIOS(0)) + // 1: BIOS-String: 30-0201-D41107-00101111-050591-OPWB-0 + ROM_SYSTEM_BIOS( 1, "d41107", "D41107") + ROMX_LOAD( "ami_d41107.bin", 0x10000, 0x10000, CRC(2b6cc50d) SHA1(69f69e0295abf5e331fdf01dc8e6b1c0c6591992), ROM_BIOS(1)) + +ROM_END + +// Shuttle HOT-307H - BIOS-String: 30-0100-DK1343-00101111-070791-OPWB3/B-0 - CPU: 386DX - Chipset: OPTi 82C391 B2, 82C392 B - BIOS: AMI; 07/07/91; AA 0571504 +ROM_START( hot307h ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3opm001.bin", 0x10000, 0x10000, CRC(3cb65e60) SHA1(c91deaba1b34008449d6cc2aa94d115c47e0640a)) +ROM_END + +// ***** 386 Motherboards using the OPTi495SLC chipset => "qdi" in the 486 BIOS section uses that chipset too + +ROM_START( opti495slc ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Chipset: OPTi 82C495SLC / F82C206, BIOS: AMI 486086 - BIOS-String: 40-040A-001102-00101111-111192-OP495SLC-0 + // Keyboard-BIOS: AMI - CPU: AM386DX-40, FPU socket provided - ISA8: 1, ISA16: 5 - OSC: 14.31818 + ROM_SYSTEM_BIOS(0, "op495slc01", "OP495SLC #1") + ROMX_LOAD( "op495slc01.bin", 0x10000, 0x10000, CRC(0b25044b) SHA1(1b585f0d73ea963dcfbf421325e7da6dd3dd918f), ROM_BIOS(0)) + // 1: BIOS-String: 40-0200-001107-00101111-111192-OP495SLC-0 - OPTI 495SLC 80386 ONLY - BIOS: AMI 386C BIOS 1605865 + // Keyboard-BIOS: AMI 386C BIOS Keyboard ISA8: 1, ISA16: 5 - CPU: AMD AM386DX-40 - OSC: 14.3 + ROM_SYSTEM_BIOS(1, "op495slc02", "OP495SLC #2") + ROMX_LOAD( "op495slc02.bin", 0x10000, 0x10000, CRC(4ff251a2) SHA1(e8655217bd46d50af6b30184bf462376d0e388c6), ROM_BIOS(1)) + // 2: BIOS-String: - Same board exists with an OPTi495XLC chip, possibly from A-Trend + ROM_SYSTEM_BIOS(2, "op495slc03", "OP495SLC #3") // no display + ROMX_LOAD( "486dlc-unknown.bin", 0x10000, 0x10000, CRC(2799e876) SHA1(ce7b421ecb27d915585c1a98bebb17cc5c2463e7), ROM_BIOS(2)) + // 3: 364 Ver. 1.1 - Chipset: OPTi 82C495SLC, F82C206Q - CPU: AMD AM386DX-40 - RAM: 8xSIMM30, Cache: 5x14pin + // ISA8: 1, ISA16: 5 - BIOS: AMI 386C BIOS 1684393 - Keyboard-BIOS: AMI 386C BIOS KEYBOARD 1684393 + // BIOS-String: 40-040A-001107-00101111-111192-OP495SLC-0 / OPTI-495SLC BIOS VER 2.1 + ROM_SYSTEM_BIOS(3, "op495slc04", "OP495SLC #4") + ROMX_LOAD( "386c_mobo-364-v1.1.bin", 0x10000, 0x10000, CRC(826ec2d1) SHA1(cc13e385c6614eb654ee0669f67df51f1e1fa585), ROM_BIOS(3)) +ROM_END + + +// ***** 386 Motherboards using the OPTi495XLC chipset: OPTi 82C495XLC F82C206, BIOS: AMI 386DX BIOS Ser.#:AA2602776, Keyboard-BIOS: Lance LT38C41 - ISA8: 1, ISA16: 5 + +ROM_START( opti495xlc ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-081L-001343-00101111-080893-OP495XLC-F / OPTi495XLC For 386 + ROM_SYSTEM_BIOS(0, "optimini", "OPTi Mini 82C495XLC") + ROMX_LOAD( "386-opti-mini.bio", 0x10000, 0x10000, CRC(04c75e45) SHA1(d5bf92421dda3191c6da12ae2fa31c9ee7a831e1), ROM_BIOS(0) ) + // 1: MR BIOS (r) V1.60 + ROM_SYSTEM_BIOS(1, "mr495xlc", "MR BIOS for OPTi 82C495XLC") // use Hercules + ROMX_LOAD( "mr-3dx94.rom", 0x10000, 0x10000, CRC(6925759c) SHA1(540177fe2c10e20037893c9763b0bf6e35163c9c), ROM_BIOS(1) ) + // 2: possibly from A-Trend (A1742X REV.C 94V-0), exists with an OPTi495SLC chip, see above section, ISA8: 2, ISA16: 4, ISA16/VL: 2 + // BIOS-String: X0-0804-001117-00101111-080893-OP395XLC-0 / OPTI 495XLC 3/486 BIOS VER 5.02_T 94/07/07 + ROM_SYSTEM_BIOS(2, "op82c495xlc", "82C495XLC") // this one could also be listed as a 486 board as it has solder pads and sockets for CPUs from 386 to true 486s + ROMX_LOAD( "at080893.bin", 0x10000, 0x10000, CRC(6b49fdaa) SHA1(5b490d1d1216763ef89688c8e383c46470272005), ROM_BIOS(2) ) + // 3: BIOS: AMI; 08/08/93; AA2740000 - hangs + ROM_SYSTEM_BIOS(3, "mao13", "MAO13 Rev. A") + ROMX_LOAD( "3opm002.bin", 0x10000, 0x10000, CRC(2d9dcbd1) SHA1(d8b0d1411b09767e10e66b455ebc74295bd1b896), ROM_BIOS(3) ) +ROM_END + + +// 386sx motherboards using the SARC (or CYCLONE) RC2016A5 chipset + +// Pine PT-319A rev2.2a - CPU: 386sx - BIOS: AMI; 06/06/92 +// BIOS-String: X0-0100-000000-00101111-060692-386SX-0 / Ver 5.20 +ROM_START( pt319a ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "3sam001.bin", 0x10000, 0x10000, CRC(cad22030) SHA1(85bb6027579a87bfe7ea0f7df3676fdaa64920ac)) +ROM_END + + +// CX Technology, Inc. Model SXD (4x SIMM30, Cache: 64/128/256KB in 2 banks plus TAG, 4x 16-bit ISA) - Chipset: SARC RC2016A5; HM6818P; CX109; LT38C41 © Lance Corp. (keyboard controller?) +// additional info from chukaev.ru54.com: Chipset: CYCLONE RC2016A5 - ISA16: 6 - ROM: CX109 340C3A62D0A - CPU/FPU: Am386SX/SXL-33, 387 +ROM_START( cxsxd ) + ROM_REGION16_LE(0x20000,"bios", 0) + // BIOS-String: 03/25/93-SARC_RC2016A-219v0000 / CX 386SX System + ROM_LOAD( "award_cx-sxd_v4.50.srd.bin", 0x10000, 0x10000, CRC(ef1c74d7) SHA1(b40b1cb7143c4e352798bdf3b488d9342a4029a7)) +ROM_END + +// PC-Chips M396F VER 2.2 - CPU: 386SX, 387SX - ISA16: 6 +ROM_START( pccm396f ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: Chipset: PCCHIPS CHIP2 310, HT6542, HM6818A + // BIOS-String: X0-0100-001437-00101111-060692-M396C-0 - BIOS: AMI 386SX BIOS Ver. 2.10 C-1216 + ROM_SYSTEM_BIOS(0, "chips2", "Chips 2") + ROMX_LOAD( "3pcm003.bin", 0x10000, 0x10000, CRC(b7fc6737) SHA1(670e38b628cb71dc09742f097349ac48ccf28696), ROM_BIOS(0)) + // 1: Chipset: SARC RC2016A5 - CPU: 386SX-40/486SLC, 387SX - BIOS: AMI; 06/06/92 + // BIOS-String: X0-0100-001437-00101111-060692-M396F-0 + ROM_SYSTEM_BIOS(1, "sarc01", "SARC RC2016A5 #1") + ROMX_LOAD( "3sam002.bin", 0x10000, 0x10000, CRC(8d5ef8e8) SHA1(5ca2b36d5bee2870f894984909aa2013b5c4d6cf), ROM_BIOS(1)) + // 2: BIOS-String: X0-0100-001437-00101111-060692-M396F-0 - CPU: 386SX-40 (ALI M1386SX A1P) + ROM_SYSTEM_BIOS(2, "sarc02", "SARC RC2016A5 #2") + ROMX_LOAD( "3sam003.bin", 0x10000, 0x10000, CRC(95ea08d8) SHA1(812e8488ad63ca24250e245a2f0273f1d1703fc3), ROM_BIOS(2)) +ROM_END + + +// ***** 386 motherboards using the SIS Rabbit : 85C310 / 85C320 / 85C330 / 85C206 chipset + +// ASUS ISA-386C - BIOS : AMI 05/05/1991, on a 27C512 type EPROM (64KB) +// BIOS-String : 30-0105-001292-00101111-050591-SISDFC-386 - // ISA8: 2, ISA16:5, ISA16/Memory: 1 +ROM_START( isa386c ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "asus_isa-386c_bios.bin", 0x10000, 0x10000, CRC(55e6d1bb) SHA1(e1ac490a30f63b6e4d6d9d0fbaea3d132b8ff053)) +ROM_END + +// Chaintech 333SC - Chipset: UMC UM82C206L, three smaller SiS chips (unreadable, probably SiS Rabbit) +// CPU/FPU present - BIOS: AMI 386 BIOS - Keyboard-BIOS: AMI +// BIOS-String: ESIS-1128-040990-K0 - ISA8: 2, ISA16: 6 - OSC: 14.31818, 66.000MHz +ROM_START( chn333sc ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "bios.bin", 0x10000, 0x10000, CRC(f8b2b0bc) SHA1(2799cce621b93bf38b04deeb419d25a73f7416f4)) +ROM_END + +// Octek Jaguar II - Chipset: SiS 85C330, 85C320, 85C206, 85C310 - CPU: i386-33, FPU: i387-33 - RAM: 8xSIMM30, Cache: 8xIS61C64-25N +// BIOS: AMI - Keyboard-BIOS: AMI KB-BIOS-VER-F - ISA8: 2, ISA16: 5, ISA16/Memory: 1 - OSC: 66.000MHz, 14.31818 +// BIOS-String: 30-0100-006069-00101111-020291-SISC / 0033P-002 +ROM_START( ocjagii ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ami_386_zz457511.bin", 0x10000, 0x10000, CRC(b5bc6a9a) SHA1(b74f592dd3bcd2978ed7d895d483f83413e0f8d5)) +ROM_END + + +ROM_START( sisrabb ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 30-0000-D01128-00101111-070791-SISD-0 + ROM_SYSTEM_BIOS(0, "3sim001", "3sim001") + ROMX_LOAD( "3sim001.bin", 0x10000, 0x10000, CRC(2982f552) SHA1(f1849c207d8c802faaf8ef628f88b28256e7fb31), ROM_BIOS(0)) + // 1: PLATO TECHNOLOGY CO., LTD. - Chipset: SiS 'rabbit': SIS 85C320, 85C330, 85C310, 85C206 - CPU: Intel 80386DX-33, FPU: i387DX-33 + // RAM: 16xSIMM30, Cache: 8xKM688B65P-25, 2xQS8888-25P - BIOS: AMI 386 BIOS Ser# Z403736 - Keyboard BIOS: AMI - BIOS-String: ESIS-1393-040990-K0 / SIS-B 386 BIOS + // OSC: 50.000MHz, 66.0000MHz, 14.31818MHz - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS(1, "plato", "Plato") + ROMX_LOAD( "386-sis-z403736.bin", 0x10000, 0x10000, CRC(8230f4c1) SHA1(952de1e16efe7e3a7514b68ea251b88192de3ac8), ROM_BIOS(1)) +ROM_END + + +// ***** 386 Motherboards using the Symphony SL82C362 SL82C461 SL82C465 chipset + +// FIC 386 SC Rev A2 - Chipset: Symphony SL82C461, SL82C465, SL82C362 +ROM_START( 386sc ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS: AMI 386 BIOS Ser.#: ZZ006975, BIOS-String: 30-0200-DF1211-00101111-042591-SYMP-0 / 386DX BIOS for SYMLABS SL82C360 - Keyboard-BIOS: AMI #Z357365 + // CPU: unreadable, FPU: Cyrix 387DX-25 - OSC: 40.000MHz, 14.31818 - ISA8: 1, ISA16: 7 + ROM_SYSTEM_BIOS(0, "386sc1", "386SC #1") + ROMX_LOAD( "386_sc_symphony.bin", 0x10000, 0x10000, CRC(fabe369c) SHA1(211ff63dd874c273135d1427db3562d752c2bade), ROM_BIOS(0)) + // 1: ID: FIC 386SC REV A2 MBZ86418 - CPU: AMD 386DX/DXL-40, FPU socket provided - RAM: 8xSIMM30, Cache: 512KB + // BIOS Version: AMI 386DX BIOS - ZZ000294 - BIOS String: 30-0200-ZZ1121-00101111-042591-SYMP-0 - 386DX BIOS FOR SYMLABS SL86C360 - ISA8: 1, ISA16: 7 - OSC: 14.31818, 80.000MHz + ROM_SYSTEM_BIOS(1, "386sc2", "386SC #2") + ROMX_LOAD("fic386sc.bio", 0x10000, 0x10000, CRC(6154adb7) SHA1(96c495d9a9975e1af9b42384712e609e3ffcff4e), ROM_BIOS(1)) +ROM_END + +ROM_START( 386sc2c ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 20-0200-DF1121-00101111-102591-SYM_386B-0 / 386DX/SX (S1A.P) + ROM_SYSTEM_BIOS(0, "s1a", "S1A.P") // Chipset: SYMPHONY SL82C362, SL82C461, SL82C465 + ROMX_LOAD( "386-sc-2c_ami_za492668.bin", 0x10000, 0x10000, CRC(b408eeb7) SHA1(cf1974492119e1aae623fa366d5760343e827e52), ROM_BIOS(0)) + // 1: BIOS-String: 20-0200-DF1121-00001111-102591-SYM_386B-0 / 386SX/DX (S1B) + ROM_SYSTEM_BIOS(1, "s1b", "S1B") // also on FIC 386-SC-HG + ROMX_LOAD( "ami_386_za590821.bin", 0x10000, 0x10000, CRC(51a4c231) SHA1(4ad65408f2a401ff262934f886937a2615c08e21), ROM_BIOS(1)) +ROM_END + +// FIC 386-SC-HG - Chipset: SYMPHONY SL82C362, SL82C461, SL82C465 - CPU: AMD Am386DX/DXL-40, FPU socket provided - BIOS: AMI 386 BIOS ZA977287 +// Keyboard BIOS: Intel/AMI - RAM: 8xSIMM30 - ISA16: 6 - OSC: 80.000MHz +ROM_START( 386schg ) // BIOS-String: 20-0200-DF1121-00101111-102591-SYM_386B-0 / 386DX/SX(S1B) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386-za877287-386-sc-hg.bin", 0x10000, 0x10000, CRC(fcaa06c0) SHA1(5ce6258a26311cec46e51cb16bcb66e9c68d16b2)) +ROM_END + +// Peacock P386DX-40 REV: 1.0 - Chipset: Symphony SL82C461, SL82C362, SL82C465, DS1287 - CPU: AMD Am386DX-40, FPU: IIT 3C87-40 - RAM: 8xSIMM30, Cache: 4xW4256AK-20, 1xTC5588P-20 +// BIOS: AMI 386 BIOS #ZA22147 - OSC: 80.000MHz, 14.31818, 24.000 - on board: IDE, Floppy - ISA16: 6 +ROM_START( p386dx40 ) // BIOS-String: 30-0200-DF1121-00101111-070791-SYM_AUTO-0 / Peacock 386 DX Ver. 1.0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386_peacock-p386dx-40-za224147.bin", 0x10000, 0x10000, CRC(f97562cf) SHA1(354b6ffd345c9f50beca0f836b0d4a92df1e7c48)) +ROM_END + + +// ***** 386 Motherboards using the UM82C491F chipset + +ROM_START( um82c491f ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: TAM/33/40-U2 - BIOS: AMI S/NO. OA 242412 - BIOS-String: 40-0102-001105-00101111-040493-UMC491F-0 / TAM/33,40-U2, 08/11/1993 + // ISA8: 1, ISA16: 5 - OSC: 80.000MHz, 14.31818 + ROM_SYSTEM_BIOS(0, "tam3340u2", "TAM/33/40-U2") + ROMX_LOAD( "tam_umc491f.bin", 0x10000, 0x10000, CRC(718890d5) SHA1(52336cfc7cd0f0f51799c999cefcfed2b2942211), ROM_BIOS(0)) + // 1: Board is only marked "rev.0.3, looks like 386GRN - CPU: AMD AM386DX-40 - OSC: 14.31818 - ISA8: 1, ISA16: 5 + // Chipset: UMC UM82C491F - BIOS-String: 08/30/93-UMC-491-214X2000-OO - BIOS: Award 386 D2026361 - Keyboard BIOS: JETkey V3.0 + // additional info from chukaev.ru54.com: REV:0.4 board has JETkey V5.0 keyboard BIOS, uses same motherboard BIOS + ROM_SYSTEM_BIOS( 1, "386grn", "386GRN-like board rev.03") + ROMX_LOAD( "386dx40-27c512.bin", 0x10000, 0x10000, CRC(692a4d52) SHA1(7970a05586eacfe4bfdc575b17bbbfb7ff1c86b0), ROM_BIOS(1)) + // 2: BIOS: AMI; 04/04/93 - CPU: 386DX-40 - BIOS-String: 40-0102-001277-00101111-040493-UMC491F-0 + ROM_SYSTEM_BIOS( 2, "491f01", "UM82C491F #1") + ROMX_LOAD( "3umm005.bin", 0x10000, 0x10000, CRC(032e78f2) SHA1(5271c4362284ec87840b3fb23542506a72a328c2), ROM_BIOS(2)) + // 3: BIOS-String: 08/30/93-UMC-491-214X2000-OO / CACHE 386/486 SYSTEM BIOS + ROM_SYSTEM_BIOS( 3, "491f02", "UM82C491F #2") + ROMX_LOAD( "3umw007.bin", 0x10000, 0x10000, CRC(d82c9bef) SHA1(36e8d1c7629642cbcc337721eef1c73f1f0ed92c), ROM_BIOS(3)) +ROM_END + + +// ***** 386 Motherboards using the UMC UM82C493F/UM82C491F chipset or badge engineered varieties (BIOTEQ) + + // BIOS-String: 40-0100-001494-00101111-080893-UMC491F-0 / 11/26/93 - CPU: TX486DLC/E-40GA, IIT 4C87DLC-40 - ISA8: 1, ISA16: 5 - BIOS: AMI; 208808; 08/08/93 +ROM_START( um82c493f ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS( 0, "493f01", "UM82C493F #1" ) + ROMX_LOAD( "3umm007.bin", 0x10000, 0x10000, CRC(8116555a) SHA1(8f056a83de60373ed26026a226eead19868abeca), ROM_BIOS(0)) +ROM_END + +// 0: 386-4N-D04A +ROM_START( 4nd04a ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 40-0102-428003-00101111-080893-UMC491F-0 - UMC 4913 386 IVN 1.0 1993.12.22 + // Chipset: UMC UM82C493F, UM82C491F + ROM_SYSTEM_BIOS( 0, "ivn10", "386-4N-D04A IVN 1.0" ) + ROMX_LOAD( "386-4n-d04a.bin", 0x10000, 0x10000, CRC(cf386b9c) SHA1(6fd4303e4f0d2ed75d4e7f36dc855037b1779e64), ROM_BIOS(0)) + // 1: 386-4N-D04A PCB V2.0 - BIOS-String: 40-0103-428003-00101111-080893-UMC491F-0 / UMC 4913 386 IVN 1.1 1994.1.31 + ROM_SYSTEM_BIOS( 1, "ivn11", "386-4N-D04A IVN 1.1" ) + ROMX_LOAD( "3umm006.bin", 0x10000, 0x10000, CRC(4056104d) SHA1(5e639e6766dc9a19296358e9a64a76ad57fc733a), ROM_BIOS(1)) + // 2: TK-82C491/493/386-4N-D04 - BIOS-String: (2c4x2u01) U-BOARD / 11/09/93-UMC-491-2C4X2U01-00 - ISA8: 1, ISA16: 5 + ROM_SYSTEM_BIOS( 2, "awa110993", "AWARD 11/09/93") // BIOS: Award; 386 BIOS; A3384454 + ROMX_LOAD( "3umw002.bin", 0x10000, 0x10000, CRC(2c510e81) SHA1(a12c672ec418cc4cd14482901f8ba34c50f319f5), ROM_BIOS(2)) + // 3: TK-82C491/493/386-4N-D04 - BIOS-String: 01/14/94-UMC-491-2C4X2U01-00 / U-BOARD + ROM_SYSTEM_BIOS( 3, "awa011494", "AWARD 01/14/94") + ROMX_LOAD( "3umw003.bin", 0x10000, 0x10000, CRC(64067839) SHA1(4ae3462619ef8da67f74d85ee7ab44bdb49a5728), ROM_BIOS(3)) +ROM_END + +// Biostar MB-1333/40PMB-CH, rev B.3 - Chipset: "Bioteq" [Atmel] AT40391, "Bioteq" G392 [Atmel AT40392], C&T P82C206 +// BIOS: AMI 386 BIOS PLUS - Keyboard-BIOS: AMI - CPU: AM386-DX40 - OSC: 14.31818, +ROM_START( mb133340 ) + ROM_REGION32_LE(0x20000, "bios", 0) // the OPWB3 string also exists in the BIOS versions meant for the OPTI 82C391/392 chipsets + // 0: BIOS-String: 30-0100-D61223-00101111-050591-OPWB3/B-0 / MB-1340PMA-CH, MB-1340PMB-CH, MB-1340PMD-CH, MB-1340PME-CH for B version.. + ROM_SYSTEM_BIOS(0, "opwb3b", "MB-1333/40PMB-CH OPWB3-B") + ROMX_LOAD( "opwb3b.bin", 0x10000, 0x10000, CRC(c9cf46dd) SHA1(c9e58cb6fed770d92892672d0a910d448c507ac1), ROM_BIOS(0)) + // 1: BIOS-String: 30-0201-D61223-00101111-050591-OPWB-0 / MB-1333PMA-CH, MB-1333PMB-CH, MB-1333PMD-CH, MB-1333PME-CH + ROM_SYSTEM_BIOS(1, "opwb", "MB-1333/40PMB-CH OPWB") + ROMX_LOAD( "opwb.bin", 0x10000, 0x10000, CRC(9532c6d1) SHA1(48e889ed61921643147fea95224bcf42bb6e82fa), ROM_BIOS(1)) + // 2: BIOS-String: 40-0100-001223-00101111-040493-UMC491F-0 / MB-1333/40UCG-A, MB-1333/40UCG-B / MB-1433-40UDV-A, MB-1433/50UCV-C, MB6433/50UPC-A for EXT. RTC + ROM_SYSTEM_BIOS( 2, "m21", "M21" ) + ROMX_LOAD( "3bim001.bin", 0x10000, 0x10000, CRC(9ea0ce67) SHA1(cb55a61cd43705a54e4109d816924c8820f78ae5), ROM_BIOS(2)) +ROM_END + + +// ***** 386 motherboards using the UMC UM82C481AF, UM82C482A/B/F, 82C206F chipset + +// QD-U386DX VER 1.0 - CPU/FPU: i386DX-33, IIT 3C87-33 - ISA8:2, ISA16: 5 - BIOS: AMI 386DX ISA BIOS (AA0119183) +// BIOS-String: 30-0200-428003-10101111-070791-UMC480A-F +ROM_START( qdu386dx ) // three short beeps (base 64k RAM failure) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3umm001.bin", 0x10000, 0x10000, CRC(5b6a7d0b) SHA1(02696eaaa5dd21fe4b3b39629aa926ae87a9a2bd)) +ROM_END + +// ASUS ISA-386U30 REV.2.2 - Chipset: UMC UM82C481AF, UM82C482AF, 82C206F - CPU: AM386DX-40 - OSC: 14.31818MHz, 32.000MHz - ISA8: 1, ISA16: 6 +// BIOS: AMI 386DX BIOS AA0974582 - BIOS-String: - Keyboard-BIOS: AMI U2518640 MEGA-KB-F-WP +ROM_START( isa386u30 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "386-isa-386u30.bin", 0x10000, 0x10000, CRC(6d45a044) SHA1(63c06568f9db5ce12dc8dd0fb1ad1009a9fb24f6)) +ROM_END + +// Chicony CH-486-33C REV 1.0 - Chipset: UMC UM82C481, UM82C482, Chips P82C206 - CPU: Intel Overdrive DX2ODPR66, FPU socket provided +// RAM: 16xSIMM30, Cache: 8xW24256AK-25, P4C188-20PC - BIOS: AMI - Keyboard-BIOS: Intel/AMI +// BIOS-String: 40-0300-ZZ1116-00101111-031591-UMCWB-F - OSC: 33.000MHz - ISA8: 2, ISA16: 5 +ROM_START( ch48633c ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ch-486-33c_ami_bios_z944944_am27.bin", 0x10000, 0x10000, CRC(1ca9bf11) SHA1(bb5fb4c7544e2ccb06d423ef4da0729a6bf8b231)) +ROM_END + +// Elitegroup FX-3000 REV:1.0 - Chipset: UMC UM82C481BF, UM82C482AF, UM82C206F - ISA16: 6 +ROM_START( ecsfx3000 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0100-001131-00101111-121291-UMCAUTO-0 / FX3000 V1.3 12-17-92 - Keyboard BIOS: AMI/Intel - BIOS: FX3000-014 - CPU: AM386DX-40 + ROM_SYSTEM_BIOS(0, "v13", "V1.3") + ROMX_LOAD( "fx-3000-bios.bin", 0x10000, 0x10000, CRC(f93c9563) SHA1(46a71e7fbc9238dd470d6d5ce3bc1e057f3aae24), ROM_BIOS(0)) + // 1: BIOS-String: 30-0500-D01131-00101111-070791-UMCWB-0 / FE386 V1.1 12-03-92 - Keyboard-BIOS: Lance LT38C41 - BIOS: AMI-1131 / S/NO. E-92488183 / FE 386-012 - CPU: Cyrix 486DLC-33GP FPU: Cyrix Cx87DLC-33QP - OSC: 66.667MHz, 14.31818 + ROM_SYSTEM_BIOS(1, "v11", "V1.1") + ROMX_LOAD( "486-fx3000.bin", 0x10000, 0x10000, CRC(af303f08) SHA1(65dfa2541d2b08746f91012a2ae0121636402aac), ROM_BIOS(1)) +ROM_END + +ROM_START( um82c481af ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0100-001266-00101111-121291-UMCAUTO-0 - 3DIUD-1.2 + // Chipset: // UMC UM92C206F, UM82C482AF, UM82C481BF - MB manufacturer according to BIOS is Modula Tech Co + // ISA8: 1, ISA16: 6 - RAM: 8xSIMM30, Cache: 9x28pin, used: 4xIS61C256AH-20N, 1xW2465AK-20, CPU: AMD 386DX-40 + // CPU and FPU sockets provided - BIOS: AMI 386 BIOS, Keyboard-BIOS: AMI + ROM_SYSTEM_BIOS(0, "3diud", "386 UMC 3DIUD") + ROMX_LOAD( "386-umc-3flud.bin", 0x10000, 0x10000, CRC(2e795a01) SHA1(02e9e2871c1c1a542f44ab5eef66aee4b04225c1), ROM_BIOS(0)) + // 1: BIOS: Microid Research; 02/26/93 - BIOS-String: MR BIOS (r) V1.44 + ROM_SYSTEM_BIOS(1, "mr1441", "MR BIOS V1.44 #1") // resets continuously + ROMX_LOAD( "3umr001.bin", 0x10000, 0x10000, CRC(466a115e) SHA1(077d797c653528062f1c87b03c608427c35c5505), ROM_BIOS(1)) + // 2: BIOS : MR 386DX/86DLC BIOS V.1.44 - Keyboard BIOS: JETkey V3.0 - CPU: TI 486DLC-40BGA, FPU: IIT 4C87DLC-40 - RAM: 8xSIMM30, Cache + // OSC: 14.31818, 80.000MHz - ISA8: 1, ISA16: 6 + ROM_SYSTEM_BIOS(2, "mr1442", "MR BIOS V1.44 #2") // resets continuously + ROMX_LOAD( "um82481m.bin", 0x10000, 0x10000, CRC(f617e1ce) SHA1(73ee80cb9f50547f26adbe0bfd2435b01728dd09), ROM_BIOS(2)) +ROM_END + + +//************************************************************************** +// 80386 SX and DX Desktop +//************************************************************************** + +// Schneider 386SX VGA System 40 (the number indicates the size of the harddisk, there were System 70 as well) - uses the same case as the Schneider Tower AT +// Schneider Tower VGA I/O: Chipset: WD37C65BJM, BIGJIM 50773 1108-0056, two other bigger chips can't be read on the photos +// 104 pin CPU card connector (ISA without the key), 4xISA16, 1xISA8 - on board: IDE, parallel, serial, bus mouse (Atari compatible), VGA, internal floppy (26pin), external floppy (DB25) +// On board graphics: ATI VGA Wonder-16 (256KB), ATI18800-1 1138-0069 +// CPU card: CPU: Intel NG680386SX-16 (C-Step), FPU socket provided - Chipset: DDA14-075E, Chips P82C812, P82C811, P82C206, P82C215-12 (16MHz) - RAM: 8xSIMM30 +// OSC: 20.000, 14.31818, 24.000000MHz, 32.000000MHz, - keyboard +// beeps 1-2-4 +ROM_START( tower386sx ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "v103", "V1.03") // from a 386SX System 70 + ROMX_LOAD("t386s103.bin", 0x10000, 0x10000, CRC(d4e177e6) SHA1(fa11d49d629cdcac4467a9deedd25171ae499346), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v100", "V1.00") // from a 386SX System 40 + ROMX_LOAD("schneider_ag_386sx_bios_1_version_1.00a_id.nr.52504.u16", 0x10000, 0x8000, CRC(2fec2d3a) SHA1(4227da07f6652b89b9d02d7570ad0476672fd80d), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("schneider_ag_386sx_bios_0_version_1.00a_id.nr.52504.u15", 0x10001, 0x8000, CRC(b3331429) SHA1(b214bccfb62add9caea3d734885bc945b868967a), ROM_SKIP(1) |ROM_BIOS(1)) + + // models upgraded to 512KB video memory were sold as "CEG" models as the memory upgrade enabled some sort of antialiasing ("continuous edge graphics") + // in a 256 color mode with a choice from 792.096 colors. + // according to https://archive.org/stream/byte-magazine-1991-01/1991_01_BYTE_16-01_1990_BYTE_Award_of_Excellence#page/n197/mode/2up this needs an EDSUN D/A chip, it is unknown + // if it's contained on the platter or on the graphics upgrade piggyback card + // The 12.5MHz version of the towerat2xx (VGA Tower System 40 or 70) used the same I/O backplane and were also offered with the CEG upgrade. + ROM_REGION16_LE(0x10000, "vga", 0) + ROM_LOAD16_BYTE("schneider_ag_vga_bios_low_v1.00_id.nr_51368.u13", 0x0000, 0x8000, CRC(ec4ef170) SHA1(0049ae5eab1a21838e674cf77e88994b954b1da3)) + ROM_LOAD16_BYTE("schneider_ag_vga_bios_high_v1.00_id.nr_51368.u14", 0x0001, 0x8000, CRC(5354962a) SHA1(11a503473e2011f323cc81c0b63d24f231c54c31)) +ROM_END + +// Atari PC 5 - American Megatrends 386XT Series-4 motherboard - on board EGA +// screen remains blank, 1 beep repeated (DRAM refresh failure) +ROM_START( ataripc5 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD32_BYTE("ami_pc5_1.00_rom0.bin", 0x00000, 0x8000, CRC(496149a6) SHA1(81033b22af830af8306abfde03a194739fe54355)) + ROM_LOAD32_BYTE("ami_pc5_1.00_rom1.bin", 0x00001, 0x8000, CRC(3c82fe66) SHA1(dd6c2c3c3635761b1d928912269b8937cbdc09ae)) + ROM_LOAD32_BYTE("ami_pc5_1.00_rom2.bin", 0x00002, 0x8000, CRC(7dc5b53b) SHA1(33e138baa84a8acc629bde5a6b54e47d0d4508f1)) + ROM_LOAD32_BYTE("ami_pc5_1.00_rom3.bin", 0x00003, 0x8000, CRC(b588b7a8) SHA1(2f2597b14e54d03cf957cce47536266f68d3aa66)) +ROM_END + +// Datavan Book-Size LAN Station - CPU: Am386SX/SXL-25 - Chipset: Headland HT18/C, RAM: 4xSIMM30 +// BIOS: AMI 386SX BIOS PLUS S/NO. 232659 - Keyboard-BIOS: AMI KEYBOARD BIOS PLUS S/NO. 232659 +// BIOS-String: 30-0100-ZZ1612-00101111-070791-HT18-F - ISA16: 1, used for LAN board - on board: 2xser, par, VGA +// Video: Realtek RTG3106 VGA, 1024K, MUSIC TR9C1710-66PCA - VGA BIOS: REALTEK / QUADTEL +// Mass storage: NEC FD1138H, Quantum ProDrive ELS 977/10/17 - unknown DP8390DN based 8bit ISA LAN card +ROM_START( dvbslan ) // 3 short beeps => base memory read/write test error in the first 64 KB block of memory + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD( "ami_bios_386sx_bios_plus.bin", 0x10000, 0x10000, CRC(760afd89) SHA1(452f3e1b8b3b3d00df90c3501c8796de447a2184)) + + ROM_REGION( 0x8000, "vga", 0) // REALTEK VGA BIOS + ROM_LOAD( "realtek_vga.bin", 0x0000, 0x8000, CRC(4e416975) SHA1(826b7ec5494dc83cfcf25922185777bf6db46949)) + + ROM_REGION( 0x2000, "lan", 0) // boot ROM from DP8390DN based LAN adapter + ROM_LOAD( "net_isa_boot.bin", 0x0000, 0x2000, CRC(5bb527fd) SHA1(1eb7c82ef99d64eedffc3ac9c145d33b06cd8cb6)) +ROM_END + +// Epson PC AX3 - see epsax +ROM_START( epsax3 ) + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD16_BYTE( "evax3.bin", 0x10000, 0x8000, CRC(fec03cdc) SHA1(549027e6b786fa98a14912c1fb6d44c607206253)) + ROM_LOAD16_BYTE( "odax3.bin", 0x10001, 0x8000, CRC(0162d959) SHA1(f17741282e078a66e38d82ca48455b17c54e832f)) +ROM_END + + +//************************************************************************** +// 80386 SX and DX Laptop/Notebook +//************************************************************************** + +// Toshiba T3200SXC - CPU: 80386sx-20 - Floppy - 120 MB Hard disk - 1 MB RAM on board, 4 MB extra memory already installed. Can be upgraded to a total of 13 MB. +// TFT Display, 640x480, 256 colors - WD 90C21 video chip, 256 KB RAM - ISA8: 1, ISA16: 1 +ROM_START( tot3200sxc ) // KBC ERROR + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD( "012c_t3200sxc_tc57h1024d-85.bin", 0x00000, 0x20000, CRC(5804a3da) SHA1(922dfb35b134a91a4c39e443597dad6798ce69d9)) +ROM_END + +// Sanyo MBC-18NB notebook - no display +ROM_START( mbc18nb ) + ROM_REGION16_LE( 0x20000, "bios", 0) + ROM_LOAD( "sanyo_18nb.bin", 0x00000, 0x20000, CRC(64e283cf) SHA1(85ce4074c23b388d66e53cc83a8535bf7a2daf1f)) +ROM_END + +// Siemens-Nixdorf PCD-3Nsx notebook +// CPU: Intel NG680386SX-16 or -20 - 1MB RAM,upgradeable to 5MB, 40MB harddisk (-16 model) +// 2MB, upgradeable to 8MB, 80MB harddisk (-20 model), 9" mono VGA LCD, 1.44MB floppy drive +// Chipset: Headland HT21/E, , DP8473V, CHIPS F82C601, DS??87, unknown QFP100, ADC0833BCN (on PCU sub), CL-GD610-320C-C+CL-GD620-C +// Microcontrollers: N8042AH (KBC), N80C51RH (KBE) +// OSC: 14.318, 32.00024.0090 +ROM_START( pcd3nsx ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "337-7_2400_3f_10-15-91.bin", 0x00000, 0x20000, CRC(99befce7) SHA1(150cd6a1476ca0ea970a1103b2a2c668c984433a) ) + + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD("33b_pcu_rev_3r.bin", 0x0000, 0x1000, CRC(d99308ec) SHA1(26621db2db37ab2bd1da972abb7398f9514329b2) ) + + ROM_REGION( 0x800, "kbc", 0 ) + ROM_LOAD("kbc_c3f.bin", 0x000, 0x800, NO_DUMP) + + ROM_REGION( 0x1000, "kbe", 0 ) + ROM_LOAD("kbe_e3d.bin", 0x0000, 0x1000, NO_DUMP) +ROM_END + +// Siemens-Nixdorf PCD-3Nsl - CPU: 80386SL@25MHz - 2MB RAM, upgradeable to 8MB - 85MB harddisk - 10" mono LCD VGA +// 1.44MB floppy drive +ROM_START( pcd3nsl ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - failure at 100000-10FFFF - Resume memory backup failure + ROM_SYSTEM_BIOS(0, "05-13-93", "05/13/93") + ROMX_LOAD( "3n102l30.bin", 0x00000, 0x20000, CRC(02384c19) SHA1(552dc41b40272027e2b031187f8ab1e1513751b9), ROM_BIOS(0) ) + // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - Memory high address failure at 100000-10FFFF - Resume memory backup failure + ROM_SYSTEM_BIOS(1, "01-26-94", "01/26/94") + ROMX_LOAD( "3n120l40.bin", 0x00000, 0x20000, CRC(1336dd75) SHA1(80306d85f417c51a5235ac2f02ceb58bdb51205f), ROM_BIOS(1) ) +ROM_END + + +// Toshiba T2000SX +// 1MB RAM on board, up to 9MB with 2MB, 4MB or 8MB expansion cards - 16 level grayscale VGA 640x480 display, PVGA1F display controller, 256KB VRAM +// Super integration (SI), components: DMAC 82C37Ax2, PIC 82C59Ax2, PIT 82C54, FDC TC8565, SIO TC8570 - 80C42 and 80C50 for keyboard - RTC 146818AF +// 128KB ROM, 32KB Backup RAM - GA-SYS CNT System control gate array - GA-IO CNT I/O gate array +ROM_START( t2000sx ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "014d.ic9", 0x00000, 0x20000, CRC(e9010b02) SHA1(75688fc8e222640fa22bcc90343c6966fe0da87f)) +ROM_END + + +// Triumph-Adler Walkstation 386 SX - German version of the Olivetti S20 +// VLSI VL82C320 + VL82C331; DP8473V +ROM_START( walk386sx ) + ROM_REGION16_LE( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS + ROM_LOAD( "cthj01_1014.bin", 0x00000, 0x20000, CRC(805084b9) SHA1(a92d78050844ccbcce53109c42603639aedd2335) ) + + ROM_REGION( 0x2000, "mcu", 0 ) // MC68HC805B6FN + ROM_LOAD( "cthj02_08_76.bin", 0x0000, 0x2000, NO_DUMP ) + + ROM_REGION( 0x1000, "cop888", 0 ) // COPCL888-RDT/V + ROM_LOAD( "s9124ab_c4_e904-34162_00.bin", 0x0000, 0x1000, NO_DUMP ) +ROM_END + +// Triumph-Adler Walkstation 386DX - German version of the Olivetti D33 +// VLSI TOPCAT chipset: VL82C330 + VL82C331 + VL82C332 + VL82C106; Austek A38202C; DP8473V +// Video board: Cirrus Logic CL-GD610 + CL-GD620 + CL-GD63 +ROM_START( walk386dx ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS + ROM_LOAD( "am28f010_ctaa060125rc.bin", 0x00000, 0x20000, CRC(6cc540fe) SHA1(9853793d5433bbc5efc09c7f31c4a8a8f78d4549) ) + + ROM_REGION( 0x2000, "mcu", 0 ) + ROM_LOAD( "cthj02_03_76.bin", 0x0000, 0x2000, NO_DUMP ) +ROM_END + +// Siemens PG 750 - Luggable programmer ("Programmiergerät") for the Siemens S5 automation systems, a 486 EISA version exists as well +// Chipset: CHIPS P82C302, P82C301C, P82C206, four more "CHIPS" ICs +// ISA16: 7 +// on board: V24/Mouse, V24/Modem, Printer +ROM_START( pg750 ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + // 0: Phoenix 80386 ROM BIOS PLUS Version 1.10 14 / SIEMENS PG-750 + // Time-of-day clock stopped + // EGA/TIGA Graphics System "Highgraph II" + ROM_DEFAULT_BIOS("v402") + ROM_SYSTEM_BIOS(0, "v40", "v40") + ROMX_LOAD( "pg750_4.0_386_l.bin", 0x10000, 0x8000, CRC(1e6dcd40) SHA1(2def9f729f43652a7b8b32a42e4c073f580d39ce), ROM_SKIP(1)|ROM_BIOS(0) ) + ROMX_LOAD( "pg750_4.0_386_h.bin", 0x10001, 0x8000, CRC(389c20dd) SHA1(eb0e86ba88ac9742868689b2aac9911ed7acac74), ROM_SKIP(1)|ROM_BIOS(0) ) + // 1: Phoenix 80386 ROM BIOS PLUS Version 1.10 17 / SIEMENS PG-750/730 + // Time-of-day clock stopped + ROM_SYSTEM_BIOS(1, "v402", "v402") + ROMX_LOAD( "pg750_4.02_386_l.bin", 0x10000, 0x8000, CRC(208aac51) SHA1(49d50b7ade8f56bda203375a9b138adf2cb5e500), ROM_SKIP(1)|ROM_BIOS(1) ) + ROMX_LOAD( "pg750_4.02_386_h.bin", 0x10001, 0x8000, CRC(c6e14fb6) SHA1(dad6ab5c5a18341ec0dce53fe712b8367340506b), ROM_SKIP(1)|ROM_BIOS(1) ) +ROM_END + +//************************************************************************** +// 80486 BIOS +// +// BIOS files that show "original.tmp" near the beginning are compressed +// and can be unpacked using, e.g., 7-ZIP. +//************************************************************************** + +ROM_START( at486 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 30-0500-ZZ1130-00101111-070791-1219-0 /PAI JUNG ELECTRONIC IND. CO., LTD. + ROM_SYSTEM_BIOS(0, "at486", "PC/AT 486") + ROMX_LOAD( "at486.bin", 0x10000, 0x10000, CRC(31214616) SHA1(51b41fa44d92151025fc9ad06e518e906935e689), ROM_BIOS(0)) + // 1: BIOS-String: 40-0100-009999-11101111-070791-UMC480A-0 / United Microelectronics Corporation (UMC) MG-48602 + ROM_SYSTEM_BIOS(1, "mg48602", "UMC MG-48602") + ROMX_LOAD( "mg48602.bin", 0x10000, 0x10000, CRC(45797823) SHA1(a5fab258aecabde615e1e97af5911d6cf9938c11), ROM_BIOS(1)) + // 2: BIOS-String: 40-0000-001470-00101111-060692-SIS3486-0 / 24X-VS-XX-B + ROM_SYSTEM_BIOS(2, "ft01232", "Free Tech 01-232") + ROMX_LOAD( "ft01232.bin", 0x10000, 0x10000, CRC(30efaf92) SHA1(665c8ef05ca052dcc06bb473c9539546bfef1e86), ROM_BIOS(2)) + + /* 486 boards from FIC + naming convention + xxxxx101 --> for EPROM + xxxxx701 --> for EEPROM using a Flash Utility v5.02 + xxxxBxxx --> NS 311/312 IO Core Logic + xxxxCxxx --> NS 332 IO Core Logic + xxxxGxxx --> Winbond W83787F IO Core Logic + xxxxJxxx --> Winbond W83877F IO Core Logic + */ + // 3: BIOS-String: 06/16/97-VT82C486A-214L2000-00 / Version 3.276GN1 + /* this is the year 2000 beta bios from FIC, supports GIO-VT, GAC-V, GAC-2, VIP-IO, VIO-VP and GVT-2 */ + ROM_SYSTEM_BIOS(3, "ficy2k", "FIC 486 3.276GN1") /* includes CL-GD5429 VGA BIOS 1.00a */ + ROMX_LOAD( "3276gn1.bin", 0x00000, 0x20000, CRC(d4ff0cc4) SHA1(567b6bdbc9bff306c8c955f275e01ae4c45fd5f2), ROM_BIOS(3)) + // 4: BIOS-String: 04/29/94-VT82C486A-214L2000-00 / Award Modular BIOS v4.50 + ROM_SYSTEM_BIOS(4, "ficgac2", "FIC 486-GAC-2") /* includes CL-GD542X VGA BIOS 1.50 */ + ROMX_LOAD( "att409be.bin", 0x00000, 0x20000, CRC(c58e017b) SHA1(14c19e720ce62eb2afe28a70f4e4ebafab0f9e77), ROM_BIOS(4)) + // 5: BIOS-String: 04/08/96-VT82C486A-214L2000-00 / Version 3.27GN1 + ROM_SYSTEM_BIOS(5, "ficgacv", "FIC 486-GAC-V 3.27GN1") /* includes CL-GD542X VGA BIOS 1.41 */ + ROMX_LOAD( "327gn1.awd", 0x00000, 0x20000, CRC(017614d4) SHA1(2228c28f21a7e78033d24319449297936465b164), ROM_BIOS(5)) + // 6: BIOS-String: 05/06/94-VT82C486A-214L2000-00 / Version 3.15GN - ISA16:4, ISA/VL: 2 + ROM_SYSTEM_BIOS(6, "ficgiovp", "FIC 486-GIO-VP 3.15GN") // Chipset: VIP VT82C486A, Promise PDC20230C, one further VIA, one other unreadable + ROMX_LOAD( "giovp315.rom", 0x10000, 0x10000, CRC(e102c3f5) SHA1(f15a7e9311cc17afe86da0b369607768b030ddec), ROM_BIOS(6)) + // 7: BIOS-String: 11/20/94-VT82C486A-214L2000-00 / Version 3.06G (11/25/94) - OSC: 24.0L3P - ISA16:3, ISA/VL: 2 + ROM_SYSTEM_BIOS(7, "ficgiovt", "FIC 486-GIO-VT 3.06G") // 1994-11-20 - Chipset: Winbond W83757AF, W83758P, VIA VT82C486A, VT8255N, VT82C482 + ROMX_LOAD( "306gcd00.awd", 0x10000, 0x10000, CRC(75f3ded4) SHA1(999d4b58204e0b0f33262d0613c855b528bf9597), ROM_BIOS(7)) + // 8: BIOS-String: 11/02/94-VT82C486A-214L2000-00 Version 3.07G - ISA8: 1, ISA16: 4, ISA/VL: 2 + ROM_SYSTEM_BIOS(8, "ficgvt2", "FIC 486-GVT-2 3.07G") // Chipset: VIA VT82C486A, VT82C482, VIA VT8255N + ROMX_LOAD( "3073.bin", 0x10000, 0x10000, CRC(a6723863) SHA1(ee93a2f1ec84a3d67e267d0a490029f9165f1533), ROM_BIOS(8)) + // 9: BIOS-String: 06/27/95-VT82C505-2A4L4000-00 / Version 5.15S - Chipset: S3 Trio64, FDC 37665GT, VT82C496G, VT82C406MV + ROM_SYSTEM_BIOS(9, "ficgpak2", "FIC 486-PAK-2 5.15S") /* includes Phoenix S3 TRIO64 Enhanced VGA BIOS 1.4-01 */ + ROMX_LOAD( "515sbd8a.awd", 0x00000, 0x20000, CRC(778247e1) SHA1(07d8f0f2464abf507be1e8dfa06cd88737782411), ROM_BIOS(9)) + // 10: BIOS-String: 04/01/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS - Chipset: VIA VT82C505, VT82C416, VT82C496G, Winbond W83787F + ROM_SYSTEM_BIOS(10, "ficpio3g7", "FIC 486-PIO-3 1.15G705") // pnp - ISA16: 4, PCI: 3 + ROMX_LOAD( "115g705.awd", 0x00000, 0x20000, CRC(ddb1544a) SHA1(d165c9ecdc9397789abddfe0fef69fdf954fa41b), ROM_BIOS(10)) + // 11: BIOS-String: 04/01/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS + ROM_SYSTEM_BIOS(11, "ficpio3g1", "FIC 486-PIO-3 1.15G105") /* non-pnp */ + ROMX_LOAD( "115g105.awd", 0x00000, 0x20000, CRC(b327eb83) SHA1(9e1ff53e07ca035d8d43951bac345fec7131678d), ROM_BIOS(11)) + // 12: BIOS-String: 11/27/96-VT496G-2A4L6F0IC-00 0000C-00 - runs into Award BootBlock BIOS + ROM_SYSTEM_BIOS(12, "ficpos", "FIC 486-POS") + ROMX_LOAD( "116di6b7.bin", 0x00000, 0x20000, CRC(d1d84616) SHA1(2f2b27ce100cf784260d8e155b48db8cfbc63285), ROM_BIOS(12)) + // 13: BIOS-String: 06/27/95-VT82C505-2A4L4000-00 / Version 5.15 / Chipset: VIA VT82C496G PC/AT + ROM_SYSTEM_BIOS(13, "ficpvt", "FIC 486-PVT 5.15") // ISA16: 6, ISA/VL: 2 + ROMX_LOAD( "5150eef3.awd", 0x00000, 0x20000, CRC(eb35785d) SHA1(1e601bc8da73f22f11effe9cdf5a84d52576142b), ROM_BIOS(13)) + // 14: BIOS-String: 10/05/95-VT82C505-2A4L4000-00 / Version 5.162W2(PCTIO) + ROM_SYSTEM_BIOS(14, "ficpvtio", "FIC 486-PVT-IO 5.162W2") // Chipset: VT82C406MV, VT82C496G, W83777/83787F, W83758P + ROMX_LOAD( "5162cf37.awd", 0x00000, 0x20000, CRC(378d813d) SHA1(aa674eff5b972b31924941534c3c988f6f78dc93), ROM_BIOS(14)) + // 15: BIOS-String: 40-00AG-001247-00101111-060692-SIS3486-0 / AV4 ISA/VL-BUS SYSTEM BIOS / Chipset: SIS 85C460ATQ + ROM_SYSTEM_BIOS(15, "ava4529j", "AVA4529J") // this is a board with two VLB slots + ROMX_LOAD("amibios_486dx_isa_bios_aa4025963.bin", 0x10000, 0x10000, CRC(65558d9e) SHA1(2e2840665d069112a2c7169afec687ad03449295), ROM_BIOS(15)) + // 16: BIOS-String: 40-0200-001291-00101111-111192-OPT495SX-0 / 34C-OP-WBp-25/33/40/50-D5-ZZ + // Chipset: OPTi 82C495SX - CPU: 486DX - BIOS: AMI 486DX ISA BIOS AA7524842 - ISA8: 1, ISA16: 4, ISA16/VL: 2 + ROM_SYSTEM_BIOS(16, "pat48pv", "PAT-48PV") + ROMX_LOAD("pat48pv.bin", 0x10000, 0x10000, CRC(69e457c4) SHA1(7015b2bccb10ce6e1ad6e992eac785f9d59a7a24), ROM_BIOS(16)) + // 17: Morse P1 V3.10 - CPU: 486DX - ISA8: 2, ISA16: 6 - Chipset: Morse 91A401A- Award Modular BIOS v4.20 / V3.00 - KEYBOARD ERROR OR NO KEYBOARD PRESENT + ROM_SYSTEM_BIOS(17, "p1", "P1") + ROMX_LOAD("morse_p1.bin", 0x10000, 0x10000, CRC(23d99406) SHA1(b58bbf1f66af7ed56b5233cbe2eb5ab623cf9420), ROM_BIOS(17)) + // 18: Chipset: SiS 85C206 CONTAQ 82C592 82C591 - CPU/FPU: 486, socket provided - OSC: 33.333MHz, 14.31818 - BIOS: AMI 486DX ISA BIOS AA0083611 (28pin) + // BIOS-String: 40-0700-D01508-00101111-070791-CTQ 486-0 - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS(18, "82c591", "82C591") + ROMX_LOAD("486-contaq.bin", 0x10000, 0x10000, CRC(e5d2cf16) SHA1(1357a964ef78eaad6894dcc9dce62be50cdf6df5), ROM_BIOS(18)) + // 19: Chipset: PCCHIPS CHIP 16 (9430-AS), CHIP 18 (9432-AS) - CPU: i486DX2-66 - BIOS: AWARD (28pin) - ISA16: 4, ISA16/VL: 3 - OSC: 14.31818MHz + // BIOS-String: 07/13/94--2C4X6H01-00 / Release 07/15/94' + ROM_SYSTEM_BIOS(19, "chips", "Chips") + ROMX_LOAD("486-pcchips.bin", 0x10000, 0x10000, CRC(4e49eca1) SHA1(2343ca9f4760037eb2ef6e7b011b9690e542d6ea), ROM_BIOS(19)) + // 20: CAM/33(50)-P8 M458(A)P80 - Chipset: Opti 82C495SX, F82C206Q 82C392SX - CPU: 486DX-33 (solder pads for 486sx and 486DX) - OSC: 14.318MHz, 33.000MHz + // Keyboard-BIOS: AMI Keyboard BIOS PLUS A317473 - BIOS: AMI 486 BIOS PLUS 214097 (28pin) - RAM: SIMM30x8 - Cache: 1xIS61C256A, 8xUM61256BK-25 - ISA8: 1, ISA16: 6 + // BIOS-String: X0-0101-001105-00101111-060692-495SX_A-0 / 486DX/SX CAM/33,50-P8, CPM/25,33-P8, 12/14/1992 + ROM_SYSTEM_BIOS(20, "cam33", "CAM/33") + ROMX_LOAD("486-cam.bin", 0x10000, 0x10000, CRC(d36a13ea) SHA1(14db51dbcf8decf1cb333c57a36971ef578c89b4), ROM_BIOS(20)) + // 21: 486-PIO3 1.1 - Chipset: Winbond W83787F, VIA VT82C505, VT82C416, VT82C496G - ISA16: 4, PCI:3 - BIOS: AWARD F 4825803 1.14G705 (32pin) - CPU: Socket 3 + // RAM: 2xSIMM72, Cache: 9 sockets marked SRAM 128Kx8 (2 banks +1) - On board: 2xIDE, Floppy, par, 2xser + // BIOS-String: 02/01/96-VT496G-2A4L6F0IC-00 0000C-00 . runs into BootBlock BIOS + ROM_SYSTEM_BIOS(21, "pio3", "486-PIO-3") + ROMX_LOAD("486-pio3.bin", 0x00000, 0x20000, CRC(1edb5600) SHA1(36887cd08881dfa063b37c7c11a6b65c443bd741), ROM_BIOS(21)) + // 22: 486 G486IP IMS - Chipset: IMS 8848 IMS 8849 - CPU: i486DX2-66 - BIOS: AMI 486DX ISA BIOS AB5870352 - Keyboard-BIOS: MEGAKEY (AMI/Intel) - ISA8: 1, ISA16: 4, PCI: 3 + // RAM: SIMM30: 4, SIMM72: 2, Cache: 10 sockets (UM61256AK-15) - BIOS-String: 41-0000-ZZ1124-00101111-060692-IMS8849-0 / PCI BIOS, Dated JUN-16-94 / FOR G486IP + ROM_SYSTEM_BIOS(22, "g486ip", "G486IP") + ROMX_LOAD("g486ip_ims.bin", 0x00000, 0x20000, CRC(4431794a) SHA1(f70e8c326455229c3bb7f305c2f51c4ac11979ed), ROM_BIOS(22)) + // 23: EFA 486 UPIO + // BIOS-String: 11/09/95-UMC-881/886A-2A4X5E39C-00 00 / N486U-PIO/A, Rev 1.03 ROM - NOT FOR SALE - boots into BootBlock BIOS + ROM_SYSTEM_BIOS(23, "486upio", "486 UPIO") + ROMX_LOAD("upio_103.bin", 0x00000, 0x20000, CRC(4e9139cd) SHA1(f2b00356957c712ca652c3751b31161b3110ec69), ROM_BIOS(23)) + // 24: Acer 486 Version 2.2 - Chipset: ALi M1429, M1431 - CPU: 486 - RAM: SIMM30x8 + // screen remains blank + ROM_SYSTEM_BIOS(24, "acer48622", "Acer 486 V2.2.") + ROMX_LOAD("4alm002.bin", 0x10000, 0x10000, CRC(88291af2) SHA1(7ff912e9f0550631377d1a4c3aa266a081e7dce9), ROM_BIOS(24)) + // 25: ACR6BE00-M00-940720-R01-E0 / BIOS V2.0 - Keyboard Interface Error, Pointing DeviceInterface Error + ROM_SYSTEM_BIOS(25, "4alo001", "4ALO001") + ROMX_LOAD("4alo001.bin", 0x00000, 0x20000, CRC(4afb9c50) SHA1(5e56682ba1e04bd0b074de3b2a93fb5322325d01), ROM_BIOS(25)) + // 26: dies after initialising the graphics card + ROM_SYSTEM_BIOS(26, "4alp001", "4ALP001") + ROMX_LOAD("4alp001.bin", 0x10000, 0x10000, CRC(9b4a2881) SHA1(f324bb0304164e9ede1dd2eebb085a76aae398be), ROM_BIOS(26)) + // 27: BIOS-String: 30-0500-ZZ1130-00101111-070791-1219-0 + ROM_SYSTEM_BIOS(27, "zz1130", "ZZ1130") + ROMX_LOAD("4zzw001.bin", 0x10000, 0x10000, CRC(dc21c952) SHA1(affdc4efbca4dad561e4f0141463844ec84ae519), ROM_BIOS(27)) + // 28: screen remains blank + ROM_SYSTEM_BIOS(28, "optimus", "Optimus") + ROMX_LOAD("mb_bios_ami_930808.bin", 0x10000, 0x10000, CRC(89151d5b) SHA1(92a93cae054525adfdc6277a1236e699ea9fbc32), ROM_BIOS(28)) + // 29: 40-0100-DG1112-00101111-070791-UMC480A / Rev. 251191 UMC-486A - ASI board + // The BIOS comes from http://www.elhvb.com/supportbios.info/Archives/BIOS/0-A/ASI/UMC-486A/index.html and contains 28 extra plain textattr + // bytes at the end of the file. These have been lopped off, but the emulated machine complains about a ROM error, thus marked BAD_DUMP + ROM_SYSTEM_BIOS(29, "umc486a", "UMC-486A") + ROMX_LOAD("umc481icorr.ami", 0x10000, 0x10000, BAD_DUMP CRC(d27b2fd4) SHA1(e639dbc7d65b29ffca26701af766fa75bfe33787), ROM_BIOS(29)) + // 30: 40-0201-D41107-00101111-031591-OPBC-0 + ROM_SYSTEM_BIOS(30, "a9c11f1f", "a9c11f1f") + ROMX_LOAD("ami_486_zz686886.bin", 0x10000, 0x10000, CRC(a9c11f1f) SHA1(2a27ecae9547ddd3d230c30a94deb83a4d6b4436), ROM_BIOS(30)) + //31: Award Modular BIOS v4.20 / Version 1.09K + ROM_SYSTEM_BIOS(31, "109k", "1.09K") + ROMX_LOAD("award_486dx_0097042.bin", 0x10000, 0x10000, CRC(b620534b) SHA1(d3777a82cb35639d386a1840dd5cf52527ec6f8b), ROM_BIOS(31)) + // 32: UNIC2 94V-0 9326 - OPTI chipset (3 chips) + // BIOS-String: X0-0100-001378-00101111-060692-495SX_A + ROM_SYSTEM_BIOS(32, "unic2", "UNIC 2 94V-0") + ROMX_LOAD("amibios-486dx-1992-aa8707058-m27c512.bin", 0x10000, 0x10000, CRC(a2b3e326) SHA1(b29c5668fb3337893ef3a96f053f90b929bac0d6), ROM_BIOS(32)) + // 33: BIOS-String: 40-0100-001276-00101111-060692-495_X86-0 + // OPTi 82C495 SX, F82C206 - CPU: two solder pads and two CPU sockets - RAM: 8xSIMM30, Cach: 10x28pin DIP - ISA8: 2, ISA16: 3, ISA16/VLB: 3 + ROM_SYSTEM_BIOS(33, "495sx1", "495sx-1") + ROMX_LOAD("495sx-1.bin", 0x10000, 0x10000, CRC(318a99a3) SHA1(e57380ed2a802cd1648a32317313ade5221f1213), ROM_BIOS(33)) + // 34: Chipset: marked QDI - CPU: Socket 3, 25MHz-50MHz - RAM: 4xSIMM30, 2xSIMM72, Cache: 8x32pin DIP (4x28pin DIP filled), 1x32pin DIP (filled with 28pin DIP) + // BIOS: AMI 486DX ISA BIOS AC2849676 - OSC: 18.31818 - ISA8: 1, ISA16: 3, ISA16/VL: 3 + ROM_SYSTEM_BIOS(34, "qdi486", "QDI486") // screen remains blank + ROMX_LOAD("qdi486.bin", 0x10000, 0x10000, CRC(f44a5a45) SHA1(57cfd7c6524eba21395642bd57b726b45eef4b6a), ROM_BIOS(34)) +ROM_END + + +//************************************************************************** +// 80486 motherboard +//************************************************************************// + +// Addtech Research 4GLX3 Green-B 4GPV3.1 aka VisionEX 4GPV3 - Chipset: Contaq 82C596A - BIOS Version: AMI 01/10/94 486 ISA BIOS AA 6729627 +// Keyboard BIOS: AMI - CPU: Socket 3, solder pads for 80486DX/SX provided - RAM: 8xSIMM30, Cache: 9x28pin DIP - ISA16: 8, ISA16/VLB: 2 +ROM_START( ar4glx3 ) // BIOS-String: 40-0101-006666-00101111-011094-CTQ-596A / KIM Computer by CTL Corporation / Model : [4GLX3] --- Made in U.S.A. + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4glx3_bios.bin", 0x10000, 0x10000, CRC(3367e0b2) SHA1(8dbe58ed783c56ca2cb61ded6f603314739dcfb8)) +ROM_END + +// TMC PAT48AV 1.4 - ALi M1429 A1, M1431 A2 - Bios: AMI 486DX ISA BIOS AB4179743 - Keyboard BIOS: AMI-KB-H-WP - CPU: 486DX socket +// RAM: 8xSIMM30 - Cache: 8xIS61C256AH-20N - OSC: 14.31818 - ISA16: 4, ISA16/VLB: 3 +ROM_START( tmpat48av ) // screen remains blank - BIOS-String: 40-0106-001291-00101111-080893-ALI1429 / 486DX-AC-WBu-25/33/40/50-L6-ZZ + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pat48av_bios_27c512.bin", 0x10000, 0x10000, CRC(a054b7b3) SHA1(edc2554a73aba94d586f8b49a5c5bbbe2890331c)) +ROM_END + +// BIOSTAR - MB-1433/50 AEA-P - V:1 - Chipset: VLSI 82C3480 & 83C3490 (marked BIOTEQ) - BIOS/Version: AMIBIOS 12/12/91 - Keyboard BIOS: MEGA-KB-F-WP +// CPU: It's ST 486Dx2-80 - RAM: 8xSIMM30, Cache: 8xW24M257AK-15, 1xW2465AK-15 - ISA8: 1, ISA16: 6 - OSC: 66.000MHz, 14.318 +ROM_START( mb1433aeap ) // 40-0100-001223-00101111-121291-B82C3480-0 / M1433/50AEA-P + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "mb-1433-aea-p.bin", 0x10000, 0x10000, CRC(daac20f7) SHA1(b6889a4896f83b306e69efa87cae8d03147b6dbd)) +ROM_END + +// FIC ELI6-II (from Unisys ELI 46665 Desktop) - Chipset: VIA 82C486A, VT82C487, SMC FDC37C665QF P - BIOS label: ELI6-U555 +// BIOS Version: Award U573 3/14/95 - CPU: Intel Overdrive DX40DPR100 in Socket 3 - RAM: 4xSIMM72, Cache: 9x256K-15 - ISA16:6 - On board: ISA, Floppy +ROM_START( ficeli6ii ) // BIOS String: 03/14/95-VT82C486A-214L2000-00 / Award Modular BIOS v4.50 /3.20G /F5 1.00 / UNISYS ELI6-II Version U573.BIN (03/14/95) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "fic_eli6ii.bio", 0x10000, 0x10000, CRC(b61cc026) SHA1(59eae42bf1dea01ba04fecd9bb367e47d4a256d4)) +ROM_END + +// Mitac PWA-IH4077D - Chipset: EFAR EC802GL, EC100G, UMC UM82C863F, UM82C865F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9xIS61C256AH-20N +// BIOS: known: R2.03/CKS: 2400H, ATT4077D BIOS R1.01.00/CKS: 3000H - Keyboard BIOS: Award KB-200 or VIA VT82C42N (on ATT4077D) +// On board: 2xser, par, Floppy, IDE - ISA16: 4, ISA17/VL: 2 +ROM_START( pwaih4077d ) // BIOS-String: 04/02/98-EFAR-EC802G-B-2C403D31-00 / (IH4077D R2.08G) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ih4077d.208g", 0x10000, 0x10000, CRC(0f834ba2) SHA1(7e08e454dfa3cf5079845fe61b9ae74b1dcc7981)) +ROM_END + +// ASUS ISA-486SIO rev. 1.2 - Chipset : SiS 85C460 ATQ, Winbond W85C16B - BIOS : AMI 486DX/ISA BIOS AA2310181 - Keyboard BIOS: AMI +// CPU: Intel 80486SX-25 - RAM: 8xSIMM30, Cache: 9x28pin DIP (used: 4xM5M5276P-25, 1xUM6164BK-20) - ISA8: 1, ISA16: 6 - OSC: 25.000MHz, 14.31818 +ROM_START( a486sio )// BIOS-String : 40-0104-001292-00101111-050591-I486SI-F + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "isa-486sio.bin", 0x10000, 0x10000, CRC(f339f8ff) SHA1(d53f0ff30cc7f0c70ffeeda33d16dddbeedd6098)) +ROM_END + +// Micronics JX30GP - Motherboard P/N: 09-00189-10 REV B1 - Chipset: MIC 471, MIC491, PC87312VF (Super I/O), KS82C6818A - +// CPU: Socket 3, solder pads for 80486QFP - RAM: 4xSIMM72, Cache: 6xUM61256FK-15, 1xW24257AK-15 - DIP4: 0000 - OSC: 14.318 +// ISA16: 5, ISA16/VLB: 2 - on board: Floppy, ISA, PS/2 keyboard and mouse +ROM_START( mijx30gp ) // BIOS: Phoenix, 80486 ROM BIOS PLUS Version 0.10 GJX30G-04P, Gateway 2000 Local Bus BIOS - shows Error 8602 - Auxiliary Device Failure + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "micronics_gjx30g-04p_09-24-93.bin", 0x10000, 0x10000, CRC(66477a66) SHA1(549eecf707bbb43bcdc89715b36cc23e3cb1a074)) + ROM_IGNORE(0x10000) // the second half of the 128K ROM seems to contain BIOS source code +ROM_END + +// AMI 80486 EISA Enterprise-II - Chipset: AMI/Intel 82357 - RAM: 8xSIMM30 (32MB max), 128K cache memory - CPU: i486DX 25/33, Weitek WTL4167 FPU socket provided +// on board: Floppy, PS/2 mouse, memory card socket, i/o expansion module slot - EISA: 8 +// BIOS-String: 41-0001-004616-00111111-070791-AMI-EP-0 - EISA CMOS INOPERATIONAL / Software Port NMI INOPERATIONAL / Fail-safe Timer NMI INOPERATIONAL / Keyboard error +ROM_START( amient2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "16092391.cs1", 0x00000, 0x20000, CRC(b0ae5c8d) SHA1(0d6cda74433a5d70e8fc2bec6a77ed97a09a984e)) +ROM_END + +// AMI Enterprise-III EISA Local Bus Series 68 - CPU: i486SX/DX/DX2 25/33/50/66MHz - RAM: 16xSIMM32 (up to 256MB RAM!!!), Cache 256K +// EISA: 6, EISA/VL: 2 - BIOS: Flash - repeated short single beeps (DRAM refresh error) +// BIOS-String: 41-0103-004668-00111111-111192-AMIS68 +ROM_START( amient3 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s68p.rom", 0x00000, 0x20000, CRC(7342b9ef) SHA1(da6b2312ccc175473443b1d562d5e4f3952cac5a)) +ROM_END + +// AMI ENTERPRISE-IV EISA VLB - CPU: 486SX/486SX/486DX/DX2/Pentium overdrive 25/33/50/66 MHz - RAM: 4xSIMM72 (256MB), Cache: 256KB +// EISA: 5, EISA/VL: 2 - on board: floppy, IDE, par, 2xser - screen remains blank +// BIOS-String: 41-0103-004687-00111111-111192-AMIS87 +ROM_START( amient4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s87p.rom", 0x00000, 0x20000, CRC(ff092e7f) SHA1(4999278dca001de74dff518f1f1c9ea8212d7ed4)) +ROM_END + +// AMI Super Voyager PCI-II - Chipset: AMI, SMC - CPU: 486DX/DX2/DX4 - RAM: 4xSIMM72 (64MB), Cache: 5x32pin, 4x28pin+TAG (127/256K) +// BIOS: Flash - Keyboard-BIOS: AMIKEY - ISA16: 4, PCI: 3 - on board: Floppy, 2xIDE, 2xer, par - screen remains blank +ROM_START( amisvpci2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s724p.rom", 0x00000, 0x20000, CRC(fa9ea9b3) SHA1(b0f2206a7f0d6a00e094f7d151c16022a5292858)) +ROM_END + +// AMI Super Voyager VLB - screen remains blank +// BIOS-String: 40-0103-004669-00111111-111192-AMIS69B2 +ROM_START( amisvvlb ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s69b2p.rom", 0x00000, 0x20000, CRC(3a13944c) SHA1(9d7733ee50023edd5b0bf4b098c9c6c35a4dc2b0)) +ROM_END + +// AMI Super Voyager VLB-II - AMI Super Voyager VLB-II - CPU: 486/Overdrive - Chipset: AMI, SMC FDC37C665GT +// RAM: 4xSIMM72, Cache: 8x28pin + TAG - ISA16: 5, ISA16/VL: 2 - BIOS: 28pin in a 32pin socket - on board: Floppy, IDE +// BIOS-String: 40-0100-004682-00111111-111192-AMIS82E +ROM_START( amisvvlb2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s82p.rom", 0x00000, 0x20000, CRC(2e2d33ae) SHA1(349be4b29bc8a4447ab4c73fe4c695276565489f)) +ROM_END + +// AMI Super Voyager VLB-III - Chipset: FDC37C665GT, AMI - CPU: 486SX, 487DX, 486DX/DX2/DX4, Overdrive +// RAM: 4xSIMM72 - on board: mouse, par, 2xser, Floppy, IDE - ISA16: 5, ISA16/VL: 2 - screen remains blank, repeated single beeps +ROM_START( amisvvlb3 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "s707p.rom", 0x00000, 0x20000, CRC(5c0e55c0) SHA1(0c5232a21180d4541202ac6dd34677339b7cbecc)) +ROM_END + +// Edom 486VL3H MV020 - CPU: 486 - Chipset: HiNT CS8005, HMC HM82C206AQ - RAM: 8xSIMM30 +// Cache: IS61C256AH-20Z (8), AE88128AK-15 - Keyboard-BIOS: JETkey V5.0 - ISA8: 2, ISA16: 3, ISA16/VLB: 3 +// BIOS-String: 09/05/94-HINT-8005-214D1W00-00 / HiNT CS8005 FOR 486SX/DX/DX2 VL-BUS [MV020] +ROM_START( ed486vl3h ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4hiw001.bin", 0x10000, 0x10000, CRC(760842fd) SHA1(2fe156f092c84cf385079da1209a8f1e06005f5e)) +ROM_END + +// MSI MS-4134 - Chipset: ALI M1429, M1431, M1435 - CPU: Socket 3, RAM: 4xSIMM30, 2xSIMM72, Cache: 8x32pin + TAG, used: 9xW2464AK-20 +// ISA16: 3, ISA16/VL: 2, PCI: 3 - BIOS: AMI +// BIOS-String: +ROM_START( ms4134 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0105-421169-00101111-080893-1429GPCI-0 / AL57 111594 + ROM_SYSTEM_BIOS(0, "al57", "AL57") + ROMX_LOAD( "al57.rom", 0x00000, 0x20000, CRC(6b6c2a11) SHA1(1e40ef8a7a7b3be057ba6a121abfd0d983d5d5c9), ROM_BIOS(0)) + // 1: BIOS-String: 40-0105-421169-00101111-0890893-1429GPCI-0 / AL51 5/23/1994 + ROM_SYSTEM_BIOS(1, "al51", "AL51") + ROMX_LOAD( "4alm001.bin", 0x00000, 0x20000, CRC(0ea9f232) SHA1(5af1a0cf047b68a7070b8c45081a80e817aade84), ROM_BIOS(1)) +ROM_END + +// Abit 486 EISA-AE4 - Chipset: SiS 85C406, 85C411, three other SiS chips unreadable - CPU: 486, FPU socket provided - RAM: 8xSIMM30, Cache: 8x28pin +// ISA16: 2, EISA: 6 - BIOS: Award EISA486/CU - Keyboard-BIOS: NEC KB-BIOS VER:400 JU-JET 1989 - OSC: 50.000MHz, 14.31818MHz +// Award Modular BIOS v4.20 / AE4 EISA SYSTEM BIOS +ROM_START( abae4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ae4.bin", 0x10000, 0x10000, CRC(d9cbc3c6) SHA1(eeeaef7fd188598d477897f0248c99940cd1a5d7)) +ROM_END + +// FIC 486-KVD - Chipset: VIA VT82C485 - CPU: 486, solder pad for 486sx present - RAM: 8xSIMM30, Cache: 4xIS61C256A-20N+1xCY7C185-20PC, 4 empty sockets (28pin) +// ISA16: 5, ISA16/VL: 2 - BIOS: AMI 486DX ISA BIOS AA7211137 - Keyboard-BIOS: MEGA-KB-H-WP + +ROM_START( fic486kvd ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: X0-0100-001121-00101111-021993-VIA-0 + ROM_SYSTEM_BIOS(0, "021993", "021993") + ROMX_LOAD( "486kvd_aa72111137.bin", 0x10000, 0x10000, CRC(a1f1810f) SHA1(405afbf1635c6b41343aabfeeb3cf4cdc947a5ba), ROM_BIOS(0)) + // 1: BIOS-String: X0-0100-001121-00101111-021993-VIA-0 + ROM_SYSTEM_BIOS(1, "060692", "060692") + ROMX_LOAD( "486-aa9615811.bin", 0x10000, 0x10000, CRC(b6b1a8e4) SHA1(be537fc27f6dedbd7fd935a7900ec075d2183837), ROM_BIOS(1)) +ROM_END + +// Eagle EAGLEN486 GC10A - Chipset: NEC ADC006, LGS Prime 3B 9543 - CPU: Socket 3 - RAM: 2xSIMM72, Cache: fake (not connected, marked write back) +// On board: IDE, Floppy, 2xser, par - ISA16: 4, PCI: 2 - BIOS: 32pin (sst29ee010), only the first half is occupied - // BIOS-String: Phoenix NuBIOS Version 4.04 +ROM_START( gc10a ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "nec_sst29ee010_orig.bin", 0x10000, 0x10000, CRC(7b1feabb) SHA1(468734b766b9c438b2659fddf2cabcfde5a574a2)) + ROM_IGNORE(0x10000) +ROM_END + +// Arstoria AS496 - Chipset: SiS 85C495, 95C497, Winbond - CPU: Socket 3 - RAM: SIMM72x4, Cache: 4+1 - BIOS: 32pin Keyboard-BIOS: BESTKEY - ISA16: 4, PCI: 3 +// BIOS-String: 09/12/96-SiS-496-497/A/B-2A4IBR2CC-00 / ARSTORIA AS496 V2 09/12/96 - boots to Boot Block BIOS +ROM_START( as496 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "as496.bin", 0x00000, 0x20000, CRC(745f8cc8) SHA1(46b9be25a7027a879482a412c9fe5687bbb28f08)) +ROM_END + +// Peacock PCK 486 DX DOC 50-60064-00 - Chipset: Symphony SL82C465 SL82C461 SL82C362 Chips F82C721 - CPU: i486DX-33, FPU socket privoded +// BIOS: AMI 486DX ISA BIOS AA3364567 - Keyboard-BIOS: AMI/Intel P8942AHP - On board: 2xser, Floppy, IDE, par - OSC: 33.000MHz +// BIOS-String: 40-0100-806294-00101111-060692-SYMP-0 / Peacock Computer 486 BIOS Rev. 2.0 / 30.11.92 - ISA16: 6 +ROM_START( pck486dx ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pck486dx.bin", 0x10000, 0x10000, CRC(d0edeba8) SHA1(b5b9492f32e35764c802be2b05a387a9b3aa7989)) +ROM_END + +// FIC 486-GIO-VT2 - Chipset: Winbond W83758P, Winbond W83757AF, VIA VT82C482, VT82C486A, VT82C461 - ISA8: 1, ISA16: 3, ISA/VL: 2 +// On board: Game, 2xIDE, 2xser, par, Floppy +ROM_START( ficgiovt2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 07/06/VT82C486A-214L2000-00 / Version 3.26G + ROM_SYSTEM_BIOS(0, "ficgiovt2_326", "FIC 486-GIO-VT2 3.26G") + ROMX_LOAD( "326g1c00.awd", 0x10000, 0x10000, CRC(2e729ab5) SHA1(b713f97fa0e0b62856dab917f417f5b21020b354), ROM_BIOS(0)) + // 1: BIOS-String: 06/19/95-VT82C486A-214L2000-00 / Version VBS1.08H 486-GIO-VT2 + ROM_SYSTEM_BIOS(1, "vt2vbs108","VBS1.08H 486-GVT-2") + ROMX_LOAD( "award_486_gio_vt2.bin", 0x10000, 0x10000, CRC(58d7c7f9) SHA1(097f15ec2bd672cb3f1763298ca802c7ff26021f), ROM_BIOS(1)) // Vobis version, Highscreen boot logo + // 2: BIOS-String: 07/17/97-VT82C486A-214L2000-00 / Version 3.276 + ROM_SYSTEM_BIOS(2, "ficgiovt2_3276", "FIC 486-GIO-VT2 3.276") + ROMX_LOAD( "32760000.bin", 0x10000, 0x10000, CRC(ad179128) SHA1(595f67ba4a1c8eb5e118d75bf657fff3803dcf4f), ROM_BIOS(2)) + // 3: BIOS-String: 08/30/94-VT82C486A-214L2000-00 / Version VBS1.04 486-GIO-VT2 - Keyboard-BIOS: VT82C42N + ROM_SYSTEM_BIOS(3, "vt2vbs104","VBS1.04 486-GVT-2") + ROMX_LOAD( "486-gio-vt2.bin", 0x10000, 0x10000, CRC(7282133d) SHA1(c78606027eca509cd6d439e4689b8d50753ee80c), ROM_BIOS(3)) // Vobis version, Highscreen boot logo +ROM_END + +// FIC 486-GVT - VIA VT82C486, VIA VT82C482 - AMIBIOS 08/08/93 - CPU: P24T, solder pads for 486 provided - RAM: SIMM30: 4, SIMM72: 2, Cache: 9x28pin DIP +// ISA16: 4, ISA16/VLB: 2 +ROM_START( fic486gvt ) // BIOS-String: X0-0100-001121-00101111-112593-VT486N8-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486gvt.bin", 0x10000, 0x10000, CRC(4c5b4bde) SHA1(04711725fe89d9c793a369d82d411a5495ae3aea)) +ROM_END + +// Octek Hawk REV 1.1 - BIOS: AMI AA1481746 486DX ISA BIOS 28pin - Keyboard-BIOS: Intel/AMI - Chipset: OPTi F82C206L, 82C496 - OSC: 66.667MHz, 14.31818MHz +// BIOS-String: 40-0100-000000-00101111-121291-OPTIDXBB-0 / HAWK -011 - CPU: Intel Overdrive DX2ODPR66 - ISA16: 7 +ROM_START( ochawk ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "hawk.bio", 0x10000, 0x10000, CRC(365b925d) SHA1(3a1776c80540b6878ff79857c2d4e19320a2792a)) +ROM_END + +// Abit AB-PW4 - Chipset: Winbond W83C491F, W83C492F (SL82C491 Symphony Wagner) - BIOS/Version: Award D2144079 - CPU: i486sx-25 - ISA8: 1, ISA16: 3, ISA16/VL: 3 +ROM_START( abpw4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 03/21/95-Winbond-83C491-2C4J6A11-46 / Award v4.50G / GREEN CACHE 486 VESA SYSTEM BIOS + ROM_SYSTEM_BIOS(0, "2c4j6a11", "2C4J6A11-46") + ROMX_LOAD( "award_486_bios_d2144079_c1984-1995.bin",0x10000, 0x10000, CRC(c69184da) SHA1(e8a799f9a3eebfd09c1d19a909574fca17fce7a0), ROM_BIOS(0)) + // 1: BIOS-String: 09/12/95-Winbond-83C491-2C4J6A12-2E + ROM_SYSTEM_BIOS(1, "2c4j6a12", "2C4J6A12-2E") + ROMX_LOAD( "pw4_2e.bin", 0x10000, 0x10000, CRC(c4aeac4d) SHA1(e58f2e2d5c337f447808535629686dde54c09fab), ROM_BIOS(1)) +ROM_END + +// Vintage Sprite SM 486-50USC - Chipset: UM82C491F - BIOS: EPROM/MR-BIOS 1.50 - Keyboard-BIOS: JETkey V3.0 +// CPU: Intel 486DX2-66 - OSC: 33.333000MHz, 14.31818MHz - ISA16: 5, ISA16/VL: 2 +ROM_START( sm48650usc ) // constant reset + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "mrbios_1150usc_um82c491f.bin", 0x10000, 0x10000, CRC(b6ef1220) SHA1(94511df49713ec30467c8d9b18eb04e83fa7a809)) +ROM_END + +// Octek Hippo VL+ - CPU: 486 - BIOS: EPROM/MR - Keyboard-BIOS: MR/Amikey - Chipset: DCA/Octek (label stickers) - ISA16: 3, ISA16/VL: 3 +// MR BIOS (r) V1.52 / 486SLC CPU 28MHz +ROM_START( ochipvlp ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: // reset loop + ROM_SYSTEM_BIOS( 0, "v152", "V1.52") + ROMX_LOAD( "vlmr152.rom", 0x10000, 0x10000, CRC(b4febf98) SHA1(a28ffa20fe772eac5fd149821d5637af63965371), ROM_BIOS(0)) + // 1: MR BIOS (r) V3.21 2GB support + ROM_SYSTEM_BIOS( 1, "v321", "V3.21 with 2GB support") + ROMX_LOAD( "v053b407.rom", 0x10000, 0x10000, CRC(415d92b1) SHA1(e5a9f2a677002368d20f1281e2ac3469b19079f9), ROM_BIOS(1)) +ROM_END + +// Octek Hippo COM - Chipset: UMC UM82C865F, UM82C863F, UM82C491F - CPU: 486sx - BIOS: EPROM/AMI 486DX ISA BIOS - Keyboard-BIOS: MEGATRENDS MEGA-KB-H-WP / Intel +// BIOS-String: 40-0102-428003-00101111-080893-UMC491F-0 / U491/3 GREEN 486 MAIN BOARD INV1.1 94.2.21 - ISA16: 4 - On board: 1xIDE, Floppy, Game, 2xserial, 1xparallel +ROM_START( ochipcom ) + ROM_REGION32_LE( 0x20000, "bios", 0) + ROM_LOAD( "hippo_com_bios.bin", 0x10000, 0x10000, CRC(d35f65a1) SHA1(885f55f87d2070c6a846768e5cf76499dad8d15c)) +ROM_END + +// J-Bond A433C-C/A450C-C RAM: 8xSIMM30, Cache: 8xCY7199-25PC/2xCY7C166-20PC - 2 8-bit ISA, 6 16-bit ISA) +// Chipset: ETEQ ET82C491 + ET82C493; CHIPS P82C206; AMI KB-BIOS-VER-F P8042AHP - OSC: 33.000MHz - CPU: i486DX-33 +// BIOS: AMI 486 BIOS ZZ566787 - BIOS-String: 40-0200-001353-0010111-070791-ETEQ4/1C-0 / ETEQ 486 Mar. 05, 1992 +ROM_START( a433cc ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ami_j-bond_a433c-c.bin", 0x10000, 0x10000, CRC(66031e98) SHA1(d2d1a26837d3ca943a6ef09ec3e6fbfaaa62cc46)) +ROM_END + +// ASUS PVI-486AP4 (Socket 3, 4xSIMM72, Cache: 128/256/512KB, 4 PCI, 4 ISA, 1 VLB) +// Intel Aries PCIset S82425EX + S82426EX; DS12887 RTC; VIA VT82C42N - BIOS: 32pin +ROM_START( a486ap4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 07/20/94-ARIES-P/I-AP4G-00 / #401A0-0104 + ROM_SYSTEM_BIOS(0, "486ap4v104", "ASUS PVI-486AP4 V1.04") + ROMX_LOAD( "awai0104.bin", 0x00000, 0x20000, CRC(52ea7123) SHA1(3d242ea6d1bcdddd41e32e40708133c72f2bd060), ROM_BIOS(0)) + // 1: BIOS-String: 10/21/94-ARIES-P/I-AP4G-00 / #401A0-0203 + ROM_SYSTEM_BIOS(1, "486ap4v203", "ASUS PVI-486AP4 V2.03") + ROMX_LOAD( "awai0203.bin", 0x00000, 0x20000, CRC(68d3a3f4) SHA1(6eee0c9aed2ede028eb170f8dd7921563293b99f), ROM_BIOS(1)) + // 2: BIOS-String: 11/08/94-ARIES-P/I-AP4G-00 / #401A0-0204 + ROM_SYSTEM_BIOS(2, "486ap4v204", "ASUS PVI-486AP4 V2.04") + ROMX_LOAD( "awai0204.bin", 0x00000, 0x20000, CRC(b62b35bb) SHA1(b6fa3d7b1c88da37ce74aca329a31d2587652d97), ROM_BIOS(2)) + // 3: BIOS-String: 11/25/97/ARIES-P/I-AP4G-00 / #401A0-0205-2 + ROM_SYSTEM_BIOS(3, "486ap4v205-2", "ASUS PVI-486AP4 V2.05-2") + ROMX_LOAD( "0205.002", 0x00000, 0x20000, CRC(632e8ee6) SHA1(3cf57b2654b0365e41ef5f5c82f68eeadf0e7a21), ROM_BIOS(3)) +ROM_END + +// ASUS PCI/I-486SP3G V3.02 (Socket 3, RAM: 4xSIMM72, Cache: 128/256/512K, 1 IDE, 1 SCSI, 3 PCI, 4 ISA) - BIOS: 32pin +// Intel Saturn II chipset: 82424ZX CDC + 82423TX DPU + 82378ZB SIO; NCR 53C820; National PC87332; DS12887 RTC; VIA VT82C42N +ROM_START( a486sp3g ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 10/21/94-SATURN-II-P/I-SP3G-00 / #401A0-302 + ROM_SYSTEM_BIOS(0, "v302", "ASUS PCI/I-486SP3G V3.02") + ROMX_LOAD( "awsg0302.bin", 0x00000, 0x20000, CRC(21e918a0) SHA1(c7f937e3e90a43d7c7f867e686625b28a9c2484c), ROM_BIOS(0)) + // 1: BIOS-String: 08/15/95-SATURN-II-P/I-SP3G-00 / #401A0-304 + ROM_SYSTEM_BIOS(1, "v304", "ASUS PCI/I-486SP3G V3.04") + ROMX_LOAD( "awsg0304.bin", 0x00000, 0x20000, CRC(f4d830d2) SHA1(086ccd14c7b0c521be1958d58b3539c4bfe4721f), ROM_BIOS(1)) + // 2: BIOS-String: 04/21/99-SATURN-II-P/I-SP3G-00 / #401A0-0306-1 + ROM_SYSTEM_BIOS(2, "v306", "ASUS PCI/I-486SP3G V3.06") + ROMX_LOAD( "0306.001.bin", 0x00000, 0x20000, CRC(278e1025) SHA1(75835e59cf28bb6b9258f676766633cbffa56848), ROM_BIOS(2)) +ROM_END + +// ASUS VL/EISA-486SV1 (8 EISA, 1 VLB) - +ROM_START( a486sv1 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 05/20/94-SIS-486/EISA-E-486SV1-00 / #401A0-0112 + //ROM_SYSTEM_BIOS(0, "v112", "Award BIOS V1.12") + ROM_LOAD( "e4sv0112.awd", 0x10000, 0x10000, CRC(d1d42fc9) SHA1(61549bf597517bb3c33e724e32b3cca981e65000)) +ROM_END + +// FIC 486-VIP-IO (3 ISA, 4 PCI) +// VIA GMC chipset: VT82C505 + VT82C486A + VT82C482 + VT82C483 + VT83C461 IDE; DS12885Q RTC; National PC87332VLJ-S I/O +ROM_START( ficvipio ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 12/07/94-VT82C505-2A4L4000-00 / Version 4.26GN2(ES2) (12/07/94) + ROM_SYSTEM_BIOS(0, "426gn2", "FIC 486-VIP-IO 4.26GN2") + ROMX_LOAD( "426gn2.awd", 0x00000, 0x20000, CRC(5f472aa9) SHA1(9160abefae32b450e973651c052657b4becc72ba), ROM_BIOS(0)) + // 1: BIOS-String: 02/08/96-VT82C505-2A4L4000-00 / Version 4.27GN2A (02/14/96) + ROM_SYSTEM_BIOS(1, "427gn2a", "FIC 486-VIP-IO 4.27GN2A") + ROMX_LOAD( "427gn2a.awd", 0x00000, 0x20000, CRC(035ad56d) SHA1(0086db3eff711fc710b30e7f422fc5b4ab8d47aa), ROM_BIOS(1)) + // 2: BIOS-String: 01/18/95-VT82C505-2A4L4000-00 / Version 4.26GN2A (01/18/95) + ROM_SYSTEM_BIOS(2, "426gn2a", "FIC 486-VIP-IO 4.26GN2A") + ROMX_LOAD( "486-vip-io.bin", 0x00000, 0x20000, CRC(907ed412) SHA1(5d2c584a230826935f56151a7c74419baf54796b), ROM_BIOS(2)) +ROM_END + +// Shuttle HOT-409 (6 16-bit ISA incl. 2 VLB, 2 8-bit ISA, 8 SIMM30, Cache: 64/128/256K+Tag in 2 banks) +// OPTi 82C495SX + 82C392SX + F82C206; MEGA-KB-1-WP +ROM_START( hot409 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0200-001343-00101111-111192-OPT495SX-0 / Version 2.0 + ROM_SYSTEM_BIOS(0, "hot409v20", "Shuttle HOT-409 V2.0") + ROMX_LOAD( "ami1992.bin", 0x10000, 0x10000, CRC(a19c3fd4) SHA1(404822c98344061b60883533395a89fe4902c177), ROM_BIOS(0)) + // 1: BIOS-String: 40-0204-001343-00101111-080893-OPT495SX-0 / OPTi495SX Version 3.0 + ROM_SYSTEM_BIOS(1, "hot409lba", "Shuttle HOT-409 V3.0 with LBA") + ROMX_LOAD( "409lba.rom", 0x10000, 0x10000, CRC(78c5e47e) SHA1(7f14a88a5548fc67dd00e73fd09745e899b93a89), ROM_BIOS(1)) + // 2: BIOS-String: 40-0200-001343-00101111-111192-OPT495SX-0 / VERSION 1.1 + ROM_SYSTEM_BIOS(2, "hot409v11", "Shuttle HOT-409 V1.1") + ROMX_LOAD( "amibios_hot409.bin", 0x10000, 0x10000, CRC(17729ee5) SHA1(ea3f5befe16ede7e9f4be3b367624745a6935ece), ROM_BIOS(2)) +ROM_END + +// Siemens-Nixdorf 486 mainboards and BIOS versions +// The same mainboards were used in various case versions to get the different model lines, so an identification by the mainboard number (Dxxx) is safest +ROM_START( pcd4x ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + // D756, was used in PCD-4Lsx, contains Cirrus Logic VGA ROM + ROM_SYSTEM_BIOS(0, "d756v320r316", "D756 BIOS V3.20 R3.16") + ROMX_LOAD( "fts_biosupdated756noflashbiosepromv320_320316_149.bin", 0x00000, 0x20000, CRC(2ab60725) SHA1(333b64424c08ecbbaf47110c99ad0335da211489), ROM_BIOS(0) ) + // D674, was used in PCD-4M, PCD-4Msx, PCD-4RSXA/4RA - this is a CPU card that is plugged into an ISA backplane; OSC: 14.31818 + // Chipset: LSI HT342-B-07, LSI HT321-D, Intel B6842-V31 AWARD(c)SNI UPI V4.3, IS9412BL PC87311AVF US4823312 - CPU: 486sx soldered onto the mainboard, but a socket for a 486DX is present - RAM: SIMM30x8 + // the CPU card can accept 16 bit "piggyback" modules, e.g. an ET4000 graphics card or a MFM harddisk controller to save ISA slots + // on board: IDE, Floppy, beeper, keyboard connector, parallel, 2xserial, RTC DS12887, connectors for NMI and keylock, 4 DIP switches labelled DX2, Upgrade, 25, color + // jumper X7: skip on/off, jumper x6: drv l/h + ROM_SYSTEM_BIOS(1, "d674v320r316", "D674 BIOS V3.20 R3.16") + ROMX_LOAD( "fts_biosupdated674noflashbiosepromv320_320316_144.bin", 0x00000, 0x20000, CRC(1293d27c) SHA1(22f36c4a5a0912011ed54ff917244f412208ffc0), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "d674v320r304", "D674 BIOS V3.20 R3.04") + ROMX_LOAD( "d674_27c1024_3.20.bin", 0x00000, 0x20000, CRC(dfdad89e) SHA1(6cb78d8b5c8822dc84970ba912bc66a5e7cd2fb4), ROM_BIOS(2) ) + // D802, was used in PCD-4HVL + ROM_SYSTEM_BIOS(3, "d802v320r316", "D802 BIOS V3.20 R3.34.802") + ROMX_LOAD( "fts_biosupdated802noflashbiosepromv320_320334_152.bin", 0x00000, 0x20000, CRC(fb1cd3d2) SHA1(98043c6f0299e1c56e5f266ea5f117ae456447ff), ROM_BIOS(3) ) + // D620 + ROM_SYSTEM_BIOS(4, "d620", "D620") + ROMX_LOAD( "w26361-d620-z4-01-5_award_v3.10_r2.02.bin", 0x00000, 0x20000, CRC(2708cc2a) SHA1(a399c938ffeba4cb28a22e54235f3f9c5e2892f6), ROM_BIOS(4) ) +ROM_END + + +// ***** 486 motherboards using the ALi M1487 M1489 chipset + +// Abit AB-PB4 REV.:1.2 - Chipset: ALi M1487 M1489, Winbond W83787F, W83768F - On board: Floppy, 2xser, 2xIDE, par +// ISA16: 3, PCI: 3, PISA: 1 - OSC: 14.3F5P - CPU: Socket 3 - BIOS: Award D2317569, 32pin +ROM_START( abpb4 ) // both BIOS versions end up in the Boot Block BIOS + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 10/30/95-ALI-1487/89-2A4KDA12C-5E / GREEN 486 PCI SYSTEM BIOS + ROM_SYSTEM_BIOS( 0, "pb4", "PB4") + ROMX_LOAD( "486-ab-pb4.bin", 0x00000, 0x20000, CRC(90884abc) SHA1(1ee11b026cb783b28cc4728ab896dbeac14eb954), ROM_BIOS(0)) + // 1: BIOS-String: 07/03/96-ALI-1487/89-2A4KDA1BC-F2 / GREEN PCI/ISA SYSTEM ROM + ROM_SYSTEM_BIOS( 1, "pb4pf2", "PB4P-F2") + ROMX_LOAD( "pb4p_f2.bin", 0x00000, 0x20000, CRC(9ab8d277) SHA1(10e424f5dd5c98877a5a7c9ae6205b2c442ac0e0), ROM_BIOS(1)) +ROM_END + +// EFA 486 APIO all BIOS versions boot into BootBlock BIOS +ROM_START( 486apio ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "a2", "A2") + ROMX_LOAD( "apioa2.bin", 0x00000, 0x20000, CRC(0cf343be) SHA1(3a5757c802a30fb0d8d4fd623bee02af3b91fdd7), ROM_BIOS(0)) + // 1: 07/23/96-ALI-1487/89-2A4KDE3HC-00 / N486APIO Ver 2.00 SMC665GT + ROM_SYSTEM_BIOS(1, "20sm", "2.0SM") + ROMX_LOAD( "apio2smc.bin", 0x00000, 0x20000, CRC(1ced0692) SHA1(8afca17f0d793a3266b04ce8d70a359a29de3af7), ROM_BIOS(1)) + // 2: BIOS-String: 03/05/96-ALI-1487/89-2A4KDE3JC-00 / N486APIO, Rev 2.1 + ROM_SYSTEM_BIOS(2, "ag2", "AG2") + ROMX_LOAD( "1019ag2.bin", 0x00000, 0x20000, CRC(4066124e) SHA1(7adbf528d8132122da4f950ee78931abd5d949e4), ROM_BIOS(2)) +ROM_END + +// MSI MS-4145 - Chipset: ALi M1487, M1489, W83787F, W83758F - CPU: Socket 3 - RAM: 3xSIMM72 - Cache: 8x28/32pin + TAG - ISA16: 4, PCI: 3 +// BIOS: 32pin - on board: 2xIDE, Floppy, par, 2ser +ROM_START( ms4145 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "ag56", "AG56") + ROMX_LOAD( "ag56.rom", 0x00000, 0x20000, CRC(217d7258) SHA1(bd0d484607fbcf54821822e20e4bf5fcaf456591), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "ag56p", "AG56P") + ROMX_LOAD( "ag56p.rom", 0x00000, 0x20000, CRC(f2737425) SHA1(e6058a98a7ca4c03d1c1b7d30602fe97d88bc04a), ROM_BIOS(1)) + // 2: + ROM_SYSTEM_BIOS(2, "ag56s", "AG56S") + ROMX_LOAD( "ag56s.rom", 0x00000, 0x20000, CRC(c015ed49) SHA1(4c447bab1cba9d38b99c2e36e0824809e876931e), ROM_BIOS(2)) +ROM_END + +// TMC Research Corporation PCI48AF - Chipset: ALi M1487, M1489, TMSIA 9347W/TC4069UBP, FDC37C665GT - CPU: Socket 3 - RAM: SIMM72x4, Cache: 4x32pin + TAG +// ISA16: 4, PCI: 4 - On board: 2xISA, Floppy, 2xpar, 2xser - Keyboard-BIOS: AMIKEY-2 +ROM_START( pci48af ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "af2", "AF2") + ROMX_LOAD( "pci48af2.rom", 0x00000, 0x20000, CRC(556113cc) SHA1(cbbbcaa300253e766bce5292ffdfedf72c76e287), ROM_BIOS(0)) + // 1: 03/25/96-ALI-1487/89-2A4KDM29C-00 / 486DX-AC-WBc-25/33/40/50/66/80/100/120/133-A2-ZG - boots to BootBlock BIOS + ROM_SYSTEM_BIOS(1, "afa", "AFA") + ROMX_LOAD( "pci48afa.bin", 0x00000, 0x20000, CRC(9127efb5) SHA1(cf77fcca00b6e48067caefa518bedb287f945147), ROM_BIOS(1)) + // 2: + ROM_SYSTEM_BIOS(2, "f2a", "F2A") + ROMX_LOAD( "48af-f2a.rom", 0x00000, 0x20000, CRC(1e0d8216) SHA1(c6e4342dea2b7feac6e239dc99aee65508f9c297), ROM_BIOS(2)) +ROM_END + +ROM_START( alim1489 ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: // V1.2A (with fake cache SRAM) - Chipset: ALi M1489, M1487, UM8663AF, UM8667 - BIOS: 10/10/94 AMI AD0153466 (32pin) - ISA16: 4, PCI: 3 + // On board: 2xser, Game, par, Floppy, 2xIDE - OSC: 14.31818 + ROM_SYSTEM_BIOS(0, "ali148901", "ALi M1489 #1") + ROMX_LOAD( "ali.bin", 0x00000, 0x20000, CRC(d894223b) SHA1(088a94d2425f0abc85fafa922a5c6792da608d28), ROM_BIOS(0)) + // 1: Chipset: ALi M1489 A1, M1487 B1, GoldStar Prime 3b - CPU: Am486DX4-100 - RAM: 2xSIMM72, Cache: 9x32pin, used: 5xCY7C199-15PC + // BIOS: AMI 32pin - ISA16: 4, PCI: 3 - On board: 2xIDE, Floppy, 2xser, par + ROM_SYSTEM_BIOS(1, "ali148902", "ALi M1489 #2") + ROMX_LOAD( "ali_pci486v1-hj3.bin", 0x00000, 0x20000, CRC(fca45439) SHA1(a4bad38301c9e7f780a95a07b7062f0a277a7a10), ROM_BIOS(1)) +ROM_END + + +// ***** 486 motherboards using the CONTAQ 82C596 chipset + +// MSI MS-4125 - Chipset: CONTAQ 82C596 SiS 85C206 - ISA8: 1, ISA16: 3, ISA16/VL: 2 - BIOS: AMI 486DX ISA BIOS AA65441044 (28pin) - Keyboard-BIOS: AMI/Intel P8942AHP +// BIOS-String: 40-0104-001169-00101111-111192-CTQ596-0 / AC5E 052193 +ROM_START( ms4125 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD("ms4125.bin", 0x10000, 0x10000, CRC(0e56b292) SHA1(9db26e8167b477c550d756d1ca2363283ebff3ed)) +ROM_END + +// Diamond Flower, Inc. (DFI) 486-CCV Rev B - Chipset: CONTAQ 82C596, KS83C206EQ - BIOS: 11/11/92 AMI AB8644083 (28pin) - Keyboard-BIOS: AMIKEY-2 +// BIOS-String: 40-0100-ZZ1211-00101111-111192-CONTAQ/5-0 - OSC: 14.31818MHz - ISA8: 2, ISA16: 4, ISA16/VL: 2 +ROM_START( 486ccv ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "contaq.bin", 0x10000, 0x10000, CRC(2ac46033) SHA1(a121c22ded4932e3ba8d65c2b097b898f02147c7)) +ROM_END + + +// ***** 486 motherboards using the OPTi495SLC chipset + +// QDI PX486P3 - Chipset: OPTi 82C495SLC, F82C206 - CPU: 486 - BIOS: 11/11/92 AMI (28pin) +// Keyboard-BIOS: AMIKEY - ISA8: 1, ISA16: 3, ISA16/VL: 3 (one marked MASTER/SLAVE, two marked SLAVE) +ROM_START( px486p3 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0402-428003-00101111-111192-OP495SLC-0 / PX486DX33/50P3 IVN 2.0 19/11/1993 + ROM_SYSTEM_BIOS(0, "ivn20", "IVN 2.0") + ROM_LOAD( "px486p3.bin", 0x10000, 0x10000, CRC(4d717aad) SHA1(2d84cf197845d58781f77e4d539ca994fd8733c8)) + // 1: BIOS-String: 40-0401-428003-00101111-111192-OP495SLC-0 / PX486DX33/50P3 IVN 1.0 25/06/1993 + ROM_SYSTEM_BIOS(1, "ivn10", "IVN 1.0") + ROMX_LOAD( "qdi_px486.u23", 0x10000, 0x10000, CRC(c80ecfb6) SHA1(34cc9ef68ff719cd0771297bf184efa83a805f3e), ROM_BIOS(1)) +ROM_END + +// NAT48PV-1.0 VL - Chipset:82C495SLC, Chips F82C206J - RAM: 8xSIMM30, Cache: 9xIS61C256A - OSC: 14.31818 - BIOS: AMI 486DX ISA BIOS (28pin) AA5312581 +// Keyboard-BIOS: MEGA-KB-F-WP P8042AHP - ISA8: 2, ISA16: 3, ISA16/VL: 2 +// 40-040A-001291-00101111-111192-OP495SLC-0 / 486DX-OP-WBq-25/33/50-K2-ZZ +ROM_START( nat48pv ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "amibios_aa5312581.bin", 0x10000, 0x10000, CRC(8a788c79) SHA1(050972b7a369a463d6654ec52c0804002e9bcb37)) +ROM_END + + +// ***** 486 motherboards using the OPTi OPTi 82C392, 82C493, 82C206 chipset + +// Auva-Cam-33-P2 = See-Thru Sto486Wb - CPU: 486 - ISA8: 1, ISA16: 7 - Chipset: OPTi 82C392, 82C493, 82C206 +// MR BIOS (tm) V1.30 +ROM_START( sto486wb ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "opti_82c493_486_mr_bios_v130.rom", 0x10000, 0x10000, CRC(350d5495) SHA1(4f771ef5fe627e0556fb28f8972e545a0823a74d)) +ROM_END + +// Silicon Valley Computer, Inc. 486WB6A3.B1 - Chipset: OPTi 82C493/392, F82C206 - BIOS: AMI 486 BIOS ZZ342708 - Keyboard BIOS:AMI KB-BIOS-VER-F +// CPU: Intel 80486DX-33, secondary socket - RAM: 8xSIMM30, Cache: 9xMosel MS6264A-20NC - OSC: 33.333MHz, 14.31818 - ISA8: 1, ISA16: 6, ISA16/RAM extension: 1 +ROM_START( 486wb6a3 ) // BIOS String: 40-0101-ZZ9999-00101111-060691-OPWBSX-F + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486_ami.bin", 0x10000, 0x10000, CRC(1f5e9263) SHA1(534a6ace19ba6185614e04e3bd2d0aabe1193e2c)) +ROM_END + +ROM_START( op82c392 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: 486-A4865-A4866-XX V2 1 COMP - CPU: 486DX-33 - Chipset: Opti 82C392, 82C493, Opti F82C206 - BIOS: 486DX AMI (28pin) - Keyboard-BIOS: AMI + // BIOS-String: - ECB: 1, ISA8: 2, ISA16: 5 - OSC: 14.318, 66.000000MHz - RAM: 8xSIMM30, Cache: 16 sockets +1 provided + ROM_SYSTEM_BIOS(0, "a4865", "A4865") + ROMX_LOAD( "a4865-a4866.bin", 0x10000, 0x10000, CRC(9c726164) SHA1(b6ad8565a489b9d5991eea37905be2e6fc59fa48), ROM_BIOS(0)) + // 1: Chipset: OPTi 82C392, 82C493, UMC UM82C206L - CPU: i486DX-33, FPU socket provided - OSC: 34.000MHz, 14.31818 - Keyboard-BIOS: AMI/Intel P8942AHP + // BIOS: AMI 486 BIOS Z600436 - BIOS-String: 40-0131-425004-01001111-070791-OPWB493-0 / ABC COMPUTER CO., LTD. - 40-0101-DK1343-00101111-00101111-060691-OPWBSX-0 - ISA8: 2, ISA16: 6 + ROM_SYSTEM_BIOS( 1, "82c493", "82C493") + ROMX_LOAD( "486-920087335.bin", 0x10000, 0x10000, CRC(38571ffe) SHA1(aa6048213139c88901aca9cd38251a3937b6e52d), ROM_BIOS(1)) + // 2: Chipset: OPTi 82C392, 82C493, Chips 206 - CPU: two sockets provided - RAM: 8xSIPP30, on board RAM/Cache? photo too blurry - Keyboard BIOS: Intel/AMI + // OSC: 66.666MHz, 14.31818 - ISA8: 1 (solder pads for memory slot provided), ISA16: 7 - BIOS-String: 40-0101-009999-00101111-060691-OPWBSX-0 / OPTi-WB GW486SX/DX BIOS, July 3, 1992 + ROM_SYSTEM_BIOS( 2, "060691", "06/06/91") + ROMX_LOAD( "gw486sxdx.bin", 0x10000, 0x10000, CRC(99ecd9ce) SHA1(616bc1192c0ffb9d90f8aa32d93a8badc45f9d56), ROM_BIOS(2)) +ROM_END + + +// motherboards using the OPTi 82C802A, 82C602A chipset + +// Edom MV035F - Chipset: OPTi 82C802A, 82C602A - CPU: TI 486DX2-80 - RAM: 4xSIMM30, 3xSIMM72, Cache: 4x32pin, 4x28pin, TAG +// BIOS: 28pin - Keyboard-BIOS: VIA - ISA16: 5, ISA16/VL: 3 +// From the source: "The seller claimed that it POSTed, but all the BIOS options were grayed out. I pulled and dumped the BIOS +// chip, ran it through MODBIN and found out the OEM of the board simply set all BIOS setup options to 'SHOW-ONLY'. I set all +// except PCI CONFIGURATION to 'Enabled' (since this board doesn't have any PCI slots), blanked the EPROM and burned the modified +// BIOS to it, and now I can set all CMOS setup options normally." +// BIOS-String reflects the edit: 11/17/95-OPTi-802G-2C4UKW01-00 / Computer Spirit v1.0 (Hack 1.0 by Eep386 +ROM_START( edmv035f ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "mf035fed.bin", 0x10000, 0x10000, BAD_DUMP CRC(5c1ce352) SHA1(c7944b06e4a3473bb720caa5043f4b55bccf3835)) +ROM_END + +// Octek Hippo DCA2 - Chipset: OPTi 802G - BIOS: 28pin - CPU: Socket 3 - ISA8: 2, ISA16: 3, ISA16/VL: 3 - RAM: 4xSIMM72, Octek claimed, Cache would be taken out of main RAM +ROM_START( ochipdca2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 10/27/94-OPTI-802G-2C4UKO01-00 / (2C4UKO01) EVALUATION ROM - NOT FOR SALE + ROM_SYSTEM_BIOS(0, "hv2433", "AWARD HV2433") + ROMX_LOAD( "hv2433.awa", 0x10000, 0x10000, CRC(d6179601) SHA1(8a9c7ec959f6626268e0e242760439272fc9e28c), ROM_BIOS(0)) + // 1: beep code + ROM_SYSTEM_BIOS(1, "h2433", "AMI H2433") + ROMX_LOAD( "h2433.ami", 0x10000, 0x10000, CRC(a646a191) SHA1(086ae94554e3c2b292f2e32b5cb080c15dfa3e0b), ROM_BIOS(1)) + // 2: beep code L-H-H-L + ROM_SYSTEM_BIOS(2, "mr321", "MR-BIOS 3.21") // supports AMD X5-133 + ROMX_LOAD( "095061.bin", 0x10000, 0x10000, CRC(0a58cab2) SHA1(e64d6ca0bad6eeed492260853d7d60cd2a60a222), ROM_BIOS(2)) + // 3: beep code L-H-H-L + ROM_SYSTEM_BIOS(3, "mr31", "MR-BIOS 3.1") + ROMX_LOAD( "dca2mr31.rom", 0x10000, 0x10000, CRC(43b7415f) SHA1(45df892d146b8e2594274773c93d1623207b40fc), ROM_BIOS(3)) +ROM_END + + +// Motherboards using the Opti 82C895 82C602A chipset + +// ExpertChip EXP4044 - CPU: Socket3 - Chipset: OPTi 82C895, 82C602 - RAM: 4xSIMM30, 2xSIMM72, Cache: 4x28pin, 4x32pin + TAG +// Keyboard-BIOS: MEGAKEY or Winbond W83C42 - ISA16: 3, ISA16/VL: 3 +// BIOS-String: 06/23/94-OPTI-802G-2C4UKD01-00 / EXP4044 GREEN BIOS Ver 1.1 +ROM_START( exp4044 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD("4ecw001.bin", 0x10000, 0x10000, CRC(cf186fa4) SHA1(d65cc2f2c6feaa1a537319aaef86df12b44afdec)) +ROM_END + +// Jetway J-403TG +ROM_START( jwj403tg ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: JETWAY J-403TG (VER.D2E) Chipset: OPTi 82C895, 85C602 - CPU: Socket 3 - Keyboard BIOS: AMIKEY-2 - + // RAM: 4xSIMM32, 3xSIMM72, Cache: 8xW24257AK-15, 1xW24129AK - ISA16: 5, ISA16/VLB: 3 (2xMASTER, 1xSLAVE) + ROM_SYSTEM_BIOS(0, "verd2e", "VER.D2E") // BIOS-String: 40-0101-428060-00101111-111192-UMC491C-0 + ROMX_LOAD( "ver_d2e.bin", 0x10000, 0x10000, CRC(5d3b86bb) SHA1(d7c3cfbb5b858efacc7cee872a4ef5c9666f9d06), ROM_BIOS(0)) + // 1: JETWAY J-403TG GREEN VLB ver 2.0 - Chipset: OPTi 82C895, second IC with Energy Star logo - BIOS: Award 486DX J156079 - Keyboard BIOS: VIA VT82C42N + // CPU: Socket 3 - RAM: 4xSIMM30, 3xSIMM72, Cache: 8xW24257AK-15 - ISA8: 2, ISA16: 3, ISA16/VLB: 3 + ROM_SYSTEM_BIOS(1, "greenver20", "GREEN VLB ver 2.0") // BIOS-String: 07/21/94-OPTI-802G-2C4UKJ11-00 / V1.A + ROMX_LOAD( "403tg.bin", 0x10000, 0x10000, CRC(41ebe3e8) SHA1(567d61c5912cfb5fbfc9a1b674e7edad09a2165c), ROM_BIOS(1)) + // 2: JETWAY J-403TG VLB Rev D - Chipset: OPTi 82C895, 82C602 - BIOS: AMI 486DX ISA BIOS AB5257763 - Keyboard BIOS: JETkey V5.0 + // CPU: 80486DX - RAM: 4xSIMM30, 3xSIMM72, Cache: 8x32pin DIP (used: 8xH61256-20) - ISA8: 2, ISA16: 3, ISA16/VLB: 3 + ROM_SYSTEM_BIOS(2, "revd", "Rev D") // BIOS-String: 40-P301-001276-00101110-121593-OPTi895-H - blank screen + ROMX_LOAD( "b2790126", 0x10000, 0x10000, CRC(b2790126) SHA1(dad277c91dac9daffcd1e3f3e9a1a1e59c92e72e), ROM_BIOS(2)) + // 3: MR BIOS for the 82C895 chipset - MR BIOS (r) V2.02 + ROM_SYSTEM_BIOS(3, "82c895", "82C895") + ROMX_LOAD("opt895mr.mr", 0x10000, 0x10000, CRC(516cb091) SHA1(4c5b51cd05974001da4b764b4b14987657770a45), ROM_BIOS(3)) +ROM_END + +// QDI V4P895P3/SMT V5.0 - Chipset: Opti 82C895 82C602A - CPU: Am486DX2-66 - ISA8: 1, ISA16: 3, ISA16/VL: 3 +// RAM: 4xSIMM30, 2xSIMM72, Cache: 8xUM61256FK-15 - BIOS: AMI 486DX ISA BIOS Ac0928698 (28pin in a 32pin socket) - Keyboard-BIOS: AMIKEY-2 +ROM_START( v4p895p3 ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-v4p895p3-smt.bin", 0x10000, 0x10000, CRC(683f8470) SHA1(eca1c21a8f8c57389d9fdf1cd76d2dec0928524a)) +ROM_END + +// Shuttle HOT-419 - Chipset: OPTi 92C895A, 82C602A - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 8+1 UM61256K-15 - ISA8: 2, ISA16:3, ISA16/VL: 3 +// BIOS: AMI AB0585433 (28pin) - Keyboard-BIOS: AMIKEY-2 +ROM_START( hot419 ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "072594", "07/25/94") + ROMX_LOAD( "hot419_original_bios.bin", 0x10000, 0x10000, CRC(ff882008) SHA1(1a98d61fd49a2a07ff4f12ccba55cba11e4fde23), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "419aip06", "419AIP06") + ROMX_LOAD( "419aip.rom", 0x10000, 0x10000, CRC(389ca65d) SHA1(457491c60aa45499e2cd8dad9db3bf3312977a4f), ROM_BIOS(1)) +ROM_END + +// TMC PAT48PG4-V1.20 - BIOS Version: Award 10/13/95 - Chipset: OPTi 82C895+82C602 - EPROM Label: 486 AWARD SOFTWARE 1984-1995 T1103040 +// Keyboard BIOS: AMIKEY-2 - CPU: socket for 80486 - RAM: 4xSIMM30, 2xSIMM72, Cache: 9xISSI IS61M256-15N - ISA16: 4, ISA16, VLB: 3 +ROM_START( tmpat48pg4 ) // BIOS-String: 10/13/95-OPTI-802G-2C4UKM21-00.00-00 / 486DX-OP-WOe-25/33/40/50/66/80/100/120-C7-ZG + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "award.bin", 0x10000, 0x10000, CRC(c217214b) SHA1(583820b2fe96ca4bfacf9267800afe7cc76e5ffa)) +ROM_END + + +// Motherboards using the SiS 85C461 chipset + +// Abit AB-AV4 (aka VL-BUS 486) - Chipset: SiS 85C461, HM5818A - BIOS Version: AMI 11/11/92 486DX ISA BIOS AA7247480 +// Keyboard BIOS: AMI-KB-H-WP - CPU: socket for 80486PGA, solder pads for QFP486sx - RAM: 8xSIMM30, Cache: 7xW24257AK-20, 1xEm81256B-20P, 1x71256S20TP +// ISA16: 5, ISA16/VLB: 3 - OSC: 14.31818 +ROM_START( abav4 ) // BIOS String: 40-01BB-001247-00101111-111192-SIS461 / CACHE 486 SYSTEM BIOS + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "amibios.bin", 0x10000, 0x10000, CRC(7bf8142e) SHA1(17e09eebabc0d2c393d27db38b571af3c0ccbb41)) +ROM_END + +// ASUS ISA-486SV2 - Chipset: SiS 85C461 - BIOS: AMI 486DX ISA BIOS AA7892378 28pin - Keyboard-BIOS: Intel/AMI +// BIOS-String: 40-110A-001292-00101111-111192-I486SI-0 - ISA16: 5, ISA16/VL: 2 - CPU: 486DX in a blue socket (overdrive ready) +ROM_START( a486sv2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-asus isa-486sv2.bin", 0x10000, 0x10000, CRC(de925130) SHA1(2e3db7a1d4645082290d6303a16446af2959f34a)) +ROM_END + +// GENOA TurboExpress 486 VL ASY 01-00302 - Chipset: SiS 85C407 85C461 - CPU: Socket3 - OSC: 14.31818MHz - ISA16: 4, ISA16/VL: 3 - BIOS: AMI 486DX ISA BIOS AB0562153 (28pin) +// BIOS-String: 40-0100-006156-00101111-080893-SIS461-0 / GENOA TurboExpress 486VL - 3 (Ver. C) - Keyboard-BIOS: AMIKEY +ROM_START( gete486vl ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-genoa_vlb.bin", 0x10000, 0x10000, CRC(9be0f329) SHA1(3b1adedd6aad40c623757e4976e0dcadb253f255)) +ROM_END + +// Lucky Star UCM-486V30 (aka SIS486 3-VLBUS) - BIOS/Version: AMI 01/14/1993 SUPPORT VESA, 486DX ISA BIOS AA8580239 - Keyboard BIOS: AMI MEGA-KB-H-WP +// Chipset: SIS 85C461, HM6818A - CPU: P24T socket - OSC: 14.31818 - RAM: 8xSIMM30, Cache: 9x28pin DIP +ROM_START( lsucm486v30 ) // BIOS string: 40-0100-001256-00101111-111192-SIS3486-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ucm-486v30.bin", 0x10000, 0x10000, CRC(90ec73a2) SHA1(2fc17f7eed09c2f7d0139670677cc84bbc2964de)) +ROM_END + +// SOYO 486 VESA 025D2 - Chipset: SiS 85C461, 85C407 - BIOS: AMI - Keyboard BIOS: AMI (c)1988 - CPU: i486sx-33, full 486 socket provided +// RAM: 8xSIMM30, Cache: 8x28pin - ISA8: 1, ISA16: 4, ISA16/VL: 2 - BIOS-String: 40-0100-001102-00101111-080893-SIS461 / REV MG +ROM_START( so025d2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "soyo-486-vesa.bin", 0x10000, 0x10000, CRC(da798d7b) SHA1(15a8c1e244ee29ef5c61e05659f8ec7f8eaa8ab7)) +ROM_END + +// ***** 486 motherboards using the SiS BTQ 85C401/85C402 + 85C206 chipset + +// ABIT AB-AX4 - Chipset: SIS BTQ 85C401, 85C402, 85C206 - BIOS: AMIBIOS 06/06/92 - Keyboard BIOS: AMI - CPU: socket for 80486 +// RAM: 8xSIMM30, Cache: 8xEtronTech Em51256A-20P, 1X AS7C256-20PC - ISA8: 1, ISA16: 6 - OSC: 33.333MHz, 14.31818 +ROM_START( abax4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: X0-01AA-001247-00101111-060692-SISAUTO-0 / AX4 ISA SYSTEM BIOS + ROM_SYSTEM_BIOS(0, "060692", "ABIT AB-AX4 06/06/92") + ROMX_LOAD( "486dx_dump.bin", 0x10000, 0x10000, CRC(c7af4380) SHA1(59507a0f7d929ac19c5b56334f54643127c0d2be), ROM_BIOS(0)) + // 1: BIOS-String: 30-0200-D01247-00101111-070791-SIS486 / AT486DX 33MHz BIOS + ROM_SYSTEM_BIOS(1, "070791", "ABIT AB-AX4 07/07/91") + ROMX_LOAD( "486-aa1177369.bin", 0x10000, 0x10000, CRC(530535de) SHA1(7f6e627a77ebcaec97f08e6c797d31e9321e26fc), ROM_BIOS(1)) +ROM_END + +// ASUS ISA-486 - Rev. 1.4 - Chipset: SiS BTQ 85C401/85C402 + 85C206 - BIOS/Version: AMI 486DX ISA BIOS 05/05/91 AA1258865 - CPU: Intel 80486DX-33, FPU socket for 4167 provided +// RAM: 8xSIMM30, Cache: 8x28pin DIP (4x71256 fitted) - OSC: 14.31818, 33.000MHz - DIP6: 111000 - ISA8/RAM extension: 1, ISA16: 7 - +ROM_START( a486isa ) // BIOS String: 40-0102-001292-00101111-050591-SIS-486-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "isa-486.bin", 0x10000, 0x10000, CRC(57375912) SHA1(8035b5d1cfe824a20a94571a57b86fdb4018f073)) +ROM_END + +// Mitac MBA-029 - Chipset: SIS BTQ 85C401, 85C402, 85C206 - BIOS: AMI - CPU: 486 socket - OSC: 14.34818, xxxxx (unreadable) +// RAM: 4xSIMM30, Cache: 8x28pin - ISA 8: 1 (not soldered in), ISA16: 6 +ROM_START( mba029 ) // BIOS-String: 30-0200-ZZ1594-00101111-070791-SISAUTO-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "mba-029_bios_27c512.bin", 0x10000, 0x10000, CRC(8d660697) SHA1(6b2be9ec9a2d12c9348c26ac25514af406fa752e)) +ROM_END + +// ***** 486 motherboards using the SiS 85C496/85C497 chipset + +// A-Trend ATC-1425A - Chipset: SiS 85C496, 85C497 - RAM: 4xSIMM72, Cache: 4x32pin + TAG - ISA16: 4, PCI: 3 +// on board: 2xIDE, Floppy, 2xser, par - BIOS: 32pin +ROM_START( atc1425a ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Boot block - BIOS-String: 09/07/95-SiS-496-497/A/B-2A4IBA2HC-00 / 1425 SIS 496/7 BIOS VER : 1.8N 1995/09/25 + ROM_SYSTEM_BIOS(0, "ver18n", "ver1.8N") + ROMX_LOAD( "atc-1425a_original.bin", 0x00000, 0x20000, CRC(040ebc6c) SHA1(266ed07ef13c363234c7a2a88719badeeed9dc4c), ROM_BIOS(0)) + // 1: Boot block - BIOS-String: 11/03/95-SiS-496-497/A/B-2A4IBA2HC-00 / ATC-1425A SIS496/7 BIOS VER:2.0N 11-04-95 + ROM_SYSTEM_BIOS(1, "ver20n", "ver2.0N") + ROMX_LOAD( "atc-1425a_ver2_0n.bin", 0x00000, 0x20000, CRC(0af2f6c0) SHA1(a1ce34bdee5119b9ae1d8530fcf611ca2f9d592e), ROM_BIOS(1)) +ROM_END + +// A-Trend ATC-1425B - BIOS Version: Award 4.51PG 04/18/96 - Chipset: SiS 85C496/85C497, Winbond - Keyboard BIOS: Holtek HT6542B - CPU: Socket 3 +// RAM: 4xSIMM72, Cache: 4xUM61512AK-15, 1xISSI IS61C256AH-15N - on board: 2xIDE, Floppy, par, 2xser - ISA16: 4, PCI: 3 +ROM_START( atc1425b ) // Boot block - BIOS String: 04/18/96-SiS-496-497/A/B-2A4IBA2BC-00 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "1425b231.rom", 0x00000, 0x20000, CRC(1a19f34d) SHA1(09bb5e35ef07b57942cbca933f2a0334615a687e)) +ROM_END + +// Abit AB-PI4(T) - Bios: 32pin - Keyboard-BIOS: Winbond 83C42 - CPU: Socket 3 - ISA16: 4, PCI: 3 - Chipset: SiS 85C495, 85C497 +// RAM: 4xSIMM72, Cache: 9x32pin (occupied: 4xW24512AK-20, 1xW2457AK) - On board: 2xIDE +ROM_START( abpi4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: &09/25/95-SiS-496-497/A/B-2A4IBA11C-0B / GREEN 486 PCI SYSTEM BIOS - boots into "boot block" rescue BIOS + ROM_SYSTEM_BIOS(0, "pi4092595", "AB-PI4(T) 09/25/95") + ROMX_LOAD( "pi4_0b.bin", 0x00000, 0x20000, CRC(2cd67f19) SHA1(4cf0b4ff10645371361d3782c8be06c463e70219), ROM_BIOS(0)) + // 1: 486IP-B-2-A (ABIT PI4/PI4T PCI clone) REV:2B.31 - Chipset : SiS 496/497 (NV/NU) - BIOS : AWARD 2a4ibb61 - Keyboard BIOS: JETkey V5.0G + // RAM: 4xSIMM72, Cache: 9x32pin DIP (filled: 9xUM61256FK-15 CPU: Socket 3 - on board: 2xIDE - ISA16: 4, PCI: 3 + // BIOS-String : 10/02/95-SiS-496-497/A/B-2A4IBB61C-00 - boots into "boot block" rescue BIOS + ROM_SYSTEM_BIOS(1, "486ipb2a", "486IP-B-2-A") + ROMX_LOAD( "486ip-b-2-a.bin", 0x00000, 0x20000, CRC(8b1e3094) SHA1(84e8269f310b53497e63791fd3c081d7f631b686), ROM_BIOS(1)) +ROM_END + +// Abit AB-PM4 +// BIOS-String: 09/04/95-SiS-496-497/A/B-2A4IBA13C-0C / GREEN 486 PCI SYSTEM BIOS +ROM_START( abpm4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pm4_0c.bin", 0x00000, 0x20000, CRC(eaad7812) SHA1(81670c44e30fa8b8ac0aa28a5c367819ff1ca73c)) +ROM_END + +// Abit AB-PV4 +// BIOS-String: 09/26/95-SiS-496-497/A/B-2A4IBA12C-0A / GREEN 486 PCI SYSTEM BIOS +ROM_START( abpv4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pv4v_0a.bin", 0x00000, 0x20000, CRC(91de48d5) SHA1(2e873de152870270f51b5b2c4a30f2611364e739)) +ROM_END + +// Aopen AP43 - CPU: Socket 3 - Chipset: SiS 85C496, 85C497, SMC FDC37C665GT - RAM: SIMM72x4, Cache: 9x32pin, used: 9xUM61256FK-15 +// BIOS: 32pin - Keyboard-BIOS: AMIKEY-2 - on board: IDEx2, Floppy, par, 2xser +// constant chirping +ROM_START( aoap43 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "original", "original") + ROMX_LOAD( "aopen_ap43_original.bin", 0x00000, 0x20000, CRC(65075fe4) SHA1(9b150e0b37b4ff3cbfcd8bd2286e1e575c34de02), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "updated", "updated") + ROMX_LOAD( "aopen_ap43_updated.rom", 0x00000, 0x20000, CRC(68a5595e) SHA1(94551037e9d0b3fb644726b7ba66e676aa58b81a), ROM_BIOS(1)) +ROM_END + +// ASUS PCI/I-A486S (4xSIMM72, Cache: 128/256/512KB, 1 EISA) - BIOS: 32pin +// SiS 85C496/85C497 chipset; SMC 37C665 I/O; AMIKEY-2, S3 Trio 64 on board VGA, the manual also mentions Trio 32 +ROM_START( aa486s ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 05/22/95/SiS-496-497B-PCI-A486-0-00 / #401A0-0203 + ROM_SYSTEM_BIOS(0, "v203", "ASUS PCI/I-A486S V2.03") + ROMX_LOAD( "si4a0203.awd", 0x00000, 0x20000, CRC(95fcb7c6) SHA1(c19164d67af18c774e6eb06bd1570d95a24b2856), ROM_BIOS(0)) + // 1: BIOS-String: 11/27/95-SiS-496-497B-PI-A486SC-00 / #401A0-0304 - boots into "boot block" rescue BIOS + ROM_SYSTEM_BIOS(1, "v304", "ASUS PCI/I-A486S V3.04") + ROMX_LOAD( "si4a0304.awd", 0x00000, 0x20000, CRC(a00ad907) SHA1(598d97ea29f930a9359429dc540d27bfdd0fcd20), ROM_BIOS(1)) +ROM_END + +// ASUS PVI-486SP3 (Socket 3, 2xSIMM72, Cache: 128/256/512KB, 2 IDE, 3 PCI, 4 ISA, 1 VLB) +// SiS 85C496 + 85C497; UMC UM8669F; AMIKEY-2; BIOS: 29EE010 (32pin) +ROM_START( a486sp3 ) + ROM_REGION32_LE(0x20000, "bios", 0) // Winbond W29EE011-15 + // 0: BIOS-String: 07/22/94-SATURN-P/I-4SP3-00 / #401A0-0207 + ROM_SYSTEM_BIOS(0, "v207", "ASUS PVI-486SP3 V2.07") + ROMX_LOAD( "awsi0207.bin", 0x00000, 0x20000, CRC(0cb862aa) SHA1(7ffead05c1df47ec36afba395191145279c5e789), ROM_BIOS(0)) + // 1: BIOS-String: 07/22/94-SATURN-P/I-4SP3-00 / #401A0-0207 + ROM_SYSTEM_BIOS(1, "v2737", "ASUS PVI-486SP3 V2.07 #2") + ROMX_LOAD( "awsi2737.bin", 0x00000, 0x20000, CRC(8cd9a89c) SHA1(6c68c23cc5e8ae66261e9fe931f2ce07efe767b6), ROM_BIOS(1)) + // 2: BIOS-String: 06/25/96-SiS-496-497B-PVI-4SP3C-00 / #401A0-0306 - boots to Award BootBlock BIOS V1.0 + ROM_SYSTEM_BIOS(2, "v306", "ASUS PVI-486SP3 V3.06") + ROMX_LOAD( "si4i0306.awd", 0x00000, 0x20000, CRC(fc70371a) SHA1(96b10cfa97c5d1d023687f01e8acb54f263069b2), ROM_BIOS(2)) + // 3: BIOS-String: 02/11/98-SiS-496-497B-PVI-4SP3C-00 / #401A0-0307 - boots to Award BootBlock BIOS V1.0 + ROM_SYSTEM_BIOS(3, "v307", "ASUS PVI-486SP3 V3.07") + ROMX_LOAD( "si4i0307h.bin", 0x00000, 0x20000, CRC(99473cc0) SHA1(a01d253cf434a31e0ca6f6cd2b9026ca424eb463), ROM_BIOS(3)) + // 4: BIOS-String: 08/08/95-SiS-496-497B-PVI-4SP3C-00 / #401A0-0301 - boots to Award BootBlock BIOS + ROM_SYSTEM_BIOS(4, "v301", "ASUS PVI-486SP3 V3.01") + ROMX_LOAD( "4siw003.bin", 0x00000, 0x20000, CRC(47a1d815) SHA1(370bfb895646518884a2a82881721efc3aeb04d1), ROM_BIOS(4)) + // 5: BIOS-String: 11/23/94-SiS-496-497-PVI-4SP3-00 / #401A0-0101 + ROM_SYSTEM_BIOS(5, "v10101", "ASUS PVI-486SP3 V1.01 #1") + ROMX_LOAD( "0101.bin", 0x00000, 0x20000, CRC(7862ca56) SHA1(e609585893b23db10c4ae7d2abd17cc9dda964b6), ROM_BIOS(5)) + // 6: BIOS-String: 11/23/94-SiS-496-497-PVI-4SP3-00 / #401A0-0101 - screen remains blank + ROM_SYSTEM_BIOS(6, "v10102", "ASUS PVI-486SP3 V1.01 #2") + ROMX_LOAD( "si4i0101.awd", 0x00000, 0x20000, CRC(18652037) SHA1(7460e90b0a9c825d2e47943a714049fe9e943760), ROM_BIOS(6)) + // 7: BIOS-String: 07/15/95-SiS-496-497B-PVI-4SP3C-00 / #401A0-0205 - boots to Award BootBlock BIOS + ROM_SYSTEM_BIOS(7, "v205", "ASUS PVI-486SP3 V2.05") + ROMX_LOAD( "si4i0205.awd", 0x00000, 0x20000, CRC(d90d91b0) SHA1(043151d121780ff56ce32b9a48e9bbccd324625f), ROM_BIOS(7)) + // 8: BIOS-String: 04/05/96-SiS-496-497B-PVI-4SP3C-00 / #401A0-0305 - boots to Award BootBlock BIOS + ROM_SYSTEM_BIOS(8, "v305", "ASUS PCI/I-486SP3 V3.05") + ROMX_LOAD( "si4i0305.awd", 0x00000, 0x20000, CRC(2f90e63e) SHA1(a4f16753b5a57d65fba7702ca28e44f10bd5bb6c), ROM_BIOS(8)) +ROM_END + +// Chaintech 486SPM - CPU: Socket 3 - Chipset: SiS 85C497, 85C496, UMC UM8663BF - RAM: 4xSIMM72, Cache: 8xIS61C1024-10N, W24512AK-10 +// BIOS: Award E0822859 - Keyboard-BIOS: VIA VT82C42N - on board: 2xISA, Floppy, 2xser, par - ISA16: 4, PCI: 3 +ROM_START( ch486spm ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 12/21/95-SiS-496-497/A/B-2A4IBC3IC-00 + ROM_SYSTEM_BIOS(0, "original", "original") + ROMX_LOAD( "chaintech_486spm.bin", 0x00000, 0x20000, CRC(a0c9045a) SHA1(1d0b1994574437549c13541d4b65374d94c9a648), ROM_BIOS(0)) + // 1: 12/21/95-SiS-496-497/A/B-2A4IBC3IC-00 / Chaintech 486SPM v2015 PS/2 + ROM_SYSTEM_BIOS(1, "ps2", "PS2 mouse enabled") + ROMX_LOAD( "486spm-p.bin", 0x00000, 0x20000, CRC(35b5cb76) SHA1(965b212b28a5badd8d8f4769aa9edc88e47bc925), ROM_BIOS(1)) +ROM_END + +// Chaintech 4SPI - Chipset: SiS 85C496 85C497 - BIOS Version: Award v4.50G E0671975 - Keyboard BIOS: Lance Green LT38C41 +// CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9x32pin DIP (used: 4xW24512AK-15, 1xEM51256-15PL) - On board: 2xIDE +// ISA6: 5, PCI: 3 +ROM_START( ch4spi ) // BIOS String: 02/16/95-SiS-496-497/A/B-2A4IBC31-B2 / 02/17/1995 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4spibckp.bin", 0x00000, 0x20000, CRC(29b15737) SHA1(e9cb5402eb25a100a15d5ccc520cfa76c7be99a6)) +ROM_END + +// Freetech 486F55 - Chipset: SiS 496/497 - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 128KB/256KB/512KB - ISA16: 4, PCI: 3 - +// On board: 2xser, par, 2xIDE, Floppy - BIOS: Award +ROM_START( ft486f55 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "xsf", "XS-F") + ROMX_LOAD( "55xs-f.bin", 0x00000, 0x20000, CRC(b7ee53af) SHA1(6357241ac3c317f60465bf5ad77d821a7dc68b3b), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "xsg", "XS-G") + ROMX_LOAD( "55xs-g.bin", 0x00000, 0x20000, CRC(adaa3a28) SHA1(27c36b564d11f1dc9a8c6f6d075eeaf850944c08), ROM_BIOS(1)) +ROM_END + +// Jamicon KM-S4-1 VER 1.1 - Chipset: SiS 85C496/85C497 (PR/NU revision), Winbond W837F - BIOS/Version: KM-S4-1 VER:4.2 - AWARD +// BIOS: Award PCI/PNP 486 S/N:024893105 - Keyboard BIOS: Winbond W83C42 - CPU: P24T - RAM: 4xSIMM72, Cache: 4xUM61512AK-15, 1xW24257AK-15 +// on board: 2xser, Floppy, par, 2xIDE - ISA16: 3, PCI: 3 +ROM_START( jakms41 ) // BIOS String: 10/30/95-SiS-496-497/A/B-2A4IBR22C-00 - boots into BootBlock BIOS + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "km-s4-1.bin", 0x00000, 0x20000, CRC(0271356a) SHA1(893048c3390a23810a2af14da30520fbea10ad2f)) +ROM_END + +// SOYO SY-4SAW2 - Chipset: SiS 85C497, 85C496, Winbond W83787F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 4xUM61512AK-15+W24129AK-15 +// BIOS: Award (32pin) - Keyboard-BIOS: Via VT82C42N - ISA16: 3, ISA16/VL: 1, PCI: 4 - On board: 2xser, par, 2xIDE, Floppy +// keeping the ROMs for the 4SA boards here until the differences between the boards are clear, e.g. difference between SY-4SAW and 4SA2: L2-cache +ROM_START( so4saw2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 04/15/95-SiS-496-497/A/B-2A4IBS22-00 / REV IO-A + ROM_SYSTEM_BIOS(0, "ioa", "IO-A") + ROMX_LOAD( "4sa2_bios_isa_486_488755.bin", 0x00000, 0x20000, CRC(21708d9c) SHA1(be4596507df1f5cc8a4e1baafce52b96417ac029), ROM_BIOS(0)) + // 1: BIOS-String: 08/22/95-SiS-496-497/A/B-2A4IBS2hC-00 / REV IO-B1 (4SA2, http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SA2/index.html) + ROM_SYSTEM_BIOS(1, "iob1", "IO-B1") + ROMX_LOAD( "4sa-iob1.bin", 0x00000, 0x20000, CRC(a74891b6) SHA1(974c3a854a4e83202555bcbcba191f902527b577), ROM_BIOS(1)) + // 2: BIOS-String: 07/30/97-SiS-496-497/A/B-2A4IBS2hC-00 / SA-0730 (4SA, http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SA/index.html) + ROM_SYSTEM_BIOS(2, "0730", "0730") + ROMX_LOAD( "4sa0730.bin", 0x00000, 0x20000, CRC(dea32658) SHA1(2c89500d9904f61a5426de5f1351ca8004c9920b), ROM_BIOS(2)) + // 3: BIOS-String: 07/03/96-SiS-496-497/A/B-2A4IBS29C-00 / REV WA53 (4SAW/4SAW2) + ROM_SYSTEM_BIOS(3, "wa53", "WA53") + ROMX_LOAD( "4saw53.bin", 0x00000, 0x20000, CRC(2265a9d1) SHA1(bd625f0f11e64d2620648cf14e6b6faf09df80bc), ROM_BIOS(3)) + // 4: BIOS-String: 12/05/95-SiS-496-497/A/B-2A4IBS29C-00 / REV WA3 (4SAW/4SAW2) + ROM_SYSTEM_BIOS(4, "wa3", "WA3") + ROMX_LOAD( "4saw-wa3.bin", 0x00000, 0x20000, CRC(d47e727e) SHA1(c6ba38e72575127b763a8e5ead49dbaaef85ab06), ROM_BIOS(4)) + // 5: BIOS-String: 09/11/97-SiS-496-497/A/B-2A4IBS29C-00 / REV WA0911 (4SAW/4SAW2 http://www.elhvb.com/supportbios.info/Archives/BIOS/R-S/SOYO/4SAW/index.html) + ROM_SYSTEM_BIOS(5, "0911", "0911") + ROMX_LOAD( "4saw0911.bin", 0x00000, 0x20000, CRC(4056b35e) SHA1(bca2d2507b15800ad13bd8f8c6699b49b8e87011), ROM_BIOS(5)) + // 6: BIOS-String: 09/11/97-SiS-496-497/A/B-2A4IBS29C-00 / REV WA0911 128GB BETA ROM (4SAW) + ROM_SYSTEM_BIOS(6, "0911b", "0911b") + ROMX_LOAD( "4saw0911b.bin", 0x00000, 0x20000, CRC(000fca3e) SHA1(46ceb550ed08fb013f02e51e1d428a60e220ede6), ROM_BIOS(6)) +ROM_END + +// ZIDA Tomato board 4DPS - Chipset: SIS 85C497, SIS 85C496, Winbond W83787IF, W83768F, MX8318-01PC - CPU: 486/5x86 - BIOS: Winbond W29EE011-15 / AWARD PCI/PNP +// Keyboard-BIOS: HOLTEK HT6542B or AMIKEY-2 - ISA16: 3, PCI: 3 - OSC: 24.000 - On board: 2xIDE, Floppy, 2xCOM, 1xPRN, Mouse, GAME +// from v4.00 onward it needs FLASH instead of EPROM to update the ESCD at boot time +ROM_START( zito4dps ) // all revisions land in the Award Boot block BIOS + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 01/10/96-SiS-496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.5 (2301952A4IBZ11) + ROM_SYSTEM_BIOS( 0, "4dps01", "Tomato 4DPS #1") + ROMX_LOAD( "4siw004.bin", 0x00000, 0x20000, CRC(0c57cc33) SHA1(04ce27dc89ae15d70c14076ad4f82b50a4f1e6dd), ROM_BIOS(0)) + // 1: BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) + ROM_SYSTEM_BIOS( 1, "4dps02", "Tomato 4DPS #2") + ROMX_LOAD( "4dps02.bin", 0x00000, 0x20000, CRC(757a5ef7) SHA1(e35146f34329a6a7033b1ed9d95a77692826a060), ROM_BIOS(1)) + // 2: BIOS-String: 10/17/96-SiS-496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.71 (1710962A4IBZ11) + ROM_SYSTEM_BIOS( 2, "171", "Tomato 4DPS v1.71") + ROMX_LOAD( "4dps_170.bin", 0x00000, 0x20000, CRC(10b43a85) SHA1(d77bb2420b98c030add5de52fc90c88384b2036b), ROM_BIOS(2)) + // 3: BIOS-String: 07/08/97-SiS-496-497/A/B-2A4IBZ1AC-00 / 4DPS VER 1.72F (10072A4IBZ1A) + ROM_SYSTEM_BIOS( 3, "172f", "Tomato 4DPS v1.72f") + ROMX_LOAD( "4dps172g.bin", 0x00000, 0x20000, CRC(184eeeba) SHA1(248555567e35d4d6a0cfad5abc989e8193a72351), ROM_BIOS(3)) + // 4: BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) + ROM_SYSTEM_BIOS( 4, "400a", "Tomato 4DPS v4.00a") + ROMX_LOAD( "4dps400a.bin", 0x00000, 0x20000, CRC(494da2da) SHA1(9dcae9aa403627df03d5777c1b4de0b9f98bb24f), ROM_BIOS(4)) + // 5: BIOS-String: 01/10/96-SiS-496-497/A/B-2A4IBZ11C-00 / Tomato 4DPS v4.01 (Y2K ready) + ROM_SYSTEM_BIOS( 5, "401e", "Tomato 4DPS v4.01e") + ROMX_LOAD( "4dps401e.bin", 0x00000, 0x20000, CRC(e84b2bb2) SHA1(5dd8e801decf87af90ff90e3096819354f657b5a), ROM_BIOS(5)) + // 6: v2.11, also marked v400a - BIOS-String: 06/17/1998-SiS-496-497/A-2A4IBZ11C-00 / 4DPS V4.00A (17/06/98) + ROM_SYSTEM_BIOS( 6, "4dps03", "Tomato 4DPS #3") + ROMX_LOAD( "4dps400b.bin", 0x00000, 0x20000, CRC(5910fa95) SHA1(934845038298d2d50f5bd4b20e0a4ccd9aa74e82), ROM_BIOS(6)) + // 7: BIOS-String: 11/23/95-SiS-496-497/A/B-2A4IBZ11C-00 + ROM_SYSTEM_BIOS( 7, "4dps04", "Tomato 4DPS #4") + ROMX_LOAD( "4dps04.bin", 0x00000, 0x20000, CRC(f704be6a) SHA1(536c17c2a26e8a0f3bc3ddf6b8daa2f694905c24), ROM_BIOS(7)) + // 8: 01/10/96-SiS496-497/A/B-2A4IBZ11C-00 / 4DPS VER 1.6 (2005962A4IBZ11) + ROM_SYSTEM_BIOS( 8, "160", "Tomato 4DPS v1.6") + ROMX_LOAD( "4dps_160.bin", 0x00000, 0x20000, CRC(27d23966) SHA1(3fea7573c1897a4bd6d09e4ffc4e26372a25e43a), ROM_BIOS(8)) +ROM_END + +// Jetway J-446A - Chipset: SiS 85C497, 82C496 - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 4+1 sockets - BIOS: 32pin +// Keyboard-BIOS: HOLTEK HT6542B - ISA16: 3, PCI: 3 - On board: 2xIDE, Floppy, par, 2xser +ROM_START( jwj446a ) // BootBlock BIOS + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS( 0, "no1", "J-446A #1") + ROMX_LOAD( "j446a_original.bin", 0x00000, 0x20000, BAD_DUMP CRC(79d2e360) SHA1(8bf3befa1c869e298ec346cc784fcbc2193e3912), ROM_BIOS(0)) + // 1: 02/02/96-SiS-496-497/A/B-2A4IBJ19C-00 / V.446 RP5 2-2-1996 + ROM_SYSTEM_BIOS( 1, "no2", "J-446A #2") + ROMX_LOAD( "j446a.rom", 0x00000, 0x20000, CRC(3e3c6abd) SHA1(04952dc143baa7b51cb6fc5eb1961007ecf36aaf), ROM_BIOS(1)) +ROM_END + +// LuckyStar LS-486E - Chipset : SiS496, SiS497, SMC FDC37C665GT - CPU: AMD 486DX4-100 (Socket 3) - RAM: 4xSIMM72, Cache: 4 sockets (UM61512AK-15)+1 +// BIOS : AMIBIOS 486PCI ISA 393824, on a 27C010 type ROM chip - Keyboard-BIOS: AMIKEY-2 - ID string : 41-PH0D-001256-00101111-101094-SIS496AB-H +// On board: 2xISA, Floppy, par, 2xser - ISA16: 4, PCI: 3 +ROM_START( ls486e ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Rev:C - no display + ROM_SYSTEM_BIOS( 0, "revc01", "Rev.C #1") + ROMX_LOAD( "ls486e_revc.bin", 0x00000, 0x20000, CRC(d678a26e) SHA1(603e03171b28f73bdb6ce27b0bbae2a4cfb13517), ROM_BIOS(0)) + // 1: LS486E Rev.D SiS496/497(PR/NU) EDO Support AWARD 10/21/96 - 10/21/96-SiS-496-497/A/B-2A4IBL12C-00 - 486E 96/10/24 UMC8669 PLUG & PLAY BIOS + ROM_SYSTEM_BIOS( 1, "revd01", "Rev.D #1") // boots to BootBlock BIOS + ROMX_LOAD( "ls486-d.awa", 0x00000, 0x20000, CRC(5a51a3a3) SHA1(6712ab742676156802fdfc4d08d687c1482f2702), ROM_BIOS(1)) + // 2: Lucky Star LS486E rev.C,Winbond,SiS496/497 - BIOS Award PNP v4.50PG (486E 96/5/17 W83787) - BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 / 486E 96/5/17 W83787 + ROM_SYSTEM_BIOS( 2, "revc02", "Rev.C #2") // boots to BootBlock BIOS + ROMX_LOAD( "ls486e-c.awd", 0x00000, 0x20000, CRC(8c290f20) SHA1(33d9a96e5d6b3bd5776480f5535bb1eb1d7cff57), ROM_BIOS(2)) + //3: BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 / 486E 96/7/19 W83787 PLUG & PLAY BIOS - boots to BootBlock BIOS + ROM_SYSTEM_BIOS( 3, "revc1", "Rev.C1") // also on a Rev.C2 board + ROMX_LOAD( "ls486ec1.bin", 0x00000, 0x20000, CRC(e96d1bbc) SHA1(64d0726c4e9ecee8fddf4cc39d92aecaa8184d5c), ROM_BIOS(3)) + // 4: BootBlock BIOS + ROM_SYSTEM_BIOS( 4, "lh5", "LH5") + ROMX_LOAD( "ls-486e.bin", 0x00000, 0x20000, CRC(03ca4a97) SHA1(f9e5e2f2fabcb47960dfa91c37bf74fa93398092), ROM_BIOS(4)) + // 5: BIOS-String: 03/14/96-SiS-496-497/A/B-2A4IBL13C-00 - boots to BootBlock BIOS + ROM_SYSTEM_BIOS( 5, "ls486eb", "LS-486E(B)") + ROMX_LOAD( "4siw001.bin", 0x00000, 0x20000, CRC(d81d722d) SHA1(bb18324b3679b7419c230244891b626a61006486), ROM_BIOS(5)) +ROM_END + +// MSI MS-4144 - Chipset: SiS 85C497, 85C496, Winbond W83787F, W83758F - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 8+1 sockets +// On board: 2xIDE, Floppy, 2xser, par - ISA16: 4, PCI: 3 +ROM_START( ms4144 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: no display + ROM_SYSTEM_BIOS(0, "af53", "AF53") + ROMX_LOAD( "ms-4144_af53.rom", 0x00000, 0x20000, CRC(931ebb7d) SHA1(fa7cf64c07a6404518e12c41c197354c7d05b2d2), ROM_BIOS(0)) + // 1: no display + ROM_SYSTEM_BIOS(1, "af54", "AF54") + ROMX_LOAD( "ms-4144_af54s.rom", 0x00000, 0x20000, CRC(1eb02779) SHA1(b18cc771fc5a820437a4daca06806188ee1a27a5), ROM_BIOS(1)) + // 2: BIOS-String: 03/20/96-SiS-496-497/A/B-2A4IBM49C-00 / WF53S 032096 - boots to BootBlock BIOS + ROM_SYSTEM_BIOS(2, "wf53", "WF53") + ROMX_LOAD( "ms-4144_wf53s.bin", 0x00000, 0x20000, CRC(df83f099) SHA1(b7dc61a2cb71754cddd06d12d3bf81ffce442c89), ROM_BIOS(2)) + // 3: BIOS-String: 02/07/96-SiS-496-497/A/B-2A4IBM49C-00 / WF54S 020896 - boots to BootBlock BIOS + ROM_SYSTEM_BIOS(3, "wf54", "WF54") + ROMX_LOAD( "ms-4144_wf54s.bin", 0x00000, 0x20000, CRC(c0ff31df) SHA1(4e138558781a220b340977d56ccbfa61a907d4f5), ROM_BIOS(3)) + // 4: no display - VER 2.1 - BIOS: AMI 486DX ISA BIOS AC8999569 (32pin)- Keyboard-BIOS: AMIKEY-2 + ROM_SYSTEM_BIOS(4, "v21", "Ver 2.1") + ROMX_LOAD( "486-pci-ms4144.bin", 0x00000, 0x20000, CRC(8bd50381) SHA1(c9853642ac0946c2b1a7e469bcfacbb3351c4067), ROM_BIOS(4)) +ROM_END + +// SOYO 30H - CPU: Socket 3 - RAM: SIMM72x4 - Cache: 256K, 512K or 1024K - ISA16: 4, PCI: 3 - on board: 2xIDE +// BIOS-String: 12/07/95-SiS-496-497/A/B-2A4IBS2AC-00 / REV B2 +ROM_START( so30h ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "30h-b2.bin", 0x00000, 0x20000, CRC(1dd22cef) SHA1(dd0ac15e7a792e8fba2f55d6a1b35256e74bcf4e)) +ROM_END + +ROM_START( sis85c496 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // Chipset: SiS 85C496/85C497 - CPU: Socket 3 - RAM: 2xSIMM72, Cache - Keyboard-BIOS: JETkey V5.0 + // ISA16: 3, PCI: 3 - BIOS: SST29EE010 (128k) AMI 486DX ISA BIOS AA2558003 - screen remains blank + ROM_LOAD( "4sim002.bin", 0x00000, 0x20000, CRC(ea898f85) SHA1(7236cd2fc985985f21979e4808cb708be8d0445f)) +ROM_END + + +// ***** 486 motherboards using the SiS 85C471 + 85C407 chipset + +// 486IG-B-2-1 - CPU: 486 - RAM: 8xSIMM30, Cache: 4x32pin, 4x28pin, TAG - Chipset: SIS85C471/407 - BIOS: AMI WIN BIOS 07/25/94 +// Keyboard-BIOS: AMIKEY - BIOS-String: 40-0002-428020-00101111-080893-SIS471B-F - ISA8: 1, ISA16: 3, ISA16/VL: 3 +ROM_START( 486igb21 ) // display remains blank + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486igb21.amw", 0x10000, 0x10000, CRC(b62cc7af) SHA1(048f80ad995a1516f97bb7544d3fb608a93893b1)) +ROM_END + +// Abit AH4/AH4T/AN4R2 ( the T model has a voltage regulator for DX4 CPUs) - CPU: Socket 3 - Chipset: SIS 85C471 / SIS 85C407 +// RAM: 4xSIMM72, Cache: 9x28pin (32pin sockets except TAG) - BIOS: AMI - Keyboard-BIOS: AMIKEY - OSC: 14.31818 - ISA8: 1, ISA16: 4, ISA16/VL: 3 +// BIOS-String: 08/30/95-SIS-85C471-2C4I9A12-02 +ROM_START( abah4 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ah4t_an4r2_02.bin", 0x10000, 0x10000, CRC(b45dc3b7) SHA1(94206ac9ed50fc37d954cc3cd1fb062fd75ea984)) +ROM_END + +// Aopen VI15G - Chipset: SiS 85C471, 85C407 - CPU: Socket 3 - RAM: 4xSocket72, Cache: 4x32pin, 4x28pin, TAG - BIOS: 28pin +// Keyboard-BIOS: AMIKEY-2 - ISA16: 4, ISA16/VL: 3 +ROM_START( aovi15g ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "072594", "07/25/94") + ROMX_LOAD( "amiwinch.bin", 0x10000, 0x10000, CRC(9ee72bef) SHA1(25f08714a384d68777d1570cf28a4db8b390257e), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "r23", "R23") + ROMX_LOAD( "vi15gr23.rom", 0x10000, 0x10000, CRC(b704f571) SHA1(485795b8756069723dac865919dc3915a3162c12), ROM_BIOS(1)) +ROM_END + +// ASUS VL/I-486SV2G (GX4) (4xSIMM72, Cache: 128/256/512/1024KB, 7 ISA, 2 VLB) +// SiS 85C471 + 85C407; AMIKEY-2 +ROM_START( a486sv2g ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 11/17/94-SIS-85C471-I486SV2G-00 / #401A0-0304 + ROM_SYSTEM_BIOS(0, "v304", "ASUS VL/I-486SV2G (GX4) V3.04") + ROMX_LOAD( "sv2g0304.bin", 0x10000, 0x10000, CRC(cceabe6f) SHA1(45d0e25603045255d1ccaf5cbddd1a9146f61529), ROM_BIOS(0)) + // 1: BIOS-String: 01/11/95-SIS-85C471-I486SV2G-00 / #401A0-0305-1 + ROM_SYSTEM_BIOS(1, "v305", "ASUS VL/I-486SV2G (GX4) V3.05") + ROMX_LOAD( "0305.001", 0x10000, 0x10000, CRC(9f2f9b75) SHA1(789807d82e39d69f948f7897f99b2fe362330dd1), ROM_BIOS(1)) + // 2: BIOS-String: 03/28/95-SIS-85C471-I486SV2G-00 / #401A0-0306 - complains about BIOS ROM checksum error + ROM_SYSTEM_BIOS(2, "v306", "ASUS VL/I-486SV2G (GX4) V3.06") + ROMX_LOAD( "asus_0306.bio", 0x10000, 0x10000, BAD_DUMP CRC(c87b7b55) SHA1(651938bcfdf6813a1e66c0e1b4812efe91740c91), ROM_BIOS(2)) + // 3: BIOS-String: 08/22/95-SIS-85C471-I486SV2G-00 / #401A0-0401 + ROM_SYSTEM_BIOS(3, "v401", "ASUS VL/I-486SV2G (GX4) V4.01") + ROMX_LOAD( "sv2g0401.bin", 0x10000, 0x10000, CRC(f544f65a) SHA1(9a5e39cfbd545a0026f959b42dbc742246205b3c), ROM_BIOS(3)) + // 4: BIOS-String: 11/03/95-SIS-85C471-I486SV2G-00 / #401A0-0402-1 + ROM_SYSTEM_BIOS(4, "v402", "ASUS VL/I-486SV2G (GX4) V4.02") + ROMX_LOAD( "sv2g0402.bin", 0x10000, 0x10000, CRC(db8fe666) SHA1(e499da86261bc6b312a6bc3d94b9465e17c5a449), ROM_BIOS(4)) + // 5: BIOS-String: 11/19/97-SIS-85C471-I486SV2GC-00 / #401A0-0402-1 + ROM_SYSTEM_BIOS(5, "v402b", "ASUS VL/I-486SV2G (GX4) V4.02 beta") + ROMX_LOAD( "0402.001.bin", 0x10000, 0x10000, CRC(4705a480) SHA1(334c3d57cb6cb157798cd189207288c731a4dd7b), ROM_BIOS(5)) +ROM_END + +// Chaintech 486SLE M106 4SLE-Z1 - Chipset: SiS 85C407 85C471 - CPU: i486DX2-66 - BIOS: Award v4.50G - Keyboard-BIOS: Lance LT48C41 +// BIOS-String: 11/09/94-SIS-85C471E-2C4I9C31-00 / 11/24/94 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.31818 +ROM_START( ch4slez1 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-chaintech_486_sle.bin", 0x10000, 0x10000, CRC(8292bdb7) SHA1(461d582ea9fee4113d3a8ac050f76c7057ead7c7)) +ROM_END + +// Gemlight GMB-486SG rev 2.2 - Chipset: SiS 85C471 85C407 - BIOS/Version: Award - Keyboard BIOS: JETkey V5.0G +// CPU: 80486DX2-66 - RAM: 4xSIMM72, Cache: 5x 28pin DIP (TI256 SA 20TP fittet), 4x32pin DIP (W24257AK-15 fitted) - ISA8: 1, ISA16: 2, ISA16/VLB: 3 +ROM_START( gmb486sg ) // BIOS-String: 01/10/95-SIS-85C471B/E/G-2C4I9G30-00 + ROM_REGION32_LE(0x20000, "bios", 0) // screen remains blank + ROM_LOAD( "gmb486sg.bin", 0x10000, 0x10000, CRC(1f199b35) SHA1(0c4b19762426a30f7121c5c17f1b25a54a5df1f0)) +ROM_END + +// Gigabyte GA-486VF REV.6 - Chipset: SiS 85C407 85C471 - CPU: Cyrix Cx486 DX 40 - BIOS: Award L4162439, 28pin - Keyboard-BIOS: Lance LT38C41 +// BIOS-String: 04/27/94-SIS-85C471-2C4I8G01-00 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.318MHz +ROM_START( ga486vf ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ga-486svf.bin", 0x10000, 0x10000, CRC(e9fb3153) SHA1(b8e307658f95c3e910728ac9316ad83e7afdb551)) +ROM_END + +// Gigabyte GA-486VS - CPU: 486 - Chipset: SiS 85C471, 85C407 - Keyboard-BIOS: Lance LT38C41 - ISA16: 3, ISA16/VL: 3 +// BIOS-String: 11/21/94-SIS-85C471B/E/G/2C4I9G01-00 / Nov 21, 1994 Rev.A +ROM_START( ga486vs ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "vs1121.rom", 0x10000, 0x10000, CRC(0afadecf) SHA1(66c0655b5c4905438603097998a98407bfa376e6)) +ROM_END + +// MSI MS-4132 G VER:1 - Chipset: SiS 85C471, 85C407, BIOS: AMI 486DX ISA BIOS 08/08/93 AB4827039 - CPU: SOCKET 3, solder pads for 8486 +// RAM: 4xSIMM30, 2xSIMM72, Cache: 5xW24257AK-15, 4xIS61C256AH-15N - ISA16: 4, ISA16/VLB: 3 (2 master, 1 slave) - OSC: 14.31818MHz +ROM_START( ms4132 ) // BIOS String: 40-0100-001169-00101111-080893-SIS471B / A75A 033194 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ms4132g.bin", 0x10000, 0x10000, CRC(23385e9d) SHA1(3637febf6e037aec9328d99877550ee9dee4c78c)) +ROM_END + +// MSI MS:4138 VER:1.3 - Chipset: SiS 85C471, 85C407 - CPU: Socket 3 - BIOS: EPROM/AMI 486DX ISA BIOS AC0250679 +// Keyboard-BIOS: Winbond W83C42 - BIOS-String: - ISA16: 4, ISA16/VL: 3 +ROM_START( ms4138 ) + ROM_REGION32_LE( 0x20000, "bios", 0) + // 0: no display + ROM_SYSTEM_BIOS( 0, "a75n", "A75N") + ROMX_LOAD( "a75n.rom", 0x10000, 0x10000, CRC(f9b2130c) SHA1(7798b68275e547e858ba162abc5cf94dd6a85f4c), ROM_BIOS(0)) + // 1: no display + ROM_SYSTEM_BIOS( 1, "msi4138", "MSI MS-4138") + ROMX_LOAD( "ms-4138.bin", 0x10000, 0x10000, CRC(5461c523) SHA1(adb9fe0afa860897d575403a810ff44c85b9f93c), ROM_BIOS(1)) + // 2: BIOS-String: 08/14/95-SIS-85C471B/E/G-2C3I9W40-00 / W753BETA 26JAN96 + ROM_SYSTEM_BIOS( 2, "w753beta", "W753BETA") + ROMX_LOAD( "w753beta.bin", 0x10000, 0x10000, CRC(4aeeba0b) SHA1(9d088c940599110ce3acea84bb881a61d42b6dcf), ROM_BIOS(2)) +ROM_END + +// DTK PKM-0038S E-2A aka Gemlight GMB-486SG - Chipset: SIS 85C471, 85C407 - BIOS/Version: 01/10/95 Award (DTK PKM0038S.P02.03.02), 28pin - Keyboard-BIOS: JETkey V5.0 +// CPU: Socket 3 - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.318 +ROM_START( pkm0038s ) + ROM_REGION32_LE( 0x20000, "bios", 0) + // 0: BIOS-String: 01/10/95-SIS-85C471B/E/G-2C4I9G30-00 / (2C4I9G30) DTKPKM0038S.P2.03.02 + ROM_SYSTEM_BIOS(0, "p20302", "P2.03.02") + ROMX_LOAD( "pkm0038s.bin", 0x10000, 0x10000, BAD_DUMP CRC(f6e7dd88) SHA1(5a2986ff0e6352ade8d5b0abaa86e436dddcf226), ROM_BIOS(0)) // BIOS ROM checksum error + // 1: BIOS-String: 07/11/94-SIS-85C471E-2C4I9G30-00 / (2C4I9G30) DTKPKM0038S.P02.02.0 + ROM_SYSTEM_BIOS(1, "p2020", "P2.02.0") + ROMX_LOAD( "4siw005.bin", 0x10000, 0x10000, CRC(0b8794d3) SHA1(153b38f6815a8a3d6723eb17df7ffc37054b3194), ROM_BIOS(1)) +ROM_END + +// EFA 4DMS HL3G-L4-VI - Chipset: SIS-85C471B/E/G / SIS471E/G - CPU: Socket 3 - RAM: 2xSIMM72, Cache: 8x32pin+TAG - ISA16: 5, ISA16/VL: 3 +// BIOS: Award - BIOS-String: 12/07/95-SIS-85C471B/E/G-2C4I9E30-00 / 4DMS-HL3GC Award BIOS REV 1.05 01/12/'96 +ROM_START( 4dmshl3g ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3g105.bin", 0x00000, 0x20000, CRC(60e4841f) SHA1(60ad11e4e4a60eef858d837470a9014706e7576a)) +ROM_END + +// Soyo 025K2 - Chipset: SiS 85C471, 85C407 - BIOS: Award BIOS ISA 486 S/N 240383 - Rev G2 - 09/26/94 - Keyboard BIOS: JETkey V5.0 +// CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 8xtm11256-20, 1xAster AE88128AK-15 - ISA16: 4, ISA16/VLB: 3 (one marked MASTER) +ROM_START( so025k2 ) // BIOS-String: 09/26/94-SIS-85C471B/E/G-2C4I9S23-00 / REV .G2. + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "sy025k2.bin", 0x10000, 0x10000, CRC(a75fdf9a) SHA1(ce7a595ec3bb33acac76a72f704a58e08d54847a)) +ROM_END + +// Zida 4DVS - Chipset: SiS 85C471, 85C407 - CPU: Socket 3, RAM: 4xSIMM72, Cache: 4x28pin, 4x32pin, TAG +// ISA8: 1, ISA16: 3, ISA16/VL: 3 - Keyboard-BIOS: AMIKEY-2 +// BIOS-String: +ROM_START( zi4dvs ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: 02/09/95-SIS-85C471B/E/G-2C4I9000-00 / 12/10/95 SIS 85C471G + ROM_SYSTEM_BIOS(0, "4dvs20", "4DVS20") + ROMX_LOAD( "4dvs20.awa", 0x10000, 0x10000, CRC(831d33cb) SHA1(e5c3f01a9c93a7cf9dbcdc750e87952a5b6a5cf4), ROM_BIOS(0)) + // 1: blank screen + ROM_SYSTEM_BIOS(1, "072594", "AMI 07/25/94") + ROMX_LOAD( "4dvs-471.amw", 0x10000, 0x10000, CRC(da749314) SHA1(686321ffa59cd2259f4fe65a28b86c88cf739393), ROM_BIOS(1)) + // 2: blank screen + ROM_SYSTEM_BIOS(2, "121593", "AMI 12/15/93") + ROMX_LOAD( "486-ab8068594.bin", 0x10000, 0x10000, CRC(92eee700) SHA1(bd34360cf9a9849e0805cdb575cd7a0e007dd2f5), ROM_BIOS(2)) +ROM_END + +ROM_START( sis85c471 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: Chipset: SiS 85C407, another chip with the Energy Star/Green PC label (85C441) - CPU: 486 - BIOS: Award BIOS ISA 486 036875 - Keyboard-BIOS: Lance LT38C41 + // BIOS-String: 04/28/94-SIS-85C471-2C4I8S21-00 / REV. B - ISA16: 4, ISA16/VL: 3 (2 master) + ROM_SYSTEM_BIOS(0, "revb", "REV. B") + ROMX_LOAD("486-sis_green.bin", 0x10000, 0x10000, CRC(9d3b5022) SHA1(f11b27bb24deb2466226486cf8ba66ddbeff87d6), ROM_BIOS(0)) + // 1: Chipset: SiS 85C407 85C471 - CPU: Cyrix Cx486DX2-66 - BIOS: Award E0042537 - Keyboard-BIOS: Lance LT38C41 - ISA8: 1, ISA16: 3, ISA16/VL: 3 + // BIOS-String: 02/07/94-SIS-85C371-2C4I8C30-00 / 02/17/94 + ROM_SYSTEM_BIOS(1, "486sl", "486SL") + ROMX_LOAD("486-sis_486sl.bin", 0x10000, 0x10000, CRC(7261263e) SHA1(d5c4ee484941bbb8ca756c5f6e53382748bbcfd6), ROM_BIOS(1)) + // 2: REV:1.2 - Chipset: SiS 85C471 P85C407 - CPU: Socket 3 - BIOS: AMI 486DX ISA BIOS AC03601316 (28pin) - Keyboard-BIOS: JETkey V5.0G - RAM: SIMM72x4, Cache: 8 sockets+1 + // ISA8: 1, ISA16: 4, ISA16/VL: 3 + ROM_SYSTEM_BIOS(2, "rev12", "REV.1.2") // no display + ROMX_LOAD("486-sis_ac0360136.bin", 0x10000, 0x10000, CRC(940e3643) SHA1(f931f5c2b39ebb6c509033984ab050ffa1ff4334), ROM_BIOS(2)) +ROM_END + + +// ***** 486 motherboards using the UMC UM8498F, UM8496F chipset + +// Aquarius MD-4DUVC VER:2.1 / Aquarius MD-4DUV VER:2.1 +ROM_START( md4duvc ) // "Memory test fail" + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: CPU: Socket 3/Overdrive - Chipset: UMC UM8496F, UM8498F - RAM: 2xSIMM72, 4xSIMM30, Cache: 9xW2457AX-15, sockets are 32pin + // ISA16: 4, ISA16/VL: 3 - BIOS: 28/32pin + ROM_SYSTEM_BIOS(0, "md4duvc", "MD-4DUVC") // BIOS-String: 01/12/94--2C4X6H01-00 / Release 01/04/95 + ROMX_LOAD( "md-4duvc.dmg", 0x10000, 0x10000, CRC(40d208bb) SHA1(c879599d2635c093fce420d1e7081631d27c621a), ROM_BIOS(0)) + // 1: Chipset: UMC UM8498F, UM8496F - BIOS/Version: 486SX/DX Award, R3.1, I194220, 1994-1995 - CPU: Socket 3 + // RAM: 4xSIMM72, Cache: 9xW24257AK-15 - ISA16: 4, ISA16/VLB: 3 + ROM_SYSTEM_BIOS(1, "md4duv", "MD-4DUV") // BIOS-String: 11/1794-UMC-498GP-2C4X6A31-00 / MB-4DUV/UVC VER 3.1 + ROMX_LOAD( "atrom.bin", 0x10000, 0x10000, CRC(ecb764f5) SHA1(f34a7671e9efc6a6cd7ff1516c0c8ecbbfcd55e0), ROM_BIOS(1)) +ROM_END + +// BIOSTAR MB-1433UIV - Chipset: BIOTEQ 83C3498, 83C3496 - CPU: Socket 3 - RAM: 3xSIMM30, 4xSIMM72, Cache: 4x32pin, 4x28pin + TAG +// ISA16: 4, ISA16/VL: 3 - BIOS: 28pin +ROM_START( mb1433uiv ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS(0, "um8496fw", "UM8496FW") + ROMX_LOAD( "um8496fw.ami", 0x10000, 0x10000, CRC(4a6dcc36) SHA1(f159f67eb662272244cd1781814ebcb5204a2625), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "w4", "W4") + ROMX_LOAD( "um498-w4.amw", 0x10000, 0x10000, CRC(12fe6697) SHA1(2506dea874728916dc37f7dad8e8caf214a28525), ROM_BIOS(1)) +ROM_END + +// PC-Chips M912 - Chipset: UM8498F, UM8496F - CPU: 486 - BIOS: AMI - ISA16: 4, ISA16/VL: 3 +ROM_START( pccm912 ) // no display + ROM_REGION32_LE( 0x20000, "bios", 0) + // 0: + ROM_SYSTEM_BIOS( 0, "072594", "07/25/94") + ROMX_LOAD( "m912.bin", 0x10000, 0x10000, CRC(7784aaf5) SHA1(f54935c5da12160251104d0273040fea22ccbc70), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS( 1, "120295", "12/02/95") + ROMX_LOAD( "m912_12-02-1995x.bin", 0x10000, 0x10000, CRC(28a4a140) SHA1(a58989ab5ad5d040ad4f25888c5b7d77f31a4d82), ROM_BIOS(1)) +ROM_END + +// Pine Technology PT-430 - Chipset: UMC UM8498F UM8496F - BIOS: AMI 486DX ISA BIOS AB8906726 28pin - Keyboard-BIOS: silkscreen 8742, but socket empty +// BIOS-String: - ISA8: 1, ISA16: 3, ISA16/VL: 3 - OSC: 14.31818MHz +ROM_START( pt430 ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pt430.bin", 0x10000, 0x10000, CRC(d455c949) SHA1(c57c82ed015528f3d223f59c94ed6b8a9c323c39)) +ROM_END + +// PowerTech MB457 aka Pine PT-2068.1 - Chipset: UMC UM8498F & UMC UM8496F - CPU: Intel 80486DX4-100, solder pads for UMC U5 Green CPU +// RAM: 4xSIMM30, 1xSIMM72 - ISA8: 1, ISA16: 4 - BIOS/Version: Award 486DX J314549 +ROM_START( ptmb457 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 10/19/94-UMC-498GP-2C4X6S21-00 / REV A + ROM_SYSTEM_BIOS(0, "101994", "10/19/94") + ROMX_LOAD( "umc-mb457-1.bin", 0x10000, 0x10000, CRC(71f66fec) SHA1(c798d68eb851fc93cc8a3dd67009b47388488e51), ROM_BIOS(0)) + // 1: BIOS-String: 02/07/95-UMC-498GP-2C4X6000-00 / PT-2068.1 + ROM_SYSTEM_BIOS( 1, "020795", "02/07/95") + ROMX_LOAD( "umc-mb457-2.bin", 0x10000, 0x10000, CRC(2654aefd) SHA1(b888f4f891108a5ef268688840ff20be3a8e6aa5), ROM_BIOS(1)) +ROM_END + +// Soyo 025R2 - Chipset: UM8498F, UM8486F - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 4x28pin, 4x32pin, TAG, used: 4xUM61512AK-15, AE88128AK-15 +// BIOS: 28pin - ISA16: 4, ISA16/VL: 3 +// BIOS-String: 08/28/UMC-498GP-2C4X6S21-00 / REV B2 +ROM_START( so025r2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD("25r2-b2.bin", 0x10000, 0x10000, CRC(3b73360c) SHA1(eaaf47236154a9cc81ffda4c11086960aed0dadf)) +ROM_END + +// ID: ADI F4DXL-UC4 - Chipset: UM8498F, one unreadable - BIOS: AMI 486DX BIOS AB345213 - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72 +// Cache: 4x32pin DIP, 5x28pin DIP (used: 9xCL63C256N-20) - OSC: FM14318 - ISA16: 4, ISA16/VLB: 3 +ROM_START( f4dxluc4 ) // BIOS-String: 40-0E0-008060-00101111-12159-UM498-0 / ADI/UC4/V 1.0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486_ab345213.bin", 0x10000, 0x10000, CRC(e5b85a92) SHA1(aade1fb1463b07a616c2594293bf0215c9652511)) +ROM_END + +ROM_START( um8498f ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_DEFAULT_BIOS("498gp") + // 0: BIOS-String: 40-P101-001437-00101111-072594-GREEN-H - CPU: Socket 3 - RAM: 4xSIMM30, 2xSIMM72, Cache: 9xUM61256AK-15 + // BIOS: AMI AB9300757 + ROM_SYSTEM_BIOS(0, "v14", "V1.4") // no display + ROMX_LOAD( "4umm001.bin", 0x10000, 0x10000, CRC(a5b768b4) SHA1(904ce2814d6542b65acec0c84532946172f2296d), ROM_BIOS(0)) + // 1: + ROM_SYSTEM_BIOS(1, "um849801", "UM8498 #1") // no display + ROMX_LOAD( "um8498.ami", 0x10000, 0x10000, CRC(51f71bc7) SHA1(0986d60081d2c578a66789c0c53fe1d5919c553f),ROM_BIOS(1)) + // 2: Chipset: UM8498F + UM8496F - BIOS label: Award BIOS ISA 486 485427 - BIOS version: Award Modular BIOS v4.50G - CPU: UMC U55X 486-33F, solder pads for 80486socket + // RAM: 4xSIMM30, 2xSIMM72 - ISA8: 1, ISA16: 5 + // BIOS-String: 12/08/94-UMC-498GP-2C4X6S21-00 / REV A1 + ROM_SYSTEM_BIOS(2, "498gp", "498GP") + ROMX_LOAD( "award_bios_isa_486.bin", 0x10000, 0x10000, CRC(ce3ccaa4) SHA1(3fdc9282d9934e18e45b46b50644022fc0387f33), ROM_BIOS(2)) +ROM_END + + +// ***** 486 motherboards using the UM82C482A UM82C481A chipset + +// Elitegroup UM486/UM486sx Rev.1.4. - Chipset: UMC UM82C482A UM82C481A UM82C206F - ISA8: 2, ISA16: 6 - CPU: i486DX-50, FPU socket provided +// RAM: 8xSIMM30 in 2 banks, Cache: 8xW24256AK-25+4xCY7C164-20PC - OSC: 33.000MHz, 14.31818MHz - BIOS: AMI 486 BIOS ZZ364969 - Keyboard-BIOS: AMI KB-BIOS-VER-F +// BIOS-String: 40-0500-D01131-00101111-070791-UMCWB-0 / UM486/486SX V1.3 09-24-91 +ROM_START( um486 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-um486-um486sx.bin", 0x10000, 0x10000, CRC(0f20d193) SHA1(e9c7365b0343a815e5abc9726d128353becc18d3)) +ROM_END + +// Elitegroup UM486V-AIO - Chipset: UMC UM82C482AF, UM82C481BF, UM82C863F, UM82C865F, UM82C206F - ISA16: 4, ISA16/VL: 2 +// BIOS: AMI - CPU: 486 - On board: Floppy, 1xIDE, parallel, 2x serial +// BIOS-String: 40-0100-001131-00101111-111192-UMC480-0 / UM100 V2.1 04-26-93 +ROM_START( um486v ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "um486v.bin", 0x10000, 0x10000, CRC(eb52d3fd) SHA1(84f63904cfceca9171b5c469545068e19ae280a8)) +ROM_END + + +// ***** 486 motherboards using the UM8886BF, UM8881F chipset + +// A-Trend ATC-1415 - Chipset: UMC UM8881F/UM8886BF, OEC12C885, VT8235N - ISA8: 1, ISA16: 3, PCI: 3 +// CPU: Socket 3 - BIOS: Award C 0247007 UMC8881/6 BIS VER : 3.20 95-12-08 / M271001 (128k) +// BIOS-String: 11/24/95-UMC-881/886A-2A4X5A2HC-00 +ROM_START( atc1415 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4umw002.bin", 0x00000, 0x20000, CRC(eacaa3de) SHA1(88c828def72aeae0798ba5a4a5c31cd465545c0b)) +ROM_END + +// Biostar MB8433UUD-A (4 SIMM, 2 IDE, 3 PCI, 4 ISA) +// UMC UM8881F, UM8886BF, UM8663AF; DS12887 RTC +ROM_START( mb8433uud ) // BootBlock BIOS + ROM_REGION32_LE(0x20000, "bios", 0) // Intel Flash P28F010 + // 0: BIOS-String: 05/20/96-UMC-881E/886B-2A4X5B08C-00 / UUD960520S EVALUATION ROM - NOT FOR SALE + ROM_SYSTEM_BIOS(0, "520s", "520S") + ROMX_LOAD( "uud0520s.bin", 0x00000, 0x20000, CRC(0e347559) SHA1(060d3040b103dee051c5c2cfe8c53382acdfedad), ROM_BIOS(0)) + // 1: BIOS-String: 05/20/96-UMC-881E/886B-2A4X5B08C-00 / BIOSTAR MB-8433UUD v2014 + ROM_SYSTEM_BIOS(1, "2014", "2014") + ROMX_LOAD( "uud2014.bin", 0x00000, 0x20000, CRC(315f7519) SHA1(e0174e4982d1861c64d871a7806b793a914f2366), ROM_BIOS(1)) + // 2: BIOS-String: 12/05/95-UMC-881E/886B-2A4X5B08C-00 / UUD951222S + ROM_SYSTEM_BIOS(2, "8881d", "8881D") + ROMX_LOAD( "um8881_d.awa", 0x00000, 0x20000, CRC(a47327b9) SHA1(6b57155cf34e2c597b7621e49ae8354c05cebfde), ROM_BIOS(2)) + // 3: BIOS-String: 11/07/95-UMC-881E/886B-2A4X5B08C-0 / UUD951108A + ROM_SYSTEM_BIOS(3, "08a", "08A") + ROMX_LOAD( "8433uud.awd", 0x00000, 0x20000, CRC(17ca5c2a) SHA1(7cda78f87f35fe8574a1f2d70d548cc2bc2af05b), ROM_BIOS(3)) +ROM_END + +// Gigabyte GA-486AM/S - CPU: Socket 3 - Chipset: UMC UM8886AF, UM8881F, UM88663AF, UM8667 - RAM: 4xSIMM72, Cache: 9x32pin, occupied: 4xUM6152AK-15, 1xUM61M256K-15 +// BIOS: 32pin - OSC: 14.31818 - On board: 2xIDE, Floppy, par, 2xser - ISA16: 4, PCI: 3 +ROM_START( ga486am ) // BootBlock + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4am1107.bin", 0x00000, 0x20000, CRC(e836798d) SHA1(afd72654ed210bb19e37f9df96b9ecb75c84712a)) +ROM_END + +// PC-Chips M915i - CPU: 486 - Chipset: UM8881F, UM8886F - ISA16: 2, ISA16/VL: 2, PCI: 4 - On board: 2xIDE +ROM_START( pccm915i ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: no display + ROM_SYSTEM_BIOS(0, "9151108s", "9151108S") + ROMX_LOAD( "9151108s.rom", 0x00000, 0x20000, CRC(cba5525c) SHA1(9bdb586090f613a7172f6b46ed78e36331bf2135), ROM_BIOS(0)) + // 1: Amptron DX9200 aka PcChips M915i with Fake cache - Chipset: UMC UM8881F + UM8886BF, SECKS82C6818A - EPROM: AMD AM27C010 + // BIOS label: AMI 486DX ISA BIOS 1993 AC9051796 - BIOS Version: AMI 10/10/1995: 11-08-1995 - on board: 2xIDE + // CPU: Socket 3 - RAM: 4xSIMM72, Cache: 9xblack blocks of plastic - OSC: 14.31818 - ISA16: 2, ISA16/VLB: 2, PCI: 4 + ROM_SYSTEM_BIOS(1, "dx9200", "Amptron DX9200") // BIOS String: 41-p400-001437-00101111-101094-486AVIP-H + ROMX_LOAD( "m915_fake_cache.bin", 0x00000, 0x20000, CRC(82a4e810) SHA1(b20a6e128d6298adf8487d190dd182a751dfccf9), ROM_BIOS(1)) +ROM_END + +// PC-Chips M919 - this motherboard showcased the issues that gave PC-Chips its bad name, it was available with fake cache, a proprietary cache socket or with fully operational cache +// Chipset: UMC UM8881F/9714-EYS and UM8886BF/9652-FXS (V3.4B/F), UMC UM8886BF/9618-FXS and UM8881F/9622-EYS (Rev. 1.5) +// http://th2chips.freeservers.com/m919/ this mentions that the BIOS requires a flashable chip +ROM_START( pccm919 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_SYSTEM_BIOS(0, "m919v1", "PC-Chips M919 v1") + ROMX_LOAD( "9190914s.rom", 0x00000, 0x20000, CRC(bb18ff2d) SHA1(530d13df21f2d483ec0dddda44fb4fe7e29ec040), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "m919v2", "PC-Chips M919 v2") + ROMX_LOAD( "9191016s.rom", 0x00000, 0x20000, CRC(2a2125a6) SHA1(753061ae6f80c0ca42d1af91aada657910feae18), ROM_BIOS(1)) +ROM_END + +// Shuttle HOT-433 - Chipset: UM8886BF, UM8881F, UM8669F, ??667 +// CPU: Cyrix 5x86-120GP - ISA16: 4, PCI: 4 - On board: PS2-Mouse, 2xser, Floppy, par, 2xIDE +// Versions 1-3 can use Flash or EPROM, Version 4 only EPROM +ROM_START( hot433 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 07/25/95-UMC-881/886A-2A4X5H21-00 / (433WIE10) UMC880A For486PCI Green_PC + ROM_SYSTEM_BIOS(0, "wie10", "WIE10") + ROMX_LOAD( "433wie10.bin", 0x00000, 0x20000, CRC(90604ef4) SHA1(61e160678d48cb5752c84090ca990e09382ae01d), ROM_BIOS(0)) + // 1: BIOS: 10/10/94 AMI (or 02/02/95 depending on where you look), 486PCI/ISA 057890 in a Winbond W29EE011-15 - no display + ROM_SYSTEM_BIOS(1, "v401", "V4.0 #1") + ROMX_LOAD( "hot433.bin", 0x00000, 0x20000, CRC(1c279c6f) SHA1(4a0e99fafc5719959fb5800a61629c3f36778240), ROM_BIOS(1)) + // 2: Original AMI BIOS for rev 1-3 w/mouse support + ROM_SYSTEM_BIOS(2, "aip16", "AIP16") + ROMX_LOAD( "433aip16.rom", 0x00000, 0x20000, CRC(a9503fc6) SHA1(0ebd936f5478477e37528e6e487c567b064248f7), ROM_BIOS(2)) + // 3: AMI BIOS for the EPROM Programmer, not flashable + ROM_SYSTEM_BIOS(3, "aue2a", "AUE2A") + ROMX_LOAD( "433aue2a.rom", 0x00000, 0x20000, CRC(35f5633f) SHA1(01148eba919985165ab9cd12b5e6f509d6d1385f), ROM_BIOS(3)) + // 4: AMI BIOS for the EPROM Programmer, not flashable + ROM_SYSTEM_BIOS(4, "aue33", "AUE33") + ROMX_LOAD( "433aue33.rom", 0x00000, 0x20000, CRC(803c4b1e) SHA1(483c799c08eed0d446384d67e9d23341499806b1), ROM_BIOS(4)) + // 5: AMI BIOS for rev 1-3. Some reports say for rev4 + ROM_SYSTEM_BIOS(5, "aus2a", "AUS2A") + ROMX_LOAD( "433aus2a.rom", 0x00000, 0x20000, CRC(766d1f3f) SHA1(1e59140bc91ab98fcadcf7bb77e222932696419f), ROM_BIOS(5)) + // 6: Latest AMI BIOS for rev 1-3 + ROM_SYSTEM_BIOS(6, "aus2c", "AUS2C") + ROMX_LOAD( "433aus2c.rom", 0x00000, 0x20000, CRC(bdc65766) SHA1(e87cc4aed14ae7fcdf6423063b0ababe65b41044), ROM_BIOS(6)) + // 7: AMI Bios for rev 1-3 w/mouse support + ROM_SYSTEM_BIOS(7, "aus26", "AUS26") + ROMX_LOAD( "433aus36.rom", 0x00000, 0x20000, CRC(8f864716) SHA1(0bf4b8114cbb406646d89eed7833556611e1fbe6), ROM_BIOS(7)) + // 8: Latest AMI BIOS for rev4 of the Shuttle HOT-433 motherboard. + ROM_SYSTEM_BIOS(8, "aus33", "AUS33") + ROMX_LOAD( "433aus33.rom", 0x00000, 0x20000, CRC(278c9cc2) SHA1(ecd348106d5118eb1e1a8c6bd25c1a4bf322f3e6), ROM_BIOS(8)) + // 9: boots to BootBlock BIOS + ROM_SYSTEM_BIOS(9, "2a4x5h21", "2A4X5H21") + ROMX_LOAD( "2a4x5h21.bin", 0x00000, 0x20000, CRC(27c47b90) SHA1(09d17bc5edcd02a0ff4a3a7e9f1072202880251a), ROM_BIOS(9)) + // 10: no display + ROM_SYSTEM_BIOS(10, "shuttle", "Shuttle HOT-433") + ROMX_LOAD("bios.bin", 0x00000, 0x20000, CRC(a5ffafac) SHA1(0ec71a82c80a96a5724ba375934c709db468dabc), ROM_BIOS(10)) +ROM_END + +// PROTECH PM486PU-S7 - Chipset: UMC 881/886A (UM8881F/UM8886AF), SMC FDC, Winbond +// BIOS Chip: TI/TMS 27C010A (128K) - CPU: i486DX-33 - On board: 2xIDE, FDC, 2xser, par - RAM: 2xSIMM72, Cache: 4xGLT721208-15 +1 TAG - ISA16: 4, PCI: 3 +// BIOS-String: 10/11/95-UMC-881/886A-2A4X5P62-00 / (PM486PU-S7) 486 WITH I/O PCI LOCAL BUS SYSTEM ... +ROM_START( pm486pu ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pm486pu-s7-2a4x5p62-00.bin", 0x00000, 0x20000, CRC(143bdc07) SHA1(e2cf2ac61fd3e4797e5d737dfec4a2b214469190)) +ROM_END + +// Pine PT-432b - Chipset: UMC UM8886BF, UM8881F, UM8663F, UM8287, UM8667 - CPU: Am486DX4-100 - RAM: 4xSIMM72, Cache: 8+1 sockets +// ISA16: 4, PCI: 3 - BIOS: AMI 486PCI ISA BIOS AA0841149 (32pin) - On board: 2xser, par, 2xIDE, Floppy +ROM_START( pt432b ) // no display + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "sr_m401-a.bin", 0x00000, 0x20000, CRC(ff8cd351) SHA1(a9c6a54f38b1b548fba4d7d42643f117441b09a6)) +ROM_END + +// TD-4IP-UMC-AIO - CPU: Socket 3 - Chipset: UMC UM8881F, UM8886BF, UM8663BF, UM8667, bq3285P - RAM: 2xSIMM72, Cache: W24257AK-15, W24512AK-20 (4) +// BIOS: Award 020175447 / 29EE010 (128k) - BIOS-String: 12/19/95-UMC-881E/886B-2A4X5CF9C-00 - ISA16: 4, PCI: 3 +ROM_START( td4ipaio ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "4ummw001.bin", 0x00000, 0x20000, CRC(4e716d77) SHA1(1b7af88c4da5ca388acbc0cb66bd26a0ae8f4931)) +ROM_END + +ROM_START( um8886 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: no display - UMC PCI 95C-0123 - Chipset: UMC UM8886AF, UM8881F, 4xUM8002, UM8663AF, UM8667 - CPU: Socket 3 - On board: 2xser, par, Floppy, 2xIDE - 4xISA16, 4xPCI + // BIOS: AMI 486 PCI ISA in M27C1001 EPROM + ROM_SYSTEM_BIOS( 0, "pci95c", "PCI 95C-0123") + ROMX_LOAD( "486-umc_pci_95c-0123.bin", 0x00000, 0x20000, CRC(9db58de4) SHA1(5441f3181fb26911d796c4bf019136aa8e4c060b), ROM_BIOS(0)) + // 1: no display - V1.1A - Chipset: UMC UM8886AF UM8881F, UM8667, UM8663AF - CPU: i486DX2-66 - On board: 2xser, 2xIDE, Floppy, par - BIOS: AMI 486DX ISA BIOS AC6288199 - ISA16: 4, PCI: 3 + ROM_SYSTEM_BIOS( 1, "pcimini", "PCI mini") + ROMX_LOAD( "486-umc-pci mini.bin", 0x00000, 0x20000, CRC(4ee12b46) SHA1(9397f67b21f11cfda57abd5ab28f93055909ee97), ROM_BIOS(1)) +ROM_END + +// Elitegroup UM8810 PAIO - Chipset: UMC UM8881F, UM8886F, UM82C865FSMC FDC37C665GT, PCI0640B - CPU: Socket 3 - RAM: 4xSIMM72, Cache: 32pin sockets, 9xUM61256FK-15 occupied +// BIOS: 32pin - Keyboard-BIOS: AMIKEY-2 - ISA16: 4, PCI: 3 - On board: 2xIDE, Floppy, par, 2xser +ROM_START( um8810paio ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 09/27/94-UMC-881/886-2A4X5E11-00 / UM8810P-AIO V1.0 09-27-94' + ROM_SYSTEM_BIOS(0, "awd", "AWD") + ROMX_LOAD( "awd_09-27-94.bin", 0x00000, 0x20000, CRC(25c671ba) SHA1(6b7641fb0f619e233d956e7cdb4e246f3c525673), ROM_BIOS(0)) + // 1: BootBlock BIOS + ROM_SYSTEM_BIOS(1, "aw123", "AW_1-23") + ROMX_LOAD( "aw_1-23.bin", 0x00000, 0x20000, CRC(420c3a43) SHA1(e0744b0bf171d279650d1f3a731e231562fe60ae), ROM_BIOS(1)) + // 2: blank screen, possibly for update only + ROM_SYSTEM_BIOS(2, "v21", "V21") + ROMX_LOAD( "881_v21_01-27-95.rom", 0x00000, 0x20000, CRC(2443759b) SHA1(02a9e51b51c2d2d21d5ae821b6d8aa97f62c3327), ROM_BIOS(2)) + // 3: blank screen + ROM_SYSTEM_BIOS(3, "21e", "21E") + ROMX_LOAD( "881avio_01-08-96.21e", 0x00000, 0x20000, CRC(446cd0c3) SHA1(32a61c0578326d17840db37855644543b6406535), ROM_BIOS(3)) + // 4: blank screen + ROM_SYSTEM_BIOS(4, "31e", "31E") + ROMX_LOAD( "881avio_01-08-96.31e", 0x00000, 0x20000, CRC(b5ec7dca) SHA1(390f79f50de986c3874464202251398baa87f4b5), ROM_BIOS(4)) + // 5: blank screen + ROM_SYSTEM_BIOS(5, "32h", "32H") + ROMX_LOAD( "8810aio_06-27-96.32h", 0x00000, 0x20000, CRC(b7e9d590) SHA1(bfdfa64bc87f2eb0d362e87755dce70584675427), ROM_BIOS(5)) + // 6: blank screen, possibly for update only + ROM_SYSTEM_BIOS(6, "32j", "32J") + ROMX_LOAD( "8810aio_12-11-96.32j", 0x00000, 0x20000, CRC(c6baec8b) SHA1(79bccaefb75e2df071d6edd191eea74aa82dc620), ROM_BIOS(6)) + // 7: blank screen + ROM_SYSTEM_BIOS(7, "32f", "32F") + ROMX_LOAD( "881032f.rom", 0x00000, 0x20000, CRC(5c337ae6) SHA1(29bc48a3d5165afa79612baf6deb9c04c7e55b32), ROM_BIOS(7)) + // 8: blank screen + ROM_SYSTEM_BIOS(8, "v145", "V145") + ROMX_LOAD( "8810aio_v145_09-21-94.bin", 0x00000, 0x20000, CRC(a253c017) SHA1(8273defe95a13ea0a260d4a410d601f82a947ad9), ROM_BIOS(8)) + // 9: 06/23/95-UMC-881/886-2A4X5E11-00 / Version VBS1.10H UM8810 ECS (Highscreen boot logo) + ROM_SYSTEM_BIOS(9, "v110h", "V1.10H") + ROMX_LOAD( "vbs1.10h.bin", 0x00000, 0x20000, CRC(1bf29727) SHA1(77ccd34110ec0387cdcfa260332b403d0c197d17), ROM_BIOS(9)) +ROM_END + + +// ***** 486 motherboards using the UMC UM82C491F UM82C493F or clones (BIOTEQ) chipset + +// Chicony CH-491E Rev. 1.4 - Chipset: UMC UM82C491F UM82C493F - BIOS: 04/04/93 AMI AB1987679 28pin - Keyboard-BIOS: AMIKEY +// BIOS-String: 40-0102-001116-00101111-040493-UMC491F-0 / UMC 491 for 80486 AUTO - ISA16: 4, ISA16/VL: 3 +ROM_START( ch491e ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "ch491e.bin", 0x10000, 0x10000, CRC(2d24ff24) SHA1(72f35c19e907c6d0a03a49bd362c4f57cc89da1c)) +ROM_END + +// Aquarius System (ASI) MB-4D33/50NR VER:01 - Chipset: UMC UM82C491F UM82C493F - CPU: AM486DX2-66 - BIOS: Award 1060176, 28pin - Keyboard-BIOS: JETkey V5.0 +// BIOS-String: 03/09/94-UMC-491-2C4X2A30-00 / MB-4D33/50NR-02 - ISA8: 1, ISA16: 3, ISA16/VL: 3 +ROM_START( mb4d33 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-mb-4d33.bin", 0x10000, 0x10000, CRC(f1299131) SHA1(d8e2749e180135e23483e36a0a05479e64f23d8c)) +ROM_END + + // BIOS-String: 40-0100-001281-00101111-080893-UMC491F-0 / HL3SC/SM AMI BIOS VER 4.9 01/09/'95 +ROM_START( 4dmuhl3s ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "3s-49-1.rom", 0x10000, 0x10000, CRC(78a8ea39) SHA1(35e2d0103da28b93a8c1addb1f083bd6e4239d2a)) +ROM_END + +// Elitegroup ECS UC4915 A AIO - Chipset: UMC UM82C491F UM82C493F UM82C865F SMC FDC37C662QF P, PROCHIP PR 4030 - CPU: Socket 3 +// BIOS: AMI 486DX ISA BIOS AB2683223 28pin in 32pin socket - Keyboard-BIOS: Intel/AMI MEGA-KB-H-WP +// BIOS-String: 40-0401-001131-00101111-040493-UMC491C-0 / VOBIS UC4915-A V1.1 11-05-93' - ISA16: 4, ISA16/VL: 2 - OSC: 14.31818 - On board: IDE, Floppy, 2xser, par, Game +ROM_START( ec4915aio ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-ecs-uc4915-a-aio.bin", 0x10000, 0x10000, CRC(5b3429a3) SHA1(a1b3ddb6a0939d20ae66e034914ea94648ca7149)) +ROM_END + +// Elitegroup UC4913 REV:1.1 (Peacock sticker)- Chipset: UMC UM 82491F 82C493F - CPU: 486 - BIOS: AMI 486DX ISA BIOS AA8960448 (28pin) - Keyboard-BIOS: AMI/Intel +// OSC: 14.31818 - RAM: SIMM30x8, Cache: 9 sockets, 4 (UM61256CK-20)+1 (MS6264A-20NC) filled - ISA8: 2, ISA16: 3, ISA16/VL: 3 +// BIOS-String: 40-0401-001131-00101111-040493-UMC491C-0 / Peacock AG UC4913 BIOS Ver. 1.0 01.09.93 +ROM_START( ec4913 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-peacock-uc4913-aa8960338.bin", 0x10000, 0x10000, CRC(58e6753c) SHA1(077c11532572ca0399f76a7ba2d31b8c1ca75d48)) +ROM_END + +// Biostar MB-1433UCV - Chipset: BIOTEQ 82C3491, 82C3493 (check mb133340 for a 386 motherboard using the same chipset) +// CPU: 486DX2-66 - RAM: 8xSIMM30, Cache: 8+1x28pin(AS57C256-20PC) - ISA8: 1, ISA16: 3, ISA16+VL: 3 - BIOS: AMI AB0975913 - Keyboard-BIOS: JETkey V5.0 - RTC: TH6887A 9410 +ROM_START( mb1433ucv ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS-String: 40-0100-001223-00101111-040493-UMC491F-0 / MB-1333/40UCG-A, MB-1333/40UCQ-B / MB-1433-40UDV-A, MB-1433/50UCV-C, MB-6433/50UPC-A for EXT. RTC + ROM_SYSTEM_BIOS(0, "ucvd", "UCV-D") + ROMX_LOAD( "biostar_bios_mb-1433-50ucv-d_pcb_ver_2.bin", 0x10000, 0x10000, CRC(e5ff2d76) SHA1(d2abe00eb2051ec7cb9423cdb8b52e91f7e2d416), ROM_BIOS(0)) + // 1: BIOS-String: 40-0100-001223-00101111-04093-UMC491f-0 / UCV-G + ROM_SYSTEM_BIOS(1, "ucvg", "UCV-G") + ROMX_LOAD( "bioteq.rom", 0x10000, 0x10000, CRC(93321e89) SHA1(450e35787607a4b6aecd3159d6c0599a03cd42b1), ROM_BIOS(1)) +ROM_END + +// Mitac PWA-IH4077C - Chipset: UMC UM82C491F + UM82c493F - CPU: Socket 3, solder pads for PQFP CPU - RAM: 4xSIMM30, Cache: 9xUM61256AK-15 - OSC: 14.31818 +ROM_START( pwaih4077c ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS String: 04/13/94-UMC-491-2C4X2m31-00 - UMC491F 80486 BIOS...1.01.00 (3371-3372) - BIOS label: IH4077CN BIOS R1.01.00 + // BIOS Version: Award 4.50G 04/13/94 - Keyboard BIOS: VIA VT82C42N + ROM_SYSTEM_BIOS(0, "012694", "01/26/94") + ROMX_LOAD( "ih4077c-1.00.00.bin", 0x10000, 0x10000, CRC(e75cca73) SHA1(4f27d16f4f8fce9d3410821ec62780f7df669776), ROM_BIOS(0)) + // 1: BIOS-String: 04/13/94-UMC-491-2C4X2m31-00 - UMC491F 80486 BIOS...1.01.00 (3371-3372) + ROM_SYSTEM_BIOS(1, "041394", "04/13/94") + ROMX_LOAD( "4077c101.bio", 0x10000, 0x10000, CRC(b6a27c48) SHA1(18ee3b2fc4897cbaafc0e0298938ba58a3a7f84c), ROM_BIOS(1)) +ROM_END + + +// ***** motherboards using the Unichip U4800 chipset + +// Gemlight GMB-486UNP v2.1 - Chipset: Unichip U4800-VLX, SIS85C206 - CPU: solder pads for 486FQFP, i486DX2-66 - RAM: 8xSIMM30, Cache: 8xUM61256AK-15 +// BIOS: AMI 486DX ISA BIOS - ISA16: 4, ISA16/VLB: 3 +ROM_START( gmb486unp ) // BIOS String: 40-0405-428036-00101111-080893-U4800-VLX-H / screen remains blank + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "gmb-486unp.bin", 0x10000, 0x10000, CRC(17d770c7) SHA1(8655610ceaf7bd9c17d7c0a550805ae55f128660)) +ROM_END + +// UNICHIP 486 WB 4407 REV 1.0 - Chipset: KS83C206Q UNICHIP U4800-VLX - BIOS: AMI 486 ISA BIOS AA6562949, 28pin - Keyboard-BIOS: AMI 2050778 +// BIOS-String: 40-0200-001107-0010111-111192-U4800VLX-0 / 4407 UNICHIP BIOS VER 1.0 - OSC: 14.31818 - ISA16: 4, ISA16/VL: 3 +ROM_START( uniwb4407 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "unichip_486_wb_4407.bin", 0x10000, 0x10000, CRC(91237686) SHA1(7db14451cc3e00a2273a453152a817bccbdfb10e)) +ROM_END + +ROM_START( uni4800 ) + ROM_REGION32_LE(0x20000, "bios", 0) + // BIOS-String: 40-05TB-006257-00101111-060692-UNI4800-0 + ROM_LOAD( "uni4800.ami", 0x10000, 0x10000, CRC(555c4c34) SHA1(0a907d7a0ec16e9369d77a1ac1afb0e69e3d6c1a)) +ROM_END + + +// ***** 486 motherboards using the VIA VT82C495 VT82C481 chipset + +// FIC 4386-VC-V - CPU: 486 - Chipset: VIA VT82C495 VT82C481 - ISA8: 2, ISA16: 3, ISA16/VL: 2 - OSC: 33.333MHz - BIOS: AMI 486DX ISA BIOS AA6387315 (28pin) - +// BIOS-String: X0-0100-001121-00101111-021993-VIA-0 / Version 1.02 - Keyboard-BIOS: Lance LT38C41 +ROM_START( fic4386vcv ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-4386-vc.bin", 0x10000, 0x10000, CRC(659210c2) SHA1(a730a547f3af215459632160fa670fde7e9c4f9a)) +ROM_END + +// HIGHSCREEN 486 Universal Board C82C33-A VIA4386-VIO - Chipset: VIA VT82C495 VT82C481, Winbond WB3757F - CPU: AM486DX2-66 +// BIOS: Award F0599630 - Keyboard BIOS: AMI 1131 KEYBOARD BIOS PLUS - BIOS-String: Award Modular BIOS v4.20 / Version 1.143K +// On board: IDE, Floppy, 2xser, par, game - OSC: 32.0000MHz - ISA16: 6 +ROM_START( via4386vio ) // probably a FIC board - KEYBOARD ERROR OR NO KEYBOARD PRESENT + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-highscreen.bin", 0x10000, 0x10000, CRC(059b6e51) SHA1(f8ede823e41cfa6f72bd9717ec75419079f9c40b)) +ROM_END + +// FIC 4386-VC-HD - Chipset: VIA VT82C481, VT82C495 - this board can take either 386 or 486 CPUs +// Keyboard-BIOS: Lance LT38C41 - CPU: AMD AMD386DX-40, FPU: IIT 3C87-40 - ISA16: 6 +ROM_START( fic4386vchd ) + ROM_REGION32_LE(0x20000, "bios", 0) + // 0: BIOS: AMI; Version 1.04; 06/06/92 - BIOS-String: X0-0100-001121-00101111-021993-VIA-0 / Version 1.04 + ROM_SYSTEM_BIOS(0, "ami104", "AMI V1.04") + ROMX_LOAD( "3vim001.bin", 0x10000, 0x10000, CRC(668d8cab) SHA1(409b81e33ca07b0a9724dbb6ca395a3a0887aa02), ROM_BIOS(0)) + // 1: BIOS: Award F0111730 v1.15K 03/12/93-VENUS-VIA - BIOS-String: Award Modular BIOS v4.20 / Version 1.15K + ROM_SYSTEM_BIOS(1, "awav115k", "Award V1.15k") // KEYBOARD ERROR OR NO KEYBOARD PRESENT + ROMX_LOAD( "4386-vc-hd v1.15k.bin", 0x10000, 0x10000, CRC(acc5db45) SHA1(cb93322735e96614d3c54fbfcd4291ff1b3ca57c), ROM_BIOS(1)) + // 2: AWARD v4.20 F0166061 (28pin) - Keyboard-BIOS: Lance LT38C41 - CPU: 486 - BIOS-String + ROM_SYSTEM_BIOS(2, "awav110k", "Award V1.10K") // KEYBOARD ERROR OR NO KEYBOARD PRESENT + ROMX_LOAD("486-4386-vc-hd.bin", 0x10000, 0x10000, CRC(a32d30fc) SHA1(815a63e624b3145d9955aa3ce8c4c1e34fb438bb), ROM_BIOS(2)) + // 3: ID: Peacock 4386-VCHD - Chipset: VIA VT82C481, VT82C495 - CPU: AMD Am386DX-40, socket for 486 provided + // RAM: 8xSIMM30, Cache: 10x28pin sockets - BIOS: Award 386DX F0121091 PEA 2_0 - ISA16: 6 - OSC: 80.0000MHz + ROM_SYSTEM_BIOS(3, "pea20", "Pea 2_0") // BIOS-String: Award Modular BIOS V4.20 / 4386 BIOS Ver. 2.0 01.04.93 - KEYBOARD ERROR OR NO KEYBOARD PRESENT + ROMX_LOAD("386-peacock-4386-vchd.bin", 0x10000, 0x10000, CRC(1cd08629) SHA1(9a2b359ade2e93ab1d164e3e4f2cb9e8604cd43d), ROM_BIOS(3)) +ROM_END + +// FIC 486-VC-HD - BIOS Version: AMI 05/05/1991 - Chipset: VIA VT82C495 VT82C481, DS1287/1187 - EPROM Label: 486EB +// Keyboard BIOS: Lance LT38C41 - CPU: Intel 80486DX-33, solder pads for 80486 - RAM: 8xSIMM30, Cache: 10x28pin DIP (4xKM68257BP-25, 1xMCM6206CP fitted) +// OSC: 33.333MHz - ISA16: 6 +ROM_START( fic486vchd ) // BIOS ID String: 40-04C1-ZZ1124-00101111-050591-ET/486H-0 + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "486-vc-hd_doc11670.bin", 0x10000, 0x10000, CRC(607ebe18) SHA1(870080bb49bad42fb4433f9208c17ad1c7ee437d)) +ROM_END + + +// ***** 486 motherboards using the VIA VT82C505 + VT82C496G + VT82C406MV chipset + +// FIC 486-PIO-2 (4 ISA, 4 PCI) +// VIA VT82C505 (ISA/VL to PCI bridge) + VT82C496G (system chipset) + VT82C406MV (keyboard controller, RTC, CMOS), NS311/312 or NS332 I/O +ROM_START( ficpio2 ) + ROM_REGION32_LE(0x40000, "isa", ROMREGION_ERASEFF) + ROM_DEFAULT_BIOS("ficpio2c1") + // 0 + ROM_SYSTEM_BIOS(0, "ficpio2c7", "FIC 486-PIO-2 1.15C701") /* pnp, i/o core: NS 332, doesn't boot, requires cache emulation? */ + ROMX_LOAD( "115c701.awd", 0x020000, 0x20000, CRC(b0dd7975) SHA1(bfde13b0fbd141bc945d37d92faca9f4f59b716d), ROM_BIOS(0)) + // 1 + ROM_SYSTEM_BIOS(1, "ficpio2b7", "FIC 486-PIO-2 1.15B701") /* pnp, i/o core: NS 311/312, doesn't boot, requires cache emulation? */ + ROMX_LOAD( "115b701.awd", 0x020000, 0x20000, CRC(ac24abad) SHA1(01174d84ed32fb1d95cd632d09f773acb8666c83), ROM_BIOS(1)) + // 2: BIOS-String: 04/18/96-VT496G-2A4LF0IC-00 / Version 1.15C101 + ROM_SYSTEM_BIOS(2, "ficpio2c1", "FIC 486-PIO-2 1.15C101") /* non-pnp, i/o core: NS 332, working */ + ROMX_LOAD( "115c101.awd", 0x020000, 0x20000, CRC(5fadde88) SHA1(eff79692c1ecf34b6ea3f02409d14ce1f5c51bf9), ROM_BIOS(2)) + // 3: BIOS-String: 04/18/96-VT496G-2A4LF0IC-00 / Version 1.15B101 + ROM_SYSTEM_BIOS(3, "ficpio2b1", "FIC 486-PIO-2 1.15B101") /* non-pnp, i/o core: NS 311/312, working */ + ROMX_LOAD( "115b101.awd", 0x020000, 0x20000, CRC(ff69617d) SHA1(ecbfc7315dcf6bd3e5b59e3ae9258759f64fe7a0), ROM_BIOS(3)) + // 4: no display - CPU: Socket3 - On board: 2xser, par, 2xIDE, Floppy, par - BIOS: Award F4215801, 32pin - ISA16: 4, PCI: 4 + ROM_SYSTEM_BIOS(4, "ficpio2", "FIC 486-PIO-2 DOC 14580") + ROMX_LOAD( "486-pio2.bin", 0x20000, 0x20000, CRC(4609945d) SHA1(7ad446bc3b27f3f636fb5884e58b055681f081eb), ROM_BIOS(4)) +ROM_END + +// FIC 486-VIP-IO2 (3 ISA, 4 PCI) +// VIA VT82C505 + VT82C496G + VT82C406MV +// Boot block - BIOS-String: 05/28/96-VT496G-2A4L6F0IC-00 / 1.164G701 +ROM_START( ficvipio2 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "1164g701.awd", 0x00000, 0x20000, CRC(7b762683) SHA1(84debce7239c8b1978246688ae538f7c4f519d13)) +ROM_END + + +//************************************************************************** +// 80486 Desktop +//************************************************************************** + +// NEC APC IV aka - available in three different packages: Wide desktop: Year: 1986 / Chipset: CHIPS P82C201, P82A204 and P82A205 +// Portable: white/blue LCD +ROM_START( necapciv ) + ROM_REGION16_LE(0x20000, "bios", 0) + // 0: Phoenix 80286 ROM BIOS Version 1.57 / APC IV / NEC Corporation + // on board: 2xser, par, Floppy - see https://stason.org/TULARC/pc/motherboards/N/NEC-TECHNOLOGIES-INC-286-APC-IV-SERIES-G9YAN.html for settings + ROM_SYSTEM_BIOS(0, "wide157", "Wide desktop V1.57") + ROMX_LOAD( "yan7m06.bin", 0x10000, 0x8000, CRC(21deafcb) SHA1(477fb36d64a9a60f6dc572fef1095391f6da73b3), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "yan7k06.bin", 0x10001, 0x8000, CRC(97563bae) SHA1(81ea93e1cd55e284609fdff6574aa49b06cd8a7f), ROM_SKIP(1) | ROM_BIOS(0)) + // 1: Phoenix 80286 ROM BIOS Version 3.07 03 / NEC Corporation + // Narrow desktop (APC IV Powermate 1): Available with EGA (LIAI852/EVC215-001 chip) or VGA and 8Mhz/640k version and a 10Mhz/1MB version. [Ctrl]+[Alt]+[-] + // is the speed switch on the 10MHz version. + // on board: ser, par, Floppy - see http://www.uncreativelabs.de/th99/m/M-O/31487.htm for settings + ROM_SYSTEM_BIOS(1, "narrow", "Narrow desktop V3.07 03") + ROMX_LOAD( "bbx10j02.bin", 0x10000, 0x8000, CRC(5bb8c773) SHA1(21df040a92b2ee17e83955776af4ab14350d5ffd), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "bbx10g02.bin", 0x10001, 0x8000, CRC(050159ef) SHA1(b1e627f5d5ef749c51597b7be75f56bb8ff4d8af), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +// NCR Class 3433 - CPU: 486SX/DX 25/33, coprocessor socket provided - Chipset: NCR WPD CLEMSON 006-2001325 CQO1842 9209N +// LSI LOGIC L1A5840 006-2000654B NAR 9212Delta WG35494 GERMANY, NCR 006-2001895 WPD FALCON E CQO 2291 9218N, +// WD58C65JM, VLSI 9210AV 211411 VGA8203C4570 NCR PB 006-2001329, Dallas DS1387 +// OSC: 16.000000MHz, 1.8432MHz, 65.00000MHz, 25.175/26.322, 36.000000MHz, 50.000000MHz, 14.31818MHz, 66.66600MHz +// on board VGA: NCR 77C22 VGA-2 609-3400639 CQO1570 9210R, 8xMCM514245AJ70 +// Slots: 4xMCA, 3x32-bit external memory card, 1xSCSI host adapter - ports: PS/2 mouse, keyboard, 2xserial, parallel, floppy +ROM_START( ncr3433 ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + // 0: NCR ROM BIOS Version 82.01.00 (3433, 3434, 3432, 3437) + ROM_SYSTEM_BIOS(0, "82.01.00", "82.01.00") + ROMX_LOAD( "rbios206.bin", 0x00000, 0x20000, CRC(06e77547) SHA1(41c517b284ed6335024c2b8398504cf3eb8a09e1), ROM_BIOS(0) ) + // 1: NCR ROM BIOS Version 83.01.00 (3433, 3434, 3432, 3437) + ROM_SYSTEM_BIOS(1, "83.01.00", "83.01.00") + ROMX_LOAD( "rbios1.bin", 0x00000, 0x20000, CRC(cf793ce9) SHA1(69d531d14a86bdada8940ba2466515ebcd870d0d), ROM_BIOS(1) ) + + ROM_REGION( 0x0800, "keyboard", 0 ) + ROM_LOAD( "i8742_150-0008390_vers_3.1.bin", 0x000, 0x800, CRC(1bf17f29) SHA1(031ea1bb40756e3e5a1f01b01a53cc3a7c074338) ) +ROM_END + +// Amstrad PC9486 - Board Type - UX486VIO-A Rev. 1.0 - Chipset: UMC - UM82C481BF/UM82C482AF/UM82C206F - BIOS/Version: AMI 486DX ISA BIOS 1993 - AA9222968 +// BIOS String: 40-0100-001131-00111111-111192-UMC480-0 / Amstrad PC9486 - CPU: 80486sx-25 in Socket 3, solder pads for 486 CPU - RAM: 4xSIMM30, 1xSIMM72, Cache: 64K/128K256K +// on board VGA: Cirrus Logic CL-GD5426-80QC-A, 2xKM416C256AJ-7 - Jumpers: Parallel out/bidirectional, VGA enable/disable, SIMM type, PQFP or socket, +// 20/25/33/40/50 MHz, Parity enable/disable, - CPU type - on board: VGA, Floppy, IDE - slots: 1, for riser card +ROM_START( pc9486 ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD ( "9486_saverom.bin", 0x00000, 0x20000, CRC(cbc35a4e) SHA1(dfa614c8255a1407c9850fa4ff99a6b2a52e1a4f) ) +ROM_END + +//************************************************************************** +// 80486 Laptop/Notebook +//************************************************************************** + +// Siemens-Nixdorf PCD-4NL 486 subnotebook +// PhoenixBIOS(TM) A486 Version 1.03 +// complains about "Pointer device failure" and "Memory failure at 00100000, read AA55 expecting 002C +ROM_START( pcd4nl ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "pcd4nl.bin", 0x00000, 0x20000, CRC(8adb4900) SHA1(a01c665fed769ff815bc2e5ae30901f7e12d721b) ) +ROM_END + +// Siemens-Nixdorf PCD-4ND 486 notebook - display remains blank +// Graphics chip: WDC WD90C24A-ZZ on VESA Local Bus, 4MB on mainboard, 4MB/8MB/16MB on CF card like RAM modules +// CPU: Intel 486 SX, 486DX2, 486DX4-75 or -100, 128KB Flash-Eprom for system and video BIOS, ESS688 soundchip +ROM_START( pcd4nd ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_SYSTEM_BIOS(0, "pcd4ndno1", "pcd4ndno1") + ROMX_LOAD( "bf3m51.bin", 0x00000, 0x20000, CRC(6a2f90dd) SHA1(75704a83976e4bb02a028e761d01bd053cc0d4e7), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "pcd4ndno2", "pcd4ndno2") + ROMX_LOAD( "bf3q42.bin", 0x00000, 0x20000, CRC(fa81cf6e) SHA1(91313a6856ca22f40710a6c9c8a65f8e340784ab), ROM_BIOS(1) ) + ROM_SYSTEM_BIOS(2, "pcd4ndno3", "pcd4ndno3") + ROMX_LOAD( "pcd-4nd_flash_28010.bin", 0x00000, 0x20000, CRC(53c0beea) SHA1(bfa17947529c51a8c9315884e156c01ddd23c0d8), ROM_BIOS(2) ) +ROM_END + +// LION 3500C notebook +ROM_START( lion3500 ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "lion3500.bin", 0x00000, 0x20000, CRC(fc409ac3) SHA1(9a7aa08b981dedffff31fda5d3496469ae2ec3a5) ) +ROM_END + +// Highscreen 486-25 aka Midwest Micro Elite TS34T-25 notebook +// integrated trackball - CPU: i486sx-25 - Chipset: Chips F82C721, Intel ?80C51SLBG, MCCS1468188F, AvaSem AV9129-08CW28, ACC Micro 2046, LT1137CS +// Video: CL-GD6410-320C-A - HD: Maxtor 2585AT +ROM_START( ts34t25 )// blank display + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "p101a002_sys_bios_62fc.u24", 0x00000, 0x20000, CRC(2ce568bc) SHA1(84dc595abf0bf1948a6479afdea4a169f40e3b1b)) + + ROM_REGION( 0x8000, "pmu", 0 ) // rom contains "PMU" string + ROM_LOAD( "s34t0003_51slbios_019f.u31", 0x00000, 0x8000, CRC(40467716) SHA1(f976f2ce13eb22e0ed164d31d6382eda489545c1)) +ROM_END + +// Highscreen Colani Blue Note +// Chipset: Cirrus Logic CL-GD6235-65QC-A, CL-PD6720-QC-A ETEQ ET6000 A, Appian ADI2, SMC FDC37C651 QF P, DIA UA0300-QA, Chips F82C206J +// Video: Dual Scan Color LCD (monochrome available) - RAM: 4MB on board, RAM expansion board - on board: trackball, ser, par, PS2, VGA +// mass storage: Floppy, IDE - expansion: 2xPCMCIA, expansion bus +ROM_START( bluenote ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "7500d_rev26_121593.bin", 0x00000, 0x20000, CRC(d564f855) SHA1(181e4097c3b4ca2e8e79f1732d4aef9edd5b4586)) +ROM_END + +// Siemens PG-750 486 EISA +// blank screen, beeps +ROM_START( pg750eisa ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD( "pg_pg750_486_eisa.bin", 0x10000, 0x10000, CRC(2e6149a9) SHA1(9fcf29a6169efa1359c7c3eff09326dd3e4001dc)) +ROM_END + + +/*************************************************************************** + Game driver(s) +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 198?, asi100b0, ibm5170, 0, atturbo, 0, at_state, init_at, "", "PC/AT (6 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 1987, ataripc4, ibm5170, 0, neat, 0, at_state, init_at, "Atari", "PC4", MACHINE_NOT_WORKING ) +COMP( 1989, atariabc286,ibm5170,0, neat, 0, at_state, init_at, "Atari", "ABC-286/30", MACHINE_NOT_WORKING ) +COMP( 1987, atturbo, ibm5170, 0, atturbo, 0, at_state, init_at, "", "PC/AT Turbo (12 MHz, MF2 Keyboard)" , MACHINE_NOT_WORKING ) +COMP( 198?, aubam12s2, ibm5170, 0, atturbo, 0, at_state, init_at, "AUVA COMPUTER, INC.", "BAM/12-S2", MACHINE_NOT_WORKING ) +COMP( 198?, bam16a0, ibm5170, 0, atturbo, 0, at_state, init_at, "AUVA", "VIP-M21502A BAM16-A0", MACHINE_NOT_WORKING ) +COMP( 198?, bay1000c, ibm5170, 0, atturbo, 0, at_state, init_at, "Mintek", "BAY-1000C V1.01", MACHINE_NOT_WORKING ) +COMP( 199?, bi025c, ibm5170, 0, atturbo, 0, at_state, init_at, "", "BI-025C HT-12 286 (HT12/A chipset)", MACHINE_NOT_WORKING ) +COMP( 1990, c286lt, ibm5170, 0, atturbo, 0, at_state, init_at, "Commodore Business Machines", "Laptop C286LT", MACHINE_NOT_WORKING ) +COMP( 199?, cdtekg2, ibm5170, 0, atturbo, 0, at_state, init_at, "CDTEK", "286 mainboard with Headland G2 chipset", MACHINE_NOT_WORKING ) +COMP( 1990, cl28612s, ibm5170, 0, atturbo, 0, at_state, init_at, "Wearnes", "CL286-12/16S (CL286-12S and CL286-16S)", MACHINE_NOT_WORKING ) +COMP( 198?, cmpa286, ibm5170, 0, atturbo, 0, at_state, init_at, "CMP enterprise CO.LTD.", "286 motherboard", MACHINE_NOT_WORKING ) +COMP( 1987, comportii ,ibm5170, 0, comportii, 0, at_state, init_at, "Compaq", "Portable II", MACHINE_NOT_WORKING ) +COMP( 1987, comportiii,ibm5170, 0, comportiii,0, at_state, init_at, "Compaq", "Portable III", MACHINE_NOT_WORKING ) +COMP( 1988, comslt286, ibm5170, 0, atturbo, 0, at_state, init_at, "Compaq", "SLT/286", MACHINE_NOT_WORKING ) +COMP( 199?, csl286, ibm5170, 0, atturbo, 0, at_state, init_at, "Commodore Business Machines", "SL 286-16", MACHINE_NOT_WORKING ) +COMP( 1988, dsys200, ibm5170, 0, atturbo, 0, at_state, init_at, "Dell Computer Corporation", "System 200", MACHINE_NOT_WORKING ) +COMP( 1989, ec1842, ibm5150, 0, ec1842, 0, at_state, init_at, "", "EC-1842", MACHINE_NOT_WORKING ) +COMP( 1993, ec1849, ibm5170, 0, ec1842, 0, at_state, init_at, "", "EC-1849", MACHINE_NOT_WORKING ) +COMP( 198?, elanht286, ibm5170, 0, ibm5162, 0, at_state, init_at, "Leanord SA", "Elan High Tech 286", MACHINE_NOT_WORKING ) +COMP( 198?, elt286b, ibm5170, 0, neat, 0, at_state, init_at, "Chaintech", "ELT-286B-160B(E)", MACHINE_NOT_WORKING ) +COMP( 198?, epsax, ibm5170, 0, ibm5162, 0, at_state, init_at, "Epson", "PC AX", MACHINE_NOT_WORKING ) +COMP( 198?, epsax2e, ibm5170, 0, atturbo, 0, at_state, init_at, "Epson", "PC AX2e", MACHINE_NOT_WORKING ) +COMP( 1989, euroat, ibm5170, 0, euroat, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "Euro AT", MACHINE_NOT_WORKING ) +COMP( 198?, ev1806, ibm5170, 0, ibm5162, 0, at_state, init_at, "Everex Systems", "EV-1806", MACHINE_NOT_WORKING ) // continuous beeps (RAM not detected?) +COMP( 198?, ev1815, ibm5170, 0, ibm5162, 0, at_state, init_at, "Everex Systems", "EV-1815", MACHINE_NOT_WORKING ) // continuous beeps (RAM not detected?) +COMP( 1986, ews286, ibm5170, 0, ews286, 0, at_state, init_at, "Ericsson", "Ericsson WS286", MACHINE_NOT_WORKING ) +COMP( 199?, headg2, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with Headland G2 chipset", MACHINE_NOT_WORKING ) +COMP( 19??, ht12a, ibm5170, 0, atturbo, 0, at_state, init_at, "", "unknown 286 AT clones (HT12/A chipset)", MACHINE_NOT_WORKING ) +COMP( 1985, ibm5162, ibm5170, 0, ibm5162, 0, at_state, init_at, "International Business Machines", "PC/XT-286 5162", MACHINE_NOT_WORKING ) +COMP( 1984, ibm5170, 0, ibm5150, ibm5170, 0, at_state, init_at, "International Business Machines", "PC/AT 5170", MACHINE_NOT_WORKING ) +COMP( 1985, ibm5170a, ibm5170, 0, ibm5170a, 0, at_state, init_at, "International Business Machines", "PC/AT 5170 8MHz", MACHINE_NOT_WORKING ) +COMP( 1989, ibm2011, ibm5170, 0, ibmps1, 0, at_vrom_fix_state, init_at, "International Business Machines", "PS/1 2011", MACHINE_NOT_WORKING ) +COMP( 1989, ibm2011rd, ibm5170, 0, ibmps1, 0, at_vrom_fix_state, init_at, "International Business Machines", "PS/1 2011 (international models with ROM DOS)", MACHINE_NOT_WORKING ) +COMP( 198?, icldrsm40, ibm5170, 0, neat, 0, at_state, init_at, "ICL", "DRS M40", MACHINE_NOT_WORKING ) +COMP( 1985, k286i, ibm5170, 0, k286i, 0, at_state, init_at, "Kaypro", "286i", MACHINE_NOT_WORKING ) +COMP( 199?, kma202f, ibm5170, 0, atturbo, 0, at_state, init_at, "", "KMA-202F-12R (Winbond chipset)", MACHINE_NOT_WORKING ) +COMP( 19??, kt216wb5, ibm5170, 0, ibm5162, 0, at_state, init_at, "KT Technology", "KT216WB5-HI Rev.2", MACHINE_NOT_WORKING ) +COMP( 198?, lm103s, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "LM-103S", MACHINE_NOT_WORKING ) +COMP( 1987, m290, ibm5170, 0, atturbo, 0, at_state, init_at, "Olivetti", "M290", MACHINE_NOT_WORKING ) +COMP( 198?, magb233, ibm5170, 0, ibm5162, 0, at_state, init_at, "Magitronic Technology", "Magitronic B233", MACHINE_NOT_WORKING ) +COMP( 198?, magb236, ibm5170, 0, ibm5162, 0, at_state, init_at, "Magitronic Technology", "Magitronic B236", MACHINE_NOT_WORKING ) +COMP( 19??, mat286, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "MAT286 Rev.D", MACHINE_NOT_WORKING ) +COMP( 199?, mb1212c, ibm5170, 0, atturbo, 0, at_state, init_at, "Biostar", "MB-1212C", MACHINE_NOT_WORKING ) +COMP( 199?, mba009, ibm5170, 0, atturbo, 0, at_state, init_at, "", "HLB-286 MBA-009", MACHINE_NOT_WORKING ) +COMP( 199?, micral45, ibm5170, 0, micral45, 0, at_state, init_at, "Bull", "Micral 45", MACHINE_NOT_WORKING ) +COMP( 199?, minisys2k, ibm5170, 0, atturbo, 0, at_state, init_at, "SIIG", "MiniSys 2000", MACHINE_NOT_WORKING ) +COMP( 198?, mkp286, ibm5170, 0, atturbo, 0, at_state, init_at, "Morse", "KP-286", MACHINE_NOT_WORKING ) +COMP( 1987, n8810m15, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M15", MACHINE_NOT_WORKING ) +COMP( 1990, n8810m16c, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 CGA version", MACHINE_NOT_WORKING ) +COMP( 1990, n8810m30, ibm5170, 0, neat, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M30", MACHINE_NOT_WORKING ) +COMP( 1986, n8810m55, ibm5170, 0, n8810m55, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M55", MACHINE_NOT_WORKING ) +COMP( 1990, n8810m16v, ibm5170, 0, atturbo, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 VGA version", MACHINE_NOT_WORKING ) +COMP( 199?, ncr3302, ibm5170, 0, neat, 0, at_state, init_at, "NCR", "Class 3302 Model 0110", MACHINE_NOT_WORKING ) +COMP( 1986, ncrpc8, ibm5170, 0, atturbo, 0, at_state, init_at, "NCR", "PC-8", MACHINE_NOT_WORKING ) +COMP( 1989, neat, ibm5170, 0, neat, 0, at_state, init_at, "", "NEAT (12 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 1986, necapciv, ibm5170, 0, atturbo, 0, at_state, init_at, "NEC", "APC IV", MACHINE_NOT_WORKING ) +//COMP( 1988, nws286, ibm5170, 0, ews286, 0, at_state, at, "Nokia Data", "Nokia Data WS286", MACHINE_NOT_WORKING ) +COMP( 198?, o286foxii, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "Fox II", MACHINE_NOT_WORKING ) +COMP( 1990, ocfoxm, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "Fox M 286", MACHINE_NOT_WORKING ) +COMP( 199?, octekg2, ibm5170, 0, atturbo, 0, at_state, init_at, "Octek", "286 motherboard with Headland G2 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, olim203, ibm5170, 0, atturbo, 0, at_state, init_at, "Olivetti", "M203 motherboard", MACHINE_NOT_WORKING ) +COMP( 1988, pc30iii, ibm5170, 0, pc30iii, 0, at_state, init_at, "Commodore Business Machines", "PC 30-III", MACHINE_NOT_WORKING ) +COMP( 1988, pc40iii, ibm5170, 0, pc40iii, 0, at_state, init_at, "Commodore Business Machines", "PC 40-III", MACHINE_NOT_WORKING ) +COMP( 198?, pc45iii, ibm5170, 0, pc40iii, 0, at_state, init_at, "Commodore Business Machines", "PC 45-III", MACHINE_NOT_WORKING ) +COMP( 198?, pccm205, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M205", MACHINE_NOT_WORKING ) +COMP( 198?, pccm209, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M209", MACHINE_NOT_WORKING ) +COMP( 198?, pccm216, ibm5170, 0, atturbo, 0, at_state, init_at, "PC-Chips", "M216", MACHINE_NOT_WORKING ) +COMP( 1986, pcd2, ibm5170, 0, ibm5170, 0, at_state, init_at, "Siemens", "PCD-2", MACHINE_NOT_WORKING ) +COMP( 1991, pcd204, ibm5170, 0, atturbo, 0, at_state, init_at, "Philips", "PCD204 (PCD200 series)", MACHINE_NOT_WORKING ) +COMP( 198?, pcd2m, ibm5170, 0, atturbo, 0, at_state, init_at, "Siemens", "PCD-2M", MACHINE_NOT_WORKING ) +COMP( 198?, peas286, ibm5170, 0, atturbo, 0, at_state, init_at, "Peacock Computer", "S-286 Rev A", MACHINE_NOT_WORKING ) +COMP( 1990, profpc33, ibm5170, 0, atturbo, 0, at_state, init_at, "Profex", "PC 33", MACHINE_NOT_WORKING ) +COMP( 198?, prolite286,ibm5170, 0, neat, 0, at_state, init_at, "CAF", "Prolite 286/16", MACHINE_NOT_WORKING ) +COMP( 198?, pwb7270e, ibm5170, 0, neat, 0, at_state, init_at, "Advanced Logic Research", "PWB 7270 REV E", MACHINE_NOT_WORKING ) +COMP( 199?, samdm286, ibm5170, 0, atturbo, 0, at_state, init_at, "Samsung", "Deskmaster 286-12", MACHINE_NOT_WORKING ) +COMP( 199?, sarcpc, ibm5170, 0, ibm5162, 0, at_state, init_at, "", "80286 Standard System (SARC RC2015 chipset)", MACHINE_NOT_WORKING ) +COMP( 198?, snomi286, ibm5170, 0, atturbo, 0, at_state, init_at, "Snobol", "Mini 286", MACHINE_NOT_WORKING ) +COMP( 198?, suntac303, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with Suntac ST62C303-A chipset", MACHINE_NOT_WORKING ) +COMP( 199?, suntac6, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with 6-chip SUNTAC chipset", MACHINE_NOT_WORKING ) +COMP( 198?, td60c, ibm5170, 0, atturbo, 0, at_state, init_at, "", "TD60C", MACHINE_NOT_WORKING ) +COMP( 19??, toptek286, ibm5170, 0, ibm5162, 0, at_state, init_at, "Toptek Micro Computer", "286 Turbo", MACHINE_NOT_WORKING ) +COMP( 198?, towerat2xx,ibm5170, 0, atturbo, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "Tower AT 201, 202, 220, 240 and 260 (286,EGA)", MACHINE_NOT_WORKING ) +COMP( 198?, olyport40, ibm5170, 0, olyport40, 0, at_state, init_at, "AEG Olympia", "Olyport 40-21", MACHINE_NOT_WORKING ) +COMP( 199?, twinnet, ibm5170, 0, atturbo, 0, at_state, init_at, "Twinhead", "Netstation PC", MACHINE_NOT_WORKING ) +COMP( 198?, u3911v3, ibm5170, 0, atturbo, 0, at_state, init_at, "Uniron", "U3911-V3", MACHINE_NOT_WORKING ) +COMP( 198?, v286c, ibm5170, 0, atturbo, 0, at_state, init_at, "Victor", "V286C", MACHINE_NOT_WORKING ) +COMP( 198?, vlsi5, ibm5170, 0, atturbo, 0, at_state, init_at, "", "286 motherboards with 5-chip VLSI chipset", MACHINE_NOT_WORKING ) +COMP( 1981, wpc250, ibm5170, 0, atturbo, 0, at_state, init_at, "Wang Laboratories, Inc.", "PC-250/16", MACHINE_NOT_WORKING ) +COMP( 198?, wy220001, ibm5170, 0, ibm5162, 0, at_state, init_at, "Wyse", "WYSEpc 286", MACHINE_NOT_WORKING ) +COMP( 1989, xb42639, ibm5170, 0, xb42639, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus I Motherboard 286)" , MACHINE_NOT_WORKING ) +COMP( 1990, xb42639a, ibm5170, 0, xb42639, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus II Motherboard 286)" , MACHINE_NOT_WORKING ) +COMP( 198?, zdz248, ibm5170, 0, atturbo, 0, at_state, init_at, "Zenith Data Systems", "Z-248", MACHINE_NOT_WORKING ) +COMP( 199?, 386sxvhcom,ibm5170, 0, at386sx, 0, at_state, init_at, "", "80386SX-VH-COM", MACHINE_NOT_WORKING ) +COMP( 199?, 3siud, ibm5170, 0, at386sx, 0, at_state, init_at, "", "3SIUD-1.1", MACHINE_NOT_WORKING ) +COMP( 199?, alaleolx, ibm5170, 0, at386sx, 0, at_state, init_at, "Alaris RYC", "LEOPARD LX", MACHINE_NOT_WORKING ) +COMP( 199?, alim1217, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the ALi M1217 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, anch386s, ibm5170, 0, at386sx, 0, at_state, init_at, "ANIX", "CH-386S-16/20/25G", MACHINE_NOT_WORKING ) +COMP( 199?, asc486slc, ibm5170, 0, at386sx, 0, at_state, init_at, "Computechnik", "ASC486SLC", MACHINE_NOT_WORKING ) +COMP( 1988, at386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "", "PC/AT 386SX (16 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 1990, c386sx16, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "386SX-16", MACHINE_NOT_WORKING ) +COMP( 1990, c386sx25, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "386SX-25", MACHINE_NOT_WORKING ) +COMP( 1991, c386sxlt, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "Laptop C386SX-LT", MACHINE_NOT_WORKING ) +COMP( 1988, ct386sx, ibm5170, 0, ct386sx, 0, at_state, init_at, "", "NEAT 386SX (16 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 1993, cxsxd, ibm5170, 0, at386sx, 0, at_state, init_at, "CX Technology", "CX SXD", MACHINE_NOT_WORKING ) +COMP( 199?, dfi386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Diamond Flower International", "386SX-16/20CN Rev 1.0", MACHINE_NOT_WORKING ) +COMP( 199?, dvbslan, ibm5170, 0, at386sx, 0, at_state, init_at, "Datavan", "Book-Size LAN station", MACHINE_NOT_WORKING ) +COMP( 199?, ecs8517, ibm5170, 0, at386sx, 0, at_state, init_at, "Elitegroup", "ECS 8517 v3.3", MACHINE_NOT_WORKING ) +COMP( 199?, elt386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Elitegroup", "ELT-386SX-160BE", MACHINE_NOT_WORKING ) +COMP( 198?, eltp9, ibm5170, 0, at386sx, 0, at_state, init_at, "Chaintech", "ELT-P9 / most likely ELT-386SX-160D", MACHINE_NOT_WORKING ) +COMP( 198?, epsax3, ibm5170, 0, at386sx, 0, at_state, init_at, "Epson", "PC AX3", MACHINE_NOT_WORKING ) +COMP( 19??, ht18c, ibm5170, 0, at386sx, 0, at_state, init_at, "", "unknown 386sx AT clones (HT18/C chipset)", MACHINE_NOT_WORKING ) +COMP( 199?, ibm2121, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2121", MACHINE_NOT_WORKING ) +COMP( 199?, ibm2121rd, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2121 (international models with ROM DOS)", MACHINE_NOT_WORKING ) +COMP( 199?, ibm2123, ibm5170, 0, at386sx, 0, at_state, init_at, "International Business Machines", "PS/1 2123", MACHINE_NOT_WORKING ) +COMP( 199?, ilm396b, ibm5170, 0, at386sx, 0, at_state, init_at, "ILON USA, INC.", "M-396B", MACHINE_NOT_WORKING ) +COMP( 198?, ktx20t02, ibm5170, 0, at386sx, 0, at_state, init_at, "Quadtel", "QTC-SXM KT X20T02/HI Rev.3", MACHINE_NOT_WORKING ) +COMP( 199?, mbc18nb, ibm5170, 0, at386sx, 0, at_state, init_at, "Sanyo", "MBC-18NB", MACHINE_NOT_WORKING ) +COMP( 1992, mbc28, ibm5170, 0, at386sx, 0, at_state, init_at, "Sanyo", "MBC-28", MACHINE_NOT_WORKING ) // Complains about missing mouse hardware +COMP( 1993, megapc, 0, 0, megapc, 0, megapc_state, init_megapc, "Amstrad plc", "MegaPC", MACHINE_NOT_WORKING ) +COMP( 199?, mmbo4088, ibm5170, 0, at386sx, 0, at_state, init_at, "", "486MMBO4088 (TI TX486SLC/E)", MACHINE_NOT_WORKING ) +COMP( 199?, mokp386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Morse", "KP 386SX V2.21", MACHINE_NOT_WORKING ) +COMP( 199?, ocpanii, ibm5170, 0, at386sx, 0, at_state, init_at, "Octek", "Panther II", MACHINE_NOT_WORKING ) +COMP( 199?, op82c283, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the OPTi 82C283 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, op82c291, ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the OPTi 82C291 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, p386sx25pw,ibm5170, 0, at386sx, 0, at_state, init_at, "Prolink", "P386SX-25PW VER:2.00", MACHINE_NOT_WORKING ) +COMP( 198?, pc50ii, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "PC 50-II", MACHINE_NOT_WORKING ) +COMP( 198?, pcb303, ibm5170, 0, at386sx, 0, at_state, init_at, "Packard Bell", "PCB-303 Rev.01", MACHINE_NOT_WORKING ) +COMP( 199?, pccm396f, ibm5170, 0, at386sx, 0, at_state, init_at, "PC-Chips", "M396F", MACHINE_NOT_WORKING ) +COMP( 199?, pcd3nsl, ibm5170, 0, at386sx, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-3Nsl Notebook Computer", MACHINE_NOT_WORKING ) +COMP( 199?, pcd3nsx, ibm5170, 0, at386sx, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-3Nsx Notebook Computer", MACHINE_NOT_WORKING ) +COMP( 199?, php3239, ibm5170, 0, at386sx, 0, at_state, init_at, "Philips", "P3239", MACHINE_NOT_WORKING ) +COMP( 199?, ppm3333p, ibm5170, 0, at386sx, 0, at_state, init_at, "DTK Computer", "PPM-3333P", MACHINE_NOT_WORKING ) +COMP( 199?, pt319a, ibm5170, 0, at386sx, 0, at_state, init_at, "Pine", "PT-319A", MACHINE_NOT_WORKING ) +COMP( 199?, scamp386sx,ibm5170, 0, at386sx, 0, at_state, init_at, "", "386sx motherboards using the SCAMPSX chipset", MACHINE_NOT_WORKING ) +COMP( 199?, scsxaio, ibm5170, 0, at386sx, 0, at_state, init_at, "Peacock", "386sx Ver. 2.0 motherboard SCsxAIO", MACHINE_NOT_WORKING ) +COMP( 199?, sh386sx20, ibm5170, 0, at386sx, 0, at_state, init_at, "Shuttle", "386SX REV 2.0A", MACHINE_NOT_WORKING ) +COMP( 1991, t2000sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Toshiba", "T2000SX", MACHINE_NOT_WORKING ) +COMP( 199?, td70a, ibm5170, 0, at386sx, 0, at_state, init_at, "", "TD70A and TD70AN", MACHINE_NOT_WORKING ) +COMP( 199?, td70n, ibm5170, 0, at386sx, 0, at_state, init_at, "", "TD70N", MACHINE_NOT_WORKING ) +COMP( 199?, tot3200sxc,ibm5170, 0, at386sx, 0, at_state, init_at, "Toshiba", "T3200SXC", MACHINE_NOT_WORKING ) +COMP( 198?, tower386sx,ibm5170, 0, at386sx, 0, at_state, init_at, "Schneider Rundfunkwerke AG", "386SX System 40 (VGA)", MACHINE_NOT_WORKING ) +COMP( 1992, walk386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386 SX", MACHINE_NOT_WORKING ) // screen remains blank +COMP( 198?, zeos386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "ZEOS", "386 SX-16", MACHINE_NOT_WORKING ) +COMP( 199?, 386sc, ibm5170, 0, at386, 0, at_state, init_at, "", "386 SC Rev A2", MACHINE_NOT_WORKING ) +COMP( 199?, 386sc2c, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the Symphony chipset", MACHINE_NOT_WORKING ) +COMP( 199?, 386schg, ibm5170, 0, at386, 0, at_state, init_at, "", "386-SC-HG", MACHINE_NOT_WORKING ) +COMP( 199?, 4nd04a, ibm5170, 0, at386, 0, at_state, init_at, "", "386-4N-D04A (UMC chipset)", MACHINE_NOT_WORKING ) +COMP( 199?, al486vd, ibm5170, 0, at386, 0, at_state, init_at, "Daewoo", "AL486V-D Rev:1.1", MACHINE_NOT_WORKING ) +COMP( 199?, alacou, ibm5170, 0, at386, 0, at_state, init_at, "Alaris", "Cougar", MACHINE_NOT_WORKING ) +COMP( 199?, alim1419, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the ALi M1419 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, alim1429, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the ALi M1429 A1 and M1431 A2 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, amibaby, ibm5170, 0, at386, 0, at_state, init_at, "AMI", "Mark V Baby Screamer", MACHINE_NOT_WORKING ) +COMP( 1990, aplanst, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot LANstation (Krypton Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1990, aplannb, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot LANstation (Novell Remote Boot)", MACHINE_NOT_WORKING ) +COMP( 1992, aplscar, ibm5170, 0, at486l, 0, at_state, init_at, "Apricot", "Apricot LS Pro (Caracal Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1987, apxeni, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-i 386 (Leopard Motherboard)" , MACHINE_NOT_WORKING ) +COMP( 1988, at386, ibm5170, 0, at386, 0, at_state, init_at, "", "PC/AT 386 (12 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 1988, ataripc5, ibm5170, 0, at386, 0, at_state, init_at, "Atari", "PC5", MACHINE_NOT_WORKING ) +COMP( 199?, chn333sc, ibm5170, 0, at386, 0, at_state, init_at, "Chaintech", "333SC", MACHINE_NOT_WORKING ) +COMP( 199?, comt386, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "Tower 386", MACHINE_NOT_WORKING ) +COMP( 198?, cs8230, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the CS8230 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, ctcc386mx, ibm5170, 0, at386, 0, at_state, init_at, "Caching Tech Corporation", "C386MX", MACHINE_NOT_WORKING ) +COMP( 198?, dfi386, ibm5170, 0, at386, 0, at_state, init_at, "DFI", "386-20.REV0", MACHINE_NOT_WORKING ) +COMP( 199?, dt386, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "DT386", MACHINE_NOT_WORKING ) +COMP( 1988, ecs38632, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "ECS-386/32", MACHINE_NOT_WORKING ) +COMP( 1988, ecs386a, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "ECS-386A", MACHINE_NOT_WORKING ) +COMP( 199?, ecsfx3000, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "FX-3000 REV1.0", MACHINE_NOT_WORKING ) +COMP( 1992, ecsum386, ibm5170, 0, at386, 0, at_state, init_at, "Elitegroup Computer Systems", "UM386 (Rev 1.1)", MACHINE_NOT_WORKING ) +COMP( 199?, fic4386vchd,ibm5170,0, at486, 0, at_state, init_at, "First International Computer", "4386-VC-HD", MACHINE_NOT_WORKING ) +COMP( 199?, frx386c, ibm5170, 0, at386, 0, at_state, init_at, "Micro-Express Inc.", "Forex 386 Cache", MACHINE_NOT_WORKING ) +COMP( 199?, frxc402, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards with a FOREX FRX46C402/FRX36C300/SIS85C206 chipset", MACHINE_NOT_WORKING ) +COMP( 1991, fu340, ibm5170, 0, at386, 0, at_state, init_at, "Abit", "FU340", MACHINE_NOT_WORKING ) +COMP( 199?, ges9051n, ibm5170, 0, at386, 0, at_state, init_at, "", "GES 9051N-386C VER -0.01", MACHINE_NOT_WORKING ) +COMP( 198?, gs611606a, ibm5170, 0, at386, 0, at_state, init_at, "Goldstar", "GOLDSTAR P/N 611-606A Rev 1.0A", MACHINE_NOT_WORKING ) +COMP( 198?, hot304, ibm5170, 0, at386, 0, at_state, init_at, "Shuttle Computer International", "HOT-304", MACHINE_NOT_WORKING ) +COMP( 198?, hot307h, ibm5170, 0, at386, 0, at_state, init_at, "Shuttle Computer International", "HOT-307H", MACHINE_NOT_WORKING ) +COMP( 199?, isa386u30, ibm5170, 0, at386, 0, at_state, init_at, "Asus", "ISA-386U30 REV.2.2", MACHINE_NOT_WORKING ) +COMP( 1989, isa386c, ibm5170, 0, at386, 0, at_state, init_at, "Asus", "ISA-386C", MACHINE_NOT_WORKING ) +COMP( 199?, kma300g, ibm5170, 0, at386, 0, at_state, init_at, "Arche Technologies Inc.", "KMA-300G-25", MACHINE_NOT_WORKING ) +COMP( 199?, mb133340, ibm5170, 0, at386, 0, at_state, init_at, "Biostar", "MB-1340UCQ-B", MACHINE_NOT_WORKING ) +COMP( 199?, mba032q, ibm5170, 0, at386, 0, at_state, init_at, "DTK", "MBA-032Q TK83305-4N-D-03", MACHINE_NOT_WORKING ) +COMP( 199?, megapcpl, megapc, 0, megapcpl, 0, megapc_state, init_megapcpl, "Amstrad plc", "MegaPC Plus", MACHINE_NOT_WORKING ) +COMP( 199?, megapcpla, megapc, 0, megapcpla, 0, at_vrom_fix_state, init_megapcpla, "Amstrad plc", "MegaPC Plus (WINBUS chipset)", MACHINE_NOT_WORKING ) +COMP( 199?, mokp386, ibm5170, 0, at386, 0, at_state, init_at, "Morse", "KP920121523 V2.20", MACHINE_NOT_WORKING ) +COMP( 199?, mom3v3, ibm5170, 0, at386, 0, at_state, init_at, "Morse", "M3 V3.0", MACHINE_NOT_WORKING ) +COMP( 199?, mx83c305, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the MX83C305(A)(FC)/MX83C05(A)(FC) chipset", MACHINE_NOT_WORKING ) +COMP( 1992, ocjagii, ibm5170, 0, at386, 0, at_state, init_at, "Octek", "Jaguar II", MACHINE_NOT_WORKING ) +COMP( 1992, ocjagv, ibm5170, 0, at386, 0, at_state, init_at, "Octek", "Jaguar V v1.4", MACHINE_NOT_WORKING ) +COMP( 199?, op82c381, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the OPTi 82C381 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, op82c391, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the OPTi 82C391 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, opti495slc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495SLC chipset", MACHINE_NOT_WORKING ) +COMP( 199?, opti495xlc,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using a OPTi 82C495XLC chipset", MACHINE_NOT_WORKING ) +COMP( 199?, op386wb, ibm5170, 0, at386, 0, at_state, init_at, "OPTi", "OPTi 386WB VER.1.0", MACHINE_NOT_WORKING ) +COMP( 199?, p386dx40, ibm5170, 0, at386, 0, at_state, init_at, "Peacock", "P386DX-40", MACHINE_NOT_WORKING ) +COMP( 1989, pc2386, ibm5170, 0, at386l, 0, at_state, init_at, "Amstrad plc", "PC2386", MACHINE_NOT_WORKING ) +COMP( 198?, pc60iii, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "PC 60-III", MACHINE_NOT_WORKING ) +COMP( 199?, pccm317, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M317", MACHINE_NOT_WORKING ) +COMP( 199?, pccm321, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M321", MACHINE_NOT_WORKING ) +COMP( 199?, pccm326, ibm5170, 0, at386, 0, at_state, init_at, "PC-Chips", "M326", MACHINE_NOT_WORKING ) +COMP( 198?, pem2530, ibm5170, 0, at386, 0, at_state, init_at, "DTK", "PEM 2539", MACHINE_NOT_WORKING ) +COMP( 199?, pg750, ibm5170, 0, pg750, 0, at_state, init_at, "Siemens", "PG 750", MACHINE_NOT_WORKING ) +COMP( 199?, pt581392, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the Forex FRX46C402 + FRX46C411 + SiS 85C206 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, qdu386dx, ibm5170, 0, at386, 0, at_state, init_at, "", "QD-U386DX VER 1.0", MACHINE_NOT_WORKING ) +COMP( 1988, qi600, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot Qi 600 (Neptune Motherboard)", MACHINE_NOT_WORKING ) +COMP( 199?, sisrabb, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the SiS Rabbit chipset", MACHINE_NOT_WORKING ) +COMP( 199?, sm38640f, ibm5170, 0, at386, 0, at_state, init_at, "", "SM 386-40F", MACHINE_NOT_WORKING ) +COMP( 19??, smih0107, ibm5170, 0, at386, 0, at_state, init_at, "Forex Computer Company", "unknown 386 AT clone with Forex chipset", MACHINE_NOT_WORKING ) +COMP( 199?, sy012, ibm5170, 0, at386, 0, at_state, init_at, "", "SY-012 16/25 386MB VER: 5.2", MACHINE_NOT_WORKING ) +COMP( 199?, sy019hi, ibm5170, 0, at386, 0, at_state, init_at, "Soyo", "SY-019H and SY-019I", MACHINE_NOT_WORKING ) +COMP( 199?, sybaby386, ibm5170, 0, at386, 0, at_state, init_at, "Soyo", "Baby AT 386", MACHINE_NOT_WORKING ) +COMP( 199?, tam25p2, ibm5170, 0, at386, 0, at_state, init_at, "AUVA", "TAM/25-P2 M31720P", MACHINE_NOT_WORKING ) +COMP( 199?, tam3340ma0,ibm5170, 0, at386, 0, at_state, init_at, "", "TAM/33/40-MA0", MACHINE_NOT_WORKING ) +COMP( 199?, um82c481af,ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the UMC UM82C481AF chipset", MACHINE_NOT_WORKING ) +COMP( 199?, um82c491f, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboard using the UMC UM82C491F chipset", MACHINE_NOT_WORKING ) +COMP( 199?, um82c493f, ibm5170, 0, at386, 0, at_state, init_at, "", "386 motherboards using the UMC UM82C491F + UM82C493F chipset or BIOTEQ equivalents", MACHINE_NOT_WORKING ) +COMP( 199?, uni386w, ibm5170, 0, at386, 0, at_state, init_at, "UNICHIP", "386W 367C REV 1.0", MACHINE_NOT_WORKING ) +COMP( 1992, walk386dx, ibm5170, 0, at386, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386DX", MACHINE_NOT_WORKING ) // screen remains blank +COMP( 1988, xb42663, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot Qi 300 (Rev D,E & F Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1989, xb42664, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus I Motherboard 386)" , MACHINE_NOT_WORKING ) +COMP( 1990, xb42664a, ibm5170, 0, at386, 0, at_state, init_at, "Apricot", "Apricot XEN-S (Venus II Motherboard 386)" , MACHINE_NOT_WORKING ) +COMP( 199?, 486apio, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "486 APIO", MACHINE_NOT_WORKING ) +COMP( 199?, 486ccv, ibm5170, 0, at486, 0, at_state, init_at, "Diamond Flower, Inc. (DFI)", "486-CCV", MACHINE_NOT_WORKING ) +COMP( 199?, 486igb21, ibm5170, 0, at486, 0, at_state, init_at, "", "486IG-B-2-1", MACHINE_NOT_WORKING ) +COMP( 199?, 486wb6a3, ibm5170, 0, at486, 0, at_state, init_at, "Silicon Valley Computer, Inc.", "486WB6A3.B1", MACHINE_NOT_WORKING ) +COMP( 199?, 4dmshl3g, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "4DMS HL3G-L4-VI", MACHINE_NOT_WORKING ) +COMP( 199?, 4dmuhl3s, ibm5170, 0, at486, 0, at_state, init_at, "EFA", "4DMU HL3S", MACHINE_NOT_WORKING ) +COMP( 1992, a433cc, ibm5170, 0, at486, 0, at_state, init_at, "J-Bond", "A433C-C/A450C-C", MACHINE_NOT_WORKING ) +COMP( 1994, a486ap4, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PVI-486AP4", MACHINE_NOT_WORKING ) +COMP( 199?, a486isa, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486", MACHINE_NOT_WORKING ) +COMP( 199?, a486sio, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486SIO rev. 1.2", MACHINE_NOT_WORKING ) +COMP( 1994, a486sp3, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PVI-486SP3", MACHINE_NOT_WORKING ) +COMP( 1994, a486sp3g, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PCI/I-486SP3G", MACHINE_NOT_WORKING ) +COMP( 199?, a486sv2, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "ISA-486SV2", MACHINE_NOT_WORKING ) +COMP( 1994, a486sv2g, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "VL/I-486SV2G", MACHINE_NOT_WORKING ) +COMP( 1994, a486sv1, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "VL/EISA-486SV1", MACHINE_NOT_WORKING ) +COMP( 1995, aa486s, ibm5170, 0, at486, 0, at_state, init_at, "Asus", "PCI/I-A486S", MACHINE_NOT_WORKING ) +COMP( 199?, abae4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "486 EISA-AE4", MACHINE_NOT_WORKING ) +COMP( 199?, abah4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AH4", MACHINE_NOT_WORKING ) +COMP( 199?, abav4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AV4", MACHINE_NOT_WORKING ) +COMP( 199?, abax4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-AX4", MACHINE_NOT_WORKING ) +COMP( 199?, abpb4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PB4", MACHINE_NOT_WORKING ) +COMP( 199?, abpi4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PI4", MACHINE_NOT_WORKING ) +COMP( 199?, abpm4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PM4", MACHINE_NOT_WORKING ) +COMP( 199?, abpv4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PV4", MACHINE_NOT_WORKING ) +COMP( 199?, abpw4, ibm5170, 0, at486, 0, at_state, init_at, "Abit", "AB-PW4", MACHINE_NOT_WORKING ) +COMP( 199?, alator2, ibm5170, 0, at486, 0, at_state, init_at, "Alaris", "Tornado 2", MACHINE_NOT_WORKING ) +COMP( 199?, alim1489, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the ALi 1487/1489 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, amient2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-II", MACHINE_NOT_WORKING ) +COMP( 199?, amient3, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-III", MACHINE_NOT_WORKING ) +COMP( 199?, amient4, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "EISA Enterprise-IV", MACHINE_NOT_WORKING ) +COMP( 199?, amisvpci2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager PCI-II", MACHINE_NOT_WORKING ) +COMP( 199?, amisvvlb, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB", MACHINE_NOT_WORKING ) +COMP( 199?, amisvvlb2, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB-II", MACHINE_NOT_WORKING ) +COMP( 199?, amisvvlb3, ibm5170, 0, at486, 0, at_state, init_at, "AMI", "Super Voyager VLB-III", MACHINE_NOT_WORKING ) +COMP( 199?, aoap43, ibm5170, 0, at486, 0, at_state, init_at, "Aopen", "AP43", MACHINE_NOT_WORKING ) +COMP( 199?, aovi15g, ibm5170, 0, at486, 0, at_state, init_at, "Aopen", "VI15G", MACHINE_NOT_WORKING ) +COMP( 1992, aplsbon, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot LS Pro (Bonsai Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1991, aprfte, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FT//ex 486 (J3 Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1992, aprpand, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FTs (Panther Rev F 1.02.26)", MACHINE_NOT_WORKING ) +COMP( 1989, apvxft, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot VX FT server", MACHINE_NOT_WORKING ) +COMP( 1993, apxena1, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN PC (A1 Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1991, apxenls3, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN-LS (Venus IV Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1993, apxenp2, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN PC (P2 Motherboard)", MACHINE_NOT_WORKING ) +COMP( 1993, apxlsam, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot XEN-LS II (Samurai Motherboard)", MACHINE_NOT_WORKING ) +COMP( 199?, ar4glx3, ibm5170, 0, at486, 0, at_state, init_at, "Addtech Research", "4GLX3 Green-B 4GPV3.1", MACHINE_NOT_WORKING ) +COMP( 199?, as496, ibm5170, 0, at486, 0, at_state, init_at, "Arstoria", "AS496", MACHINE_NOT_WORKING ) +COMP( 1990, at486, ibm5170, 0, at486, 0, at_state, init_at, "", "PC/AT 486 (25 MHz, MF2 Keyboard)", MACHINE_NOT_WORKING ) +COMP( 199?, atc1415, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1415", MACHINE_NOT_WORKING ) +COMP( 199?, atc1425a, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1425A", MACHINE_NOT_WORKING ) +COMP( 199?, atc1425b, ibm5170, 0, at486, 0, at_state, init_at, "A-Trend", "ATC-1425B", MACHINE_NOT_WORKING ) +COMP( 199?, bluenote, ibm5170, 0, at486, 0, at_state, init_at, "Highscreen", "Colani Blue Note", MACHINE_NOT_WORKING ) +COMP( 199?, ch48633c, ibm5170, 0, at486, 0, at_state, init_at, "Chicony", "CH-486-33C", MACHINE_NOT_WORKING ) +COMP( 199?, ch486spm, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "486SPM", MACHINE_NOT_WORKING ) +COMP( 199?, ch491e, ibm5170, 0, at486, 0, at_state, init_at, "Chicony", "CH-491E", MACHINE_NOT_WORKING ) +COMP( 199?, ch4slez1, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "486SLE M106 4SLE-Z1", MACHINE_NOT_WORKING ) +COMP( 199?, ch4spi, ibm5170, 0, at486, 0, at_state, init_at, "Chaintech", "4SPI", MACHINE_NOT_WORKING ) +COMP( 199?, comt486, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "Tower 486", MACHINE_NOT_WORKING ) +COMP( 199?, dt486, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "DT486", MACHINE_NOT_WORKING ) +COMP( 199?, ec4913, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UC4913 REV:1.1", MACHINE_NOT_WORKING ) +COMP( 199?, ec4915aio, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UC4915 A AIO", MACHINE_NOT_WORKING ) +COMP( 199?, ed486vl3h, ibm5170, 0, at486, 0, at_state, init_at, "Edom", "486VL3H", MACHINE_NOT_WORKING ) +COMP( 199?, edmv035f, ibm5170, 0, at486, 0, at_state, init_at, "Edom", "MV035F", MACHINE_NOT_WORKING ) +COMP( 199?, exp4044, ibm5170, 0, at486, 0, at_state, init_at, "ExpertChip", "EXP4044", MACHINE_NOT_WORKING ) +COMP( 199?, f4dxluc4, ibm5170, 0, at486, 0, at_state, init_at, "ADI", "F4DXL-UC4", MACHINE_NOT_WORKING ) +COMP( 199?, fic486gvt, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-GVT", MACHINE_NOT_WORKING ) +COMP( 199?, fic4386vcv,ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "4386-VC-V", MACHINE_NOT_WORKING ) +COMP( 199?, fic486kvd, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486 KVD", MACHINE_NOT_WORKING ) +COMP( 199?, fic486vchd,ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VC-HD", MACHINE_NOT_WORKING ) +COMP( 199?, ficeli6ii, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "FIC ELI6-II", MACHINE_NOT_WORKING ) +COMP( 1994, ficgiovt2, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-GIO-VT2", MACHINE_NOT_WORKING ) +COMP( 1995, ficpio2, ibm5170, 0, ficpio2, 0, at_state, init_atpci, "First International Computer", "486-PIO-2", MACHINE_NOT_WORKING ) +COMP( 1994, ficvipio, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VIP-IO", MACHINE_NOT_WORKING ) +COMP( 199?, ficvipio2, ibm5170, 0, at486, 0, at_state, init_at, "First International Computer", "486-VIP-IO2", MACHINE_NOT_WORKING ) +COMP( 1995, ft486f55, ibm5170, 0, at486, 0, at_state, init_at, "Freetech", "486FT55", MACHINE_NOT_WORKING ) +COMP( 1991, ftsserv, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot FTs (Scorpion)", MACHINE_NOT_WORKING ) +COMP( 199?, ga486am, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486AM/S", MACHINE_NOT_WORKING ) +COMP( 199?, ga486vf, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486VF", MACHINE_NOT_WORKING ) +COMP( 199?, ga486vs, ibm5170, 0, at486, 0, at_state, init_at, "Gigabyte", "GA-486VS", MACHINE_NOT_WORKING ) +COMP( 199?, gc10a, ibm5170, 0, at486, 0, at_state, init_at, "Eagle", "EAGLEN486 GC10A", MACHINE_NOT_WORKING ) +COMP( 199?, gete486vl, ibm5170, 0, at486, 0, at_state, init_at, "GENOA", "TurboExpress 486 VL", MACHINE_NOT_WORKING ) +COMP( 199?, gmb486sg, ibm5170, 0, at486, 0, at_state, init_at, "Gemlight", "GMB-486SG v2.2", MACHINE_NOT_WORKING ) +COMP( 199?, gmb486unp, ibm5170, 0, at486, 0, at_state, init_at, "Gemlight", "GMB-486UNP v2.1", MACHINE_NOT_WORKING ) +COMP( 199?, hot409, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-409", MACHINE_NOT_WORKING ) +COMP( 199?, hot419, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-419", MACHINE_NOT_WORKING ) +COMP( 199?, hot433, ibm5170, 0, at486, 0, at_state, init_at, "Shuttle Computer International", "HOT-433", MACHINE_NOT_WORKING ) +COMP( 199?, ibm2133, ibm5170, 0, at486, 0, at_state, init_at, "International Business Machines", "PS/1 2133", MACHINE_NOT_WORKING ) +COMP( 199?, jakms41, ibm5170, 0, at486, 0, at_state, init_at, "Jamicon", "KM-S4-1 VER 1.1", MACHINE_NOT_WORKING ) +COMP( 199?, jwj403tg, ibm5170, 0, at486, 0, at_state, init_at, "Jetway", "J-403TG", MACHINE_NOT_WORKING ) +COMP( 199?, jwj446a, ibm5170, 0, at486, 0, at_state, init_at, "Jetway", "J-446A", MACHINE_NOT_WORKING ) +COMP( 1993, lion3500, ibm5170, 0, at486, 0, at_state, init_at, "Lion", "3500", MACHINE_NOT_WORKING ) +COMP( 199?, ls486e, ibm5170, 0, at486, 0, at_state, init_at, "LuckyStar", "LS-486E Rev:C", MACHINE_NOT_WORKING ) +COMP( 199?, lsucm486v30,ibm5170,0, at486, 0, at_state, init_at, "Lucky Star", "UCM-486V30", MACHINE_NOT_WORKING ) +COMP( 199?, mb1433aeap,ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433/50 AEA-P - V:1", MACHINE_NOT_WORKING ) +COMP( 199?, mb1433ucv, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433UCV", MACHINE_NOT_WORKING ) +COMP( 199?, mb1433uiv, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB-1433UIV", MACHINE_NOT_WORKING ) +COMP( 199?, mb4d33, ibm5170, 0, at486, 0, at_state, init_at, "Aquarius System (ASI)", "MB-4D33/50NR", MACHINE_NOT_WORKING ) +COMP( 199?, mb8433uud, ibm5170, 0, at486, 0, at_state, init_at, "Biostar", "MB8433-UUD-A", MACHINE_NOT_WORKING ) // boots to Award BootBlock BIOS +COMP( 199?, mba029, ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "MBA-029", MACHINE_NOT_WORKING ) +COMP( 199?, md4duvc, ibm5170, 0, at486, 0, at_state, init_at, "Aquarius System (ASI)", "MD-4DUV VER:2.1", MACHINE_NOT_WORKING ) +COMP( 199?, mijx30gp, ibm5170, 0, at486, 0, at_state, init_at, "Micronics", "JX30GP, Motherboard P/N: 09-00189-10 REV B1", MACHINE_NOT_WORKING ) +COMP( 199?, ms4125, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4125", MACHINE_NOT_WORKING ) +COMP( 199?, ms4132, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4132 G VER:1", MACHINE_NOT_WORKING ) +COMP( 199?, ms4134, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4134", MACHINE_NOT_WORKING ) +COMP( 199?, ms4138, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4138", MACHINE_NOT_WORKING ) +COMP( 199?, ms4144, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4144", MACHINE_NOT_WORKING ) +COMP( 199?, ms4145, ibm5170, 0, at486, 0, at_state, init_at, "MSI", "MS-4145", MACHINE_NOT_WORKING ) +COMP( 199?, nat48pv, ibm5170, 0, at486, 0, at_state, init_at, "", "NAT48PV-1.00 VL", MACHINE_NOT_WORKING ) +COMP( 199?, ncr3433, ibm5170, 0, at486, 0, at_state, init_at, "NCR", "Class 3433", MACHINE_NOT_WORKING ) +COMP( 199?, ochawk, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hawk", MACHINE_NOT_WORKING ) +COMP( 199?, ochipcom, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo COM", MACHINE_NOT_WORKING ) +COMP( 1994, ochipdca2, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo DCA2", MACHINE_NOT_WORKING ) +COMP( 199?, ochipvlp, ibm5170, 0, at486, 0, at_state, init_at, "Octek", "Hippo VL+", MACHINE_NOT_WORKING ) +COMP( 199?, op82c392, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the OPTi OPTi 82C392, 82C493 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, pc70iii, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "PC 70-III", MACHINE_NOT_WORKING ) +COMP( 199?, pc9486, ibm5170, 0, at486, 0, at_state, init_at, "Amstrad", "PC9486", MACHINE_NOT_WORKING ) +COMP( 199?, pccm912, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M912", MACHINE_NOT_WORKING ) +COMP( 199?, pccm915i, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M915i", MACHINE_NOT_WORKING ) +COMP( 199?, pccm919, ibm5170, 0, at486, 0, at_state, init_at, "PC-Chips", "M919", MACHINE_NOT_WORKING ) +COMP( 1993, pcd4nd, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4ND", MACHINE_NOT_WORKING ) +COMP( 1995, pcd4nl, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4NL", MACHINE_NOT_WORKING ) +COMP( 199?, pcd4x, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4H, PCD-4M", MACHINE_NOT_WORKING ) +COMP( 199?, pci48af, ibm5170, 0, at486, 0, at_state, init_at, "TMC Research Corporation", "PCI48AF", MACHINE_NOT_WORKING ) +COMP( 199?, pck486dx, ibm5170, 0, at486, 0, at_state, init_at, "Peacock", "PCK 486 DX", MACHINE_NOT_WORKING ) +COMP( 199?, pg750eisa, ibm5170, 0, at486, 0, at_state, init_at, "Siemens", "PG-750 486 EISA", MACHINE_NOT_WORKING ) +COMP( 199?, pkm0038s, ibm5170, 0, at486, 0, at_state, init_at, "DTK", "PKM-0038S aka Gemlight GMB-486SG", MACHINE_NOT_WORKING ) +COMP( 199?, pm486pu, ibm5170, 0, at486, 0, at_state, init_at, "PROTECH", "PM486PU-S7", MACHINE_NOT_WORKING ) +COMP( 199?, pt430, ibm5170, 0, at486, 0, at_state, init_at, "Pine Technology", "PT-430", MACHINE_NOT_WORKING ) +COMP( 199?, pt432b, ibm5170, 0, at486, 0, at_state, init_at, "Pine Technology", "PT-432b aka SR-M401-A", MACHINE_NOT_WORKING ) +COMP( 199?, ptmb457, ibm5170, 0, at486, 0, at_state, init_at, "PowerTech", "MB457", MACHINE_NOT_WORKING ) +COMP( 199?, pwaih4077c,ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "PWA-IH4077C", MACHINE_NOT_WORKING ) +COMP( 199?, pwaih4077d,ibm5170, 0, at486, 0, at_state, init_at, "Mitac", "PWA-IH4077D", MACHINE_NOT_WORKING ) +COMP( 199?, px486p3, ibm5170, 0, at486, 0, at_state, init_at, "QDI", "PX486P3", MACHINE_NOT_WORKING ) +COMP( 1990, qi900, ibm5170, 0, at486, 0, at_state, init_at, "Apricot", "Apricot Qi 900 (Scorpion Motherboard)", MACHINE_NOT_WORKING ) +COMP( 199?, sis85c471, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the SiS 85C471/85C407 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, sis85c496, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the SiS 85C496/85C497 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, sm48650usc,ibm5170, 0, at486, 0, at_state, init_at, "Vintage Sprite", "SM 486-50USC", MACHINE_NOT_WORKING ) +COMP( 199?, so025d2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025D2", MACHINE_NOT_WORKING ) +COMP( 199?, so025k2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025K2", MACHINE_NOT_WORKING ) +COMP( 199?, so025r2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "025R2", MACHINE_NOT_WORKING ) +COMP( 199?, so30h, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "30H", MACHINE_NOT_WORKING ) +COMP( 199?, so4saw2, ibm5170, 0, at486, 0, at_state, init_at, "SOYO", "SY-4SAW2", MACHINE_NOT_WORKING ) +COMP( 199?, sto486wb, ibm5170, 0, at486, 0, at_state, init_at, "See-Thru", "Sto486Wb aka AUVA Cam-33-P2", MACHINE_NOT_WORKING ) +COMP( 199?, td4ipaio, ibm5170, 0, at486, 0, at_state, init_at, "", "TD-4IP-UMC-AIO", MACHINE_NOT_WORKING ) +COMP( 199?, tmpat48pg4,ibm5170, 0, at486, 0, at_state, init_at, "TMC", "PAT48PG4", MACHINE_NOT_WORKING ) +COMP( 199?, tmpat48av, ibm5170, 0, at486, 0, at_state, init_at, "TMC", "PAT48AV", MACHINE_NOT_WORKING ) +COMP( 199?, ts34t25, ibm5170, 0, at486, 0, at_state, init_at, "Highscreen", "486-25", MACHINE_NOT_WORKING ) +COMP( 199?, um486, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM486/UM486sx", MACHINE_NOT_WORKING ) +COMP( 199?, um486v, ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM486V-AIO", MACHINE_NOT_WORKING ) +COMP( 199?, um8810paio,ibm5170, 0, at486, 0, at_state, init_at, "Elitegroup", "UM8810 PAIO", MACHINE_NOT_WORKING ) +COMP( 199?, um8886, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UMC UM8886/UM8881 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, um8498f, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UMC UM8498F, UM8496F chipset", MACHINE_NOT_WORKING ) +COMP( 199?, uni4800, ibm5170, 0, at486, 0, at_state, init_at, "", "486 motherboards using the UNI4800 chipset", MACHINE_NOT_WORKING ) +COMP( 199?, uniwb4407, ibm5170, 0, at486, 0, at_state, init_at, "UNICHIP", "486 WB 4407 REV 1.0", MACHINE_NOT_WORKING ) +COMP( 199?, v4p895p3, ibm5170, 0, at486, 0, at_state, init_at, "QDI", "V4P895P3/SMT V5.0", MACHINE_NOT_WORKING ) +COMP( 199?, via4386vio,ibm5170, 0, at486, 0, at_state, init_at, "", "Via 4386 VIO / Highscreen universal board", MACHINE_NOT_WORKING ) +COMP( 199?, zi4dvs, ibm5170, 0, at486, 0, at_state, init_at, "ZIDA", "4DVS", MACHINE_NOT_WORKING ) +COMP( 199?, zito4dps, ibm5170, 0, at486, 0, at_state, init_at, "ZIDA", "Tomato board 4DPS", MACHINE_NOT_WORKING ) diff --git a/src/mame/pc/atpci.cpp b/src/mame/pc/atpci.cpp new file mode 100644 index 00000000000..b879844dd7b --- /dev/null +++ b/src/mame/pc/atpci.cpp @@ -0,0 +1,263 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol, Miodrag Milanovic, Carl + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "bus/isa/isa_cards.h" +#include "bus/lpci/pci.h" +#include "bus/lpci/i82371ab.h" +#include "bus/lpci/i82371sb.h" +#include "bus/lpci/i82439tx.h" +#include "machine/at.h" +#include "machine/fdc37c93x.h" +#include "machine/pckeybrd.h" + +class at586_state : public driver_device +{ +public: + at586_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + void at586x3(machine_config &config); + void at586(machine_config &config); + void at586m55(machine_config &config); + +protected: + void at_softlists(machine_config &config); + + void boot_state_w(uint8_t data); + + void tx_config(device_t *device); + void sb_config(device_t *device); + void superio_config(device_t *device); + + void at586_io(address_map &map); + void at586_map(address_map &map); + +private: + required_device m_maincpu; +}; + +void at586_state::boot_state_w(uint8_t data) +{ + logerror("Boot state %02x\n", data); + printf("[%02X]",data); +} + +void at586_state::tx_config(device_t *device) +{ + downcast(device)->set_cpu(m_maincpu); + downcast(device)->set_region("isa"); +} + +void at586_state::sb_config(device_t *device) +{ + i82371sb_device &sb = *downcast(device); + sb.set_cpu(m_maincpu); + sb.boot_state_hook().set(":", FUNC(at586_state::boot_state_w)); + sb.smi().set_inputline(m_maincpu, INPUT_LINE_SMI); +} + + +void at586_state::superio_config(device_t *device) +{ + fdc37c93x_device &fdc = *downcast(device); + fdc.set_sysopt_pin(1); + fdc.gp20_reset().set_inputline(m_maincpu, INPUT_LINE_RESET); + fdc.gp25_gatea20().set_inputline(m_maincpu, INPUT_LINE_A20); + fdc.irq1().set(":pcibus:7:i82371sb:pic8259_master", FUNC(pic8259_device::ir1_w)); +} + + +static void isa_internal_devices(device_slot_interface &device) +{ + device.option_add("fdc37c93x", FDC37C93X); +} + +static void pci_devices(device_slot_interface &device) +{ + device.option_add_internal("i82439tx", I82439TX_LEGACY); + device.option_add_internal("i82371ab", I82371AB); + device.option_add_internal("i82371sb", I82371SB); +} + +void at586_state::at586_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).bankrw("bank10"); + map(0x000a0000, 0x000bffff).noprw(); + map(0x00800000, 0x00800bff).ram().share("nvram"); + map(0xfffe0000, 0xffffffff).rom().region("isa", 0x20000); +} + +void at586_state::at586_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); +} + +void at586_state::at_softlists(machine_config &config) +{ + /* software lists */ + SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); + SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); + SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); + SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); + SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); +} + +void at586_state::at586(machine_config &config) +{ + pentium_device &maincpu(PENTIUM(config, m_maincpu, 60000000)); + maincpu.set_addrmap(AS_PROGRAM, &at586_state::at586_map); + maincpu.set_addrmap(AS_IO, &at586_state::at586_io); + maincpu.set_irq_acknowledge_callback("pcibus:1:i82371ab:pic8259_master", FUNC(pic8259_device::inta_cb)); + + RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); + + PCI_BUS(config, "pcibus", 0).set_busnum(0); + PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); + PCI_CONNECTOR(config, "pcibus:1", pci_devices, "i82371ab", true); + + // FIXME: determine ISA bus clock + ISA16_SLOT(config, "isa1", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "pcibus:1:i82371ab:isabus", pc_isa16_cards, nullptr, false); + + at_softlists(config); +} + +void at586_state::at586x3(machine_config &config) +{ + pentium_device &maincpu(PENTIUM(config, m_maincpu, 60000000)); + maincpu.set_addrmap(AS_PROGRAM, &at586_state::at586_map); + maincpu.set_addrmap(AS_IO, &at586_state::at586_io); + maincpu.smiact().set("pcibus:0:i82439tx", FUNC(i82439tx_device::smi_act_w)); + maincpu.set_irq_acknowledge_callback("pcibus:1:i82371sb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); + + PCI_BUS(config, "pcibus", 0).set_busnum(0); + PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); + PCI_CONNECTOR(config, "pcibus:1", pci_devices, "i82371sb", true).set_option_machine_config("i82371sb", [this](device_t *device) { sb_config(device); }); + + // FIXME: determine ISA bus clock + ISA16_SLOT(config, "isa1", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "pcibus:1:i82371sb:isabus", pc_isa16_cards, nullptr, false); + + at_softlists(config); +} + +static INPUT_PORTS_START(at586m55) +INPUT_PORTS_END + +void at586_state::at586m55(machine_config &config) +{ + pentium_device &pentium(PENTIUM(config, m_maincpu, 60000000)); + pentium.set_addrmap(AS_PROGRAM, &at586_state::at586_map); + pentium.set_addrmap(AS_IO, &at586_state::at586_io); + pentium.smiact().set("pcibus:0:i82439tx", FUNC(i82439tx_device::smi_act_w)); + pentium.set_irq_acknowledge_callback("pcibus:7:i82371sb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M,128M,256M"); + + PCI_BUS(config, "pcibus", 0).set_busnum(0); + PCI_CONNECTOR(config, "pcibus:0", pci_devices, "i82439tx", true).set_option_machine_config("i82439tx", [this](device_t *device) { tx_config(device); }); + PCI_CONNECTOR(config, "pcibus:7", pci_devices, "i82371sb", true).set_option_machine_config("i82371sb", [this](device_t *device) { sb_config(device); }); + + ISA16_SLOT(config, "board4", 0, "pcibus:7:i82371sb:isabus", isa_internal_devices, "fdc37c93x", true).set_option_machine_config("fdc37c93x", [this](device_t *device) { superio_config(device); }); + ISA16_SLOT(config, "isa1", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "pcibus:7:i82371sb:isabus", pc_isa16_cards, nullptr, false); + + at_softlists(config); +} + +ROM_START( at586 ) + ROM_REGION32_LE(0x40000, "isa", 0) + ROM_SYSTEM_BIOS(0, "sptx", "SP-586TX") + ROMX_LOAD("sp586tx.bin", 0x20000, 0x20000, CRC(1003d72c) SHA1(ec9224ff9b0fdfd6e462cb7bbf419875414739d6), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "unisys", "Unisys 586") // probably bad dump due to need of hack in i82439tx to work + ROMX_LOAD("at586.bin", 0x20000, 0x20000, CRC(717037f5) SHA1(1d49d1b7a4a40d07d1a897b7f8c827754d76f824), ROM_BIOS(1)) + + ROM_SYSTEM_BIOS(2, "ga586t2", "Gigabyte GA-586T2") // ITE 8679 I/O + ROMX_LOAD("gb_ga586t2.bin", 0x20000, 0x20000, CRC(3a50a6e1) SHA1(dea859b4f1492d0d08aacd260ed1e83e00ebac08), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "5tx52", "Acorp 5TX52") // W83877TF I/O + ROMX_LOAD("acorp_5tx52.bin", 0x20000, 0x20000, CRC(04d69419) SHA1(983377674fef05e710c8665c14cc348c99166fb6), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "txp4", "ASUS TXP4") // W83977TF-A I/O + ROMX_LOAD("asus_txp4.bin", 0x20000, 0x20000, CRC(a1321bb1) SHA1(92e5f14d8505119f85b148a63510617ac12bcdf3), ROM_BIOS(4)) +ROM_END + +// Elitegroup SI5PI AIO Rev. 1.1 - Chipset: SiS 85C501, 85C502, 85C502, FDC37C666GT, UM82C865F, PCI0640B - CPU: Socket 4 - RAM: 4xSIMM72, Cache: 18x32pin +// BIOS: Award 32pin - Keyboard-BIOS: AMIKEY-2 - ISA16: 4, PCI: 4 - On board: 2xISA, 2xser, Floppy, par +ROM_START( ecssi5pi ) + ROM_REGION32_LE(0x40000, "isa", 0) + // BIOS-String: 11/17/94-SiS-501-503-2A5IAE11-00 / SI5PI AIO 11/18/94 + ROM_SYSTEM_BIOS(0, "111894", "11/18/94") + ROMX_LOAD("si5piaio11_isa_pci_bios_013908435.bin", 0x20000, 0x20000, CRC(c39aa47c) SHA1(6b31bdc5441c5f7a29d0ceb8989ccfed92c49900), ROM_BIOS(0)) + // BIOS-String: 12/02/94-SiS-501-503-2A5IAE11-00 / SI5PI AIO 12/02/94 + ROM_SYSTEM_BIOS(1, "120294", "12/02/94") + ROMX_LOAD("si5piaio.bin", 0x20000, 0x20000, CRC(9dfb8510) SHA1(b86cc1930dc78db3c4c9d1ed13ec60b2333db7d1), ROM_BIOS(1)) +ROM_END + + +ROM_START(at586x3) + ROM_REGION32_LE(0x40000, "isa", 0) + ROM_SYSTEM_BIOS(0, "5hx29", "5HX29") + ROMX_LOAD("5hx29.bin", 0x20000, 0x20000, CRC(07719a55) SHA1(b63993fd5186cdb4f28c117428a507cd069e1f68), ROM_BIOS(0)) + + ROM_SYSTEM_BIOS(1, "n7ns04", "Version 21/01/98, without integrated sound") // Micronics M7S-HI with SMSC FDC37C93X I/O + ROMX_LOAD("m7ns04.rom", 0x00000, 0x40000, CRC(9c1f656b) SHA1(f4a0a522d8c47b6ddb6c01fe9a34ddf5b1977f8d), ROM_BIOS(1)) + + ROM_SYSTEM_BIOS(2, "n7s04", "Version 21/01/98, with integrated sound") + ROMX_LOAD("m7s04.rom", 0x00000, 0x40000, CRC(3689f5a9) SHA1(8daacdb0dc6783d2161680564ffe83ac2515f7ef), ROM_BIOS(2)) + + ROM_SYSTEM_BIOS(3, "m7shi03", "m7shi03") // Micronics M7S-Hi + ROMX_LOAD("m7shi03.snd", 0x00000, 0x40000, CRC(3a35a939) SHA1(74af69eb5ca546b0960540e7c3ea62a532157f2a), ROM_BIOS(3)) +ROM_END + +/* FIC VT-503 (Intel TX chipset, ITE 8679 Super I/O) */ +ROM_START( ficvt503 ) + ROM_REGION32_LE(0x40000, "isa", 0) + ROM_SYSTEM_BIOS(0, "109gi13", "1.09GI13") /* 1997-10-02 */ + ROMX_LOAD("109gi13.bin", 0x20000, 0x20000, CRC(0c32af48) SHA1(2cce40a98598f1ed1f398975f7a90c8be4200667), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "109gi14", "1.09GI14") /* 1997-11-07 */ + ROMX_LOAD("109gi14.awd", 0x20000, 0x20000, CRC(588c5cc8) SHA1(710e5405850fd975b362a422bfe9bc6d6c9a36cd), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "109gi15", "1.09GI15") /* 1997-11-07 */ + ROMX_LOAD("109gi15.awd", 0x20000, 0x20000, CRC(649a3481) SHA1(e681c6ab55a67cec5978dfffa75fcddc2aa0de4d), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "109gi16", "1.09GI16") /* 2000-03-23 */ + ROMX_LOAD("109gi16.bin", 0x20000, 0x20000, CRC(a928f271) SHA1(127a83a60752cc33b3ca49774488e511ec7bac55), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "115gk140", "1.15GK140") /* 1999-03-03 */ + ROMX_LOAD("115gk140.awd", 0x20000, 0x20000, CRC(65e88956) SHA1(f94bb0732e00b5b0f18f4e349db24a289f8379c5), ROM_BIOS(4)) +ROM_END + +/* Micronics M55Hi-Plus (Intel 430HX chipset, SMSC FDC37C93X Super I/O) */ +ROM_START(m55hipl) + ROM_REGION32_LE(0x40000, "isa", 0) + ROM_SYSTEM_BIOS(0, "m55ns04", "m55ns04") // Micronics M55HI-Plus with no sound + ROMX_LOAD("m55-04ns.rom", 0x20000, 0x20000, CRC(0116b2b0) SHA1(19b0203decfd4396695334517488d488aec3ccde), ROM_BIOS(0)) + + ROM_SYSTEM_BIOS(1, "m55s04", "m55s04") // with sound + ROMX_LOAD("m55-04s.rom", 0x20000, 0x20000, CRC(34a7422e) SHA1(68753fe373c97844beff83ea75c634c77cfedb8f), ROM_BIOS(1)) + + ROM_SYSTEM_BIOS(2, "m55ns03", "m55ns03") // Micronics M55HI-Plus with no sound + ROMX_LOAD("m55ns03.rom", 0x20000, 0x20000, CRC(6a3deb49) SHA1(78bfc20e0f8699f4d153d241a757153afcde3efb), ROM_BIOS(2)) + + ROM_SYSTEM_BIOS(3, "m55hi03", "m55hi03") // with sound + ROMX_LOAD("m55hi03.rom", 0x20000, 0x20000, CRC(bd476200) SHA1(7633ba27819ad45c6253abb728b1ef0c49229743), ROM_BIOS(3)) +ROM_END + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1990, at586, ibm5170, 0, at586, 0, at586_state, empty_init, "", "PC/AT 586 (PIIX4)", MACHINE_NOT_WORKING ) +COMP( 1990, at586x3, ibm5170, 0, at586x3, 0, at586_state, empty_init, "", "PC/AT 586 (PIIX3)", MACHINE_NOT_WORKING ) +COMP( 1997, ficvt503, ibm5170, 0, at586, 0, at586_state, empty_init, "FIC", "VT-503", MACHINE_NOT_WORKING ) +COMP( 1990, m55hipl, ibm5170, 0, at586m55, at586m55, at586_state, empty_init, "Micronics", "M55Hi-Plus", MACHINE_NOT_WORKING ) +COMP( 199?, ecssi5pi, ibm5170, 0, at586, 0, at586_state, empty_init, "Elitegroup","SI5PI AIO", MACHINE_NOT_WORKING ) diff --git a/src/mame/pc/calchase.cpp b/src/mame/pc/calchase.cpp new file mode 100644 index 00000000000..5a68b845335 --- /dev/null +++ b/src/mame/pc/calchase.cpp @@ -0,0 +1,763 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese, Grull Osgo, Peter Ferrie +/************************************************************************************ + +California Chase (c) 1999 The Game Room +Eggs Playing Chicken (c) 2002 The Game Room +Host Invaders (c) 1998 The Game Room + +driver by Angelo Salese & Grull Osgo + +Hardware is known as "AUSCOM System 1" hardware. + +Other games known to be on this hardware (if ever finished): +- Agro (c) The Game Room +- Tiger Odds (c) The Game Room +- one other unnamed/unfinished game + +Notes: +- calchase: type boot to load game + +TODO: +- get Win 98 to boot (most of Windows 98 copy is damaged inside current HDD dump); +- Various graphics bugs (title screen uses ROZ?); +- fix 129 Hz refresh rate bug; +- inputs (is there a service mode?) + +I/O Memo (http://bochs.sourceforge.net/techspec/PORTS.LST): +46E8 ---- 8514/A and compatible video cards (e.g. ATI Graphics Ultra) +46E8 w ROM page select +83C0-83CF ---- Compaq QVision - Line Draw Engine +83C4 ---- Compaq Qvision EISA - Virtual Controller Select +83C6-83C9 ---- Compaq Qvision EISA - DAC color registers + +43c4 is a 83c4 mirror? + +===================================================================================== + +California Chase +The Game Room, 1999 + +This is a rip off of Chase HQ running on PC hardware +and standard 15kHz arcade monitor + +Main board is a cheap Taiwanese one made by SOYO. +Model SY-5EAS +Major main board chips are.... +Cyrix 686MX-PR200 CPU +1M BIOS (Winbond 29C011) +64M RAM (2x 32M 72 pin SIMMs) +ETEQ EQ82C6617'97 MB817A0AG12 (QFP100, x2) +UT6164C32Q-6 (QFP100, x2) +ETEQ 82C6619'97 MB13J15001 (QFP208) +ETEQ 82C6618'97 MB14B10971 (QFP208) +UM61256 +PLL52C61 +SMC FD37C669QF (QFP100) +3V coin battery +3x PCI slots +4x 16-bit ISA slots +4x 72 pin RAM slots +connectors for COM1, COM2, LPT1, IDE0, IDE1, floppy etc +uses standard AT PSU + +Video card is Trident TGUI9680 with 512k on-board VRAM +Card is branded "Union UTD73" - these are all over eBay, for instance +RAM is AS4C256K16EO-50JC (x2) +Trident BIOS V5.5 (DIP28). Actual size unknown, dumped as 64k, 128k, 256k and 512k (can only be one of these sizes) +6.5536MHz xtal + +Custom JAMMA I/O board plugs into one ISA slot +Major components are... +XILINX XC3042 +Dallas DS1220Y NVRAM (dumped) +MACH210 (protected) +16MHz OSC +VGA connector (tied to VGA card with a cable) +2x 4-pin connectors for controls +AD7547 +ULN2803 +LM324 (op amp) +TDA1552 (power amp) +ST TS272 (dual op amp) +2 volume pots +power input connector (from AT PSU) +JAMMA edge connector +ISA edge connector + +HDD is WD Caviar 2170. C/H/S = 1010/6/55. Capacity = 170.6MB +The HDD is DOS-readable and in fact the OS is just Windows 98 DOS and can +be easily copied. Tested with another HDD.... formatted with DOS, copied +all files across to new HDD, boots up fine. + + +Host Invaders is the same motherboard and video card as above, but instead of an HDD, +there is a CD-ROM drive. + +************************************************************************************/ +/* +Grull Osgo - Improvements + +-Changes about BIOS memory management so ROM Shadow now works properly. + The changes are: + Rom Memory Map remmapped to 128K size map(0xfffe0000, 0xffffffff).rom().region("bios", 0); + +-Changes in mtxc write handler and bios_ram write handler. Now The internal register access are +compatible with chipset VIA. + (this motherboard has VIA Apollo VXPro chipset. It is not compatible with Intel i430). + With this changes now BIOS Shadow ram works fine, BIOS can relocate and decompress the full code + necesary to run the Extended Bios, POST and Boot). No more BIOS Checksum error. + +- Suppressed all video related items wich will be replaced with VGA driver. + +- Temporarily added a VGA driver that is working based on original IBM VGA BIOS.(From MESS) + (This VGA driver doesn't work yet with TRIDENT VGA BIOS as I can see). + +- Added the flag READONLY to the calchase imagen rom load function, to avoid + "DIFF CHD ERROR". + +- Minor changes and NOPS into address maps for debugging purposes. + +- Now Bios is looking for the disk (BIOS Auto detection). It seems all works fine but must be there +something wrong in the disk geometry reported by calchase.chd (20,255,63) since BIOS does not accept + 255 heads as parameter. Perhaps a bad dump? + + TODO: A lot of work to do yet!!! + +- update by peter ferrie: +- corrected memory map to 64kb blocks +- corrected access to PAM register + */ + + +#include "emu.h" + +#include "pcshare.h" + +#include "bus/isa/trident.h" +#include "cpu/i386/i386.h" +#include "machine/lpci.h" +#include "machine/pckeybrd.h" +#include "machine/idectrl.h" +#include "machine/ds128x.h" +#include "machine/nvram.h" +#include "sound/dac.h" +#include "video/pc_vga.h" + +#include "screen.h" +#include "speaker.h" + + +namespace { + +class calchase_state : public pcat_base_state +{ +public: + calchase_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + , m_iocard(*this, "IOCARD%u", 1U) + { + } + + void calchase(machine_config &config); + void hostinv(machine_config &config); + void init_calchase(); + void init_hostinv(); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_ioport_array<5> m_iocard; + std::unique_ptr m_bios_ram; + std::unique_ptr m_bios_ext_ram; + std::unique_ptr m_nvram_data; + uint8_t m_mtxc_config_reg[256]{}; + uint8_t m_piix4_config_reg[4][256]{}; + + uint32_t m_idle_skip_ram = 0; + void bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + void bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + uint8_t nvram_r(offs_t offset); + void nvram_w(offs_t offset, uint8_t data); + template uint16_t iocard_r(); + uint32_t calchase_idle_skip_r(); + void calchase_idle_skip_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + + void intel82439tx_init(); + void calchase_io(address_map &map); + void calchase_map(address_map &map); + + uint8_t mtxc_config_r(int function, int reg); + void mtxc_config_w(int function, int reg, uint8_t data); + uint32_t intel82439tx_pci_r(int function, int reg, uint32_t mem_mask); + void intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); + uint8_t piix4_config_r(int function, int reg); + void piix4_config_w(int function, int reg, uint8_t data); + uint32_t intel82371ab_pci_r(int function, int reg, uint32_t mem_mask); + void intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); +}; + +// Intel 82439TX System Controller (MTXC) +// TODO: change with a VIA82C585VPX (North Bridge - APOLLO Chipset) + +uint8_t calchase_state::mtxc_config_r(int function, int reg) +{ +// osd_printf_debug("MTXC: read %d, %02X\n", function, reg); + + return m_mtxc_config_reg[reg]; +} + +void calchase_state::mtxc_config_w(int function, int reg, uint8_t data) +{ +// osd_printf_debug("%s:MTXC: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); + + /* + memory banking with North Bridge: + 0x63 (PAM) xx-- ---- BIOS extension 0xe0000 - 0xeffff + --xx ---- BIOS area 0xf0000-0xfffff + ---- xx-- ISA add-on BIOS 0xc0000 - 0xcffff + ---- --xx ISA add-on BIOS 0xd0000 - 0xdffff + + 10 -> 1 = Write Enable, 0 = Read Enable + */ + + if (reg == 0x63) + { + if (data & 0x20) // enable RAM access to region 0xf0000 - 0xfffff + membank("bios_bank")->set_base(m_bios_ram.get()); + else // disable RAM access (reads go to BIOS ROM) + membank("bios_bank")->set_base(memregion("bios")->base() + 0x10000); + if (data & 0x80) // enable RAM access to region 0xe0000 - 0xeffff + membank("bios_ext")->set_base(m_bios_ext_ram.get()); + else + membank("bios_ext")->set_base(memregion("bios")->base() + 0); + } + + m_mtxc_config_reg[reg] = data; +} + +void calchase_state::intel82439tx_init() +{ + m_mtxc_config_reg[0x60] = 0x02; + m_mtxc_config_reg[0x61] = 0x02; + m_mtxc_config_reg[0x62] = 0x02; + m_mtxc_config_reg[0x63] = 0x02; + m_mtxc_config_reg[0x64] = 0x02; + m_mtxc_config_reg[0x65] = 0x02; +} + +uint32_t calchase_state::intel82439tx_pci_r(int function, int reg, uint32_t mem_mask) +{ + uint32_t r = 0; + + if(reg == 0) + return 0x05851106; // VT82C585VPX, VIA + + if (ACCESSING_BITS_24_31) + { + r |= mtxc_config_r(function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mtxc_config_r(function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mtxc_config_r(function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mtxc_config_r(function, reg + 0) << 0; + } + return r; +} + +void calchase_state::intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mtxc_config_w(function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mtxc_config_w(function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mtxc_config_w(function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mtxc_config_w(function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) +//TODO: change with VIA82C586B (South Bridge - APOLLO Chipset) + +uint8_t calchase_state::piix4_config_r(int function, int reg) +{ +// osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); + return m_piix4_config_reg[function][reg]; +} + +void calchase_state::piix4_config_w(int function, int reg, uint8_t data) +{ +// osd_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); + m_piix4_config_reg[function][reg] = data; +} + +uint32_t calchase_state::intel82371ab_pci_r(int function, int reg, uint32_t mem_mask) +{ + uint32_t r = 0; + + if(reg == 0) + return 0x30401106; // VT82C586B, VIA + + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(function, reg + 0) << 0; + } + return r; +} + +void calchase_state::intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(function, reg + 0, (data >> 0) & 0xff); + } +} + +void calchase_state::bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (m_mtxc_config_reg[0x63] & 0x10) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram.get() + offset); + } +} + +void calchase_state::bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (m_mtxc_config_reg[0x63] & 0x40) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext_ram.get() + offset); + } +} + +uint8_t calchase_state::nvram_r(offs_t offset) +{ + return m_nvram_data[offset]; +} + +void calchase_state::nvram_w(offs_t offset, uint8_t data) +{ + m_nvram_data[offset] = data; +} + +template +uint16_t calchase_state::iocard_r() +{ + return m_iocard[N]->read(); +} + + +void calchase_state::calchase_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(trident_vga_device::mem_r), FUNC(trident_vga_device::mem_w)); // VGA VRAM + map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); + map(0x000c8000, 0x000cffff).noprw(); + //map(0x000d0000, 0x000d0003).ram(); // XYLINX - Sincronus serial communication + map(0x000d0004, 0x000d0005).r(FUNC(calchase_state::iocard_r<0>)); + map(0x000d000c, 0x000d000d).r(FUNC(calchase_state::iocard_r<1>)); + map(0x000d0032, 0x000d0033).r(FUNC(calchase_state::iocard_r<2>)); + map(0x000d0030, 0x000d0031).r(FUNC(calchase_state::iocard_r<3>)); // These two controls wheel pot or whatever this game uses ... + map(0x000d0034, 0x000d0035).r(FUNC(calchase_state::iocard_r<4>)); + map(0x000d0008, 0x000d000b).nopw(); // ??? + map(0x000d0024, 0x000d0025).w("ldac", FUNC(dac_word_interface::data_w)); + map(0x000d0028, 0x000d0029).w("rdac", FUNC(dac_word_interface::data_w)); + map(0x000d0800, 0x000d0fff).rw(FUNC(calchase_state::nvram_r), FUNC(calchase_state::nvram_w)); // GAME_CMOS + + map(0x000e0000, 0x000effff).bankr("bios_ext").w(FUNC(calchase_state::bios_ext_ram_w)); + map(0x000f0000, 0x000fffff).bankr("bios_bank").w(FUNC(calchase_state::bios_ram_w)); + map(0x00100000, 0x03ffffff).ram(); // 64MB + map(0x04000000, 0x28ffffff).noprw(); + //map(0x04000000, 0x040001ff).ram(); + //map(0x08000000, 0x080001ff).ram(); + //map(0x0c000000, 0x0c0001ff).ram(); + //map(0x10000000, 0x100001ff).ram(); + //map(0x14000000, 0x140001ff).ram(); + //map(0x18000000, 0x180001ff).ram(); + //map(0x20000000, 0x200001ff).ram(); + //map(0x28000000, 0x280001ff).ram(); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ +} + +void calchase_state::calchase_io(address_map &map) +{ + pcat32_io_common(map); + //map(0x00e8, 0x00eb).noprw(); + map(0x00e8, 0x00ef).noprw(); //AMI BIOS write to this ports as delays between I/O ports operations sending al value -> NEWIODELAY + map(0x0170, 0x0177).noprw(); //To debug + map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); + map(0x0200, 0x021f).noprw(); //To debug + map(0x0260, 0x026f).noprw(); //To debug + map(0x0278, 0x027b).nopw();//.w(FUNC(calchase_state::pnp_config_w)); + map(0x0280, 0x0287).noprw(); //To debug + map(0x02a0, 0x02a7).noprw(); //To debug + map(0x02c0, 0x02c7).noprw(); //To debug + map(0x02e0, 0x02ef).noprw(); //To debug + map(0x02f8, 0x02ff).noprw(); //To debug + map(0x0320, 0x038f).noprw(); //To debug + map(0x03a0, 0x03a7).noprw(); //To debug + map(0x03b0, 0x03bf).rw("vga", FUNC(trident_vga_device::port_03b0_r), FUNC(trident_vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(trident_vga_device::port_03c0_r), FUNC(trident_vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(trident_vga_device::port_03d0_r), FUNC(trident_vga_device::port_03d0_w)); + map(0x03e0, 0x03ef).noprw(); //To debug + map(0x0378, 0x037f).noprw(); //To debug + // map(0x0300, 0x03af).noprw(); + // map(0x03b0, 0x03df).noprw(); + map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); + map(0x03f8, 0x03ff).noprw(); // To debug Serial Port COM1: + map(0x0a78, 0x0a7b).nopw();//.w(FUNC(calchase_state::pnp_data_w)); + map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); + map(0x42e8, 0x43ef).noprw(); //To debug + map(0x43c4, 0x43cb).rw("vga", FUNC(trident_vga_device::port_43c6_r), FUNC(trident_vga_device::port_43c6_w)); // Trident Memory and Video Clock register + map(0x46e8, 0x46ef).noprw(); //To debug + map(0x4ae8, 0x4aef).noprw(); //To debug + map(0x83c4, 0x83cb).rw("vga", FUNC(trident_vga_device::port_83c6_r), FUNC(trident_vga_device::port_83c6_w)); // Trident LUTDAC + map(0x92e8, 0x92ef).noprw(); //To debug +} + + + +static INPUT_PORTS_START( calchase ) + PORT_START("IOCARD1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_START1 ) + PORT_DIPNAME( 0x0008, 0x0008, "1" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Accelerator") + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IOCARD2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SERVICE1 ) // guess + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset SW") + PORT_DIPNAME( 0x0004, 0x0004, "2" ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Turbo") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) // returns back to MS-DOS (likely to be unmapped and actually used as a lame protection check) + PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IOCARD3") + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") + PORT_BIT( 0xdfff, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("IOCARD4") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") //eggsplc + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("IOCARD5") + PORT_DIPNAME( 0x01, 0x01, "DSWA" ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, "DSWA" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + +void calchase_state::machine_start() +{ + m_bios_ram = std::make_unique(0x10000/4); + m_bios_ext_ram = std::make_unique(0x10000/4); + + m_nvram_data = std::make_unique(0x800); + subdevice("nvram")->set_base(m_nvram_data.get(), 0x800); + + for (int i = 0; i < 4; i++) + std::fill(std::begin(m_piix4_config_reg[i]), std::end(m_piix4_config_reg[i]), 0); +} + +void calchase_state::machine_reset() +{ + //membank("bank1")->set_base(memregion("bios")->base() + 0x10000); + membank("bios_bank")->set_base(memregion("bios")->base() + 0x10000); + membank("bios_ext")->set_base(memregion("bios")->base() + 0); +} + +void calchase_state::calchase(machine_config &config) +{ + PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU + m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map); + m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "hdd", nullptr, true)); + ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); + + pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); + pcibus.set_device(0, FUNC(calchase_state::intel82439tx_pci_r), FUNC(calchase_state::intel82439tx_pci_w)); + pcibus.set_device(7, FUNC(calchase_state::intel82371ab_pci_r), FUNC(calchase_state::intel82371ab_pci_w)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // DS1220Y + + /* video hardware */ + pcvideo_trident_vga(config); + + ds12885_device &rtc(DS12885(config.replace(), "rtc")); + rtc.irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); + rtc.set_century_index(0x32); + + /* sound hardware */ + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC + DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC +} + +void calchase_state::hostinv(machine_config &config) +{ + PENTIUM(config, m_maincpu, 133000000); // Cyrix 686MX-PR200 CPU + m_maincpu->set_addrmap(AS_PROGRAM, &calchase_state::calchase_map); + m_maincpu->set_addrmap(AS_IO, &calchase_state::calchase_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + ide_controller_32_device &ide(IDE_CONTROLLER_32(config, "ide").options(ata_devices, "cdrom", nullptr, true)); + ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); + + pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); + pcibus.set_device(0, FUNC(calchase_state::intel82439tx_pci_r), FUNC(calchase_state::intel82439tx_pci_w)); + pcibus.set_device(7, FUNC(calchase_state::intel82371ab_pci_r), FUNC(calchase_state::intel82371ab_pci_w)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // DS1220Y + + /* video hardware */ + pcvideo_trident_vga(config); + + /* sound hardware */ + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + DAC_12BIT_R2R(config, "ldac", 0).add_route(ALL_OUTPUTS, "lspeaker", 0.25); // unknown DAC + DAC_12BIT_R2R(config, "rdac", 0).add_route(ALL_OUTPUTS, "rspeaker", 0.25); // unknown DAC +} + + +uint32_t calchase_state::calchase_idle_skip_r() +{ + if(m_maincpu->pc()==0x1406f48) + m_maincpu->spin_until_interrupt(); + + return m_idle_skip_ram; +} + +void calchase_state::calchase_idle_skip_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + COMBINE_DATA(&m_idle_skip_ram); +} + +void calchase_state::init_calchase() +{ + m_bios_ram = std::make_unique(0x20000/4); + + intel82439tx_init(); + + m_maincpu->space(AS_PROGRAM).install_read_handler(0x3f0b160, 0x3f0b163, read32smo_delegate(*this, FUNC(calchase_state::calchase_idle_skip_r))); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x3f0b160, 0x3f0b163, write32s_delegate(*this, FUNC(calchase_state::calchase_idle_skip_w))); +} + +void calchase_state::init_hostinv() +{ + m_bios_ram = std::make_unique(0x20000/4); + + intel82439tx_init(); +} + +ROM_START( calchase ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "mb_bios.bin", 0x00000, 0x20000, CRC(dea7a51b) SHA1(e2028c00bfa6d12959fc88866baca8b06a1eab68) ) + + ROM_REGION32_LE( 0x8000, "video_bios", 0 ) + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) + + ROM_REGION( 0x800, "nvram", 0 ) + ROM_LOAD( "ds1220y_nv.bin", 0x000, 0x800, CRC(7912c070) SHA1(b4c55c7ca76bcd8dad1c4b50297233349ae02ed3) ) + + DISK_REGION( "ide:0:hdd:image" ) + DISK_IMAGE_READONLY( "calchase", 0,BAD_DUMP SHA1(6ae51a9b3f31cf4166322328a98c0235b0874eb3) ) +ROM_END + +ROM_START( hostinv ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "hostinv_bios.bin", 0x000000, 0x020000, CRC(5111e4b8) SHA1(20ab93150b61fd068f269368450734bba5dcb284) ) + + ROM_REGION32_LE( 0x8000, "video_bios", 0 ) + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) + + ROM_REGION( 0x800, "nvram", ROMREGION_ERASEFF ) + ROM_LOAD( "ds1220y_hostinv.bin", 0x000, 0x800, NO_DUMP ) + + DISK_REGION( "ide:0:cdrom:image" ) + DISK_IMAGE_READONLY( "hostinv", 0, SHA1(3cb86c62e80be98a717172b717f7276a0e5f6830) ) +ROM_END + +ROM_START( eggsplc ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "hostinv_bios.bin", 0x000000, 0x020000, CRC(5111e4b8) SHA1(20ab93150b61fd068f269368450734bba5dcb284) ) + + ROM_REGION32_LE( 0x8000, "video_bios", 0 ) + ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) + ROM_CONTINUE( 0x0001, 0x4000 ) + + ROM_REGION( 0x800, "nvram", ROMREGION_ERASEFF ) + ROM_LOAD( "ds1220y_eggsplc.bin", 0x000, 0x800, NO_DUMP ) + + DISK_REGION( "ide:0:hdd:image" ) + DISK_IMAGE_READONLY( "eggsplc", 0, SHA1(fa38dd6b0d25cde644f68cf639768f137c607eb5) ) +ROM_END + +} // Anonymous namespace + + +GAME( 1998, hostinv, 0, hostinv, calchase, calchase_state, init_hostinv, ROT0, "The Game Room", "Host Invaders", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) +GAME( 1999, calchase, 0, calchase, calchase, calchase_state, init_calchase, ROT0, "The Game Room", "California Chase", MACHINE_NOT_WORKING|MACHINE_IMPERFECT_GRAPHICS ) +GAME( 2002, eggsplc, 0, calchase, calchase, calchase_state, init_hostinv, ROT0, "The Game Room", "Eggs Playing Chicken", 0 ) diff --git a/src/mame/pc/ct486.cpp b/src/mame/pc/ct486.cpp new file mode 100644 index 00000000000..23a4b1dc811 --- /dev/null +++ b/src/mame/pc/ct486.cpp @@ -0,0 +1,210 @@ +// license:GPL-2.0+ +// copyright-holders:Dirk Best +/*************************************************************************** + + PC/AT 486 with Chips & Technologies CS4031 chipset + +***************************************************************************/ + +#include "emu.h" + +#include "cpu/i386/i386.h" +#include "machine/at_keybc.h" +#include "machine/cs4031.h" +#include "machine/ram.h" +#include "sound/spkrdev.h" + +#include "bus/isa/isa.h" +#include "bus/isa/isa_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" + +#include "emupal.h" +#include "softlist.h" +#include "softlist_dev.h" +#include "speaker.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class ct486_state : public driver_device +{ +public: + ct486_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_cs4031(*this, "cs4031"), + m_isabus(*this, "isabus"), + m_speaker(*this, "speaker") + { } + + required_device m_maincpu; + required_device m_cs4031; + required_device m_isabus; + required_device m_speaker; + + virtual void machine_start() override; + + uint16_t cs4031_ior(offs_t offset); + void cs4031_iow(offs_t offset, uint16_t data); + DECLARE_WRITE_LINE_MEMBER( cs4031_hold ); + void cs4031_tc(offs_t offset, uint8_t data) { m_isabus->eop_w(offset, data); } + DECLARE_WRITE_LINE_MEMBER( cs4031_spkr ) { m_speaker->level_w(state); } + void ct486(machine_config &config); + void ct486_io(address_map &map); + void ct486_map(address_map &map); +}; + + +//************************************************************************** +// MACHINE EMULATION +//************************************************************************** + +void ct486_state::machine_start() +{ +} + +uint16_t ct486_state::cs4031_ior(offs_t offset) +{ + if (offset < 4) + return m_isabus->dack_r(offset); + else + return m_isabus->dack16_r(offset); +} + +void ct486_state::cs4031_iow(offs_t offset, uint16_t data) +{ + if (offset < 4) + m_isabus->dack_w(offset, data); + else + m_isabus->dack16_w(offset, data); +} + +WRITE_LINE_MEMBER( ct486_state::cs4031_hold ) +{ + // halt cpu + m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + // and acknowledge hold + m_cs4031->hlda_w(state); +} + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +void ct486_state::ct486_map(address_map &map) +{ +} + +void ct486_state::ct486_io(address_map &map) +{ + map.unmap_value_high(); +} + + +//************************************************************************** +// MACHINE DRIVERS +//************************************************************************** + +void ct486_state::ct486(machine_config &config) +{ + I486(config, m_maincpu, XTAL(25'000'000)); + m_maincpu->set_addrmap(AS_PROGRAM, &ct486_state::ct486_map); + m_maincpu->set_addrmap(AS_IO, &ct486_state::ct486_io); + m_maincpu->set_irq_acknowledge_callback("cs4031", FUNC(cs4031_device::int_ack_r)); + + CS4031(config, m_cs4031, XTAL(25'000'000), "maincpu", "isa", "bios", "keybc", RAM_TAG); + // cpu connections + m_cs4031->hold().set(FUNC(ct486_state::cs4031_hold)); + m_cs4031->nmi().set_inputline("maincpu", INPUT_LINE_NMI); + m_cs4031->intr().set_inputline("maincpu", INPUT_LINE_IRQ0); + m_cs4031->cpureset().set_inputline("maincpu", INPUT_LINE_RESET); + m_cs4031->a20m().set_inputline("maincpu", INPUT_LINE_A20); + // isa dma + m_cs4031->ior().set(FUNC(ct486_state::cs4031_ior)); + m_cs4031->iow().set(FUNC(ct486_state::cs4031_iow)); + m_cs4031->tc().set(FUNC(ct486_state::cs4031_tc)); + // speaker + m_cs4031->spkr().set(FUNC(ct486_state::cs4031_spkr)); + + RAM(config, RAM_TAG).set_default_size("4M").set_extra_options("1M,2M,8M,16M,32M,64M"); + + at_kbc_device_base &keybc(AT_KEYBOARD_CONTROLLER(config, "keybc", XTAL(12'000'000))); + keybc.hot_res().set("cs4031", FUNC(cs4031_device::kbrst_w)); + keybc.gate_a20().set("cs4031", FUNC(cs4031_device::gatea20_w)); + keybc.kbd_irq().set("cs4031", FUNC(cs4031_device::irq01_w)); + keybc.kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + keybc.kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + pc_kbdc_device &pc_kbdc(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + pc_kbdc.out_clock_cb().set(keybc, FUNC(at_kbc_device_base::kbd_clk_w)); + pc_kbdc.out_data_cb().set(keybc, FUNC(at_kbc_device_base::kbd_data_w)); + + ISA16(config, m_isabus, 0); + m_isabus->set_memspace(m_maincpu, AS_PROGRAM); + m_isabus->set_iospace(m_maincpu, AS_IO); + m_isabus->iochck_callback().set(m_cs4031, FUNC(cs4031_device::iochck_w)); + m_isabus->irq2_callback().set(m_cs4031, FUNC(cs4031_device::irq09_w)); + m_isabus->irq3_callback().set(m_cs4031, FUNC(cs4031_device::irq03_w)); + m_isabus->irq4_callback().set(m_cs4031, FUNC(cs4031_device::irq04_w)); + m_isabus->irq5_callback().set(m_cs4031, FUNC(cs4031_device::irq05_w)); + m_isabus->irq6_callback().set(m_cs4031, FUNC(cs4031_device::irq06_w)); + m_isabus->irq7_callback().set(m_cs4031, FUNC(cs4031_device::irq07_w)); + m_isabus->irq10_callback().set(m_cs4031, FUNC(cs4031_device::irq10_w)); + m_isabus->irq11_callback().set(m_cs4031, FUNC(cs4031_device::irq11_w)); + m_isabus->irq12_callback().set(m_cs4031, FUNC(cs4031_device::irq12_w)); + m_isabus->irq14_callback().set(m_cs4031, FUNC(cs4031_device::irq14_w)); + m_isabus->irq15_callback().set(m_cs4031, FUNC(cs4031_device::irq15_w)); + m_isabus->drq0_callback().set(m_cs4031, FUNC(cs4031_device::dreq0_w)); + m_isabus->drq1_callback().set(m_cs4031, FUNC(cs4031_device::dreq1_w)); + m_isabus->drq2_callback().set(m_cs4031, FUNC(cs4031_device::dreq2_w)); + m_isabus->drq3_callback().set(m_cs4031, FUNC(cs4031_device::dreq3_w)); + m_isabus->drq5_callback().set(m_cs4031, FUNC(cs4031_device::dreq5_w)); + m_isabus->drq6_callback().set(m_cs4031, FUNC(cs4031_device::dreq6_w)); + m_isabus->drq7_callback().set(m_cs4031, FUNC(cs4031_device::dreq7_w)); + ISA16_SLOT(config, "board1", 0, "isabus", pc_isa16_cards, "fdcsmc", true); + ISA16_SLOT(config, "board2", 0, "isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "isabus", pc_isa16_cards, "lpt", true); + ISA16_SLOT(config, "isa1", 0, "isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "isabus", pc_isa16_cards, nullptr, false); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50); + + // video hardware + PALETTE(config, "palette").set_entries(256); // todo: really needed? + + /* software lists */ + SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); + SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); + SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); + SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); + SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); +} + + +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START( ct486 ) + ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) + ROM_REGION(0x100000, "bios", 0) + ROM_LOAD("chips_1.ami", 0xf0000, 0x10000, CRC(a14a7511) SHA1(b88d09be66905ed2deddc26a6f8522e7d2d6f9a8)) +ROM_END + + +//************************************************************************** +// GAME DRIVERS +//************************************************************************** + +COMP( 1993, ct486, 0, 0, ct486, 0, ct486_state, empty_init, "", "PC/AT 486 with CS4031 chipset", 0 ) diff --git a/src/mame/pc/ec184x.cpp b/src/mame/pc/ec184x.cpp new file mode 100644 index 00000000000..f5f03e39670 --- /dev/null +++ b/src/mame/pc/ec184x.cpp @@ -0,0 +1,347 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + drivers/ec184x.c + + Driver file for EC-184x series + + To do: + - verify ec1840 clocks etc. + - did 640KB memory board exist or it's 512+128 boards? + +***************************************************************************/ + + +#include "emu.h" +#include "machine/genpc.h" + +#include "bus/isa/xsu_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "cpu/i86/i86.h" +#include "machine/ram.h" + +#include "softlist_dev.h" + + +//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already +#define LOG_KEYBOARD (1U << 1) +#define LOG_DEBUG (1U << 2) + +//#define VERBOSE (LOG_DEBUG) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) +#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) + + +static constexpr int EC1841_MEMBOARD_SIZE = 512 * 1024; + + +class ec184x_state : public driver_device +{ +public: + ec184x_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_ram(*this, RAM_TAG) + { } + + void ec1840(machine_config &config); + void ec1841(machine_config &config); + + void init_ec1840(); + void init_ec1841(); + +private: + DECLARE_MACHINE_RESET(ec1841); + uint8_t memboard_r(offs_t offset); + void memboard_w(offs_t offset, uint8_t data); + + void ec1840_io(address_map &map); + void ec1840_map(address_map &map); + void ec1841_io(address_map &map); + void ec1841_map(address_map &map); + + required_device m_maincpu; + required_device m_ram; + + struct + { + uint8_t enable[4]{}; + int boards = 0; + } m_memory; +}; + +/* + * EC-1841 memory controller. The machine can hold four memory boards; + * each board has a control register, its address is set by a DIP switch + * on the board itself. + * + * Only one board should be enabled for read, and one for write. + * Normally, this is the same board. + * + * Each board is divided into 4 banks, internally numbered 0..3. + * POST tests each board on startup, and an error (indicated by + * I/O CH CK bus signal) causes it to disable failing bank(s) by writing + * 'reconfiguration code' (inverted number of failing memory bank) to + * the register. + + * bit 1-0 'reconfiguration code' + * bit 2 enable read access + * bit 3 enable write access + */ + +uint8_t ec184x_state::memboard_r(offs_t offset) +{ + uint8_t data; + + data = offset % 4; + if (data >= m_memory.boards) + data = 0xff; + else + data = m_memory.enable[data]; + LOG("ec1841_memboard R (%d of %d) == %02X\n", offset + 1, m_memory.boards, data); + + return data; +} + +void ec184x_state::memboard_w(offs_t offset, uint8_t data) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + uint8_t current = m_memory.enable[offset]; + + LOG("ec1841_memboard W (%d of %d) <- %02X (%02X)\n", offset + 1, m_memory.boards, data, current); + + if (offset >= m_memory.boards) + { + return; + } + + if (BIT(current, 2) && !BIT(data, 2)) + { + // disable read access + program.unmap_read(0, EC1841_MEMBOARD_SIZE - 1); + LOG("ec1841_memboard_w unmap_read(%d)\n", offset); + } + + if (BIT(current, 3) && !BIT(data, 3)) + { + // disable write access + program.unmap_write(0, EC1841_MEMBOARD_SIZE - 1); + LOG("ec1841_memboard_w unmap_write(%d)\n", offset); + } + + if (!BIT(current, 2) && BIT(data, 2)) + { + for (int i = 0; i < 4; i++) + m_memory.enable[i] &= 0xfb; + // enable read access + program.install_rom(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE); + LOG("ec1841_memboard_w map_read(%d)\n", offset); + } + + if (!BIT(current, 3) && BIT(data, 3)) + { + for (int i = 0; i < 4; i++) + m_memory.enable[i] &= 0xf7; + // enable write access + program.install_writeonly(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE); + LOG("ec1841_memboard_w map_write(%d)\n", offset); + } + + m_memory.enable[offset] = data; +} + +void ec184x_state::init_ec1840() +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); +} + +void ec184x_state::init_ec1841() +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + m_memory.boards = m_ram->size() / EC1841_MEMBOARD_SIZE; + if (m_memory.boards > 4) m_memory.boards = 4; + + program.install_ram(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer()); + + // 640K configuration is special -- 512K board mapped at 0 + 128K board mapped at 512K + if (m_ram->size() == 640 * 1024) + { + program.install_ram(EC1841_MEMBOARD_SIZE, m_ram->size() - 1, m_ram->pointer() + EC1841_MEMBOARD_SIZE); + } +} + +MACHINE_RESET_MEMBER(ec184x_state, ec1841) +{ + memset(m_memory.enable, 0, sizeof(m_memory.enable)); + // mark 1st board enabled + m_memory.enable[0] = 0xc; +} + + +void ec184x_state::ec1840_map(address_map &map) +{ + map.unmap_value_high(); + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + +void ec184x_state::ec1841_map(address_map &map) +{ + map.unmap_value_high(); + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + +void ec184x_state::ec1840_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m("mb", FUNC(ec1840_mb_device::map)); +} + +void ec184x_state::ec1841_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m("mb", FUNC(ec1841_mb_device::map)); + map(0x02b0, 0x02b3).rw(FUNC(ec184x_state::memboard_r), FUNC(ec184x_state::memboard_w)); +} + + +void ec184x_state::ec1840(machine_config &config) +{ + I8086(config, m_maincpu, 4096000); + m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1840_map); + m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1840_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); + + ec1840_mb_device &mb(EC1840_MOTHERBOARD(config, "mb")); + mb.set_cputag(m_maincpu); + mb.int_callback().set_inputline(m_maincpu, 0); + mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + // FIXME: determine ISA bus clock + // 7-slot backplane, at least two slots are always taken by CPU and memory cards + ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0002", false); + ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0003", false); + ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0004", false); + ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); + + SOFTWARE_LIST(config, "flop_list").set_original("ec1841"); + + pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); + kbd.out_clock_cb().set("mb", FUNC(ec1840_mb_device::keyboard_clock_w)); + kbd.out_data_cb().set("mb", FUNC(ec1840_mb_device::keyboard_data_w)); + + RAM(config, m_ram).set_default_size("640K").set_extra_options("128K,256K,384K,512K"); +} + +void ec184x_state::ec1841(machine_config &config) +{ + I8086(config, m_maincpu, XTAL(12'288'000) / 3); + m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1841_map); + m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1841_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); + + MCFG_MACHINE_RESET_OVERRIDE(ec184x_state, ec1841) + + ec1841_mb_device &mb(EC1841_MOTHERBOARD(config, "mb")); + mb.set_cputag(m_maincpu); + mb.int_callback().set_inputline(m_maincpu, 0); + mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + // FIXME: determine ISA bus clock + ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0002", false); // cga + ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0003", false); // fdc (IRQ6) + mouse port (IRQ2..5) + ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0004", false); // lpt (IRQ7||5) [+ serial (IRQx)] + ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, "hdc", false); + ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa6", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); + + SOFTWARE_LIST(config, "flop_list").set_original("ec1841"); + + pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); + kbd.out_clock_cb().set("mb", FUNC(ec1841_mb_device::keyboard_clock_w)); + kbd.out_data_cb().set("mb", FUNC(ec1841_mb_device::keyboard_data_w)); + + RAM(config, m_ram).set_default_size("640K").set_extra_options("512K,1024K,1576K,2048K"); +} + +ROM_START( ec1840 ) + ROM_REGION16_LE(0x10000,"bios", 0) + ROM_DEFAULT_BIOS("v4") + // supports MDA only + ROM_SYSTEM_BIOS(0, "v1", "EC-1840.01") + ROMX_LOAD("000-01.bin", 0xe000, 0x0800, CRC(c3ab1fad) SHA1(8168bdee30698f4f9aa7bbb6dfabe62dd723cec5), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("001-01.bin", 0xf000, 0x0800, CRC(601d1155) SHA1(9684d33b92743749704587a48e679ef7a3b20f9c), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("002-01.bin", 0xe001, 0x0800, CRC(ce4dddb7) SHA1(f9b1da60c848e68ff1c154d695a36a0833de4804), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("003-01.bin", 0xf001, 0x0800, CRC(14b40431) SHA1(ce7fffa41897405ee64fd4e86015e774f8bd108a), ROM_SKIP(1) | ROM_BIOS(0)) + + ROM_SYSTEM_BIOS(1, "v4", "EC-1840.04") + ROMX_LOAD("000-04-971b.bin", 0xe000, 0x0800, CRC(06aeaee8) SHA1(9f954e4c48156d573a8e0109e7ca652be9e6036a), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("001-04-92b7.bin", 0xf000, 0x0800, CRC(3fae650a) SHA1(c98b777fdeceadd72d6eb9465b3501b9ead55a08), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("002-04-9e17.bin", 0xe001, 0x0800, CRC(d59712df) SHA1(02ea1b3ae9662f5c64c58920a32ca9db0f6fbd12), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("003-04-3ccb.bin", 0xf001, 0x0800, CRC(7fc362c7) SHA1(538e13639ad2b4c30bd72582e323181e63513306), ROM_SKIP(1) | ROM_BIOS(1)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) +ROM_END + +ROM_START( ec1841 ) + ROM_REGION16_LE(0x10000,"bios", 0) + ROM_DEFAULT_BIOS("v2") + ROM_SYSTEM_BIOS(0, "v1", "EC-1841.01") + ROMX_LOAD("012-01-3107.bin", 0xc000, 0x0800, CRC(77957396) SHA1(785f1dceb6e2b4618f5c5f0af15eb74a8c951448), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("013-01-203f.bin", 0xc001, 0x0800, CRC(768bd3d5) SHA1(2e948f2ad262de306d889b7964c3f1aad45ff5bc), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("014-01-fa40.bin", 0xd000, 0x0800, CRC(47722b58) SHA1(a6339ee8af516f834826b7828a5cf79cb650480c), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("015-01-bf1d.bin", 0xd001, 0x0800, CRC(b585b5ea) SHA1(d0ebed586eb13031477c2e071c50416682f80489), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("016-01-65f7.bin", 0xe000, 0x0800, CRC(28a07db4) SHA1(17fbcd60dacd1d3f8d8355db429f97e4d1d1ac88), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("017-01-5be1.bin", 0xe001, 0x0800, CRC(928bda26) SHA1(ee889184067e2680b29a8ef1c3a76cf5afd4c78d), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("018-01-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD("019-01-0492.bin", 0xf001, 0x0800, CRC(8a9d593e) SHA1(f3936d2cb4e6d130dd732973f126c3aa20612463), ROM_SKIP(1) | ROM_BIOS(0)) + + ROM_SYSTEM_BIOS(1, "v2", "EC-1841.02") + ROMX_LOAD("012-02-37f6.bin", 0xc000, 0x0800, CRC(8f5c6a20) SHA1(874b62f9cee8d3b974f33732f94eff10fc002c44), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("013-02-2552.bin", 0xc001, 0x0800, CRC(e3c10128) SHA1(d6ed743ebe9c130925c9f17aad1a45db9194c967), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("014-02-0fbe.bin", 0xd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("015-02-d736.bin", 0xd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("016-02-5b2c.bin", 0xe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("017-02-4b9d.bin", 0xe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("018-02-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD("019-02-0493.bin", 0xf001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(1)) + + ROM_SYSTEM_BIOS(2, "v3", "EC-1841.03") + ROMX_LOAD("012-03-37e7.bin", 0xc000, 0x0800, CRC(49992bd5) SHA1(119121e1b4af1c44b9b8c2edabe7dc1d3019c4a6), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("013-03-2554.bin", 0xc001, 0x0800, CRC(834bd7d7) SHA1(e37514fc4cb8a5cbe68e7564e0e07d5116c4021a), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("014-03-0fbe.bin", 0xd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("015-03-d736.bin", 0xd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("016-03-5b2c.bin", 0xe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("017-03-4b9d.bin", 0xe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("018-03-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(2)) + ROMX_LOAD("019-03-0493.bin", 0xf001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(2)) +ROM_END + +ROM_START( ec1845 ) + ROM_REGION16_LE(0x10000,"bios", 0) + ROMX_LOAD("184500.bin", 0xc000, 0x0800, CRC(7c472ef7) SHA1(3af53f27b49bbc731bf51f9300fbada23a1bfcfc), ROM_SKIP(1)) + ROMX_LOAD("184501.bin", 0xc001, 0x0800, CRC(db240dc6) SHA1(d7bb022213d09bbf2a8107fe4f1cd27b23939e18), ROM_SKIP(1)) + ROMX_LOAD("184502.bin", 0xd000, 0x0800, CRC(149e7e29) SHA1(7f2a297588fef1bc750c57e6ae0d5acf3d27c486), ROM_SKIP(1)) + ROMX_LOAD("184503.bin", 0xd001, 0x0800, CRC(e28cbd74) SHA1(cf1fba4e67c8e1dd8cdda547118e84b704029b03), ROM_SKIP(1)) + ROMX_LOAD("184504.bin", 0xe000, 0x0800, CRC(55fa7a1d) SHA1(58f7abab08b9d2f0a1c1636e11bb72af2694c95f), ROM_SKIP(1)) + ROMX_LOAD("184505.bin", 0xe001, 0x0800, CRC(c807e3f5) SHA1(08117e449f0d04f96041cff8d34893f500f3760d), ROM_SKIP(1)) + ROMX_LOAD("184506.bin", 0xf000, 0x0800, CRC(24f5c27c) SHA1(7822dd7f715ef00ccf6d8408be8bbfe01c2eba20), ROM_SKIP(1)) + ROMX_LOAD("184507.bin", 0xf001, 0x0800, CRC(75122203) SHA1(7b0fbdf1315230633e39574ac7360163bc7361e1), ROM_SKIP(1)) +ROM_END + +// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS +COMP( 1986, ec1840, ibm5150, 0, ec1840, 0, ec184x_state, init_ec1840, "", "EC-1840", 0 ) +COMP( 1987, ec1841, ibm5150, 0, ec1841, 0, ec184x_state, init_ec1841, "", "EC-1841", 0 ) +COMP( 1989, ec1845, ibm5150, 0, ec1841, 0, ec184x_state, init_ec1841, "", "EC-1845", MACHINE_NOT_WORKING ) diff --git a/src/mame/pc/fruitpc.cpp b/src/mame/pc/fruitpc.cpp new file mode 100644 index 00000000000..b8fd10fdef2 --- /dev/null +++ b/src/mame/pc/fruitpc.cpp @@ -0,0 +1,180 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont, Carl +/************************************************************************************ + + "Fruit Land" (c) ???? + hack of an open source game by MesSoft with coin handling added + + preliminary driver by R. Belmont and Carl + + TODO: + - Can't find CF card, throws "No boot device available", culprit may be lack of + PCI shadow RAM handling (which causes BIOS to boot in legacy mode); + - Handle STPCD0166BTC3 SoC properly, including PCI devices connected and SVGA + mods (wrongly draws only top screen with 640x200 with at486 -isa1 svga_s3); + + Hardware: + - ST STPCD0166BTC3 486/66 + PC + VGA all on one chip + - 4x AS4LC1M16E5-60TC 1M x 16 EDO DRAM + +=====================================================================================*/ + +#include "emu.h" +#include "pcshare.h" + +#include "bus/isa/isa.h" +#include "bus/isa/sblaster.h" +#include "cpu/i386/i386.h" +#include "machine/idectrl.h" +#include "machine/pci.h" +#include "machine/pckeybrd.h" +#include "video/pc_vga.h" + + +namespace { + +class fruitpc_state : public pcat_base_state +{ +public: + fruitpc_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + , m_pciroot(*this, "pci") + , m_isabus(*this, "isa") + , m_inp(*this, "INP%u", 1U) + { } + + void fruitpc(machine_config &config); + +private: + required_device m_pciroot; + required_device m_isabus; + required_ioport_array<4> m_inp; + + uint8_t fruit_inp_r(offs_t offset); + void dma8237_1_dack_w(uint8_t data); + static void fruitpc_sb_conf(device_t *device); + void fruitpc_io(address_map &map); + void fruitpc_map(address_map &map); +}; + +uint8_t fruitpc_state::fruit_inp_r(offs_t offset) +{ + return m_inp[offset & 0x03]->read(); +} + +void fruitpc_state::fruitpc_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); // VGA VRAM + map(0x000c0000, 0x000dffff).rom().region("bios", 0); + map(0x000e0000, 0x000fffff).rom().region("bios", 0); + map(0x00100000, 0x008fffff).ram(); // 8MB RAM + map(0x02000000, 0x28ffffff).noprw(); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ +} + +void fruitpc_state::fruitpc_io(address_map &map) +{ + pcat32_io_common(map); + map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); + map(0x0310, 0x0313).r(FUNC(fruitpc_state::fruit_inp_r)); + map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); + map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); +// map(0x0cf8, 0x0cff).rw(m_pcibus, FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); +} + +static INPUT_PORTS_START( fruitpc ) + PORT_START("INP1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x00fe, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START("INP2") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START("INP3") + PORT_BIT( 0x0003, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_DIPNAME( 0x0004, 0x0004, "CONFIGURATION" ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, "STATISTICHE" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_BIT( 0x00f0, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_START("INP4") + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + +//TODO: use atmb device +void fruitpc_state::dma8237_1_dack_w(uint8_t data) { m_isabus->dack_w(1, data); } + +static void fruitpc_isa8_cards(device_slot_interface &device) +{ + device.option_add("sb15", ISA8_SOUND_BLASTER_1_5); +} + +static DEVICE_INPUT_DEFAULTS_START( fruitpc_sb_def ) + DEVICE_INPUT_DEFAULTS("CONFIG", 0x03, 0x01) +DEVICE_INPUT_DEFAULTS_END + +void fruitpc_state::fruitpc_sb_conf(device_t *device) +{ + device->subdevice("pc_joy")->set_default_option(nullptr); // remove joystick +} + +void fruitpc_state::fruitpc(machine_config &config) +{ + I486(config, m_maincpu, 66000000); // ST STPCD0166BTC3 66 MHz 486 CPU + m_maincpu->set_addrmap(AS_PROGRAM, &fruitpc_state::fruitpc_map); + m_maincpu->set_addrmap(AS_IO, &fruitpc_state::fruitpc_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); + ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); + + /* video hardware */ + pcvideo_vga(config); + + m_dma8237_1->out_iow_callback<1>().set(FUNC(fruitpc_state::dma8237_1_dack_w)); + + PCI_ROOT(config, m_pciroot, 0); + // TODO: STPCD0166BTC3 host PCI + + ISA8(config, m_isabus, 0); + m_isabus->set_memspace("maincpu", AS_PROGRAM); + m_isabus->set_iospace("maincpu", AS_IO); + m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir1_w)); + m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); + m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); + m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); + m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); + m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); + m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); + m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); + + // FIXME: determine ISA bus clock + isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", fruitpc_isa8_cards, "sb15", true)); + isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(fruitpc_sb_def)); + isa1.set_option_machine_config("sb15", fruitpc_sb_conf); +} + +ROM_START( fruitpc ) + ROM_REGION32_LE( 0x20000, "bios", 0 ) + ROM_LOAD( "at-gs001.bin", 0x000000, 0x020000, CRC(7dec34d0) SHA1(81d194d67fef9f6531bd3cd1ee0baacb5c2558bf) ) + + DISK_REGION( "ide:0:hdd:image" ) // 8 MB Compact Flash card + DISK_IMAGE( "fruit", 0,SHA1(df250ff06a97fa141a4144034f7035ac2947c53c) ) +ROM_END + +} // anonymous namespace + + +GAME( 2006, fruitpc, 0, fruitpc, fruitpc, fruitpc_state, empty_init, ROT0, "", "Fruit Land", MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/pc/igspc.cpp b/src/mame/pc/igspc.cpp new file mode 100644 index 00000000000..0384a918fa4 --- /dev/null +++ b/src/mame/pc/igspc.cpp @@ -0,0 +1,125 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/* + + IGS PC based hardware + + + Speed Driver + ------------- + +TODO: +can't be emulated without proper mb bios + + 4 boards + 1x NV440 gfx card + 1x sound card + 1x CF2IDE card + 1x proteection card with a IGS027A (ARM7 with internal ROM) + + The CF dump contains no MBR, it is thought that it is stored in either the main bios + or provided by the IGS027A. If you disconnect the protection card the bios will hang + when detecting the HDDs which further backs up the theory that it is provided or + decrypted by the 027A + + EZTouch + -------------- + + Custom board + + AMD Geode Processor (MediaGX derived?) + marked + AGXD533AAXFDCC + 0452EQA + (c)2001 2.1 + TAIWAN + + IGS027 security chip (ARM with internal ROM) (dumped!) + + IGS035? (maybe..) + + CF card + +*/ + + +#include "emu.h" +#include "cpu/i386/i386.h" + +class speeddrv_state : public driver_device +{ +public: + speeddrv_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu") + { } + + void speeddrv(machine_config &config); + + void init_speeddrv(); + +private: + void speeddrv_io(address_map &map); + void speeddrv_map(address_map &map); + + // devices + required_device m_maincpu; +public: +}; + +void speeddrv_state::speeddrv_map(address_map &map) +{ + map(0xfffc0000, 0xffffffff).rom().region("bios", 0); +} + +void speeddrv_state::speeddrv_io(address_map &map) +{ +} + + +static INPUT_PORTS_START( speeddrv ) +INPUT_PORTS_END + + + +void speeddrv_state::speeddrv(machine_config &config) +{ + /* basic machine hardware */ + I486(config, m_maincpu, 40000000); // ?? at least a pentium + m_maincpu->set_addrmap(AS_PROGRAM, &speeddrv_state::speeddrv_map); + m_maincpu->set_addrmap(AS_IO, &speeddrv_state::speeddrv_io); +} + + +ROM_START( speeddrv ) + ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ + ROM_LOAD( "mainbios", 0x0000, 0x040000, NO_DUMP ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "speed_driver_igs027a.bin", 0x000000, 0x04000, NO_DUMP ) + + DISK_REGION( "disks" ) + DISK_IMAGE( "speeddrv", 0, SHA1(88712a37b75d84cf9b5a4bee9386285d1b3760b3) ) +ROM_END + +ROM_START( eztouch ) + ROM_REGION32_LE(0x40000, "bios", 0) /* motherboard bios */ + ROM_LOAD( "szz_bios.rom", 0x0000, 0x040000, CRC(9b09f094) SHA1(a9c533afa29218339bbd4f12075f34f9574e3bf6) ) + + ROM_REGION( 0x4000, "prot", 0 ) /* ARM protection ASIC - internal rom */ + ROM_LOAD( "szz_027a.rom", 0x000000, 0x04000, CRC(f05dae69) SHA1(fa64e73cf045cda64aa0b702de3bd032a44d2c5c) ) + + ROM_REGION( 0x80000, "extarm", 0 ) /* external ROM for ARM? (encrypted) */ + ROM_LOAD( "szz_v116cn.rom", 0x000000, 0x80000, CRC(8c443a89) SHA1(efdbaa832def812e0786cab95ebf60cdc226d3c4)) + + DISK_REGION( "disks" ) + DISK_IMAGE( "szz_cf", 0, SHA1(d02cb1af0f03ce83719870d8a66244dde9795b2e) ) +ROM_END + + +void speeddrv_state::init_speeddrv() +{ +} + +GAME( 2004, speeddrv, 0, speeddrv, speeddrv, speeddrv_state, init_speeddrv, ROT0, "IGS", "Speed Driver", MACHINE_IS_SKELETON ) +GAME( 200?, eztouch, 0, speeddrv, speeddrv, speeddrv_state, init_speeddrv, ROT0, "IGS", "EZ Touch (v116 China)", MACHINE_IS_SKELETON ) diff --git a/src/mame/pc/iskr103x.cpp b/src/mame/pc/iskr103x.cpp new file mode 100644 index 00000000000..694ac815ce2 --- /dev/null +++ b/src/mame/pc/iskr103x.cpp @@ -0,0 +1,139 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + drivers/iskr103x.c + + Driver file for Iskra-1030, 1031 + + TODO + - fix cyrillic chargen upload for CGA and MDA + - replace DIP switch definition + - keyboard test is not passing (code 301) + - hard disk is connected but untested + +***************************************************************************/ + + +#include "emu.h" +#include "machine/genpc.h" + +#include "bus/isa/xsu_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "cpu/i86/i86.h" +#include "machine/pc_lpt.h" +#include "machine/ram.h" + +#include "softlist.h" + + +namespace { + +class iskr103x_state : public driver_device +{ +public: + iskr103x_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + { } + + void iskr1030m(machine_config &config); + void iskr1031(machine_config &config); + +private: + required_device m_maincpu; + void iskr1031_io(address_map &map); + void iskr1031_map(address_map &map); +}; + +void iskr103x_state::iskr1031_map(address_map &map) +{ + map.unmap_value_high(); + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + + +void iskr103x_state::iskr1031_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map)); +} + + +static DEVICE_INPUT_DEFAULTS_START(iskr1030m) + DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) + DEVICE_INPUT_DEFAULTS("DSW0", 0x01, 0x01) +DEVICE_INPUT_DEFAULTS_END + +static DEVICE_INPUT_DEFAULTS_START(iskr1031) + DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) +DEVICE_INPUT_DEFAULTS_END + + +void iskr103x_state::iskr1030m(machine_config &config) +{ + /* basic machine hardware */ + I8086(config, m_maincpu, 4772720); + m_maincpu->set_addrmap(AS_PROGRAM, &iskr103x_state::iskr1031_map); + m_maincpu->set_addrmap(AS_IO, &iskr103x_state::iskr1031_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); + + ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb")); + mb.set_cputag(m_maincpu); + mb.int_callback().set_inputline(m_maincpu, 0); + mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1030m)); + + ISA8_SLOT(config, "isa1", 0, "mb:isa", iskr103x_isa8_cards, "cga_iskr1030m", false); // FIXME: determine IS bus clock + ISA8_SLOT(config, "isa2", 0, "mb:isa", iskr103x_isa8_cards, "fdc_xt", false); + ISA8_SLOT(config, "isa3", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa4", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa5", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); + ISA8_SLOT(config, "isa6", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); + + pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); +// pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030)); + kbd.out_clock_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_clock_w)); + kbd.out_data_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_data_w)); + + RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K"); +} + +void iskr103x_state::iskr1031(machine_config &config) +{ + iskr1030m(config); + subdevice("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1031)); + subdevice("isa1")->set_default_option("cga_iskr1031"); +} + +ROM_START( iskr1030m ) + ROM_REGION16_LE(0x10000,"bios", 0) + ROMX_LOAD( "iskra-1030m_0.rom", 0xc000, 0x2000, CRC(0d698e19) SHA1(2fe117c9f4f8c4b59085d5a41f919d743c425fdd), ROM_SKIP(1)) + ROMX_LOAD( "iskra-1030m_1.rom", 0xc001, 0x2000, CRC(fe808337) SHA1(b0b7ebe14324ada8aa9a6926a82b18e80f78a257), ROM_SKIP(1)) +ROM_END + +ROM_START( iskr1031 ) + ROM_REGION16_LE(0x10000,"bios", 0) + ROM_SYSTEM_BIOS(0, "v1", "v1") + ROMX_LOAD( "150-02.bin", 0xc000, 0x2000, CRC(e33fb974) SHA1(f5f3ece67c025c0033716ff516e1a34fbeb32749), ROM_SKIP(1) | ROM_BIOS(0)) + ROMX_LOAD( "150-03.bin", 0xc001, 0x2000, CRC(8c482258) SHA1(90ef48955e0df556dc06a000a797ef42ccf430c5), ROM_SKIP(1) | ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v2", "v2") + ROMX_LOAD( "150-06.bin", 0xc000, 0x2000, CRC(1adbf969) SHA1(08c0a0fc50a75e6207b1987bae389cca60893eac), ROM_SKIP(1) | ROM_BIOS(1)) + ROMX_LOAD( "150-07.bin", 0xc001, 0x2000, CRC(0dc4b65a) SHA1(c96f066251a7343eac8113ea9dcb2cb12d0334d5), ROM_SKIP(1) | ROM_BIOS(1)) +ROM_END + +} // anonymous namespace + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP ( 1989, iskr1030m, ibm5150, 0, iskr1030m, 0, iskr103x_state, empty_init, "Schetmash", "Iskra 1030M", MACHINE_NOT_WORKING ) +COMP ( 1989, iskr1031, ibm5150, 0, iskr1031, 0, iskr103x_state, empty_init, "", "Iskra 1031", 0 ) diff --git a/src/mame/pc/kb_7007_3.h b/src/mame/pc/kb_7007_3.h new file mode 100644 index 00000000000..28427d4a2f9 --- /dev/null +++ b/src/mame/pc/kb_7007_3.h @@ -0,0 +1,129 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/* + * MC 7007 keyboard, variant 3, used by mc1502. + * + * Rus/Lat key is mapped to RAlt. + */ + +INPUT_PORTS_START( mc7007_3_keyboard ) + PORT_START("Y1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + + PORT_START("Y2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Rus/Lat") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + + PORT_START("Y3") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) + + PORT_START("Y4") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) + + PORT_START("Y5") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + + PORT_START("Y6") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + + PORT_START("Y7") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) + + PORT_START("Y8") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + + PORT_START("Y9") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + + PORT_START("Y10") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + + PORT_START("Y11") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + + PORT_START("Y12") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END diff --git a/src/mame/pc/kb_poisk1.h b/src/mame/pc/kb_poisk1.h new file mode 100644 index 00000000000..21e206059f0 --- /dev/null +++ b/src/mame/pc/kb_poisk1.h @@ -0,0 +1,239 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/* + * Poisk-1 keyboard layouts, two (out of three) revisions + * + * F4 - toggles key click + * RCtrl - toggles Latin/Cyrillic layout + * Keypad / - Pause key + * F11 - XXX + * F12 - XXX + */ + +INPUT_PORTS_START( poisk1_keyboard_v89 ) + PORT_START("Y1") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // scancode 0x55 + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?56?") // 0x56 + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP),UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN),UCHAR_MAMEKEY(2_PAD)) +/*-12*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-12 - ?") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_CHAR('/') */ + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') +/*-11*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-11 - %") /* PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') */ + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) + + PORT_START("Y2") +/*-15*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-15 - !") /* PORT_CODE(KEYCODE_1) PORT_CHAR('!') PORT_CHAR('1') */ + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT),UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) /* ??? */ + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) +/*-13*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-13 - ;") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) +/*-2*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-2 - .") /* PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') */ +/*-3*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-3 - _") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // scancode 0x54 + + PORT_START("Y3") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + + PORT_START("Y4") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) +/*-1*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-1 - *") /* PORT_CODE(KEYCODE_8) PORT_CHAR('*') PORT_CHAR('8') */ + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) /* ??2 */ +/*-9*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-9 - :") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ +/*-10*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-10 - ,") /* PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') */ + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + + PORT_START("Y5") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) +/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) /* ???? */ + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + + PORT_START("Y6") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) +/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Alt") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?dc?") // 0xdc = SHIFT2 + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Rus/Lat") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) // 0xdb + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?59?") // 0x59 + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + + PORT_START("Y7") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . Del") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT),UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?5a?") // 0x5a + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + + PORT_START("Y8") +/*-6*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-6 - -") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') /* ??? */ + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') +/*-7*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-7 - )") /* PORT_CODE(KEYCODE_0) PORT_CHAR(')') PORT_CHAR('0') */ + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Scroll Lock") +/*-4*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-4 - (") /* PORT_CODE(KEYCODE_9) PORT_CHAR('(') PORT_CHAR('9') */ + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') +/*-5*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-5 - \"") /* PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('\'') */ +/*-8*/ PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-8 - /") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') */ +INPUT_PORTS_END + +INPUT_PORTS_START( poisk1_keyboard_v91 ) + PORT_START("Y1") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad + \xd0\x81") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) // Cyrillic Yo + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP),UCHAR_MAMEKEY(8_PAD)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN),UCHAR_MAMEKEY(2_PAD)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') + + PORT_START("Y2") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT),UCHAR_MAMEKEY(4_PAD)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') + + PORT_START("Y3") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') + + PORT_START("Y4") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PAUSE) PORT_CHAR(UCHAR_MAMEKEY(PAUSE)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) + + PORT_START("Y5") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xd0\x87") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) // Cyrillic i with diaeresis + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') + + PORT_START("Y6") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Ctrl/Cyril") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + + PORT_START("Y7") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad - \xd0\x84") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) // Cyrillic Ukrainian Ie + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT),UCHAR_MAMEKEY(6_PAD)) + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) + + PORT_START("Y8") + PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) + PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') + PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') + PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') + PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) + PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xd0\x86") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) // Cyrillic Byelorussian-Ukrainian i + PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') + PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') +INPUT_PORTS_END diff --git a/src/mame/pc/mc1502.cpp b/src/mame/pc/mc1502.cpp new file mode 100644 index 00000000000..bc55bc7d8a9 --- /dev/null +++ b/src/mame/pc/mc1502.cpp @@ -0,0 +1,486 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + drivers/mc1502.cpp + + Driver file for Elektronika MS 1502 + + To do: + - fix video errors caused by 465caf8038a120b4c1ffad9df67a1dc7474e5bb1 + "cga: treat as fixed sync monitor (nw)" + - debug video init in BIOS 7.2 + - pk88 (video, keyboard, etc.) + +***************************************************************************/ + +#include "emu.h" +#include "kb_7007_3.h" + +#include "bus/centronics/ctronics.h" +#include "bus/isa/isa.h" +#include "bus/isa/mc1502_fdc.h" +#include "bus/isa/xsu_cards.h" +#include "bus/rs232/rs232.h" +#include "cpu/i86/i86.h" +#include "imagedev/cassette.h" +#include "machine/i8251.h" +#include "machine/i8255.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/ram.h" +#include "sound/spkrdev.h" + +#include "softlist_dev.h" +#include "speaker.h" + + +//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already +#define LOG_KEYBOARD (1U << 1) +#define LOG_PPI (1U << 2) + +//#define VERBOSE (LOG_GENERAL | LOG_VRAM) +//#define LOG_OUTPUT_STREAM std::cout + +#include "logmacro.h" + +#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) +#define LOGPPI(...) LOGMASKED(LOG_PPI, __VA_ARGS__) + + +namespace { + +class mc1502_state : public driver_device +{ +public: + mc1502_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_upd8251(*this, "upd8251") + , m_pic8259(*this, "pic8259") + , m_pit8253(*this, "pit8253") + , m_ppi8255n1(*this, "ppi8255n1") + , m_ppi8255n2(*this, "ppi8255n2") + , m_isabus(*this, "isa") + , m_speaker(*this, "speaker") + , m_cassette(*this, "cassette") + , m_centronics(*this, "centronics") + , m_ram(*this, RAM_TAG) + , m_kbdio(*this, "Y%u", 1) + { } + + void mc1502(machine_config &config); + + void init_mc1502(); + + void fdc_config(device_t *device); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + required_device m_maincpu; + required_device m_upd8251; + required_device m_pic8259; + required_device m_pit8253; + required_device m_ppi8255n1; + required_device m_ppi8255n2; + required_device m_isabus; + required_device m_speaker; + required_device m_cassette; + required_device m_centronics; + required_device m_ram; + required_ioport_array<12> m_kbdio; + + TIMER_CALLBACK_MEMBER(keyb_signal_callback); + + struct { + uint8_t pulsing = 0; + uint16_t mask = 0; /* input lines */ + emu_timer *keyb_signal_timer = nullptr; + } m_kbd; + + uint8_t m_ppi_portb = 0; + uint8_t m_ppi_portc = 0; + uint8_t m_spkrdata = 0; + + DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out1_changed); + DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out2_changed); + DECLARE_WRITE_LINE_MEMBER(mc1502_speaker_set_spkrdata); + DECLARE_WRITE_LINE_MEMBER(mc1502_i8251_syndet); + + void mc1502_ppi_portb_w(uint8_t data); + void mc1502_ppi_portc_w(uint8_t data); + uint8_t mc1502_ppi_portc_r(); + uint8_t mc1502_kppi_porta_r(); + void mc1502_kppi_portb_w(uint8_t data); + void mc1502_kppi_portc_w(uint8_t data); + + void mc1502_io(address_map &map); + void mc1502_map(address_map &map); + + int m_pit_out2 = 0; +}; + + +/* + * onboard devices: + */ + +// Timer + +/* check if any keys are pressed, raise IRQ1 if so */ + +TIMER_CALLBACK_MEMBER(mc1502_state::keyb_signal_callback) +{ + uint8_t key = 0; + + for (int i = 0; i < 12; i++) + { + key |= m_kbdio[i]->read(); + } + + LOGKBD("k_s_c = %02X (%d) %s\n", key, m_kbd.pulsing, (key || m_kbd.pulsing) ? " will IRQ" : ""); + + /* + If a key is pressed and we're not pulsing yet, start pulsing the IRQ1; + keep pulsing while any key is pressed, and pulse one time after all keys + are released. + */ + if (key) + { + if (m_kbd.pulsing < 2) + { + m_kbd.pulsing += 2; + } + } + + if (m_kbd.pulsing) + { + m_pic8259->ir1_w(m_kbd.pulsing & 1); + m_kbd.pulsing--; + } +} + +void mc1502_state::mc1502_ppi_portb_w(uint8_t data) +{ + m_ppi_portb = data; + m_pit8253->write_gate2(BIT(data, 0)); + mc1502_speaker_set_spkrdata(BIT(data, 1)); + m_centronics->write_strobe(BIT(data, 2)); + m_centronics->write_autofd(BIT(data, 3)); + m_centronics->write_init(BIT(data, 4)); +} + +// bit 0: parallel port data transfer direction (default = 0 = out) +// bits 1-2: CGA_FONT (default = 01) +// bit 3: i8251 SYNDET pin triggers NMI (default = 1 = no) +void mc1502_state::mc1502_ppi_portc_w(uint8_t data) +{ + m_ppi_portc = data & 15; +} + +// 0x80 -- serial RxD (not emulated) +// 0x40 -- CASS IN, also loops back T2OUT (gated by CASWR) +// 0x20 -- T2OUT +// 0x10 -- SNDOUT +uint8_t mc1502_state::mc1502_ppi_portc_r() +{ + int data = 0xff; + double tap_val = m_cassette->input(); + + data = (data & ~0x40) | (tap_val < 0 ? 0x40 : 0x00) | ((BIT(m_ppi_portb, 7) && m_pit_out2) ? 0x40 : 0x00); + data = (data & ~0x20) | (m_pit_out2 ? 0x20 : 0x00); + data = (data & ~0x10) | ((BIT(m_ppi_portb, 1) && m_pit_out2) ? 0x10 : 0x00); + + LOGPPI("mc1502_ppi_portc_r = %02X (tap_val %f t2out %d) at %s\n", + data, tap_val, m_pit_out2, machine().describe_context()); + return data; +} + +uint8_t mc1502_state::mc1502_kppi_porta_r() +{ + uint8_t key = 0; + + for (int i = 0; i < 12; i++) + { + if (BIT(m_kbd.mask, i)) + { + key |= m_kbdio[i]->read(); + } + } + + key ^= 0xff; + LOGPPI("mc1502_kppi_porta_r = %02X\n", key); + return key; +} + +void mc1502_state::mc1502_kppi_portb_w(uint8_t data) +{ + m_kbd.mask &= ~255; + m_kbd.mask |= data ^ 255; + if (!BIT(data, 0)) + m_kbd.mask |= 1 << 11; + else + m_kbd.mask &= ~(1 << 11); + LOGPPI("mc1502_kppi_portb_w ( %02X -> %04X )\n", data, m_kbd.mask); +} + +void mc1502_state::mc1502_kppi_portc_w(uint8_t data) +{ + m_kbd.mask &= ~(7 << 8); + m_kbd.mask |= ((data ^ 7) & 7) << 8; + LOGPPI("mc1502_kppi_portc_w ( %02X -> %04X )\n", data, m_kbd.mask); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_i8251_syndet) +{ + if (!BIT(m_ppi_portc, 3)) + m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out1_changed) +{ + m_upd8251->write_txc(state); + m_upd8251->write_rxc(state); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out2_changed) +{ + m_pit_out2 = state; + m_speaker->level_w(m_spkrdata & m_pit_out2); + m_cassette->output(state ? 1 : -1); +} + +WRITE_LINE_MEMBER(mc1502_state::mc1502_speaker_set_spkrdata) +{ + m_spkrdata = state ? 1 : 0; + m_speaker->level_w(m_spkrdata & m_pit_out2); +} + +void mc1502_state::init_mc1502() +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); +} + +void mc1502_state::machine_start() +{ + /* + Keyboard polling circuit holds IRQ1 high until a key is + pressed, then it starts a timer that pulses IRQ1 low each + 40ms (check) for 20ms (check) until all keys are released. + Last pulse causes BIOS to write a 'break' scancode into port 60h. + */ + m_pic8259->ir1_w(1); + memset(&m_kbd, 0, sizeof(m_kbd)); + m_kbd.keyb_signal_timer = timer_alloc(FUNC(mc1502_state::keyb_signal_callback), this); + m_kbd.keyb_signal_timer->adjust(attotime::from_msec(20), 0, attotime::from_msec(20)); +} + +void mc1502_state::machine_reset() +{ + m_spkrdata = 0; + m_pit_out2 = 1; + m_ppi_portb = 0; + m_ppi_portc = 0; + m_speaker->level_w(0); +} + +/* + * macros + */ + +void mc1502_state::fdc_config(device_t *device) +{ + mc1502_fdc_device &fdc = *downcast(device); + fdc.set_cpu(m_maincpu); +} + +void mc1502_state::mc1502_map(address_map &map) +{ + map.unmap_value_high(); + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + +void mc1502_state::mc1502_io(address_map &map) +{ + map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x0028, 0x0029).rw(m_upd8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + map(0x0060, 0x0063).rw(m_ppi8255n1, FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0x0068, 0x006B).rw(m_ppi8255n2, FUNC(i8255_device::read), FUNC(i8255_device::write)); // keyboard poll +} + +static INPUT_PORTS_START( mc1502 ) + PORT_INCLUDE( mc7007_3_keyboard ) +INPUT_PORTS_END + +void mc1502_state::mc1502(machine_config &config) +{ + I8088(config, m_maincpu, XTAL(16'000'000) / 3); + m_maincpu->set_addrmap(AS_PROGRAM, &mc1502_state::mc1502_map); + m_maincpu->set_addrmap(AS_IO, &mc1502_state::mc1502_io); + m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); + + PIT8253(config, m_pit8253); + m_pit8253->set_clk<0>(XTAL(16'000'000) / 12); /* heartbeat IRQ */ + m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w)); + m_pit8253->set_clk<1>(XTAL(16'000'000) / 12); /* serial port */ + m_pit8253->out_handler<1>().set(FUNC(mc1502_state::mc1502_pit8253_out1_changed)); + m_pit8253->set_clk<2>(XTAL(16'000'000) / 12); /* pio port c pin 4, and speaker polling enough */ + m_pit8253->out_handler<2>().set(FUNC(mc1502_state::mc1502_pit8253_out2_changed)); + + PIC8259(config, m_pic8259); + m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); + + I8255(config, m_ppi8255n1); + m_ppi8255n1->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::write)); + m_ppi8255n1->out_pb_callback().set(FUNC(mc1502_state::mc1502_ppi_portb_w)); + m_ppi8255n1->in_pc_callback().set(FUNC(mc1502_state::mc1502_ppi_portc_r)); + m_ppi8255n1->out_pc_callback().set(FUNC(mc1502_state::mc1502_ppi_portc_w)); + + I8255(config, m_ppi8255n2); + m_ppi8255n2->in_pa_callback().set(FUNC(mc1502_state::mc1502_kppi_porta_r)); + m_ppi8255n2->out_pb_callback().set(FUNC(mc1502_state::mc1502_kppi_portb_w)); + m_ppi8255n2->in_pc_callback().set("cent_status_in", FUNC(input_buffer_device::read)); + m_ppi8255n2->out_pc_callback().set(FUNC(mc1502_state::mc1502_kppi_portc_w)); + + I8251(config, m_upd8251, 0); + m_upd8251->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_upd8251->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); + m_upd8251->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_upd8251->rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir7_w)); /* default handler does nothing */ + m_upd8251->txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir7_w)); + m_upd8251->syndet_handler().set(FUNC(mc1502_state::mc1502_i8251_syndet)); + + rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); + rs232.rxd_handler().set(m_upd8251, FUNC(i8251_device::write_rxd)); + rs232.dsr_handler().set(m_upd8251, FUNC(i8251_device::write_dsr)); + rs232.cts_handler().set(m_upd8251, FUNC(i8251_device::write_cts)); + + isa8_device &isa(ISA8(config, "isa", 0)); + isa.set_memspace("maincpu", AS_PROGRAM); + isa.set_iospace("maincpu", AS_IO); + isa.irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w)); + isa.irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w)); + isa.irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w)); + isa.irq5_callback().set(m_pic8259, FUNC(pic8259_device::ir5_w)); + isa.irq6_callback().set(m_pic8259, FUNC(pic8259_device::ir6_w)); + isa.irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w)); + isa.iochrdy_callback().set_inputline(m_maincpu, INPUT_LINE_HALT); + + ISA8_SLOT(config, "board0", 0, "isa", mc1502_isa8_cards, "cga_mc1502", true); // FIXME: determine ISA bus clock + ISA8_SLOT(config, "isa1", 0, "isa", mc1502_isa8_cards, "fdc", false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); + ISA8_SLOT(config, "isa2", 0, "isa", mc1502_isa8_cards, "rom", false).set_option_machine_config("fdc", [this](device_t* device) { fdc_config(device); }); + + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.80); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit6)); + m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7)); + m_centronics->fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4)); + m_centronics->perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5)); + + INPUT_BUFFER(config, "cent_status_in"); + + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(cent_data_out); + + CASSETTE(config, m_cassette); + m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); + m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); + + SOFTWARE_LIST(config, "flop_list").set_original("mc1502_flop"); +// SOFTWARE_LIST(config, "cass_list").set_original("mc1502_cass"); + + RAM(config, RAM_TAG).set_default_size("608K").set_extra_options("96K"); /* 96 base + 512 on expansion card */ +} + + +/* + Apparently there was a hardware revision with built-in floppy + controller mapped to alternate set of ports; v531 and v533 + support this revision. v533 is possibly not an original BIOS, it + supports autoboot which none of others do. v521h is a version + with support for 3rd party hard disk controller (not emulated). + v51 is designed for a different keyboard layout (JCUKEN, not + QWERTY). +*/ +ROM_START( mc1502 ) + ROM_REGION(0x10000,"bios", 0) + + ROM_DEFAULT_BIOS("v52") + ROM_SYSTEM_BIOS(0, "v50", "v5.0 10/05/89") + ROMX_LOAD("monitor_5_0.rom", 0xc000, 0x4000, CRC(9e97c6a0) SHA1(16a304e8de69ec4d8b92acda6bf28454c361a24f),ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v52", "v5.2 22/03/91") + ROMX_LOAD("monitor_5_2.rom", 0xc000, 0x4000, CRC(0e65491e) SHA1(8a4d556473b5e0e59b05fab77c79c29f4d562412),ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v521", "v5.21 12/10/92") + ROMX_LOAD("monitor_5_21.rom", 0xc000, 0x4000, CRC(28c8f653) SHA1(04b0b09e0b86d9648a83352cc1590eb8963833e0),ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v531", "v5.31 12/10/92") + ROMX_LOAD("monitor_5_31.rom", 0xc000, 0x4000, CRC(a48295d5) SHA1(6f38977c22f9cc6c2bc6f6e53edc4048ca6b6721),ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "v533", "v5.33 01/08/93") + ROMX_LOAD("0,cbc0.bin", 0xc000, 0x2000, CRC(9a55bc4f) SHA1(81da44eec2e52cf04b1fc7053502270f51270590),ROM_BIOS(4)) + ROMX_LOAD("1,dfe2.bin", 0xe000, 0x2000, CRC(8dec077a) SHA1(d6f6d7cc2183abc77fbd9cd59132de5766f7c458),ROM_BIOS(4)) + + // 5.21 + 3rd party HDC support. fails checksum test so marked BAD_DUMP. + ROM_SYSTEM_BIOS(5, "v521h", "v5.21h 22/09/93") + ROMX_LOAD("mshbios0.pgm", 0xc000, 0x2000, BAD_DUMP CRC(be447261) SHA1(b93c597c17dfa4b678f72c20a3f7119b73e6ba1c),ROM_BIOS(5)) + ROMX_LOAD("mshbios1.pgm", 0xe000, 0x2000, BAD_DUMP CRC(89e2eaf2) SHA1(37d6b225b5e35574fdac81219589407d925225be),ROM_BIOS(5)) + + // 5.3 + ROM_SYSTEM_BIOS(6, "v53", "v5.3 10/11/91") + ROMX_LOAD("1502-3b0.pgm", 0xc000, 0x2000, CRC(dc148763) SHA1(7a5e66438007b2de328ac680614f9c4ff60f6a75),ROM_BIOS(6)) + ROMX_LOAD("1502-3b1.pgm", 0xe000, 0x2000, CRC(17fc2af2) SHA1(a060d7b7302dfa639025f025106b50412cf26953),ROM_BIOS(6)) + // 5.1 -- JCUKEN keyboard + ROM_SYSTEM_BIOS(7, "v51", "v5.1 10/12/90") + ROMX_LOAD("ms1502b0.pgm", 0xc000, 0x2000, CRC(92fcc29a) SHA1(930a4cffcd6ec6110dd9a18bd389b78f0ccb110a),ROM_BIOS(7)) + ROMX_LOAD("ms1502b1.pgm", 0xe000, 0x2000, CRC(fe355a58) SHA1(b4ef7775045c6f2095e2b487fe19824986a4892c),ROM_BIOS(7)) + // 5.31 + ROM_SYSTEM_BIOS(8, "v531_93", "v5.31 21/01/93") + ROMX_LOAD("ms531b0.pgm", 0xc000, 0x2000, CRC(d97157d1) SHA1(cb1a1e0e2d9a0fcc78f9b09bfb4814d408ee4fae),ROM_BIOS(8)) + ROMX_LOAD("ms531b1.pgm", 0xe000, 0x2000, CRC(b1368e1a) SHA1(286496d25dc0ac2d8fe1802caffc6c37b236d105),ROM_BIOS(8)) + // 5.2 + ROM_SYSTEM_BIOS(9, "v52_91", "v5.2 10/11/91") + ROMX_LOAD("msv5-2b0.pgm", 0xc000, 0x2000, CRC(f7f370e9) SHA1(e069a35005581a02856853b57dd511ab8e10054b),ROM_BIOS(9)) + ROMX_LOAD("msv5-2b1.pgm", 0xe000, 0x2000, CRC(d50e1c43) SHA1(22724dec0052ee9e52f44f5914f2f5f3fae14612),ROM_BIOS(9)) + + // 7.2 + ROM_SYSTEM_BIOS(10, "v72", "v7.2 01/21/96") + ROMX_LOAD("7.2_1.bin", 0xe000, 0x2000, CRC(80912ad4) SHA1(cc54b77b2db4cc5d614efafd04367d2f06400fc8),ROM_BIOS(10)) + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + ROM_LOAD("symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) +ROM_END + +/* + Predecessor of MC1502, same keyboard attachment but + different video subsystem (not emulated). +*/ +ROM_START( pk88 ) + ROM_REGION(0x10000, "bios", 0) + + // datecode 07.23.87 + ROM_LOAD( "b0.064", 0x0000, 0x2000, CRC(80d3cf5d) SHA1(64769b7a8b60ffeefa04e4afbec778069a2840c9)) + ROM_LOAD( "b1.064", 0x2000, 0x2000, CRC(673a4acc) SHA1(082ae803994048e225150f771794ca305f73d731)) + ROM_LOAD( "b2.064", 0x4000, 0x2000, CRC(1ee66152) SHA1(7ed8c4c6c582487e802beabeca5b86702e5083e8)) + ROM_LOAD( "b3.064", 0x6000, 0x2000, CRC(3062b3fc) SHA1(5134dd64721cbf093d059ee5d3fd09c7f86604c7)) + ROM_LOAD( "pk88-0.064", 0xc000, 0x2000, CRC(1e4666cf) SHA1(6364c5241f2792909ff318194161eb2c29737546)) + ROM_LOAD( "pk88-1.064", 0xe000, 0x2000, CRC(6fa7e7ef) SHA1(d68bc273baa46ba733ac6ad4df7569dd70cf60dd)) +ROM_END + +} // anonymous namespace + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP ( 1989, mc1502, 0, 0, mc1502, mc1502, mc1502_state, init_mc1502, "NPO Microprocessor", "Elektronika MS 1502", MACHINE_IMPERFECT_GRAPHICS ) +COMP ( 1988, pk88, 0, 0, mc1502, mc1502, mc1502_state, init_mc1502, "NPO Microprocessor", "Elektronika PK-88", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/pc/pangofun.cpp b/src/mame/pc/pangofun.cpp new file mode 100644 index 00000000000..3dfaf4e9843 --- /dev/null +++ b/src/mame/pc/pangofun.cpp @@ -0,0 +1,212 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood +/************************************************************************************************** + + It's a standard 486 PC motherboard, gfx card etc. with expansion ROM board + + probably impossible to emulate right now due to the bad / missing (blank when read) rom + although it would be a good idea if somebody checked for sure + +TODO: +- Doesn't detect proper CPU type; +- "Memory test fail" at POST, needs um8498f "memory controller" emulation + (non-PCI with shadow RAM?), also cfr. correlated at.cpp romsets; +- Sometimes POST will trip an invalid groupFF_16 modrm FF at 000F00B2, causing an hang; +- bp 932d1, ROM banking that reads at 0xffffe? Is um8498f ROM boot capable? + +=================================================================================================== +readme by f205v + +Game: Pango Fun +Anno: 1995 +Produttore: InfoCube (Pisa-Italy) +N.revisione: rl00rv00 + +CPUs:----------- + +Main PCB (it's a standard 486 motherboard): + +1x 80486 +1x oscillator 14.31818 MHz + +Video PCB (it's a standard VGA ISA board): + +1x CIRRUS CLGD5401-42QC-B-31063-198AC + +Sound PCB (missing, it's a standard ISA 16bit sound card): +? + +ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connetcor on the other side): +1x NE555P + + +ROMs:----------- + +Main PCB (it's a standard 486 motherboard): +1x 27C512 (bios) + +Video PCB (it's a standard VGA ISA board): +1x maskrom (28pin) (VGAbios)(not dumped) + +Sound PCB (missing, it's a standard ISA 16bit sound card): + +ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connector on the other side): +5x AM27C040 (u11,u12,u31,u32,u33) +1x TMS27C040 (u13)(probably corrupted) +1x INTEL27C010A (u39) +4x PALCE16V8H (u5,u25,u26,u28)(not dumped yet) +1x PALCE20V8H (u42) +1x PALCE20V8H (u44)(not dumped yet) +2x PALCE22V10H (u45,u49)(not dumped yet) + + +Notes:---------- + +Main PCB (it's a standard 486 motherboard): +1x Keyboard DIN connector (not used) + +Video PCB (it's a standard VGA ISA board): +1x VGA connetctor (to ROMs PCB) +1x red/black cable (to ROMs PCB) + +Sound PCB (missing, it's a standard ISA 16bit sound card): +1x stereo audio out (to ROMs PCB) + +ROMs PCB (it's a custom PCB, with ISA connector to motherboard on one side and JAMMA connetcor on the other side): +1x ISA connector (into motherboard) +1x JAMMA edge connector +1x VGA in connector (from Video PCB) +1x stereo audio jack (from sound card) +1x 13x2 legs connector(only 2 legs used for red/black cable from Video PCB) +1x trimmer (volume) +2x 8 switches dip + +Info:---------- + +------------------------------------------ +I have: +3 Main PCBs (all of them without 80486) +11 Video PCBs +4 ROMs PCBs (only one has EPROMs) +------------------------------------------ + +Game was programmed by Giovanni Tummarello and Roberto Molinelli in 1990 for Amiga; +it was an action/strategy videogame published by Proxxima Software (Rome, Italy) and +later ported to PC machines and published in 1994 by AIM Games software (US) and in +Arcade Version (Coin-Op) by InfoCube (Pisa, Italy) + +**************************************************************************************************/ + +#include "emu.h" + +#include "pcshare.h" + +#include "cpu/i386/i386.h" +#include "video/pc_vga.h" +#include "screen.h" + + +namespace { + +class pangofun_state : public pcat_base_state +{ +public: + pangofun_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) { } + + void pangofun(machine_config &config); + + void init_pangofun(); + +private: + virtual void machine_start() override; + void pcat_io(address_map &map); + void pcat_map(address_map &map); +}; + + +void pangofun_state::pcat_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); + map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); + map(0x000e0000, 0x000effff).rom().region("game_prg", 0); + map(0x000f0000, 0x000fffff).rom().region("bios", 0); + /* TODO: correct RAM mapping/size? */ + map(0x00100000, 0x01ffffff).ram(); + map(0x02000000, 0xfffeffff).noprw(); + map(0xffff0000, 0xffffffff).rom().region("bios", 0); +} + +void pangofun_state::pcat_io(address_map &map) +{ + pcat32_io_common(map); + map(0x00e0, 0x00e3).nopw(); + map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); +} + +static INPUT_PORTS_START( pangofun ) +INPUT_PORTS_END + +void pangofun_state::machine_start() +{ +} + +void pangofun_state::pangofun(machine_config &config) +{ + /* basic machine hardware */ + I486(config, m_maincpu, XTAL(40'000'000)); // um486sxlc-40 + m_maincpu->set_addrmap(AS_PROGRAM, &pangofun_state::pcat_map); + m_maincpu->set_addrmap(AS_IO, &pangofun_state::pcat_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + /* video hardware */ + pcvideo_vga(config); + + pcat_common(config); + + // TODO: um8498f +} + + +ROM_START(pangofun) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("bios.bin", 0x000000, 0x10000, CRC(e70168ff) SHA1(4a0d985c218209b7db2b2d33f606068aae539020) ) + + ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ + ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) + ROM_CONTINUE( 0x00001, 0x04000 ) + + /* this is what was on the rom board, mapping unknown */ + ROM_REGION32_LE(0xa00000, "game_prg", 0) /* rom board */ + ROM_LOAD("bank8.u39", 0x000000, 0x20000, CRC(72422c66) SHA1(40b8cca3f99925cf019053921165f6a4a30d784d) ) + ROM_LOAD16_BYTE("bank0.u11", 0x100001, 0x80000, CRC(6ce951d7) SHA1(1dd09491c651920a8a507bdc6584400367e5a292) ) + ROM_LOAD16_BYTE("bank0.u31", 0x100000, 0x80000, CRC(b6c06baf) SHA1(79074b086d24737d629272d98f17de6e1e650485) ) + /* Following two references to a SB Pro clone sound card. */ + ROM_LOAD16_BYTE("bank1.u12", 0x200001, 0x80000, CRC(5adc1f2e) SHA1(17abde7a2836d042a698661339eefe242dd9af0d) ) + ROM_LOAD16_BYTE("bank1.u32", 0x200000, 0x80000, CRC(5647cbf6) SHA1(2e53a74b5939b297fa1a77441017cadc8a19ddef) ) + ROM_LOAD16_BYTE("bank2.u13", 0x300001, 0x80000, BAD_DUMP CRC(504bf849) SHA1(13a184ec9e176371808938015111f8918cb4df7d) ) // EMPTY! (Definitely Bad, interleaves with the next ROM) + ROM_LOAD16_BYTE("bank2.u33", 0x300000, 0x80000, CRC(272ecfb6) SHA1(6e1b6bdef62d953de102784ba0148fb20182fa87) ) + /*bank3.u14 , NOT POPULATED */ + /*bank3.u34 , NOT POPULATED */ + /*bank4.u15 , NOT POPULATED */ + /*bank4.u35 , NOT POPULATED */ + /*bank5.u16 , NOT POPULATED */ + /*bank5.u36 , NOT POPULATED */ + /*bank6.u17 , NOT POPULATED */ + /*bank6.u37 , NOT POPULATED */ + /*bank7.u18 , NOT POPULATED */ + /*bank7.u37 , NOT POPULATED */ + /*bank8.u19 , NOT POPULATED */ +ROM_END + +void pangofun_state::init_pangofun() +{ +} + +} // anonymous namespace + + +GAME( 1995, pangofun, 0, pangofun, pangofun, pangofun_state, init_pangofun, ROT0, "InfoCube", "Pango Fun (Italy)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/pc/paokaipc.cpp b/src/mame/pc/paokaipc.cpp new file mode 100644 index 00000000000..ca24b71fd75 --- /dev/null +++ b/src/mame/pc/paokaipc.cpp @@ -0,0 +1,130 @@ +// license:BSD-3-Clause +// copyright-holders: +/************************************************************************************************** + + Go Go Strike (c) 2007? Paokai + + Originally in fruitpc.cpp, split because definitely doesn't belong + + Some kind of x86 pc-like hardware, exact CPU type etc. unknown hardware is by Paokai, + motherboard has logos, large chip with logo too, http://www.paokai.com.tw/ + + CF card has a Linux partition, partially bootable with m55hipl driver. + - starts with a "LILO boot", fails with a recoverable "undefined video mode" + (press RETURN or SPACE); + - Shows being a "gcc 3.2.2 (Red Hat Linux 3.2.2-5)" distro. + Notice that latter seems mislabeled, and RedHat is actually version 9 + http://rpm.pbone.net/info_idpl_19558085_distro_redhat9_com_gcc-3.2.2-5.i386.rpm.html + - Has pretty verbose terminal log, checks PnP, USB, Pentium f0 0f bug, + assumes "33 MHz system bus" for IDE PIO mode, returns PIIX only during PCI scan + (that's what m55hipl has as default); + - Eventually hangs at a "Setting the clock:" prompt; + +**************************************************************************************************/ + +#include "emu.h" + +#include "pcshare.h" + +#include "bus/isa/isa.h" +#include "bus/isa/sblaster.h" +#include "cpu/i386/i386.h" +#include "machine/idectrl.h" +#include "machine/pci.h" +#include "machine/pckeybrd.h" +#include "video/pc_vga.h" + +namespace { + +class paokaipc_state : public pcat_base_state +{ +public: + paokaipc_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + , m_pciroot(*this, "pci") + , m_isabus(*this, "isa") + { } + + void paokaipc(machine_config &config); + +private: + required_device m_pciroot; + required_device m_isabus; + + void main_io(address_map &map); + void main_map(address_map &map); +}; + +void paokaipc_state::main_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); // VGA VRAM + map(0x000e0000, 0x000fffff).rom().region("bios", 0x20000); + map(0x00100000, 0x008fffff).ram(); + map(0x02000000, 0x28ffffff).noprw(); + map(0xfffc0000, 0xffffffff).rom().region("bios", 0x00000); /* System BIOS */ +} + +void paokaipc_state::main_io(address_map &map) +{ + pcat32_io_common(map); + map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); + map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); + map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); +// map(0x0880, 0x0880) extensively accessed at POST, hangs if returns wrong values +// map(0x0cf8, 0x0cff).rw(m_pcibus, FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); +} + +static INPUT_PORTS_START( gogostrk ) +INPUT_PORTS_END + +void paokaipc_state::paokaipc(machine_config &config) +{ + // TODO: everything inherited from fruitpc.cpp, needs proper identification of motherboard. + PENTIUM(config, m_maincpu, 66000000); // unknown CPU, at least Pentium according to logs + m_maincpu->set_addrmap(AS_PROGRAM, &paokaipc_state::main_map); + m_maincpu->set_addrmap(AS_IO, &paokaipc_state::main_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); + ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); + + pcvideo_vga(config); + + PCI_ROOT(config, m_pciroot, 0); + // ... + + ISA8(config, m_isabus, 0); + m_isabus->set_memspace("maincpu", AS_PROGRAM); + m_isabus->set_iospace("maincpu", AS_IO); + m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir2_w)); + m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); + m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); + m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); + m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); + m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); + m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); + m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); + + // FIXME: determine ISA bus clock +// isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", fruitpc_isa8_cards, "sb15", true)); +// isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(fruitpc_sb_def)); +// isa1.set_option_machine_config("sb15", fruitpc_sb_conf); +} + +ROM_START( gogostrk ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "39sf020a.rom1", 0x000000, 0x040000, CRC(236d4d95) SHA1(50579acddc93c05d5f8e17ad3669a29d2dc49965) ) + + DISK_REGION( "ide:0:hdd:image" ) // 128 MB CF Card + DISK_IMAGE( "ggs-5-2-07", 0,SHA1(f214fd39ec8ac02f008823f4b179ea6c6835e1b8) ) +ROM_END + +} // anonymous namespace + +GAME( 2007?, gogostrk, 0, paokaipc, gogostrk, paokaipc_state, empty_init, ROT0, "American Alpha / Paokai", "Go Go Strike", MACHINE_IS_SKELETON ) // motherboard is dated 2006, if the CF card string is a date it's 2007 diff --git a/src/mame/pc/pcat_dyn.cpp b/src/mame/pc/pcat_dyn.cpp new file mode 100644 index 00000000000..f8b9f702a47 --- /dev/null +++ b/src/mame/pc/pcat_dyn.cpp @@ -0,0 +1,286 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/******************************************************************************************************************** + +Tournament Solitaire (c) 1995 Dynamo + +Unmodified 486 PC-AT HW. + +Jet Way Information Co. OP495SLC motherboard + - AMD Am486-DX40 CPU + - Trident TVGA9000i video card + - Breve Technologies audio adapter, WSS+Sound Blaster + - CH Products RollerMouse serial trackball, Mouse Systems compatible + +preliminary driver by Angelo Salese + +Notes: +Data from the 99378275.SN file on the rom filesystem is scrambled and written to DF80:0000-0100 then read back. +If the output isn't satisfactory, it prints "I/O BOARD FAILURE". + +********************************************************************************************************************/ + +#include "emu.h" + +#include "pcshare.h" + +#include "cpu/i386/i386.h" +#include "machine/bankdev.h" +#include "machine/ds128x.h" +#include "machine/ins8250.h" +#include "machine/nvram.h" +#include "sound/ad1848.h" + +#include "bus/isa/isa.h" +#include "bus/isa/sblaster.h" +#include "bus/isa/trident.h" +#include "bus/rs232/hlemouse.h" +#include "bus/rs232/rs232.h" + +#include "screen.h" + +namespace { + +class pcat_dyn_state : public pcat_base_state +{ +public: + pcat_dyn_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + , m_isabus(*this, "isa") + , m_prgbank(*this, "prgbank") + , m_nvram_bank(*this, "nvram_bank") + , m_nvram_mem(0x2000){ } + + void pcat_dyn(machine_config &config); + +private: + required_device m_isabus; + required_memory_bank m_prgbank; + required_memory_bank m_nvram_bank; + std::vector m_nvram_mem; + void bank1_w(uint8_t data); + void bank2_w(uint8_t data); + uint8_t audio_r(offs_t offset); + void dma8237_1_dack_w(uint8_t data); + virtual void machine_start() override; + void nvram_init(nvram_device &nvram, void *base, size_t size); + static void pcat_dyn_sb_conf(device_t *device); + void pcat_io(address_map &map); + void pcat_map(address_map &map); +}; + +void pcat_dyn_state::machine_start() +{ + m_prgbank->configure_entries(0, 256, memregion("game_prg")->base(), 0x1000); + m_nvram_bank->configure_entries(0, 2, &m_nvram_mem[0], 0x1000); + subdevice("nvram")->set_base(&m_nvram_mem[0], 0x2000); +} + +void pcat_dyn_state::nvram_init(nvram_device &nvram, void *base, size_t size) +{ + memcpy(base, memregion("nvram")->base(), size); +} + +uint8_t pcat_dyn_state::audio_r(offs_t offset) +{ + switch(offset) + { + case 3: + return 4; + } + return 0; +} + +void pcat_dyn_state::bank1_w(uint8_t data) +{ + m_prgbank->set_entry(data); +} + +void pcat_dyn_state::bank2_w(uint8_t data) +{ + m_nvram_bank->set_entry(data & 1); +} + +void pcat_dyn_state::pcat_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(trident_vga_device::mem_r), FUNC(trident_vga_device::mem_w)); + map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0); + map(0x000d0000, 0x000d0fff).rom().region("game_prg", 0x0000).w(FUNC(pcat_dyn_state::bank1_w)); + map(0x000d1000, 0x000d1fff).rom().region("game_prg", 0x1000).w(FUNC(pcat_dyn_state::bank2_w)); + map(0x000d2000, 0x000d2fff).bankr("prgbank"); + map(0x000d3000, 0x000d3fff).bankrw("nvram_bank"); + map(0x000df400, 0x000df8ff).ram(); //I/O board? + map(0x000f0000, 0x000fffff).rom().region("bios", 0); + map(0x00100000, 0x001fffff).ram(); + map(0xffff0000, 0xffffffff).rom().region("bios", 0); +} + +void pcat_dyn_state::pcat_io(address_map &map) +{ + pcat32_io_common(map); + map(0x03b0, 0x03bf).rw("vga", FUNC(trident_vga_device::port_03b0_r), FUNC(trident_vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(trident_vga_device::port_03c0_r), FUNC(trident_vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(trident_vga_device::port_03d0_r), FUNC(trident_vga_device::port_03d0_w)); + map(0x03f8, 0x03ff).rw("ns16550", FUNC(ns16550_device::ins8250_r), FUNC(ns16550_device::ins8250_w)); + map(0x0530, 0x0533).r(FUNC(pcat_dyn_state::audio_r)); + map(0x0534, 0x0537).rw("ad1848", FUNC(ad1848_device::read), FUNC(ad1848_device::write)); +} + +//TODO: use atmb device +void pcat_dyn_state::dma8237_1_dack_w(uint8_t data) { m_isabus->dack_w(1, data); } + +static INPUT_PORTS_START( pcat_dyn ) + // M,N,Numpad 6 -- Hang + // Enter,Numpad 4 -- 5 Credits + PORT_START("pc_keyboard_0") + PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Bookkeeping") + + PORT_START("pc_keyboard_1") + PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_BILL1) + + PORT_START("pc_keyboard_2") + // Don't use IPT_BUTTON1 or the mouse axes are mapped incorrectly + PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Mouse Button") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_COIN1) +INPUT_PORTS_END + +static void pcat_dyn_com(device_slot_interface &device) +{ + device.option_add("msmouse", MSYSTEMS_HLE_SERIAL_MOUSE); +} + +static void pcat_dyn_isa8_cards(device_slot_interface &device) +{ + device.option_add("sb15", ISA8_SOUND_BLASTER_1_5); +} + +static DEVICE_INPUT_DEFAULTS_START( pcat_dyn_sb_def ) + DEVICE_INPUT_DEFAULTS("CONFIG", 0x03, 0x01) +DEVICE_INPUT_DEFAULTS_END + +void pcat_dyn_state::pcat_dyn_sb_conf(device_t *device) +{ + device->subdevice("pc_joy")->set_default_option(nullptr); // remove joystick +} + +void pcat_dyn_state::pcat_dyn(machine_config &config) +{ + /* basic machine hardware */ + I486(config, m_maincpu, 40000000); /* Am486 DX-40 */ + m_maincpu->set_addrmap(AS_PROGRAM, &pcat_dyn_state::pcat_map); + m_maincpu->set_addrmap(AS_IO, &pcat_dyn_state::pcat_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + /* video hardware */ + pcvideo_trident_vga(config); + subdevice("screen")->set_refresh_hz(60); + tvga9000_device &vga(TVGA9000_VGA(config.replace(), "vga", 0)); + vga.set_screen("screen"); + vga.set_vram_size(0x200000); + + pcat_common(config); + + DS12885(config.replace(), m_mc146818); + m_mc146818->irq().set("pic8259_2", FUNC(pic8259_device::ir0_w)); + m_mc146818->set_century_index(0x32); + + ad1848_device &ad1848(AD1848(config, "ad1848", 0)); + ad1848.irq().set("pic8259_1", FUNC(pic8259_device::ir5_w)); + ad1848.drq().set("dma8237_1", FUNC(am9517a_device::dreq0_w)); + + m_dma8237_1->out_iow_callback<0>().set("ad1848", FUNC(ad1848_device::dack_w)); + m_dma8237_1->out_iow_callback<1>().set(FUNC(pcat_dyn_state::dma8237_1_dack_w)); + + NVRAM(config, "nvram").set_custom_handler(FUNC(pcat_dyn_state::nvram_init)); + + ns16550_device &uart(NS16550(config, "ns16550", XTAL(1'843'200))); + uart.out_tx_callback().set("serport", FUNC(rs232_port_device::write_txd)); + uart.out_dtr_callback().set("serport", FUNC(rs232_port_device::write_dtr)); + uart.out_rts_callback().set("serport", FUNC(rs232_port_device::write_rts)); + uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + + rs232_port_device &serport(RS232_PORT(config, "serport", pcat_dyn_com, "msmouse")); + serport.set_fixed(true); + serport.rxd_handler().set("ns16550", FUNC(ins8250_uart_device::rx_w)); + serport.dcd_handler().set("ns16550", FUNC(ins8250_uart_device::dcd_w)); + serport.dsr_handler().set("ns16550", FUNC(ins8250_uart_device::dsr_w)); + serport.ri_handler().set("ns16550", FUNC(ins8250_uart_device::ri_w)); + serport.cts_handler().set("ns16550", FUNC(ins8250_uart_device::cts_w)); + + ISA8(config, m_isabus, 0); + m_isabus->set_memspace("maincpu", AS_PROGRAM); + m_isabus->set_iospace("maincpu", AS_IO); + m_isabus->irq2_callback().set("pic8259_2", FUNC(pic8259_device::ir1_w)); + m_isabus->irq3_callback().set("pic8259_1", FUNC(pic8259_device::ir3_w)); + //m_isabus->irq4_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + //m_isabus->irq5_callback().set("pic8259_1", FUNC(pic8259_device::ir5_w)); + m_isabus->irq6_callback().set("pic8259_1", FUNC(pic8259_device::ir6_w)); + m_isabus->irq7_callback().set("pic8259_1", FUNC(pic8259_device::ir7_w)); + m_isabus->drq1_callback().set("dma8237_1", FUNC(am9517a_device::dreq1_w)); + m_isabus->drq2_callback().set("dma8237_1", FUNC(am9517a_device::dreq2_w)); + m_isabus->drq3_callback().set("dma8237_1", FUNC(am9517a_device::dreq3_w)); + + // FIXME: determine ISA bus clock + isa8_slot_device &isa1(ISA8_SLOT(config, "isa1", 0, "isa", pcat_dyn_isa8_cards, "sb15", true)); + isa1.set_option_device_input_defaults("sb15", DEVICE_INPUT_DEFAULTS_NAME(pcat_dyn_sb_def)); + isa1.set_option_machine_config("sb15", pcat_dyn_sb_conf); +} + +/*************************************** +* +* ROM definitions +* +***************************************/ + +ROM_START(toursol) + ROM_REGION32_LE(0x10000, "bios", 0) /* Motherboard BIOS */ + ROM_LOAD("prom.mb", 0x000000, 0x10000, CRC(e44bfd3c) SHA1(c07ec94e11efa30e001f39560010112f73cc0016) ) + + ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ + ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION32_LE(0x100000, "game_prg", 0) /* PromStor 32, mapping unknown */ + ROM_LOAD("sol.u21", 0x00000, 0x40000, CRC(e97724d9) SHA1(995b89d129c371b815c6b498093bd1bbf9fd8755)) + ROM_LOAD("sol.u22", 0x40000, 0x40000, CRC(69d42f50) SHA1(737fe62f3827b00b4f6f3b72ef6c7b6740947e95)) + ROM_LOAD("sol.u23", 0x80000, 0x40000, CRC(d1e39bd4) SHA1(39c7ee43cddb53fba0f7c0572ddc40289c4edd07)) + ROM_LOAD("sol.u24", 0xc0000, 0x40000, CRC(555341e0) SHA1(81fee576728855e234ff7aae06f54ae9705c3ab5)) + ROM_FILL(0x2a3e6, 1, 0xeb) // skip prot(?) check + ROM_FILL(0x51bd2, 2, 0x90) // opl2 probe expects timer expiration too quickly + + ROM_REGION(0x2000, "nvram", 0) + ROM_LOAD("sol.u28", 0, 0x2000, CRC(c9374d50) SHA1(49173bc69f70bb2a7e8af9d03e2538b34aa881d8)) + + ROM_REGION(128, "rtc", 0) + ROM_LOAD("rtc", 0, 128, BAD_DUMP CRC(732f64c8) SHA1(5386eac3afef9b16af8dd7766e577f7ac700d9cc)) +ROM_END + + +ROM_START(toursol1) + ROM_REGION32_LE(0x10000, "bios", 0) /* Motherboard BIOS */ + ROM_LOAD("prom.mb", 0x000000, 0x10000, CRC(e44bfd3c) SHA1(c07ec94e11efa30e001f39560010112f73cc0016) ) + + ROM_REGION32_LE(0x20000, "video_bios", 0) /* Trident TVGA9000 BIOS */ + ROM_LOAD16_BYTE("prom.vid", 0x00000, 0x04000, CRC(ad7eadaf) SHA1(ab379187914a832284944e81e7652046c7d938cc) ) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION32_LE(0x100000, "game_prg", 0) /* PromStor 32, mapping unknown */ + ROM_LOAD("prom.0", 0x00000, 0x40000, CRC(f26ce73f) SHA1(5516c31aa18716a47f46e412fc273ae8784d2061)) + ROM_LOAD("prom.1", 0x40000, 0x40000, CRC(8f96e2a8) SHA1(bc3ce8b99e6ff40e355df2c3f797f1fe88b3b219)) + ROM_LOAD("prom.2", 0x80000, 0x40000, CRC(8b0ac5cf) SHA1(1c2b6a53c9ff4d18a5227d899facbbc719f40205)) + ROM_LOAD("prom.3", 0xc0000, 0x40000, CRC(9352e965) SHA1(2bfb647ec27c60a8c821fdf7483199e1a444cea8)) + ROM_FILL(0x334f6, 1, 0xeb) // skip prot(?) check + + ROM_REGION(0x2000, "nvram", 0) + ROM_LOAD("prom.7", 0, 0x2000, CRC(154c8092) SHA1(4439ee82f36d5d5c334494ba7bb4848e839213a7)) + + ROM_REGION(128, "rtc", 0) + ROM_LOAD("rtc", 0, 128, BAD_DUMP CRC(732f64c8) SHA1(5386eac3afef9b16af8dd7766e577f7ac700d9cc)) +ROM_END + +} // anonymous namespace + + +GAME( 1995, toursol, 0, pcat_dyn, pcat_dyn, pcat_dyn_state, empty_init, ROT0, "Dynamo", "Tournament Solitaire (V1.06, 08/03/95)", MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, toursol1, toursol, pcat_dyn, pcat_dyn, pcat_dyn_state, empty_init, ROT0, "Dynamo", "Tournament Solitaire (V1.04, 06/22/95)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) diff --git a/src/mame/pc/pcat_nit.cpp b/src/mame/pc/pcat_nit.cpp new file mode 100644 index 00000000000..3191f6ced78 --- /dev/null +++ b/src/mame/pc/pcat_nit.cpp @@ -0,0 +1,461 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese, Mariusz Wojcieszek +/******************************************************************************************************************** + +Street Games (c) 1993 New Image Technologies + +A modified 386 PC-AT HW + +Driver by Angelo Salese and Mariusz Wojcieszek + +===================================================================================================================== + +These games were made by New Image Technologies. They are touch screen multi games from around 1993. +Guru dumped one of their games a year ago but the pcb was rusted out and I think the roms might +be bad, not sure. + +nvram is a potential problem. I have them separated into their own folder for now. I'm not really s +ure if they are needed, but I found this inside a Bonanza rom so they may hold a key: + +------------------------------------------- +INVALID KEY +_ +Programming DS1204 +_ +Successfully Programmed DS1204 +_ +Failed Programming DS1204 +_ +Verifying DS1204 +_ +Failed to read secure data +_ +Failed to read ID DS1204 +_ +Verified DS1204 +------------------------------------------- + +I have them (the real chips) for my Bonanza rom boards, but they are missing on my Street Games boards. +However, the back of one of the manuals mentions game swapping on these boards, and it doesn't mention +this chip as needing to be changed. I included the nvram dump from Guru's Street Games II dump, so maybe +that will work on all the Street Games sets? I don't know. My Dallas chip read good as 2764 and verified +ok. The other one (bq4010yma-150) reads the same crc most reads but won't pass the verify function. +It may still be good. Those are for the Bonanza sets as you'll see in the pics. + +I made copies of the manuals for Street Games and Bonanza and included lots of pics. + +From the looks of the boards I got, Street Games II looks like it uses the 3 original Street Games roms +and just builds on them. You'll see what I mean in the pics. + +I don't know if all 3 vga bioses are needed or not, one is soldered and not dumped, I dumped the other two. +I can get the soldered one dumped in the future if it turns out we need it. When these games got upgraded, +they sometimes came with a new video board. Switching from Street Games to Street Games II probably didn't need +it but switching to Bonanza did. The vga bioses I dumped came off of the 2 different video boards for Bonanza. +I dumped them as 27c256. The one on the Street Games video board is the surface mounted one. + +The end numbers on the rom stickers give away the version info. For example, it looks like Guru's old dump +of Street Games II is revision 7C. + +The system bios roms I dumped give an error in romcmp but they seem to verify ok so I think they are good. + +My 2 rom boards for Bonanza were fortunately 2 different revisions. I ended up with 2 sets of Street Games, +1 set of Street Games II, and 2 different sets of Bonanza. A second set of Street Games II might be able to be +"created" if his dump is good because you will notice in the pics, it looks like Street Games II used 3 roms +from Street Games I. That or one of my rom boards came populated incorrectly. + +The ATI keyboard bios is an HT6542. The Jet one I'm not sure. I don't think they can be read. Same for the M5818's. + +My set naming logic... + +bonanza = Bonanza (Rev 3) +bonanza2 = Bonanza (Rev 2) + +streetg = Street Games (Rev 4) +streetg2 = Street Games (Rev 2) + +streetgii = Street Games II (Rev 5) + +Anything else need to be dumped? More pics needed, etc.? Contact me. + + +Smitdogg + +********************************************************************************************************************/ + + +#include "emu.h" + +#include "pcshare.h" + +#include "cpu/i386/i386.h" +#include "machine/ins8250.h" +#include "machine/microtch.h" +#include "machine/nvram.h" +#include "video/clgd542x.h" + +namespace { + +class pcat_nit_state : public pcat_base_state +{ +public: + pcat_nit_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag), + m_uart(*this, "ns16450_0"), + m_microtouch(*this, "microtouch"), + m_bios_region(*this, "bios"), + m_disk_bios_region(*this, "disk_bios"), + m_bios_share(*this, "bios"), + m_disk_bios_share(*this, "disk_bios") + { } + + void bonanza(machine_config &config); + void pcat_nit(machine_config &config); + + void init_pcat_nit(); + +private: + std::unique_ptr m_banked_nvram; + required_device m_uart; + required_device m_microtouch; + required_region_ptr m_bios_region; + required_region_ptr m_disk_bios_region; + required_shared_ptr m_bios_share; + required_shared_ptr m_disk_bios_share; + + void pcat_nit_rombank_w(uint8_t data); + uint8_t pcat_nit_io_r(offs_t offset); + virtual void machine_start() override; + void bonanza_io_map(address_map &map); + void bonanza_map(address_map &map); + void pcat_map(address_map &map); + void pcat_nit_io(address_map &map); +}; + +/************************************* + * + * ROM banking + * + *************************************/ + +void pcat_nit_state::pcat_nit_rombank_w(uint8_t data) +{ + auto &mspace = m_maincpu->space(AS_PROGRAM); + //logerror( "rom bank #%02x at PC=%08X\n", data, m_maincpu->pc() ); + if ( data & 0x40 ) + { + // rom bank + mspace.install_read_bank(0x000d8000, 0x000dffff, membank("rombank") ); + mspace.unmap_write(0x000d8000, 0x000dffff); + + if ( data & 0x80 ) + { + membank("rombank")->set_entry((data & 0x3f) | 0x40 ); + } + else + { + membank("rombank")->set_entry(data & 0x3f ); + } + } + else + { + // nvram bank + mspace.unmap_readwrite(0x000d8000, 0x000dffff); + + mspace.install_ram(0x000d8000, 0x000d9fff, m_banked_nvram.get()); + + } +} + +void pcat_nit_state::pcat_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); + map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0).nopw(); + map(0x000d0000, 0x000d3fff).ram().share("disk_bios"); + map(0x000d7000, 0x000d7000).w(FUNC(pcat_nit_state::pcat_nit_rombank_w)); + map(0x000d8000, 0x000dffff).bankr("rombank"); + map(0x000f0000, 0x000fffff).ram().share("bios"); + map(0xffff0000, 0xffffffff).rom().region("bios", 0); +} + +void pcat_nit_state::bonanza_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(cirrus_gd5428_device::mem_r), FUNC(cirrus_gd5428_device::mem_w)); + map(0x000c0000, 0x000c7fff).rom().region("video_bios", 0).nopw(); + map(0x000d0000, 0x000d3fff).ram().share("disk_bios"); + map(0x000d7000, 0x000d7000).w(FUNC(pcat_nit_state::pcat_nit_rombank_w)); + map(0x000d8000, 0x000dffff).bankr("rombank"); + map(0x000f0000, 0x000fffff).ram().share("bios"); + map(0xffff0000, 0xffffffff).rom().region("bios", 0); +} + +uint8_t pcat_nit_state::pcat_nit_io_r(offs_t offset) +{ + switch(offset) + { + case 0: /* 278 */ + return 0xff; + case 1: /* 279 */ + return ioport("IN0")->read(); + case 7: /* 27f dips */ + return 0xff; + default: + return 0; + } +} + +void pcat_nit_state::pcat_nit_io(address_map &map) +{ + pcat32_io_common(map); + map(0x0278, 0x027f).r(FUNC(pcat_nit_state::pcat_nit_io_r)).nopw(); + map(0x0280, 0x0283).nopr(); + map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); + map(0x03f8, 0x03ff).rw(m_uart, FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w)); +} + +void pcat_nit_state::bonanza_io_map(address_map &map) +{ + pcat32_io_common(map); + map(0x0278, 0x027f).r(FUNC(pcat_nit_state::pcat_nit_io_r)).nopw(); + map(0x0280, 0x0283).nopr(); + map(0x03b0, 0x03bf).rw("vga", FUNC(cirrus_gd5428_device::port_03b0_r), FUNC(cirrus_gd5428_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(cirrus_gd5428_device::port_03c0_r), FUNC(cirrus_gd5428_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(cirrus_gd5428_device::port_03d0_r), FUNC(cirrus_gd5428_device::port_03d0_w)); + map(0x03f8, 0x03ff).rw(m_uart, FUNC(ns16450_device::ins8250_r), FUNC(ns16450_device::ins8250_w)); +} + +static INPUT_PORTS_START( pcat_nit ) + PORT_START("IN0") + PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Clear") PORT_CODE(KEYCODE_C) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_SERVICE) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_COIN1) PORT_IMPULSE(1) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_COIN2) PORT_IMPULSE(1) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_COIN3) PORT_IMPULSE(1) +INPUT_PORTS_END + +void pcat_nit_state::machine_start() +{ + membank("rombank")->configure_entries(0, 0x80, memregion("game_prg")->base(), 0x8000 ); + membank("rombank")->set_entry(0); + + // There's some shadow ram control registers missing somehwere + memcpy(m_bios_share, m_bios_region, 0x10000); + memcpy(m_disk_bios_share, m_disk_bios_region, 0x4000); +} + +void pcat_nit_state::pcat_nit(machine_config &config) +{ + /* basic machine hardware */ + I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */ + m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::pcat_map); + m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::pcat_nit_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + /* video hardware */ + pcvideo_vga(config); + + pcat_common(config); + + ns16450_device &uart(NS16450(config, "ns16450_0", XTAL(1'843'200))); + uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx)); + uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + + MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate? + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); +} + +void pcat_nit_state::bonanza(machine_config &config) +{ + /* basic machine hardware */ + I386(config, m_maincpu, 14318180*2); /* I386 ?? Mhz */ + m_maincpu->set_addrmap(AS_PROGRAM, &pcat_nit_state::bonanza_map); + m_maincpu->set_addrmap(AS_IO, &pcat_nit_state::bonanza_io_map); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + /* video hardware */ + pcvideo_cirrus_gd5428(config); + + pcat_common(config); + ns16450_device &uart(NS16450(config, "ns16450_0", XTAL(1'843'200))); + uart.out_tx_callback().set("microtouch", FUNC(microtouch_device::rx)); + uart.out_int_callback().set("pic8259_1", FUNC(pic8259_device::ir4_w)); + + MICROTOUCH(config, m_microtouch, 9600).stx().set(uart, FUNC(ins8250_uart_device::rx_w)); // rate? + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); +} + +/*************************************** +* +* ROM definitions +* +***************************************/ + +ROM_START(streetg) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("system-bios-10-0004-01.u6", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-0003-04.u11", 0x000000,0x40000, CRC(1471a728) SHA1(5e12a9230f8130282a1be9a10118a3556bafbc37) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0003-04.u12", 0x040000,0x40000, CRC(5a50f519) SHA1(c07a583b4220d4d5506824def91774fede760e65) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0003-04.u13", 0x080000,0x40000, CRC(8a609145) SHA1(18fcb58b461aa9149a163b85dd8267dec90da3cd) ) + ROM_CONTINUE(0x280000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) + + ROM_REGION(0x08000, "nvram_data", 0) + ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) +ROM_END + +ROM_START(streetgr3) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("system-bios-10-0004-01.u6", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-00003-03.u11", 0x000000,0x40000, CRC(2fbcb12b) SHA1(f6413565fc1289ba32b411de877cdf6526f1fa9d) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-00003-03.u12", 0x040000,0x40000, CRC(b37c7dff) SHA1(cf6318bfeca0bd272734f45c7589a0224863b0f1) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-00003-03.u13", 0x080000,0x40000, CRC(6a9d0771) SHA1(6cd9a56a2413416d0928e5cf9340c94bc0c87c46) ) + ROM_CONTINUE(0x280000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) + + ROM_REGION(0x08000, "nvram_data", 0) + ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) +ROM_END + +ROM_START(bonanza) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("system-bios-sx-10-0004-02.u6", 0x00000, 0x10000, CRC(fa545ba8) SHA1(db64548bd87262cd2e82175a1b66f168b5ae072d) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("techyosd-isa-bios-v1.2.u8", 0x00000, 0x04000, CRC(6adf7e71) SHA1(2b07d964cc7c2c0aa560625b7c12f38d4537d652) ) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-0018-03-090894.u11", 0x000000,0x40000, CRC(32b6c8bc) SHA1(7f4097990dca268915842d4253d4257654de2cfc) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0018-03-090894.u12", 0x040000,0x40000, CRC(d7cb191d) SHA1(2047f3668b0e41ad5347107f4e3446c0374c5bb7) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0018-03-090894.u13", 0x080000,0x40000, CRC(1d3ddeaa) SHA1(8e73fe535882f6d634668733e550281e727fbdbc) ) + ROM_CONTINUE(0x280000, 0x40000) + ROM_LOAD("10-0018-03-090894.u15", 0x100000,0x40000, CRC(b9b3f442) SHA1(6ea5ce3eb007b95ad3350fdb634625b151ae7bdb) ) + ROM_CONTINUE(0x300000, 0x40000) + ROM_LOAD("10-0018-03-090894.u16", 0x140000,0x40000, CRC(5b0dd6f5) SHA1(8172118185179ecb7d3f958480186bf9c906785f) ) + ROM_CONTINUE(0x340000, 0x40000) + ROM_LOAD("10-0018-03-090894.u17", 0x180000,0x40000, CRC(b637eb58) SHA1(7c4615f58118d9b82575d816ef916fccbb1be0f9) ) + ROM_CONTINUE(0x380000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) + + ROM_REGION(0x08000, "nvram_data", 0) + ROM_LOAD("bq4010yma-150.u9", 0x00000, 0x02000, CRC(f4ca28ee) SHA1(17b852028568fb814df62f5870b91a8303302b55)) +ROM_END + +ROM_START(bonanzar2) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("system-bios-sx-10-0004-02.u6", 0x00000, 0x10000, CRC(fa545ba8) SHA1(db64548bd87262cd2e82175a1b66f168b5ae072d) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("techyosd-isa-bios-v1.2.u8", 0x00000, 0x04000, CRC(6adf7e71) SHA1(2b07d964cc7c2c0aa560625b7c12f38d4537d652) ) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-0018-02-081794.u11", 0x000000,0x40000, CRC(f87fa935) SHA1(b06144496406231aa63149ae12a048ffab8f77d0) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0018-02-081794.u12", 0x040000,0x40000, CRC(bd892e3e) SHA1(1b9174fe2a6eaa7687b543798099b86b9039c049) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0018-02-081794.u13", 0x080000,0x40000, CRC(626d999e) SHA1(5c27e3b064b0235c0d6e0be8d8f78538a11647a2) ) + ROM_CONTINUE(0x280000, 0x40000) + ROM_LOAD("10-0018-02-081794.u15", 0x100000,0x40000, CRC(3b28f582) SHA1(3da61fbd92e6cc60e00eaa21d8fb04aa78cce663) ) + ROM_CONTINUE(0x300000, 0x40000) + ROM_LOAD("10-0018-02-081794.u16", 0x140000,0x40000, CRC(fe29ad76) SHA1(64aaae639f024c50c09fe920bc92e6d45ced5648) ) + ROM_CONTINUE(0x340000, 0x40000) + ROM_LOAD("10-0018-02-081794.u17", 0x180000,0x40000, CRC(066108fe) SHA1(ef837422a2a81f5ac3375b6ed68f20143ac6caec) ) + ROM_CONTINUE(0x380000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("disk-bios-10-0001-04.u10", 0x00000, 0x08000, CRC(1b4ce068) SHA1(8570b36acf3eb29f1c59e56a4dad6d38c218748f) ) + + ROM_REGION(0x08000, "nvram_data", 0) + ROM_LOAD("bq4010yma-150.u9", 0x00000, 0x02000, CRC(f4ca28ee) SHA1(17b852028568fb814df62f5870b91a8303302b55)) +ROM_END + +ROM_START(streetg2) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("10-0004-01_mb-bios.bin", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-0007-07c_083194_rom4.u11", 0x000000,0x40000, CRC(244c2bfa) SHA1(4f2f0fb6923b4e3f1ab4e607e29a27fb15b39fac) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-0007-07c_083194_rom5.u12", 0x040000,0x40000, CRC(c89d5dca) SHA1(212bcbf7a39243f4524b4a855fbedabd387d17f2) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-0007-07c_083194_rom6.u13", 0x080000,0x40000, CRC(6264f65f) SHA1(919a8e5d9861dc642ac0f0885faed544bbafa321) ) + ROM_CONTINUE(0x280000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) + + ROM_REGION(0x02000, "nvram", 0) + ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) +ROM_END + +ROM_START(streetg2r5) + ROM_REGION32_LE(0x10000, "bios", 0) /* motherboard bios */ + ROM_LOAD("10-0004-01_mb-bios.bin", 0x00000, 0x10000, CRC(e4d6511f) SHA1(d432743f549fa6ecc04bc5bf94999253f86af08c) ) + + ROM_REGION32_LE(0x08000, "video_bios", 0) + ROM_LOAD16_BYTE("vga1-bios-ver-b-1.00-07.u8", 0x00000, 0x04000, CRC(a40551d6) SHA1(db38190f06e4af2c2d59ae310e65883bb16cd3d6)) + ROM_CONTINUE( 0x00001, 0x04000 ) + + ROM_REGION(0x400000, "game_prg", 0) /* proper game */ + ROM_LOAD("10-00007-05-032194.u15", 0x000000,0x40000, CRC(cefa230f) SHA1(91fd30a3def381974fae0edb4d42d452acda19bb) ) + ROM_CONTINUE(0x200000, 0x40000) + ROM_LOAD("10-00007-05-032194.u16", 0x040000,0x40000, CRC(0be5dd19) SHA1(d0474ff5156e1fa8b4edb502c49b7e1a2b3f6169) ) + ROM_CONTINUE(0x240000, 0x40000) + ROM_LOAD("10-00007-05-032194.u17", 0x080000,0x40000, CRC(f6c996b9) SHA1(871a8d093b856511a0e2b03334ef5c66a2482622) ) + ROM_CONTINUE(0x280000, 0x40000) + + ROM_REGION32_LE(0x08000, "disk_bios", 0) + ROM_LOAD("10-0001-03_disk_bios.u10", 0x00000, 0x08000, CRC(d6ba8b37) SHA1(1d1d984bc15fd154fc07dcfa2132bd44636d7bf1)) + + ROM_REGION(0x08000, "nvram_data", 0) + ROM_LOAD("8k_nvram.u9", 0x00000, 0x02000, CRC(44be0b89) SHA1(81666dd369d1d85269833293136d61ffe80e940a)) +ROM_END + +void pcat_nit_state::init_pcat_nit() +{ + m_banked_nvram = std::make_unique(0x2000); + subdevice("nvram")->set_base(m_banked_nvram.get(), 0x2000); +} + +} // anonymous namespace + +GAME( 1993, streetg, 0, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 4)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) +GAME( 1993, streetgr3, streetg, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games (Revision 3)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) +GAME( 1993, streetg2, 0, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 7C)", MACHINE_NO_SOUND ) // Street Games II+, 10-0007-07 083194 +GAME( 1993, streetg2r5, streetg2, pcat_nit, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Street Games II (Revision 5)", MACHINE_NO_SOUND ) +GAME( 1994, bonanza, 0, bonanza, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Touchstar Bonanza (Revision 3)", MACHINE_NO_SOUND ) // Bonanza 10-0018-03 090894 +GAME( 1994, bonanzar2, bonanza, bonanza, pcat_nit, pcat_nit_state, init_pcat_nit, ROT0, "New Image Technologies", "Touchstar Bonanza (Revision 2)", MACHINE_NO_SOUND ) // Bonanza 10-0018-02 081794 diff --git a/src/mame/pc/pcxt.cpp b/src/mame/pc/pcxt.cpp new file mode 100644 index 00000000000..06e288bfb56 --- /dev/null +++ b/src/mame/pc/pcxt.cpp @@ -0,0 +1,618 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese, Chris Hardy, David Haywood, Tomasz Slanina +/****************************************************************************************** + +PC-XT (c) 1987 IBM + +(Actually Arcade games running on more or less modified PC-XT HW) + +driver by Angelo Salese & Chris Hardy +original tetriunk.c by David Haywood & Tomasz Slanina + +Notes: +- The Korean Tetris is a blantant rip-off of the Mirrorsoft/Andromeda Software Tetris PC + version; + +TODO: +- 02851: tetriskr: Corrupt game graphics after some time of gameplay, caused by a wrong + reading of the i/o $3c8 bit 1. (seems fixed?) +- tetriskr can store inputs read during the timer irq. If ds is 0x40 when the irq is taken + it will corrupt the BIOS data area which can lead to corrupt graphics +- Add a proper FDC device. +- buzzer sound has issues in both games + +******************************************************************************************** +Filetto HW notes: +The PCB is a un-modified IBM-PC with a CGA adapter & a prototyping card that controls the +interface between the pc and the Jamma connectors.Additionally there's also a UM5100 sound +chip for the sound. +PCB Part Number: S/N 90289764 NOVARXT +PCB Contents: +1x UMC 8923S-UM5100 voice processor (upper board) +1x MMI PAL16L8ACN-940CRK9 (upper board) +1x AMD AMPAL16R8APC-8804DM (upper board) +1x AMD P8088-1 main processor 8.000MHz (lower board) +1x Proton PT8010AF PLCC 28.636MHz (lower board) +1x UMC 8928LP-UM8272A floppy disk controller (lower board) +1x UMC 8935CS-UM82C11 Printer Adapter Interface (lower board) +1x UMC 8936CS-UM8250B Programmable asynchronous communications element (lower board) +1x UMC 8937NS-UM82C8167 Real Time Clock (lower board) +1x Yamaha V6363 CMDC QFP (lower board) +There isn't any keyboard found connected to the pcb. +******************************************************************************************** +Filetto SW notes: +The software of this game can be extracted with a normal Windows program extractor. +The files names are: +-command.com (1) +-ibmbio.com (1) +-ibmdos.com (1) +-ansi.sys (1) +-config.sys (2) +-autoexec.bat (3) +-x.exe (4) +(1)This is an old Italian version of MS-DOS (v3.30 18th March 1987). +(2)Contains "device=ansi.sys",it's an hook-up for the graphics used by the BIOS. +(3)It has an Echo off (as you can notice from the game itself) and then the loading of the +main program (x.exe). +(4)The main program,done in plain Basic with several Italian comments in it.The date of +the main program is 9th October 1990. + +******************************************************************************************/ + +#include "emu.h" +#include "bus/isa/cga.h" +#include "cpu/i86/i86.h" +#include "sound/hc55516.h" +#include "machine/bankdev.h" +#include "machine/genpc.h" + +class pcxt_state : public driver_device +{ +public: + pcxt_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mb(*this, "mb"), + m_bank(*this, "bank"), + m_cvsd(*this, "voice"), + m_samples(*this, "samples"){ } + + void tetriskr(machine_config &config); + void filetto(machine_config &config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + TIMER_CALLBACK_MEMBER(sample_tick); + +private: + int m_lastvalue; + uint8_t m_disk_data[2]; + uint8_t m_port_b_data; + uint8_t m_status; + uint8_t m_clr_status; + uint8_t m_voice, m_bit; + uint32_t m_vaddr; + emu_timer *m_sample; + + uint8_t disk_iobank_r(offs_t offset); + void disk_iobank_w(offs_t offset, uint8_t data); + uint8_t fdc765_status_r(); + uint8_t fdc765_data_r(); + void fdc765_data_w(uint8_t data); + void fdc_dor_w(uint8_t data); + uint8_t port_a_r(); + uint8_t port_b_r(); + uint8_t port_c_r(); + void port_b_w(uint8_t data); + void voice_start_w(uint8_t data); + + required_device m_maincpu; + required_device m_mb; + optional_device m_bank; + optional_device m_cvsd; + optional_memory_region m_samples; + void bank_map(address_map &map); + void filetto_io(address_map &map); + void filetto_map(address_map &map); + void tetriskr_io(address_map &map); + void tetriskr_map(address_map &map); +}; + + +class isa8_cga_filetto_device : public isa8_cga_device +{ +public: + // construction/destruction + isa8_cga_filetto_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + virtual const tiny_rom_entry *device_rom_region() const override; +}; + +DEFINE_DEVICE_TYPE(ISA8_CGA_FILETTO, isa8_cga_filetto_device, "filetto_cga", "ISA8_CGA_FILETTO") + +//------------------------------------------------- +// isa8_cga_filetto_device - constructor +//------------------------------------------------- + +isa8_cga_filetto_device::isa8_cga_filetto_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + isa8_cga_device(mconfig, ISA8_CGA_FILETTO, tag, owner, clock) +{ +} + +ROM_START( filetto_cga ) + ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_LOAD("u67.bin", 0x0000, 0x2000, CRC(09710122) SHA1(de84bdd9245df287bbd3bb808f0c3531d13a3545) ) +ROM_END + +const tiny_rom_entry *isa8_cga_filetto_device::device_rom_region() const +{ + return ROM_NAME( filetto_cga ); +} + + + +class isa8_cga_tetriskr_device : public isa8_cga_superimpose_device +{ +public: + // construction/destruction + isa8_cga_tetriskr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; + virtual void device_start() override; + virtual const tiny_rom_entry *device_rom_region() const override; + + uint8_t bg_bank_r(); + void bg_bank_w(uint8_t data); +private: + required_region_ptr m_bg; + uint8_t m_bg_bank = 0; +}; + + +/* for superimposing CGA over a different source video (i.e. tetriskr) */ +DEFINE_DEVICE_TYPE(ISA8_CGA_TETRISKR, isa8_cga_tetriskr_device, "tetriskr_cga", "ISA8_CGA_TETRISKR") + +//------------------------------------------------- +// isa8_cga_tetriskr_device - constructor +//------------------------------------------------- + +isa8_cga_tetriskr_device::isa8_cga_tetriskr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + isa8_cga_superimpose_device(mconfig, ISA8_CGA_TETRISKR, tag, owner, clock), + m_bg(*this, "gfx2") +{ +} + + +void isa8_cga_tetriskr_device::device_start() +{ + m_bg_bank = 0; + isa8_cga_superimpose_device::device_start(); + m_isa->install_device(0x3c0, 0x3c0, read8smo_delegate(*this, FUNC(isa8_cga_tetriskr_device::bg_bank_r)), write8smo_delegate(*this, FUNC(isa8_cga_tetriskr_device::bg_bank_w))); +} + +void isa8_cga_tetriskr_device::bg_bank_w(uint8_t data) +{ + m_bg_bank = (data & 0x0f) ^ 8; +} + +uint8_t isa8_cga_tetriskr_device::bg_bank_r() +{ + return 0xff; +} + + +uint32_t isa8_cga_tetriskr_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + //popmessage("%04x",m_start_offs); + + bitmap.fill(rgb_t::black(), cliprect); + + for(int y=cliprect.min_y;y<=cliprect.max_y;y++) + { + int yi = y % 8; + int yj = y / 8; + for(int x=cliprect.min_x;x<=cliprect.max_x;x++) + { + int xi = x % 8; + int xj = x / 8; + uint8_t color = 0; + /* TODO: first byte seems bogus? */ + for(int pen_i = 0;pen_i<4;pen_i++) + color |= ((m_bg[yj*320/8+xj+(pen_i*0x20000)+yi*0x400+m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i; + + bitmap.pix(y, x) = m_palette->pen(color); + } + } + + isa8_cga_device::screen_update(screen, bitmap, cliprect); + return 0; +} + +ROM_START( tetriskr_cga ) + ROM_REGION( 0x2000, "gfx1",ROMREGION_ERASE00 ) /* gfx - 1bpp font*/ + ROM_LOAD( "b-3.u36", 0x1800, 0x0800, CRC(1a636f9a) SHA1(a356cc57914d0c9b9127670b55d1f340e64b1ac9) ) + ROM_IGNORE( 0x1800 ) + + ROM_REGION( 0x80000+1, "gfx2",ROMREGION_INVERT | ROMREGION_ERASEFF ) + ROM_LOAD( "b-1.u59", 0x00000, 0x10000, CRC(4719d986) SHA1(6e0499944b968d96fbbfa3ead6237d69c769d634)) + ROM_LOAD( "b-2.u58", 0x10000, 0x10000, CRC(599e1154) SHA1(14d99f90b4fedeab0ac24ffa9b1fd9ad0f0ba699)) + ROM_LOAD( "b-4.u54", 0x20000, 0x10000, CRC(e112c450) SHA1(dfdecfc6bd617ec520b7563b7caf44b79d498bd3)) + ROM_LOAD( "b-5.u53", 0x30000, 0x10000, CRC(050b7650) SHA1(5981dda4ed43b6e81fbe48bfba90a8775d5ecddf)) + ROM_LOAD( "b-6.u49", 0x40000, 0x10000, CRC(d596ceb0) SHA1(8c82fb638688971ef11159a6b240253e63f0949d)) + ROM_LOAD( "b-7.u48", 0x50000, 0x10000, CRC(79336b6c) SHA1(7a95875f3071bdc3ee25c0e6a5a3c00ef02dc977)) + ROM_LOAD( "b-8.u44", 0x60000, 0x10000, CRC(1f82121a) SHA1(106da0f39f1260d0761217ed0a24c1611bfd7f05)) + ROM_LOAD( "b-9.u43", 0x70000, 0x10000, CRC(4ea22349) SHA1(14dfd3dbd51f8bd6f3290293b8ea1c165e8cf7fd)) +ROM_END + +const tiny_rom_entry *isa8_cga_tetriskr_device::device_rom_region() const +{ + return ROM_NAME( tetriskr_cga ); +} + +uint8_t pcxt_state::disk_iobank_r(offs_t offset) +{ + //printf("Read Prototyping card [%02x] @ PC=%05x\n",offset,m_maincpu->pc()); + //if(offset == 0) return ioport("DSW")->read(); + if(offset == 1) return ioport("IN1")->read(); + + return m_disk_data[offset]; +} + +void pcxt_state::disk_iobank_w(offs_t offset, uint8_t data) +{ +/* + BIOS does a single out $0310,$F0 on reset + + Then does 2 outs to set the bank.. + + X1 X2 + + $F0 $F2 = m0 + $F1 $F2 = m1 + $F0 $F3 = m2 + $F1 $F3 = m3 + + The sequence of + + out $0310,X1 + out $0310,X2 + + sets the selected rom that appears in $C0000-$CFFFF + +*/ + int bank = 0; + +// printf("bank %d set to %02X\n", offset,data); + + if (data == 0xF0) + { + bank = 0; + } + else + { + if((m_lastvalue == 0xF0) && (data == 0xF2)) + bank = 0; + else if ((m_lastvalue == 0xF1) && (data == 0xF2)) + bank = 1; + else if ((m_lastvalue == 0xF0) && (data == 0xF3)) + bank = 2; + else if ((m_lastvalue == 0xF1) && (data == 0xF3)) + bank = 3; + } + + if (!(data & 0xf0)) + { + int bit = (data >> 1) - 2; + m_voice &= ~(1 << bit); + m_voice |= BIT(data, 0) << bit; + } + + m_bank->set_bank(bank); + + m_lastvalue = data; + + m_disk_data[offset] = data; +} + +uint8_t pcxt_state::port_a_r() +{ + return 0xaa;//harmless keyboard error occurs without this +} + +uint8_t pcxt_state::port_b_r() +{ + return m_port_b_data; +} + +uint8_t pcxt_state::port_c_r() +{ + return 0x00;// DIPS? +} + +/*'buzzer' sound routes here*/ +/* Filetto uses this for either beep and um5100 sound routing,probably there's a mux somewhere.*/ +/* The Korean Tetris uses it as a regular buzzer,probably the sound is all in there...*/ +void pcxt_state::port_b_w(uint8_t data) +{ + m_mb->m_pit8253->write_gate2(BIT(data, 0)); + m_mb->pc_speaker_set_spkrdata(BIT(data, 1)); + m_port_b_data = data; +// m_cvsd->digit_w(data); +} + +/*Floppy Disk Controller 765 device*/ +/*Currently we only emulate it at a point that the BIOS will pass the checks*/ + +#define FDC_BUSY 0x10 +#define FDC_WRITE 0x40 +#define FDC_READ 0x00 /*~0x40*/ + +uint8_t pcxt_state::fdc765_status_r() +{ + uint8_t tmp; + tmp = m_status | 0x80; + m_clr_status++; + if(m_clr_status == 0x10) + { + m_status = 0; + m_clr_status = 0; + } + return tmp; +} + +uint8_t pcxt_state::fdc765_data_r() +{ + m_status = (FDC_READ); + m_mb->m_pic8259->ir6_w(0); + return 0xc0; +} + +void pcxt_state::fdc765_data_w(uint8_t data) +{ + m_status = (FDC_WRITE); +} + + +void pcxt_state::fdc_dor_w(uint8_t data) +{ + m_mb->m_pic8259->ir6_w(1); +} + +// TODO: um5100 device; the actual codec may be sightly different +void pcxt_state::voice_start_w(uint8_t data) +{ + m_sample->adjust(attotime::zero, 0, attotime::from_hz(28000)); + m_bit = 7; + m_vaddr = ((m_voice & 0xf / 5) | (BIT(m_voice, 4) << 2)) * 0x8000; + logerror("%x %x\n",m_voice,m_vaddr); +} + +void pcxt_state::filetto_map(address_map &map) +{ + map(0xc0000, 0xcffff).m(m_bank, FUNC(address_map_bank_device::amap8)); + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + +void pcxt_state::filetto_io(address_map &map) +{ + map.global_mask(0x3ff); + map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map)); + map(0x0060, 0x0060).r(FUNC(pcxt_state::port_a_r)); //not a real 8255 + map(0x0061, 0x0061).rw(FUNC(pcxt_state::port_b_r), FUNC(pcxt_state::port_b_w)); + map(0x0062, 0x0062).r(FUNC(pcxt_state::port_c_r)); + map(0x0201, 0x0201).portr("COIN"); //game port + map(0x0310, 0x0311).rw(FUNC(pcxt_state::disk_iobank_r), FUNC(pcxt_state::disk_iobank_w)); //Prototyping card + map(0x0312, 0x0312).portr("IN0"); //Prototyping card,read only + map(0x0313, 0x0313).w(FUNC(pcxt_state::voice_start_w)); + map(0x03f2, 0x03f2).w(FUNC(pcxt_state::fdc_dor_w)); + map(0x03f4, 0x03f4).r(FUNC(pcxt_state::fdc765_status_r)); //765 Floppy Disk Controller (FDC) Status + map(0x03f5, 0x03f5).rw(FUNC(pcxt_state::fdc765_data_r), FUNC(pcxt_state::fdc765_data_w));//FDC Data +} + +void pcxt_state::tetriskr_map(address_map &map) +{ + map(0xf0000, 0xfffff).rom().region("bios", 0); +} + +void pcxt_state::tetriskr_io(address_map &map) +{ + map.global_mask(0x3ff); + map(0x0000, 0x00ff).m(m_mb, FUNC(pc_noppi_mb_device::map)); + map(0x0060, 0x0060).r(FUNC(pcxt_state::port_a_r)); //not a real 8255 + map(0x0061, 0x0061).rw(FUNC(pcxt_state::port_b_r), FUNC(pcxt_state::port_b_w)); + map(0x0062, 0x0062).r(FUNC(pcxt_state::port_c_r)); + map(0x03c8, 0x03c8).portr("IN0"); + map(0x03c9, 0x03c9).portr("IN1"); +// map(0x03ce, 0x03ce).portr("IN1"); //read then discarded? +} + +void pcxt_state::bank_map(address_map &map) +{ + map(0x00000, 0x3ffff).rom().region("game_prg", 0); +} + +static INPUT_PORTS_START( filetto ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + + PORT_START("IN1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "Extra Play" ) + PORT_DIPSETTING( 0x04, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, "Play at 6th match reached" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START("COIN") + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0xe0, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_START( "pcvideo_cga_config" ) + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( tetriskr ) + PORT_START("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) //probably unused + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) + PORT_START("IN1") //dip-switches + PORT_DIPNAME( 0x03, 0x03, "Starting Level" ) + PORT_DIPSETTING( 0x03, "0" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "4" ) + PORT_DIPSETTING( 0x00, "6" ) + PORT_DIPNAME( 0x04, 0x04, "Starting Bomb" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) +// PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) duplicate + PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) + + PORT_START( "pcvideo_cga_config" ) + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + +TIMER_CALLBACK_MEMBER(pcxt_state::sample_tick) +{ + m_cvsd->digit_w(BIT(m_samples->as_u8(m_vaddr), m_bit)); + m_cvsd->clock_w(1); + m_cvsd->clock_w(0); + if (m_bit == 0) + { + m_vaddr++; + m_bit = 8; + if (!(m_vaddr % 0x8000)) + m_sample->adjust(attotime::never); + } + m_bit--; +} + +void pcxt_state::machine_start() +{ + m_sample = timer_alloc(FUNC(pcxt_state::sample_tick), this); + + m_status = 0; + m_clr_status = 0; +} + +void pcxt_state::machine_reset() +{ + m_lastvalue = -1; + m_voice = 0; +} + +static void filetto_isa8_cards(device_slot_interface &device) +{ + device.option_add_internal("filetto", ISA8_CGA_FILETTO); + device.option_add_internal("tetriskr", ISA8_CGA_TETRISKR); +} + + +void pcxt_state::filetto(machine_config &config) +{ + I8088(config, m_maincpu, XTAL(14'318'181)/3); + m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::filetto_map); + m_maincpu->set_addrmap(AS_IO, &pcxt_state::filetto_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); + + PCNOPPI_MOTHERBOARD(config, m_mb, 0).set_cputag(m_maincpu); + m_mb->int_callback().set_inputline(m_maincpu, 0); + m_mb->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + + ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "filetto", true); // FIXME: determine ISA bus clock + + HC55516(config, m_cvsd, 0).add_route(ALL_OUTPUTS, "mb:mono", 0.60); //8923S-UM5100 is a HC55536 with ROM hook-up + + RAM(config, RAM_TAG).set_default_size("640K"); + + ADDRESS_MAP_BANK(config, m_bank).set_map(&pcxt_state::bank_map).set_options(ENDIANNESS_LITTLE, 8, 18, 0x10000); +} + +void pcxt_state::tetriskr(machine_config &config) +{ + I8088(config, m_maincpu, XTAL(14'318'181)/3); + m_maincpu->set_addrmap(AS_PROGRAM, &pcxt_state::tetriskr_map); + m_maincpu->set_addrmap(AS_IO, &pcxt_state::tetriskr_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); + + PCNOPPI_MOTHERBOARD(config, m_mb, 0).set_cputag(m_maincpu); + m_mb->int_callback().set_inputline(m_maincpu, 0); + m_mb->nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); + + ISA8_SLOT(config, "isa1", 0, "mb:isa", filetto_isa8_cards, "tetriskr", true); // FIXME: determine ISA bus clock + + RAM(config, RAM_TAG).set_default_size("64K"); +} + +ROM_START( filetto ) + ROM_REGION( 0x10000, "bios", 0 ) + ROM_LOAD("u49.bin", 0xc000, 0x2000, CRC(1be6948a) SHA1(9c433f63d347c211ee4663f133e8417221bc4bf0)) + ROM_RELOAD( 0x8000, 0x2000 ) + ROM_RELOAD( 0x4000, 0x2000 ) + ROM_RELOAD( 0x0000, 0x2000 ) + ROM_LOAD("u55.bin", 0xe000, 0x2000, CRC(1e455ed7) SHA1(786d18ce0ab1af45fc538a2300853e497488f0d4) ) + ROM_RELOAD( 0xa000, 0x2000 ) + ROM_RELOAD( 0x6000, 0x2000 ) + ROM_RELOAD( 0x2000, 0x2000 ) + + ROM_REGION( 0x40000, "game_prg", 0 ) // program data + ROM_LOAD( "m0.u1", 0x00000, 0x10000, CRC(2408289d) SHA1(eafc144a557a79b58bcb48545cb9c9778e61fcd3) ) + ROM_LOAD( "m1.u2", 0x10000, 0x10000, CRC(5b623114) SHA1(0d9a14e6b7f57ce4fa09762343b610a973910f58) ) + ROM_LOAD( "m2.u3", 0x20000, 0x10000, CRC(abc64869) SHA1(564fc9d90d241a7b7776160b3fd036fb08037355) ) + ROM_LOAD( "m3.u4", 0x30000, 0x10000, CRC(0c1e8a67) SHA1(f1b9280c65fcfcb5ec481cae48eb6f52d6cdbc9d) ) + + ROM_REGION( 0x40000, "samples", 0 ) // UM5100 sample roms? + ROM_LOAD("v1.u15", 0x00000, 0x20000, CRC(613ddd07) SHA1(ebda3d559315879819cb7034b5696f8e7861fe42) ) + ROM_LOAD("v2.u14", 0x20000, 0x20000, CRC(427e012e) SHA1(50514a6307e63078fe7444a96e39d834684db7df) ) +ROM_END + +ROM_START( tetriskr ) + ROM_REGION( 0x10000, "bios", 0 ) /* code */ + ROM_LOAD( "b-10.u10", 0x0000, 0x10000, CRC(efc2a0f6) SHA1(5f0f1e90237bee9b78184035a32055b059a91eb3) ) + ROM_FILL( 0x1bdb, 1, 0xba ) // patch to work around input bug mentioned above + ROM_FILL( 0x1bdc, 1, 0x00 ) + ROM_FILL( 0x1bdd, 1, 0x01 ) + ROM_FILL( 0x1bde, 1, 0x8e ) + ROM_FILL( 0x1bdf, 1, 0xda ) +ROM_END + +GAME( 1990, filetto, 0, filetto, filetto, pcxt_state, empty_init, ROT0, "Novarmatic", "Filetto (v1.05 901009)", MACHINE_IMPERFECT_SOUND ) +GAME( 1988?,tetriskr, 0, tetriskr, tetriskr, pcxt_state, empty_init, ROT0, "bootleg", "Tetris (Korean bootleg of Mirrorsoft PC-XT Tetris)", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/pc/poisk1.cpp b/src/mame/pc/poisk1.cpp new file mode 100644 index 00000000000..cf76b136200 --- /dev/null +++ b/src/mame/pc/poisk1.cpp @@ -0,0 +1,767 @@ +// license:BSD-3-Clause +// copyright-holders:Sergey Svishchev +/*************************************************************************** + + drivers/poisk1.c + + Driver file for Poisk-1 + + to do: + - cassette i/o and softlist + - use palette rom + - monochrome output + - trap: does memory always get written or it's up to NMI ISR to complete writes? + - keyboard layout for earliest revision (v89r0) + + slot devices: + - hard disk controllers + - network cards + - joystick, mouse, serial, parallel ports + - sound card + +***************************************************************************/ + +#include "emu.h" +#include "kb_poisk1.h" + +#include "bus/isa/isa.h" +#include "bus/isa/p1_fdc.h" +#include "bus/isa/xsu_cards.h" +#include "cpu/i86/i86.h" +#include "imagedev/cassette.h" +#include "machine/i8255.h" +#include "machine/pic8259.h" +#include "machine/pit8253.h" +#include "machine/ram.h" +#include "machine/timer.h" +#include "sound/spkrdev.h" +#include "video/cgapal.h" + +#include "emupal.h" +#include "screen.h" +#include "softlist_dev.h" +#include "speaker.h" + + +//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already +#define LOG_KEYBOARD (1U << 1) +#define LOG_DEBUG (1U << 2) + +//#define VERBOSE (LOG_DEBUG) +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) +#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) + + +#define CGA_PALETTE_SETS 83 +/* one for colour, one for mono, 81 for colour composite */ + +#define BG_COLOR(x) (((x)&7) | (((x)&0x10) >> 1)) + +#define POISK1_UPDATE_ROW(name) \ + void name(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *videoram, uint16_t ma, uint8_t ra, uint8_t stride) + + +class p1_state : public driver_device +{ +public: + p1_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_pic8259(*this, "pic8259") + , m_pit8253(*this, "pit8253") + , m_ppi8255n1(*this, "ppi8255n1") + , m_ppi8255n2(*this, "ppi8255n2") + , m_isabus(*this, "isa") + , m_speaker(*this, "speaker") + , m_cassette(*this, "cassette") + , m_ram(*this, RAM_TAG) + , m_screen(*this, "screen") + , m_palette(*this, "palette") + , m_kbdio(*this, "Y%u", 1) + { } + + void poisk1(machine_config &config); + + void init_poisk1(); + + void fdc_config(device_t *device); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + virtual void video_start() override; + + DECLARE_WRITE_LINE_MEMBER(vsync_changed); + TIMER_DEVICE_CALLBACK_MEMBER(hsync_changed); + +private: + required_device m_maincpu; + required_device m_pic8259; + required_device m_pit8253; + required_device m_ppi8255n1; + required_device m_ppi8255n2; + required_device m_isabus; + required_device m_speaker; + required_device m_cassette; + required_device m_ram; + required_device m_screen; + required_device m_palette; + + required_ioport_array<8> m_kbdio; + + uint8_t m_p1_spkrdata = 0; + uint8_t m_p1_input = 0; + + uint8_t m_kbpoll_mask = 0; + uint8_t m_vsync = 0; + uint8_t m_hsync = 0; + + struct + { + uint8_t trap[4]{}; + std::unique_ptr videoram_base; + uint8_t *videoram = nullptr; + uint8_t mode_control_6a = 0; + uint8_t color_select_68 = 0; + uint8_t palette_lut_2bpp[4]{}; + int stride = 0; + void *update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *videoram, uint16_t ma, uint8_t ra, uint8_t stride); + } m_video; + + void p1_palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void set_palette_luts(); + POISK1_UPDATE_ROW(cga_gfx_2bpp_update_row); + POISK1_UPDATE_ROW(cga_gfx_1bpp_update_row); + POISK1_UPDATE_ROW(poisk1_gfx_1bpp_update_row); + + DECLARE_WRITE_LINE_MEMBER(p1_pit8253_out2_changed); + DECLARE_WRITE_LINE_MEMBER(p1_speaker_set_spkrdata); + uint8_t p1_trap_r(offs_t offset); + void p1_trap_w(offs_t offset, uint8_t data); + uint8_t p1_cga_r(offs_t offset); + void p1_cga_w(offs_t offset, uint8_t data); + void p1_vram_w(offs_t offset, uint8_t data); + + uint8_t p1_ppi_r(offs_t offset); + void p1_ppi_w(offs_t offset, uint8_t data); + void p1_ppi_porta_w(uint8_t data); + uint8_t p1_ppi_portb_r(); + uint8_t p1_ppi_portc_r(); + void p1_ppi_portc_w(uint8_t data); + void p1_ppi2_porta_w(uint8_t data); + void p1_ppi2_portb_w(uint8_t data); + uint8_t p1_ppi2_portc_r(); + + void poisk1_io(address_map &map); + void poisk1_map(address_map &map); +}; + +/* + * onboard devices: + */ + +/* + * Poisk-1 doesn't have a mc6845 and always runs in graphics mode. Text mode is emulated by BIOS; + * NMI is triggered on access to video memory and to mc6845 ports. Address and data are latched into: + * + * Port 28H (offset 0) -- lower 8 bits of address + * Port 29H (offset 1) -- high -//- and mode bits + * Port 2AH (offset 2) -- data + */ + +uint8_t p1_state::p1_trap_r(offs_t offset) +{ + uint8_t data = m_video.trap[offset]; + LOG("trap R %.2x $%02x\n", 0x28 + offset, data); + if (offset == 0) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); + return data; +} + +void p1_state::p1_trap_w(offs_t offset, uint8_t data) +{ + LOG("trap W %.2x $%02x\n", 0x28 + offset, data); +} + +uint8_t p1_state::p1_cga_r(offs_t offset) +{ + switch (offset) + { + case 4: case 5: case 8: case 9: + LOG("cga R %.4x\n", offset + 0x3d0); + m_video.trap[2] = 0; + m_video.trap[1] = 0x43; + m_video.trap[0] = offset + 0xd0; + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + break; + + case 10: + return m_ppi8255n2->read(2); + + default: + break; + } + return 0; +} + +void p1_state::p1_cga_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 4: case 5: case 8: case 9: + LOG("cga W %.4x $%02x\n", offset + 0x3d0, data); + m_video.trap[2] = data; + m_video.trap[1] = 0xC3; + m_video.trap[0] = offset + 0xd0; + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); + break; + + default: + break; + } +} + +void p1_state::p1_vram_w(offs_t offset, uint8_t data) +{ + LOGDBG("vram W %.4x $%02x\n", offset, data); + if (m_video.videoram_base) m_video.videoram_base[offset] = data; + m_video.trap[2] = data; + m_video.trap[1] = 0x80 | ((offset >> 8) & 0x3f); + m_video.trap[0] = offset & 255; + m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); +} + +// CGA emulator +/* +068h D42 0..2 R, G, B XXX Foreground/Background color + 3 NMI DISABLE NMI trap 1: Disabled 0: Enabled + 4 PALETTE XXX Colour palette 0: XXX 1: XXX + 5 I (INTENS) XXX Foreground/Background color intensity + 6 DISPLAY BANK XXX Video RAM page + 7 HIRES 1: 640x200 0: 320x200 +*/ + +void p1_state::p1_ppi2_porta_w(uint8_t data) +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + LOG("color_select_68 W $%02x\n", data); + + // NMI DISABLE + if (BIT((data ^ m_video.color_select_68), 3)) + { + if (BIT(data, 3)) + program.install_writeonly(0xb8000, 0xbbfff, m_video.videoram_base.get()); + else + program.install_write_handler(0xb8000, 0xbbfff, write8sm_delegate(*this, FUNC(p1_state::p1_vram_w))); + } + // DISPLAY BANK + if (BIT((data ^ m_video.color_select_68), 6)) + { + + if (BIT(data, 6)) + m_video.videoram = m_video.videoram_base.get() + 0x4000; + else + m_video.videoram = m_video.videoram_base.get(); + } + // HIRES -- XXX + if (BIT((data ^ m_video.color_select_68), 7)) + { + if (BIT(data, 7)) + m_screen->set_visible_area(0, 640 - 1, 0, 200 - 1); + else + m_screen->set_visible_area(0, 320 - 1, 0, 200 - 1); + } + m_video.color_select_68 = data; + set_palette_luts(); +} + +/* +06Ah Dxx 6 Enable/Disable color burst (?) + 7 Enable/Disable D7H/D7L +*/ + +void p1_state::p1_ppi_portc_w(uint8_t data) +{ + LOG("mode_control_6a W $%02x\n", data); + + m_video.mode_control_6a = data; + set_palette_luts(); +} + +void p1_state::set_palette_luts(void) +{ + /* Setup 2bpp palette lookup table */ + // HIRES + if (m_video.color_select_68 & 0x80) + { + m_video.palette_lut_2bpp[0] = 0; + } + else + { + m_video.palette_lut_2bpp[0] = BG_COLOR(m_video.color_select_68); + } + // B&W -- XXX +/* + if ( m_video.mode_control_6a & 0x40 ) + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; + } + else +*/ + { + // PALETTE + if ( m_video.color_select_68 & 0x20 ) + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 5; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; + } + else + { + m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 2; + m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; + m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 6; + } + } +} + +/*************************************************************************** + Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 + cga fetches 2 byte per mc6845 access. +***************************************************************************/ + +POISK1_UPDATE_ROW(p1_state::cga_gfx_2bpp_update_row) +{ + rgb_t const *const palette = m_palette->palette()->entry_list_raw(); + uint32_t *p = &bitmap.pix(ra); + + if (ra == 0) LOGDBG("cga_gfx_2bpp_update_row\n"); + uint16_t odd = (ra & 1) << 13; + uint16_t offset = (ma & 0x1fff) | odd; + for (int i = 0; i < stride; i++) + { + uint8_t data = videoram[ offset++ ]; + + *p = palette[m_video.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; + *p = palette[m_video.palette_lut_2bpp[ data & 0x03 ]]; p++; + } +} + +/*************************************************************************** + Draw graphics mode with 640x200 pixels (default). + The cell size is 1x1 (1 scanline is the real default) + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +***************************************************************************/ + +POISK1_UPDATE_ROW(p1_state::cga_gfx_1bpp_update_row) +{ + rgb_t const *const palette = m_palette->palette()->entry_list_raw(); + uint32_t *p = &bitmap.pix(ra); + uint8_t fg = 15, bg = BG_COLOR(m_video.color_select_68); + + if (ra == 0) LOGDBG("cga_gfx_1bpp_update_row bg %d\n", bg); + uint16_t odd = (ra & 1) << 13; + uint16_t offset = (ma & 0x1fff) | odd; + for (int i = 0; i < stride; i++) + { + uint8_t data = videoram[ offset++ ]; + + *p = palette[( data & 0x80 ) ? fg : bg ]; p++; + *p = palette[( data & 0x40 ) ? fg : bg ]; p++; + *p = palette[( data & 0x20 ) ? fg : bg ]; p++; + *p = palette[( data & 0x10 ) ? fg : bg ]; p++; + *p = palette[( data & 0x08 ) ? fg : bg ]; p++; + *p = palette[( data & 0x04 ) ? fg : bg ]; p++; + *p = palette[( data & 0x02 ) ? fg : bg ]; p++; + *p = palette[( data & 0x01 ) ? fg : bg ]; p++; + } +} + +/*************************************************************************** + Draw graphics mode with 640x200 pixels + extra highlight color for text + mode emulation + Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 +***************************************************************************/ + +POISK1_UPDATE_ROW(p1_state::poisk1_gfx_1bpp_update_row) +{ + rgb_t const *const palette = m_palette->palette()->entry_list_raw(); + uint32_t *p = &bitmap.pix(ra); + uint8_t bg = BG_COLOR(m_video.color_select_68); + + if (ra == 0) LOGDBG("poisk1_gfx_1bpp_update_row bg %d\n", bg); + uint16_t odd = (ra & 1) << 13; + uint16_t offset = (ma & 0x1fff) | odd; + for (int i = 0; i < stride; i++) + { + uint8_t data = videoram[ offset++ ]; + + uint8_t fg = (data & 0x80) ? ( (m_video.color_select_68 & 0x20) ? 10 : 11 ) : 15; // XXX + *p = palette[bg]; p++; + *p = palette[( data & 0x40 ) ? fg : bg ]; p++; + *p = palette[( data & 0x20 ) ? fg : bg ]; p++; + *p = palette[( data & 0x10 ) ? fg : bg ]; p++; + *p = palette[( data & 0x08 ) ? fg : bg ]; p++; + *p = palette[( data & 0x04 ) ? fg : bg ]; p++; + *p = palette[( data & 0x02 ) ? fg : bg ]; p++; + *p = palette[( data & 0x01 ) ? fg : bg ]; p++; + } +} + +// Initialise the cga palette +void p1_state::p1_palette(palette_device &palette) const +{ + for (int i = 0; i < CGA_PALETTE_SETS * 16; i++) + palette.set_pen_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); +} + +void p1_state::video_start() +{ + address_space &space = m_maincpu->space(AS_PROGRAM); + + memset(&m_video, 0, sizeof(m_video)); + m_video.videoram_base = std::make_unique(0x8000); + m_video.videoram = m_video.videoram_base.get(); + m_video.stride = 80; + + space.install_ram(0xb8000, 0xbffff, m_video.videoram); +} + +WRITE_LINE_MEMBER(p1_state::vsync_changed) +{ + m_vsync = state ? 9 : 0; +} + +TIMER_DEVICE_CALLBACK_MEMBER(p1_state::hsync_changed) +{ + m_hsync = param & 1; +} + +uint32_t p1_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + uint16_t ra, ma = 0; + + if (!m_video.stride || !m_video.videoram) return 0; + + // bit 6 of 6Ah disables color burst -- not implemented + for (ra = cliprect.min_y; ra <= cliprect.max_y; ra++) + { + if (BIT(m_video.color_select_68, 7)) + { + if (BIT(m_video.mode_control_6a, 7)) + { + cga_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } + else + { + poisk1_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } + } + else + { + cga_gfx_2bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); + } + if (ra & 1) ma += m_video.stride; + } + + return 0; +} + +// Timer. Poisk-1 uses single XTAL for everything? -- check + +WRITE_LINE_MEMBER(p1_state::p1_speaker_set_spkrdata) +{ + m_p1_spkrdata = state ? 1 : 0; + m_speaker->level_w(m_p1_spkrdata & m_p1_input); +} + +WRITE_LINE_MEMBER(p1_state::p1_pit8253_out2_changed) +{ + m_p1_input = state ? 1 : 0; + m_speaker->level_w(m_p1_spkrdata & m_p1_input); +} + +// Keyboard (via PPI) + +void p1_state::p1_ppi_porta_w(uint8_t data) +{ + m_kbpoll_mask = data; + LOGDBG("p1_ppi_porta_w %02X <- %02X\n", m_kbpoll_mask, data); +} + +uint8_t p1_state::p1_ppi_portb_r() +{ + uint16_t key = 0xffff; + uint8_t ret = 0; + + for (int i = 0; i < 8; i++) + { + if (BIT(m_kbpoll_mask, i)) + { + key &= m_kbdio[i]->read(); + } + } + + ret = key & 0xff; +// LOG("p1_ppi_portb_r = %02X\n", ret); + return ret; +} + +uint8_t p1_state::p1_ppi_portc_r() +{ + uint16_t key = 0xffff; + uint8_t ret = 0; + + for (int i = 0; i < 8; i++) + { + if (BIT(m_kbpoll_mask, i)) + { + key &= m_kbdio[i]->read(); + } + } + + ret = (key >> 8) & 0xff; + LOGDBG("p1_ppi_portc_r = %02X\n", ret); + return ret; +} + +// XXX + +uint8_t p1_state::p1_ppi2_portc_r() +{ + int data = m_vsync | m_hsync | 0xc6; + double tap_val = m_cassette->input(); + + data |= (tap_val < 0 ? 0x10 : 0x00); + data |= (m_p1_input << 5); + + LOGDBG("p1_ppi2_portc_r = %02X (tap_val %f) at %s\n", data, tap_val, machine().describe_context()); + return data; +} + +void p1_state::p1_ppi2_portb_w(uint8_t data) +{ + m_pit8253->write_gate2(BIT(data, 0)); + p1_speaker_set_spkrdata(data & 0x02); +} + +uint8_t p1_state::p1_ppi_r(offs_t offset) +{ + switch (offset) + { + case 0: + return m_ppi8255n1->read(0); + case 9: + case 10: + case 11: + return m_ppi8255n1->read(offset - 8); + case 8: + return m_ppi8255n2->read(0); + case 1: + case 2: + case 3: + return m_ppi8255n2->read(offset); + default: + LOG("p1ppi R %.2x (unimp)\n", 0x60 + offset); + return 0xff; + } +} + +void p1_state::p1_ppi_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0: + return m_ppi8255n1->write(0, data); + case 9: + case 10: + case 11: + return m_ppi8255n1->write(offset - 8, data); + case 8: + return m_ppi8255n2->write(0, data); + case 1: + case 2: + case 3: + return m_ppi8255n2->write(offset, data); + default: + LOG("p1ppi W %.2x $%02x (unimp)\n", 0x60 + offset, data); + return; + } +} + +/********************************************************** + * + * NMI handling + * + **********************************************************/ + +void p1_state::init_poisk1() +{ + address_space &program = m_maincpu->space(AS_PROGRAM); + + program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); +} + +void p1_state::machine_start() +{ +} + +void p1_state::machine_reset() +{ + m_kbpoll_mask = 0; + m_hsync = 0; + m_vsync = 0; +} + +/* + * macros + */ + +void p1_state::fdc_config(device_t *device) +{ + p1_fdc_device &fdc = *downcast(device); + fdc.set_cpu(m_maincpu); +} + +void p1_state::poisk1_map(address_map &map) +{ + map.unmap_value_high(); + map(0xfc000, 0xfffff).rom().region("bios", 0xc000); +} + +// address decoder PROM maps 20-21, 28-2A, 40-43, 60-63, 68-6B, 3D4-3D5, and 3D8-3DA +void p1_state::poisk1_io(address_map &map) +{ + map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); + map(0x0028, 0x002A).rw(FUNC(p1_state::p1_trap_r), FUNC(p1_state::p1_trap_w)); + map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); + // can't use regular rw(), because 1st PPI is mapped to 60, 69-6B and 2nd PPI -- to 68, 61-63 + map(0x0060, 0x006B).rw(FUNC(p1_state::p1_ppi_r), FUNC(p1_state::p1_ppi_w)); + map(0x03D0, 0x03DA).rw(FUNC(p1_state::p1_cga_r), FUNC(p1_state::p1_cga_w)); +} + +static INPUT_PORTS_START( poisk1 ) + PORT_INCLUDE( poisk1_keyboard_v91 ) +INPUT_PORTS_END + +void p1_state::poisk1(machine_config &config) +{ + /* basic machine hardware */ + I8088(config, m_maincpu, 5000000); + m_maincpu->set_addrmap(AS_PROGRAM, &p1_state::poisk1_map); + m_maincpu->set_addrmap(AS_IO, &p1_state::poisk1_io); + m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); + + PIT8253(config, m_pit8253); + m_pit8253->set_clk<0>(XTAL(15'000'000)/12); /* heartbeat IRQ */ + m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w)); + m_pit8253->set_clk<1>(XTAL(15'000'000)/12); /* keyboard poll -- XXX edge or level triggered? */ + m_pit8253->out_handler<1>().set(m_pic8259, FUNC(pic8259_device::ir6_w)); + m_pit8253->set_clk<2>(XTAL(15'000'000)/12); /* pio port c pin 4, and speaker polling enough */ + m_pit8253->out_handler<2>().set(FUNC(p1_state::p1_pit8253_out2_changed)); + + PIC8259(config, m_pic8259); + m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); + + I8255A(config, m_ppi8255n1); + m_ppi8255n1->out_pa_callback().set(FUNC(p1_state::p1_ppi_porta_w)); // 60h + m_ppi8255n1->in_pb_callback().set(FUNC(p1_state::p1_ppi_portb_r)); // 69h + m_ppi8255n1->in_pc_callback().set(FUNC(p1_state::p1_ppi_portc_r)); // 6Ah + m_ppi8255n1->out_pc_callback().set(FUNC(p1_state::p1_ppi_portc_w)); + + I8255A(config, m_ppi8255n2); + m_ppi8255n2->out_pa_callback().set(FUNC(p1_state::p1_ppi2_porta_w)); // 68h + m_ppi8255n2->out_pb_callback().set(FUNC(p1_state::p1_ppi2_portb_w)); // 61h + m_ppi8255n2->in_pc_callback().set(FUNC(p1_state::p1_ppi2_portc_r)); // 62h and 3DAh + + ISA8(config, m_isabus, 0); + m_isabus->set_memspace("maincpu", AS_PROGRAM); + m_isabus->set_iospace("maincpu", AS_IO); + m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w)); + m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w)); + m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w)); + m_isabus->irq5_callback().set(m_pic8259, FUNC(pic8259_device::ir5_w)); + m_isabus->irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w)); + m_isabus->iochrdy_callback().set_inputline(m_maincpu, INPUT_LINE_HALT); + + // FIXME: determine ISA bus clock + ISA8_SLOT(config, "isa1", 0, m_isabus, p1_isa8_cards, "fdc", false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); + ISA8_SLOT(config, "isa2", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); + ISA8_SLOT(config, "isa3", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); + ISA8_SLOT(config, "isa4", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); + + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); + + // fake hsync + TIMER(config, "scantimer").configure_scanline(FUNC(p1_state::hsync_changed), "screen", 0, 1); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_raw(XTAL(15'000'000), 912,0,640, 262,0,200); + m_screen->set_screen_update(FUNC(p1_state::screen_update)); + m_screen->screen_vblank().set(FUNC(p1_state::vsync_changed)); + + /* XXX verify palette */ + PALETTE(config, m_palette, FUNC(p1_state::p1_palette), CGA_PALETTE_SETS * 16); + + CASSETTE(config, m_cassette); + m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); + m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); + + SOFTWARE_LIST(config, "flop_list").set_original("poisk1_flop"); +// SOFTWARE_LIST(config, "cass_list").set_original("poisk1_cass"); + + /* internal ram */ + RAM(config, RAM_TAG).set_default_size("512K"); +} + +ROM_START( poisk1 ) + ROM_REGION(0x10000, "bios", 0) + + ROM_DEFAULT_BIOS("v91") + ROM_SYSTEM_BIOS(0, "v89r0", "1989r0") + ROMX_LOAD("bios.rf6", 0xe000, 0x2000, CRC(c0f333e3) SHA1(a44f355b7deae3693e1462d57543a42944fd0969), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v89", "1989") + ROMX_LOAD("biosp1s.rf4", 0xe000, 0x2000, CRC(1a85f671) SHA1(f0e59b2c4d92164abca55a96a58071ce869ff988), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v91", "1991") + ROMX_LOAD("poisk_1991.bin", 0xe000, 0x2000, CRC(d61c56fd) SHA1(de202e1f7422d585a1385a002a4fcf9d756236e5), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v91r2", "1991r2") + ROMX_LOAD("p_bios_nm.bin", 0xe000, 0x2000, CRC(84430b4f) SHA1(3e477962be3cea09662cb2e3ad9966ad01c7455d), ROM_BIOS(3)) + + ROM_SYSTEM_BIOS(4, "test1", "Test 1") + ROMX_LOAD("test1.rf6", 0x00000, 0x2000, CRC(a5f05dff) SHA1(21dd0cea605bd7be22e94f8355d86b2478d9527e), ROM_BIOS(4)) + ROM_SYSTEM_BIOS(5, "test2", "Test 2") + ROMX_LOAD("test2.rf6", 0x00000, 0x2000, CRC(eff730e4) SHA1(fcbc08de9b8592c974eaea837839f1a9caf36a75), ROM_BIOS(5)) + ROM_SYSTEM_BIOS(6, "test3", "Test 3") + ROMX_LOAD("test3.rf6", 0x00000, 0x2000, CRC(23025dc9) SHA1(dca4cb580162bb28f6e49ff625b677001d40d573), ROM_BIOS(6)) + ROM_SYSTEM_BIOS(7, "test4", "Test 4") + ROMX_LOAD("test4.rf6", 0x00000, 0x2000, CRC(aac8fc5e) SHA1(622abb5ac66d38a474ee54fe016aff0ba0b5794f), ROM_BIOS(7)) + ROM_SYSTEM_BIOS(8, "test5", "Test 5") + ROMX_LOAD("test5.rf6", 0x00000, 0x2000, CRC(f308e679) SHA1(37bd35f62015d338b3347fd4e3ec455eab048b66), ROM_BIOS(8)) + + // 0xc0000, sets 80x25 text and loops asking for 'Boot from hard disk (Y or N)?' + ROM_LOAD("boot_net.rf4", 0x00000, 0x2000, CRC(316c2030) SHA1(d043325596455772252e465b85321f1b5c529d0b)) // NET BIOS + // 0xc0000, accesses ports 0x90..0x97 + ROM_LOAD("pois_net.bin", 0x00000, 0x2000, CRC(cf9dd80a) SHA1(566bcb40c0cb2c8bfd5b485f0db689fdeaca3e86)) // ??? BIOS + + ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) + ROM_LOAD("poisk.cga", 0x0000, 0x0800, CRC(f6eb39f0) SHA1(0b788d8d7a8e92cc612d044abcb2523ad964c200)) +ROM_END + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1989, poisk1, ibm5150, 0, poisk1, poisk1, p1_state, init_poisk1, "Electronmash", "Poisk-1", 0 ) diff --git a/src/mame/pc/ps2.cpp b/src/mame/pc/ps2.cpp new file mode 100644 index 00000000000..fa5696aacb1 --- /dev/null +++ b/src/mame/pc/ps2.cpp @@ -0,0 +1,301 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol, Miodrag Milanovic, Carl + +#include "emu.h" +#include "cpu/i86/i286.h" +#include "cpu/i386/i386.h" +#include "machine/at.h" +#include "machine/ram.h" +#include "bus/isa/isa_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "bus/pc_kbd/pc_kbdc.h" +#include "softlist_dev.h" + +// According to http://nerdlypleasures.blogspot.com/2014/04/the-original-8-bit-ide-interface.html +// the IBM PS/2 Model 25-286 and Model 30-286 use a customised version of the XTA (8-bit IDE) harddisk interface + +class ps2_state : public driver_device +{ +public: + ps2_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mb(*this, "mb"), + m_ram(*this, RAM_TAG) + { } + required_device m_maincpu; + required_device m_mb; + required_device m_ram; + + void ps2m30286(machine_config &config); + void ps2386(machine_config &config); + void ps2386sx(machine_config &config); + void at_softlists(machine_config &config); + void ps2_16_io(address_map &map); + void ps2_16_map(address_map &map); + void ps2_32_io(address_map &map); + void ps2_32_map(address_map &map); +protected: + void machine_start() override; +}; + +void ps2_state::at_softlists(machine_config &config) +{ + /* software lists */ + SOFTWARE_LIST(config, "pc_disk_list").set_original("ibm5150"); + SOFTWARE_LIST(config, "at_disk_list").set_original("ibm5170"); + SOFTWARE_LIST(config, "at_cdrom_list").set_original("ibm5170_cdrom"); + SOFTWARE_LIST(config, "at_hdd_list").set_original("ibm5170_hdd"); + SOFTWARE_LIST(config, "midi_disk_list").set_compatible("midi_flop"); +} + +void ps2_state::ps2_16_map(address_map &map) +{ + map.unmap_value_high(); + map(0x000000, 0x09ffff).bankrw("bank10"); + map(0x0e0000, 0x0fffff).rom().region("bios", 0); + map(0xfe0000, 0xffffff).rom().region("bios", 0); +} + +void ps2_state::ps2_32_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00000000, 0x0009ffff).bankrw("bank10"); + map(0x000e0000, 0x000fffff).rom().region("bios", 0); + map(0xfffe0000, 0xffffffff).rom().region("bios", 0); +} + +void ps2_state::ps2_16_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); +} + +void ps2_state::ps2_32_io(address_map &map) +{ + map.unmap_value_high(); + map(0x0000, 0x00ff).m(m_mb, FUNC(at_mb_device::map)); +} + +void ps2_state::machine_start() +{ + address_space& space = m_maincpu->space(AS_PROGRAM); + + /* managed RAM */ + membank("bank10")->set_base(m_ram->pointer()); + + if (m_ram->size() > 0xa0000) + { + offs_t ram_limit = 0x100000 + m_ram->size() - 0xa0000; + space.install_ram(0x100000, ram_limit - 1, m_ram->pointer() + 0xa0000); + } +} + +void ps2_state::ps2m30286(machine_config &config) +{ + /* basic machine hardware */ + i80286_cpu_device &maincpu(I80286(config, m_maincpu, 10000000)); + maincpu.set_addrmap(AS_PROGRAM, &ps2_state::ps2_16_map); + maincpu.set_addrmap(AS_IO, &ps2_state::ps2_16_io); + maincpu.set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + maincpu.shutdown_callback().set("mb", FUNC(at_mb_device::shutdown)); + + AT_MB(config, m_mb); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + + at_softlists(config); + + // FIXME: determine ISA bus clock + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "vga", true); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, "fdc", false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, "ide", false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, "comat", false); + + pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_IBM_PC_AT_84)); + kbd.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + kbd.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, RAM_TAG).set_default_size("1664K").set_extra_options("2M,4M,8M,15M"); +} + +void ps2_state::ps2386(machine_config &config) +{ + I386(config, m_maincpu, 12000000); + m_maincpu->set_addrmap(AS_PROGRAM, &ps2_state::ps2_32_map); + m_maincpu->set_addrmap(AS_IO, &ps2_state::ps2_32_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); + + AT_MB(config, m_mb); + m_mb->kbd_clk().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); + m_mb->kbd_data().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); + + config.set_maximum_quantum(attotime::from_hz(60)); + at_softlists(config); + + // on board devices + ISA16_SLOT(config, "board1", 0, "mb:isabus", pc_isa16_cards, "fdcsmc", true); // FIXME: determine ISA bus clock + ISA16_SLOT(config, "board2", 0, "mb:isabus", pc_isa16_cards, "comat", true); + ISA16_SLOT(config, "board3", 0, "mb:isabus", pc_isa16_cards, "ide", true); + ISA16_SLOT(config, "board4", 0, "mb:isabus", pc_isa16_cards, "lpt", true); + // ISA cards + ISA16_SLOT(config, "isa1", 0, "mb:isabus", pc_isa16_cards, "svga_et4k", false); + ISA16_SLOT(config, "isa2", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa3", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa4", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + ISA16_SLOT(config, "isa5", 0, "mb:isabus", pc_isa16_cards, nullptr, false); + + pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL)); + kbd.out_clock_cb().set(m_mb, FUNC(at_mb_device::kbd_clk_w)); + kbd.out_data_cb().set(m_mb, FUNC(at_mb_device::kbd_data_w)); + + /* internal ram */ + RAM(config, RAM_TAG).set_default_size("1664K").set_extra_options("2M,4M,8M,15M,16M,32M,64M,128M,256M"); +} + +void ps2_state::ps2386sx(machine_config &config) +{ + ps2386(config); + I386SX(config.replace(), m_maincpu, 12000000); + m_maincpu->set_addrmap(AS_PROGRAM, &ps2_state::ps2_16_map); + m_maincpu->set_addrmap(AS_IO, &ps2_state::ps2_16_io); + m_maincpu->set_irq_acknowledge_callback("mb:pic8259_master", FUNC(pic8259_device::inta_cb)); +} + +ROM_START( i8530286 ) + ROM_REGION16_LE(0x20000, "bios", 0) + // saved from running machine + ROM_LOAD16_BYTE("ps2m30.0", 0x00000, 0x10000, CRC(9965a634) SHA1(c237b1760f8a4561ec47dc70fe2e9df664e56596)) + ROM_LOAD16_BYTE("ps2m30.1", 0x00001, 0x10000, CRC(1448d3cb) SHA1(13fa26d895ce084278cd5ab1208fc16c80115ebe)) +ROM_END + +/* + +8530-H31 (Model 30/286) +====================== + P/N Date +33F5381A EC C01446 1990 + +*/ +ROM_START( i8530h31 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD( "33f5381a.bin", 0x00000, 0x20000, CRC(ff57057d) SHA1(d7f1777077a8df43c3c14d175b9709bd3969c4b1)) +ROM_END + +/* +8535-043 (Model 35SX) +=================== + P/N Checksum Date +04G2021 C26C 1991 ODD +04G2022 9B94 1991 EVEN +*/ +ROM_START( i8535043 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "04g2021.bin", 0x00001, 0x10000, CRC(4069b2eb) SHA1(9855c84c81d1f07e1da66b1ca45c1c10c0717a90)) + ROM_LOAD16_BYTE( "04g2022.bin", 0x00000, 0x10000, CRC(35c1af65) SHA1(7d2445cc463969c808fdd78e0a27a03db5dfc698)) +ROM_END + +/* +8550-021 (Model 50) +=================== + Code Date Internal +90X7420 4/12/87 --> 90X6815 +90X7423 8/12/87 --> 90X6816 +90X7426 8/12/87 --> 90X6817 +90X7429 18/12/87 --> 90X6818 + +Same ROMs used by : (According to http://www.ibmmuseum.com/ohlandl/8565/8560.html) + +IBM Personal System/2 Model 60 (8560-041 and 8560-071) +IBM Personal System/2 Model 65 SX (8565-061 and 8565-121) + +*/ +ROM_START( i8550021 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "90x7423.zm14", 0x00000, 0x8000, CRC(2c1633e0) SHA1(1af7faa526585a7cfb69e71d90a75e1f1c541586)) + ROM_LOAD16_BYTE( "90x7426.zm16", 0x00001, 0x8000, CRC(e7c762ce) SHA1(228f67dc915d84519da7fc1a59b7f9254278f3a0)) + ROM_LOAD16_BYTE( "90x7420.zm13", 0x10000, 0x8000, CRC(19a57cc1) SHA1(5b31ba66cd3690e651a450619a32b7210769945d)) + ROM_LOAD16_BYTE( "90x7429.zm18", 0x10001, 0x8000, CRC(6f0120f6) SHA1(e112c291ac3d9f6507c93ac49ad26f9fd2245fd2)) + + ROM_REGION( 0x800, "keyboard", 0 ) + ROM_LOAD( "72x8455.zm82", 0x000, 0x800, CRC(7da223d3) SHA1(54c52ff6c6a2310f79b2c7e6d1259be9de868f0e) ) +ROM_END + +/* +8550-061 (Model 50Z) +=================== + P/N Date +AMI 8935MKN 15F8365 S63512 1988 +AMI 8948MML 15F8366 S63512 1988 + +http://ps-2.kev009.com:8081/ohlandl/8550/8550z_Planar.html + + +*/ +ROM_START( i8550061 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "15f8365.zm5", 0x00001, 0x10000, CRC(35aa3ecf) SHA1(a122531092a9cb08600b276da9c9c3ce385aab7b)) + ROM_LOAD16_BYTE( "15f8366.zm6", 0x00000, 0x10000, CRC(11bf564d) SHA1(0dda6a7ca9294cfaab5bdf4c05973be13b2766fc)) +ROM_END + +/* +8555-X61 (Model 55SX) +=================== + Code Date Internal +ODD 33F8145 13/03/90 --> 33F8153 +EVEN 33F8146 31/01/90 --> 33F8152 + +8555-081 (Model 55SX) +=================== + Code Date Internal +ODD AMI 9205MEN 92F0627 EC32680 88 --> 33F8153 +EVEN AMI 9203MGS 92F0626 EC32680 88 --> 33F8152 + +*/ +ROM_START( i8555081 ) + ROM_REGION16_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE("33f8145.zm40", 0x00001, 0x10000, CRC(0895894c) SHA1(7cee77828867ad1bdbe0ac223bc25d23c65b28a0)) + ROM_LOAD16_BYTE("33f8146.zm41", 0x00000, 0x10000, CRC(c6020680) SHA1(b25a64e4b2dca07c567648401100e04e89bbcddb)) +ROM_END + +/* +8580-071 (Model 80) +=================== + Code Date Internal +AMI 8924MBW 90X8548 1987 --> 72X7551 +AMI 8924MBL 90X8549 1987 --> 72X7554 +AMI 8924MBG 90X8550 1987 --> 72X7557 +AMI 8921MBK 90X8551 1987 --> 72X7560 +*/ +ROM_START( i8580071 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD32_BYTE( "90x8548.bin", 0x00000, 0x8000, CRC(1f13eea5) SHA1(0bf53ad86f47db3825a713ea2e4ef23715cc4f79)) + ROM_LOAD32_BYTE( "90x8549.bin", 0x00001, 0x8000, CRC(9e0f4a99) SHA1(b8600f04159ed281a57416274390ba9302be541b)) + ROM_LOAD32_BYTE( "90x8550.bin", 0x00002, 0x8000, CRC(cb21df96) SHA1(0c2765f6becfa3f9171c4f13f7b74d19c4c9acc2)) + ROM_LOAD32_BYTE( "90x8551.bin", 0x00003, 0x8000, CRC(3d7e9868) SHA1(2928fe0e48a573cc2c0c41bd7f7188a54a908229)) +ROM_END + +/* +8580-111 (Model 80) +=================== + Code Date Internal +AMI 8934MDL 15F6637 1987 --> 15F6597 +AMI 8944MDI 15F6639 1987 --> 15F6600 +*/ +ROM_START( i8580111 ) + ROM_REGION32_LE(0x20000, "bios", 0) + ROM_LOAD16_BYTE( "15f6637.bin", 0x00000, 0x10000, CRC(76c36d1a) SHA1(c68d52a2e5fbd303225ebb006f91869b29ef700a)) + ROM_LOAD16_BYTE( "15f6639.bin", 0x00001, 0x10000, CRC(82cf0f7d) SHA1(13bb39225757b89749af70e881af0228673dbe0c)) +ROM_END + +COMP( 1990, i8530h31, 0, ibm5170, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8530-H31 (Model 30/286)", MACHINE_NOT_WORKING ) +COMP( 1988, i8530286, i8530h31, 0, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 Model 30-286", MACHINE_NOT_WORKING ) +COMP( 198?, i8535043, 0, ibm5170, ps2386sx, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8535-043 (Model 35SX)", MACHINE_NOT_WORKING ) +COMP( 198?, i8550021, i8550061, 0, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8550-021 (Model 50)", MACHINE_NOT_WORKING ) +COMP( 198?, i8550061, 0, ibm5170, ps2m30286, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8550-061 (Model 50Z)", MACHINE_NOT_WORKING ) +COMP( 1989, i8555081, 0, ibm5170, ps2386sx, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8555-081 (Model 55SX)", MACHINE_NOT_WORKING ) +COMP( 198?, i8580071, 0, ibm5170, ps2386, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8580-071 (Model 80)", MACHINE_NOT_WORKING ) +COMP( 198?, i8580111, 0, ibm5170, ps2386, 0, ps2_state, empty_init, "International Business Machines", "IBM PS/2 8580-111 (Model 80)", MACHINE_NOT_WORKING ) diff --git a/src/mame/pc/quakeat.cpp b/src/mame/pc/quakeat.cpp new file mode 100644 index 00000000000..5fc80a67b48 --- /dev/null +++ b/src/mame/pc/quakeat.cpp @@ -0,0 +1,186 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/* + + Quake Arcade Tournament + + Only the HDD is dumped. The HDD is stickered 'Release Beta 2' + + We've also seen CDs of this for sale, so maybe there should be a CD too, for the music? + +TODO: +can't be emulated without proper mb bios + + -- set info + +Quake Arcade Tournament by Lazer-Tron + +PC running Windows 95 with a Dongle on the parallel port + +Created .chd with version 0.125 + +It found the following disk paramaters... + +Input offset 511 +Cyclinders 263 +Heads 255 +Sectors 63 +Byte/Sector 512 +Sectors/Hunk 8 +Logical size 2,1163,248,864 + +The "backup" directory on hard disk was created by the dumper. + + -- Hardware info found on the following web pages: +http://web.archive.org/web/20070810060806/http://www.wave-report.com/archives/1998/98170702.htm +http://www.thedodgegarage.com/3dfx/q3d_quicksilver.htm +http://quakearcadetournament.blogspot.com/ +http://web.archive.org/web/20001001045148/http://www.quantum3d.com:80/press%20releases/4-20-98.html +https://www.quaddicted.com/webarchive/www.quaddicted.com/quake-nostalgia/quake-arcade-tournament-edition/ + +Quantum3D Heavy Metal HM233G (part of Quantum3D's Quicksilver family) +- NLX form factor system that is based on the Intel 440LX chipset +- Intel NX440LX motherboard + - Intel 82440LX AGPset (82443LX Northbridge / 82371AB PIIX4 PCI-ISA Southbridge) + - SMC FDC37C677 I/O + - Yamaha OPL3-SA3 (YMF715) Audio codec (16-bit per sample 3D audio) + - Intel Pro 10/100 PCI Ethernet NIC + - (Optional) Cirrus CL-GD5465 AGP Graphics Controller + - Intel/Phoenix BIOS +- Intel Pentium II 233 233MHz CPU processor with 512KB of L2 cache +- (1) 32MB PC66 66 MHz SDRAM 168-pin DIMM +- Microsoft Windows 95 OSR2.5 +- shock-mounted 3.1GB Ultra DMA-33 EIDE hard drive +- 12-24x CD-ROM drive +- 1.44 MB floppy drive +- Quantum3D Obsidian2 90-4440 AGP AGPTV Voodoo2-based realtime 3D graphics accelerator + (a professional version of the Quantum3D Obsidian2 S-12 AGPTV) +- Companion PCI 2D/VGA: Quantum3D Ventana MGV-PCI (Alliance Semiconductor ProMotion aT25) + or Quantum3D Ventana "MGV Rush" (custom Quantum3D Ventana 50 Voodoo Rush with 3D-disabled + 2D-only BIOS and no TV-out, only using the Alliance Semiconductor ProMotion aT25) +- Quantum3D GCI-2 (Game Control Interface II) I/O board - designed to interface coin-op and + industrial input/output control devices to a PC. Fits in either PCI or ISA bus slot for + mechanical attachment only. Communications between the GCI and the PC are via a standard + RS-232 serial interface, using a 14-byte packet protocol. Power is provided by a 4-pin + Molex style disk driver power connector. + +Note: Quantum3D Quicksilver QS233G configuration seem very similar to the HM233G, with the only + exceptions being that the Quantum3D Obsidian2 90-4440 is replaced with the earlier Quantum3D + Obsidian 100SB-4440V Voodoo Graphics realtime 3D graphics accelerator with 2D Alliance + Semiconductor ProMotion aT25 MGV 2000 daughter card, and the Quantum3D GCI-2 might be replaced + with an earlier Quantum3D GCI. + +Dongle: Rainbow Technologies parallel-port security dongle (at least 1024 bytes) + +=============================================================================== +TODO: + * Add BIOS dump (standard NX440LX motherboard) + * Hook up PC hardware + * Hook up the Quantum3D GCI-2 (details? ROMs?) + * What's the dongle do? +=============================================================================== +*/ + +#include "emu.h" + +#include "pcshare.h" + +#include "cpu/i386/i386.h" +#include "emupal.h" +#include "screen.h" + + +namespace { + +class quakeat_state : public pcat_base_state +{ +public: + quakeat_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + { } + + void quake(machine_config &config); + +private: + virtual void machine_start() override; + virtual void video_start() override; + uint32_t screen_update_quake(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void quake_io(address_map &map); + void quake_map(address_map &map); +}; + + +void quakeat_state::video_start() +{ +} + +uint32_t quakeat_state::screen_update_quake(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + +void quakeat_state::quake_map(address_map &map) +{ + map(0x00000000, 0x0000ffff).rom().region("pc_bios", 0); /* BIOS */ +} + +void quakeat_state::quake_io(address_map &map) +{ + pcat32_io_common(map); + map(0x00e8, 0x00eb).noprw(); +// map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::read_cs0), FUNC(ide_controller_device::write_cs0)); + map(0x0300, 0x03af).noprw(); + map(0x03b0, 0x03df).noprw(); +// map(0x0278, 0x027b).w(FUNC(quakeat_state::pnp_config_w)); +// map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::read_cs1), FUNC(ide_controller_device::write_cs1)); +// map(0x0a78, 0x0a7b).w(FUNC(quakeat_state::pnp_data_w)); +// map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_device::read), FUNC(pci_bus_device::write)); +} + +/*************************************************************/ + +static INPUT_PORTS_START( quake ) +INPUT_PORTS_END + +/*************************************************************/ + +void quakeat_state::machine_start() +{ +} +/*************************************************************/ + +void quakeat_state::quake(machine_config &config) +{ + /* basic machine hardware */ + PENTIUM2(config, m_maincpu, 233000000); /* Pentium II, 233MHz */ + m_maincpu->set_addrmap(AS_PROGRAM, &quakeat_state::quake_map); + m_maincpu->set_addrmap(AS_IO, &quakeat_state::quake_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + /* video hardware */ + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(64*8, 32*8); + screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1); + screen.set_screen_update(FUNC(quakeat_state::screen_update_quake)); + screen.set_palette("palette"); + + PALETTE(config, "palette").set_entries(0x100); +} + + +ROM_START(quake) + ROM_REGION32_LE(0x20000, "pc_bios", 0) /* motherboard bios */ + ROM_LOAD("quakearcadetournament.pcbios", 0x000000, 0x10000, NO_DUMP ) + + DISK_REGION( "disks" ) + DISK_IMAGE( "quakeat", 0, SHA1(c44695b9d521273c9d3c0e18c88f0dca0185bd7b) ) +ROM_END + +} // anonymous namespace + + +GAME( 1998, quake, 0, quake, quake, quakeat_state, empty_init, ROT0, "Lazer-Tron / iD Software", "Quake Arcade Tournament (Release Beta 2)", MACHINE_IS_SKELETON ) diff --git a/src/mame/pc/queen.cpp b/src/mame/pc/queen.cpp new file mode 100644 index 00000000000..70791d7c10c --- /dev/null +++ b/src/mame/pc/queen.cpp @@ -0,0 +1,323 @@ +// license:BSD-3-Clause +// copyright-holders:Peter Ferrie +/* Queen */ + +/* + +Produttore STG +N.revisione +CPU main PCB is a standard EPIA +ROMs epia BIOS + solid state HD + +1x VIA EPIA5000EAG (main PCB) with: +VT8231 South Bridge +VIA Eden Processor +VIA EPIA Companion Chip VT1612A (Audio CODEC) +VIA EPIA Companion Chip VT6103 (Networking) +processor speed is 533MHz <- likely to be a Celeron or a Pentium III class CPU -AS + + it's a 2002 era PC at least based on the BIOS, + almost certainly newer than the standard 'PENTIUM' CPU + +- update by Peter Ferrie: +- split BIOS region into 64kb blocks and implement missing PAM registers +- VIA Apollo VXPro chipset is not compatible with Intel i430. + +*/ + + +#include "emu.h" +#include "pcshare.h" + +#include "cpu/i386/i386.h" +#include "machine/lpci.h" +#include "machine/pckeybrd.h" +#include "machine/idectrl.h" +#include "video/pc_vga.h" + +namespace { + +class queen_state : public pcat_base_state +{ +public: + queen_state(const machine_config &mconfig, device_type type, const char *tag) + : pcat_base_state(mconfig, type, tag) + { + } + + void queen(machine_config &config); + +private: + std::unique_ptr m_bios_ram; + std::unique_ptr m_bios_ext_ram; + uint8_t m_mtxc_config_reg[256]{}; + uint8_t m_piix4_config_reg[4][256]{}; + + void bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + + void bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0); + virtual void machine_start() override; + virtual void machine_reset() override; + void intel82439tx_init(); + void queen_io(address_map &map); + void queen_map(address_map &map); + + uint8_t mtxc_config_r(int function, int reg); + void mtxc_config_w(int function, int reg, uint8_t data); + uint32_t intel82439tx_pci_r(int function, int reg, uint32_t mem_mask); + void intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); + uint8_t piix4_config_r(int function, int reg); + void piix4_config_w(int function, int reg, uint8_t data); + uint32_t intel82371ab_pci_r(int function, int reg, uint32_t mem_mask); + void intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask); +}; + + +// Intel 82439TX System Controller (MTXC) + +uint8_t queen_state::mtxc_config_r(int function, int reg) +{ +// osd_printf_debug("MTXC: read %d, %02X\n", function, reg); + + return m_mtxc_config_reg[reg]; +} + +void queen_state::mtxc_config_w(int function, int reg, uint8_t data) +{ + printf("MTXC: write %d, %02X, %02X\n", function, reg, data); + + /* + memory banking with North Bridge: + 0x63 (PAM) xx-- ---- BIOS area 0xf0000-0xfffff + --xx ---- BIOS extension 0xe0000 - 0xeffff + ---- xx-- ISA add-on BIOS 0xd0000 - 0xdffff + ---- --xx ISA add-on BIOS 0xc0000 - 0xcffff + + 10 -> 1 = Write Enable, 0 = Read Enable + */ + + if (reg == 0x63) + { + if (data & 0x20) // enable RAM access to region 0xf0000 - 0xfffff + membank("bios_bank")->set_base(m_bios_ram.get()); + else // disable RAM access (reads go to BIOS ROM) + membank("bios_bank")->set_base(memregion("bios")->base() + 0x30000); + if (data & 0x80) // enable RAM access to region 0xe0000 - 0xeffff + membank("bios_ext")->set_base(m_bios_ext_ram.get()); + else + membank("bios_ext")->set_base(memregion("bios")->base() + 0x20000); + } + + m_mtxc_config_reg[reg] = data; +} + +void queen_state::intel82439tx_init() +{ + m_mtxc_config_reg[0x60] = 0x02; + m_mtxc_config_reg[0x61] = 0x02; + m_mtxc_config_reg[0x62] = 0x02; + m_mtxc_config_reg[0x63] = 0x02; + m_mtxc_config_reg[0x64] = 0x02; + m_mtxc_config_reg[0x65] = 0x02; +} + +uint32_t queen_state::intel82439tx_pci_r(int function, int reg, uint32_t mem_mask) +{ + uint32_t r = 0; + if (ACCESSING_BITS_24_31) + { + r |= mtxc_config_r(function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= mtxc_config_r(function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= mtxc_config_r(function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= mtxc_config_r(function, reg + 0) << 0; + } + return r; +} + +void queen_state::intel82439tx_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + mtxc_config_w(function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + mtxc_config_w(function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + mtxc_config_w(function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + mtxc_config_w(function, reg + 0, (data >> 0) & 0xff); + } +} + +// Intel 82371AB PCI-to-ISA / IDE bridge (PIIX4) + +uint8_t queen_state::piix4_config_r(int function, int reg) +{ +// osd_printf_debug("PIIX4: read %d, %02X\n", function, reg); + if ((function < 4) && (reg < 256)) + return m_piix4_config_reg[function][reg]; + else + return 0; // BIOS performs a brute-force scan for devices +} + +void queen_state::piix4_config_w(int function, int reg, uint8_t data) +{ +// osd_printf_debug("%s:PIIX4: write %d, %02X, %02X\n", machine().describe_context(), function, reg, data); + if ((function < 4) && (reg < 256)) + m_piix4_config_reg[function][reg] = data; +} + +uint32_t queen_state::intel82371ab_pci_r(int function, int reg, uint32_t mem_mask) +{ + uint32_t r = 0; + if (ACCESSING_BITS_24_31) + { + r |= piix4_config_r(function, reg + 3) << 24; + } + if (ACCESSING_BITS_16_23) + { + r |= piix4_config_r(function, reg + 2) << 16; + } + if (ACCESSING_BITS_8_15) + { + r |= piix4_config_r(function, reg + 1) << 8; + } + if (ACCESSING_BITS_0_7) + { + r |= piix4_config_r(function, reg + 0) << 0; + } + return r; +} + +void queen_state::intel82371ab_pci_w(int function, int reg, uint32_t data, uint32_t mem_mask) +{ + if (ACCESSING_BITS_24_31) + { + piix4_config_w(function, reg + 3, (data >> 24) & 0xff); + } + if (ACCESSING_BITS_16_23) + { + piix4_config_w(function, reg + 2, (data >> 16) & 0xff); + } + if (ACCESSING_BITS_8_15) + { + piix4_config_w(function, reg + 1, (data >> 8) & 0xff); + } + if (ACCESSING_BITS_0_7) + { + piix4_config_w(function, reg + 0, (data >> 0) & 0xff); + } +} + + +void queen_state::bios_ext_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (m_mtxc_config_reg[0x63] & 0x40) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ext_ram.get() + offset); + } +} + + +void queen_state::bios_ram_w(offs_t offset, uint32_t data, uint32_t mem_mask) +{ + if (m_mtxc_config_reg[0x63] & 0x10) // write to RAM if this region is write-enabled + { + COMBINE_DATA(m_bios_ram.get() + offset); + } +} + +void queen_state::queen_map(address_map &map) +{ + map(0x00000000, 0x0009ffff).ram(); + map(0x000a0000, 0x000bffff).rw("vga", FUNC(vga_device::mem_r), FUNC(vga_device::mem_w)); + map(0x000e0000, 0x000effff).bankr("bios_ext").w(FUNC(queen_state::bios_ext_ram_w)); + map(0x000f0000, 0x000fffff).bankr("bios_bank").w(FUNC(queen_state::bios_ram_w)); + map(0x00100000, 0x01ffffff).ram(); + map(0xfffc0000, 0xffffffff).rom().region("bios", 0); /* System BIOS */ +} + +void queen_state::queen_io(address_map &map) +{ + pcat32_io_common(map); + map(0x00e8, 0x00ef).noprw(); + + map(0x0170, 0x0177).rw("ide2", FUNC(ide_controller_32_device::cs0_r), FUNC(ide_controller_32_device::cs0_w)); + map(0x01f0, 0x01f7).rw("ide", FUNC(ide_controller_device::cs0_r), FUNC(ide_controller_device::cs0_w)); + map(0x0370, 0x0377).rw("ide2", FUNC(ide_controller_32_device::cs1_r), FUNC(ide_controller_32_device::cs1_w)); + map(0x03b0, 0x03bf).rw("vga", FUNC(vga_device::port_03b0_r), FUNC(vga_device::port_03b0_w)); + map(0x03c0, 0x03cf).rw("vga", FUNC(vga_device::port_03c0_r), FUNC(vga_device::port_03c0_w)); + map(0x03d0, 0x03df).rw("vga", FUNC(vga_device::port_03d0_r), FUNC(vga_device::port_03d0_w)); + map(0x03f0, 0x03f7).rw("ide", FUNC(ide_controller_device::cs1_r), FUNC(ide_controller_device::cs1_w)); + + map(0x0cf8, 0x0cff).rw("pcibus", FUNC(pci_bus_legacy_device::read), FUNC(pci_bus_legacy_device::write)); +} + +void queen_state::machine_start() +{ + m_bios_ram = std::make_unique(0x10000/4); + m_bios_ext_ram = std::make_unique(0x10000/4); + + intel82439tx_init(); +} + +void queen_state::machine_reset() +{ + membank("bios_bank")->set_base(memregion("bios")->base() + 0x30000); + membank("bios_ext")->set_base(memregion("bios")->base() + 0x20000); +} + +void queen_state::queen(machine_config &config) +{ + PENTIUM3(config, m_maincpu, 533000000/16); // Celeron or Pentium 3, 533 Mhz + m_maincpu->set_addrmap(AS_PROGRAM, &queen_state::queen_map); + m_maincpu->set_addrmap(AS_IO, &queen_state::queen_io); + m_maincpu->set_irq_acknowledge_callback("pic8259_1", FUNC(pic8259_device::inta_cb)); + + pcat_common(config); + + pci_bus_legacy_device &pcibus(PCI_BUS_LEGACY(config, "pcibus", 0, 0)); + pcibus.set_device(0, FUNC(queen_state::intel82439tx_pci_r), FUNC(queen_state::intel82439tx_pci_w)); + pcibus.set_device(7, FUNC(queen_state::intel82371ab_pci_r), FUNC(queen_state::intel82371ab_pci_w)); + + ide_controller_device &ide(IDE_CONTROLLER(config, "ide").options(ata_devices, "hdd", nullptr, true)); + ide.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir6_w)); + + ide_controller_32_device &ide2(IDE_CONTROLLER_32(config, "ide2").options(ata_devices, nullptr, nullptr, true)); + ide2.irq_handler().set("pic8259_2", FUNC(pic8259_device::ir7_w)); + + /* video hardware */ + pcvideo_vga(config); +} + + +ROM_START( queen ) + ROM_REGION32_LE( 0x40000, "bios", 0 ) + ROM_LOAD( "bios-original.bin", 0x00000, 0x40000, CRC(feb542d4) SHA1(3cc5d8aeb0e3b7d9ed33248a4f3dc507d29debd9) ) + + ROM_REGION( 0x8000, "video_bios", ROMREGION_ERASEFF ) // TODO: no VGA card is hooked up, to be removed +// ROM_LOAD16_BYTE( "trident_tgui9680_bios.bin", 0x0000, 0x4000, BAD_DUMP CRC(1eebde64) SHA1(67896a854d43a575037613b3506aea6dae5d6a19) ) +// ROM_CONTINUE( 0x0001, 0x4000 ) + + DISK_REGION( "ide:0:hdd:image" ) + DISK_IMAGE( "pqiidediskonmodule", 0,SHA1(a56efcc711b1c5a2e63160b3088001a8c4fb56c2) ) +ROM_END + +} // anonymous namespace + + +GAME( 2002?, queen, 0, queen, 0, queen_state, empty_init, ROT0, "STG", "Queen?", MACHINE_IS_SKELETON ) diff --git a/src/mame/pc/sis630.cpp b/src/mame/pc/sis630.cpp new file mode 100644 index 00000000000..1a452974a86 --- /dev/null +++ b/src/mame/pc/sis630.cpp @@ -0,0 +1,305 @@ +// license: BSD-3-Clause +// copyright-holders: Angelo Salese, R. Belmont +// thanks-to: Diego Nappino +/************************************************************************************************** + + SiS 630 chipset based PC + + TODO (main): + - PS/2 loses IRQs, mouse is unusable, "ibm" BIOS doesn't work at all; + - '900 Ethernet (missing ROM dump); + - USB controllers (OpenHCI complaint); + - Floppy drive, unsupported SMC37C673 default; + - ACPI is not fully lpc-acpi complaint; + - EISA slots; + - PnP from LPC; + - SMBus; + - Super I/O handling in LPC (HW motherboard monitor, cfr. I/O $294 reads in shutms11 fan tests); + + TODO (usability, to be moved in a SW list): + - windows xp sp3: tests HW then does an ACPI devtrap write ($48), will eventually BSoD with + ACPI STOP #a5 error with param $11 + \- To bypass hold F7 while the "to install SCSI drivers [...] press F6" appears. + And by F7 I really mean it :shrug: + + - windows xp sp3: BSoD during install with a STOP #0a IRQL_NOT_LESS_OR_EQUAL; + + - windows neptune: BSoD during ethernet check (after time clock setup) + with a STOP #a0 INTERNAL_POWER_ERROR with param1 0x5 ("reserved"!?) + + - gamecstl Kontron BIOS: + \- hangs at PC=0xf3cf2, again wanting a SMI# from devtrap_en_w; + \- No PS/2 inputs; + + - gamecstl dump (tested from shutms11, also see notes below): + \- Currently black screens before booting normal Windows, reading $5004 from the LPC ACPI + (flip EAX to non-zero to bypass). + NB: it also writes to $5048 once (devtrap_en_w), which should generate a SMI# event; + \- Doesn't accept any PS/2 input, tries to install a "PCI standard CPU Host Bridge" (?), + hangs there; + \- GUI is never recognized no matter what, punts with DirectX not installed; + + - xubuntu 6.10: throws several SCSIDEV unhandled $46 & $51 commands + (get configuration/read disc information), + eventually punts to prompt with a "can't access tty: job control turned off" (on live CD) or + hangs at "Configuring network interfaces" (on actual install); + + - xubuntu 10.10: stalls after '900 ethernet check; + + - Haiku 0.1: hangs throwing an "unhandled READ TOC format 2", + serial COM1 prints a "vm_mark_page_range_inuse: page 0x9f in non-free state 7!" + + - Red Hat 6.2: Triple Faults on x87 exception check + \- prints the type of mounted floating point exception if bypassed. + +=================================================================================================== + + Cristaltec "Game Cristal" (MAME bootleg) + + Skeleton driver by R. Belmont, based on taitowlf.cpp by Ville Linde + + Notes: + - Specs: P3-866, SiS 630 motherboard + integrated graphics card, + SiS 7018 sound, DirectX 8.1. + - Image is just a more or less stock Windows 98SE with a customized shell + "Ialoader.exe" (sic) to boot the frontend, located in C:\WINDOWS + It will eventually hang after throwing a "DirectX missing" error. + - In order to bypass the shell launcher, you should: + 1. edit C:\WINDOWS\system.ini and change shell property to explorer.exe + 2. remove the autoexec.bat contents, it will otherwise copy a bunch of .ini + files from C:\dat to C:\WINDOWS, and replacing the system.ini shell launcher. + Alternatively you can also execute "open.exe" from MS-DOS, that removes above customization + too. + - (gamecstl) Device Manager installed devices: + - two Samsung SyncMaster 900SL monitors ('630 + '301?); + - SiS 630 display adapter; + - Samsung CD-ROM SC-152L; + - SiS 5513 Dual PCI IDE Controller; + - COM1, COM2, LPT1 enabled; + - a QDI USBDisk USB Mass Storage SCSI driver; + - a SiS 7001 PCI to USB Open Host Controller + USB root hub x 2; + - C:\drvs contains a collection of drivers, mostly the ones described above. + - C:\WINDOWS\temp has a couple footprints: + 1. has a Portuguese version of the Intel Processor Identification Utility, + most likely used for binding the emulator to the CPU serial via CPUID; + 2. has u3spwd.exe (USB Flash Disk), likely used to copy the necessary files for + making the frontend to work; + - Input is via a custom COM1 port JAMMA adaptor. + - The custom emulator is a heavily modified version of MAME32. If you extract the + disk image, it's in C:\GH4\GH4.EXE. It's UPX compressed, so unpack it before doing + any forensics. The emulator does run on Windows as new as XP Pro SP2 but you can't + control it due to the lack of the custom input. + - C:\GH4\mvs contains movie clips of the emulated games. + These are MS-CRAM encoded, 288x208 at 20 fps, stereo MS ADPCM with 11025 Hz sample rate, + 36 seconds length. + Mentioning this because SiS 630 has several HW registers dedicated to video playback, + which will be most likely used once we get there. + - C:\GH4\rdir contains filled NVRAM directory of the supported games. + These are probably copied from a factory default (like skipping NVRAM errors in spang & mk), + needs to be extensively checked if they can be flushed and given a working state with no + arbitrary user data (i.e. the mk games sports about 3 hours of playtime each) + + Updates 27/11/2007 (Diego Nappino): + The COM1 port is opened at 19200 bps, No parity, 8 bit data, 1 stop bit. + The protocol is based on a 6 bytes frame with a leading byte valued 0x05 and a trailing one at 0x02 + The four middle bytes are used, in negative logic (0xFF = No button pressed), to implement the inputs. + Each bit meaning as follows: + + Byte 1 Byte 2 Byte 3 Byte 4 + Bit 0 P1-Credit P1-Button C P2-Left UNUSED + Bit 1 P1-Start P1-Button D P2-Right UNUSED + Bit 2 P1-Down P1-Button E P2-Button A SERVICE + Bit 3 P1-Up TEST P2-Button B UNUSED + Bit 4 P1-Left P2-Credit P2-Button C UNUSED + Bit 5 P1-Right P2-Start P2-Button D UNUSED + Bit 6 P1-Button A P2-Down P2-Button E UNUSED + Bit 7 P1-Button B P2-Up VIDEO-MODE UNUSED + + The JAMMA adaptor sends a byte frame each time an input changes. + So for example, if the P1-Button A and P1-Button B are both pressed, it will send: + + 0x05 0xFC 0xFF 0xFF 0xFF 0x02 + + And when the buttons are both released + + 0x05 0xFF 0xFF 0xFF 0xFF 0x02 + + CPUID info: + + Original set: + CPUID Level: EAX: EBX: ECX: EDX: + 00000000 00000003 756E6547 6C65746E 49656E69 + 00000001 0000068A 00000002 00000000 0387F9FF + 00000002 03020101 00000000 00000000 0C040882 + 00000003 00000000 00000000 CA976D2E 000082F6 + 80000000 00000000 00000000 CA976D2E 000082F6 + C0000000 00000000 00000000 CA976D2E 000082F6 + + Version 2: + CPUID Level: EAX: EBX: ECX: EDX: + 00000000 00000003 756E6547 6C65746E 49656E69 + 00000001 0000068A 00000002 00000000 0387F9FF + 00000002 03020101 00000000 00000000 0C040882 + 00000003 00000000 00000000 B8BA1941 00038881 + 80000000 00000000 00000000 B8BA1941 00038881 + C0000000 00000000 00000000 B8BA1941 00038881 + +**************************************************************************************************/ + +#include "emu.h" +#include "cpu/i386/i386.h" +#include "bus/isa/isa_cards.h" +#include "bus/pc_kbd/keyboards.h" +#include "machine/intelfsh.h" +#include "machine/pci.h" +#include "machine/sis5513_ide.h" +#include "machine/sis630_host.h" +#include "machine/sis630_gui.h" +#include "machine/sis7001_usb.h" +#include "machine/sis7018_audio.h" +#include "machine/sis900_eth.h" +#include "machine/sis950_lpc.h" +#include "machine/sis950_smbus.h" +//#include "machine/fdc37c93x.h" + +class sis630_state : public driver_device +{ +public: + sis630_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_ide_00_1(*this, "pci:00.1") + , m_lpc_01_0(*this, "pci:01.0") + { } + + void sis630(machine_config &config); + void gamecstl(machine_config &config); + +private: + + required_device m_maincpu; + required_device m_ide_00_1; + required_device m_lpc_01_0; + +// void main_io(address_map &map); +// void main_map(address_map &map); +}; + + +static INPUT_PORTS_START(sis630) +INPUT_PORTS_END + +void sis630_state::sis630(machine_config &config) +{ + // Slot 1/Socket 370, Coppermine FC-PGA @ 500~850+/100 MHz or Celeron PPGA 300~600+ MHz + // TODO: lowered rate for debugging aid, needs a slot option anyway + PENTIUM3(config, m_maincpu, 100'000'000); +// m_maincpu->set_addrmap(AS_PROGRAM, &sis630_state::main_map); +// m_maincpu->set_addrmap(AS_IO, &sis630_state::main_io); + m_maincpu->set_irq_acknowledge_callback("pci:01.0:pic_master", FUNC(pic8259_device::inta_cb)); +// m_maincpu->smiact().set("pci:00.0", FUNC(sis950_lpc_device::smi_act_w)); + + // TODO: unknown flash ROM types + // Needs a $80000 sized ROM + AMD_29F400T(config, "flash"); + + PCI_ROOT(config, "pci", 0); + // up to 512MB, 2 x DIMM sockets + SIS630_HOST(config, "pci:00.0", 0, "maincpu", 256*1024*1024); + SIS5513_IDE(config, m_ide_00_1, 0, "maincpu"); + // TODO: both on same line as default, should also trigger towards LPC + m_ide_00_1->irq_pri().set("pci:01.0:pic_slave", FUNC(pic8259_device::ir6_w)); + //FUNC(sis950_lpc_device::pc_irq14_w)); + m_ide_00_1->irq_sec().set("pci:01.0:pic_slave", FUNC(pic8259_device::ir7_w)); + //FUNC(sis950_lpc_device::pc_mirq0_w)); + + SIS950_LPC (config, m_lpc_01_0, XTAL(33'000'000), "maincpu", "flash"); + m_lpc_01_0->fast_reset_cb().set([this] (int state) { + if (state) + machine().schedule_soft_reset(); + }); + LPC_ACPI (config, "pci:01.0:acpi", 0); + SIS950_SMBUS(config, "pci:01.0:smbus", 0); + + SIS900_ETH(config, "pci:01.1", 0); + // USB config: 2 on back, 3 on front. Front is fn 2 + SIS7001_USB(config, "pci:01.2", 0, 3); + SIS7001_USB(config, "pci:01.3", 0, 2); + SIS7018_AUDIO(config, "pci:01.4", 0); + // documentation doesn't mention modem part #, derived from Shuttle MS11 MB manual +// SIS7013_MODEM_AC97(config, "pci:01.6" + + // "Virtual PCI-to-PCI Bridge" + SIS630_BRIDGE(config, "pci:02.0", 0, "pci:02.0:00.0"); + // GUI must go under the virtual bridge + // This will be correctly identified as bus #1-dev #0-func #0 by the Award BIOS + SIS630_GUI(config, "pci:02.0:00.0", 0); + + // optional stuff (according to Kontron 786LCD manual) +// "pci:08.0" SCSI controller (vendor=1000 NCR / LSI Logic / Symbios Logic device=0012 53C895A) +// "pci:09.0" IEEE1394 controller (vendor=1033 NEC device=00ce uPD72872 / μPD72872) + + // TODO: 3 expansion PCI slots (PC104+) + // "pci:09.x" to "pci:12.x"? + // (PIC-MG) + // "pci:20.x" to "pci:17.x"? + + // TODO: 1 parallel + 2 serial ports + // TODO: 1 game port ('7018?) + + // TODO: AMR (Audio/modem riser) + UPT (Panel Link-TV out), assume [E]ISA complaint, needs specific slot options +// ISA16_SLOT(config, "isa1", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); +// ISA16_SLOT(config, "isa2", 0, "pci:01.0:isabus", pc_isa16_cards, nullptr, false); +} + +// Kontron 786LCD/3.5 based +void sis630_state::gamecstl(machine_config &config) +{ + sis630_state::sis630(config); + // TODO: Actually Celeron, as also stated by the BIOS + PENTIUM3(config.replace(), m_maincpu, 100'000'000); + + // tries to install '900 on Windows boot, which implies it doesn't have it + // (leave it on for now since it has specific option in Setup BIOS) + //config.device_remove("pci:01.1"); + + // TODO: mapped RAM config + // TODO: add custom inputs + // TODO: eventually remove PS/2 connector defaults +// subdevice("pci:01.0:ps2_con")->set_default_option(nullptr); +// subdevice("pci:01.0:aux_con")->set_default_option(nullptr); +} + +ROM_START(shutms11) + ROM_REGION32_LE(0x80000, "flash", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS(0, "ms11s11d", "ms11s11d") + ROMX_LOAD( "ms11s11d.bin", 0x040000, 0x040000, CRC(27077a58) SHA1(32327ebf328cb0c2dec819c3710acc83527803c5), ROM_BIOS(0) ) + ROM_SYSTEM_BIOS(1, "ms11s134", "ms11s134") + ROMX_LOAD( "ms11s134.bin", 0x040000, 0x040000, CRC(d739c4f3) SHA1(2301e57163ac4d9b7eddcabce52fa7d01b22330e), ROM_BIOS(1) ) +ROM_END + +ROM_START(gamecstl) + ROM_REGION32_LE(0x80000, "flash", ROMREGION_ERASEFF ) + // from gamecstl HDD dump, under "C:\drvs\bios\bios1_9" + ROM_LOAD( "prod19.rom", 0x040000, 0x040000, BAD_DUMP CRC(9262306c) SHA1(5cd805622ecb4d326591b5f2cf918fe5cb1bce8e) ) + ROM_CONTINUE( 0x000000, 0x040000 ) + + DISK_REGION( "pci:00.1:ide1:0:hdd:image" ) + DISK_IMAGE( "gamecstl", 0, SHA1(b431af3c42c48ba07972d77a3d24e60ee1e4359e) ) +ROM_END + +ROM_START(gamecst2) + ROM_REGION32_LE(0x80000, "pci:01.0:flash", ROMREGION_ERASEFF ) + ROM_LOAD( "prod19.rom", 0x040000, 0x040000, BAD_DUMP CRC(9262306c) SHA1(5cd805622ecb4d326591b5f2cf918fe5cb1bce8e) ) + ROM_CONTINUE( 0x000000, 0x040000 ) + + DISK_REGION( "pci:00.1:ide1:0:hdd:image" ) + DISK_IMAGE( "gamecst2", 0, SHA1(14e1b311cb474801c7bdda3164a0c220fb102159) ) +ROM_END + + +COMP( 2000, shutms11, 0, 0, sis630, sis630, sis630_state, empty_init, "Shuttle", "MS11 PC", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) + +// Arcade based games +GAME( 2002, gamecstl, 0, gamecstl, sis630, sis630_state, empty_init, ROT0, "Cristaltec", "GameCristal", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +GAME( 2002, gamecst2, gamecstl, gamecstl, sis630, sis630_state, empty_init, ROT0, "Cristaltec", "GameCristal (version 2.613)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/xussrpc/ec184x.cpp b/src/mame/xussrpc/ec184x.cpp deleted file mode 100644 index f5f03e39670..00000000000 --- a/src/mame/xussrpc/ec184x.cpp +++ /dev/null @@ -1,347 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/*************************************************************************** - - drivers/ec184x.c - - Driver file for EC-184x series - - To do: - - verify ec1840 clocks etc. - - did 640KB memory board exist or it's 512+128 boards? - -***************************************************************************/ - - -#include "emu.h" -#include "machine/genpc.h" - -#include "bus/isa/xsu_cards.h" -#include "bus/pc_kbd/keyboards.h" -#include "bus/pc_kbd/pc_kbdc.h" -#include "cpu/i86/i86.h" -#include "machine/ram.h" - -#include "softlist_dev.h" - - -//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already -#define LOG_KEYBOARD (1U << 1) -#define LOG_DEBUG (1U << 2) - -//#define VERBOSE (LOG_DEBUG) -//#define LOG_OUTPUT_FUNC osd_printf_info -#include "logmacro.h" - -#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) -#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) - - -static constexpr int EC1841_MEMBOARD_SIZE = 512 * 1024; - - -class ec184x_state : public driver_device -{ -public: - ec184x_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_ram(*this, RAM_TAG) - { } - - void ec1840(machine_config &config); - void ec1841(machine_config &config); - - void init_ec1840(); - void init_ec1841(); - -private: - DECLARE_MACHINE_RESET(ec1841); - uint8_t memboard_r(offs_t offset); - void memboard_w(offs_t offset, uint8_t data); - - void ec1840_io(address_map &map); - void ec1840_map(address_map &map); - void ec1841_io(address_map &map); - void ec1841_map(address_map &map); - - required_device m_maincpu; - required_device m_ram; - - struct - { - uint8_t enable[4]{}; - int boards = 0; - } m_memory; -}; - -/* - * EC-1841 memory controller. The machine can hold four memory boards; - * each board has a control register, its address is set by a DIP switch - * on the board itself. - * - * Only one board should be enabled for read, and one for write. - * Normally, this is the same board. - * - * Each board is divided into 4 banks, internally numbered 0..3. - * POST tests each board on startup, and an error (indicated by - * I/O CH CK bus signal) causes it to disable failing bank(s) by writing - * 'reconfiguration code' (inverted number of failing memory bank) to - * the register. - - * bit 1-0 'reconfiguration code' - * bit 2 enable read access - * bit 3 enable write access - */ - -uint8_t ec184x_state::memboard_r(offs_t offset) -{ - uint8_t data; - - data = offset % 4; - if (data >= m_memory.boards) - data = 0xff; - else - data = m_memory.enable[data]; - LOG("ec1841_memboard R (%d of %d) == %02X\n", offset + 1, m_memory.boards, data); - - return data; -} - -void ec184x_state::memboard_w(offs_t offset, uint8_t data) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - uint8_t current = m_memory.enable[offset]; - - LOG("ec1841_memboard W (%d of %d) <- %02X (%02X)\n", offset + 1, m_memory.boards, data, current); - - if (offset >= m_memory.boards) - { - return; - } - - if (BIT(current, 2) && !BIT(data, 2)) - { - // disable read access - program.unmap_read(0, EC1841_MEMBOARD_SIZE - 1); - LOG("ec1841_memboard_w unmap_read(%d)\n", offset); - } - - if (BIT(current, 3) && !BIT(data, 3)) - { - // disable write access - program.unmap_write(0, EC1841_MEMBOARD_SIZE - 1); - LOG("ec1841_memboard_w unmap_write(%d)\n", offset); - } - - if (!BIT(current, 2) && BIT(data, 2)) - { - for (int i = 0; i < 4; i++) - m_memory.enable[i] &= 0xfb; - // enable read access - program.install_rom(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE); - LOG("ec1841_memboard_w map_read(%d)\n", offset); - } - - if (!BIT(current, 3) && BIT(data, 3)) - { - for (int i = 0; i < 4; i++) - m_memory.enable[i] &= 0xf7; - // enable write access - program.install_writeonly(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer() + offset * EC1841_MEMBOARD_SIZE); - LOG("ec1841_memboard_w map_write(%d)\n", offset); - } - - m_memory.enable[offset] = data; -} - -void ec184x_state::init_ec1840() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); -} - -void ec184x_state::init_ec1841() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - m_memory.boards = m_ram->size() / EC1841_MEMBOARD_SIZE; - if (m_memory.boards > 4) m_memory.boards = 4; - - program.install_ram(0, EC1841_MEMBOARD_SIZE - 1, m_ram->pointer()); - - // 640K configuration is special -- 512K board mapped at 0 + 128K board mapped at 512K - if (m_ram->size() == 640 * 1024) - { - program.install_ram(EC1841_MEMBOARD_SIZE, m_ram->size() - 1, m_ram->pointer() + EC1841_MEMBOARD_SIZE); - } -} - -MACHINE_RESET_MEMBER(ec184x_state, ec1841) -{ - memset(m_memory.enable, 0, sizeof(m_memory.enable)); - // mark 1st board enabled - m_memory.enable[0] = 0xc; -} - - -void ec184x_state::ec1840_map(address_map &map) -{ - map.unmap_value_high(); - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - -void ec184x_state::ec1841_map(address_map &map) -{ - map.unmap_value_high(); - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - -void ec184x_state::ec1840_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m("mb", FUNC(ec1840_mb_device::map)); -} - -void ec184x_state::ec1841_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m("mb", FUNC(ec1841_mb_device::map)); - map(0x02b0, 0x02b3).rw(FUNC(ec184x_state::memboard_r), FUNC(ec184x_state::memboard_w)); -} - - -void ec184x_state::ec1840(machine_config &config) -{ - I8086(config, m_maincpu, 4096000); - m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1840_map); - m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1840_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - ec1840_mb_device &mb(EC1840_MOTHERBOARD(config, "mb")); - mb.set_cputag(m_maincpu); - mb.int_callback().set_inputline(m_maincpu, 0); - mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - // FIXME: determine ISA bus clock - // 7-slot backplane, at least two slots are always taken by CPU and memory cards - ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0002", false); - ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0003", false); - ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0004", false); - ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); - ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); - - SOFTWARE_LIST(config, "flop_list").set_original("ec1841"); - - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); - kbd.out_clock_cb().set("mb", FUNC(ec1840_mb_device::keyboard_clock_w)); - kbd.out_data_cb().set("mb", FUNC(ec1840_mb_device::keyboard_data_w)); - - RAM(config, m_ram).set_default_size("640K").set_extra_options("128K,256K,384K,512K"); -} - -void ec184x_state::ec1841(machine_config &config) -{ - I8086(config, m_maincpu, XTAL(12'288'000) / 3); - m_maincpu->set_addrmap(AS_PROGRAM, &ec184x_state::ec1841_map); - m_maincpu->set_addrmap(AS_IO, &ec184x_state::ec1841_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - MCFG_MACHINE_RESET_OVERRIDE(ec184x_state, ec1841) - - ec1841_mb_device &mb(EC1841_MOTHERBOARD(config, "mb")); - mb.set_cputag(m_maincpu); - mb.int_callback().set_inputline(m_maincpu, 0); - mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - - // FIXME: determine ISA bus clock - ISA8_SLOT(config, "isa1", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0002", false); // cga - ISA8_SLOT(config, "isa2", 0, "mb:isa", ec184x_isa8_cards, "ec1841.0003", false); // fdc (IRQ6) + mouse port (IRQ2..5) - ISA8_SLOT(config, "isa3", 0, "mb:isa", ec184x_isa8_cards, "ec1840.0004", false); // lpt (IRQ7||5) [+ serial (IRQx)] - ISA8_SLOT(config, "isa4", 0, "mb:isa", ec184x_isa8_cards, "hdc", false); - ISA8_SLOT(config, "isa5", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); - ISA8_SLOT(config, "isa6", 0, "mb:isa", ec184x_isa8_cards, nullptr, false); - - SOFTWARE_LIST(config, "flop_list").set_original("ec1841"); - - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); - kbd.out_clock_cb().set("mb", FUNC(ec1841_mb_device::keyboard_clock_w)); - kbd.out_data_cb().set("mb", FUNC(ec1841_mb_device::keyboard_data_w)); - - RAM(config, m_ram).set_default_size("640K").set_extra_options("512K,1024K,1576K,2048K"); -} - -ROM_START( ec1840 ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROM_DEFAULT_BIOS("v4") - // supports MDA only - ROM_SYSTEM_BIOS(0, "v1", "EC-1840.01") - ROMX_LOAD("000-01.bin", 0xe000, 0x0800, CRC(c3ab1fad) SHA1(8168bdee30698f4f9aa7bbb6dfabe62dd723cec5), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("001-01.bin", 0xf000, 0x0800, CRC(601d1155) SHA1(9684d33b92743749704587a48e679ef7a3b20f9c), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("002-01.bin", 0xe001, 0x0800, CRC(ce4dddb7) SHA1(f9b1da60c848e68ff1c154d695a36a0833de4804), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("003-01.bin", 0xf001, 0x0800, CRC(14b40431) SHA1(ce7fffa41897405ee64fd4e86015e774f8bd108a), ROM_SKIP(1) | ROM_BIOS(0)) - - ROM_SYSTEM_BIOS(1, "v4", "EC-1840.04") - ROMX_LOAD("000-04-971b.bin", 0xe000, 0x0800, CRC(06aeaee8) SHA1(9f954e4c48156d573a8e0109e7ca652be9e6036a), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("001-04-92b7.bin", 0xf000, 0x0800, CRC(3fae650a) SHA1(c98b777fdeceadd72d6eb9465b3501b9ead55a08), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("002-04-9e17.bin", 0xe001, 0x0800, CRC(d59712df) SHA1(02ea1b3ae9662f5c64c58920a32ca9db0f6fbd12), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("003-04-3ccb.bin", 0xf001, 0x0800, CRC(7fc362c7) SHA1(538e13639ad2b4c30bd72582e323181e63513306), ROM_SKIP(1) | ROM_BIOS(1)) - - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) -ROM_END - -ROM_START( ec1841 ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROM_DEFAULT_BIOS("v2") - ROM_SYSTEM_BIOS(0, "v1", "EC-1841.01") - ROMX_LOAD("012-01-3107.bin", 0xc000, 0x0800, CRC(77957396) SHA1(785f1dceb6e2b4618f5c5f0af15eb74a8c951448), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("013-01-203f.bin", 0xc001, 0x0800, CRC(768bd3d5) SHA1(2e948f2ad262de306d889b7964c3f1aad45ff5bc), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("014-01-fa40.bin", 0xd000, 0x0800, CRC(47722b58) SHA1(a6339ee8af516f834826b7828a5cf79cb650480c), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("015-01-bf1d.bin", 0xd001, 0x0800, CRC(b585b5ea) SHA1(d0ebed586eb13031477c2e071c50416682f80489), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("016-01-65f7.bin", 0xe000, 0x0800, CRC(28a07db4) SHA1(17fbcd60dacd1d3f8d8355db429f97e4d1d1ac88), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("017-01-5be1.bin", 0xe001, 0x0800, CRC(928bda26) SHA1(ee889184067e2680b29a8ef1c3a76cf5afd4c78d), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("018-01-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD("019-01-0492.bin", 0xf001, 0x0800, CRC(8a9d593e) SHA1(f3936d2cb4e6d130dd732973f126c3aa20612463), ROM_SKIP(1) | ROM_BIOS(0)) - - ROM_SYSTEM_BIOS(1, "v2", "EC-1841.02") - ROMX_LOAD("012-02-37f6.bin", 0xc000, 0x0800, CRC(8f5c6a20) SHA1(874b62f9cee8d3b974f33732f94eff10fc002c44), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("013-02-2552.bin", 0xc001, 0x0800, CRC(e3c10128) SHA1(d6ed743ebe9c130925c9f17aad1a45db9194c967), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("014-02-0fbe.bin", 0xd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("015-02-d736.bin", 0xd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("016-02-5b2c.bin", 0xe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("017-02-4b9d.bin", 0xe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("018-02-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD("019-02-0493.bin", 0xf001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(1)) - - ROM_SYSTEM_BIOS(2, "v3", "EC-1841.03") - ROMX_LOAD("012-03-37e7.bin", 0xc000, 0x0800, CRC(49992bd5) SHA1(119121e1b4af1c44b9b8c2edabe7dc1d3019c4a6), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("013-03-2554.bin", 0xc001, 0x0800, CRC(834bd7d7) SHA1(e37514fc4cb8a5cbe68e7564e0e07d5116c4021a), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("014-03-0fbe.bin", 0xd000, 0x0800, CRC(f8517e5e) SHA1(8034cd6ff5778365dc9daa494524f1753a74f1ed), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("015-03-d736.bin", 0xd001, 0x0800, CRC(8538c52a) SHA1(ee981ce90870b6546a18f2a2e64d71b0038ce0dd), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("016-03-5b2c.bin", 0xe000, 0x0800, CRC(3d1d1e67) SHA1(c527e29796537787c0f6c329f3c203f6131ca77f), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("017-03-4b9d.bin", 0xe001, 0x0800, CRC(1b985264) SHA1(5ddcb9c13564be208c5068c105444a87159c67ee), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("018-03-7090.bin", 0xf000, 0x0800, CRC(75ca7d7e) SHA1(6356426820c5326a7893a437d54b02f250ef8609), ROM_SKIP(1) | ROM_BIOS(2)) - ROMX_LOAD("019-03-0493.bin", 0xf001, 0x0800, CRC(61aae23d) SHA1(7b3aa24a63ee31b194297eb1e61c3827edfcb95a), ROM_SKIP(1) | ROM_BIOS(2)) -ROM_END - -ROM_START( ec1845 ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROMX_LOAD("184500.bin", 0xc000, 0x0800, CRC(7c472ef7) SHA1(3af53f27b49bbc731bf51f9300fbada23a1bfcfc), ROM_SKIP(1)) - ROMX_LOAD("184501.bin", 0xc001, 0x0800, CRC(db240dc6) SHA1(d7bb022213d09bbf2a8107fe4f1cd27b23939e18), ROM_SKIP(1)) - ROMX_LOAD("184502.bin", 0xd000, 0x0800, CRC(149e7e29) SHA1(7f2a297588fef1bc750c57e6ae0d5acf3d27c486), ROM_SKIP(1)) - ROMX_LOAD("184503.bin", 0xd001, 0x0800, CRC(e28cbd74) SHA1(cf1fba4e67c8e1dd8cdda547118e84b704029b03), ROM_SKIP(1)) - ROMX_LOAD("184504.bin", 0xe000, 0x0800, CRC(55fa7a1d) SHA1(58f7abab08b9d2f0a1c1636e11bb72af2694c95f), ROM_SKIP(1)) - ROMX_LOAD("184505.bin", 0xe001, 0x0800, CRC(c807e3f5) SHA1(08117e449f0d04f96041cff8d34893f500f3760d), ROM_SKIP(1)) - ROMX_LOAD("184506.bin", 0xf000, 0x0800, CRC(24f5c27c) SHA1(7822dd7f715ef00ccf6d8408be8bbfe01c2eba20), ROM_SKIP(1)) - ROMX_LOAD("184507.bin", 0xf001, 0x0800, CRC(75122203) SHA1(7b0fbdf1315230633e39574ac7360163bc7361e1), ROM_SKIP(1)) -ROM_END - -// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS -COMP( 1986, ec1840, ibm5150, 0, ec1840, 0, ec184x_state, init_ec1840, "", "EC-1840", 0 ) -COMP( 1987, ec1841, ibm5150, 0, ec1841, 0, ec184x_state, init_ec1841, "", "EC-1841", 0 ) -COMP( 1989, ec1845, ibm5150, 0, ec1841, 0, ec184x_state, init_ec1841, "", "EC-1845", MACHINE_NOT_WORKING ) diff --git a/src/mame/xussrpc/iskr103x.cpp b/src/mame/xussrpc/iskr103x.cpp deleted file mode 100644 index 694ac815ce2..00000000000 --- a/src/mame/xussrpc/iskr103x.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/*************************************************************************** - - drivers/iskr103x.c - - Driver file for Iskra-1030, 1031 - - TODO - - fix cyrillic chargen upload for CGA and MDA - - replace DIP switch definition - - keyboard test is not passing (code 301) - - hard disk is connected but untested - -***************************************************************************/ - - -#include "emu.h" -#include "machine/genpc.h" - -#include "bus/isa/xsu_cards.h" -#include "bus/pc_kbd/keyboards.h" -#include "bus/pc_kbd/pc_kbdc.h" -#include "cpu/i86/i86.h" -#include "machine/pc_lpt.h" -#include "machine/ram.h" - -#include "softlist.h" - - -namespace { - -class iskr103x_state : public driver_device -{ -public: - iskr103x_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - { } - - void iskr1030m(machine_config &config); - void iskr1031(machine_config &config); - -private: - required_device m_maincpu; - void iskr1031_io(address_map &map); - void iskr1031_map(address_map &map); -}; - -void iskr103x_state::iskr1031_map(address_map &map) -{ - map.unmap_value_high(); - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - - -void iskr103x_state::iskr1031_io(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x00ff).m("mb", FUNC(ibm5160_mb_device::map)); -} - - -static DEVICE_INPUT_DEFAULTS_START(iskr1030m) - DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) - DEVICE_INPUT_DEFAULTS("DSW0", 0x01, 0x01) -DEVICE_INPUT_DEFAULTS_END - -static DEVICE_INPUT_DEFAULTS_START(iskr1031) - DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) -DEVICE_INPUT_DEFAULTS_END - - -void iskr103x_state::iskr1030m(machine_config &config) -{ - /* basic machine hardware */ - I8086(config, m_maincpu, 4772720); - m_maincpu->set_addrmap(AS_PROGRAM, &iskr103x_state::iskr1031_map); - m_maincpu->set_addrmap(AS_IO, &iskr103x_state::iskr1031_io); - m_maincpu->set_irq_acknowledge_callback("mb:pic8259", FUNC(pic8259_device::inta_cb)); - - ibm5160_mb_device &mb(IBM5160_MOTHERBOARD(config, "mb")); - mb.set_cputag(m_maincpu); - mb.int_callback().set_inputline(m_maincpu, 0); - mb.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI); - mb.kbdclk_callback().set("kbd", FUNC(pc_kbdc_device::clock_write_from_mb)); - mb.kbddata_callback().set("kbd", FUNC(pc_kbdc_device::data_write_from_mb)); - mb.set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1030m)); - - ISA8_SLOT(config, "isa1", 0, "mb:isa", iskr103x_isa8_cards, "cga_iskr1030m", false); // FIXME: determine IS bus clock - ISA8_SLOT(config, "isa2", 0, "mb:isa", iskr103x_isa8_cards, "fdc_xt", false); - ISA8_SLOT(config, "isa3", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); - ISA8_SLOT(config, "isa4", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); - ISA8_SLOT(config, "isa5", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); - ISA8_SLOT(config, "isa6", 0, "mb:isa", iskr103x_isa8_cards, nullptr, false); - - pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_EC_1841)); -// pc_kbdc_device &kbd(PC_KBDC(config, "kbd", pc_xt_keyboards, STR_KBD_ISKR_1030)); - kbd.out_clock_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_clock_w)); - kbd.out_data_cb().set("mb", FUNC(ibm5160_mb_device::keyboard_data_w)); - - RAM(config, RAM_TAG).set_default_size("640K").set_extra_options("64K, 128K, 256K, 512K"); -} - -void iskr103x_state::iskr1031(machine_config &config) -{ - iskr1030m(config); - subdevice("mb")->set_input_default(DEVICE_INPUT_DEFAULTS_NAME(iskr1031)); - subdevice("isa1")->set_default_option("cga_iskr1031"); -} - -ROM_START( iskr1030m ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROMX_LOAD( "iskra-1030m_0.rom", 0xc000, 0x2000, CRC(0d698e19) SHA1(2fe117c9f4f8c4b59085d5a41f919d743c425fdd), ROM_SKIP(1)) - ROMX_LOAD( "iskra-1030m_1.rom", 0xc001, 0x2000, CRC(fe808337) SHA1(b0b7ebe14324ada8aa9a6926a82b18e80f78a257), ROM_SKIP(1)) -ROM_END - -ROM_START( iskr1031 ) - ROM_REGION16_LE(0x10000,"bios", 0) - ROM_SYSTEM_BIOS(0, "v1", "v1") - ROMX_LOAD( "150-02.bin", 0xc000, 0x2000, CRC(e33fb974) SHA1(f5f3ece67c025c0033716ff516e1a34fbeb32749), ROM_SKIP(1) | ROM_BIOS(0)) - ROMX_LOAD( "150-03.bin", 0xc001, 0x2000, CRC(8c482258) SHA1(90ef48955e0df556dc06a000a797ef42ccf430c5), ROM_SKIP(1) | ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v2", "v2") - ROMX_LOAD( "150-06.bin", 0xc000, 0x2000, CRC(1adbf969) SHA1(08c0a0fc50a75e6207b1987bae389cca60893eac), ROM_SKIP(1) | ROM_BIOS(1)) - ROMX_LOAD( "150-07.bin", 0xc001, 0x2000, CRC(0dc4b65a) SHA1(c96f066251a7343eac8113ea9dcb2cb12d0334d5), ROM_SKIP(1) | ROM_BIOS(1)) -ROM_END - -} // anonymous namespace - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP ( 1989, iskr1030m, ibm5150, 0, iskr1030m, 0, iskr103x_state, empty_init, "Schetmash", "Iskra 1030M", MACHINE_NOT_WORKING ) -COMP ( 1989, iskr1031, ibm5150, 0, iskr1031, 0, iskr103x_state, empty_init, "", "Iskra 1031", 0 ) diff --git a/src/mame/xussrpc/kb_7007_3.h b/src/mame/xussrpc/kb_7007_3.h deleted file mode 100644 index 28427d4a2f9..00000000000 --- a/src/mame/xussrpc/kb_7007_3.h +++ /dev/null @@ -1,129 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/* - * MC 7007 keyboard, variant 3, used by mc1502. - * - * Rus/Lat key is mapped to RAlt. - */ - -INPUT_PORTS_START( mc7007_3_keyboard ) - PORT_START("Y1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) - - PORT_START("Y2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Rus/Lat") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) - - PORT_START("Y3") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) - - PORT_START("Y4") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) - - PORT_START("Y5") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) - - PORT_START("Y6") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) - - PORT_START("Y7") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR)) - - PORT_START("Y8") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - - PORT_START("Y9") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') - - PORT_START("Y10") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') - - PORT_START("Y11") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - - PORT_START("Y12") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) -INPUT_PORTS_END diff --git a/src/mame/xussrpc/kb_poisk1.h b/src/mame/xussrpc/kb_poisk1.h deleted file mode 100644 index 21e206059f0..00000000000 --- a/src/mame/xussrpc/kb_poisk1.h +++ /dev/null @@ -1,239 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/* - * Poisk-1 keyboard layouts, two (out of three) revisions - * - * F4 - toggles key click - * RCtrl - toggles Latin/Cyrillic layout - * Keypad / - Pause key - * F11 - XXX - * F12 - XXX - */ - -INPUT_PORTS_START( poisk1_keyboard_v89 ) - PORT_START("Y1") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') // scancode 0x55 - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?56?") // 0x56 - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP),UCHAR_MAMEKEY(8_PAD)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN),UCHAR_MAMEKEY(2_PAD)) -/*-12*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-12 - ?") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('?') PORT_CHAR('/') */ - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') -/*-11*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-11 - %") /* PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') */ - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) - - PORT_START("Y2") -/*-15*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-15 - !") /* PORT_CODE(KEYCODE_1) PORT_CHAR('!') PORT_CHAR('1') */ - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT),UCHAR_MAMEKEY(4_PAD)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) /* ??? */ - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) -/*-13*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-13 - ;") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) -/*-2*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-2 - .") /* PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') */ -/*-3*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-3 - _") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') // scancode 0x54 - - PORT_START("Y3") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - - PORT_START("Y4") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) -/*-1*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-1 - *") /* PORT_CODE(KEYCODE_8) PORT_CHAR('*') PORT_CHAR('8') */ - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) /* ??2 */ -/*-9*/ PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-9 - :") /* PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') */ -/*-10*/ PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-10 - ,") /* PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') */ - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) - - PORT_START("Y5") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) -/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Caps Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) /* ???? */ - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - - PORT_START("Y6") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) -/*?*/ PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Alt") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?dc?") // 0xdc = SHIFT2 - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Rus/Lat") PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) // 0xdb - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?59?") // 0x59 - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - - PORT_START("Y7") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad . Del") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad +") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT),UCHAR_MAMEKEY(6_PAD)) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?5a?") // 0x5a - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) - - PORT_START("Y8") -/*-6*/ PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-6 - -") /* PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') */ - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') /* ??? */ - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') -/*-7*/ PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-7 - )") /* PORT_CODE(KEYCODE_0) PORT_CHAR(')') PORT_CHAR('0') */ - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Scroll Lock") -/*-4*/ PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-4 - (") /* PORT_CODE(KEYCODE_9) PORT_CHAR('(') PORT_CHAR('9') */ - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') -/*-5*/ PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-5 - \"") /* PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('\'') */ -/*-8*/ PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("?-8 - /") /* PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') */ -INPUT_PORTS_END - -INPUT_PORTS_START( poisk1_keyboard_v91 ) - PORT_START("Y1") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad + \xd0\x81") PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD)) // Cyrillic Yo - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP),UCHAR_MAMEKEY(8_PAD)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN),UCHAR_MAMEKEY(2_PAD)) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"') - - PORT_START("Y2") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT),UCHAR_MAMEKEY(4_PAD)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END)) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') - - PORT_START("Y3") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_PGDN) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') - - PORT_START("Y4") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PAUSE) PORT_CHAR(UCHAR_MAMEKEY(PAUSE)) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) - - PORT_START("Y5") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xd0\x87") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12)) // Cyrillic i with diaeresis - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - - PORT_START("Y6") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Ctrl/Cyril") PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_MAMEKEY(RCONTROL)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - - PORT_START("Y7") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad - \xd0\x84") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD)) // Cyrillic Ukrainian Ie - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK)) - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT),UCHAR_MAMEKEY(6_PAD)) - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) - - PORT_START("Y8") - PORT_BIT( 0x001, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - PORT_BIT( 0x002, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("* PrtSc") PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK)) - PORT_BIT( 0x004, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') - PORT_BIT( 0x008, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') - PORT_BIT( 0x010, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') - PORT_BIT( 0x020, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) - PORT_BIT( 0x040, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - PORT_BIT( 0x080, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xd0\x86") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) // Cyrillic Byelorussian-Ukrainian i - PORT_BIT( 0x100, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x200, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') - PORT_BIT( 0x400, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - PORT_BIT( 0x800, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') -INPUT_PORTS_END diff --git a/src/mame/xussrpc/mc1502.cpp b/src/mame/xussrpc/mc1502.cpp deleted file mode 100644 index bc55bc7d8a9..00000000000 --- a/src/mame/xussrpc/mc1502.cpp +++ /dev/null @@ -1,486 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/*************************************************************************** - - drivers/mc1502.cpp - - Driver file for Elektronika MS 1502 - - To do: - - fix video errors caused by 465caf8038a120b4c1ffad9df67a1dc7474e5bb1 - "cga: treat as fixed sync monitor (nw)" - - debug video init in BIOS 7.2 - - pk88 (video, keyboard, etc.) - -***************************************************************************/ - -#include "emu.h" -#include "kb_7007_3.h" - -#include "bus/centronics/ctronics.h" -#include "bus/isa/isa.h" -#include "bus/isa/mc1502_fdc.h" -#include "bus/isa/xsu_cards.h" -#include "bus/rs232/rs232.h" -#include "cpu/i86/i86.h" -#include "imagedev/cassette.h" -#include "machine/i8251.h" -#include "machine/i8255.h" -#include "machine/pic8259.h" -#include "machine/pit8253.h" -#include "machine/ram.h" -#include "sound/spkrdev.h" - -#include "softlist_dev.h" -#include "speaker.h" - - -//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already -#define LOG_KEYBOARD (1U << 1) -#define LOG_PPI (1U << 2) - -//#define VERBOSE (LOG_GENERAL | LOG_VRAM) -//#define LOG_OUTPUT_STREAM std::cout - -#include "logmacro.h" - -#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) -#define LOGPPI(...) LOGMASKED(LOG_PPI, __VA_ARGS__) - - -namespace { - -class mc1502_state : public driver_device -{ -public: - mc1502_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_upd8251(*this, "upd8251") - , m_pic8259(*this, "pic8259") - , m_pit8253(*this, "pit8253") - , m_ppi8255n1(*this, "ppi8255n1") - , m_ppi8255n2(*this, "ppi8255n2") - , m_isabus(*this, "isa") - , m_speaker(*this, "speaker") - , m_cassette(*this, "cassette") - , m_centronics(*this, "centronics") - , m_ram(*this, RAM_TAG) - , m_kbdio(*this, "Y%u", 1) - { } - - void mc1502(machine_config &config); - - void init_mc1502(); - - void fdc_config(device_t *device); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - -private: - required_device m_maincpu; - required_device m_upd8251; - required_device m_pic8259; - required_device m_pit8253; - required_device m_ppi8255n1; - required_device m_ppi8255n2; - required_device m_isabus; - required_device m_speaker; - required_device m_cassette; - required_device m_centronics; - required_device m_ram; - required_ioport_array<12> m_kbdio; - - TIMER_CALLBACK_MEMBER(keyb_signal_callback); - - struct { - uint8_t pulsing = 0; - uint16_t mask = 0; /* input lines */ - emu_timer *keyb_signal_timer = nullptr; - } m_kbd; - - uint8_t m_ppi_portb = 0; - uint8_t m_ppi_portc = 0; - uint8_t m_spkrdata = 0; - - DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out1_changed); - DECLARE_WRITE_LINE_MEMBER(mc1502_pit8253_out2_changed); - DECLARE_WRITE_LINE_MEMBER(mc1502_speaker_set_spkrdata); - DECLARE_WRITE_LINE_MEMBER(mc1502_i8251_syndet); - - void mc1502_ppi_portb_w(uint8_t data); - void mc1502_ppi_portc_w(uint8_t data); - uint8_t mc1502_ppi_portc_r(); - uint8_t mc1502_kppi_porta_r(); - void mc1502_kppi_portb_w(uint8_t data); - void mc1502_kppi_portc_w(uint8_t data); - - void mc1502_io(address_map &map); - void mc1502_map(address_map &map); - - int m_pit_out2 = 0; -}; - - -/* - * onboard devices: - */ - -// Timer - -/* check if any keys are pressed, raise IRQ1 if so */ - -TIMER_CALLBACK_MEMBER(mc1502_state::keyb_signal_callback) -{ - uint8_t key = 0; - - for (int i = 0; i < 12; i++) - { - key |= m_kbdio[i]->read(); - } - - LOGKBD("k_s_c = %02X (%d) %s\n", key, m_kbd.pulsing, (key || m_kbd.pulsing) ? " will IRQ" : ""); - - /* - If a key is pressed and we're not pulsing yet, start pulsing the IRQ1; - keep pulsing while any key is pressed, and pulse one time after all keys - are released. - */ - if (key) - { - if (m_kbd.pulsing < 2) - { - m_kbd.pulsing += 2; - } - } - - if (m_kbd.pulsing) - { - m_pic8259->ir1_w(m_kbd.pulsing & 1); - m_kbd.pulsing--; - } -} - -void mc1502_state::mc1502_ppi_portb_w(uint8_t data) -{ - m_ppi_portb = data; - m_pit8253->write_gate2(BIT(data, 0)); - mc1502_speaker_set_spkrdata(BIT(data, 1)); - m_centronics->write_strobe(BIT(data, 2)); - m_centronics->write_autofd(BIT(data, 3)); - m_centronics->write_init(BIT(data, 4)); -} - -// bit 0: parallel port data transfer direction (default = 0 = out) -// bits 1-2: CGA_FONT (default = 01) -// bit 3: i8251 SYNDET pin triggers NMI (default = 1 = no) -void mc1502_state::mc1502_ppi_portc_w(uint8_t data) -{ - m_ppi_portc = data & 15; -} - -// 0x80 -- serial RxD (not emulated) -// 0x40 -- CASS IN, also loops back T2OUT (gated by CASWR) -// 0x20 -- T2OUT -// 0x10 -- SNDOUT -uint8_t mc1502_state::mc1502_ppi_portc_r() -{ - int data = 0xff; - double tap_val = m_cassette->input(); - - data = (data & ~0x40) | (tap_val < 0 ? 0x40 : 0x00) | ((BIT(m_ppi_portb, 7) && m_pit_out2) ? 0x40 : 0x00); - data = (data & ~0x20) | (m_pit_out2 ? 0x20 : 0x00); - data = (data & ~0x10) | ((BIT(m_ppi_portb, 1) && m_pit_out2) ? 0x10 : 0x00); - - LOGPPI("mc1502_ppi_portc_r = %02X (tap_val %f t2out %d) at %s\n", - data, tap_val, m_pit_out2, machine().describe_context()); - return data; -} - -uint8_t mc1502_state::mc1502_kppi_porta_r() -{ - uint8_t key = 0; - - for (int i = 0; i < 12; i++) - { - if (BIT(m_kbd.mask, i)) - { - key |= m_kbdio[i]->read(); - } - } - - key ^= 0xff; - LOGPPI("mc1502_kppi_porta_r = %02X\n", key); - return key; -} - -void mc1502_state::mc1502_kppi_portb_w(uint8_t data) -{ - m_kbd.mask &= ~255; - m_kbd.mask |= data ^ 255; - if (!BIT(data, 0)) - m_kbd.mask |= 1 << 11; - else - m_kbd.mask &= ~(1 << 11); - LOGPPI("mc1502_kppi_portb_w ( %02X -> %04X )\n", data, m_kbd.mask); -} - -void mc1502_state::mc1502_kppi_portc_w(uint8_t data) -{ - m_kbd.mask &= ~(7 << 8); - m_kbd.mask |= ((data ^ 7) & 7) << 8; - LOGPPI("mc1502_kppi_portc_w ( %02X -> %04X )\n", data, m_kbd.mask); -} - -WRITE_LINE_MEMBER(mc1502_state::mc1502_i8251_syndet) -{ - if (!BIT(m_ppi_portc, 3)) - m_maincpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE); -} - -WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out1_changed) -{ - m_upd8251->write_txc(state); - m_upd8251->write_rxc(state); -} - -WRITE_LINE_MEMBER(mc1502_state::mc1502_pit8253_out2_changed) -{ - m_pit_out2 = state; - m_speaker->level_w(m_spkrdata & m_pit_out2); - m_cassette->output(state ? 1 : -1); -} - -WRITE_LINE_MEMBER(mc1502_state::mc1502_speaker_set_spkrdata) -{ - m_spkrdata = state ? 1 : 0; - m_speaker->level_w(m_spkrdata & m_pit_out2); -} - -void mc1502_state::init_mc1502() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); -} - -void mc1502_state::machine_start() -{ - /* - Keyboard polling circuit holds IRQ1 high until a key is - pressed, then it starts a timer that pulses IRQ1 low each - 40ms (check) for 20ms (check) until all keys are released. - Last pulse causes BIOS to write a 'break' scancode into port 60h. - */ - m_pic8259->ir1_w(1); - memset(&m_kbd, 0, sizeof(m_kbd)); - m_kbd.keyb_signal_timer = timer_alloc(FUNC(mc1502_state::keyb_signal_callback), this); - m_kbd.keyb_signal_timer->adjust(attotime::from_msec(20), 0, attotime::from_msec(20)); -} - -void mc1502_state::machine_reset() -{ - m_spkrdata = 0; - m_pit_out2 = 1; - m_ppi_portb = 0; - m_ppi_portc = 0; - m_speaker->level_w(0); -} - -/* - * macros - */ - -void mc1502_state::fdc_config(device_t *device) -{ - mc1502_fdc_device &fdc = *downcast(device); - fdc.set_cpu(m_maincpu); -} - -void mc1502_state::mc1502_map(address_map &map) -{ - map.unmap_value_high(); - map(0xf0000, 0xfffff).rom().region("bios", 0); -} - -void mc1502_state::mc1502_io(address_map &map) -{ - map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x0028, 0x0029).rw(m_upd8251, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - map(0x0060, 0x0063).rw(m_ppi8255n1, FUNC(i8255_device::read), FUNC(i8255_device::write)); - map(0x0068, 0x006B).rw(m_ppi8255n2, FUNC(i8255_device::read), FUNC(i8255_device::write)); // keyboard poll -} - -static INPUT_PORTS_START( mc1502 ) - PORT_INCLUDE( mc7007_3_keyboard ) -INPUT_PORTS_END - -void mc1502_state::mc1502(machine_config &config) -{ - I8088(config, m_maincpu, XTAL(16'000'000) / 3); - m_maincpu->set_addrmap(AS_PROGRAM, &mc1502_state::mc1502_map); - m_maincpu->set_addrmap(AS_IO, &mc1502_state::mc1502_io); - m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); - - PIT8253(config, m_pit8253); - m_pit8253->set_clk<0>(XTAL(16'000'000) / 12); /* heartbeat IRQ */ - m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w)); - m_pit8253->set_clk<1>(XTAL(16'000'000) / 12); /* serial port */ - m_pit8253->out_handler<1>().set(FUNC(mc1502_state::mc1502_pit8253_out1_changed)); - m_pit8253->set_clk<2>(XTAL(16'000'000) / 12); /* pio port c pin 4, and speaker polling enough */ - m_pit8253->out_handler<2>().set(FUNC(mc1502_state::mc1502_pit8253_out2_changed)); - - PIC8259(config, m_pic8259); - m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); - - I8255(config, m_ppi8255n1); - m_ppi8255n1->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::write)); - m_ppi8255n1->out_pb_callback().set(FUNC(mc1502_state::mc1502_ppi_portb_w)); - m_ppi8255n1->in_pc_callback().set(FUNC(mc1502_state::mc1502_ppi_portc_r)); - m_ppi8255n1->out_pc_callback().set(FUNC(mc1502_state::mc1502_ppi_portc_w)); - - I8255(config, m_ppi8255n2); - m_ppi8255n2->in_pa_callback().set(FUNC(mc1502_state::mc1502_kppi_porta_r)); - m_ppi8255n2->out_pb_callback().set(FUNC(mc1502_state::mc1502_kppi_portb_w)); - m_ppi8255n2->in_pc_callback().set("cent_status_in", FUNC(input_buffer_device::read)); - m_ppi8255n2->out_pc_callback().set(FUNC(mc1502_state::mc1502_kppi_portc_w)); - - I8251(config, m_upd8251, 0); - m_upd8251->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); - m_upd8251->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); - m_upd8251->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); - m_upd8251->rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir7_w)); /* default handler does nothing */ - m_upd8251->txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir7_w)); - m_upd8251->syndet_handler().set(FUNC(mc1502_state::mc1502_i8251_syndet)); - - rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr)); - rs232.rxd_handler().set(m_upd8251, FUNC(i8251_device::write_rxd)); - rs232.dsr_handler().set(m_upd8251, FUNC(i8251_device::write_dsr)); - rs232.cts_handler().set(m_upd8251, FUNC(i8251_device::write_cts)); - - isa8_device &isa(ISA8(config, "isa", 0)); - isa.set_memspace("maincpu", AS_PROGRAM); - isa.set_iospace("maincpu", AS_IO); - isa.irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - isa.irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w)); - isa.irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w)); - isa.irq5_callback().set(m_pic8259, FUNC(pic8259_device::ir5_w)); - isa.irq6_callback().set(m_pic8259, FUNC(pic8259_device::ir6_w)); - isa.irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w)); - isa.iochrdy_callback().set_inputline(m_maincpu, INPUT_LINE_HALT); - - ISA8_SLOT(config, "board0", 0, "isa", mc1502_isa8_cards, "cga_mc1502", true); // FIXME: determine ISA bus clock - ISA8_SLOT(config, "isa1", 0, "isa", mc1502_isa8_cards, "fdc", false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); - ISA8_SLOT(config, "isa2", 0, "isa", mc1502_isa8_cards, "rom", false).set_option_machine_config("fdc", [this](device_t* device) { fdc_config(device); }); - - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.80); - - CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->ack_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit6)); - m_centronics->busy_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit7)); - m_centronics->fault_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit4)); - m_centronics->perror_handler().set("cent_status_in", FUNC(input_buffer_device::write_bit5)); - - INPUT_BUFFER(config, "cent_status_in"); - - output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); - m_centronics->set_output_latch(cent_data_out); - - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - SOFTWARE_LIST(config, "flop_list").set_original("mc1502_flop"); -// SOFTWARE_LIST(config, "cass_list").set_original("mc1502_cass"); - - RAM(config, RAM_TAG).set_default_size("608K").set_extra_options("96K"); /* 96 base + 512 on expansion card */ -} - - -/* - Apparently there was a hardware revision with built-in floppy - controller mapped to alternate set of ports; v531 and v533 - support this revision. v533 is possibly not an original BIOS, it - supports autoboot which none of others do. v521h is a version - with support for 3rd party hard disk controller (not emulated). - v51 is designed for a different keyboard layout (JCUKEN, not - QWERTY). -*/ -ROM_START( mc1502 ) - ROM_REGION(0x10000,"bios", 0) - - ROM_DEFAULT_BIOS("v52") - ROM_SYSTEM_BIOS(0, "v50", "v5.0 10/05/89") - ROMX_LOAD("monitor_5_0.rom", 0xc000, 0x4000, CRC(9e97c6a0) SHA1(16a304e8de69ec4d8b92acda6bf28454c361a24f),ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v52", "v5.2 22/03/91") - ROMX_LOAD("monitor_5_2.rom", 0xc000, 0x4000, CRC(0e65491e) SHA1(8a4d556473b5e0e59b05fab77c79c29f4d562412),ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v521", "v5.21 12/10/92") - ROMX_LOAD("monitor_5_21.rom", 0xc000, 0x4000, CRC(28c8f653) SHA1(04b0b09e0b86d9648a83352cc1590eb8963833e0),ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v531", "v5.31 12/10/92") - ROMX_LOAD("monitor_5_31.rom", 0xc000, 0x4000, CRC(a48295d5) SHA1(6f38977c22f9cc6c2bc6f6e53edc4048ca6b6721),ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "v533", "v5.33 01/08/93") - ROMX_LOAD("0,cbc0.bin", 0xc000, 0x2000, CRC(9a55bc4f) SHA1(81da44eec2e52cf04b1fc7053502270f51270590),ROM_BIOS(4)) - ROMX_LOAD("1,dfe2.bin", 0xe000, 0x2000, CRC(8dec077a) SHA1(d6f6d7cc2183abc77fbd9cd59132de5766f7c458),ROM_BIOS(4)) - - // 5.21 + 3rd party HDC support. fails checksum test so marked BAD_DUMP. - ROM_SYSTEM_BIOS(5, "v521h", "v5.21h 22/09/93") - ROMX_LOAD("mshbios0.pgm", 0xc000, 0x2000, BAD_DUMP CRC(be447261) SHA1(b93c597c17dfa4b678f72c20a3f7119b73e6ba1c),ROM_BIOS(5)) - ROMX_LOAD("mshbios1.pgm", 0xe000, 0x2000, BAD_DUMP CRC(89e2eaf2) SHA1(37d6b225b5e35574fdac81219589407d925225be),ROM_BIOS(5)) - - // 5.3 - ROM_SYSTEM_BIOS(6, "v53", "v5.3 10/11/91") - ROMX_LOAD("1502-3b0.pgm", 0xc000, 0x2000, CRC(dc148763) SHA1(7a5e66438007b2de328ac680614f9c4ff60f6a75),ROM_BIOS(6)) - ROMX_LOAD("1502-3b1.pgm", 0xe000, 0x2000, CRC(17fc2af2) SHA1(a060d7b7302dfa639025f025106b50412cf26953),ROM_BIOS(6)) - // 5.1 -- JCUKEN keyboard - ROM_SYSTEM_BIOS(7, "v51", "v5.1 10/12/90") - ROMX_LOAD("ms1502b0.pgm", 0xc000, 0x2000, CRC(92fcc29a) SHA1(930a4cffcd6ec6110dd9a18bd389b78f0ccb110a),ROM_BIOS(7)) - ROMX_LOAD("ms1502b1.pgm", 0xe000, 0x2000, CRC(fe355a58) SHA1(b4ef7775045c6f2095e2b487fe19824986a4892c),ROM_BIOS(7)) - // 5.31 - ROM_SYSTEM_BIOS(8, "v531_93", "v5.31 21/01/93") - ROMX_LOAD("ms531b0.pgm", 0xc000, 0x2000, CRC(d97157d1) SHA1(cb1a1e0e2d9a0fcc78f9b09bfb4814d408ee4fae),ROM_BIOS(8)) - ROMX_LOAD("ms531b1.pgm", 0xe000, 0x2000, CRC(b1368e1a) SHA1(286496d25dc0ac2d8fe1802caffc6c37b236d105),ROM_BIOS(8)) - // 5.2 - ROM_SYSTEM_BIOS(9, "v52_91", "v5.2 10/11/91") - ROMX_LOAD("msv5-2b0.pgm", 0xc000, 0x2000, CRC(f7f370e9) SHA1(e069a35005581a02856853b57dd511ab8e10054b),ROM_BIOS(9)) - ROMX_LOAD("msv5-2b1.pgm", 0xe000, 0x2000, CRC(d50e1c43) SHA1(22724dec0052ee9e52f44f5914f2f5f3fae14612),ROM_BIOS(9)) - - // 7.2 - ROM_SYSTEM_BIOS(10, "v72", "v7.2 01/21/96") - ROMX_LOAD("7.2_1.bin", 0xe000, 0x2000, CRC(80912ad4) SHA1(cc54b77b2db4cc5d614efafd04367d2f06400fc8),ROM_BIOS(10)) - - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) - ROM_LOAD("symgen.rom", 0x0000, 0x2000, CRC(b2747a52) SHA1(6766d275467672436e91ac2997ac6b77700eba1e)) -ROM_END - -/* - Predecessor of MC1502, same keyboard attachment but - different video subsystem (not emulated). -*/ -ROM_START( pk88 ) - ROM_REGION(0x10000, "bios", 0) - - // datecode 07.23.87 - ROM_LOAD( "b0.064", 0x0000, 0x2000, CRC(80d3cf5d) SHA1(64769b7a8b60ffeefa04e4afbec778069a2840c9)) - ROM_LOAD( "b1.064", 0x2000, 0x2000, CRC(673a4acc) SHA1(082ae803994048e225150f771794ca305f73d731)) - ROM_LOAD( "b2.064", 0x4000, 0x2000, CRC(1ee66152) SHA1(7ed8c4c6c582487e802beabeca5b86702e5083e8)) - ROM_LOAD( "b3.064", 0x6000, 0x2000, CRC(3062b3fc) SHA1(5134dd64721cbf093d059ee5d3fd09c7f86604c7)) - ROM_LOAD( "pk88-0.064", 0xc000, 0x2000, CRC(1e4666cf) SHA1(6364c5241f2792909ff318194161eb2c29737546)) - ROM_LOAD( "pk88-1.064", 0xe000, 0x2000, CRC(6fa7e7ef) SHA1(d68bc273baa46ba733ac6ad4df7569dd70cf60dd)) -ROM_END - -} // anonymous namespace - - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP ( 1989, mc1502, 0, 0, mc1502, mc1502, mc1502_state, init_mc1502, "NPO Microprocessor", "Elektronika MS 1502", MACHINE_IMPERFECT_GRAPHICS ) -COMP ( 1988, pk88, 0, 0, mc1502, mc1502, mc1502_state, init_mc1502, "NPO Microprocessor", "Elektronika PK-88", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/xussrpc/poisk1.cpp b/src/mame/xussrpc/poisk1.cpp deleted file mode 100644 index cf76b136200..00000000000 --- a/src/mame/xussrpc/poisk1.cpp +++ /dev/null @@ -1,767 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sergey Svishchev -/*************************************************************************** - - drivers/poisk1.c - - Driver file for Poisk-1 - - to do: - - cassette i/o and softlist - - use palette rom - - monochrome output - - trap: does memory always get written or it's up to NMI ISR to complete writes? - - keyboard layout for earliest revision (v89r0) - - slot devices: - - hard disk controllers - - network cards - - joystick, mouse, serial, parallel ports - - sound card - -***************************************************************************/ - -#include "emu.h" -#include "kb_poisk1.h" - -#include "bus/isa/isa.h" -#include "bus/isa/p1_fdc.h" -#include "bus/isa/xsu_cards.h" -#include "cpu/i86/i86.h" -#include "imagedev/cassette.h" -#include "machine/i8255.h" -#include "machine/pic8259.h" -#include "machine/pit8253.h" -#include "machine/ram.h" -#include "machine/timer.h" -#include "sound/spkrdev.h" -#include "video/cgapal.h" - -#include "emupal.h" -#include "screen.h" -#include "softlist_dev.h" -#include "speaker.h" - - -//#define LOG_GENERAL (1U << 0) //defined in logmacro.h already -#define LOG_KEYBOARD (1U << 1) -#define LOG_DEBUG (1U << 2) - -//#define VERBOSE (LOG_DEBUG) -//#define LOG_OUTPUT_FUNC osd_printf_info -#include "logmacro.h" - -#define LOGKBD(...) LOGMASKED(LOG_KEYBOARD, __VA_ARGS__) -#define LOGDBG(...) LOGMASKED(LOG_DEBUG, __VA_ARGS__) - - -#define CGA_PALETTE_SETS 83 -/* one for colour, one for mono, 81 for colour composite */ - -#define BG_COLOR(x) (((x)&7) | (((x)&0x10) >> 1)) - -#define POISK1_UPDATE_ROW(name) \ - void name(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *videoram, uint16_t ma, uint8_t ra, uint8_t stride) - - -class p1_state : public driver_device -{ -public: - p1_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_pic8259(*this, "pic8259") - , m_pit8253(*this, "pit8253") - , m_ppi8255n1(*this, "ppi8255n1") - , m_ppi8255n2(*this, "ppi8255n2") - , m_isabus(*this, "isa") - , m_speaker(*this, "speaker") - , m_cassette(*this, "cassette") - , m_ram(*this, RAM_TAG) - , m_screen(*this, "screen") - , m_palette(*this, "palette") - , m_kbdio(*this, "Y%u", 1) - { } - - void poisk1(machine_config &config); - - void init_poisk1(); - - void fdc_config(device_t *device); - -protected: - virtual void machine_start() override; - virtual void machine_reset() override; - virtual void video_start() override; - - DECLARE_WRITE_LINE_MEMBER(vsync_changed); - TIMER_DEVICE_CALLBACK_MEMBER(hsync_changed); - -private: - required_device m_maincpu; - required_device m_pic8259; - required_device m_pit8253; - required_device m_ppi8255n1; - required_device m_ppi8255n2; - required_device m_isabus; - required_device m_speaker; - required_device m_cassette; - required_device m_ram; - required_device m_screen; - required_device m_palette; - - required_ioport_array<8> m_kbdio; - - uint8_t m_p1_spkrdata = 0; - uint8_t m_p1_input = 0; - - uint8_t m_kbpoll_mask = 0; - uint8_t m_vsync = 0; - uint8_t m_hsync = 0; - - struct - { - uint8_t trap[4]{}; - std::unique_ptr videoram_base; - uint8_t *videoram = nullptr; - uint8_t mode_control_6a = 0; - uint8_t color_select_68 = 0; - uint8_t palette_lut_2bpp[4]{}; - int stride = 0; - void *update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *videoram, uint16_t ma, uint8_t ra, uint8_t stride); - } m_video; - - void p1_palette(palette_device &palette) const; - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void set_palette_luts(); - POISK1_UPDATE_ROW(cga_gfx_2bpp_update_row); - POISK1_UPDATE_ROW(cga_gfx_1bpp_update_row); - POISK1_UPDATE_ROW(poisk1_gfx_1bpp_update_row); - - DECLARE_WRITE_LINE_MEMBER(p1_pit8253_out2_changed); - DECLARE_WRITE_LINE_MEMBER(p1_speaker_set_spkrdata); - uint8_t p1_trap_r(offs_t offset); - void p1_trap_w(offs_t offset, uint8_t data); - uint8_t p1_cga_r(offs_t offset); - void p1_cga_w(offs_t offset, uint8_t data); - void p1_vram_w(offs_t offset, uint8_t data); - - uint8_t p1_ppi_r(offs_t offset); - void p1_ppi_w(offs_t offset, uint8_t data); - void p1_ppi_porta_w(uint8_t data); - uint8_t p1_ppi_portb_r(); - uint8_t p1_ppi_portc_r(); - void p1_ppi_portc_w(uint8_t data); - void p1_ppi2_porta_w(uint8_t data); - void p1_ppi2_portb_w(uint8_t data); - uint8_t p1_ppi2_portc_r(); - - void poisk1_io(address_map &map); - void poisk1_map(address_map &map); -}; - -/* - * onboard devices: - */ - -/* - * Poisk-1 doesn't have a mc6845 and always runs in graphics mode. Text mode is emulated by BIOS; - * NMI is triggered on access to video memory and to mc6845 ports. Address and data are latched into: - * - * Port 28H (offset 0) -- lower 8 bits of address - * Port 29H (offset 1) -- high -//- and mode bits - * Port 2AH (offset 2) -- data - */ - -uint8_t p1_state::p1_trap_r(offs_t offset) -{ - uint8_t data = m_video.trap[offset]; - LOG("trap R %.2x $%02x\n", 0x28 + offset, data); - if (offset == 0) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - return data; -} - -void p1_state::p1_trap_w(offs_t offset, uint8_t data) -{ - LOG("trap W %.2x $%02x\n", 0x28 + offset, data); -} - -uint8_t p1_state::p1_cga_r(offs_t offset) -{ - switch (offset) - { - case 4: case 5: case 8: case 9: - LOG("cga R %.4x\n", offset + 0x3d0); - m_video.trap[2] = 0; - m_video.trap[1] = 0x43; - m_video.trap[0] = offset + 0xd0; - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - break; - - case 10: - return m_ppi8255n2->read(2); - - default: - break; - } - return 0; -} - -void p1_state::p1_cga_w(offs_t offset, uint8_t data) -{ - switch (offset) - { - case 4: case 5: case 8: case 9: - LOG("cga W %.4x $%02x\n", offset + 0x3d0, data); - m_video.trap[2] = data; - m_video.trap[1] = 0xC3; - m_video.trap[0] = offset + 0xd0; - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); - break; - - default: - break; - } -} - -void p1_state::p1_vram_w(offs_t offset, uint8_t data) -{ - LOGDBG("vram W %.4x $%02x\n", offset, data); - if (m_video.videoram_base) m_video.videoram_base[offset] = data; - m_video.trap[2] = data; - m_video.trap[1] = 0x80 | ((offset >> 8) & 0x3f); - m_video.trap[0] = offset & 255; - m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); -} - -// CGA emulator -/* -068h D42 0..2 R, G, B XXX Foreground/Background color - 3 NMI DISABLE NMI trap 1: Disabled 0: Enabled - 4 PALETTE XXX Colour palette 0: XXX 1: XXX - 5 I (INTENS) XXX Foreground/Background color intensity - 6 DISPLAY BANK XXX Video RAM page - 7 HIRES 1: 640x200 0: 320x200 -*/ - -void p1_state::p1_ppi2_porta_w(uint8_t data) -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - LOG("color_select_68 W $%02x\n", data); - - // NMI DISABLE - if (BIT((data ^ m_video.color_select_68), 3)) - { - if (BIT(data, 3)) - program.install_writeonly(0xb8000, 0xbbfff, m_video.videoram_base.get()); - else - program.install_write_handler(0xb8000, 0xbbfff, write8sm_delegate(*this, FUNC(p1_state::p1_vram_w))); - } - // DISPLAY BANK - if (BIT((data ^ m_video.color_select_68), 6)) - { - - if (BIT(data, 6)) - m_video.videoram = m_video.videoram_base.get() + 0x4000; - else - m_video.videoram = m_video.videoram_base.get(); - } - // HIRES -- XXX - if (BIT((data ^ m_video.color_select_68), 7)) - { - if (BIT(data, 7)) - m_screen->set_visible_area(0, 640 - 1, 0, 200 - 1); - else - m_screen->set_visible_area(0, 320 - 1, 0, 200 - 1); - } - m_video.color_select_68 = data; - set_palette_luts(); -} - -/* -06Ah Dxx 6 Enable/Disable color burst (?) - 7 Enable/Disable D7H/D7L -*/ - -void p1_state::p1_ppi_portc_w(uint8_t data) -{ - LOG("mode_control_6a W $%02x\n", data); - - m_video.mode_control_6a = data; - set_palette_luts(); -} - -void p1_state::set_palette_luts(void) -{ - /* Setup 2bpp palette lookup table */ - // HIRES - if (m_video.color_select_68 & 0x80) - { - m_video.palette_lut_2bpp[0] = 0; - } - else - { - m_video.palette_lut_2bpp[0] = BG_COLOR(m_video.color_select_68); - } - // B&W -- XXX -/* - if ( m_video.mode_control_6a & 0x40 ) - { - m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; - m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; - m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; - } - else -*/ - { - // PALETTE - if ( m_video.color_select_68 & 0x20 ) - { - m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 3; - m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 5; - m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 7; - } - else - { - m_video.palette_lut_2bpp[1] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 2; - m_video.palette_lut_2bpp[2] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 4; - m_video.palette_lut_2bpp[3] = ( ( m_video.color_select_68 & 0x20 ) >> 2 ) | 6; - } - } -} - -/*************************************************************************** - Draw graphics mode with 320x200 pixels (default) with 2 bits/pixel. - Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 - cga fetches 2 byte per mc6845 access. -***************************************************************************/ - -POISK1_UPDATE_ROW(p1_state::cga_gfx_2bpp_update_row) -{ - rgb_t const *const palette = m_palette->palette()->entry_list_raw(); - uint32_t *p = &bitmap.pix(ra); - - if (ra == 0) LOGDBG("cga_gfx_2bpp_update_row\n"); - uint16_t odd = (ra & 1) << 13; - uint16_t offset = (ma & 0x1fff) | odd; - for (int i = 0; i < stride; i++) - { - uint8_t data = videoram[ offset++ ]; - - *p = palette[m_video.palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++; - *p = palette[m_video.palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++; - *p = palette[m_video.palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++; - *p = palette[m_video.palette_lut_2bpp[ data & 0x03 ]]; p++; - } -} - -/*************************************************************************** - Draw graphics mode with 640x200 pixels (default). - The cell size is 1x1 (1 scanline is the real default) - Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 -***************************************************************************/ - -POISK1_UPDATE_ROW(p1_state::cga_gfx_1bpp_update_row) -{ - rgb_t const *const palette = m_palette->palette()->entry_list_raw(); - uint32_t *p = &bitmap.pix(ra); - uint8_t fg = 15, bg = BG_COLOR(m_video.color_select_68); - - if (ra == 0) LOGDBG("cga_gfx_1bpp_update_row bg %d\n", bg); - uint16_t odd = (ra & 1) << 13; - uint16_t offset = (ma & 0x1fff) | odd; - for (int i = 0; i < stride; i++) - { - uint8_t data = videoram[ offset++ ]; - - *p = palette[( data & 0x80 ) ? fg : bg ]; p++; - *p = palette[( data & 0x40 ) ? fg : bg ]; p++; - *p = palette[( data & 0x20 ) ? fg : bg ]; p++; - *p = palette[( data & 0x10 ) ? fg : bg ]; p++; - *p = palette[( data & 0x08 ) ? fg : bg ]; p++; - *p = palette[( data & 0x04 ) ? fg : bg ]; p++; - *p = palette[( data & 0x02 ) ? fg : bg ]; p++; - *p = palette[( data & 0x01 ) ? fg : bg ]; p++; - } -} - -/*************************************************************************** - Draw graphics mode with 640x200 pixels + extra highlight color for text - mode emulation - Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000 -***************************************************************************/ - -POISK1_UPDATE_ROW(p1_state::poisk1_gfx_1bpp_update_row) -{ - rgb_t const *const palette = m_palette->palette()->entry_list_raw(); - uint32_t *p = &bitmap.pix(ra); - uint8_t bg = BG_COLOR(m_video.color_select_68); - - if (ra == 0) LOGDBG("poisk1_gfx_1bpp_update_row bg %d\n", bg); - uint16_t odd = (ra & 1) << 13; - uint16_t offset = (ma & 0x1fff) | odd; - for (int i = 0; i < stride; i++) - { - uint8_t data = videoram[ offset++ ]; - - uint8_t fg = (data & 0x80) ? ( (m_video.color_select_68 & 0x20) ? 10 : 11 ) : 15; // XXX - *p = palette[bg]; p++; - *p = palette[( data & 0x40 ) ? fg : bg ]; p++; - *p = palette[( data & 0x20 ) ? fg : bg ]; p++; - *p = palette[( data & 0x10 ) ? fg : bg ]; p++; - *p = palette[( data & 0x08 ) ? fg : bg ]; p++; - *p = palette[( data & 0x04 ) ? fg : bg ]; p++; - *p = palette[( data & 0x02 ) ? fg : bg ]; p++; - *p = palette[( data & 0x01 ) ? fg : bg ]; p++; - } -} - -// Initialise the cga palette -void p1_state::p1_palette(palette_device &palette) const -{ - for (int i = 0; i < CGA_PALETTE_SETS * 16; i++) - palette.set_pen_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); -} - -void p1_state::video_start() -{ - address_space &space = m_maincpu->space(AS_PROGRAM); - - memset(&m_video, 0, sizeof(m_video)); - m_video.videoram_base = std::make_unique(0x8000); - m_video.videoram = m_video.videoram_base.get(); - m_video.stride = 80; - - space.install_ram(0xb8000, 0xbffff, m_video.videoram); -} - -WRITE_LINE_MEMBER(p1_state::vsync_changed) -{ - m_vsync = state ? 9 : 0; -} - -TIMER_DEVICE_CALLBACK_MEMBER(p1_state::hsync_changed) -{ - m_hsync = param & 1; -} - -uint32_t p1_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - uint16_t ra, ma = 0; - - if (!m_video.stride || !m_video.videoram) return 0; - - // bit 6 of 6Ah disables color burst -- not implemented - for (ra = cliprect.min_y; ra <= cliprect.max_y; ra++) - { - if (BIT(m_video.color_select_68, 7)) - { - if (BIT(m_video.mode_control_6a, 7)) - { - cga_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); - } - else - { - poisk1_gfx_1bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); - } - } - else - { - cga_gfx_2bpp_update_row(bitmap, cliprect, m_video.videoram, ma, ra, m_video.stride); - } - if (ra & 1) ma += m_video.stride; - } - - return 0; -} - -// Timer. Poisk-1 uses single XTAL for everything? -- check - -WRITE_LINE_MEMBER(p1_state::p1_speaker_set_spkrdata) -{ - m_p1_spkrdata = state ? 1 : 0; - m_speaker->level_w(m_p1_spkrdata & m_p1_input); -} - -WRITE_LINE_MEMBER(p1_state::p1_pit8253_out2_changed) -{ - m_p1_input = state ? 1 : 0; - m_speaker->level_w(m_p1_spkrdata & m_p1_input); -} - -// Keyboard (via PPI) - -void p1_state::p1_ppi_porta_w(uint8_t data) -{ - m_kbpoll_mask = data; - LOGDBG("p1_ppi_porta_w %02X <- %02X\n", m_kbpoll_mask, data); -} - -uint8_t p1_state::p1_ppi_portb_r() -{ - uint16_t key = 0xffff; - uint8_t ret = 0; - - for (int i = 0; i < 8; i++) - { - if (BIT(m_kbpoll_mask, i)) - { - key &= m_kbdio[i]->read(); - } - } - - ret = key & 0xff; -// LOG("p1_ppi_portb_r = %02X\n", ret); - return ret; -} - -uint8_t p1_state::p1_ppi_portc_r() -{ - uint16_t key = 0xffff; - uint8_t ret = 0; - - for (int i = 0; i < 8; i++) - { - if (BIT(m_kbpoll_mask, i)) - { - key &= m_kbdio[i]->read(); - } - } - - ret = (key >> 8) & 0xff; - LOGDBG("p1_ppi_portc_r = %02X\n", ret); - return ret; -} - -// XXX - -uint8_t p1_state::p1_ppi2_portc_r() -{ - int data = m_vsync | m_hsync | 0xc6; - double tap_val = m_cassette->input(); - - data |= (tap_val < 0 ? 0x10 : 0x00); - data |= (m_p1_input << 5); - - LOGDBG("p1_ppi2_portc_r = %02X (tap_val %f) at %s\n", data, tap_val, machine().describe_context()); - return data; -} - -void p1_state::p1_ppi2_portb_w(uint8_t data) -{ - m_pit8253->write_gate2(BIT(data, 0)); - p1_speaker_set_spkrdata(data & 0x02); -} - -uint8_t p1_state::p1_ppi_r(offs_t offset) -{ - switch (offset) - { - case 0: - return m_ppi8255n1->read(0); - case 9: - case 10: - case 11: - return m_ppi8255n1->read(offset - 8); - case 8: - return m_ppi8255n2->read(0); - case 1: - case 2: - case 3: - return m_ppi8255n2->read(offset); - default: - LOG("p1ppi R %.2x (unimp)\n", 0x60 + offset); - return 0xff; - } -} - -void p1_state::p1_ppi_w(offs_t offset, uint8_t data) -{ - switch (offset) - { - case 0: - return m_ppi8255n1->write(0, data); - case 9: - case 10: - case 11: - return m_ppi8255n1->write(offset - 8, data); - case 8: - return m_ppi8255n2->write(0, data); - case 1: - case 2: - case 3: - return m_ppi8255n2->write(offset, data); - default: - LOG("p1ppi W %.2x $%02x (unimp)\n", 0x60 + offset, data); - return; - } -} - -/********************************************************** - * - * NMI handling - * - **********************************************************/ - -void p1_state::init_poisk1() -{ - address_space &program = m_maincpu->space(AS_PROGRAM); - - program.install_ram(0, m_ram->size() - 1, m_ram->pointer()); -} - -void p1_state::machine_start() -{ -} - -void p1_state::machine_reset() -{ - m_kbpoll_mask = 0; - m_hsync = 0; - m_vsync = 0; -} - -/* - * macros - */ - -void p1_state::fdc_config(device_t *device) -{ - p1_fdc_device &fdc = *downcast(device); - fdc.set_cpu(m_maincpu); -} - -void p1_state::poisk1_map(address_map &map) -{ - map.unmap_value_high(); - map(0xfc000, 0xfffff).rom().region("bios", 0xc000); -} - -// address decoder PROM maps 20-21, 28-2A, 40-43, 60-63, 68-6B, 3D4-3D5, and 3D8-3DA -void p1_state::poisk1_io(address_map &map) -{ - map(0x0020, 0x0021).rw(m_pic8259, FUNC(pic8259_device::read), FUNC(pic8259_device::write)); - map(0x0028, 0x002A).rw(FUNC(p1_state::p1_trap_r), FUNC(p1_state::p1_trap_w)); - map(0x0040, 0x0043).rw(m_pit8253, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); - // can't use regular rw(), because 1st PPI is mapped to 60, 69-6B and 2nd PPI -- to 68, 61-63 - map(0x0060, 0x006B).rw(FUNC(p1_state::p1_ppi_r), FUNC(p1_state::p1_ppi_w)); - map(0x03D0, 0x03DA).rw(FUNC(p1_state::p1_cga_r), FUNC(p1_state::p1_cga_w)); -} - -static INPUT_PORTS_START( poisk1 ) - PORT_INCLUDE( poisk1_keyboard_v91 ) -INPUT_PORTS_END - -void p1_state::poisk1(machine_config &config) -{ - /* basic machine hardware */ - I8088(config, m_maincpu, 5000000); - m_maincpu->set_addrmap(AS_PROGRAM, &p1_state::poisk1_map); - m_maincpu->set_addrmap(AS_IO, &p1_state::poisk1_io); - m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb)); - - PIT8253(config, m_pit8253); - m_pit8253->set_clk<0>(XTAL(15'000'000)/12); /* heartbeat IRQ */ - m_pit8253->out_handler<0>().set(m_pic8259, FUNC(pic8259_device::ir0_w)); - m_pit8253->set_clk<1>(XTAL(15'000'000)/12); /* keyboard poll -- XXX edge or level triggered? */ - m_pit8253->out_handler<1>().set(m_pic8259, FUNC(pic8259_device::ir6_w)); - m_pit8253->set_clk<2>(XTAL(15'000'000)/12); /* pio port c pin 4, and speaker polling enough */ - m_pit8253->out_handler<2>().set(FUNC(p1_state::p1_pit8253_out2_changed)); - - PIC8259(config, m_pic8259); - m_pic8259->out_int_callback().set_inputline(m_maincpu, 0); - - I8255A(config, m_ppi8255n1); - m_ppi8255n1->out_pa_callback().set(FUNC(p1_state::p1_ppi_porta_w)); // 60h - m_ppi8255n1->in_pb_callback().set(FUNC(p1_state::p1_ppi_portb_r)); // 69h - m_ppi8255n1->in_pc_callback().set(FUNC(p1_state::p1_ppi_portc_r)); // 6Ah - m_ppi8255n1->out_pc_callback().set(FUNC(p1_state::p1_ppi_portc_w)); - - I8255A(config, m_ppi8255n2); - m_ppi8255n2->out_pa_callback().set(FUNC(p1_state::p1_ppi2_porta_w)); // 68h - m_ppi8255n2->out_pb_callback().set(FUNC(p1_state::p1_ppi2_portb_w)); // 61h - m_ppi8255n2->in_pc_callback().set(FUNC(p1_state::p1_ppi2_portc_r)); // 62h and 3DAh - - ISA8(config, m_isabus, 0); - m_isabus->set_memspace("maincpu", AS_PROGRAM); - m_isabus->set_iospace("maincpu", AS_IO); - m_isabus->irq2_callback().set(m_pic8259, FUNC(pic8259_device::ir2_w)); - m_isabus->irq3_callback().set(m_pic8259, FUNC(pic8259_device::ir3_w)); - m_isabus->irq4_callback().set(m_pic8259, FUNC(pic8259_device::ir4_w)); - m_isabus->irq5_callback().set(m_pic8259, FUNC(pic8259_device::ir5_w)); - m_isabus->irq7_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w)); - m_isabus->iochrdy_callback().set_inputline(m_maincpu, INPUT_LINE_HALT); - - // FIXME: determine ISA bus clock - ISA8_SLOT(config, "isa1", 0, m_isabus, p1_isa8_cards, "fdc", false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); - ISA8_SLOT(config, "isa2", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); - ISA8_SLOT(config, "isa3", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); - ISA8_SLOT(config, "isa4", 0, m_isabus, p1_isa8_cards, nullptr, false).set_option_machine_config("fdc", [this](device_t *device) { fdc_config(device); }); - - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); - - // fake hsync - TIMER(config, "scantimer").configure_scanline(FUNC(p1_state::hsync_changed), "screen", 0, 1); - - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(XTAL(15'000'000), 912,0,640, 262,0,200); - m_screen->set_screen_update(FUNC(p1_state::screen_update)); - m_screen->screen_vblank().set(FUNC(p1_state::vsync_changed)); - - /* XXX verify palette */ - PALETTE(config, m_palette, FUNC(p1_state::p1_palette), CGA_PALETTE_SETS * 16); - - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - - SOFTWARE_LIST(config, "flop_list").set_original("poisk1_flop"); -// SOFTWARE_LIST(config, "cass_list").set_original("poisk1_cass"); - - /* internal ram */ - RAM(config, RAM_TAG).set_default_size("512K"); -} - -ROM_START( poisk1 ) - ROM_REGION(0x10000, "bios", 0) - - ROM_DEFAULT_BIOS("v91") - ROM_SYSTEM_BIOS(0, "v89r0", "1989r0") - ROMX_LOAD("bios.rf6", 0xe000, 0x2000, CRC(c0f333e3) SHA1(a44f355b7deae3693e1462d57543a42944fd0969), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v89", "1989") - ROMX_LOAD("biosp1s.rf4", 0xe000, 0x2000, CRC(1a85f671) SHA1(f0e59b2c4d92164abca55a96a58071ce869ff988), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v91", "1991") - ROMX_LOAD("poisk_1991.bin", 0xe000, 0x2000, CRC(d61c56fd) SHA1(de202e1f7422d585a1385a002a4fcf9d756236e5), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v91r2", "1991r2") - ROMX_LOAD("p_bios_nm.bin", 0xe000, 0x2000, CRC(84430b4f) SHA1(3e477962be3cea09662cb2e3ad9966ad01c7455d), ROM_BIOS(3)) - - ROM_SYSTEM_BIOS(4, "test1", "Test 1") - ROMX_LOAD("test1.rf6", 0x00000, 0x2000, CRC(a5f05dff) SHA1(21dd0cea605bd7be22e94f8355d86b2478d9527e), ROM_BIOS(4)) - ROM_SYSTEM_BIOS(5, "test2", "Test 2") - ROMX_LOAD("test2.rf6", 0x00000, 0x2000, CRC(eff730e4) SHA1(fcbc08de9b8592c974eaea837839f1a9caf36a75), ROM_BIOS(5)) - ROM_SYSTEM_BIOS(6, "test3", "Test 3") - ROMX_LOAD("test3.rf6", 0x00000, 0x2000, CRC(23025dc9) SHA1(dca4cb580162bb28f6e49ff625b677001d40d573), ROM_BIOS(6)) - ROM_SYSTEM_BIOS(7, "test4", "Test 4") - ROMX_LOAD("test4.rf6", 0x00000, 0x2000, CRC(aac8fc5e) SHA1(622abb5ac66d38a474ee54fe016aff0ba0b5794f), ROM_BIOS(7)) - ROM_SYSTEM_BIOS(8, "test5", "Test 5") - ROMX_LOAD("test5.rf6", 0x00000, 0x2000, CRC(f308e679) SHA1(37bd35f62015d338b3347fd4e3ec455eab048b66), ROM_BIOS(8)) - - // 0xc0000, sets 80x25 text and loops asking for 'Boot from hard disk (Y or N)?' - ROM_LOAD("boot_net.rf4", 0x00000, 0x2000, CRC(316c2030) SHA1(d043325596455772252e465b85321f1b5c529d0b)) // NET BIOS - // 0xc0000, accesses ports 0x90..0x97 - ROM_LOAD("pois_net.bin", 0x00000, 0x2000, CRC(cf9dd80a) SHA1(566bcb40c0cb2c8bfd5b485f0db689fdeaca3e86)) // ??? BIOS - - ROM_REGION(0x2000,"gfx1", ROMREGION_ERASE00) - ROM_LOAD("poisk.cga", 0x0000, 0x0800, CRC(f6eb39f0) SHA1(0b788d8d7a8e92cc612d044abcb2523ad964c200)) -ROM_END - -/*************************************************************************** - - Game driver(s) - -***************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1989, poisk1, ibm5150, 0, poisk1, poisk1, p1_state, init_poisk1, "Electronmash", "Poisk-1", 0 ) -- cgit v1.2.3