diff options
author | 2014-10-08 16:42:01 +0000 | |
---|---|---|
committer | 2014-10-08 16:42:01 +0000 | |
commit | 278a884012d0fffe57297c346f782eda3bd8c616 (patch) | |
tree | 740296e41a141f68c32cc7d4167841ead84736ee | |
parent | 03f8deff8afcf7470a319b3cd9042d3f3b6d6f17 (diff) |
(MESS) intv: converted the driver to use slot devices for
cartridges and implemented the IntelliVoice expansion and
the Entertainment Computer System expansion as passthru
devices. The official syntax to launch games requiring the
speech expansion is now
mess intv -cart voice -cart2 gamename
which corresponds to mounting the IntelliVoice and plugging
the game cart in its subslot. The official syntax to launch games
requiring the ECS expansion is now instead
mess intv -cart ecs -cart2 gamename
and
mess intv -cart ecs -cart2 voice -cart3 gamename
if the game requires both expansions at once. For additional user
friendliness, we also offer intvecs (which emulates an Intellivision
unit with both expansions added) and intvoice (which emulates
an Intellivision with Intellivoice expansion added) drivers, where
games can simply be mounted with the -cart media switch. [Fabio
Priuli]
-rw-r--r-- | .gitattributes | 8 | ||||
-rw-r--r-- | hash/intv.xml | 606 | ||||
-rw-r--r-- | hash/intvecs.xml | 55 | ||||
-rw-r--r-- | src/emu/bus/bus.mak | 14 | ||||
-rw-r--r-- | src/emu/bus/intv/ecs.c | 588 | ||||
-rw-r--r-- | src/emu/bus/intv/ecs.h | 145 | ||||
-rw-r--r-- | src/emu/bus/intv/rom.c | 50 | ||||
-rw-r--r-- | src/emu/bus/intv/rom.h | 82 | ||||
-rw-r--r-- | src/emu/bus/intv/slot.c | 572 | ||||
-rw-r--r-- | src/emu/bus/intv/slot.h | 184 | ||||
-rw-r--r-- | src/emu/bus/intv/voice.c | 122 | ||||
-rw-r--r-- | src/emu/bus/intv/voice.h | 76 | ||||
-rw-r--r-- | src/mess/drivers/intv.c | 570 | ||||
-rw-r--r-- | src/mess/includes/intv.h | 66 | ||||
-rw-r--r-- | src/mess/machine/intv.c | 475 | ||||
-rw-r--r-- | src/mess/mess.lst | 3 | ||||
-rw-r--r-- | src/mess/mess.mak | 1 |
17 files changed, 2502 insertions, 1115 deletions
diff --git a/.gitattributes b/.gitattributes index 168bc3d734e..f05d4ad281e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -922,6 +922,14 @@ src/emu/bus/imi7000/imi5000h.c svneol=native#text/plain src/emu/bus/imi7000/imi5000h.h svneol=native#text/plain src/emu/bus/imi7000/imi7000.c svneol=native#text/plain src/emu/bus/imi7000/imi7000.h svneol=native#text/plain +src/emu/bus/intv/ecs.c svneol=native#text/plain +src/emu/bus/intv/ecs.h svneol=native#text/plain +src/emu/bus/intv/rom.c svneol=native#text/plain +src/emu/bus/intv/rom.h svneol=native#text/plain +src/emu/bus/intv/slot.c svneol=native#text/plain +src/emu/bus/intv/slot.h svneol=native#text/plain +src/emu/bus/intv/voice.c svneol=native#text/plain +src/emu/bus/intv/voice.h svneol=native#text/plain src/emu/bus/iq151/disc2.c svneol=native#text/plain src/emu/bus/iq151/disc2.h svneol=native#text/plain src/emu/bus/iq151/grafik.c svneol=native#text/plain diff --git a/hash/intv.xml b/hash/intv.xml index 6a4da1a5f7e..0fdfe80fb07 100644 --- a/hash/intv.xml +++ b/hash/intv.xml @@ -19,8 +19,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1119"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="abpa backgammon.50" size="0x2000" crc="a60e25fc" sha1="71b305f30283a11ccd594071a7e9ea06db6a2071" offset="0000"/> + <rom name="abpa backgammon.50" size="0x2000" crc="a60e25fc" sha1="71b305f30283a11ccd594071a7e9ea06db6a2071" offset="0x0000"/> </dataarea> </part> </software> @@ -31,8 +32,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3410"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x3000"> - <rom name="advanced dungeons and dragons.50" size="0x3000" crc="9d4355aa" sha1="4783cf6d52748e1cc4eb463033b79aee72db28cf" offset="0000"/> + <rom name="advanced dungeons and dragons.50" size="0x3000" crc="9d4355aa" sha1="4783cf6d52748e1cc4eb463033b79aee72db28cf" offset="0x0000"/> </dataarea> </part> </software> @@ -43,8 +45,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5300"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="add - treasure of tarmin.50" size="0x4000" crc="16c3b62f" sha1="deffe81ac52caa93401ca2aaed734a1fb69c498d" offset="0000"/> + <rom name="add - treasure of tarmin.50" size="0x4000" crc="16c3b62f" sha1="deffe81ac52caa93401ca2aaed734a1fb69c498d" offset="0x0000"/> </dataarea> </part> </software> @@ -55,8 +58,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1121"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="armor battle.50" size="0x2000" crc="6f91fbc1" sha1="8bf07ba83bd0de42393187c6a3df60b8e341505d" offset="0000"/> + <rom name="armor battle.50" size="0x2000" crc="6f91fbc1" sha1="8bf07ba83bd0de42393187c6a3df60b8e341505d" offset="0x0000"/> </dataarea> </part> </software> @@ -67,8 +71,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3605"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="astro smash.50" size="0x2000" crc="fab2992c" sha1="d3529cad339b3fd5c67b4f503e9360188be9d3e8" offset="0000"/> + <rom name="astro smash.50" size="0x2000" crc="fab2992c" sha1="d3529cad339b3fd5c67b4f503e9360188be9d3e8" offset="0x0000"/> </dataarea> </part> </software> @@ -79,8 +84,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720006"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="4800" size="0x4000"> - <rom name="atlantis.48" size="0x4000" crc="13ff363c" sha1="094b207668c03a6d903270490f495ddc237cd8d7" offset="0000"/> + <rom name="atlantis.48" size="0x4000" crc="13ff363c" sha1="094b207668c03a6d903270490f495ddc237cd8d7" offset="0x0000"/> </dataarea> </part> </software> @@ -91,8 +97,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1113"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="auto racing.50" size="0x2000" crc="b35c1101" sha1="2e3461853f60a1928c5c93bb23deb9229e0230c9" offset="0000"/> + <rom name="auto racing.50" size="0x2000" crc="b35c1101" sha1="2e3461853f60a1928c5c93bb23deb9229e0230c9" offset="0x0000"/> </dataarea> </part> </software> @@ -104,11 +111,12 @@ <info name="serial" value="3884"/> <info name="usage" value="Uses Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="b-17 bomber.50" size="0x4000" crc="5f612afb" sha1="8b9b7d938590ede5fe651f165f405ffc9e41cabd" offset="0000"/> + <rom name="b-17 bomber.50" size="0x4000" crc="5f612afb" sha1="8b9b7d938590ede5fe651f165f405ffc9e41cabd" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="b-17 bomber.d0" size="0x2000" crc="3e932009" sha1="f0fcc934ba19a9e88b470a99a2d984820369c57c" offset="0000"/> + <rom name="b-17 bomber.d0" size="0x2000" crc="3e932009" sha1="f0fcc934ba19a9e88b470a99a2d984820369c57c" offset="0x0000"/> </dataarea> </part> </software> @@ -119,8 +127,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2614"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="baseball.50" size="0x2000" crc="dab36628" sha1="5e83a945f231f55d5ddfa9527f9b94da06e77058" offset="0000"/> + <rom name="baseball.50" size="0x2000" crc="dab36628" sha1="5e83a945f231f55d5ddfa9527f9b94da06e77058" offset="0x0000"/> </dataarea> </part> </software> @@ -131,8 +140,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2615"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="basketball.50" size="0x2000" crc="81e7fb8c" sha1="9c855e864cf926dfd3d09c071e499d7ccd537908" offset="0000"/> + <rom name="basketball.50" size="0x2000" crc="81e7fb8c" sha1="9c855e864cf926dfd3d09c071e499d7ccd537908" offset="0x0000"/> </dataarea> </part> </software> @@ -143,8 +153,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-005-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="beamrider.50" size="0x4000" crc="eaf650cc" sha1="1faa1d401bc7484492f3e1de433ed73019cbb5b5" offset="0000"/> + <rom name="beamrider.50" size="0x4000" crc="eaf650cc" sha1="1faa1d401bc7484492f3e1de433ed73019cbb5b5" offset="0x0000"/> </dataarea> </part> </software> @@ -155,8 +166,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720007"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="4800" size="0x4000"> - <rom name="beauty and the beast.48" size="0x4000" crc="c047d487" sha1="1b6fd19e745e50e8ea679bd5adfb719d1f276bc5" offset="0000"/> + <rom name="beauty and the beast.48" size="0x4000" crc="c047d487" sha1="1b6fd19e745e50e8ea679bd5adfb719d1f276bc5" offset="0x0000"/> </dataarea> </part> </software> @@ -167,8 +179,9 @@ <publisher>Interphase</publisher> <info name="serial" value="8010001"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="blockade runner.50" size="0x4000" crc="b03f739b" sha1="c82058d9678fe2453b0f9b7a4a0864af802f6eb9" offset="0000"/> + <rom name="blockade runner.50" size="0x4000" crc="b03f739b" sha1="c82058d9678fe2453b0f9b7a4a0864af802f6eb9" offset="0x0000"/> </dataarea> </part> </software> @@ -179,11 +192,12 @@ <publisher>INTV</publisher> <info name="serial" value="9009"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="body slam - super pro wrestling.50" size="0x4000" crc="6b0e89c8" sha1="18193484e0a4995d3ffd9826a9dc3b6579950acf" offset="0000"/> + <rom name="body slam - super pro wrestling.50" size="0x4000" crc="6b0e89c8" sha1="18193484e0a4995d3ffd9826a9dc3b6579950acf" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="body slam - super pro wrestling.90" size="0x4000" crc="79800b37" sha1="abc79afabc4273c01657de04de567e34b479bc70" offset="0000"/> + <rom name="body slam - super pro wrestling.90" size="0x4000" crc="79800b37" sha1="abc79afabc4273c01657de04de567e34b479bc70" offset="0x0000"/> </dataarea> </part> </software> @@ -195,11 +209,12 @@ <info name="serial" value="3883"/> <info name="usage" value="Uses Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="bomb squad.50" size="0x4000" crc="6f34430f" sha1="2c101e5241856691debc75b8012e35e696689c3d" offset="0000"/> + <rom name="bomb squad.50" size="0x4000" crc="6f34430f" sha1="2c101e5241856691debc75b8012e35e696689c3d" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="bomb squad.d0" size="0x2000" crc="f99180e1" sha1="8d4a7ca33fc9ac5db8b1bdcf8806d899c898ae03" offset="0000"/> + <rom name="bomb squad.d0" size="0x2000" crc="f99180e1" sha1="8d4a7ca33fc9ac5db8b1bdcf8806d899c898ae03" offset="0x0000"/> </dataarea> </part> </software> @@ -210,8 +225,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3333"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="bowling.50" size="0x2000" crc="169e3584" sha1="71a2bf83f18fdbf4db3af66681fcfa506bf0d31c" offset="0000"/> + <rom name="bowling.50" size="0x2000" crc="169e3584" sha1="71a2bf83f18fdbf4db3af66681fcfa506bf0d31c" offset="0x0000"/> </dataarea> </part> </software> @@ -222,8 +238,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1819"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="boxing.50" size="0x2000" crc="ab87c16f" sha1="24a10945009acadfe502a5bd5fb5b960885716f4" offset="0000"/> + <rom name="boxing.50" size="0x2000" crc="ab87c16f" sha1="24a10945009acadfe502a5bd5fb5b960885716f4" offset="0x0000"/> </dataarea> </part> </software> @@ -234,14 +251,15 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4688"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="bump n jump.50" size="0x4000" crc="6f667338" sha1="bdb657130dc9421fad842bbbc9ba7ac380ed0c86" offset="0000"/> + <rom name="bump n jump.50" size="0x4000" crc="6f667338" sha1="bdb657130dc9421fad842bbbc9ba7ac380ed0c86" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="bump n jump.d0" size="0x2000" crc="96265252" sha1="3919925e229e7ec57d726245f13c034f78b7d863" offset="0000"/> + <rom name="bump n jump.d0" size="0x2000" crc="96265252" sha1="3919925e229e7ec57d726245f13c034f78b7d863" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="bump n jump.f0" size="0x2000" crc="038df644" sha1="cb60703bffcbfaec77098a9525136c32cbe260f8" offset="0000"/> + <rom name="bump n jump.f0" size="0x2000" crc="038df644" sha1="cb60703bffcbfaec77098a9525136c32cbe260f8" offset="0x0000"/> </dataarea> </part> </software> @@ -252,8 +270,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4549"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="burgertime.50" size="0x4000" crc="43806375" sha1="eacd83365da40a1a3d6c77ca2da4a0393460e02f" offset="0000"/> + <rom name="burgertime.50" size="0x4000" crc="43806375" sha1="eacd83365da40a1a3d6c77ca2da4a0393460e02f" offset="0x0000"/> </dataarea> </part> </software> @@ -264,8 +283,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4436"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="buzz bombers.50" size="0x4000" crc="fa492bbd" sha1="a0ef9a23976de6ee88c1f970a6585ded2a2b8c04" offset="0000"/> + <rom name="buzz bombers.50" size="0x4000" crc="fa492bbd" sha1="a0ef9a23976de6ee88c1f970a6585ded2a2b8c04" offset="0x0000"/> </dataarea> </part> </software> @@ -277,8 +297,9 @@ <info name="serial" value="2488"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="carnival.50" size="0x2000" crc="43870908" sha1="13aa104e884701d74e144b85b9583579d1980e80" offset="0000"/> + <rom name="carnival.50" size="0x2000" crc="43870908" sha1="13aa104e884701d74e144b85b9583579d1980e80" offset="0x0000"/> </dataarea> </part> </software> @@ -289,8 +310,9 @@ <publisher>Atarisoft</publisher> <info name="serial" value="70254"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="6000" size="0x4000"> - <rom name="centipede.60" size="0x4000" crc="d5363b8c" sha1="97c69dc3da5aee80e6ef1baf90b6c3ec8025abff" offset="0000"/> + <rom name="centipede.60" size="0x4000" crc="d5363b8c" sha1="97c69dc3da5aee80e6ef1baf90b6c3ec8025abff" offset="0x0000"/> </dataarea> </part> </software> @@ -301,11 +323,12 @@ <publisher>INTV</publisher> <info name="serial" value="8200"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="championship tennis.50" size="0x4000" crc="59d1eaf3" sha1="e836a9712238843a2e319d8d9618b58373ebacbd" offset="0000"/> + <rom name="championship tennis.50" size="0x4000" crc="59d1eaf3" sha1="e836a9712238843a2e319d8d9618b58373ebacbd" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="championship tennis.d0" size="0x4000" crc="c7dd6388" sha1="446514366065262ea9658e4ba399e84b2a249fb8" offset="0000"/> + <rom name="championship tennis.d0" size="0x4000" crc="c7dd6388" sha1="446514366065262ea9658e4ba399e84b2a249fb8" offset="0x0000"/> </dataarea> </part> </software> @@ -316,8 +339,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1120"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="checkers.50" size="0x2000" crc="36e1d858" sha1="4fef3342c0e7100113b4022e4395ad552fddacf1" offset="0000"/> + <rom name="checkers.50" size="0x2000" crc="36e1d858" sha1="4fef3342c0e7100113b4022e4395ad552fddacf1" offset="0x0000"/> </dataarea> </part> </software> @@ -329,10 +353,11 @@ <info name="serial" value="3412"/> <info name="usage" value="This cart has unique Left and Right overlays"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_ram" /> <dataarea name="5000" size="0x4000"> - <rom name="ro-3-9505-359 + ro-3-9506-011.50" size="0x4000" crc="752fd927" sha1="4ccf494f9664d5b9e05237d1bc2eee8a7830f067" offset="0000"/> + <rom name="ro-3-9505-359 + ro-3-9506-011.50" size="0x4000" crc="752fd927" sha1="4ccf494f9664d5b9e05237d1bc2eee8a7830f067" offset="0x0000"/> </dataarea> - <dataarea name="D000_RAM8" size="0x400"> + <dataarea name="ram" size="0x400"> </dataarea> </part> </software> @@ -343,11 +368,12 @@ <publisher>INTV</publisher> <info name="serial" value="8900"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="chip shot - super pro golf.50" size="0x4000" crc="0488dc76" sha1="9094f89777e7aa4d4caea7f35c91ee5403e14877" offset="0000"/> + <rom name="chip shot - super pro golf.50" size="0x4000" crc="0488dc76" sha1="9094f89777e7aa4d4caea7f35c91ee5403e14877" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="chip shot - super pro golf.90" size="0x4000" crc="6089038d" sha1="23390658f2c634ba5a3d1f40d72854c44ba3deb0" offset="0000"/> + <rom name="chip shot - super pro golf.90" size="0x4000" crc="6089038d" sha1="23390658f2c634ba5a3d1f40d72854c44ba3deb0" offset="0x0000"/> </dataarea> </part> </software> @@ -358,11 +384,12 @@ <publisher>INTV</publisher> <info name="serial" value="9000"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="commando.50" size="0x4000" crc="2b6d633d" sha1="777e5a0e7033b5f80197eb069cd204e62d09eb63" offset="0000"/> + <rom name="commando.50" size="0x4000" crc="2b6d633d" sha1="777e5a0e7033b5f80197eb069cd204e62d09eb63" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="commando.90" size="0x4000" crc="fc44ea3c" sha1="5a95ea2924d3b0bfc4e353d6ffc4966f4bdfcd58" offset="0000"/> + <rom name="commando.90" size="0x4000" crc="fc44ea3c" sha1="5a95ea2924d3b0bfc4e353d6ffc4966f4bdfcd58" offset="0x0000"/> </dataarea> </part> </software> @@ -373,8 +400,9 @@ <publisher>Sega</publisher> <info name="serial" value="006-06"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x6000"> - <rom name="congo bongo.50" size="0x6000" crc="4b23a757" sha1="3d467d13e34e231971e8aef86968f199c145b9b2" offset="0000"/> + <rom name="congo bongo.50" size="0x6000" crc="4b23a757" sha1="3d467d13e34e231971e8aef86968f199c145b9b2" offset="0x0000"/> </dataarea> </part> </software> @@ -385,8 +413,9 @@ <publisher>Atarisoft</publisher> <info name="serial" value="70252"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x6000"> - <rom name="defender.50" size="0x6000" crc="d8f99aa2" sha1="85af8649c04198b00cecdea2661192db6631dc80" offset="0000"/> + <rom name="defender.50" size="0x6000" crc="d8f99aa2" sha1="85af8649c04198b00cecdea2661192db6631dc80" offset="0x0000"/> </dataarea> </part> </software> @@ -397,8 +426,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720005"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="4800" size="0x4000"> - <rom name="demon attack.48" size="0x4000" crc="5e6a8cd8" sha1="d6054e8ead16f3e076c26880fe641543e8519e18" offset="0000"/> + <rom name="demon attack.48" size="0x4000" crc="5e6a8cd8" sha1="d6054e8ead16f3e076c26880fe641543e8519e18" offset="0x0000"/> </dataarea> </part> </software> @@ -409,8 +439,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1682-0950"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x3000"> - <rom name="blue demo cart.50" size="0x3000" crc="c99e7554" sha1="faa9b42fabc84f26ca15d296f9a5e16f36e465c2" offset="0000"/> + <rom name="blue demo cart.50" size="0x3000" crc="c99e7554" sha1="faa9b42fabc84f26ca15d296f9a5e16f36e465c2" offset="0x0000"/> </dataarea> </part> </software> @@ -421,8 +452,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5032-0710"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="red revised demo cart.50" size="0x4000" crc="0487675c" sha1="1744dd7db17b715cd2ef1c1b315d412ea6e20163" offset="0000"/> + <rom name="red revised demo cart.50" size="0x4000" crc="0487675c" sha1="1744dd7db17b715cd2ef1c1b315d412ea6e20163" offset="0x0000"/> </dataarea> </part> </software> @@ -433,11 +465,12 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5823-0210"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="green demo cart.50" size="0x4000" crc="52609fec" sha1="780183183d4d1fc1a23a9a0435788c3b750003d1" offset="0000"/> + <rom name="green demo cart.50" size="0x4000" crc="52609fec" sha1="780183183d4d1fc1a23a9a0435788c3b750003d1" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="green demo cart.d0" size="0x4000" crc="9b37afbe" sha1="ad5d06b040f2ddea2b4ab9f0e98d77ee7c310498" offset="0000"/> + <rom name="green demo cart.d0" size="0x4000" crc="9b37afbe" sha1="ad5d06b040f2ddea2b4ab9f0e98d77ee7c310498" offset="0x0000"/> </dataarea> </part> </software> @@ -447,11 +480,12 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="international demo cart.50" size="0x4000" crc="5d575728" sha1="b663031fff53ff36942c5f325d25e913dd8367f1" offset="0000"/> + <rom name="international demo cart.50" size="0x4000" crc="5d575728" sha1="b663031fff53ff36942c5f325d25e913dd8367f1" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="international demo cart.d0" size="0x2000" crc="7a837bc9" sha1="dcc708901b391fc62bf799fa2e9db4551f93ba8f" offset="0000"/> + <rom name="international demo cart.d0" size="0x2000" crc="7a837bc9" sha1="dcc708901b391fc62bf799fa2e9db4551f93ba8f" offset="0x0000"/> </dataarea> </part> </software> @@ -462,14 +496,15 @@ <publisher>INTV</publisher> <info name="serial" value="9005"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="dig dug.50" size="0x4000" crc="dcee5827" sha1="0cd925a9e42c8cba27462b10e8925a0d64aa8870" offset="0000"/> + <rom name="dig dug.50" size="0x4000" crc="dcee5827" sha1="0cd925a9e42c8cba27462b10e8925a0d64aa8870" offset="0x0000"/> </dataarea> <dataarea name="7000" size="0x2000"> - <rom name="dig dug.70" size="0x2000" crc="42e97dbe" sha1="5c8181af208daa76c0b992ce4d78fb918f752cae" offset="0000"/> + <rom name="dig dug.70" size="0x2000" crc="42e97dbe" sha1="5c8181af208daa76c0b992ce4d78fb918f752cae" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x2000"> - <rom name="dig dug.90" size="0x2000" crc="04ff025d" sha1="52e4f152b68238b3a102aeec4efa789462de2cc5" offset="0000"/> + <rom name="dig dug.90" size="0x2000" crc="04ff025d" sha1="52e4f152b68238b3a102aeec4efa789462de2cc5" offset="0x0000"/> </dataarea> </part> </software> @@ -480,11 +515,12 @@ <publisher>INTV</publisher> <info name="serial" value="8800"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="diner.50" size="0x4000" crc="1190a27c" sha1="594b1474396a5414d40d367a8d7c8f783eae701c" offset="0000"/> + <rom name="diner.50" size="0x4000" crc="1190a27c" sha1="594b1474396a5414d40d367a8d7c8f783eae701c" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="diner.90" size="0x4000" crc="16e17499" sha1="e2b5569606030ba26d0dcd0a6e3c3e338f23d70a" offset="0000"/> + <rom name="diner.90" size="0x4000" crc="16e17499" sha1="e2b5569606030ba26d0dcd0a6e3c3e338f23d70a" offset="0x0000"/> </dataarea> </part> </software> @@ -496,8 +532,9 @@ <info name="serial" value="2471"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="donkey kong.50" size="0x2000" crc="c30f61c0" sha1="93807afeee023ce6c787b073705c8bf32bbd8abf" offset="0000"/> + <rom name="donkey kong.50" size="0x2000" crc="c30f61c0" sha1="93807afeee023ce6c787b073705c8bf32bbd8abf" offset="0x0000"/> </dataarea> </part> </software> @@ -508,8 +545,9 @@ <publisher>Coleco</publisher> <info name="serial" value="2671"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="donkey kong jr.50" size="0x4000" crc="6df61a9f" sha1="9d983308ef7051eef0c324e696776a6f9b9c38d4" offset="0000"/> + <rom name="donkey kong jr.50" size="0x4000" crc="6df61a9f" sha1="9d983308ef7051eef0c324e696776a6f9b9c38d4" offset="0x0000"/> </dataarea> </part> </software> @@ -520,8 +558,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720018"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="dracula.50" size="0x4000" crc="84bedcc1" sha1="d211da07ab620854ee7a2de3bc103d71d649612f" offset="0000"/> + <rom name="dracula.50" size="0x4000" crc="84bedcc1" sha1="d211da07ab620854ee7a2de3bc103d71d649612f" offset="0x0000"/> </dataarea> </part> </software> @@ -532,8 +571,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720010"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="dragonfire.50" size="0x2000" crc="af8718a1" sha1="dd6b105c7de9f29e98f11466b063b477af7c3260" offset="0000"/> + <rom name="dragonfire.50" size="0x2000" crc="af8718a1" sha1="dd6b105c7de9f29e98f11466b063b477af7c3260" offset="0x0000"/> </dataarea> </part> </software> @@ -544,8 +584,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-004-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="dreadnaught factor.50" size="0x4000" crc="3b99b889" sha1="f8a3224023b0dd27bc4a38b722e2d8016b08ce73" offset="0000"/> + <rom name="dreadnaught factor.50" size="0x4000" crc="3b99b889" sha1="f8a3224023b0dd27bc4a38b722e2d8016b08ce73" offset="0x0000"/> </dataarea> </part> </software> @@ -556,8 +597,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2613"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="electric company - math fun.50" size="0x2000" crc="54a3fc11" sha1="6cdb18d1dd3cd57058263904934b37d4713342e6" offset="0000"/> + <rom name="electric company - math fun.50" size="0x2000" crc="54a3fc11" sha1="6cdb18d1dd3cd57058263904934b37d4713342e6" offset="0x0000"/> </dataarea> </part> </software> @@ -569,8 +611,9 @@ <info name="serial" value="1122"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="electric company - word fun.50" size="0x2000" crc="c9eaacab" sha1="d3934c328465f0fb423e6a43fcc57018b78da6b9" offset="0000"/> + <rom name="electric company - word fun.50" size="0x2000" crc="c9eaacab" sha1="d3934c328465f0fb423e6a43fcc57018b78da6b9" offset="0x0000"/> </dataarea> </part> </software> @@ -581,8 +624,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720026"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="fathom.50" size="0x4000" crc="4221ede7" sha1="49646878c9698c9749b3665110acde0906b8f69c" offset="0000"/> + <rom name="fathom.50" size="0x4000" crc="4221ede7" sha1="49646878c9698c9749b3665110acde0906b8f69c" offset="0x0000"/> </dataarea> </part> </software> @@ -593,8 +637,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2610"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="football.50" size="0x2000" crc="4b91cf16" sha1="525dffeb7b53c88bd2e8076c421388ed72e2c90d" offset="0000"/> + <rom name="football.50" size="0x2000" crc="4b91cf16" sha1="525dffeb7b53c88bd2e8076c421388ed72e2c90d" offset="0x0000"/> </dataarea> </part> </software> @@ -605,8 +650,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5301"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="frog bog.50" size="0x2000" crc="37222762" sha1="58842e4425ad5a8f6ec65528c4b485039057f289" offset="0000"/> + <rom name="frog bog.50" size="0x2000" crc="37222762" sha1="58842e4425ad5a8f6ec65528c4b485039057f289" offset="0x0000"/> </dataarea> </part> </software> @@ -617,8 +663,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6300"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="frogger.50" size="0x2000" crc="d27495e9" sha1="c84f2a2f0007de06057f7e22a489f76def482c86" offset="0000"/> + <rom name="frogger.50" size="0x2000" crc="d27495e9" sha1="c84f2a2f0007de06057f7e22a489f76def482c86" offset="0x0000"/> </dataarea> </part> </software> @@ -629,8 +676,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1816"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="golf.50" size="0x2000" crc="ff87faec" sha1="5bbbdadb74fe62546594a4778928cf1287016083" offset="0000"/> + <rom name="golf.50" size="0x2000" crc="ff87faec" sha1="5bbbdadb74fe62546594a4778928cf1287016083" offset="0x0000"/> </dataarea> </part> </software> @@ -641,8 +689,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-003-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="happy trails.50" size="0x2000" crc="4b8c5932" sha1="5bd74fd0246da1441f4af76dc9592f7809f8a821" offset="0000"/> + <rom name="happy trails.50" size="0x2000" crc="4b8c5932" sha1="5bd74fd0246da1441f4af76dc9592f7809f8a821" offset="0x0000"/> </dataarea> </part> </software> @@ -653,8 +702,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1114"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="hockey.50" size="0x2000" crc="76564a13" sha1="3395c6764f60d90d96966b28ee96742b5782d59f" offset="0000"/> + <rom name="hockey.50" size="0x2000" crc="76564a13" sha1="3395c6764f60d90d96966b28ee96742b5782d59f" offset="0x0000"/> </dataarea> </part> </software> @@ -665,8 +715,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1123"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="horse racing.50" size="0x2000" crc="b5c7f25d" sha1="bd024190395a6d5c9aecadb49d59511e265ff7b3" offset="0000"/> + <rom name="horse racing.50" size="0x2000" crc="b5c7f25d" sha1="bd024190395a6d5c9aecadb49d59511e265ff7b3" offset="0x0000"/> </dataarea> </part> </software> @@ -677,14 +728,15 @@ <publisher>INTV</publisher> <info name="serial" value="8500"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="hover force.50" size="0x4000" crc="4c3644b8" sha1="4cf770275315480d11c2bb8506fe49175e4f1a68" offset="0000"/> + <rom name="hover force.50" size="0x4000" crc="4c3644b8" sha1="4cf770275315480d11c2bb8506fe49175e4f1a68" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x6000"> - <rom name="hover force.90" size="0x6000" crc="75d45110" sha1="f7d9d7c932be1cbf65dcfff0cfdab9e8b8f86661" offset="0000"/> + <rom name="hover force.90" size="0x6000" crc="75d45110" sha1="f7d9d7c932be1cbf65dcfff0cfdab9e8b8f86661" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="hover force.d0" size="0x2000" crc="ed7c8fac" sha1="140986d67ba22e5c344e27ac74fa3e14f35097e7" offset="0000"/> + <rom name="hover force.d0" size="0x2000" crc="ed7c8fac" sha1="140986d67ba22e5c344e27ac74fa3e14f35097e7" offset="0x0000"/> </dataarea> </part> </software> @@ -695,8 +747,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720012"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="ice trek.50" size="0x4000" crc="4f3e3f69" sha1="d70bd2d71227faba51de575df110818ed50bdee7" offset="0000"/> + <rom name="ice trek.50" size="0x4000" crc="4f3e3f69" sha1="d70bd2d71227faba51de575df110818ed50bdee7" offset="0x0000"/> </dataarea> </part> </software> @@ -707,8 +760,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4675"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="kool-aid man.50" size="0x4000" crc="8c9819a2" sha1="9ceab1a49090c4d8b55b3e85c845b1d3a5537ddb" offset="0000"/> + <rom name="kool-aid man.50" size="0x4000" crc="8c9819a2" sha1="9ceab1a49090c4d8b55b3e85c845b1d3a5537ddb" offset="0x0000"/> </dataarea> </part> </software> @@ -719,8 +773,9 @@ <publisher>Coleco</publisher> <info name="serial" value="2483"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="lady bug.50" size="0x4000" crc="a6840736" sha1="ca3f0d52fc077c98becefe3e566895807840152a" offset="0000"/> + <rom name="lady bug.50" size="0x4000" crc="a6840736" sha1="ca3f0d52fc077c98becefe3e566895807840152a" offset="0x0000"/> </dataarea> </part> </software> @@ -731,8 +786,9 @@ <publisher>INTV</publisher> <info name="serial" value="9002"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="learning fun i.50" size="0x4000" crc="2c5fd5fa" sha1="6eeaeb4ca39d30b6255814cd9f92cf8d092c393d" offset="0000"/> + <rom name="learning fun i.50" size="0x4000" crc="2c5fd5fa" sha1="6eeaeb4ca39d30b6255814cd9f92cf8d092c393d" offset="0x0000"/> </dataarea> </part> </software> @@ -743,8 +799,9 @@ <publisher>INTV</publisher> <info name="serial" value="9006"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="learning fun ii.50" size="0x4000" crc="632f6adf" sha1="134af61bc7b06489d35a7474f8a29ef80db6f332" offset="0000"/> + <rom name="learning fun ii.50" size="0x4000" crc="632f6adf" sha1="134af61bc7b06489d35a7474f8a29ef80db6f332" offset="0x0000"/> </dataarea> </part> </software> @@ -755,8 +812,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5637"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x3000"> - <rom name="lock n chase (6k).50" size="0x3000" crc="04977992" sha1="08454a5f7b44730aa8249623785dd7a6471ab98f" offset="0000"/> + <rom name="lock n chase (6k).50" size="0x3000" crc="04977992" sha1="08454a5f7b44730aa8249623785dd7a6471ab98f" offset="0x0000"/> </dataarea> </part> </software> @@ -767,8 +825,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5637"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="lock n chase (later version).50" size="0x4000" crc="5c7e9848" sha1="ac889a1d76b40be1a7e7562c8cb8b3f9d00f3728" offset="0000"/> + <rom name="lock n chase (later version).50" size="0x4000" crc="5c7e9848" sha1="ac889a1d76b40be1a7e7562c8cb8b3f9d00f3728" offset="0x0000"/> </dataarea> </part> </software> @@ -779,8 +838,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4438"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="loco-motion.50" size="0x4000" crc="6b6e80ee" sha1="a5479d68f90d77234b6acc4d7ee93a356d5fd961" offset="0000"/> + <rom name="loco-motion.50" size="0x4000" crc="6b6e80ee" sha1="a5479d68f90d77234b6acc4d7ee93a356d5fd961" offset="0x0000"/> </dataarea> </part> </software> @@ -791,14 +851,15 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4689"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="masters of the universe.50" size="0x4000" crc="143e8ca2" sha1="0f54ee719269ac96443ceab78f96224ce1516296" offset="0000"/> + <rom name="masters of the universe.50" size="0x4000" crc="143e8ca2" sha1="0f54ee719269ac96443ceab78f96224ce1516296" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="masters of the universe.d0" size="0x2000" crc="9c94b9f8" sha1="b18daefc51c709e7f0e20df0b937faded3a51fe9" offset="0000"/> + <rom name="masters of the universe.d0" size="0x2000" crc="9c94b9f8" sha1="b18daefc51c709e7f0e20df0b937faded3a51fe9" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="masters of the universe.f0" size="0x2000" crc="7655e78a" sha1="c11533e250ab71ea27d0fec0225ddfbd69b17c41" offset="0000"/> + <rom name="masters of the universe.f0" size="0x2000" crc="7655e78a" sha1="c11533e250ab71ea27d0fec0225ddfbd69b17c41" offset="0x0000"/> </dataarea> </part> </software> @@ -809,8 +870,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="4437"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="mission x.50" size="0x4000" crc="11fb9974" sha1="2e6760f418f4e54a244fe1baa57e573573cc1b7d" offset="0000"/> + <rom name="mission x.50" size="0x4000" crc="11fb9974" sha1="2e6760f418f4e54a244fe1baa57e573573cc1b7d" offset="0x0000"/> </dataarea> </part> </software> @@ -822,8 +884,9 @@ <info name="serial" value="720013"/> <info name="usage" value="This cart has unique Left and Right overlays"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="4800" size="0x4000"> - <rom name="microsurgeon.48" size="0x4000" crc="e806ad91" sha1="1390f0076470504037720b20f84404d502988231" offset="0000"/> + <rom name="microsurgeon.48" size="0x4000" crc="e806ad91" sha1="1390f0076470504037720b20f84404d502988231" offset="0x0000"/> </dataarea> </part> </software> @@ -834,8 +897,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3411"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="motocross.50" size="0x4000" crc="5f6e1af6" sha1="109e0a05e73239962ded327827c7957960802744" offset="0000"/> + <rom name="motocross.50" size="0x4000" crc="5f6e1af6" sha1="109e0a05e73239962ded327827c7957960802744" offset="0x0000"/> </dataarea> </part> </software> @@ -846,8 +910,9 @@ <publisher>INTV</publisher> <info name="serial" value="9007"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="mountain madness - super pro skiing.50" size="0x4000" crc="6b5ea9c4" sha1="7cbb5fce8b9d44412b98d32a5ea752ec51590785" offset="0000"/> + <rom name="mountain madness - super pro skiing.50" size="0x4000" crc="6b5ea9c4" sha1="7cbb5fce8b9d44412b98d32a5ea752ec51590785" offset="0x0000"/> </dataarea> </part> </software> @@ -859,8 +924,9 @@ <info name="serial" value="2479"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="mouse trap.50" size="0x2000" crc="598662f2" sha1="fd942dde74c6006a70dbc6902a2e0ed416edaa55" offset="0000"/> + <rom name="mouse trap.50" size="0x2000" crc="598662f2" sha1="fd942dde74c6006a70dbc6902a2e0ed416edaa55" offset="0x0000"/> </dataarea> </part> </software> @@ -871,8 +937,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5305"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="night stalker.50" size="0x2000" crc="7334cd44" sha1="13e321593daf93c2e3e964a05e43e4bb21da6ea6" offset="0000"/> + <rom name="night stalker.50" size="0x2000" crc="7334cd44" sha1="13e321593daf93c2e3e964a05e43e4bb21da6ea6" offset="0x0000"/> </dataarea> </part> </software> @@ -883,8 +950,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720022"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="nova blast.50" size="0x4000" crc="5ee2cc2a" sha1="ca18f2938168ec681ee34cb25a08c87b752a5024" offset="0000"/> + <rom name="nova blast.50" size="0x4000" crc="5ee2cc2a" sha1="ca18f2938168ec681ee34cb25a08c87b752a5024" offset="0x0000"/> </dataarea> </part> </software> @@ -895,8 +963,9 @@ <publisher>Atarisoft</publisher> <info name="serial" value="70251"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x6000"> - <rom name="pac-man.50" size="0x6000" crc="a21c31c3" sha1="66ddc9c56edee06564c1252c7c6bc3123da8c31d" offset="0000"/> + <rom name="pac-man.50" size="0x6000" crc="a21c31c3" sha1="66ddc9c56edee06564c1252c7c6bc3123da8c31d" offset="0x0000"/> </dataarea> </part> </software> @@ -907,8 +976,9 @@ <publisher>INTV</publisher> <info name="serial" value="8000"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x6000"> - <rom name="pac-man - intv.50" size="0x6000" crc="6e4e8eb4" sha1="48023975e4ba875b745b5b9aac0fb562922b50c3" offset="0000"/> + <rom name="pac-man - intv.50" size="0x6000" crc="6e4e8eb4" sha1="48023975e4ba875b745b5b9aac0fb562922b50c3" offset="0x0000"/> </dataarea> </part> </software> @@ -919,11 +989,12 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5356"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="pinball.50" size="0x4000" crc="eea1a9a7" sha1="89a725d2c404a27ce5f931a896c1f411ea6707bd" offset="0000"/> + <rom name="pinball.50" size="0x4000" crc="eea1a9a7" sha1="89a725d2c404a27ce5f931a896c1f411ea6707bd" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="pinball.d0" size="0x2000" crc="ce21806d" sha1="532cb88d9a6797ca218c5364275cb57691eb1322" offset="0000"/> + <rom name="pinball.d0" size="0x2000" crc="ce21806d" sha1="532cb88d9a6797ca218c5364275cb57691eb1322" offset="0x0000"/> </dataarea> </part> </software> @@ -934,8 +1005,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-002-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="pitfall.50" size="0x2000" crc="9c75efcc" sha1="1f4087be2c0a51ed08e49e6498794a9d26dc0d65" offset="0000"/> + <rom name="pitfall.50" size="0x2000" crc="9c75efcc" sha1="1f4087be2c0a51ed08e49e6498794a9d26dc0d65" offset="0x0000"/> </dataarea> </part> </software> @@ -946,8 +1018,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2611"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="poker and blackjack.50" size="0x2000" crc="604611c0" sha1="a6c03e253e615a06f838e623df5f557636fdf8e1" offset="0000"/> + <rom name="poker and blackjack.50" size="0x2000" crc="604611c0" sha1="a6c03e253e615a06f838e623df5f557636fdf8e1" offset="0x0000"/> </dataarea> </part> </software> @@ -958,11 +1031,12 @@ <publisher>INTV</publisher> <info name="serial" value="9004"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="pole position.50" size="0x4000" crc="f57537c2" sha1="2fe2c9f0823c0040ba7731749d84063f41032da6" offset="0000"/> + <rom name="pole position.50" size="0x4000" crc="f57537c2" sha1="2fe2c9f0823c0040ba7731749d84063f41032da6" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="pole position.90" size="0x4000" crc="ee3027cc" sha1="90dbe6347c50e83c330c4dd526ecddd54fa174dc" offset="0000"/> + <rom name="pole position.90" size="0x4000" crc="ee3027cc" sha1="90dbe6347c50e83c330c4dd526ecddd54fa174dc" offset="0x0000"/> </dataarea> </part> </software> @@ -973,8 +1047,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6370"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="popeye.50" size="0x4000" crc="c51464e0" sha1="fc468df3ab11c52f157a0c6b881c61f43cb5c88a" offset="0000"/> + <rom name="popeye.50" size="0x4000" crc="c51464e0" sha1="fc468df3ab11c52f157a0c6b881c61f43cb5c88a" offset="0x0000"/> </dataarea> </part> </software> @@ -985,8 +1060,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6360"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="q-bert.50" size="0x4000" crc="d8c9856a" sha1="60132870a1bf5f5b9d0aa19b4dd9c13a94702f70" offset="0000"/> + <rom name="q-bert.50" size="0x4000" crc="d8c9856a" sha1="60132870a1bf5f5b9d0aa19b4dd9c13a94702f70" offset="0x0000"/> </dataarea> </part> </software> @@ -997,8 +1073,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5304"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="reversi.50" size="0x2000" crc="c7bb1b0e" sha1="3eea6f5c02942eb3ac96967e3b667911459d09f8" offset="0000"/> + <rom name="reversi.50" size="0x2000" crc="c7bb1b0e" sha1="3eea6f5c02942eb3ac96967e3b667911459d09f8" offset="0x0000"/> </dataarea> </part> </software> @@ -1009,8 +1086,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-007-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="river raid.50" size="0x4000" crc="8910c37a" sha1="6c1aa94983c25ed484cc85dadabf0102b5c46726" offset="0000"/> + <rom name="river raid.50" size="0x4000" crc="8910c37a" sha1="6c1aa94983c25ed484cc85dadabf0102b5c46726" offset="0x0000"/> </dataarea> </part> </software> @@ -1021,8 +1099,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1118"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="roulette.50" size="0x2000" crc="48d74d3c" sha1="b7773c3cc93afe4820287c3f1c14345a1a14e1ee" offset="0000"/> + <rom name="roulette.50" size="0x2000" crc="48d74d3c" sha1="b7773c3cc93afe4820287c3f1c14345a1a14e1ee" offset="0x0000"/> </dataarea> </part> </software> @@ -1033,8 +1112,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5303"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x3000"> - <rom name="royal dealer.50" size="0x3000" crc="0458a491" sha1="918e59d79672577b8b327c5d00c95d03e5e0c920" offset="0000"/> + <rom name="royal dealer.50" size="0x3000" crc="0458a491" sha1="918e59d79672577b8b327c5d00c95d03e5e0c920" offset="0x0000"/> </dataarea> </part> </software> @@ -1045,8 +1125,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720025"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="safecracker.50" size="0x4000" crc="47aa7977" sha1="a6a60d4c17866a790351eebec9603890deeda0ff" offset="0000"/> + <rom name="safecracker.50" size="0x4000" crc="47aa7977" sha1="a6a60d4c17866a790351eebec9603890deeda0ff" offset="0x0000"/> </dataarea> </part> </software> @@ -1057,8 +1138,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1818"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="sea battle.50" size="0x2000" crc="99ae29a9" sha1="ccb48a11f3cbfa580f2c6a1012c8d794eee9a5ec" offset="0000"/> + <rom name="sea battle.50" size="0x2000" crc="99ae29a9" sha1="ccb48a11f3cbfa580f2c6a1012c8d794eee9a5ec" offset="0x0000"/> </dataarea> </part> </software> @@ -1069,8 +1151,9 @@ <publisher>Interphase</publisher> <info name="serial" value="8010002"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="sewer sam.50" size="0x4000" crc="e0f0d3da" sha1="e7c2aff48dac09f2c04b867c00a587c00c0c541f" offset="0000"/> + <rom name="sewer sam.50" size="0x4000" crc="e0f0d3da" sha1="e7c2aff48dac09f2c04b867c00a587c00c0c541f" offset="0x0000"/> </dataarea> </part> </software> @@ -1081,8 +1164,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5387"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="shark shark.50" size="0x4000" crc="2a4c761d" sha1="53d10e890571ef67d39874582f3668b29c580590" offset="0000"/> + <rom name="shark shark.50" size="0x4000" crc="2a4c761d" sha1="53d10e890571ef67d39874582f3668b29c580590" offset="0x0000"/> </dataarea> </part> </software> @@ -1093,8 +1177,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5638"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="sharp shot.50" size="0x2000" crc="ff7cb79e" sha1="0a0230a5c06f3593d683458aec3d81654904f16d" offset="0000"/> + <rom name="sharp shot.50" size="0x2000" crc="ff7cb79e" sha1="0a0230a5c06f3593d683458aec3d81654904f16d" offset="0x0000"/> </dataarea> </part> </software> @@ -1105,8 +1190,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1817"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="skiing.50" size="0x2000" crc="f093e801" sha1="f93df55f45ee9b589db5763cefe6742860b38e79" offset="0000"/> + <rom name="skiing.50" size="0x2000" crc="f093e801" sha1="f93df55f45ee9b589db5763cefe6742860b38e79" offset="0x0000"/> </dataarea> </part> </software> @@ -1117,11 +1203,12 @@ <publisher>INTV</publisher> <info name="serial" value="9001"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="slam dunk - super pro basketball.50" size="0x4000" crc="e090be37" sha1="f9d1d53968f99372aa5923164e68a648308682ec" offset="0000"/> + <rom name="slam dunk - super pro basketball.50" size="0x4000" crc="e090be37" sha1="f9d1d53968f99372aa5923164e68a648308682ec" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="slam dunk - super pro basketball.90" size="0x4000" crc="7e596f89" sha1="c508ca7e7ac6f1fe65a345ccda0ae333872a7624" offset="0000"/> + <rom name="slam dunk - super pro basketball.90" size="0x4000" crc="7e596f89" sha1="c508ca7e7ac6f1fe65a345ccda0ae333872a7624" offset="0x0000"/> </dataarea> </part> </software> @@ -1132,8 +1219,9 @@ <publisher>INTV</publisher> <info name="serial" value="9003"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="slap shot - super pro hockey.50" size="0x4000" crc="ba68ff28" sha1="35e27d918cad45129fcc3924fbb4f2fef8f31776" offset="0000"/> + <rom name="slap shot - super pro hockey.50" size="0x4000" crc="ba68ff28" sha1="35e27d918cad45129fcc3924fbb4f2fef8f31776" offset="0x0000"/> </dataarea> </part> </software> @@ -1144,8 +1232,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3758"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="snafu.50" size="0x2000" crc="8f959a6e" sha1="9d5c237c7fb1cf3c444f916e84ee4180d9732c4c" offset="0000"/> + <rom name="snafu.50" size="0x2000" crc="8f959a6e" sha1="9d5c237c7fb1cf3c444f916e84ee4180d9732c4c" offset="0x0000"/> </dataarea> </part> </software> @@ -1156,8 +1245,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1683"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="soccer.50" size="0x2000" crc="dbab54ca" sha1="3524384c2e096f22b7cb9608e0a8b9c78f4ef458" offset="0000"/> + <rom name="soccer.50" size="0x2000" crc="dbab54ca" sha1="3524384c2e096f22b7cb9608e0a8b9c78f4ef458" offset="0x0000"/> </dataarea> </part> </software> @@ -1168,8 +1258,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3759"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="space armada.50" size="0x2000" crc="e8b8eba5" sha1="2d8ddc0881b63b2f691a97eab182ed4c3ca56816" offset="0000"/> + <rom name="space armada.50" size="0x2000" crc="e8b8eba5" sha1="2d8ddc0881b63b2f691a97eab182ed4c3ca56816" offset="0x0000"/> </dataarea> </part> </software> @@ -1180,8 +1271,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="2612"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="space battle.50" size="0x2000" crc="f95504e0" sha1="d6036c7e7c0da20878fd7acc9f6b476135d1e8d1" offset="0000"/> + <rom name="space battle.50" size="0x2000" crc="f95504e0" sha1="d6036c7e7c0da20878fd7acc9f6b476135d1e8d1" offset="0x0000"/> </dataarea> </part> </software> @@ -1192,8 +1284,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5136"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="space hawk.50" size="0x2000" crc="39d3b895" sha1="e7e4b8ad30ee69cd9e75f2b3e3d94b75e7288110" offset="0000"/> + <rom name="space hawk.50" size="0x2000" crc="39d3b895" sha1="e7e4b8ad30ee69cd9e75f2b3e3d94b75e7288110" offset="0x0000"/> </dataarea> </part> </software> @@ -1205,8 +1298,9 @@ <info name="serial" value="3416"/> <info name="usage" value="Uses Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="space spartans.50" size="0x4000" crc="3784dc52" sha1="954d5911a3a41e8f9b4664ab4f60484b2d2648b3" offset="0000"/> + <rom name="space spartans.50" size="0x4000" crc="3784dc52" sha1="954d5911a3a41e8f9b4664ab4f60484b2d2648b3" offset="0x0000"/> </dataarea> </part> </software> @@ -1217,11 +1311,12 @@ <publisher>INTV</publisher> <info name="serial" value="9102"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="spiker super pro volleyball.50" size="0x4000" crc="e9648c61" sha1="f36b7b8b69d5dea70a769ed44efee67f2df3cb7e" offset="0000"/> + <rom name="spiker super pro volleyball.50" size="0x4000" crc="e9648c61" sha1="f36b7b8b69d5dea70a769ed44efee67f2df3cb7e" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="spiker super pro volleyball.90" size="0x4000" crc="0e0653ec" sha1="5c87a1b43bd88358e91efa8bd72f4121c96e63a2" offset="0000"/> + <rom name="spiker super pro volleyball.90" size="0x4000" crc="0e0653ec" sha1="5c87a1b43bd88358e91efa8bd72f4121c96e63a2" offset="0x0000"/> </dataarea> </part> </software> @@ -1232,11 +1327,12 @@ <publisher>INTV</publisher> <info name="serial" value="9100"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="stadium mud buggies.50" size="0x4000" crc="dbad22a8" sha1="774264e61849e9dbfb111f618a07296ff8399b52" offset="0000"/> + <rom name="stadium mud buggies.50" size="0x4000" crc="dbad22a8" sha1="774264e61849e9dbfb111f618a07296ff8399b52" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="stadium mud buggies.90" size="0x4000" crc="c526a9d0" sha1="0a1b012719f4b7a89fa57ef6ee4d7f8e556b10f7" offset="0000"/> + <rom name="stadium mud buggies.90" size="0x4000" crc="c526a9d0" sha1="0a1b012719f4b7a89fa57ef6ee4d7f8e556b10f7" offset="0x0000"/> </dataarea> </part> </software> @@ -1247,8 +1343,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-001-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="stampede.50" size="0x2000" crc="2deacd15" sha1="31cf8f77d889c48d2b31670e58b2ec38187f2748" offset="0000"/> + <rom name="stampede.50" size="0x2000" crc="2deacd15" sha1="31cf8f77d889c48d2b31670e58b2ec38187f2748" offset="0x0000"/> </dataarea> </part> </software> @@ -1259,8 +1356,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5161"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="star strike.50" size="0x2000" crc="72e11fca" sha1="17c37fbc5ff14c55931ae27e21603dff3db66dbe" offset="0000"/> + <rom name="star strike.50" size="0x2000" crc="72e11fca" sha1="17c37fbc5ff14c55931ae27e21603dff3db66dbe" offset="0x0000"/> </dataarea> </part> </software> @@ -1271,8 +1369,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6050"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="star wars - the empire strikes back.50" size="0x2000" crc="d5b0135a" sha1="b2995abe45c57e85c36927ba82c428bfbe06cb70" offset="0000"/> + <rom name="star wars - the empire strikes back.50" size="0x2000" crc="d5b0135a" sha1="b2995abe45c57e85c36927ba82c428bfbe06cb70" offset="0x0000"/> </dataarea> </part> </software> @@ -1283,8 +1382,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3408"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="sub hunt.50" size="0x4000" crc="3d9949ea" sha1="8b09884a69f4aa8663f42a201dd70df98f4da0fc" offset="0000"/> + <rom name="sub hunt.50" size="0x4000" crc="3d9949ea" sha1="8b09884a69f4aa8663f42a201dd70df98f4da0fc" offset="0x0000"/> </dataarea> </part> </software> @@ -1295,8 +1395,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6320"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="super cobra.50" size="0x4000" crc="7c32c9b8" sha1="9eced3a6d0ca3a303793d96050dbec2ab1f35df6" offset="0000"/> + <rom name="super cobra.50" size="0x4000" crc="7c32c9b8" sha1="9eced3a6d0ca3a303793d96050dbec2ab1f35df6" offset="0x0000"/> </dataarea> </part> </software> @@ -1307,11 +1408,12 @@ <publisher>INTV</publisher> <info name="serial" value="9008"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="super pro decathlon.50" size="0x4000" crc="f128951f" sha1="e8ab54118bebfeb0f9385c9ec200a4b95a9ad280" offset="0000"/> + <rom name="super pro decathlon.50" size="0x4000" crc="f128951f" sha1="e8ab54118bebfeb0f9385c9ec200a4b95a9ad280" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="super pro decathlon.90" size="0x4000" crc="fd979dc9" sha1="b0529b35e78a945df2e874bebbe770e3929d2f97" offset="0000"/> + <rom name="super pro decathlon.90" size="0x4000" crc="fd979dc9" sha1="b0529b35e78a945df2e874bebbe770e3929d2f97" offset="0x0000"/> </dataarea> </part> </software> @@ -1322,11 +1424,12 @@ <publisher>INTV</publisher> <info name="serial" value="8400"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="super pro football.50" size="0x4000" crc="33f5103f" sha1="8322893973edbb4d9a231b5a8931914b72294d29" offset="0000"/> + <rom name="super pro football.50" size="0x4000" crc="33f5103f" sha1="8322893973edbb4d9a231b5a8931914b72294d29" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="super pro football.90" size="0x4000" crc="c9227e76" sha1="dd85452f73f1d97c7871fd26eec334bc6cb1caa2" offset="0000"/> + <rom name="super pro football.90" size="0x4000" crc="c9227e76" sha1="dd85452f73f1d97c7871fd26eec334bc6cb1caa2" offset="0x0000"/> </dataarea> </part> </software> @@ -1338,8 +1441,9 @@ <info name="serial" value="720009"/> <info name="usage" value="This cart has unique Left and Right overlays"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="swords and serpents.50" size="0x4000" crc="15e88fce" sha1="6beb8682f75e2616009faeabc08e88871fc172bd" offset="0000"/> + <rom name="swords and serpents.50" size="0x4000" crc="15e88fce" sha1="6beb8682f75e2616009faeabc08e88871fc172bd" offset="0x0000"/> </dataarea> </part> </software> @@ -1350,8 +1454,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="1814"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="tennis.50" size="0x2000" crc="03e9e62e" sha1="e500b803cba6e73228a919fdedc109f0022cee3a" offset="0000"/> + <rom name="tennis.50" size="0x2000" crc="03e9e62e" sha1="e500b803cba6e73228a919fdedc109f0022cee3a" offset="0x0000"/> </dataarea> </part> </software> @@ -1362,14 +1467,15 @@ <publisher>INTV</publisher> <info name="serial" value="8300"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="thin ice.50" size="0x4000" crc="0d2e9e57" sha1="211c6012c7d1a1216282bead1b01c58101dd11be" offset="0000"/> + <rom name="thin ice.50" size="0x4000" crc="0d2e9e57" sha1="211c6012c7d1a1216282bead1b01c58101dd11be" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="thin ice.d0" size="0x2000" crc="ab5d151b" sha1="807276b1180f8c90e10f5ba4c1a7cdec2b08e458" offset="0000"/> + <rom name="thin ice.d0" size="0x2000" crc="ab5d151b" sha1="807276b1180f8c90e10f5ba4c1a7cdec2b08e458" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="thin ice.f0" size="0x2000" crc="bc59178e" sha1="72d7ccbc4e00becae6ad0887da76f583eafbb895" offset="0000"/> + <rom name="thin ice.f0" size="0x2000" crc="bc59178e" sha1="72d7ccbc4e00becae6ad0887da76f583eafbb895" offset="0x0000"/> </dataarea> </part> </software> @@ -1380,14 +1486,15 @@ <publisher>INTV</publisher> <info name="serial" value="4469"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="thunder castle.50" size="0x4000" crc="f77a5612" sha1="9a0b509b328aa0e9feff16cc0ce42150c8619e6c" offset="0000"/> + <rom name="thunder castle.50" size="0x4000" crc="f77a5612" sha1="9a0b509b328aa0e9feff16cc0ce42150c8619e6c" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="thunder castle.d0" size="0x2000" crc="b2e18fed" sha1="2a6ba9e022bd5684eb7c2c38bdc267dee3e5b85a" offset="0000"/> + <rom name="thunder castle.d0" size="0x2000" crc="b2e18fed" sha1="2a6ba9e022bd5684eb7c2c38bdc267dee3e5b85a" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="thunder castle.f0" size="0x2000" crc="f305da4e" sha1="9be241701112e5fe9a3cbec874e64826fd02e25c" offset="0000"/> + <rom name="thunder castle.f0" size="0x2000" crc="f305da4e" sha1="9be241701112e5fe9a3cbec874e64826fd02e25c" offset="0x0000"/> </dataarea> </part> </software> @@ -1398,17 +1505,18 @@ <publisher>INTV</publisher> <info name="serial" value="8600"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="tower of doom.50" size="0x4000" crc="fc49ce10" sha1="5de3bb1ec6f1a30d94b58abb3a594e3f6202e9f0" offset="0000"/> + <rom name="tower of doom.50" size="0x4000" crc="fc49ce10" sha1="5de3bb1ec6f1a30d94b58abb3a594e3f6202e9f0" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="tower of doom.90" size="0x4000" crc="df232856" sha1="7a612c7316b6fa56171fcfc6243cae5b097429db" offset="0000"/> + <rom name="tower of doom.90" size="0x4000" crc="df232856" sha1="7a612c7316b6fa56171fcfc6243cae5b097429db" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="tower of doom.d0" size="0x2000" crc="67a60cee" sha1="3b30d44d0b61bedb167f517440eb2662a2df69cf" offset="0000"/> + <rom name="tower of doom.d0" size="0x2000" crc="67a60cee" sha1="3b30d44d0b61bedb167f517440eb2662a2df69cf" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="tower of doom.f0" size="0x2000" crc="f683cbe6" sha1="6bea72aab5398dd0cd5c13eab57fc2f9d23fb952" offset="0000"/> + <rom name="tower of doom.f0" size="0x2000" crc="f683cbe6" sha1="6bea72aab5398dd0cd5c13eab57fc2f9d23fb952" offset="0x0000"/> </dataarea> </part> </software> @@ -1419,8 +1527,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="3760"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="triple action.50" size="0x2000" crc="1ac989e2" sha1="6c1011b98ac76653632fd13e93466802f7d4dea9" offset="0000"/> + <rom name="triple action.50" size="0x2000" crc="1ac989e2" sha1="6c1011b98ac76653632fd13e93466802f7d4dea9" offset="0x0000"/> </dataarea> </part> </software> @@ -1431,13 +1540,14 @@ <publisher>INTV</publisher> <info name="serial" value="8700"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_ram" /> <dataarea name="5000" size="0x4000"> - <rom name="triple challenge.50" size="0x4000" crc="29e67951" sha1="b843bda4e0be8e2a11e766961d4145e2e6d8c199" offset="0000"/> + <rom name="triple challenge.50" size="0x4000" crc="29e67951" sha1="b843bda4e0be8e2a11e766961d4145e2e6d8c199" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="triple challenge.90" size="0x4000" crc="52ad0eda" sha1="cfe303f4942e8f1fe64510ac74839e47b5d2d8dc" offset="0000"/> + <rom name="triple challenge.90" size="0x4000" crc="52ad0eda" sha1="cfe303f4942e8f1fe64510ac74839e47b5d2d8dc" offset="0x0000"/> </dataarea> - <dataarea name="D000_RAM8" size="0x400"> + <dataarea name="ram" size="0x400"> </dataarea> </part> </software> @@ -1448,8 +1558,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5391"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="tron - deadly discs.50" size="0x2000" crc="ca447bbd" sha1="a84392c29a69a7bff5f1b521a0e836622405180a" offset="0000"/> + <rom name="tron - deadly discs.50" size="0x2000" crc="ca447bbd" sha1="a84392c29a69a7bff5f1b521a0e836622405180a" offset="0x0000"/> </dataarea> </part> </software> @@ -1460,8 +1571,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5392"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="tron - maze-a-tron.50" size="0x4000" crc="7a558cf5" sha1="8d4eba89b8edb4c51ff0e2e4914e73f2a07bc9a6" offset="0000"/> + <rom name="tron - maze-a-tron.50" size="0x4000" crc="7a558cf5" sha1="8d4eba89b8edb4c51ff0e2e4914e73f2a07bc9a6" offset="0x0000"/> </dataarea> </part> </software> @@ -1473,11 +1585,12 @@ <info name="serial" value="5393"/> <info name="usage" value="Uses Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="tron - solar sailer.50" size="0x4000" crc="96b2681e" sha1="08880cf77ed6ab9a20b9a2161ac2bb998b42bc78" offset="0000"/> + <rom name="tron - solar sailer.50" size="0x4000" crc="96b2681e" sha1="08880cf77ed6ab9a20b9a2161ac2bb998b42bc78" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="tron - solar sailer.d0" size="0x2000" crc="0e45e775" sha1="a6d317c3e342c53d6ddbbf7bd774a84a6b44dfb8" offset="0000"/> + <rom name="tron - solar sailer.d0" size="0x2000" crc="0e45e775" sha1="a6d317c3e342c53d6ddbbf7bd774a84a6b44dfb8" offset="0x0000"/> </dataarea> </part> </software> @@ -1488,8 +1601,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720017"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="tropical trouble.50" size="0x4000" crc="6f23a741" sha1="63fadc61f9fe850bead7df76ed915ea00e569cb5" offset="0000"/> + <rom name="tropical trouble.50" size="0x4000" crc="6f23a741" sha1="63fadc61f9fe850bead7df76ed915ea00e569cb5" offset="0x0000"/> </dataarea> </part> </software> @@ -1500,8 +1614,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720023"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="truckin.50" size="0x4000" crc="734f3260" sha1="b4ca75d4b6c4e937aa021e23e0fb98ef707705c7" offset="0000"/> + <rom name="truckin.50" size="0x4000" crc="734f3260" sha1="b4ca75d4b6c4e937aa021e23e0fb98ef707705c7" offset="0x0000"/> </dataarea> </part> </software> @@ -1512,8 +1627,9 @@ <publisher>Coleco</publisher> <info name="serial" value="2473"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="turbo.50" size="0x4000" crc="275f3512" sha1="23a4aafcbf5449ef0f8a684e2f87e85761e83af7" offset="0000"/> + <rom name="turbo.50" size="0x4000" crc="275f3512" sha1="23a4aafcbf5449ef0f8a684e2f87e85761e83af7" offset="0x0000"/> </dataarea> </part> </software> @@ -1524,8 +1640,9 @@ <publisher>Parker Brothers</publisher> <info name="serial" value="PB6340"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="tutankham.50" size="0x4000" crc="6fa698b3" sha1="12a96e4111082f1cf5bee27f850f28e20009681b" offset="0000"/> + <rom name="tutankham.50" size="0x4000" crc="6fa698b3" sha1="12a96e4111082f1cf5bee27f850f28e20009681b" offset="0x0000"/> </dataarea> </part> </software> @@ -1536,8 +1653,9 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5149"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="utopia.50" size="0x2000" crc="f9e0789e" sha1="d72d2a9817e75039d57b1ec877dfe2b96a306b61" offset="0000"/> + <rom name="utopia.50" size="0x2000" crc="f9e0789e" sha1="d72d2a9817e75039d57b1ec877dfe2b96a306b61" offset="0x0000"/> </dataarea> </part> </software> @@ -1548,11 +1666,12 @@ <publisher>Mattel Electronics</publisher> <info name="serial" value="5788"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="vectron.50" size="0x4000" crc="9ac88229" sha1="937300637b3fba2126be4ee119b9f1e902b9f15b" offset="0000"/> + <rom name="vectron.50" size="0x4000" crc="9ac88229" sha1="937300637b3fba2126be4ee119b9f1e902b9f15b" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="vectron.d0" size="0x2000" crc="eeaed70a" sha1="ef78c2159eb810853ba0e2c2bd0f27d15de8f7c3" offset="0000"/> + <rom name="vectron.d0" size="0x2000" crc="eeaed70a" sha1="ef78c2159eb810853ba0e2c2bd0f27d15de8f7c3" offset="0x0000"/> </dataarea> </part> </software> @@ -1564,8 +1683,9 @@ <info name="serial" value="2477"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="venture.50" size="0x4000" crc="6efa67b2" sha1="ec7c70dbec461c9ec5ce0d37290c5ed7116d537c" offset="0000"/> + <rom name="venture.50" size="0x4000" crc="6efa67b2" sha1="ec7c70dbec461c9ec5ce0d37290c5ed7116d537c" offset="0x0000"/> </dataarea> </part> </software> @@ -1576,8 +1696,9 @@ <publisher>Imagic</publisher> <info name="serial" value="720024"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="white water.50" size="0x4000" crc="f1ed7d27" sha1="b3c429b046a75384e02568708b7029e725073dc7" offset="0000"/> + <rom name="white water.50" size="0x4000" crc="f1ed7d27" sha1="b3c429b046a75384e02568708b7029e725073dc7" offset="0x0000"/> </dataarea> </part> </software> @@ -1588,14 +1709,15 @@ <publisher>INTV</publisher> <info name="serial" value="8100"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="world cup football.50" size="0x4000" crc="ec17636c" sha1="f96ce3b97e2250d5a37710c55f59e29319f2cf28" offset="0000"/> + <rom name="world cup football.50" size="0x4000" crc="ec17636c" sha1="f96ce3b97e2250d5a37710c55f59e29319f2cf28" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="world cup football.d0" size="0x2000" crc="0d5be7c7" sha1="9a03652e525316ec9e889b0989d22a35fb6a8358" offset="0000"/> + <rom name="world cup football.d0" size="0x2000" crc="0d5be7c7" sha1="9a03652e525316ec9e889b0989d22a35fb6a8358" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="world cup football.f0" size="0x2000" crc="4bb2b777" sha1="82ae81c3eb35e7e7e53c4f81a86bdf5ac3d925ff" offset="0000"/> + <rom name="world cup football.f0" size="0x2000" crc="4bb2b777" sha1="82ae81c3eb35e7e7e53c4f81a86bdf5ac3d925ff" offset="0x0000"/> </dataarea> </part> </software> @@ -1606,8 +1728,9 @@ <publisher>Activision</publisher> <info name="serial" value="M-006-03"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="worm whomper.50" size="0x2000" crc="24b667b9" sha1="e1f3c3aab41cb1850771cd566acd6fe4c1161041" offset="0000"/> + <rom name="worm whomper.50" size="0x2000" crc="24b667b9" sha1="e1f3c3aab41cb1850771cd566acd6fe4c1161041" offset="0x0000"/> </dataarea> </part> </software> @@ -1619,12 +1742,52 @@ <info name="serial" value="2487"/> <info name="usage" value="Will not run on Intellivision 2"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="zaxxon.50" size="0x4000" crc="15c65dc5" sha1="e46a7e8d118b33a0a17130cf27bc8a4b1d2f93e2" offset="0000"/> + <rom name="zaxxon.50" size="0x4000" crc="15c65dc5" sha1="e46a7e8d118b33a0a17130cf27bc8a4b1d2f93e2" offset="0x0000"/> </dataarea> </part> </software> + + +<!-- Expansions --> + + <software name="voice"> + <description>Intellivoice</description> + <year>19??</year> + <publisher>Mattel</publisher> + <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_voice" /> + <dataarea name="5000" size="0x4000"> + <!-- This should load the speech rom, but it is currently handled as device rom --> + </dataarea> + </part> + </software> + + + <software name="ecs"> + <description>Entertainment Computer System</description> + <year>19??</year> + <publisher>Mattel</publisher> + <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_ecs" /> + <dataarea name="2000" size="0x2000"> + <rom name="ecs_rom.20" size="0x2000" crc="5f9d05e5" sha1="083a3e7405b8f8b4b8a5003ca9c31b8d824b535c" offset="0x0000" /> + </dataarea> + <dataarea name="7000" size="0x2000"> + <rom name="ecs_rom.70" size="0x2000" crc="46bb1f48" sha1="eda44a8476fdada1ae90fba0d0287611e2efa074" offset="0x0000" /> + </dataarea> + <dataarea name="E000" size="0x2000"> + <rom name="ecs_rom.e0" size="0x2000" crc="c2ebcd90" sha1="b3c14955f56c57e6f0d8fbb695771946cfcf6582" offset="0x0000" /> + </dataarea> + <dataarea name="ram" size="0x800"> + </dataarea> + </part> + </software> + + + <!-- Unreleased / Prototypes / Homebrew --> <software name="allstar"> @@ -1632,11 +1795,12 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="all star major league baseball.50" size="0x4000" crc="4a7e080a" sha1="ee2edd084c371d39dfcd725ed4aa5679e0c34a27" offset="0000"/> + <rom name="all star major league baseball.50" size="0x4000" crc="4a7e080a" sha1="ee2edd084c371d39dfcd725ed4aa5679e0c34a27" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="all star major league baseball.d0" size="0x2000" crc="31325854" sha1="fe7b5f3969e214ac23d20c5c137dc23f4515108d" offset="0000"/> + <rom name="all star major league baseball.d0" size="0x2000" crc="31325854" sha1="fe7b5f3969e214ac23d20c5c137dc23f4515108d" offset="0x0000"/> </dataarea> </part> </software> @@ -1646,8 +1810,9 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="air strike.50" size="0x2000" crc="2c668249" sha1="45d4cc27ccb966b007c3c2d32766f568f613319f" offset="0000"/> + <rom name="air strike.50" size="0x2000" crc="2c668249" sha1="45d4cc27ccb966b007c3c2d32766f568f613319f" offset="0x0000"/> </dataarea> </part> </software> @@ -1657,8 +1822,9 @@ <year>1981</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="brickout.50" size="0x2000" crc="9f85015b" sha1="12895e3e9ce094e393fe996383be1d48ba5be77f" offset="0000"/> + <rom name="brickout.50" size="0x2000" crc="9f85015b" sha1="12895e3e9ce094e393fe996383be1d48ba5be77f" offset="0x0000"/> </dataarea> </part> </software> @@ -1668,11 +1834,12 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="choplifter.50" size="0x4000" crc="b05cd576" sha1="61205b84aa3673d7a50da4f92ed0ed78e34ac951" offset="0000"/> + <rom name="choplifter.50" size="0x4000" crc="b05cd576" sha1="61205b84aa3673d7a50da4f92ed0ed78e34ac951" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x3000"> - <rom name="choplifter.d0" size="0x3000" crc="9b09666e" sha1="a024e5189e52ae07aa666fdcba612a6e9d7da4bc" offset="0000"/> + <rom name="choplifter.d0" size="0x3000" crc="9b09666e" sha1="a024e5189e52ae07aa666fdcba612a6e9d7da4bc" offset="0x0000"/> </dataarea> </part> </software> @@ -1682,11 +1849,12 @@ <year>1990</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="deep pockets - super pro pool and billiards.50" size="0x4000" crc="4f4fb03f" sha1="ce0bd5a79474dadf9f025edf121c466c2686ce75" offset="0000"/> + <rom name="deep pockets - super pro pool and billiards.50" size="0x4000" crc="4f4fb03f" sha1="ce0bd5a79474dadf9f025edf121c466c2686ce75" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="deep pockets - super pro pool and billiards.90" size="0x4000" crc="233c364d" sha1="e87a81345822f3417830f181169970c9aefaf9e3" offset="0000"/> + <rom name="deep pockets - super pro pool and billiards.90" size="0x4000" crc="233c364d" sha1="e87a81345822f3417830f181169970c9aefaf9e3" offset="0x0000"/> </dataarea> </part> </software> @@ -1696,8 +1864,9 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="go for the gold.50" size="0x4000" crc="dbca82c5" sha1="d68c49bdc62674f51fa26218a4e1422ec46bd41d" offset="0000"/> + <rom name="go for the gold.50" size="0x4000" crc="dbca82c5" sha1="d68c49bdc62674f51fa26218a4e1422ec46bd41d" offset="0x0000"/> </dataarea> </part> </software> @@ -1707,8 +1876,9 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="grid shock.50" size="0x2000" crc="291ac826" sha1="b7a811a854dacd5e1b8e809baa5ce6ca1168ab53" offset="0000"/> + <rom name="grid shock.50" size="0x2000" crc="291ac826" sha1="b7a811a854dacd5e1b8e809baa5ce6ca1168ab53" offset="0x0000"/> </dataarea> </part> </software> @@ -1718,8 +1888,9 @@ <year>1981</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="happy holidays - easter eggcitement.50" size="0x2000" crc="20ace89d" sha1="b5d4e3b153a79fe34b07281a033e87445af6dbd0" offset="0000"/> + <rom name="happy holidays - easter eggcitement.50" size="0x2000" crc="20ace89d" sha1="b5d4e3b153a79fe34b07281a033e87445af6dbd0" offset="0x0000"/> </dataarea> </part> </software> @@ -1729,8 +1900,9 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="happy holidays - santas helper.50" size="0x2000" crc="e221808c" sha1="58c55d4708155e687bf4d359a5a1a66ff97a7ca7" offset="0000"/> + <rom name="happy holidays - santas helper.50" size="0x2000" crc="e221808c" sha1="58c55d4708155e687bf4d359a5a1a66ff97a7ca7" offset="0x0000"/> </dataarea> </part> </software> @@ -1740,8 +1912,9 @@ <year>1981</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="happy holidays - trick or treat.50" size="0x2000" crc="4830f720" sha1="c94a09bd76b65366717c39cbf42c60afb34b37cc" offset="0000"/> + <rom name="happy holidays - trick or treat.50" size="0x2000" crc="4830f720" sha1="c94a09bd76b65366717c39cbf42c60afb34b37cc" offset="0x0000"/> </dataarea> </part> </software> @@ -1751,8 +1924,9 @@ <year>1981</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="hypnotic lights.50" size="0x2000" crc="a3147630" sha1="7aa48d1249d52a51223e99a98799b01f46cfc3d9" offset="0000"/> + <rom name="hypnotic lights.50" size="0x2000" crc="a3147630" sha1="7aa48d1249d52a51223e99a98799b01f46cfc3d9" offset="0x0000"/> </dataarea> </part> </software> @@ -1762,11 +1936,12 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="king of the mountain.50" size="0x4000" crc="3b689be9" sha1="794f7fbf5592a1c4962264db3b21d543763462ad" offset="0000"/> + <rom name="king of the mountain.50" size="0x4000" crc="3b689be9" sha1="794f7fbf5592a1c4962264db3b21d543763462ad" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="king of the mountain.d0" size="0x4000" crc="45e7021d" sha1="3e6c17470ce5a92b28fa476c94ae0b84ab01e9c2" offset="0000"/> + <rom name="king of the mountain.d0" size="0x4000" crc="45e7021d" sha1="3e6c17470ce5a92b28fa476c94ae0b84ab01e9c2" offset="0x0000"/> </dataarea> </part> </software> @@ -1776,10 +1951,11 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_ram" /> <dataarea name="5000" size="0x4000"> - <rom name="land battle.50" size="0x4000" crc="3825c25b" sha1="97073f31a8c9b5b04e773fcb145c4235a4712ff7" offset="0000"/> + <rom name="land battle.50" size="0x4000" crc="3825c25b" sha1="97073f31a8c9b5b04e773fcb145c4235a4712ff7" offset="0x0000"/> </dataarea> - <dataarea name="D000_RAM8" size="0x800"> + <dataarea name="ram" size="0x800"> </dataarea> </part> </software> @@ -1789,8 +1965,9 @@ <year>1983</year> <publisher>Activision</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="league of light.50" size="0x4000" crc="b4287b95" sha1="ea729d124f02b87e3357ae62cce0f49242073141" offset="0000"/> + <rom name="league of light.50" size="0x4000" crc="b4287b95" sha1="ea729d124f02b87e3357ae62cce0f49242073141" offset="0x0000"/> </dataarea> </part> </software> @@ -1801,11 +1978,12 @@ <publisher>INTV</publisher> <info name="usage" value="Uses Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="magic carousel.50" size="0x4000" crc="a1b985d2" sha1="2fdeb148f4376f1fa8eeff3a887465dfd8ffbb7d" offset="0000"/> + <rom name="magic carousel.50" size="0x4000" crc="a1b985d2" sha1="2fdeb148f4376f1fa8eeff3a887465dfd8ffbb7d" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="magic carousel.d0" size="0x4000" crc="86bc2541" sha1="997a9b9ecb88df4f90f1f8c3cbf817c057c4a933" offset="0000"/> + <rom name="magic carousel.d0" size="0x4000" crc="86bc2541" sha1="997a9b9ecb88df4f90f1f8c3cbf817c057c4a933" offset="0x0000"/> </dataarea> </part> </software> @@ -1815,8 +1993,9 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="masters of the universe ii.50" size="0x4000" crc="bab638f2" sha1="a7ab293fc906d18db415f647634be2f2bed1e93a" offset="0000"/> + <rom name="masters of the universe ii.50" size="0x4000" crc="bab638f2" sha1="a7ab293fc906d18db415f647634be2f2bed1e93a" offset="0x0000"/> </dataarea> </part> </software> @@ -1826,11 +2005,12 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="blowout.50" size="0x2000" crc="f98d2330" sha1="20db3279fb6b792799722e5157c20d5b5227e059" offset="0000"/> + <rom name="blowout.50" size="0x2000" crc="f98d2330" sha1="20db3279fb6b792799722e5157c20d5b5227e059" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="blowout.d0" size="0x2000" crc="f257a189" sha1="3bfc013252af2b05c35be21b01ebaeadd5ce4d0b" offset="0000"/> + <rom name="blowout.d0" size="0x2000" crc="f257a189" sha1="3bfc013252af2b05c35be21b01ebaeadd5ce4d0b" offset="0x0000"/> </dataarea> </part> </software> @@ -1840,8 +2020,9 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="hard hat.50" size="0x4000" crc="b6a3d4de" sha1="88c68c9766932df8ef11f5110881fa9b6954d965" offset="0000"/> + <rom name="hard hat.50" size="0x4000" crc="b6a3d4de" sha1="88c68c9766932df8ef11f5110881fa9b6954d965" offset="0x0000"/> </dataarea> </part> </software> @@ -1851,8 +2032,9 @@ <year>1983</year> <publisher>Activision</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="robot rubble.50" size="0x4000" crc="243b0812" sha1="d2d93bb89701906793a696b8b07a514fcff7428b" offset="0000"/> + <rom name="robot rubble.50" size="0x4000" crc="243b0812" sha1="d2d93bb89701906793a696b8b07a514fcff7428b" offset="0x0000"/> </dataarea> </part> </software> @@ -1862,8 +2044,9 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="space cadet.50" size="0x4000" crc="f8ef3e5a" sha1="f3cfbe285a12194ef2f6087fc70d0ed887c4ec91" offset="0000"/> + <rom name="space cadet.50" size="0x4000" crc="f8ef3e5a" sha1="f3cfbe285a12194ef2f6087fc70d0ed887c4ec91" offset="0x0000"/> </dataarea> </part> </software> @@ -1873,11 +2056,12 @@ <year>1981</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="space shuttle.50" size="0x4000" crc="b16905d6" sha1="ec276c57a954c9bbe032ed166de660e77a7087be" offset="0000"/> + <rom name="space shuttle.50" size="0x4000" crc="b16905d6" sha1="ec276c57a954c9bbe032ed166de660e77a7087be" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="space shuttle.d0" size="0x4000" crc="4b497d5e" sha1="1bc4d9af71b01cae44099297aeb0f00056463b03" offset="0000"/> + <rom name="space shuttle.d0" size="0x4000" crc="4b497d5e" sha1="1bc4d9af71b01cae44099297aeb0f00056463b03" offset="0x0000"/> </dataarea> </part> </software> @@ -1887,14 +2071,15 @@ <year>1983</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="super soccer.50" size="0x4000" crc="02a2fb6c" sha1="b7f75755f019f5f89f99942924bc22bb2c78bd1e" offset="0000"/> + <rom name="super soccer.50" size="0x4000" crc="02a2fb6c" sha1="b7f75755f019f5f89f99942924bc22bb2c78bd1e" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="super soccer.d0" size="0x2000" crc="fd061aff" sha1="2425e6bb365d3d617e80e29580f098eeb5af779b" offset="0000"/> + <rom name="super soccer.d0" size="0x2000" crc="fd061aff" sha1="2425e6bb365d3d617e80e29580f098eeb5af779b" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="super soccer.f0" size="0x2000" crc="3348dc4b" sha1="c723206a8f5b8e445b7ca45ad4bf05d1b36a5ab9" offset="0000"/> + <rom name="super soccer.f0" size="0x2000" crc="3348dc4b" sha1="c723206a8f5b8e445b7ca45ad4bf05d1b36a5ab9" offset="0x0000"/> </dataarea> </part> </software> @@ -1904,8 +2089,9 @@ <year>1982</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="takeover.50" size="0x2000" crc="1f584a69" sha1="47057bd3811689692ac9ef3deed7248e01a5f4f5" offset="0000"/> + <rom name="takeover.50" size="0x2000" crc="1f584a69" sha1="47057bd3811689692ac9ef3deed7248e01a5f4f5" offset="0x0000"/> </dataarea> </part> </software> @@ -1915,8 +2101,9 @@ <year>1978</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="7000" size="0x2000"> - <rom name="imi test cart.70" size="0x2000" crc="7217ca7b" sha1="2ca1ef7426e62c50dfd5b375428cf09e76600944" offset="0000"/> + <rom name="imi test cart.70" size="0x2000" crc="7217ca7b" sha1="2ca1ef7426e62c50dfd5b375428cf09e76600944" offset="0x0000"/> </dataarea> </part> </software> @@ -1926,11 +2113,12 @@ <year>1978</year> <publisher>Mattel Electronics</publisher> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x2000"> - <rom name="mte-201.50" size="0x2000" crc="dab36628" sha1="5e83a945f231f55d5ddfa9527f9b94da06e77058" offset="0000"/> + <rom name="mte-201.50" size="0x2000" crc="dab36628" sha1="5e83a945f231f55d5ddfa9527f9b94da06e77058" offset="0x0000"/> </dataarea> <dataarea name="7000" size="0x2000"> - <rom name="mte-201.70" size="0x2000" crc="5f0d7486" sha1="f4174fdbcd4639bc7356f93552dda913d86e18ac" offset="0000"/> + <rom name="mte-201.70" size="0x2000" crc="5f0d7486" sha1="f4174fdbcd4639bc7356f93552dda913d86e18ac" offset="0x0000"/> </dataarea> </part> </software> @@ -1941,8 +2129,9 @@ <publisher>IntelligentVision</publisher> <info name="serial" value="9111"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="4-tris.50" size="0x4000" crc="b91488e2" sha1="d3d1ea456991a5dd71804f62f59e88debd9cd86f" offset="0000"/> + <rom name="4-tris.50" size="0x4000" crc="b91488e2" sha1="d3d1ea456991a5dd71804f62f59e88debd9cd86f" offset="0x0000"/> </dataarea> </part> </software> @@ -1953,8 +2142,9 @@ <publisher>IntelligentVision</publisher> <info name="serial" value="9113"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="minehunter.50" size="0x4000" crc="a9f1d874" sha1="4bbac2b5264f4d357e7223b2373b078c622c08a9" offset="0000"/> + <rom name="minehunter.50" size="0x4000" crc="a9f1d874" sha1="4bbac2b5264f4d357e7223b2373b078c622c08a9" offset="0x0000"/> </dataarea> </part> </software> @@ -1965,14 +2155,15 @@ <publisher>IntelligentVision</publisher> <info name="serial" value="9114"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="samegame and robots.50" size="0x4000" crc="9092f2e6" sha1="0c29a0b4de011874f27c517f1f9ef16b16fdb4fc" offset="0000"/> + <rom name="samegame and robots.50" size="0x4000" crc="9092f2e6" sha1="0c29a0b4de011874f27c517f1f9ef16b16fdb4fc" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="samegame and robots.d0" size="0x2000" crc="675698d3" sha1="dbcc9090a3614a86dfa9747079857fe6e0c65b97" offset="0000"/> + <rom name="samegame and robots.d0" size="0x2000" crc="675698d3" sha1="dbcc9090a3614a86dfa9747079857fe6e0c65b97" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="samegame and robots.f0" size="0x2000" crc="1a198ae9" sha1="8553cdaae55e2c0d579a0f06f857c79323d7efb6" offset="0000"/> + <rom name="samegame and robots.f0" size="0x2000" crc="1a198ae9" sha1="8553cdaae55e2c0d579a0f06f857c79323d7efb6" offset="0x0000"/> </dataarea> </part> </software> @@ -1983,15 +2174,16 @@ <publisher>IntelligentVision</publisher> <info name="serial" value="9112"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="stonix.50" size="0x4000" crc="9af3ca58" sha1="46302bcdc15afc28968649cbdeb804e0190c251e" offset="0000"/> + <rom name="stonix.50" size="0x4000" crc="9af3ca58" sha1="46302bcdc15afc28968649cbdeb804e0190c251e" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="stonix.d0" size="0x2000" crc="9c5c4301" sha1="3eb7cb8a62080ff8ac2ac83c888cf5155a97d991" offset="0000"/> + <rom name="stonix.d0" size="0x2000" crc="9c5c4301" sha1="3eb7cb8a62080ff8ac2ac83c888cf5155a97d991" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="stonix.f0" size="0x2000" crc="baea7cb2" sha1="83a49852a6612be840e8ae75302784b99251946f" offset="0000"/> + <rom name="stonix.f0" size="0x2000" crc="baea7cb2" sha1="83a49852a6612be840e8ae75302784b99251946f" offset="0x0000"/> </dataarea> </part> </software> -</softwarelist>
\ No newline at end of file +</softwarelist> diff --git a/hash/intvecs.xml b/hash/intvecs.xml index ba4571b98b4..1136c341ace 100644 --- a/hash/intvecs.xml +++ b/hash/intvecs.xml @@ -11,11 +11,12 @@ <info name="serial" value="4543"/> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="jetsons ways with words.50" size="0x4000" crc="3fc55c1e" sha1="35b92617f6ff725e1b7f5d255c21a4e7fa8a3bc7" offset="0000"/> + <rom name="jetsons ways with words.50" size="0x4000" crc="3fc55c1e" sha1="35b92617f6ff725e1b7f5d255c21a4e7fa8a3bc7" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="jetsons ways with words.d0" size="0x2000" crc="e089cb46" sha1="275ac1f258aaa611163398d9b95a84bad69cd1ae" offset="0000"/> + <rom name="jetsons ways with words.d0" size="0x2000" crc="e089cb46" sha1="275ac1f258aaa611163398d9b95a84bad69cd1ae" offset="0x0000"/> </dataarea> </part> </software> @@ -27,11 +28,12 @@ <info name="serial" value="4540"/> <info name="usage" value="Requires ECS and Music Synthesizer"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="melody blaster.50" size="0x4000" crc="52b96271" sha1="0a1557a2d5720b7116fab60d7ab528189a23be03" offset="0000"/> + <rom name="melody blaster.50" size="0x4000" crc="52b96271" sha1="0a1557a2d5720b7116fab60d7ab528189a23be03" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="melody blaster.d0" size="0x2000" crc="7be551d9" sha1="ff2280d8894b996f6561e75544b62ec81b195e65" offset="0000"/> + <rom name="melody blaster.d0" size="0x2000" crc="7be551d9" sha1="ff2280d8894b996f6561e75544b62ec81b195e65" offset="0x0000"/> </dataarea> </part> </software> @@ -43,11 +45,12 @@ <info name="serial" value="4531"/> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="mind strike.50" size="0x4000" crc="604ba84a" sha1="b3e84a8decdf0cc6fe6471671c256a18dc61f34a" offset="0000"/> + <rom name="mind strike.50" size="0x4000" crc="604ba84a" sha1="b3e84a8decdf0cc6fe6471671c256a18dc61f34a" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="mind strike.d0" size="0x2000" crc="297717bd" sha1="e38fd12edffe278a283e08b42965fab6fd65b03d" offset="0000"/> + <rom name="mind strike.d0" size="0x2000" crc="297717bd" sha1="e38fd12edffe278a283e08b42965fab6fd65b03d" offset="0x0000"/> </dataarea> </part> </software> @@ -59,11 +62,12 @@ <info name="serial" value="4536"/> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="mr basic meets bits n bytes.50" size="0x4000" crc="b11a5c27" sha1="66dc40f0cf3d6326452620912ac6aec0f21a0484" offset="0000"/> + <rom name="mr basic meets bits n bytes.50" size="0x4000" crc="b11a5c27" sha1="66dc40f0cf3d6326452620912ac6aec0f21a0484" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="mr basic meets bits n bytes.d0" size="0x2000" crc="e6f08b02" sha1="b879b3ee76315b5369593cf142da6dab8eaebf71" offset="0000"/> + <rom name="mr basic meets bits n bytes.d0" size="0x2000" crc="e6f08b02" sha1="b879b3ee76315b5369593cf142da6dab8eaebf71" offset="0x0000"/> </dataarea> </part> </software> @@ -75,8 +79,9 @@ <info name="serial" value="4533"/> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="scooby doo maze chase.50" size="0x4000" crc="e9e3f60d" sha1="4e8b7c7308162f58d36b4afe748a408f8e40c63b" offset="0000"/> + <rom name="scooby doo maze chase.50" size="0x4000" crc="e9e3f60d" sha1="4e8b7c7308162f58d36b4afe748a408f8e40c63b" offset="0x0000"/> </dataarea> </part> </software> @@ -88,17 +93,17 @@ <info name="serial" value="4537"/> <info name="usage" value="Requires ECS and Intellivoice"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_wsmlb" /> <dataarea name="5000" size="0x4000"> - <rom name="world series major league baseball.50" size="0x4000" crc="cc7ffde7" sha1="926971342db595baab8c352b6179935774ccbcdb" offset="0000"/> + <rom name="world series major league baseball.50" size="0x4000" crc="cc7ffde7" sha1="926971342db595baab8c352b6179935774ccbcdb" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x4000"> - <rom name="world series major league baseball.d0" size="0x4000" crc="839fa5c7" sha1="1ef12665079d1ce50bd2419b668344a08c9a872f" offset="0000"/> + <rom name="world series major league baseball.d0" size="0x4000" crc="839fa5c7" sha1="1ef12665079d1ce50bd2419b668344a08c9a872f" offset="0x0000"/> </dataarea> - <dataarea name="F000" size="0x2000"> - <rom name="world series major league baseball (page 0).f0" size="0x2000" crc="a0f2fe49" sha1="fab397b49c5a7db53a501caea42fce169da5a31a" offset="0000"/> - </dataarea> - <dataarea name="F000_bank1" size="0x2000"> - <rom name="world series major league baseball (page 1).f0" size="0x2000" crc="94d6b056" sha1="df2a8c950dd1c398db901a624c04322d2b4f2782" offset="0000"/> + <!-- two ROM pages --> + <dataarea name="F000" size="0x4000"> + <rom name="world series major league baseball (page 0).f0" size="0x2000" crc="a0f2fe49" sha1="fab397b49c5a7db53a501caea42fce169da5a31a" offset="0x0000"/> + <rom name="world series major league baseball (page 1).f0" size="0x2000" crc="94d6b056" sha1="df2a8c950dd1c398db901a624c04322d2b4f2782" offset="0x2000"/> </dataarea> </part> </software> @@ -109,19 +114,20 @@ <publisher>Mattel Electronics</publisher> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_gfact" /> <dataarea name="5000" size="0x4000"> - <rom name="game factory.50" size="0x4000" crc="0838f681" sha1="f15230e32f4ee7e6371d8c4e214b8562044cfebf" offset="0000"/> + <rom name="game factory.50" size="0x4000" crc="0838f681" sha1="f15230e32f4ee7e6371d8c4e214b8562044cfebf" offset="0x0000"/> </dataarea> <dataarea name="9000" size="0x4000"> - <rom name="game factory.90" size="0x4000" crc="5e491625" sha1="464798a8fefb6bf6e91f81ff6fd6caed4cfa002e" offset="0000"/> + <rom name="game factory.90" size="0x4000" crc="5e491625" sha1="464798a8fefb6bf6e91f81ff6fd6caed4cfa002e" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="game factory.d0" size="0x2000" crc="71f48e85" sha1="3a8327cf2aee60a5ad98bf124784b50a8aff2fab" offset="0000"/> + <rom name="game factory.d0" size="0x2000" crc="71f48e85" sha1="3a8327cf2aee60a5ad98bf124784b50a8aff2fab" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="game factory.f0" size="0x2000" crc="7a8585e8" sha1="691ece0f6426ea5ada71f8615ca6eed24bef4578" offset="0000"/> + <rom name="game factory.f0" size="0x2000" crc="7a8585e8" sha1="691ece0f6426ea5ada71f8615ca6eed24bef4578" offset="0x0000"/> </dataarea> - <dataarea name="8800_RAM8" size="0x800"> + <dataarea name="ram" size="0x800"> </dataarea> </part> </software> @@ -132,14 +138,15 @@ <publisher>Mattel Electronics</publisher> <info name="usage" value="Requires ECS and Keyboard"/> <part name="cart" interface="intv_cart"> + <feature name="slot" value="intv_rom" /> <dataarea name="5000" size="0x4000"> - <rom name="number jumble.50" size="0x4000" crc="56ac640c" sha1="4cd87295b6c473a6d48b836c11e29169a2a28d11" offset="0000"/> + <rom name="number jumble.50" size="0x4000" crc="56ac640c" sha1="4cd87295b6c473a6d48b836c11e29169a2a28d11" offset="0x0000"/> </dataarea> <dataarea name="D000" size="0x2000"> - <rom name="number jumble.d0" size="0x2000" crc="2be04ed6" sha1="d86953713d178c287f502955458f9943d1dfe0a1" offset="0000"/> + <rom name="number jumble.d0" size="0x2000" crc="2be04ed6" sha1="d86953713d178c287f502955458f9943d1dfe0a1" offset="0x0000"/> </dataarea> <dataarea name="F000" size="0x2000"> - <rom name="number jumble.f0" size="0x2000" crc="c5dac500" sha1="ff4a42b95f99f02cabcf8018b55f4d113404833a" offset="0000"/> + <rom name="number jumble.f0" size="0x2000" crc="c5dac500" sha1="ff4a42b95f99f02cabcf8018b55f4d113404833a" offset="0x0000"/> </dataarea> </part> </software> diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak index a6cd026c0a8..3baeace9b15 100644 --- a/src/emu/bus/bus.mak +++ b/src/emu/bus/bus.mak @@ -415,6 +415,20 @@ endif #------------------------------------------------- # +#@src/emu/bus/intv/slot.h,BUSES += INTV +#------------------------------------------------- + +ifneq ($(filter INTV,$(BUSES)),) +OBJDIRS += $(BUSOBJ)/intv +BUSOBJS += $(BUSOBJ)/intv/slot.o +BUSOBJS += $(BUSOBJ)/intv/rom.o +BUSOBJS += $(BUSOBJ)/intv/voice.o +BUSOBJS += $(BUSOBJ)/intv/ecs.o +endif + + +#------------------------------------------------- +# #@src/emu/bus/isa/isa.h,BUSES += ISA #------------------------------------------------- diff --git a/src/emu/bus/intv/ecs.c b/src/emu/bus/intv/ecs.c new file mode 100644 index 00000000000..6b42f004bab --- /dev/null +++ b/src/emu/bus/intv/ecs.c @@ -0,0 +1,588 @@ +/*********************************************************************************************************** + + + Mattel Intellivision Entertainment Computer System expansion emulation + + TODO: + - Make paged rom emulation more accurate (according to + http://spatula-city.org/~im14u2c/intv/tech/ecs.html + writes to $xa5y should be available for every x and every y, i.e. we shall + have writes to every 4K chunk of the memory map, and there shall be 16 pages + for each) + Current emulation is instead tailored around the minimal usage necessary to + make the main expansion and World Series Major League Baseball happy + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "ecs.h" + + +//------------------------------------------------- +// intv_ecs_device - constructor +//------------------------------------------------- + +const device_type INTV_ROM_ECS = &device_creator<intv_ecs_device>; + +intv_ecs_device::intv_ecs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intv_rom_device(mconfig, INTV_ROM_ECS, "Intellivision ECS Expansion", tag, owner, clock, "intv_ecs", __FILE__), + m_snd(*this, "ay8914"), + m_subslot(*this, "subslot"), + m_keybd(*this, "ROW"), + m_synth(*this, "SYNTH"), + m_cntrlsel(*this, "CNTRLSEL"), + m_options(*this, "OPTIONS"), + m_keypad(*this, "KEYPAD"), + m_disc(*this, "DISC"), + m_discx(*this, "DISCX"), + m_discy(*this, "DISCY"), + m_psg_porta(0), + m_voice_enabled(false), + m_ramd0_enabled(false), + m_ram88_enabled(false) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void intv_ecs_device::device_start() +{ + // if the ECS is mounted directly in the system, use device rom and alloc RAM + if (m_rom == NULL) + { + astring region_tag; + m_rom = memregion(region_tag.cpy(tag()).cat(":ecs"))->base(); + } + if (!m_ram.count()) + { + m_ram.resize(0x800); + } + + save_item(NAME(m_bank_base)); + save_item(NAME(m_psg_porta)); +} + +void intv_ecs_device::device_reset() +{ + memset(m_bank_base, 0, sizeof(m_bank_base)); +} + +void intv_ecs_device::late_subslot_setup() +{ + switch (m_subslot->get_type()) + { + case INTV_RAM: + m_ramd0_enabled = true; + break; + case INTV_GFACT: + m_ram88_enabled = true; + break; + case INTV_VOICE: + m_voice_enabled = true; + m_subslot->late_subslot_setup(); + break; + case INTV_ECS: + printf("WARNING: You cannot connect serially multiple ECS units.\n"); + printf("WARNING: Emulation will likely misbehave.\n"); + break; + case INTV_KEYCOMP: + printf("WARNING: You cannot connect the Keyboard component to the ECS unit.\n"); + printf("WARNING: Emulation will likely misbehave.\n"); + break; + } +} + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( sub_slot ) +//------------------------------------------------- + +UINT8 intv_ecs_device::intv_control_r(int hand) +{ + static const UINT8 keypad_table[] = + { + 0xFF, 0x3F, 0x9F, 0x5F, 0xD7, 0xB7, 0x77, 0xDB, + 0xBB, 0x7B, 0xDD, 0xBD, 0x7D, 0xDE, 0xBE, 0x7E + }; + + static const UINT8 disc_table[] = + { + 0xF3, 0xE3, 0xE7, 0xF7, 0xF6, 0xE6, 0xEE, 0xFE, + 0xFC, 0xEC, 0xED, 0xFD, 0xF9, 0xE9, 0xEB, 0xFB + }; + + static const UINT8 discyx_table[5][5] = + { + { 0xE3, 0xF3, 0xFB, 0xEB, 0xE9 }, + { 0xE7, 0xE3, 0xFB, 0xE9, 0xF9 }, + { 0xF7, 0xF7, 0xFF, 0xFD, 0xFD }, + { 0xF6, 0xE6, 0xFE, 0xEC, 0xED }, + { 0xE6, 0xEE, 0xFE, 0xFC, 0xEC } + }; + + int x, y; + UINT8 val = 0xff; + + /* keypad */ + x = m_keypad[hand]->read(); + for (y = 0; y < 16; y++) + { + if (x & (1 << y)) + { + val &= keypad_table[y]; + } + } + + switch ((m_options->read() >> hand) & 4) + { + case 0: /* disc == digital */ + default: + + x = m_disc[hand]->read(); + for (y = 0; y < 16; y++) + { + if (x & (1 << y)) + { + val &= disc_table[y]; + } + } + break; + + case 1: /* disc == _fake_ analog */ + + x = m_discx[hand]->read(); + y = m_discy[hand]->read(); + val &= discyx_table[y / 32][x / 32]; + } + + return val; +} + +READ8_MEMBER( intv_ecs_device::ay_porta_r ) +{ + if (m_cntrlsel->read() == 0) + return intv_control_r(0); + else + return 0xff; // not sure what to return here, maybe it should be last output? +} + +READ8_MEMBER( intv_ecs_device::ay_portb_r ) +{ + switch (m_cntrlsel->read()) + { + case 0x00: // hand controller + return intv_control_r(1); + + case 0x01: // synthesizer keyboard + { + UINT8 val = 0xff; + // return correct result if more than one bit of 0xFE is set + for (int i = 0; i < 7; i++) + { + if (BIT(m_psg_porta, i)) + val &= m_synth[i]->read(); + } + return val; + } + case 0x02: // ecs keyboard + { + UINT8 val = 0xff; + // return correct result if more than one bit of 0xFE is set + for (int i = 0; i < 7; i++) + { + if (BIT(m_psg_porta, i)) + val &= m_keybd[i]->read(); + } + return val; + } + default: + return 0xff; + } +} + +WRITE8_MEMBER( intv_ecs_device::ay_porta_w ) +{ + m_psg_porta = (~data) & 0xff; +} + +static MACHINE_CONFIG_FRAGMENT( sub_slot ) + MCFG_SPEAKER_STANDARD_MONO("mono_ecs") + + MCFG_SOUND_ADD("ay8914", AY8914, XTAL_3_579545MHz/2) + MCFG_AY8910_PORT_A_READ_CB(READ8(intv_ecs_device, ay_porta_r)) + MCFG_AY8910_PORT_B_READ_CB(READ8(intv_ecs_device, ay_portb_r)) + MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(intv_ecs_device, ay_porta_w)) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono_ecs", 0.33) + + MCFG_INTV_CARTRIDGE_ADD("subslot", intv_cart, NULL) +MACHINE_CONFIG_END + + +machine_config_constructor intv_ecs_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( sub_slot ); +} + + +ROM_START( ecs ) + ROM_REGION( 0x20000, "ecs", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "ecs_rom.20", 0x04000, 0x2000, CRC(5f9d05e5) SHA1(083a3e7405b8f8b4b8a5003ca9c31b8d824b535c)) + ROM_LOAD16_WORD_SWAP( "ecs_rom.70", 0x0e000, 0x2000, CRC(46bb1f48) SHA1(eda44a8476fdada1ae90fba0d0287611e2efa074)) + ROM_LOAD16_WORD_SWAP( "ecs_rom.e0", 0x1c000, 0x2000, CRC(c2ebcd90) SHA1(b3c14955f56c57e6f0d8fbb695771946cfcf6582)) +ROM_END + +const rom_entry *intv_ecs_device::device_rom_region() const +{ + return ROM_NAME( ecs ); +} + + +static INPUT_PORTS_START( intv_ecs_kbd ) +/* + ECS matrix scanned by setting 0xFE bits to output and reading 0xFF + ECS Keyboard Layout: + FF\FE Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 + Bit 0 NC RTN 0 ESC P ; . (left) + Bit 1 L O 8 9 I K M , + Bit 2 J U 6 7 Y H B N + Bit 3 G T 4 5 R F C V + Bit 4 D E 2 3 W S Z X + Bit 5 A CTL (right) 1 Q (up) (down) (space) + Bit 6 SHIFT NC NC NC NC NC NC NC + + Shifted keys that differ from pc: + Key : 1 2 5 6 7 (left) (right) (up) (down) + Shift + key: = " + - / % ' ^ ? + */ + + PORT_START("ROW.0") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RTN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR('%') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.1") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.2") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('-') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.3") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.4") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.5") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTL") PORT_CODE(KEYCODE_RCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('\'') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('=') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('^') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR('?') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + + PORT_START("ROW.6") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x02) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( intv_ecs_synth ) +/* + ECS Synthesizer Layout: + FF\FE Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 + Bit 0 G2 Gb2 F2 E2 Eb2 D2 Db2 C2 + Bit 1 Eb3 D3 Db3 C3 B2 Bb2 A2 Ab2 + Bit 2 B3 Bb3 A3 Ab3 G3 Gb3 F3 E3 + Bit 3 G4 Gb4 F4 E4 Eb4 D4 Db4 C4 + Bit 4 Eb5 D5 Db5 C5 B4 Bb4 A4 Ab4 + Bit 5 B5 Bb5 A5 Ab5 G5 Gb5 F5 E5 + Bit 6 C6 NC NC NC NC NC NC NC + */ + PORT_START("SYNTH.0") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.1") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.2") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.3") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.4") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.5") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + + PORT_START("SYNTH.6") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x01) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +static INPUT_PORTS_START( intv_ecs_pads ) + // First ECS Hand Controller + PORT_START("KEYPAD.0") + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3/Upper") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3/Lower-Left") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3/Lower-Right") PORT_PLAYER(3) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("DISC.0") + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P3/Up") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P3/Right") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P3/Down") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P3/Left") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + + PORT_START("DISCX.0") + PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P3/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + + PORT_START("DISCY.0") + PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P3/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + + // Second ECS Hand Controller + PORT_START("KEYPAD.1") + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/1") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/2") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/3") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/4") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/5") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/6") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/7") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/8") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/9") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Clear") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/0") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Enter") PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4/Upper") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4/Lower-Left") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4/Lower-Right") PORT_PLAYER(4) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("DISC.1") + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P4/Up") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P4/Right") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P4/Down") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P4/Left") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + + PORT_START("DISCX.1") + PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P4/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_D) PORT_CODE_INC(KEYCODE_G) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + + PORT_START("DISCY.1") + PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P4/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_R) PORT_CODE_INC(KEYCODE_F) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) +INPUT_PORTS_END + +static INPUT_PORTS_START( intv_ecs ) + PORT_INCLUDE( intv_ecs_pads ) + PORT_INCLUDE( intv_ecs_synth ) + PORT_INCLUDE( intv_ecs_kbd ) + + PORT_START("OPTIONS") + PORT_CONFNAME( 0x04, 0x00, "ECS_P3 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_CONFSETTING( 0x00, "Digital" ) + PORT_CONFSETTING( 0x04, "Analog" ) + PORT_CONFNAME( 0x08, 0x00, "ECS_P4 Disc" ) PORT_CONDITION("CNTRLSEL",0x0f,EQUALS,0x00) + PORT_CONFSETTING( 0x00, "Digital" ) + PORT_CONFSETTING( 0x08, "Analog" ) + + PORT_START("CNTRLSEL") + PORT_CONFNAME( 0x0F, 0x02, "ECS Controller") + PORT_CONFSETTING( 0x00, "Gamepads" ) + PORT_CONFSETTING( 0x01, "Piano" ) + PORT_CONFSETTING( 0x02, "Keyboard" ) +INPUT_PORTS_END + +ioport_constructor intv_ecs_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( intv_ecs ); +} + + +/*------------------------------------------------- + Paged ROM handling + -------------------------------------------------*/ + +READ16_MEMBER(intv_ecs_device::read_rom20) +{ + if (m_bank_base[2]) + return INTV_ROM16_READ(offset + 0x2000); + else + return 0xffff; +} + +READ16_MEMBER(intv_ecs_device::read_rom70) +{ + if (m_bank_base[7]) + return 0xffff; + else + return INTV_ROM16_READ(offset + 0x7000); +} + +READ16_MEMBER(intv_ecs_device::read_rome0) +{ + if (m_bank_base[14]) + return INTV_ROM16_READ(offset + 0xe000); + else // if WSMLB is loaded, it shall go here, otherwise 0xffff + return m_subslot->read_rome0(space, offset, mem_mask); +} + +READ16_MEMBER(intv_ecs_device::read_romf0) +{ + // only WSMLB should come here with bank_base = 1 + if (m_bank_base[15]) + return m_subslot->read_romf0(space, offset + 0x1000, mem_mask); + else + return m_subslot->read_romf0(space, offset, mem_mask); +} + + +/*------------------------------------------------- + read_audio + -------------------------------------------------*/ + +READ16_MEMBER(intv_ecs_device::read_ay) +{ + if (ACCESSING_BITS_0_7) + return m_snd->read(space, offset, mem_mask); + else + return 0xffff; +} + +/*------------------------------------------------- + write_audio + -------------------------------------------------*/ + +WRITE16_MEMBER(intv_ecs_device::write_ay) +{ + if (ACCESSING_BITS_0_7) + return m_snd->write(space, offset, data, mem_mask); +} + diff --git a/src/emu/bus/intv/ecs.h b/src/emu/bus/intv/ecs.h new file mode 100644 index 00000000000..6db3609c7ce --- /dev/null +++ b/src/emu/bus/intv/ecs.h @@ -0,0 +1,145 @@ +#ifndef __INTV_ECS_H +#define __INTV_ECS_H + +#include "slot.h" +#include "rom.h" +#include "sound/ay8910.h" + + + +// ======================> intv_ecs_device + +class intv_ecs_device : public intv_rom_device +{ +public: + // construction/destruction + intv_ecs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual machine_config_constructor device_mconfig_additions() const; + virtual ioport_constructor device_input_ports() const; + virtual const rom_entry *device_rom_region() const; + + // reading and writing + + // actual ECS accesses + // paged ROMs + virtual DECLARE_READ16_MEMBER(read_rom20); + virtual DECLARE_READ16_MEMBER(read_rom70); + virtual DECLARE_READ16_MEMBER(read_rome0); + virtual DECLARE_READ16_MEMBER(read_romf0); + // RAM + virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; } + virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; } + // AY8914 + virtual DECLARE_READ16_MEMBER(read_ay); + virtual DECLARE_WRITE16_MEMBER(write_ay); + DECLARE_READ8_MEMBER(ay_porta_r); + DECLARE_READ8_MEMBER(ay_portb_r); + DECLARE_WRITE8_MEMBER(ay_porta_w); + + // passthru accesses + virtual DECLARE_READ16_MEMBER(read_rom04) { return m_subslot->read_rom04(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom40) { return m_subslot->read_rom40(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom48) { return m_subslot->read_rom48(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom50) { return m_subslot->read_rom50(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom60) { return m_subslot->read_rom60(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom80) + { + if (m_ram88_enabled && offset >= 0x800) + return m_subslot->read_ram(space, offset & 0x7ff, mem_mask); + else + return m_subslot->read_rom80(space, offset, mem_mask); + } + virtual DECLARE_READ16_MEMBER(read_rom90) { return m_subslot->read_rom90(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_roma0) { return m_subslot->read_roma0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romb0) { return m_subslot->read_romb0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romc0) { return m_subslot->read_romc0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romd0) + { + if (m_ramd0_enabled && offset < 0x800) + return m_subslot->read_ram(space, offset, mem_mask); + else + return m_subslot->read_romd0(space, offset, mem_mask); + } + + // paged ROM banking + virtual DECLARE_WRITE16_MEMBER(write_rom20) + { + if (offset == 0xfff) + { + if (data == 0x2a50) + m_bank_base[2] = 0; + else if (data == 0x2a51) + m_bank_base[2] = 1; + } + } + virtual DECLARE_WRITE16_MEMBER(write_rom70) + { + if (offset == 0xfff) + { + if (data == 0x7a50) + m_bank_base[7] = 0; + else if (data == 0x7a51) + m_bank_base[7] = 1; + } + } + virtual DECLARE_WRITE16_MEMBER(write_rome0) + { + if (offset == 0xfff) + { + if (data == 0xea50) + m_bank_base[14] = 0; + else if (data == 0xea51) + m_bank_base[14] = 1; + } + } + virtual DECLARE_WRITE16_MEMBER(write_romf0) + { + if (offset == 0xfff) + { + if (data == 0xfa50) + m_bank_base[15] = 0; + else if (data == 0xfa51) + m_bank_base[15] = 1; + } + } + // RAM passthru write + virtual DECLARE_WRITE16_MEMBER(write_88) { if (m_ram88_enabled) m_subslot->write_ram(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_d0) { if (m_ramd0_enabled) m_subslot->write_ram(space, offset, data, mem_mask); } + // IntelliVoice passthru + virtual DECLARE_READ16_MEMBER(read_speech) { if (m_voice_enabled) return m_subslot->read_speech(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_WRITE16_MEMBER(write_speech) { if (m_voice_enabled) m_subslot->write_speech(space, offset, data, mem_mask); } + + virtual void late_subslot_setup(); + + UINT8 intv_control_r(int hand); + +private: + + required_device<ay8914_device> m_snd; + required_device<intv_cart_slot_device> m_subslot; + required_ioport_array<7> m_keybd; + required_ioport_array<7> m_synth; + required_ioport m_cntrlsel; + required_ioport m_options; + required_ioport_array<2> m_keypad; + required_ioport_array<2> m_disc; + required_ioport_array<2> m_discx; + required_ioport_array<2> m_discy; + + int m_bank_base[0x10]; + UINT8 m_psg_porta; + bool m_voice_enabled, m_ramd0_enabled, m_ram88_enabled; +}; + + + + + +// device type definition +extern const device_type INTV_ROM_ECS; + +#endif diff --git a/src/emu/bus/intv/rom.c b/src/emu/bus/intv/rom.c new file mode 100644 index 00000000000..6bc190f4a83 --- /dev/null +++ b/src/emu/bus/intv/rom.c @@ -0,0 +1,50 @@ +/*********************************************************************************************************** + + + Mattel Intellivision cart emulation + + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "rom.h" + + +//------------------------------------------------- +// intv_rom_device - constructor +//------------------------------------------------- + +const device_type INTV_ROM_STD = &device_creator<intv_rom_device>; +const device_type INTV_ROM_RAM = &device_creator<intv_ram_device>; +const device_type INTV_ROM_GFACT = &device_creator<intv_gfact_device>; +const device_type INTV_ROM_WSMLB = &device_creator<intv_wsmlb_device>; + + +intv_rom_device::intv_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) + : device_t(mconfig, type, name, tag, owner, clock, shortname, source), + device_intv_cart_interface( mconfig, *this ) +{ +} + +intv_rom_device::intv_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, INTV_ROM_STD, "Intellivision Standard Carts", tag, owner, clock, "intv_rom", __FILE__), + device_intv_cart_interface( mconfig, *this ) +{ +} + +intv_ram_device::intv_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intv_rom_device(mconfig, INTV_ROM_RAM, "Intellivision Carts w/RAM", tag, owner, clock, "intv_ram", __FILE__) +{ +} + +intv_gfact_device::intv_gfact_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intv_rom_device(mconfig, INTV_ROM_GFACT, "Intellivision Game Factory Cart", tag, owner, clock, "intv_gfact", __FILE__) +{ +} + +intv_wsmlb_device::intv_wsmlb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intv_rom_device(mconfig, INTV_ROM_WSMLB, "Intellivision World Series Baseball Cart", tag, owner, clock, "intv_wsmlb", __FILE__) +{ +} + diff --git a/src/emu/bus/intv/rom.h b/src/emu/bus/intv/rom.h new file mode 100644 index 00000000000..2eb13cc5c76 --- /dev/null +++ b/src/emu/bus/intv/rom.h @@ -0,0 +1,82 @@ +#ifndef __INTV_ROM_H +#define __INTV_ROM_H + +#include "slot.h" + + +// ======================> intv_rom_device + +class intv_rom_device : public device_t, + public device_intv_cart_interface +{ +public: + // construction/destruction + intv_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + intv_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // reading and writing + virtual DECLARE_READ16_MEMBER(read_rom04) { return INTV_ROM16_READ(offset + 0x0400); } + virtual DECLARE_READ16_MEMBER(read_rom20) { return INTV_ROM16_READ(offset + 0x2000); } + virtual DECLARE_READ16_MEMBER(read_rom40) { return INTV_ROM16_READ(offset + 0x4000); } + virtual DECLARE_READ16_MEMBER(read_rom48) { return INTV_ROM16_READ(offset + 0x4800); } + virtual DECLARE_READ16_MEMBER(read_rom50) { return INTV_ROM16_READ(offset + 0x5000); } + virtual DECLARE_READ16_MEMBER(read_rom60) { return INTV_ROM16_READ(offset + 0x6000); } + virtual DECLARE_READ16_MEMBER(read_rom70) { return INTV_ROM16_READ(offset + 0x7000); } + virtual DECLARE_READ16_MEMBER(read_rom80) { return INTV_ROM16_READ(offset + 0x8000); } + virtual DECLARE_READ16_MEMBER(read_rom90) { return INTV_ROM16_READ(offset + 0x9000); } + virtual DECLARE_READ16_MEMBER(read_roma0) { return INTV_ROM16_READ(offset + 0xa000); } + virtual DECLARE_READ16_MEMBER(read_romb0) { return INTV_ROM16_READ(offset + 0xb000); } + virtual DECLARE_READ16_MEMBER(read_romc0) { return INTV_ROM16_READ(offset + 0xc000); } + virtual DECLARE_READ16_MEMBER(read_romd0) { return INTV_ROM16_READ(offset + 0xd000); } + virtual DECLARE_READ16_MEMBER(read_rome0) { return INTV_ROM16_READ(offset + 0xe000); } + virtual DECLARE_READ16_MEMBER(read_romf0) { return INTV_ROM16_READ(offset + 0xf000); } + + // device-level overrides + virtual void device_start() {} + virtual void device_reset() {} +}; + +// ======================> intv_ram_device + +class intv_ram_device : public intv_rom_device +{ +public: + // construction/destruction + intv_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // reading and writing + virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; } + virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; } +}; + +// ======================> intv_gfact_device + +class intv_gfact_device : public intv_rom_device +{ +public: + // construction/destruction + intv_gfact_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // reading and writing + virtual DECLARE_READ16_MEMBER(read_ram) { return (int)m_ram[offset & (m_ram.count() - 1)]; } + virtual DECLARE_WRITE16_MEMBER(write_ram) { m_ram[offset & (m_ram.count() - 1)] = data & 0xff; } +}; + +// ======================> intv_wsmlb_device + +class intv_wsmlb_device : public intv_rom_device +{ +public: + // construction/destruction + intv_wsmlb_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); +}; + + + +// device type definition +extern const device_type INTV_ROM_STD; +extern const device_type INTV_ROM_RAM; +extern const device_type INTV_ROM_GFACT; +extern const device_type INTV_ROM_WSMLB; + +#endif diff --git a/src/emu/bus/intv/slot.c b/src/emu/bus/intv/slot.c new file mode 100644 index 00000000000..df50465b1c0 --- /dev/null +++ b/src/emu/bus/intv/slot.c @@ -0,0 +1,572 @@ +/*********************************************************************************************************** + + Mattel Intellivision cart emulation + (through slot devices) + + + This is a strange beast, because INTV carts had potentially access to + a *LOT* of memory ranges! + Quoting Joe Zbiciak's documentation for his emu (jzIntv): + + + The Intellivision leaves many addresses available to cartridges. However, + several address ranges come with caveats, such as interactions with other + devices in the system, or incompatibilities with various peripherals. + + Below is a summary. + + ADDRESSES NOTES + -------------- -------------------------------------------------------------- + $0400 - $04FF RAM/ROM ok on all but Intellivision 2. + $0500 - $06FF RAM/ROM ok. + $0700 - $0CFF RAM/ROM ok if no Intellivoice. + $0D00 - $0FFF RAM/ROM ok. + $2000 - $2FFF RAM/ROM ok if no ECS. + $4000 - $47FF RAM/ROM ok if no ECS. + $4800 ROM ok. RAM ok only if boot ROM at $7000. + $4801 - $4FFF RAM/ROM ok. + $5000 - $5014 ROM ok. RAM ok only if boot ROM at $7000 or $4800. + $5015 - $6FFF RAM/ROM ok. + $7000 ROM ok if no ECS. RAM at $7000 confuses EXEC boot sequence. + $7001 - $77FF RAM/ROM ok if no ECS. + $7800 - $7FFF ROM ok if no ECS. Do not map RAM here due to GRAM alias. + $8000 - $8FFF RAM/ROM ok. Avoid STIC alias at $8000 - $803F. + $9000 - $B7FF RAM/ROM ok. + $B800 - $BFFF ROM ok. Do not map RAM here due to GRAM alias. + $C000 - $CFFF RAM/ROM ok. Avoid STIC alias at $C000 - $C03F. + $D000 - $DFFF RAM/ROM ok. + $E000 - $EFFF RAM/ROM ok if no ECS. + $F000 - $F7FF RAM/ROM ok. + $F800 - $FFFF ROM ok. Do not map RAM here due to GRAM alias. + + + We handle this, by always creating a 0x10000 wide ROM region to load the + cart image and exposing the following (long list of) read handlers: + read_rom04 + read_rom20 + read_rom40 + read_rom48 + read_rom50 + read_rom60 + read_rom70 + read_rom80 + read_rom90 + read_roma0 + read_romb0 + read_romc0 + read_romd0 + read_rome0 + read_romf0 + Each pcb types will then use the correct ones for its wiring setup. + + The BIN+CFG format introduced by INTVPC emulator includes metadata about where to + load ROM into memory in the CFG file, but we don't support it (because we don't parse + the CFG at all) and we rely instead on the intv.hsi metadata for fullpath loading of + these. + Alternatively, we support the .ROM format used by jzIntv. + + + TODO: + - Convert also the keyboard component to be a passthru slot device + - Merge some of the ROM accessor above, once it is clear which ones can be merged + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "slot.h" +#include "hashfile.h" + +#define INTELLIVOICE_MASK 0x02 +#define ECS_MASK 0x01 + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type INTV_CART_SLOT = &device_creator<intv_cart_slot_device>; + +//************************************************************************** +// Intellivision Cartridges Interface +//************************************************************************** + +//------------------------------------------------- +// device_intv_cart_interface - constructor +//------------------------------------------------- + +device_intv_cart_interface::device_intv_cart_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device), + m_rom(NULL), + m_rom_size(0) +{ +} + + +//------------------------------------------------- +// ~device_intv_cart_interface - destructor +//------------------------------------------------- + +device_intv_cart_interface::~device_intv_cart_interface() +{ +} + +//------------------------------------------------- +// rom_alloc - alloc the space for the cart +//------------------------------------------------- + +void device_intv_cart_interface::rom_alloc(UINT32 size, const char *tag) +{ + if (m_rom == NULL) + { + astring tempstring(tag); + tempstring.cat(INTVSLOT_ROM_REGION_TAG); + m_rom = device().machine().memory().region_alloc(tempstring, size, 1, ENDIANNESS_LITTLE)->base(); + memset(m_rom, 0xff, size); + m_rom_size = size; + } +} + + +//------------------------------------------------- +// ram_alloc - alloc the space for the ram +//------------------------------------------------- + +void device_intv_cart_interface::ram_alloc(UINT32 size) +{ + m_ram.resize(size); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// intv_cart_slot_device - constructor +//------------------------------------------------- +intv_cart_slot_device::intv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, INTV_CART_SLOT, "Intellivision Cartridge Slot", tag, owner, clock, "intv_cart_slot", __FILE__), + device_image_interface(mconfig, *this), + device_slot_interface(mconfig, *this), + m_type(INTV_STD) +{ +} + + +//------------------------------------------------- +// intv_cart_slot_device - destructor +//------------------------------------------------- + +intv_cart_slot_device::~intv_cart_slot_device() +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void intv_cart_slot_device::device_start() +{ + m_cart = dynamic_cast<device_intv_cart_interface *>(get_card_device()); +} + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void intv_cart_slot_device::device_config_complete() +{ + // set brief and instance name + update_names(); +} + + +//------------------------------------------------- +// INTV PCB +//------------------------------------------------- + +struct intv_slot +{ + int pcb_id; + const char *slot_option; +}; + +// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it +static const intv_slot slot_list[] = +{ + { INTV_STD, "intv_rom" }, + { INTV_RAM, "intv_ram" }, + { INTV_GFACT, "intv_gfact" }, + { INTV_WSMLB, "intv_wsmlb" }, + { INTV_VOICE, "intv_voice" }, + { INTV_ECS, "intv_ecs" }, + { INTV_KEYCOMP, "intv_keycomp" } +}; + +static int intv_get_pcb_id(const char *slot) +{ + for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) + { + if (!core_stricmp(slot_list[i].slot_option, slot)) + return slot_list[i].pcb_id; + } + + return 0; +} + +#if 1 +static const char *intv_get_slot(int type) +{ + for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) + { + if (slot_list[i].pcb_id == type) + return slot_list[i].slot_option; + } + + return "intv_rom"; +} +#endif + +/*------------------------------------------------- + call load + -------------------------------------------------*/ + +int intv_cart_slot_device::load_fullpath() +{ + UINT8 temp; + UINT8 num_segments; + UINT8 start_seg; + UINT8 end_seg; + + UINT32 current_address; + UINT32 end_address; + + UINT8 high_byte; + UINT8 low_byte; + + UINT8 *ROM; + const char *file_type = filetype(); + + /* if it is in .rom format, we enter here */ + if (!core_stricmp (file_type, "rom")) + { + // header + fread(&temp, 1); + if (temp != 0xa8) + return IMAGE_INIT_FAIL; + + fread(&num_segments, 1); + + fread(&temp, 1); + if (temp != (num_segments ^ 0xff)) + return IMAGE_INIT_FAIL; + + m_cart->rom_alloc(0x10000, tag()); + ROM = (UINT8 *)m_cart->get_rom_base(); + + for (int i = 0; i < num_segments; i++) + { + fread(&start_seg, 1); + current_address = start_seg * 0x100; + + fread(&end_seg, 1); + end_address = end_seg * 0x100 + 0xff; + + while (current_address <= end_address) + { + fread(&low_byte, 1); + ROM[(current_address << 1) + 1] = low_byte; + fread(&high_byte, 1); + ROM[current_address << 1] = high_byte; + current_address++; + } + + // Here we should calculate and compare the CRC16... + fread(&temp, 1); + fread(&temp, 1); + } + + // Access tables and fine address restriction tables are not supported ATM + for (int i = 0; i < (16 + 32 + 2); i++) + { + fread(&temp, 1); + } + return IMAGE_INIT_PASS; + } + /* otherwise, we load it as a .bin file, using extrainfo from intv.hsi in place of .cfg */ + else + { + // This code is a blatant hack, due to impossibility to load a separate .cfg file in MESS. + // It shall be eventually replaced by the .xml loading + + // extrainfo format + // 1. mapper number (to deal with bankswitch). no bankswitch is mapper 0 (most games). + // 2.->5. current images have at most 4 chunks of data. we store here block size and location to load + // (value & 0xf0) >> 4 is the location / 0x1000 + // (value & 0x0f) is the size / 0x800 + // 6. some images have a ram chunk. as above we store location and size in 8 bits + // 7. extra = 1 ECS, 2 Intellivoice + int start, size; + int mapper, rom[5], ram, extra; + astring extrainfo; + + m_cart->rom_alloc(0x10000, tag()); + ROM = (UINT8 *)m_cart->get_rom_base(); + + if (!hashfile_extrainfo(*this, extrainfo)) + { + // If no extrainfo, we assume a single 0x2000 chunk at 0x5000 + for (int i = 0; i < 0x2000; i++ ) + { + fread(&low_byte, 1); + ROM[((0x5000 + i) << 1) + 1] = low_byte; + fread(&high_byte, 1); + ROM[(0x5000 + i) << 1] = high_byte; + } + } + else + { + sscanf(extrainfo.cstr() ,"%d %d %d %d %d %d %d", &mapper, &rom[0], &rom[1], &rom[2], + &rom[3], &ram, &extra); + //printf("extrainfo: %d %d %d %d %d %d %d \n", mapper, rom[0], rom[1], rom[2], rom[3], ram, extra); + + if (mapper) + logerror("Bankswitch not yet implemented!\n"); + + if (ram) + { + start = ((ram & 0xf0) >> 4) * 0x1000; + size = (ram & 0x0f) * 0x800; + + if (start == 0xd000 && size == 0x800) + { + m_type = INTV_RAM; + m_cart->ram_alloc(0x800); + } + else if (start == 0x8800 && size == 0x800) + { + m_type = INTV_GFACT; + m_cart->ram_alloc(0x800); + } + else + printf("Unrecognized RAM setup [Start 0x%X - End 0x%X]. Please contact MESSdevs.\n", start, start + size); + } + if (extra & INTELLIVOICE_MASK) + { + printf("WARNING: This game requires emulation of the IntelliVoice module.\n"); + } + + if (extra & ECS_MASK) + { + printf("WARNING: This game requires emulation of the ECS module.\n"); + } + + for (int j = 0; j < 4; j++) + { + start = ((rom[j] & 0xf0) >> 4) * 0x1000; + size = (rom[j] & 0x0f) * 0x800; + + // some cart has to be loaded to 0x4800, but none of the available ones goes to 0x4000. + // Hence, we use 0x04 << 4 in extrainfo (to reduce the stored values) and fix the value here. + if (start == 0x4000) start += 0x800; + +// logerror("step %d: %d %d \n", j, start / 0x1000, size / 0x1000); + + for (int i = 0; i < size; i++) + { + fread(&low_byte, 1); + ROM[((start + i) << 1) + 1] = low_byte; + fread(&high_byte, 1); + ROM[(start + i) << 1] = high_byte; + } + } + } + + return IMAGE_INIT_PASS; + } +} + +bool intv_cart_slot_device::call_load() +{ + if (m_cart) + { + if (software_entry() == NULL) + return load_fullpath(); + else + { + UINT16 offset[] = { 0x400, 0x2000, 0x4000, 0x4800, 0x5000, 0x6000, 0x7000, 0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0xf000}; + const char* region_name[] = {"0400", "2000", "4000", "4800", "5000", "6000", "7000", "8000", "9000", "A000", "B000", "C000", "D000", "E000", "F000"}; + const char *pcb_name = get_feature("slot"); + bool extra_bank = false; + + if (pcb_name) + m_type = intv_get_pcb_id(pcb_name); + + // these two carts have paged roms, which does not work well with our 0x10000 rom region + // so if we are loading one of these, we allocate additional 0x2000 bytes for the paged bank + if (m_type == INTV_WSMLB) + extra_bank = true; + + UINT32 size = 0; + UINT16 address = 0; + UINT8 *ROM, *region; + + m_cart->rom_alloc(extra_bank ? 0x22000 : 0x20000, tag()); + ROM = m_cart->get_rom_base(); + + for (int i = 0; i < 15; i++) + { + address = offset[i]; + size = get_software_region_length(region_name[i]); + if (size) + { + region = get_software_region(region_name[i]); + + for (int j = 0; j < size / 2; j++) + { + ROM[((address + j) << 1) + 1] = region[2 * j]; + ROM[(address + j) << 1] = region[2 * j + 1]; + } + } + } + + if (m_type == INTV_RAM || m_type == INTV_GFACT || m_type == INTV_ECS) + m_cart->ram_alloc(get_software_region_length("ram")); + + //printf("Type: %s\n", intv_get_slot(m_type)); + return IMAGE_INIT_PASS; + } + } + + return IMAGE_INIT_PASS; +} + + +/*------------------------------------------------- + call softlist load + -------------------------------------------------*/ + +bool intv_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) +{ + load_software_part_region(*this, swlist, swname, start_entry); + return TRUE; +} + + +/*------------------------------------------------- + get default card software + -------------------------------------------------*/ + +void intv_cart_slot_device::get_default_card_software(astring &result) +{ + if (open_image_file(mconfig().options())) + { + const char *slot_string = "intv_rom"; + UINT32 len = core_fsize(m_file); + dynamic_buffer rom(len); + int type = INTV_STD; + + core_fread(m_file, rom, len); + + if (rom[0] == 0xa8 && (rom[1] == rom[2] ^ 0xff )) + { + // it's .ROM file, so that we don't have currently any way to distinguish RAM-equipped carts + } + else + { + // assume it's .BIN and try to use .hsi file to determine type (just RAM) + int start; + int mapper, rom[5], ram, extra; + astring extrainfo; + + if (hashfile_extrainfo(*this, extrainfo)) + { + sscanf(extrainfo.cstr() ,"%d %d %d %d %d %d %d", &mapper, &rom[0], &rom[1], &rom[2], + &rom[3], &ram, &extra); + + if (ram) + { + start = ((ram & 0xf0) >> 4) * 0x1000; + if (start == 0xd000) + type = INTV_RAM; + if (start == 0x8800) + type = INTV_GFACT; + } + } + + } + + slot_string = intv_get_slot(type); + + //printf("type: %s\n", slot_string); + clear(); + + result.cpy(slot_string); + return; + } + software_get_default_slot(result, "intv_rom"); +} + +/*------------------------------------------------- + read_ay + -------------------------------------------------*/ + +READ16_MEMBER(intv_cart_slot_device::read_ay) +{ + if (m_cart) + return m_cart->read_ay(space, offset, mem_mask); + else + return 0xffff; +} + +/*------------------------------------------------- + write_ay + -------------------------------------------------*/ + +WRITE16_MEMBER(intv_cart_slot_device::write_ay) +{ + if (m_cart) + m_cart->write_ay(space, offset, data, mem_mask); +} + +/*------------------------------------------------- + read_speech + -------------------------------------------------*/ + +READ16_MEMBER(intv_cart_slot_device::read_speech) +{ + if (m_cart) + return m_cart->read_speech(space, offset, mem_mask); + else + return 0xffff; +} + +/*------------------------------------------------- + write_speech + -------------------------------------------------*/ + +WRITE16_MEMBER(intv_cart_slot_device::write_speech) +{ + if (m_cart) + m_cart->write_speech(space, offset, data, mem_mask); +} + + + +#include "bus/intv/rom.h" +#include "bus/intv/ecs.h" +//#include "bus/intv/keycomp.h" +#include "bus/intv/voice.h" + +SLOT_INTERFACE_START(intv_cart) + SLOT_INTERFACE_INTERNAL("intv_rom", INTV_ROM_STD) + SLOT_INTERFACE_INTERNAL("intv_ram", INTV_ROM_RAM) + SLOT_INTERFACE_INTERNAL("intv_gfact", INTV_ROM_GFACT) + SLOT_INTERFACE_INTERNAL("intv_wsmlb", INTV_ROM_WSMLB) + SLOT_INTERFACE_INTERNAL("intv_voice", INTV_ROM_VOICE) + SLOT_INTERFACE_INTERNAL("intv_ecs", INTV_ROM_ECS) +// SLOT_INTERFACE_INTERNAL("intv_keycomp", INTV_ROM_KEYCOMP) +SLOT_INTERFACE_END + diff --git a/src/emu/bus/intv/slot.h b/src/emu/bus/intv/slot.h new file mode 100644 index 00000000000..e14243f190f --- /dev/null +++ b/src/emu/bus/intv/slot.h @@ -0,0 +1,184 @@ +#ifndef __INTV_SLOT_H +#define __INTV_SLOT_H + +/*************************************************************************** + TYPE DEFINITIONS + ***************************************************************************/ + + +/* PCB */ +enum +{ + INTV_STD = 0, + INTV_RAM, + INTV_GFACT, // has RAM too but at diff offset + INTV_WSMLB, + INTV_VOICE, + INTV_ECS, + INTV_KEYCOMP +}; + + +#define INTV_ROM16_READ(addr) \ + (UINT16) (m_rom[(addr) << 1] | (m_rom[((addr) << 1) + 1] << 8)) + + +// ======================> device_intv_cart_interface + +class device_intv_cart_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_intv_cart_interface(const machine_config &mconfig, device_t &device); + virtual ~device_intv_cart_interface(); + + // reading and writing + virtual DECLARE_READ16_MEMBER(read_rom04) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom20) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom40) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom48) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom50) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom60) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom70) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom80) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom90) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_roma0) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romb0) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romc0) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romd0) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rome0) { return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romf0) { return 0xffff; } + + virtual DECLARE_READ16_MEMBER(read_ram) { return 0xffff; } + virtual DECLARE_WRITE16_MEMBER(write_ram) {} + + // Used by IntelliVoice & ECS + virtual DECLARE_READ16_MEMBER(read_ay) { return 0xffff; } + virtual DECLARE_WRITE16_MEMBER(write_ay) {} + virtual DECLARE_READ16_MEMBER(read_speech) { return 0xffff; } + virtual DECLARE_WRITE16_MEMBER(write_speech) {} + virtual DECLARE_WRITE16_MEMBER(write_d0) {} + virtual DECLARE_WRITE16_MEMBER(write_88) {} + virtual DECLARE_WRITE16_MEMBER(write_rom20) {} + virtual DECLARE_WRITE16_MEMBER(write_rom70) {} + virtual DECLARE_WRITE16_MEMBER(write_rome0) {} + virtual DECLARE_WRITE16_MEMBER(write_romf0) {} + + void rom_alloc(UINT32 size, const char *tag); + void ram_alloc(UINT32 size); + UINT8* get_rom_base() { return m_rom; } + UINT8* get_ram_base() { return m_ram; } + UINT32 get_rom_size() { return m_rom_size; } + UINT32 get_ram_size() { return m_ram.count(); } + + void save_ram() { device().save_item(NAME(m_ram)); } + virtual void late_subslot_setup() {} + +protected: + // internal state + UINT8 *m_rom; + UINT32 m_rom_size; + dynamic_buffer m_ram; +}; + + +// ======================> intv_cart_slot_device + +class intv_cart_slot_device : public device_t, + public device_image_interface, + public device_slot_interface +{ +public: + // construction/destruction + intv_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~intv_cart_slot_device(); + + // device-level overrides + virtual void device_start(); + virtual void device_config_complete(); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload() {} + virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry); + + int get_type() { return m_type; } + int load_fullpath(); + + void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); } + + virtual iodevice_t image_type() const { return IO_CARTSLOT; } + virtual bool is_readable() const { return 1; } + virtual bool is_writeable() const { return 0; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 1; } + virtual const option_guide *create_option_guide() const { return NULL; } + virtual const char *image_interface() const { return "intv_cart"; } + virtual const char *file_extensions() const { return "bin,int,rom,itv"; } + + // slot interface overrides + virtual void get_default_card_software(astring &result); + + // reading and writing + virtual DECLARE_READ16_MEMBER(read_rom04) { if (m_cart) return m_cart->read_rom04(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom20) { if (m_cart) return m_cart->read_rom20(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom40) { if (m_cart) return m_cart->read_rom40(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom48) { if (m_cart) return m_cart->read_rom48(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom50) { if (m_cart) return m_cart->read_rom50(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom60) { if (m_cart) return m_cart->read_rom60(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom70) { if (m_cart) return m_cart->read_rom70(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom80) { if (m_cart) return m_cart->read_rom80(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rom90) { if (m_cart) return m_cart->read_rom90(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_roma0) { if (m_cart) return m_cart->read_roma0(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romb0) { if (m_cart) return m_cart->read_romb0(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romc0) { if (m_cart) return m_cart->read_romc0(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romd0) { if (m_cart) return m_cart->read_romd0(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_rome0) { if (m_cart) return m_cart->read_rome0(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_READ16_MEMBER(read_romf0) { if (m_cart) return m_cart->read_romf0(space, offset, mem_mask); else return 0xffff; } + + virtual DECLARE_READ16_MEMBER(read_ay); + virtual DECLARE_WRITE16_MEMBER(write_ay); + virtual DECLARE_READ16_MEMBER(read_speech); + virtual DECLARE_WRITE16_MEMBER(write_speech); + virtual DECLARE_READ16_MEMBER(read_ram) { if (m_cart) return m_cart->read_ram(space, offset, mem_mask); else return 0xffff; } + virtual DECLARE_WRITE16_MEMBER(write_ram) { if (m_cart) m_cart->write_ram(space, offset, data, mem_mask); } + + virtual void late_subslot_setup() { if (m_cart) return m_cart->late_subslot_setup(); } + + // these RAM accessors are needed to deal with IntelliVoice and ECS mounting RAM-equipped carts + virtual DECLARE_WRITE16_MEMBER(write_d0) { if (m_cart) m_cart->write_d0(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_88) { if (m_cart) m_cart->write_88(space, offset, data, mem_mask); } + + // ECS paged roms need these + virtual DECLARE_WRITE16_MEMBER(write_rom20) { if (m_cart) m_cart->write_rom20(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_rom70) { if (m_cart) m_cart->write_rom70(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_rome0) { if (m_cart) m_cart->write_rome0(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_romf0) { if (m_cart) m_cart->write_romf0(space, offset, data, mem_mask); } + +//protected: + + int m_type; + device_intv_cart_interface* m_cart; +}; + + + +// device type definition +extern const device_type INTV_CART_SLOT; + + +/*************************************************************************** + DEVICE CONFIGURATION MACROS + ***************************************************************************/ + +#define INTVSLOT_ROM_REGION_TAG ":cart:rom" + +#define MCFG_INTV_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ + MCFG_DEVICE_ADD(_tag, INTV_CART_SLOT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \ + + +SLOT_INTERFACE_EXTERN(intv_cart); + +#endif diff --git a/src/emu/bus/intv/voice.c b/src/emu/bus/intv/voice.c new file mode 100644 index 00000000000..ac5bc8cdc5b --- /dev/null +++ b/src/emu/bus/intv/voice.c @@ -0,0 +1,122 @@ +/*********************************************************************************************************** + + + Mattel Intellivoice cart emulation + + TODO: + - speech ROM shall be loaded from softlist + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "voice.h" + + +//------------------------------------------------- +// intv_voice_device - constructor +//------------------------------------------------- + +const device_type INTV_ROM_VOICE = &device_creator<intv_voice_device>; + +intv_voice_device::intv_voice_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : intv_rom_device(mconfig, INTV_ROM_VOICE, "Intellivision Intellivoice Expansion", tag, owner, clock, "intv_voice", __FILE__), + m_speech(*this, "sp0256_speech"), + m_subslot(*this, "subslot"), + m_ramd0_enabled(false), + m_ram88_enabled(false) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void intv_voice_device::device_start() +{ +} + +void intv_voice_device::late_subslot_setup() +{ + switch (m_subslot->get_type()) + { + case INTV_RAM: + m_ramd0_enabled = true; + break; + case INTV_GFACT: + m_ram88_enabled = true; + break; + case INTV_VOICE: + printf("WARNING: You cannot connect serially multiple IntelliVoice units.\n"); + printf("WARNING: Emulation will likely misbehave.\n"); + break; + case INTV_ECS: + printf("WARNING: You cannot connect ECS to IntelliVoice in this manner.\n"); + printf("WARNING: Emulation will likely misbehave.\n"); + break; + case INTV_KEYCOMP: + printf("WARNING: You cannot connect the Keyboard component to the IntelliVoice unit.\n"); + printf("WARNING: Emulation will likely misbehave.\n"); + break; + } +} + + +//------------------------------------------------- +// MACHINE_CONFIG_FRAGMENT( intellivoice ) +//------------------------------------------------- + +static MACHINE_CONFIG_FRAGMENT( intellivoice ) + MCFG_SPEAKER_STANDARD_MONO("mono_voice") + + MCFG_SOUND_ADD("sp0256_speech", SP0256, 3120000) + /* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */ + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono_voice", 1.00) + + MCFG_INTV_CARTRIDGE_ADD("subslot", intv_cart, NULL) +MACHINE_CONFIG_END + + +//------------------------------------------------- +// machine_config_additions - device-specific +// machine configurations +//------------------------------------------------- + +machine_config_constructor intv_voice_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( intellivoice ); +} + + +ROM_START( intellivoice ) + ROM_REGION( 0x10000, "sp0256_speech", 0 ) + /* SP0256-012 Speech chip w/2KiB mask rom */ + ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) ) +ROM_END + +const rom_entry *intv_voice_device::device_rom_region() const +{ + return ROM_NAME( intellivoice ); +} + +/*------------------------------------------------- + read_audio + -------------------------------------------------*/ + +READ16_MEMBER(intv_voice_device::read_speech) +{ + if (ACCESSING_BITS_0_7) + return m_speech->spb640_r(space, offset, mem_mask); + else + return 0xff; +} + +/*------------------------------------------------- + write_audio + -------------------------------------------------*/ + +WRITE16_MEMBER(intv_voice_device::write_speech) +{ + if (ACCESSING_BITS_0_7) + return m_speech->spb640_w(space, offset, data, mem_mask); +} diff --git a/src/emu/bus/intv/voice.h b/src/emu/bus/intv/voice.h new file mode 100644 index 00000000000..9ba16aef358 --- /dev/null +++ b/src/emu/bus/intv/voice.h @@ -0,0 +1,76 @@ +#ifndef __INTV_VOICE_H +#define __INTV_VOICE_H + +#include "slot.h" +#include "rom.h" +#include "sound/sp0256.h" + + +// ======================> intv_voice_device + +class intv_voice_device : public intv_rom_device +{ +public: + // construction/destruction + intv_voice_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // device-level overrides + virtual void device_start(); + virtual machine_config_constructor device_mconfig_additions() const; + virtual const rom_entry *device_rom_region() const; + + // reading and writing + // actual IntelliVoice access + virtual DECLARE_READ16_MEMBER(read_speech); + virtual DECLARE_WRITE16_MEMBER(write_speech); + + // passthru access + virtual DECLARE_READ16_MEMBER(read_rom04) { return m_subslot->read_rom04(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom20) { return m_subslot->read_rom20(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom40) { return m_subslot->read_rom40(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom48) { return m_subslot->read_rom48(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom50) { return m_subslot->read_rom50(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom60) { return m_subslot->read_rom60(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom70) { return m_subslot->read_rom70(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_rom80) + { + if (m_ram88_enabled && offset >= 0x800) + return m_subslot->read_ram(space, offset & 0x7ff, mem_mask); + else + return m_subslot->read_rom80(space, offset, mem_mask); + } + virtual DECLARE_READ16_MEMBER(read_rom90) { return m_subslot->read_rom90(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_roma0) { return m_subslot->read_roma0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romb0) { return m_subslot->read_romb0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romc0) { return m_subslot->read_romc0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romd0) + { + if (m_ramd0_enabled && offset < 0x800) + return m_subslot->read_ram(space, offset, mem_mask); + else + return m_subslot->read_romd0(space, offset, mem_mask); + } + virtual DECLARE_READ16_MEMBER(read_rome0) { return m_subslot->read_rome0(space, offset, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_romf0) { return m_subslot->read_romf0(space, offset, mem_mask); } + + // RAM passthru write + virtual DECLARE_WRITE16_MEMBER(write_88) { if (m_ram88_enabled) m_subslot->write_ram(space, offset, data, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_d0) { if (m_ramd0_enabled) m_subslot->write_ram(space, offset, data, mem_mask); } + virtual DECLARE_READ16_MEMBER(read_ram) { return m_subslot->read_ram(space, offset, mem_mask); } + virtual DECLARE_WRITE16_MEMBER(write_ram) { m_subslot->write_ram(space, offset, data, mem_mask); } + + virtual void late_subslot_setup(); + +private: + required_device<sp0256_device> m_speech; + required_device<intv_cart_slot_device> m_subslot; + bool m_ramd0_enabled, m_ram88_enabled; +}; + + + + +// device type definition +extern const device_type INTV_ROM_VOICE; + +#endif diff --git a/src/mess/drivers/intv.c b/src/mess/drivers/intv.c index 0e62702dc71..905f99787a1 100644 --- a/src/mess/drivers/intv.c +++ b/src/mess/drivers/intv.c @@ -52,7 +52,6 @@ RO-3-9506 = 8KiB (4Kiw) self decoding address mask rom with external address dec #include "cpu/m6502/m6502.h" #include "cpu/cp1610/cp1610.h" #include "includes/intv.h" -#include "imagedev/cartslot.h" #include "sound/ay8910.h" #ifndef VERBOSE @@ -136,7 +135,8 @@ GFXDECODE_END static INPUT_PORTS_START( intv ) - PORT_START("KEYPAD1") /* Left Player Controller Starts Here */ + /* Left Player Controller */ + PORT_START("KEYPAD1") PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Left/1") PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Left/2") PORT_CODE(KEYCODE_2_PAD) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Left/3") PORT_CODE(KEYCODE_3_PAD) @@ -178,7 +178,8 @@ static INPUT_PORTS_START( intv ) PORT_START("DISCY1") PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("Left/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_UP) PORT_CODE_INC(KEYCODE_DOWN) PORT_PLAYER(1) PORT_CONDITION("OPTIONS",0x01,EQUALS,0x01) - PORT_START("KEYPAD2") /* Right Player Controller Starts Here */ + /* Right Player Controller */ + PORT_START("KEYPAD2") PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Right/1") PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Right/2") PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Right/3") @@ -229,286 +230,6 @@ static INPUT_PORTS_START( intv ) PORT_CONFSETTING( 0x02, "Analog" ) INPUT_PORTS_END -static INPUT_PORTS_START( intv_ecs_kbd ) -/* -ECS matrix scanned by setting 0xFE bits to output and reading 0xFF -ECS Keyboard Layout: - FF\FE Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 - Bit 0 NC RTN 0 ESC P ; . (left) - Bit 1 L O 8 9 I K M , - Bit 2 J U 6 7 Y H B N - Bit 3 G T 4 5 R F C V - Bit 4 D E 2 3 W S Z X - Bit 5 A CTL (right) 1 Q (up) (down) (space) - Bit 6 SHIFT NC NC NC NC NC NC NC - -Shifted keys that differ from pc: -Key : 1 2 5 6 7 (left) (right) (up) (down) -Shift + key: = " + - / % ' ^ ? -*/ - - PORT_START("ECS_ROW0") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RTN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_CHAR('%') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW1") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW2") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('-') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW3") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW4") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW5") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("CTL") PORT_CODE(KEYCODE_RCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_CHAR('\'') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('=') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_CHAR('^') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_CHAR('?') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - - PORT_START("ECS_ROW6") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x02) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( intv_ecs_synth ) -/* -ECS Synthesizer Layout: - FF\FE Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 - Bit 0 G2 Gb2 F2 E2 Eb2 D2 Db2 C2 - Bit 1 Eb3 D3 Db3 C3 B2 Bb2 A2 Ab2 - Bit 2 B3 Bb3 A3 Ab3 G3 Gb3 F3 E3 - Bit 3 G4 Gb4 F4 E4 Eb4 D4 Db4 C4 - Bit 4 Eb5 D5 Db5 C5 B4 Bb4 A4 Ab4 - Bit 5 B5 Bb5 A5 Ab5 G5 Gb5 F5 E5 - Bit 6 C6 NC NC NC NC NC NC NC -*/ - PORT_START("ECS_SYNTH_ROW0") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW1") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW2") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW3") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW4") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Eb5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Db5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW5") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Bb5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ab5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Gb5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - - PORT_START("ECS_SYNTH_ROW6") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C6") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x01) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - -static INPUT_PORTS_START( intv_ecs_pads ) -// First ECS Hand Controller - PORT_START("KEYPAD3") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/1") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/6") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/7") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/8") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/9") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Clear") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/0") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P3/Enter") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3/Upper") PORT_PLAYER(3) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3/Lower-Left") PORT_PLAYER(3) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3/Lower-Right") PORT_PLAYER(3) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("DISC3") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P3/Up") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Up-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P3/Right") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Right-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Right") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P3/Down") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Down-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P3/Left") PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Left-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P3/Up-Up-Left") PORT_CONDITION("OPTIONS",0x04,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - - PORT_START("DISCX3") - PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("P3/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - - PORT_START("DISCY3") - PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("P3/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_PLAYER(3) PORT_CONDITION("OPTIONS",0x04,EQUALS,0x04) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - -// Second ECS Hand Controller - PORT_START("KEYPAD4") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/1") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/2") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/3") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/4") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/5") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/6") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/7") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/8") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/9") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Clear") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/0") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("P4/Enter") PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4/Upper") PORT_PLAYER(4) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4/Lower-Left") PORT_PLAYER(4) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4/Lower-Right") PORT_PLAYER(4) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("DISC4") - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_NAME("P4/Up") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Up-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_NAME("P4/Right") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Right-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Right") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_NAME("P4/Down") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Down-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_NAME("P4/Left") PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Left-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("P4/Up-Up-Left") PORT_CONDITION("OPTIONS",0x08,EQUALS,0x00) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - - PORT_START("DISCX4") - PORT_BIT( 0xff, 0x50, IPT_AD_STICK_X ) PORT_NAME("Right/X") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_D) PORT_CODE_INC(KEYCODE_G) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) - - PORT_START("DISCY4") - PORT_BIT( 0xff, 0x50, IPT_AD_STICK_Y ) PORT_NAME("Right/Y") PORT_MINMAX(0x00,0x9f) PORT_SENSITIVITY(100) PORT_KEYDELTA(0x50) PORT_CODE_DEC(KEYCODE_R) PORT_CODE_INC(KEYCODE_F) PORT_PLAYER(4) PORT_CONDITION("OPTIONS",0x08,EQUALS,0x08) PORT_CONDITION("ECS_CNTRLSEL",0x0f,EQUALS,0x00) -INPUT_PORTS_END - -static INPUT_PORTS_START( intvecs ) - PORT_INCLUDE( intv ) - PORT_INCLUDE( intv_ecs_pads ) - PORT_INCLUDE( intv_ecs_synth ) - PORT_INCLUDE( intv_ecs_kbd ) - - PORT_MODIFY("OPTIONS") - PORT_CONFNAME( 0x04, 0x00, "ECS_P3 Disc" ) - PORT_CONFSETTING( 0x00, "Digital" ) - PORT_CONFSETTING( 0x04, "Analog" ) - PORT_CONFNAME( 0x08, 0x00, "ECS_P4 Disc" ) - PORT_CONFSETTING( 0x00, "Digital" ) - PORT_CONFSETTING( 0x08, "Analog" ) - - PORT_START("ECS_CNTRLSEL") - PORT_CONFNAME( 0x0F, 0x02, "ECS Controller") - PORT_CONFSETTING( 0x00, "Gamepads" ) - PORT_CONFSETTING( 0x01, "Piano" ) - PORT_CONFSETTING( 0x02, "Keyboard" ) -INPUT_PORTS_END /* Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 @@ -653,87 +374,145 @@ static INPUT_PORTS_START( intvkbd ) PORT_INCLUDE( intv ) INPUT_PORTS_END -static ADDRESS_MAP_START(intv_mem, AS_PROGRAM, 16, intv_state) - AM_RANGE(0x0000, 0x003f) AM_READWRITE( intv_stic_r, intv_stic_w ) - AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("sp0256_speech", sp0256_device, spb640_r, spb640_w) /* Intellivoice */ - AM_RANGE(0x0100, 0x01ef) AM_READWRITE( intv_ram8_r, intv_ram8_w ) - AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914.1", ay8914_device, read, write, 0x00ff ) - AM_RANGE(0x0200, 0x035f) AM_READWRITE( intv_ram16_r, intv_ram16_w ) - AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000<<1) /* Exec ROM, 10-bits wide */ - AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) /* GROM, 8-bits wide */ - AM_RANGE(0x3800, 0x39ff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM, 8-bits wide */ - AM_RANGE(0x3a00, 0x3bff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM Alias, 8-bits wide */ - AM_RANGE(0x4800, 0x7fff) AM_ROM AM_REGION("maincpu", 0x4800<<1) - AM_RANGE(0x9000, 0xBfff) AM_ROM AM_REGION("maincpu", 0x9000<<1) - AM_RANGE(0xC000, 0xCfff) AM_ROM AM_REGION("maincpu", 0xC000<<1) - AM_RANGE(0xD000, 0xDfff) AM_ROM AM_REGION("maincpu", 0xD000<<1) - AM_RANGE(0xE000, 0xFfff) AM_ROM AM_REGION("maincpu", 0xE000<<1) +static ADDRESS_MAP_START( intv_mem, AS_PROGRAM, 16, intv_state ) + AM_RANGE(0x0000, 0x003f) AM_READWRITE(intv_stic_r, intv_stic_w) + AM_RANGE(0x0100, 0x01ef) AM_READWRITE(intv_ram8_r, intv_ram8_w) + AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914", ay8914_device, read, write, 0x00ff) + AM_RANGE(0x0200, 0x035f) AM_READWRITE(intv_ram16_r, intv_ram16_w) + AM_RANGE(0x0400, 0x04ff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom04) + AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000 << 1) // Exec ROM, 10-bits wide + AM_RANGE(0x2000, 0x2fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom20) + AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) // GROM, 8-bits wide + AM_RANGE(0x3800, 0x39ff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM, 8-bits wide + AM_RANGE(0x3a00, 0x3bff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM Alias, 8-bits wide + AM_RANGE(0x4000, 0x47ff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom40) + AM_RANGE(0x4800, 0x4fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom48) + AM_RANGE(0x5000, 0x5fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom50) + AM_RANGE(0x6000, 0x6fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom60) + AM_RANGE(0x7000, 0x7fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom70) + AM_RANGE(0x8000, 0x8fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom80) + AM_RANGE(0x9000, 0x9fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom90) + AM_RANGE(0xa000, 0xafff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_roma0) + AM_RANGE(0xb000, 0xbfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romb0) + AM_RANGE(0xc000, 0xcfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romc0) + AM_RANGE(0xd000, 0xdfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romd0) + AM_RANGE(0xe000, 0xefff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rome0) + AM_RANGE(0xf000, 0xffff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romf0) ADDRESS_MAP_END -static ADDRESS_MAP_START( intv2_mem , AS_PROGRAM, 16, intv_state) - AM_RANGE(0x0000, 0x003f) AM_READWRITE( intv_stic_r, intv_stic_w ) - AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("sp0256_speech", sp0256_device, spb640_r, spb640_w) /* Intellivoice */ - AM_RANGE(0x0100, 0x01ef) AM_READWRITE( intv_ram8_r, intv_ram8_w ) - AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914.1", ay8914_device, read, write, 0x00ff ) - AM_RANGE(0x0200, 0x035f) AM_READWRITE( intv_ram16_r, intv_ram16_w ) - AM_RANGE(0x0400, 0x04ff) AM_ROM AM_REGION("maincpu", 0x400<<1) /* Exec ROM, 10-bits wide */ - AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000<<1) /* Exec ROM, 10-bits wide */ - AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) /* GROM, 8-bits wide */ - AM_RANGE(0x3800, 0x39ff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM, 8-bits wide */ - AM_RANGE(0x3a00, 0x3bff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM Alias, 8-bits wide */ - AM_RANGE(0x4800, 0x7fff) AM_ROM AM_REGION("maincpu", 0x4800<<1) - AM_RANGE(0x9000, 0xBfff) AM_ROM AM_REGION("maincpu", 0x9000<<1) - AM_RANGE(0xC000, 0xCfff) AM_ROM AM_REGION("maincpu", 0xC000<<1) - AM_RANGE(0xD000, 0xDfff) AM_ROM AM_REGION("maincpu", 0xD000<<1) - AM_RANGE(0xE000, 0xFfff) AM_ROM AM_REGION("maincpu", 0xE000<<1) +static ADDRESS_MAP_START( intvoice_mem, AS_PROGRAM, 16, intv_state ) + AM_RANGE(0x0000, 0x003f) AM_READWRITE(intv_stic_r, intv_stic_w) + AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("voice", intv_voice_device, read_speech, write_speech) // Intellivoice + AM_RANGE(0x0100, 0x01ef) AM_READWRITE(intv_ram8_r, intv_ram8_w) + AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914", ay8914_device, read, write, 0x00ff) + AM_RANGE(0x0200, 0x035f) AM_READWRITE(intv_ram16_r, intv_ram16_w) + AM_RANGE(0x0400, 0x04ff) AM_DEVREAD("voice", intv_voice_device, read_rom04) + AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000 << 1) // Exec ROM, 10-bits wide + AM_RANGE(0x2000, 0x2fff) AM_DEVREAD("voice", intv_voice_device, read_rom20) + AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) // GROM, 8-bits wide + AM_RANGE(0x3800, 0x39ff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM, 8-bits wide + AM_RANGE(0x3a00, 0x3bff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM Alias, 8-bits wide + AM_RANGE(0x4000, 0x47ff) AM_DEVREAD("voice", intv_voice_device, read_rom40) + AM_RANGE(0x4800, 0x4fff) AM_DEVREAD("voice", intv_voice_device, read_rom48) + AM_RANGE(0x5000, 0x5fff) AM_DEVREAD("voice", intv_voice_device, read_rom50) + AM_RANGE(0x6000, 0x6fff) AM_DEVREAD("voice", intv_voice_device, read_rom60) + AM_RANGE(0x7000, 0x7fff) AM_DEVREAD("voice", intv_voice_device, read_rom70) + AM_RANGE(0x8000, 0x8fff) AM_DEVREAD("voice", intv_voice_device, read_rom80) + AM_RANGE(0x9000, 0x9fff) AM_DEVREAD("voice", intv_voice_device, read_rom90) + AM_RANGE(0xa000, 0xafff) AM_DEVREAD("voice", intv_voice_device, read_roma0) + AM_RANGE(0xb000, 0xbfff) AM_DEVREAD("voice", intv_voice_device, read_romb0) + AM_RANGE(0xc000, 0xcfff) AM_DEVREAD("voice", intv_voice_device, read_romc0) + AM_RANGE(0xd000, 0xdfff) AM_DEVREAD("voice", intv_voice_device, read_romd0) + AM_RANGE(0xe000, 0xefff) AM_DEVREAD("voice", intv_voice_device, read_rome0) + AM_RANGE(0xf000, 0xffff) AM_DEVREAD("voice", intv_voice_device, read_romf0) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( intv2_mem , AS_PROGRAM, 16, intv_state ) + AM_RANGE(0x0000, 0x003f) AM_READWRITE(intv_stic_r, intv_stic_w) + AM_RANGE(0x0100, 0x01ef) AM_READWRITE(intv_ram8_r, intv_ram8_w) + AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914", ay8914_device, read, write, 0x00ff) + AM_RANGE(0x0200, 0x035f) AM_READWRITE(intv_ram16_r, intv_ram16_w) + AM_RANGE(0x0400, 0x04ff) AM_ROM AM_REGION("maincpu", 0x400 << 1) // Exec ROM, 10-bits wide + AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000 << 1) // Exec ROM, 10-bits wide + AM_RANGE(0x2000, 0x2fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom20) + AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) // GROM, 8-bits wide + AM_RANGE(0x3800, 0x39ff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM, 8-bits wide + AM_RANGE(0x3a00, 0x3bff) AM_READWRITE(intv_gram_r, intv_gram_w) // GRAM Alias, 8-bits wide + AM_RANGE(0x4000, 0x47ff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom40) + AM_RANGE(0x4800, 0x4fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom48) + AM_RANGE(0x5000, 0x5fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom50) + AM_RANGE(0x6000, 0x6fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom60) + AM_RANGE(0x7000, 0x7fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom70) + AM_RANGE(0x8000, 0x8fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom80) + AM_RANGE(0x9000, 0x9fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom90) + AM_RANGE(0xa000, 0xafff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_roma0) + AM_RANGE(0xb000, 0xbfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romb0) + AM_RANGE(0xc000, 0xcfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romc0) + AM_RANGE(0xd000, 0xdfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romd0) + AM_RANGE(0xe000, 0xefff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rome0) + AM_RANGE(0xf000, 0xffff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romf0) ADDRESS_MAP_END -static ADDRESS_MAP_START( intvecs_mem , AS_PROGRAM, 16, intv_state) - AM_RANGE(0x0000, 0x003f) AM_READWRITE( intv_stic_r, intv_stic_w ) - AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("sp0256_speech", sp0256_device, spb640_r, spb640_w) /* Intellivoice */ +static ADDRESS_MAP_START( intvecs_mem , AS_PROGRAM, 16, intv_state ) + AM_RANGE(0x0000, 0x003f) AM_READWRITE(intv_stic_r, intv_stic_w) + AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("speech", sp0256_device, spb640_r, spb640_w) /* Intellivoice */ // AM_RANGE(0x00E0, 0x00E3) AM_READWRITE( intv_ecs_uart_r, intv_ecs_uart_w ) - AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE8("ay8914.2", ay8914_device, read, write, 0x00ff ) /* ecs psg */ - AM_RANGE(0x0100, 0x01ef) AM_READWRITE( intv_ram8_r, intv_ram8_w ) - AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914.1", ay8914_device, read, write, 0x00ff ) - AM_RANGE(0x0200, 0x035f) AM_READWRITE( intv_ram16_r, intv_ram16_w ) + AM_RANGE(0x00f0, 0x00ff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_ay, write_ay) /* ecs psg */ + AM_RANGE(0x0100, 0x01ef) AM_READWRITE(intv_ram8_r, intv_ram8_w) + AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914", ay8914_device, read, write, 0x00ff) + AM_RANGE(0x0200, 0x035f) AM_READWRITE(intv_ram16_r, intv_ram16_w) + AM_RANGE(0x0400, 0x04ff) AM_DEVREAD("ecs", intv_ecs_device, read_rom04) AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000<<1) /* Exec ROM, 10-bits wide */ - AM_RANGE(0x2000, 0x2fff) AM_READ_BANK("bank1") AM_WRITE( ecs_bank1_page_select ); + AM_RANGE(0x2000, 0x2fff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_rom20, write_rom20) AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) /* GROM, 8-bits wide */ - AM_RANGE(0x3800, 0x39ff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM, 8-bits wide */ - AM_RANGE(0x3a00, 0x3bff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM Alias, 8-bits wide */ - AM_RANGE(0x4000, 0x47ff) AM_READWRITE( intv_ecs_ram8_r, intv_ecs_ram8_w ) - AM_RANGE(0x4800, 0x6fff) AM_ROM AM_REGION("maincpu", 0x4800<<1) - AM_RANGE(0x7000, 0x7fff) AM_READ_BANK("bank2") AM_WRITE( ecs_bank2_page_select ); - //AM_RANGE(0x8800, 0x8fff) AM_RAM_BANK("bank5") // cart rom / game factory ram - AM_RANGE(0x9000, 0xBfff) AM_ROM AM_REGION("maincpu", 0x9000<<1) - AM_RANGE(0xC000, 0xCfff) AM_ROM AM_REGION("maincpu", 0xC000<<1) - AM_RANGE(0xD000, 0xDfff) AM_ROM AM_REGION("maincpu", 0xD000<<1) - AM_RANGE(0xE000, 0xEfff) AM_READ_BANK("bank3") AM_WRITE( ecs_bank3_page_select ); - AM_RANGE(0xF000, 0xFfff) AM_READ_BANK("bank4") AM_WRITE( wsmlb_bank_page_select ); // World Series Major League Baseball Banking + AM_RANGE(0x3800, 0x39ff) AM_READWRITE(intv_gram_r, intv_gram_w) /* GRAM, 8-bits wide */ + AM_RANGE(0x3a00, 0x3bff) AM_READWRITE(intv_gram_r, intv_gram_w) /* GRAM Alias, 8-bits wide */ + AM_RANGE(0x4000, 0x47ff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_ram, write_ram) + AM_RANGE(0x4800, 0x4fff) AM_DEVREAD("ecs", intv_ecs_device, read_rom48) + AM_RANGE(0x5000, 0x5fff) AM_DEVREAD("ecs", intv_ecs_device, read_rom50) + AM_RANGE(0x6000, 0x6fff) AM_DEVREAD("ecs", intv_ecs_device, read_rom60) + AM_RANGE(0x7000, 0x7fff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_rom70, write_rom70) + AM_RANGE(0x8000, 0x8fff) AM_DEVREAD("ecs", intv_ecs_device, read_rom80) + AM_RANGE(0x9000, 0x9fff) AM_DEVREAD("ecs", intv_ecs_device, read_rom90) + AM_RANGE(0xa000, 0xafff) AM_DEVREAD("ecs", intv_ecs_device, read_roma0) + AM_RANGE(0xb000, 0xbfff) AM_DEVREAD("ecs", intv_ecs_device, read_romb0) + AM_RANGE(0xc000, 0xcfff) AM_DEVREAD("ecs", intv_ecs_device, read_romc0) + AM_RANGE(0xd000, 0xdfff) AM_DEVREAD("ecs", intv_ecs_device, read_romd0) + AM_RANGE(0xe000, 0xefff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_rome0, write_rome0) + AM_RANGE(0xf000, 0xffff) AM_DEVREADWRITE("ecs", intv_ecs_device, read_romf0, write_romf0) ADDRESS_MAP_END -static ADDRESS_MAP_START( intvkbd_mem , AS_PROGRAM, 16, intv_state) - AM_RANGE(0x0000, 0x003f) AM_READWRITE( intv_stic_r, intv_stic_w ) - AM_RANGE(0x0080, 0x0081) AM_DEVREADWRITE("sp0256_speech", sp0256_device, spb640_r, spb640_w) /* Intellivoice */ - AM_RANGE(0x0100, 0x01ef) AM_READWRITE( intv_ram8_r, intv_ram8_w ) - AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914.1", ay8914_device, read, write, 0x00ff ) - AM_RANGE(0x0200, 0x035f) AM_READWRITE( intv_ram16_r, intv_ram16_w ) +static ADDRESS_MAP_START( intvkbd_mem , AS_PROGRAM, 16, intv_state ) + AM_RANGE(0x0000, 0x003f) AM_READWRITE(intv_stic_r, intv_stic_w) + AM_RANGE(0x0100, 0x01ef) AM_READWRITE(intv_ram8_r, intv_ram8_w) + AM_RANGE(0x01f0, 0x01ff) AM_DEVREADWRITE8("ay8914", ay8914_device, read, write, 0x00ff) + AM_RANGE(0x0200, 0x035f) AM_READWRITE(intv_ram16_r, intv_ram16_w) + AM_RANGE(0x0400, 0x04ff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom04) AM_RANGE(0x1000, 0x1fff) AM_ROM AM_REGION("maincpu", 0x1000<<1) /* Exec ROM, 10-bits wide */ + AM_RANGE(0x2000, 0x2fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom20) AM_RANGE(0x3000, 0x37ff) AM_DEVREAD("stic", stic_device, grom_read) /* GROM, 8-bits wide */ - AM_RANGE(0x3800, 0x39ff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM, 8-bits wide */ - AM_RANGE(0x3a00, 0x3bff) AM_READWRITE( intv_gram_r, intv_gram_w ) /* GRAM Alias, 8-bits wide */ - AM_RANGE(0x4800, 0x6fff) AM_ROM /* Cartridges? */ + AM_RANGE(0x3800, 0x39ff) AM_READWRITE(intv_gram_r, intv_gram_w) /* GRAM, 8-bits wide */ + AM_RANGE(0x3a00, 0x3bff) AM_READWRITE(intv_gram_r, intv_gram_w) /* GRAM Alias, 8-bits wide */ + AM_RANGE(0x4000, 0x47ff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom40) + AM_RANGE(0x4800, 0x4fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom48) + AM_RANGE(0x5000, 0x5fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom50) + AM_RANGE(0x6000, 0x6fff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rom60) AM_RANGE(0x7000, 0x7fff) AM_ROM AM_REGION("maincpu", 0x7000<<1) /* Keyboard ROM */ - AM_RANGE(0x8000, 0xbfff) AM_RAM_WRITE( intvkbd_dualport16_w ) AM_SHARE("dualport_ram") /* Dual-port RAM */ + AM_RANGE(0x8000, 0xbfff) AM_RAM_WRITE(intvkbd_dualport16_w) AM_SHARE("dualport_ram") /* Dual-port RAM */ + AM_RANGE(0xc000, 0xcfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romc0) + AM_RANGE(0xd000, 0xdfff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romd0) + AM_RANGE(0xe000, 0xefff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_rome0) + AM_RANGE(0xf000, 0xffff) AM_DEVREAD("cartslot", intv_cart_slot_device, read_romf0) ADDRESS_MAP_END -static ADDRESS_MAP_START( intvkbd2_mem , AS_PROGRAM, 8, intv_state) +static ADDRESS_MAP_START( intvkbd2_mem , AS_PROGRAM, 8, intv_state ) ADDRESS_MAP_UNMAP_HIGH /* Required because of probing */ - AM_RANGE( 0x0000, 0x3fff) AM_READWRITE( intvkbd_dualport8_lsb_r, intvkbd_dualport8_lsb_w ) /* Dual-port RAM */ - AM_RANGE( 0x4000, 0x7fff) AM_READWRITE( intvkbd_dualport8_msb_r, intvkbd_dualport8_msb_w ) /* Dual-port RAM */ - AM_RANGE( 0xb7f8, 0xb7ff) AM_RAM /* ??? */ - AM_RANGE( 0xb800, 0xbfff) AM_RAM AM_SHARE("videoram") /* Text Display */ - AM_RANGE( 0xc000, 0xffff) AM_ROM + AM_RANGE(0x0000, 0x3fff) AM_READWRITE(intvkbd_dualport8_lsb_r, intvkbd_dualport8_lsb_w) /* Dual-port RAM */ + AM_RANGE(0x4000, 0x7fff) AM_READWRITE(intvkbd_dualport8_msb_r, intvkbd_dualport8_msb_w) /* Dual-port RAM */ + AM_RANGE(0xb7f8, 0xb7ff) AM_RAM /* ??? */ + AM_RANGE(0xb800, 0xbfff) AM_RAM AM_SHARE("videoram") /* Text Display */ + AM_RANGE(0xc000, 0xdfff) AM_ROM + AM_RANGE(0xe000, 0xffff) AM_READ(intvkb_iocart_r) ADDRESS_MAP_END void intv_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -769,6 +548,7 @@ INTERRUPT_GEN_MEMBER(intv_state::intv_interrupt2) timer_set(m_keyboard->cycles_to_attotime(100), TIMER_INTV_INTERRUPT2_COMPLETE); } + static MACHINE_CONFIG_START( intv, intv_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", CP1610, XTAL_3_579545MHz/4) /* Colorburst/4 */ @@ -793,22 +573,17 @@ static MACHINE_CONFIG_START( intv, intv_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("ay8914.1", AY8914, XTAL_3_579545MHz/2) + MCFG_SOUND_ADD("ay8914", AY8914, XTAL_3_579545MHz/2) MCFG_AY8910_PORT_A_READ_CB(READ8(intv_state, intv_right_control_r)) MCFG_AY8910_PORT_B_READ_CB(READ8(intv_state, intv_left_control_r)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) - MCFG_SOUND_ADD("sp0256_speech", SP0256, 3120000) - /* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */ - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) - /* cartridge */ - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("int,rom,bin,itv") - MCFG_CARTSLOT_LOAD(intv_state,intv_cart) - MCFG_CARTSLOT_INTERFACE("intv_cart") + MCFG_INTV_CARTRIDGE_ADD("cartslot", intv_cart, NULL) + /* software lists */ - MCFG_SOFTWARE_LIST_ADD("cart_list","intv") + MCFG_SOFTWARE_LIST_ADD("cart_list", "intv") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("ecs_list", "intvecs") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( intv2, intv ) @@ -816,20 +591,33 @@ static MACHINE_CONFIG_DERIVED( intv2, intv ) MCFG_CPU_PROGRAM_MAP(intv2_mem) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( intvoice, intv ) + MCFG_CPU_MODIFY( "maincpu" ) + MCFG_CPU_PROGRAM_MAP(intvoice_mem) + + MCFG_DEVICE_REMOVE("cartslot") + MCFG_DEVICE_ADD("voice", INTV_ROM_VOICE, 0) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( intvecs, intv ) MCFG_CPU_MODIFY( "maincpu" ) MCFG_CPU_PROGRAM_MAP(intvecs_mem) - MCFG_SOFTWARE_LIST_ADD("cart_list_ecs","intvecs") - MCFG_SOUND_ADD("ay8914.2", AY8914, XTAL_3_579545MHz/2) - MCFG_AY8910_PORT_A_READ_CB(READ8(intv_state, intv_ecs_porta_r)) - MCFG_AY8910_PORT_B_READ_CB(READ8(intv_state, intv_ecs_portb_r)) - MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(intv_state, intv_ecs_porta_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.33) + MCFG_DEVICE_REMOVE("cartslot") + MCFG_DEVICE_ADD("ecs", INTV_ROM_ECS, 0) + + MCFG_SOUND_ADD("speech", SP0256, 3120000) + /* The Intellivoice uses a speaker with its own volume control so the relative volumes to use are subjective */ + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) /* cassette */ //MCFG_CASSETTE_ADD( "cassette" ) + /* software lists */ + MCFG_DEVICE_REMOVE("cart_list") + MCFG_DEVICE_REMOVE("ecs_list") + MCFG_SOFTWARE_LIST_ADD("cart_list", "intvecs") + MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("intv_list", "intv") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( intvkbd, intv ) @@ -852,62 +640,37 @@ static MACHINE_CONFIG_DERIVED( intvkbd, intv ) MCFG_SCREEN_VISIBLE_AREA(0, (STIC_OVERSCAN_LEFT_WIDTH+STIC_BACKTAB_WIDTH*STIC_CARD_WIDTH-1+STIC_OVERSCAN_RIGHT_WIDTH)*STIC_X_SCALE*INTVKBD_X_SCALE-1, 0, (STIC_OVERSCAN_TOP_HEIGHT+STIC_BACKTAB_HEIGHT*STIC_CARD_HEIGHT+STIC_OVERSCAN_BOTTOM_HEIGHT)*STIC_Y_SCALE*INTVKBD_Y_SCALE-1) MCFG_SCREEN_UPDATE_DRIVER(intv_state, screen_update_intvkbd) - /* cartridge */ - MCFG_DEVICE_REMOVE("cart") - MCFG_CARTSLOT_ADD("cart1") - MCFG_CARTSLOT_EXTENSION_LIST("int,rom,bin,itv") - MCFG_CARTSLOT_NOT_MANDATORY - MCFG_CARTSLOT_LOAD(intv_state,intvkbd_cart) - MCFG_CARTSLOT_INTERFACE("intv_cart") - - MCFG_CARTSLOT_ADD("cart2") - MCFG_CARTSLOT_EXTENSION_LIST("int,rom,bin,itv") - MCFG_CARTSLOT_NOT_MANDATORY - MCFG_CARTSLOT_LOAD(intv_state,intvkbd_cart) - MCFG_CARTSLOT_INTERFACE("intv_cart") + /* I/O cartslots for BASIC */ + MCFG_GENERIC_CARTSLOT_ADD("ioslot1", generic_plain_slot, "intbasic_cart") + MCFG_GENERIC_CARTSLOT_ADD("ioslot2", generic_plain_slot, "intbasic_cart") MACHINE_CONFIG_END ROM_START(intv) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6 ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF) ROM_LOAD16_WORD( "exec.bin", (0x1000<<1)+0, 0x2000, CRC(cbce86f7) SHA1(5a65b922b562cb1f57dab51b73151283f0e20c7a)) - - ROM_REGION( 0x10000<<1, "sp0256_speech", 0 ) - /* SP0256-012 Speech chip w/2KiB mask rom */ - ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) ) ROM_END +#define rom_intvoice rom_intv + // the later intellivision 2's exec rom is a single ro-3-9506-010 at location ic6 holding 8k plus 512 bytes; the 1st 512 bytes are at 0x400 and the 8k at 0x1000 ROM_START(intv2) ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF) ROM_LOAD16_WORD_SWAP( "ro-3-9506-010.ic6", (0x400<<1)+0, 0x200, CRC(DD7E1237) SHA1(FB821A643B7714ED4C812553CD3F668766FD44AB)) ROM_CONTINUE( (0x1000<<1)+0, 0x2000 ) - - ROM_REGION( 0x10000<<1, "sp0256_speech", 0 ) - /* SP0256-012 Speech chip w/2KiB mask rom */ - ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) ) ROM_END ROM_START(intvsrs) // the intv1 sears exec rom should be two roms: RO-3-9502-???.U5 and RO-3-9504-???.U6 but the correct names are unknown as of yet ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF) ROM_LOAD16_WORD( "searsexc.bin", (0x1000<<1)+0, 0x2000, CRC(ea552a22) SHA1(834339de056d42a35571cae7fd5b04d1344001e9)) - - ROM_REGION( 0x10000<<1, "sp0256_speech", 0 ) - /* SP0256-012 Speech chip w/2KiB mask rom */ - ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) ) ROM_END ROM_START(intvecs) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6 ROM_REGION(0x10000<<1,"maincpu", ROMREGION_ERASEFF) ROM_LOAD16_WORD( "exec.bin", (0x1000<<1)+0, 0x2000, CRC(cbce86f7) SHA1(5a65b922b562cb1f57dab51b73151283f0e20c7a)) - ROM_REGION( 0x10000<<1, "sp0256_speech", 0 ) + ROM_REGION( 0x10000<<1, "speech", 0 ) /* SP0256-012 Speech chip w/2KiB mask rom */ ROM_LOAD( "sp0256-012.bin", 0x1000, 0x0800, CRC(0de7579d) SHA1(618563e512ff5665183664f52270fa9606c9d289) ) - - ROM_REGION( 0x10000<<1, "ecs_rom", ROMREGION_ERASEFF) - ROM_LOAD16_WORD_SWAP( "ecs_rom.bin", 0x2000<<1, 0x2000, CRC(ea790a06) SHA1(b7ccb38b881d7f8426cd6f1f8a7aabbd31784fc5)) - ROM_CONTINUE( 0x7000<<1, 0x2000 ) - ROM_CONTINUE( 0xE000<<1, 0x2000 ) ROM_END ROM_START(intvkbd) // the intv1 exec rom should be two roms: RO-3-9502-011.U5 and RO-3-9504-021.U6 @@ -932,7 +695,6 @@ DRIVER_INIT_MEMBER(intv_state,intv) m_stic->set_x_scale(INTV_X_SCALE); m_stic->set_y_scale(INTV_Y_SCALE); m_is_keybd = 0; - m_is_ecs = 0; } DRIVER_INIT_MEMBER(intv_state,intvkbd) @@ -940,15 +702,6 @@ DRIVER_INIT_MEMBER(intv_state,intvkbd) m_stic->set_x_scale(INTVKBD_X_SCALE); m_stic->set_y_scale(INTVKBD_Y_SCALE); m_is_keybd = 1; - m_is_ecs = 0; -} - -DRIVER_INIT_MEMBER(intv_state,intvecs) -{ - m_stic->set_x_scale(INTV_X_SCALE); - m_stic->set_y_scale(INTV_Y_SCALE); - m_is_keybd = 0; - m_is_ecs = 1; } @@ -963,4 +716,7 @@ CONS( 1979, intv, 0, 0, intv, intv, intv_state, i CONS( 1981, intvsrs, intv, 0, intv, intv, intv_state, intv, "Sears", "Super Video Arcade", GAME_SUPPORTS_SAVE ) COMP( 1981, intvkbd, intv, 0, intvkbd, intvkbd, intv_state, intvkbd, "Mattel", "Intellivision Keyboard Component (Unreleased)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) CONS( 1982, intv2, intv, 0, intv2, intv, intv_state, intv, "Mattel", "Intellivision II", GAME_SUPPORTS_SAVE ) -COMP( 1983, intvecs, intv, 0, intvecs, intvecs, intv_state, intvecs, "Mattel", "Intellivision Entertainment Computer System", GAME_SUPPORTS_SAVE ) + +// made up, user friendlier machines with pre-mounted passthu expansions +COMP( 1982, intvoice, intv, 0, intvoice, intv, intv_state, intv, "Mattel", "Intellivision w/IntelliVoice expansion", GAME_SUPPORTS_SAVE ) +COMP( 1983, intvecs, intv, 0, intvecs, intv, intv_state, intv, "Mattel", "Intellivision w/Entertainment Computer System + Intellivoice expansions", GAME_SUPPORTS_SAVE ) diff --git a/src/mess/includes/intv.h b/src/mess/includes/intv.h index 8355595b483..44e08f823ca 100644 --- a/src/mess/includes/intv.h +++ b/src/mess/includes/intv.h @@ -8,8 +8,11 @@ #define INTV_H_ #include "sound/ay8910.h" -#include "sound/sp0256.h" #include "video/stic.h" +#include "bus/intv/slot.h" +#include "bus/intv/voice.h" +#include "bus/intv/ecs.h" +#include "bus/intv/keycomp.h" class intv_state : public driver_device { @@ -24,31 +27,26 @@ public: intv_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_intellivoice(*this, "sp0256_speech"), - m_sound(*this, "ay8914.1"), - m_ecs_sound(*this, "ay8914.2"), + m_sound(*this, "ay8914"), m_stic(*this, "stic"), + m_cart(*this, "cartslot"), m_intvkbd_dualport_ram(*this, "dualport_ram"), m_videoram(*this, "videoram"), m_keyboard(*this, "keyboard"), + m_iocart1(*this, "ioslot1"), + m_iocart2(*this, "ioslot2"), m_region_maincpu(*this, "maincpu"), - m_region_ecs_rom(*this, "ecs_rom"), m_region_keyboard(*this, "keyboard"), - m_bank1(*this, "bank1"), - m_bank2(*this, "bank2"), - m_bank3(*this, "bank3"), - m_bank4(*this, "bank4"), m_io_options(*this, "OPTIONS"), - m_io_ecs_cntrlsel(*this, "ECS_CNTRLSEL"), m_io_test(*this, "TEST"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") { } + m_palette(*this, "palette") + { } required_device<cpu_device> m_maincpu; - required_device<sp0256_device> m_intellivoice; required_device<ay8914_device> m_sound; - optional_device<ay8914_device> m_ecs_sound; required_device<stic_device> m_stic; + optional_device<intv_cart_slot_device> m_cart; optional_shared_ptr<UINT16> m_intvkbd_dualport_ram; optional_shared_ptr<UINT8> m_videoram; @@ -60,35 +58,16 @@ public: DECLARE_WRITE16_MEMBER(intv_ram8_w); DECLARE_READ16_MEMBER(intv_ram16_r); DECLARE_WRITE16_MEMBER(intv_ram16_w); + DECLARE_READ8_MEMBER(intvkb_iocart_r); - DECLARE_READ16_MEMBER(intv_cart_ram8_r); - DECLARE_WRITE16_MEMBER(intv_cart_ram8_w); - - DECLARE_READ8_MEMBER( intv_right_control_r ); - DECLARE_READ8_MEMBER( intv_left_control_r ); - + DECLARE_READ8_MEMBER(intv_right_control_r); + DECLARE_READ8_MEMBER(intv_left_control_r); + UINT8 m_bus_copy_mode; UINT8 m_backtab_row; UINT16 m_ram16[0x160]; int m_sr1_int_pending; UINT8 m_ram8[256]; - UINT8 m_cart_ram8[2048]; - - // ecs - DECLARE_WRITE16_MEMBER(ecs_bank1_page_select); - DECLARE_WRITE16_MEMBER(ecs_bank2_page_select); - DECLARE_WRITE16_MEMBER(ecs_bank3_page_select); - DECLARE_WRITE16_MEMBER(wsmlb_bank_page_select); - DECLARE_READ16_MEMBER(intv_ecs_ram8_r); - DECLARE_WRITE16_MEMBER(intv_ecs_ram8_w); - - DECLARE_READ8_MEMBER(intv_ecs_porta_r); - DECLARE_WRITE8_MEMBER(intv_ecs_porta_w); - DECLARE_READ8_MEMBER(intv_ecs_portb_r); - - UINT8 m_ecs_ram8[2048]; - UINT8 m_ecs_psg_porta; - int m_ecs_bank_src[4]; // Keyboard Component DECLARE_READ8_MEMBER(intvkbd_tms9927_r); @@ -125,22 +104,16 @@ public: TIMER_CALLBACK_MEMBER(intv_interrupt2_complete); TIMER_CALLBACK_MEMBER(intv_interrupt_complete); TIMER_CALLBACK_MEMBER(intv_btb_fill); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(intv_cart); - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(intvkbd_cart); protected: - int m_is_keybd, m_is_ecs; + int m_is_keybd; optional_device<cpu_device> m_keyboard; + optional_device<generic_slot_device> m_iocart1; + optional_device<generic_slot_device> m_iocart2; required_memory_region m_region_maincpu; - optional_memory_region m_region_ecs_rom; optional_memory_region m_region_keyboard; - optional_memory_bank m_bank1; - optional_memory_bank m_bank2; - optional_memory_bank m_bank3; - optional_memory_bank m_bank4; required_ioport m_io_options; - optional_ioport m_io_ecs_cntrlsel; optional_ioport m_io_test; optional_device<gfxdecode_device> m_gfxdecode; @@ -151,9 +124,6 @@ protected: ioport_port *m_discx[4]; ioport_port *m_discy[4]; ioport_port *m_intv_keyboard[10]; - ioport_port *m_ecs_keyboard[7]; - ioport_port *m_ecs_synth[7]; - UINT8 *m_bank_base[2]; int intv_load_rom_file(device_image_interface &image); UINT8 intv_control_r(int hand); diff --git a/src/mess/machine/intv.c b/src/mess/machine/intv.c index d35c7a95782..f3c0bbc6d9d 100644 --- a/src/mess/machine/intv.c +++ b/src/mess/machine/intv.c @@ -2,10 +2,7 @@ #include "video/stic.h" #include "includes/intv.h" #include "cpu/cp1610/cp1610.h" -#include "hashfile.h" -#define INTELLIVOICE_MASK 0x02 -#define ECS_MASK 0x01 WRITE16_MEMBER( intv_state::intvkbd_dualport16_w ) @@ -288,25 +285,6 @@ WRITE16_MEMBER( intv_state::intv_ram8_w ) m_ram8[offset] = data&0xff; } -READ16_MEMBER( intv_state::intv_ecs_ram8_r ) -{ - return (int)m_ecs_ram8[offset]; -} - -WRITE16_MEMBER( intv_state::intv_ecs_ram8_w ) -{ - m_ecs_ram8[offset] = data&0xff; -} - -READ16_MEMBER( intv_state::intv_cart_ram8_r ) -{ - return (int)m_cart_ram8[offset]; -} -WRITE16_MEMBER( intv_state::intv_cart_ram8_w ) -{ - m_cart_ram8[offset] = data&0xff; -} - READ16_MEMBER( intv_state::intv_ram16_r ) { //logerror("%x = ram16_r(%x)\n",state->m_ram16[offset],offset); @@ -320,289 +298,16 @@ WRITE16_MEMBER( intv_state::intv_ram16_w ) m_ram16[offset] = data & 0xffff; } -// ECS and Wsmlb bank switching register handlers -WRITE16_MEMBER( intv_state::ecs_bank1_page_select ) -{ - if (offset == 0xfff) - { - if (data == 0x2a50) - { - m_ecs_bank_src[0] = 0; - m_bank1->set_base(m_bank_base[m_ecs_bank_src[0]] + (0x2000 << 1)); - } - else if (data == 0x2a51) - { - m_ecs_bank_src[0] = 1; - m_bank1->set_base(m_bank_base[m_ecs_bank_src[0]] + (0x2000 << 1)); - } - } -} - -WRITE16_MEMBER( intv_state::ecs_bank2_page_select ) -{ - if (offset == 0xfff) - { - if (data == 0x7a50) - { - m_ecs_bank_src[1] = 1; - m_bank2->set_base(m_bank_base[m_ecs_bank_src[1]] + (0x7000 << 1)); // ECS ROM at 0x7000 is on page 1 - } - else if (data == 0x7a51 ) - { - m_ecs_bank_src[1] = 0; - m_bank2->set_base(m_bank_base[m_ecs_bank_src[1]] + (0x7000 << 1)); - } - } -} - -WRITE16_MEMBER( intv_state::ecs_bank3_page_select ) -{ - if (offset == 0xfff) - { - if (data == 0xea50) - { - m_ecs_bank_src[2] = 0; - m_bank3->set_base(m_bank_base[m_ecs_bank_src[2]] + (0xe000 << 1)); - } - else if (data == 0xea51) - { - m_ecs_bank_src[2] = 1; - m_bank3->set_base(m_bank_base[m_ecs_bank_src[2]] + (0xe000 << 1)); - } - } -} - -WRITE16_MEMBER( intv_state::wsmlb_bank_page_select ) -{ - logerror("offset %x data %x\n", offset, data); - if (offset == 0xfff) - { - if (data == 0xfa50) - { - m_ecs_bank_src[3] = 0; - m_bank4->set_base(m_bank_base[m_ecs_bank_src[3]] + (0xf000 << 1)); - } - else if (data == 0xfa51) - { - m_ecs_bank_src[3] = 1; - m_bank4->set_base(m_bank_base[m_ecs_bank_src[3]] + (0xf000 << 1)); - } - } -} - -int intv_state::intv_load_rom_file(device_image_interface &image) +READ8_MEMBER( intv_state::intvkb_iocart_r ) { - int i,j; - - UINT8 temp; - UINT8 num_segments; - UINT8 start_seg; - UINT8 end_seg; - - UINT32 current_address; - UINT32 end_address; - - UINT8 high_byte; - UINT8 low_byte; - - UINT8 *memory = m_region_maincpu->base(); - address_space &program = m_maincpu->space(AS_PROGRAM); - const char *filetype = image.filetype(); - - /* if it is in .rom format, we enter here */ - if (!core_stricmp (filetype, "rom")) - { - image.fread( &temp, 1); /* header */ - if (temp != 0xa8) - { - return IMAGE_INIT_FAIL; - } - - image.fread( &num_segments, 1); - - image.fread( &temp, 1); - if (temp != (num_segments ^ 0xff)) - { - return IMAGE_INIT_FAIL; - } - - for (i = 0; i < num_segments; i++) - { - image.fread( &start_seg, 1); - current_address = start_seg * 0x100; - - image.fread( &end_seg, 1); - end_address = end_seg * 0x100 + 0xff; - - while (current_address <= end_address) - { - image.fread( &low_byte, 1); - memory[(current_address << 1) + 1] = low_byte; - image.fread( &high_byte, 1); - memory[current_address << 1] = high_byte; - current_address++; - } - - /* Here we should calculate and compare the CRC16... */ - image.fread( &temp, 1); - image.fread( &temp, 1); - } - - /* Access tables and fine address restriction tables are not supported ATM */ - for (i = 0; i < (16 + 32 + 2); i++) - { - image.fread( &temp, 1); - } - return IMAGE_INIT_PASS; - } - /* otherwise, we load it as a .bin file, using extrainfo from intv.hsi in place of .cfg */ + if (m_iocart1->exists()) + return m_iocart1->read_rom(space, offset, mem_mask); + else if (m_iocart2->exists()) + return m_iocart2->read_rom(space, offset, mem_mask); else - { - /* This code is a blatant hack, due to impossibility to load a separate .cfg file in MESS. */ - /* It shall be eventually replaced by the .xml loading */ - - /* extrainfo format */ - // 1. mapper number (to deal with bankswitch). no bankswitch is mapper 0 (most games). - // 2.->5. current images have at most 4 chunks of data. we store here block size and location to load - // (value & 0xf0) >> 4 is the location / 0x1000 - // (value & 0x0f) is the size / 0x800 - // 6. some images have a ram chunk. as above we store location and size in 8 bits - // 7. extra = 1 ECS, 2 Intellivoice - int start, size; - int mapper, rom[5], ram, extra; - astring extrainfo; - if (!hashfile_extrainfo(image, extrainfo)) - { - /* If no extrainfo, we assume a single 0x2000 chunk at 0x5000 */ - for (i = 0; i < 0x2000; i++ ) - { - image.fread( &low_byte, 1); - memory[((0x5000 + i) << 1) + 1] = low_byte; - image.fread( &high_byte, 1); - memory[(0x5000 + i) << 1] = high_byte; - } - } - else - { - sscanf(extrainfo.cstr() ,"%d %d %d %d %d %d %d", &mapper, &rom[0], &rom[1], &rom[2], - &rom[3], &ram, &extra); - -// logerror("extrainfo: %d %d %d %d %d %d %d \n", mapper, rom[0], rom[1], rom[2], -// rom[3], ram, extra); - - if (mapper) - { - logerror("Bankswitch not yet implemented! \n"); - } - - if (ram) - { - start = (( ram & 0xf0 ) >> 4) * 0x1000; - size = ( ram & 0x0f ) * 0x800; - - program.install_readwrite_handler(start, start + size, - read16_delegate( FUNC( intv_state::intv_cart_ram8_r ), this), - write16_delegate( FUNC( intv_state::intv_cart_ram8_w ), this)); - } - /* For now intellivoice always active - if (extra & INTELLIVOICE_MASK) - { - // tbd - } - */ - - if (extra & ECS_MASK) - { - logerror("Requires ECS Module\n"); - } - - for (j = 0; j < 4; j++) - { - start = (( rom[j] & 0xf0 ) >> 4) * 0x1000; - size = ( rom[j] & 0x0f ) * 0x800; - - /* some cart has to be loaded to 0x4800, but none goes to 0x4000. Hence, we use */ - /* 0x04 << 4 in extrainfo (to reduce the stored values) and fix the value here. */ - if (start == 0x4000) start += 0x800; - -// logerror("step %d: %d %d \n", j, start / 0x1000, size / 0x1000); - - for (i = 0; i < size; i++ ) - { - image.fread( &low_byte, 1); - memory[((start + i) << 1) + 1] = low_byte; - image.fread( &high_byte, 1); - memory[(start + i) << 1] = high_byte; - } - } - } - - return IMAGE_INIT_PASS; - } + return m_region_keyboard->u8(offset + 0xe000); } -DEVICE_IMAGE_LOAD_MEMBER( intv_state, intv_cart ) -{ - if (image.software_entry() == NULL) - return intv_load_rom_file(image); - else - { - UINT16 offset[] = {0x4800, 0x5000, 0x6000, 0x7000, 0x9000, 0xa000, 0xc000, 0xd000, 0xf000}; - const char* region_name[] = {"4800", "5000", "6000", "7000", "9000", "A000", "C000", "D000", "F000"}; - UINT8 *memory = m_region_maincpu->base(); - address_space &program = m_maincpu->space(AS_PROGRAM); - - UINT32 size=0; - UINT16 address = 0; - UINT8 *region; - for(int i = 0; i < 9; i++) - { - address = offset[i]; - size = image.get_software_region_length(region_name[i]); - if (size) - { - region = image.get_software_region(region_name[i]); - for (int j = 0; j < (size>>1); j++) - { - memory[((address + j) << 1) + 1] = region[2*j]; - memory[(address + j) << 1] = region[2*j+1]; - } - } - } - // deal with wsmlb paged rom - - size = image.get_software_region_length("F000_bank1"); - if (size && m_region_ecs_rom) // only load if ecs is plugged in (should probably be done a different way) - { - UINT8 *ecs_rom_region = m_region_ecs_rom->base(); - - region = image.get_software_region("F000_bank1"); - for (int j = 0; j < (size>>1); j++) - { - ecs_rom_region[((address + j) << 1) + 1] = region[2*j]; - ecs_rom_region[(address + j) << 1] = region[2*j+1]; - } - } - - // Cartridge 8bit ram support - size = image.get_software_region_length("D000_RAM8"); - if (size) - { - program.install_readwrite_handler(0xD000, 0xD000 + size, - read16_delegate( FUNC( intv_state::intv_cart_ram8_r ), this), - write16_delegate( FUNC( intv_state::intv_cart_ram8_w ), this)); - } - - size = image.get_software_region_length("8800_RAM8"); - if (size) - { - program.install_readwrite_handler(0x8800, 0x8800 + size, - read16_delegate( FUNC( intv_state::intv_cart_ram8_r ), this), - write16_delegate( FUNC( intv_state::intv_cart_ram8_w ), this)); - } - return IMAGE_INIT_PASS; - } -} /* Set Reset and INTR/INTRM Vector */ void intv_state::machine_reset() @@ -615,21 +320,6 @@ void intv_state::machine_reset() /* Set initial PC */ m_maincpu->set_state_int(CP1610_R7, 0x1000); - - if (m_is_ecs) - { - // ECS can switch between the maincpu and the ecs roms - m_ecs_bank_src[0] = 0; // CPU - m_ecs_bank_src[1] = 1; // ECS - m_ecs_bank_src[2] = 0; // CPU - m_ecs_bank_src[3] = 0; // CPU - m_bank_base[0] = m_region_maincpu->base(); - m_bank_base[1] = m_region_ecs_rom->base(); - m_bank1->set_base(m_bank_base[m_ecs_bank_src[0]] + (0x2000 << 1)); - m_bank2->set_base(m_bank_base[m_ecs_bank_src[1]] + (0x7000 << 1)); - m_bank3->set_base(m_bank_base[m_ecs_bank_src[2]] + (0xe000 << 1)); - m_bank4->set_base(m_bank_base[m_ecs_bank_src[3]] + (0xf000 << 1)); - } } void intv_state::machine_start() @@ -661,30 +351,7 @@ void intv_state::machine_start() save_item(NAME(m_ram16)); save_item(NAME(m_sr1_int_pending)); save_item(NAME(m_ram8)); - save_item(NAME(m_cart_ram8)); - - // ecs - if (m_is_ecs) - { - for (int i = 0; i < 7; i++) - { - char str[9]; - sprintf(str, "ECS_ROW%i", i); - m_ecs_keyboard[i] = ioport(str); - } - for (int i = 0; i < 7; i++) - { - char str[15]; - sprintf(str, "ECS_SYNTH_ROW%i", i); - m_ecs_synth[i] = ioport(str); - } - - save_item(NAME(m_ecs_ram8)); - save_item(NAME(m_ecs_psg_porta)); - save_item(NAME(m_ecs_bank_src)); - machine().save().register_postload(save_prepost_delegate(FUNC(intv_state::ecs_banks_restore), this)); - } - + // intvkbd if (m_is_keybd) { @@ -706,14 +373,47 @@ void intv_state::machine_start() save_item(NAME(m_tms9927_cursor_row)); save_item(NAME(m_tms9927_last_row)); } -} -void intv_state::ecs_banks_restore() -{ - m_bank1->set_base(m_bank_base[m_ecs_bank_src[0]] + (0x2000 << 1)); - m_bank2->set_base(m_bank_base[m_ecs_bank_src[1]] + (0x7000 << 1)); - m_bank3->set_base(m_bank_base[m_ecs_bank_src[2]] + (0xe000 << 1)); - m_bank4->set_base(m_bank_base[m_ecs_bank_src[3]] + (0xf000 << 1)); + if (m_cart && m_cart->exists()) + { + // RAM + switch (m_cart->get_type()) + { + case INTV_RAM: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xd000, 0xd7ff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart)); + break; + case INTV_GFACT: + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x8800, 0x8fff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart)); + break; + case INTV_VOICE: + m_cart->late_subslot_setup(); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart)); + + // passthru for RAM-equipped carts + m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart)); + break; + case INTV_ECS: + m_cart->late_subslot_setup(); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x00f0, 0x00ff, read16_delegate(FUNC(intv_cart_slot_device::read_ay),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ay),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x4000, 0x47ff, read16_delegate(FUNC(intv_cart_slot_device::read_ram),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_ram),(intv_cart_slot_device*)m_cart)); + + m_maincpu->space(AS_PROGRAM).install_write_handler(0x2000, 0x2fff, write16_delegate(FUNC(intv_cart_slot_device::write_rom20),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0x7000, 0x7fff, write16_delegate(FUNC(intv_cart_slot_device::write_rom70),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0xe000, 0xefff, write16_delegate(FUNC(intv_cart_slot_device::write_rome0),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0xf000, 0xffff, write16_delegate(FUNC(intv_cart_slot_device::write_romf0),(intv_cart_slot_device*)m_cart)); + + // passthru for Intellivoice expansion + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0080, 0x0081, read16_delegate(FUNC(intv_cart_slot_device::read_speech),(intv_cart_slot_device*)m_cart), write16_delegate(FUNC(intv_cart_slot_device::write_speech),(intv_cart_slot_device*)m_cart)); + + // passthru for RAM-equipped carts + m_maincpu->space(AS_PROGRAM).install_write_handler(0x8800, 0x8fff, write16_delegate(FUNC(intv_cart_slot_device::write_88),(intv_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_write_handler(0xd000, 0xd7ff, write16_delegate(FUNC(intv_cart_slot_device::write_d0),(intv_cart_slot_device*)m_cart)); + break; + } + + m_cart->save_ram(); + } } @@ -828,84 +528,3 @@ READ8_MEMBER( intv_state::intv_right_control_r ) { return intv_control_r(1); } - -READ8_MEMBER( intv_state::intv_ecs_porta_r ) -{ - if (m_io_ecs_cntrlsel->read() == 0) - return intv_control_r(2); - else - return 0xff; // not sure what to return here, maybe it should be last output? -} - -READ8_MEMBER( intv_state::intv_ecs_portb_r ) -{ - switch (m_io_ecs_cntrlsel->read()) - { - case 0x00: // hand controller - { - return intv_control_r(3); - } - case 0x01: // synthesizer keyboard - { - UINT8 rv = 0xff; - // return correct result if more than one bit of 0xFE is set - for (int i = 0; i < 7; i++) - { - if (BIT(m_ecs_psg_porta, i)) - rv &= m_ecs_synth[i]->read(); - } - return rv; - } - case 0x02: // ecs keyboard - { - UINT8 rv = 0xff; - // return correct result if more than one bit of 0xFE is set - for (int i = 0; i < 7; i++) - { - if (BIT(m_ecs_psg_porta, i)) - rv &= m_ecs_keyboard[i]->read(); - } - return rv; - } - default: - return 0xff; - } -} - -WRITE8_MEMBER( intv_state::intv_ecs_porta_w ) -{ - m_ecs_psg_porta = (~data) & 0xff; -} - -/* Intellivision console + keyboard component */ - -DEVICE_IMAGE_LOAD_MEMBER( intv_state,intvkbd_cart ) -{ - if (strcmp(image.device().tag(),":cart1") == 0) /* Legacy cartridge slot */ - { - /* First, initialize these as empty so that the intellivision - * will think that the playcable is not attached */ - UINT8 *memory = m_region_maincpu->base(); - - /* assume playcable is absent */ - memory[0x4800 << 1] = 0xff; - memory[(0x4800 << 1) + 1] = 0xff; - - if (image.software_entry() == NULL) - { - return intv_load_rom_file(image); - } - // Shouldn't we report failure here??? - } - - if (strcmp(image.device().tag(),":cart2") == 0) /* Keyboard component cartridge slot */ - { - UINT8 *memory = m_region_keyboard->base(); - - /* Assume an 8K cart, like BASIC */ - image.fread(&memory[0xe000], 0x2000); - } - - return IMAGE_INIT_PASS; - -} diff --git a/src/mess/mess.lst b/src/mess/mess.lst index e7f03faadc5..ffc717b6ee3 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -293,6 +293,7 @@ vectrex // General Consumer Electric Vectrex - 1982-1984 intv // Mattel Intellivision - 1979 AKA INTV intv2 // Mattel Intellivision II- 1982? intvsrs // Intellivision (Sears License) - 19?? +intvoice // Mattel Intellivision + IntelliVoice expansion - 1982 // Milton Bradley microvsn // MicroVision - 1979 @@ -1637,7 +1638,7 @@ rs128 // 1984 Memotech RS 128 // Mattel intvkbd // 1981 - Mattel Intellivision Keyboard Component // (Test marketed, later recalled) -intvecs // 1983 - Mattel Intellivision ECS +intvecs // 1983 - Mattel Intellivision w/ECS and IntelliVoice expansions aquarius // 1983 Aquarius //aquariu2 // 1984 Aquarius II juicebox diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 9495461e505..98f77760508 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -592,6 +592,7 @@ BUSES += GBA BUSES += GENERIC BUSES += IEEE488 BUSES += IMI7000 +BUSES += INTV BUSES += IQ151 BUSES += ISA BUSES += ISBX |