diff options
-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 |