diff options
142 files changed, 9934 insertions, 5220 deletions
diff --git a/hash/amiga_cd.xml b/hash/amiga_cd.xml new file mode 100644 index 00000000000..231745ce83c --- /dev/null +++ b/hash/amiga_cd.xml @@ -0,0 +1,166 @@ +<?xml version="1.0"?> +<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd"> +<!-- +license:CC0-1.0 + +http://redump.org/discs/system/acd +--> +<softwarelist name="amiga_cd" description="Commodore AmigaCD images"> + +<!-- !Games --> + + <software name="kangfu" supported="no"> + <!-- "CD-32, A1200, A4000" on cover art --> + <description>Kang Fu</description> + <year>1996</year> + <publisher>GREat Effects Development (GREED)</publisher> + <notes><![CDATA[ +Plenty of [AGA] bugs +CD32: unsupported [Akiko] close tray after CD32 BIOS plays back music, will otherwise throw "Out of Memory" afterwards. +]]></notes> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="kangfu_cd32" sha1="804503915194e87ac44ab4cc9f412444efbc2ee6" /> + </diskarea> + </part> + </software> + +<!-- !Collections --> + + <software name="amigames" supported="partial"> + <description>Aminet Games</description> + <year>2000</year> + <publisher>Schatztruhe</publisher> + <notes><![CDATA[ +https://wiki.aminet.net/Aminet_Games +Not extensively tested, some games known to use ECS or AGA features. (cfr. BrutalTenia) +]]></notes> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="aminet_games" sha1="2c95d94df50fbe9c4f11a90ca926cf880693e49b" /> + </diskarea> + </part> + </software> + + <software name="10on10" supported="partial"> + <description>Ten on Ten Compilation (Europe)</description> + <year>1995</year> + <publisher>Almathera</publisher> + <notes><![CDATA[ +Disc 1 has various unsupported collection of Amiga ParNet and SerNet tools +cd32: disc 1 AmigaKicks\chess has GFX pitch corruption and uncontrollable pointer, [joytest] reset +cd32: disc 10 black screen +]]></notes> + <info name="usage" value="CD32: In order to load any other disc in this collection, insert disc 1 then hold right mouse button at startup for being prompted to disc swap with any other CD in this collection, then soft reset machine"/> + <part name="cdrom1" interface="cdrom"> + <!-- <category>Applications</category> --> + <!-- http://redump.org/disc/18550/ --> + <!-- <rom name="Almathera Comms & Networking CD (Europe).cue" size="106" crc="803a023b" md5="3dd92c3d34ed3cda877dfa31ce492fa6" sha1="fea81c0d76b0f7c84798b9de72d9acc678226530"/> --> + <!-- <rom name="Almathera Comms & Networking CD (Europe).bin" size="248571120" crc="f9991efe" md5="cca00b0125a0f164b6bc73fb6339ee11" sha1="b4520eb166407bd00e54b9cbaf31212b3f54bc7a"/> --> + <feature name="part_id" value="Almathera Comms & Networking CD"/> + <diskarea name="cdrom"> + <disk name="almathera comms & networking cd (europe)" sha1="9996f33406c3c26b4e2be9d7f86d59156fdd48d0"/> + </diskarea> + </part> + + <part name="cdrom2" interface="cdrom"> + <!-- <category>Applications</category> --> + <!-- http://redump.org/disc/18548/ --> + <!-- <rom name="CDPD 1 (Europe).cue" size="81" crc="7e261a25" md5="961b2e9c6f18b5167fe713c0545ca9a2" sha1="f0e60c1c6f0b3a86494a7f46c676a36b363f9bcc"/> --> + <!-- <rom name="CDPD 1 (Europe).bin" size="746776464" crc="30c57806" md5="43b45e0afd4a960359d0ed1ba9120ae7" sha1="4a743f0feba8e20040e3b1ff77c051e57f9222ff"/> --> + <feature name="part_id" value="CDPD 1"/> + <diskarea name="cdrom"> + <disk name="cdpd 1 (europe)" sha1="dcb79ff4d466778cc92d5ccd177f2c97ef7f1d02"/> + </diskarea> + </part> + + <part name="cdrom3" interface="cdrom"> + <!-- <category>Applications</category> --> + <!-- http://redump.org/disc/18548/ --> + <!-- <rom name="CDPD 2 (Europe).cue" size="81" crc="958c5298" md5="1f456742c84b59639360e5105b0a2205" sha1="9f8e7a02a6369833885d6bfdc75c9714378e1551"/> --> + <!-- <rom name="CDPD 2 (Europe).bin" size="658442400" crc="a94c14cc" md5="73e3a9b78888aee9e9754793d797bfd1" sha1="57b63e986dd15ba49362e1ff02eabe4a754b412f"/> --> + <feature name="part_id" value="CDPD 2"/> + <diskarea name="cdrom"> + <disk name="cdpd 2 (europe)" sha1="9c3f2a0cb7933fd10694d80f75bb93fbab5c755e"/> + </diskarea> + </part> + + <part name="cdrom4" interface="cdrom"> + <!-- <category>Multimedia</category> --> + <!-- http://redump.org/disc/18551/ --> + <!-- <rom name="Demo 1 (Europe).cue" size="81" crc="0f256c23" md5="23d4594e745f3174e8b9b8ecfcac1f34" sha1="73317088554a3c8aa8b3ca5feaeb3ff63b062585"/> --> + <!-- <rom name="Demo 1 (Europe).bin" size="708610560" crc="9ee5043f" md5="30d0e664799138e2c8d641b48d4192c0" sha1="42966b2d2f0ffd5540ec795861eb8b15f7076899"/> --> + <feature name="part_id" value="Demo 1"/> + <diskarea name="cdrom"> + <disk name="demo 1 (europe)" sha1="ef7c7c992fd7bc7fea080ec43357314999e6785b"/> + </diskarea> + </part> + + <part name="cdrom5" interface="cdrom"> + <!-- <category>Multimedia</category> --> + <!-- http://redump.org/disc/18523/ --> + <!-- <rom name="World Vista (Europe).cue" size="86" crc="74387a47" md5="2194ac62bf9b48f0608aac799428e47e" sha1="705c4eb8cdfadc98b66a924c0aadc15046b77875"/> --> + <!-- <rom name="World Vista (Europe).bin" size="502789392" crc="b2113b15" md5="8ec646ed17c575139d644efcf1566fbd" sha1="5b71c5976c388dd7a6e870ca36840c7accd50701"/> --> + <feature name="part_id" value="World Vista"/> + <diskarea name="cdrom"> + <disk name="world vista (europe)" sha1="7b73c1ac1a25cc7b10b2a91b118dde3684128482"/> + </diskarea> + </part> + + <part name="cdrom6" interface="cdrom"> + <!-- <category>Educational</category> --> + <!-- http://redump.org/disc/18522/ --> + <!-- <rom name="Illustrated Works of Shakespeare (Europe).cue" size="107" crc="abb7e3a0" md5="0f3e783ca41909d10a74c9d45191f3d3" sha1="b2438bd35b8e60b2ebd2d3ef501e6b1d28eab6ef"/> --> + <!-- <rom name="Illustrated Works of Shakespeare (Europe).bin" size="53214000" crc="29c9634c" md5="a6984256d64d0daad5423575a805b41e" sha1="bab8b78ce7c95da36b650394cfbc285af7726da0"/> --> + <feature name="part_id" value="Illustrated Works of Shakespeare"/> + <diskarea name="cdrom"> + <disk name="illustrated works of shakespeare (europe)" sha1="5e54c12eda0c560b48f96df7dfba53990a6cdeea"/> + </diskarea> + </part> + + <part name="cdrom7" interface="cdrom"> + <!-- <category>Multimedia</category> --> + <!-- http://redump.org/disc/18521/ --> + <!-- <rom name="Pandora's CD (Europe) (Alt).cue" size="93" crc="6685c80c" md5="8147396f05b2b7b17b55821d9678c982" sha1="620f0c1437e2ea13adf14baf3895fc55b5c988e5"/> --> + <!-- <rom name="Pandora's CD (Europe) (Alt).bin" size="458738784" crc="ddb7e392" md5="e7740666bced9f7a96da85ad9b4d113f" sha1="adac7c881f641bfc4667fcf8e7469886906548ea"/> --> + <feature name="part_id" value="Pandora's CD"/> + <diskarea name="cdrom"> + <disk name="pandora's cd (europe) (alt)" sha1="488241b997f026533444b05e60357be3b5d78f41"/> + </diskarea> + </part> + + <part name="cdrom8" interface="cdrom"> + <!-- <category>Games</category> --> + <!-- http://redump.org/disc/18520/ --> + <!-- <rom name="Team Yankee (Europe) (Ten on Ten).cue" size="99" crc="606f0162" md5="8c173ad5d43a8447e924ce5075a7471c" sha1="62e5d539082c8d4796a8057577e6e59906193298"/> --> + <!-- <rom name="Team Yankee (Europe) (Ten on Ten).bin" size="7079520" crc="de95d6f2" md5="efc8a6b9face11df7a53ba32c74bbb2a" sha1="713bd1aaefe59e15af61771abffde3c89b5b9d2c"/> --> + <feature name="part_id" value="Team Yankee"/> + <diskarea name="cdrom"> + <disk name="team yankee (europe) (ten on ten)" sha1="70e8946f4b161ca3011c523cb007180196762d8c"/> + </diskarea> + </part> + + <part name="cdrom9" interface="cdrom"> + <!-- <category>Multimedia</category> --> + <!-- http://redump.org/disc/18519/ --> + <!-- <rom name="Almathera Photo Library CD, The (Europe).cue" size="106" crc="68b31c99" md5="ea8423140d0209f04755a2505bef109f" sha1="1941996df3ce012770172fbc7f6552bd34b9503e"/> --> + <!-- <rom name="Almathera Photo Library CD, The (Europe).bin" size="636801648" crc="75ecfbe4" md5="c1957cc3701c16379261420285f11677" sha1="dc1f8e27a0831476d694548fe1021c73974523c6"/> --> + <feature name="part_id" value="The Almathera Photo Library CD"/> + <diskarea name="cdrom"> + <disk name="almathera photo library cd, the (europe)" sha1="abcba2861161369b3394344792d491c85f6cb24d"/> + </diskarea> + </part> + + <part name="cdrom10" interface="cdrom"> + <!-- <category>Multimedia</category> --> + <!-- http://redump.org/disc/18518/ --> + <!-- <rom name="Almathera Clipart & Fonts CD, The (Europe).cue" size="108" crc="78acde0b" md5="0440ed5c13780246105b0ea4b76ed7ca" sha1="d644a15e06b84a308dfee8e543d214d2ebadc0ea"/> --> + <!-- <rom name="Almathera Clipart & Fonts CD, The (Europe).bin" size="230662992" crc="89ab1b59" md5="efcc9acae92fe1cf7975c41c38ad30a1" sha1="039ab9c11793fd66ac74e34fbc44d138babfb666"/> --> + <feature name="part_id" value="The Almathera Clipart & Fonts CD"/> + <diskarea name="cdrom"> + <disk name="almathera clipart & fonts cd, the (europe)" sha1="dba531dac0190bd355b8a7cd4128355c3b077641"/> + </diskarea> + </part> + </software> + +</softwarelist> diff --git a/hash/cassvisn_cart.xml b/hash/cassvisn_cart.xml index fc95747bfd9..8ef244877ca 100644 --- a/hash/cassvisn_cart.xml +++ b/hash/cassvisn_cart.xml @@ -104,7 +104,7 @@ the ROM files below store 12 bit in a 16-bit word with 4 bits unused, so 128 * 1 <description>Battle Vader</description> <year>1982</year> <publisher>Epoch</publisher> - <info name="alt_title" value="バトルヘーダー"/> + <info name="alt_title" value="バトルべーダー"/> <info name="release" value="19820303"/> <part name="cart" interface="cassvisn_cart"> <dataarea name="prg" width="16" endianness="big" size="0xf00"> diff --git a/hash/cd32.xml b/hash/cd32.xml index 4e27a0023e6..035ba8699f0 100644 --- a/hash/cd32.xml +++ b/hash/cd32.xml @@ -75,7 +75,6 @@ license:CC0-1.0 James Pond 3: Operation Starfi5h [Kixx] John Barnes European Football Jungle Strike - Kang Fu (AmigaCD) Karaoke: Julsånger I Kingpin: Arcade Sports Bowling Labyrinth Of Time, The diff --git a/hash/cdtv.xml b/hash/cdtv.xml index 011f89b0a2a..c592be9bebd 100644 --- a/hash/cdtv.xml +++ b/hash/cdtv.xml @@ -2665,129 +2665,4 @@ cd32: boot OK </part> </software> - <!-- Collections --> - - <!-- Collection of ten discs --> - <!-- TODO: More likely AmigaCD rather than CDTV? --> - <software name="10on10" supported="no"> - <description>Ten on Ten Compilation (Europe)</description> - <year>1995</year> - <publisher>Almathera</publisher> - <notes><![CDATA[ -Disc 1 has various unsupported collection of Amiga ParNet and SerNet tools -cd32: disc 1 AmigaKicks\chess has GFX pitch corruption and uncontrollable pointer, [joytest] reset -cd32: disc 10 black screen -]]></notes> - <info name="usage" value="In order to load any other disc in this collection: insert disc 1 then hold right mouse button at startup for being prompted to disc swap with any other CD in this collection, then soft reset machine"/> - <part name="cdrom1" interface="cdrom"> - <!-- <category>Applications</category> --> - <!-- http://redump.org/disc/18550/ --> - <!-- <rom name="Almathera Comms & Networking CD (Europe).cue" size="106" crc="803a023b" md5="3dd92c3d34ed3cda877dfa31ce492fa6" sha1="fea81c0d76b0f7c84798b9de72d9acc678226530"/> --> - <!-- <rom name="Almathera Comms & Networking CD (Europe).bin" size="248571120" crc="f9991efe" md5="cca00b0125a0f164b6bc73fb6339ee11" sha1="b4520eb166407bd00e54b9cbaf31212b3f54bc7a"/> --> - <feature name="part_id" value="Almathera Comms & Networking CD"/> - <diskarea name="cdrom"> - <disk name="almathera comms & networking cd (europe)" sha1="9996f33406c3c26b4e2be9d7f86d59156fdd48d0"/> - </diskarea> - </part> - - <part name="cdrom2" interface="cdrom"> - <!-- <category>Applications</category> --> - <!-- http://redump.org/disc/18548/ --> - <!-- <rom name="CDPD 1 (Europe).cue" size="81" crc="7e261a25" md5="961b2e9c6f18b5167fe713c0545ca9a2" sha1="f0e60c1c6f0b3a86494a7f46c676a36b363f9bcc"/> --> - <!-- <rom name="CDPD 1 (Europe).bin" size="746776464" crc="30c57806" md5="43b45e0afd4a960359d0ed1ba9120ae7" sha1="4a743f0feba8e20040e3b1ff77c051e57f9222ff"/> --> - <feature name="part_id" value="CDPD 1"/> - <diskarea name="cdrom"> - <disk name="cdpd 1 (europe)" sha1="dcb79ff4d466778cc92d5ccd177f2c97ef7f1d02"/> - </diskarea> - </part> - - <part name="cdrom3" interface="cdrom"> - <!-- <category>Applications</category> --> - <!-- http://redump.org/disc/18548/ --> - <!-- <rom name="CDPD 2 (Europe).cue" size="81" crc="958c5298" md5="1f456742c84b59639360e5105b0a2205" sha1="9f8e7a02a6369833885d6bfdc75c9714378e1551"/> --> - <!-- <rom name="CDPD 2 (Europe).bin" size="658442400" crc="a94c14cc" md5="73e3a9b78888aee9e9754793d797bfd1" sha1="57b63e986dd15ba49362e1ff02eabe4a754b412f"/> --> - <feature name="part_id" value="CDPD 2"/> - <diskarea name="cdrom"> - <disk name="cdpd 2 (europe)" sha1="9c3f2a0cb7933fd10694d80f75bb93fbab5c755e"/> - </diskarea> - </part> - - <part name="cdrom4" interface="cdrom"> - <!-- <category>Multimedia</category> --> - <!-- http://redump.org/disc/18551/ --> - <!-- <rom name="Demo 1 (Europe).cue" size="81" crc="0f256c23" md5="23d4594e745f3174e8b9b8ecfcac1f34" sha1="73317088554a3c8aa8b3ca5feaeb3ff63b062585"/> --> - <!-- <rom name="Demo 1 (Europe).bin" size="708610560" crc="9ee5043f" md5="30d0e664799138e2c8d641b48d4192c0" sha1="42966b2d2f0ffd5540ec795861eb8b15f7076899"/> --> - <feature name="part_id" value="Demo 1"/> - <diskarea name="cdrom"> - <disk name="demo 1 (europe)" sha1="ef7c7c992fd7bc7fea080ec43357314999e6785b"/> - </diskarea> - </part> - - <part name="cdrom5" interface="cdrom"> - <!-- <category>Multimedia</category> --> - <!-- http://redump.org/disc/18523/ --> - <!-- <rom name="World Vista (Europe).cue" size="86" crc="74387a47" md5="2194ac62bf9b48f0608aac799428e47e" sha1="705c4eb8cdfadc98b66a924c0aadc15046b77875"/> --> - <!-- <rom name="World Vista (Europe).bin" size="502789392" crc="b2113b15" md5="8ec646ed17c575139d644efcf1566fbd" sha1="5b71c5976c388dd7a6e870ca36840c7accd50701"/> --> - <feature name="part_id" value="World Vista"/> - <diskarea name="cdrom"> - <disk name="world vista (europe)" sha1="7b73c1ac1a25cc7b10b2a91b118dde3684128482"/> - </diskarea> - </part> - - <part name="cdrom6" interface="cdrom"> - <!-- <category>Educational</category> --> - <!-- http://redump.org/disc/18522/ --> - <!-- <rom name="Illustrated Works of Shakespeare (Europe).cue" size="107" crc="abb7e3a0" md5="0f3e783ca41909d10a74c9d45191f3d3" sha1="b2438bd35b8e60b2ebd2d3ef501e6b1d28eab6ef"/> --> - <!-- <rom name="Illustrated Works of Shakespeare (Europe).bin" size="53214000" crc="29c9634c" md5="a6984256d64d0daad5423575a805b41e" sha1="bab8b78ce7c95da36b650394cfbc285af7726da0"/> --> - <feature name="part_id" value="Illustrated Works of Shakespeare"/> - <diskarea name="cdrom"> - <disk name="illustrated works of shakespeare (europe)" sha1="5e54c12eda0c560b48f96df7dfba53990a6cdeea"/> - </diskarea> - </part> - - <part name="cdrom7" interface="cdrom"> - <!-- <category>Multimedia</category> --> - <!-- http://redump.org/disc/18521/ --> - <!-- <rom name="Pandora's CD (Europe) (Alt).cue" size="93" crc="6685c80c" md5="8147396f05b2b7b17b55821d9678c982" sha1="620f0c1437e2ea13adf14baf3895fc55b5c988e5"/> --> - <!-- <rom name="Pandora's CD (Europe) (Alt).bin" size="458738784" crc="ddb7e392" md5="e7740666bced9f7a96da85ad9b4d113f" sha1="adac7c881f641bfc4667fcf8e7469886906548ea"/> --> - <feature name="part_id" value="Pandora's CD"/> - <diskarea name="cdrom"> - <disk name="pandora's cd (europe) (alt)" sha1="488241b997f026533444b05e60357be3b5d78f41"/> - </diskarea> - </part> - - <part name="cdrom8" interface="cdrom"> - <!-- <category>Games</category> --> - <!-- http://redump.org/disc/18520/ --> - <!-- <rom name="Team Yankee (Europe) (Ten on Ten).cue" size="99" crc="606f0162" md5="8c173ad5d43a8447e924ce5075a7471c" sha1="62e5d539082c8d4796a8057577e6e59906193298"/> --> - <!-- <rom name="Team Yankee (Europe) (Ten on Ten).bin" size="7079520" crc="de95d6f2" md5="efc8a6b9face11df7a53ba32c74bbb2a" sha1="713bd1aaefe59e15af61771abffde3c89b5b9d2c"/> --> - <feature name="part_id" value="Team Yankee"/> - <diskarea name="cdrom"> - <disk name="team yankee (europe) (ten on ten)" sha1="70e8946f4b161ca3011c523cb007180196762d8c"/> - </diskarea> - </part> - - <part name="cdrom9" interface="cdrom"> - <!-- <category>Multimedia</category> --> - <!-- http://redump.org/disc/18519/ --> - <!-- <rom name="Almathera Photo Library CD, The (Europe).cue" size="106" crc="68b31c99" md5="ea8423140d0209f04755a2505bef109f" sha1="1941996df3ce012770172fbc7f6552bd34b9503e"/> --> - <!-- <rom name="Almathera Photo Library CD, The (Europe).bin" size="636801648" crc="75ecfbe4" md5="c1957cc3701c16379261420285f11677" sha1="dc1f8e27a0831476d694548fe1021c73974523c6"/> --> - <feature name="part_id" value="The Almathera Photo Library CD"/> - <diskarea name="cdrom"> - <disk name="almathera photo library cd, the (europe)" sha1="abcba2861161369b3394344792d491c85f6cb24d"/> - </diskarea> - </part> - - <part name="cdrom10" interface="cdrom"> - <!-- <category>Multimedia</category> --> - <!-- http://redump.org/disc/18518/ --> - <!-- <rom name="Almathera Clipart & Fonts CD, The (Europe).cue" size="108" crc="78acde0b" md5="0440ed5c13780246105b0ea4b76ed7ca" sha1="d644a15e06b84a308dfee8e543d214d2ebadc0ea"/> --> - <!-- <rom name="Almathera Clipart & Fonts CD, The (Europe).bin" size="230662992" crc="89ab1b59" md5="efcc9acae92fe1cf7975c41c38ad30a1" sha1="039ab9c11793fd66ac74e34fbc44d138babfb666"/> --> - <feature name="part_id" value="The Almathera Clipart & Fonts CD"/> - <diskarea name="cdrom"> - <disk name="almathera clipart & fonts cd, the (europe)" sha1="dba531dac0190bd355b8a7cd4128355c3b077641"/> - </diskarea> - </part> - </software> - </softwarelist> diff --git a/hash/ibm5170_cdrom.xml b/hash/ibm5170_cdrom.xml index d5fd13a59b1..a47b713254f 100644 --- a/hash/ibm5170_cdrom.xml +++ b/hash/ibm5170_cdrom.xml @@ -6304,6 +6304,460 @@ Includes DOS and Windows installation setup. </part> </software> + <!-- Windows 95/98/Me --> + <!-- Requires Pentium 75 MHz or better --> + <!-- Source: http://redump.org/disc/24559/ --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814).cue" size="4501" crc="29cfb958" sha1="381c53deee68714a1d4eae960e7f7b933a093140" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 01).bin" size="210863856" crc="ca1380db" sha1="7362ded5fbe9f0dace33daebae59c1760d15156f" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 02).bin" size="1808688" crc="9a20219b" sha1="53bd3b15973d850eb609cc2190d592e6169142c1" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 03).bin" size="19935552" crc="40da6c84" sha1="9c22dcaf8411c2c1ee8f4073207d73f7d165b226" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 04).bin" size="14834064" crc="a28f7d55" sha1="d3646a032892c41af78299213b3e983a28b4e234" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 05).bin" size="15553776" crc="a710eb1b" sha1="f242b096f27b073defd9a84650deb5f817ad2fcf" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 06).bin" size="18195072" crc="524ddd6c" sha1="0fd6576fdd05c4213e26543fe7d1615e7f1466de" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 07).bin" size="14664720" crc="c04168b8" sha1="185bdb1b8dc567d2114973d8b8a9e0b0bd5b80bc" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 08).bin" size="15003408" crc="2ff8ab4c" sha1="6762d1c002a10b567bec4a780aaa81a96b7158d9" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 09).bin" size="20848128" crc="dcdc3041" sha1="a6683d2615a0a775a47ec4c32f8f24a6a2e49023" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 10).bin" size="14655312" crc="29553e37" sha1="7f99e94ccba7aa073b88bab8eae8176e4d78114b" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 11).bin" size="14311920" crc="4750fe5f" sha1="6197d436417ac38b681af75ab2b30b85f9e2d5cc" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 12).bin" size="18719568" crc="c80721e6" sha1="3aad760f688cabe3333e3c77a967bb6c287bc65a" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 13).bin" size="14194320" crc="03101e05" sha1="9ed9e85d73c589e5b6b52311750f73a64e24e641" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 14).bin" size="12035184" crc="f085e021" sha1="3cd98e78f91c88cfadccecc71d4a6726b71baf72" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 15).bin" size="16753296" crc="f331287d" sha1="2eba0d6d0bc9db590a46dc74b0328280ea63bc94" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 16).bin" size="11501280" crc="95ee4e0b" sha1="2fc7760688961a50d530d380598bc12a9650018a" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 17).bin" size="14627088" crc="313070fc" sha1="11605f4a7a7c53265591fb72d6cf2168b1044b03" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 18).bin" size="20850480" crc="f6492eec" sha1="06476cdacd6d0024978f8e9c1d801c82ca451874" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 19).bin" size="13441680" crc="5453e82a" sha1="56766471e47c558c1d8a18f2d6f23b8b33b2d474" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 20).bin" size="12373872" crc="a06bdbcc" sha1="db12b136e4f10a20610e5975230018c5ce914dea" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 21).bin" size="15546720" crc="81b6dd5b" sha1="c733460166ac7986d44a7f49ce28a32266363289" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 22).bin" size="12192768" crc="2ca7905c" sha1="06e42f91107d459e2e9f7c8eb9797b8b69b7266d" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 23).bin" size="13429920" crc="8a9a9d1c" sha1="6bb7aca74f3f8a1732c6ea2496bbeac7da3b45a6" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 24).bin" size="14660016" crc="c3027392" sha1="e8385914d0d83c0998c8ebc55a6955c5441239c7" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 25).bin" size="15360912" crc="b1d8f5cf" sha1="9222018cdfef47fd6f81dda3d1865ef13350424d" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 26).bin" size="5752992" crc="941c546f" sha1="38a01ac1cf5d6eef783be70a91c3d11d23789c50" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 27).bin" size="5752992" crc="626755c7" sha1="6c60bc226b3ca6352adb31019c064d0e0299f0ee" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 28).bin" size="2208528" crc="2563d1ce" sha1="0e7c4aacd047e4078efc1e5e7a0a5e7367c78f2d" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 29).bin" size="6155184" crc="536a929a" sha1="22697ea05b845f5379d4fb91e5664b9982fdc11b" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 30).bin" size="6338640" crc="076fe05f" sha1="8bb8b152707743f38a853a19716da2a9f6d02bf0" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 31).bin" size="2646000" crc="18e86840" sha1="76544baee1d9af4b1dca0aa8dd2d9363f0131c60" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 32).bin" size="22082928" crc="7f388d53" sha1="3282908d0274bc50abbfcbe68fd7c23d79f0a386" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 33).bin" size="22431024" crc="9abde560" sha1="299358af39fc7eff54a5b3ae6adabff87f3b4f9f" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 34).bin" size="16767408" crc="346134ad" sha1="6815e27233647a1f7ecb439e8ecdbe22f460d33a" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 35).bin" size="1455888" crc="b74d7fa9" sha1="1e141141321f7b798d82de296686370b4c03414e" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 36).bin" size="16010064" crc="cebe5e3f" sha1="87ea369932a29db498c47fd1f84f7800603f91fd" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 37).bin" size="15817200" crc="b0c11ef7" sha1="bbc7770ca6a8c66e79da489942552176589a1791" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 38).bin" size="14784672" crc="a536e03e" sha1="31603bf0355fe971fd2772ca4f14b0283c501e53" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 39).bin" size="15629040" crc="44017c12" sha1="2ebca76693c96325a16889a2708e26970ae79d10" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 40).bin" size="19361664" crc="641b6729" sha1="7be5dcab1dccc8c2ae80cb0b40a545cd6d2be89d" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 41).bin" size="14942256" crc="d3bdce2d" sha1="08c9d9f560ca00004eac06b9182c59320c63643e" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (20000814) (Track 42).bin" size="12938352" crc="7b3d3984" sha1="da8b4097c388bf3066183212665034f4866e990c" /> --> + <software name="soniccd"> + <description>Sonic CD (USA)</description> + <year>2000</year> + <publisher>Sega / Expert Software</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (usa 2000 release)" sha1="e93a6b4da206b06e4094c70eeebb0ae7db980c13" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/54285/ --> + <!-- <rom name="Sonic CD (USA) (Rerelease).cue" size="5507" crc="f0ec8262" sha1="dd1709003801435a91ee83b2495557625f199464" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 01).bin" size="218884176" crc="abc2a43b" sha1="e9ef17afa8c566d07a3fee7355b88c33bcf4ba25" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 02).bin" size="1462944" crc="e585e0c6" sha1="45d26d3f3a0862c9e75c10e8bee492d2c3575923" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 03).bin" size="19935552" crc="f7a6b795" sha1="6034eb6d6ee3462467e1be53e81394075c347251" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 04).bin" size="14834064" crc="41885790" sha1="30517d47388f0368140e7ab34174d8dba680f276" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 05).bin" size="15553776" crc="7690f251" sha1="76c273d32e13463ae0cdb32deb66b74ae57d5109" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 06).bin" size="18195072" crc="3d0d8457" sha1="e5e95bd5257de07aaf539396f0741289e283c051" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 07).bin" size="14664720" crc="3fe68767" sha1="f2947e05d0174317721e2cf5e6f763cfde223f93" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 08).bin" size="15003408" crc="478ce897" sha1="25a659346d1cd11b42512960270845ffbfb08b5a" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 09).bin" size="20848128" crc="8288514e" sha1="ec63c7aca99566e59a8f86a46332e8d74ce168d9" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 10).bin" size="14655312" crc="6dd2cc39" sha1="e028e6ad6d94734bcb9f1f6a2fac1253c9a10791" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 11).bin" size="14311920" crc="c7636722" sha1="ce58a82bfbd9d0dd9ef6db6ce3654ffeda3f4428" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 12).bin" size="18719568" crc="569f9b8d" sha1="78b92071acd33675137e67395b3530ace98d509e" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 13).bin" size="14194320" crc="6bac75d0" sha1="4ef3371a6521b0a6e75ae799166214ab679b6ba4" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 14).bin" size="12035184" crc="52b7f559" sha1="8a413a272fdca068e224eb3db670ff4cff4101f1" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 15).bin" size="16753296" crc="6ae6a933" sha1="d3f217708552fa9eaed44656e57711c8a5659a74" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 16).bin" size="11501280" crc="d6b22031" sha1="f2a549879390cee5ba27c47a2e80763867b7990e" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 17).bin" size="14627088" crc="77804511" sha1="a274f5b7be0ef02d849f053a9c23075d95d7ec06" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 18).bin" size="20850480" crc="5937c771" sha1="9d0323b268bf14eb769b4e273fe0957395e86433" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 19).bin" size="13441680" crc="8f34572b" sha1="95dc66a4b4c7e106838837bd5f3f665ddaf45c29" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 20).bin" size="12373872" crc="6c55a368" sha1="5be697dc8b9a9ab67b6c70b119c3b5b280d4ded4" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 21).bin" size="15546720" crc="e1dc4c57" sha1="0a6317d6cbe372200fa790a36eb20fff1697ab72" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 22).bin" size="12192768" crc="90c7820d" sha1="23ed5c622ed3859b082c823dd649a47c78ecc429" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 23).bin" size="13429920" crc="89f119de" sha1="3063e2a93c3be30585cc9600ce54f4b0d9420b50" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 24).bin" size="14660016" crc="9cd673d1" sha1="a51cbb6ec3520d26e1c2bd2fc28352a898c80c91" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 25).bin" size="15360912" crc="23bacb8d" sha1="72c777f6102d77ebe6725b14e674b7f8ffbcf0fe" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 26).bin" size="5752992" crc="06caf170" sha1="adaa7d5e265416dfd5780276944ecfa5370c0475" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 27).bin" size="5752992" crc="c8bd7ec3" sha1="7bdbc5a1f717d12c03999f85cf021662f78b02a0" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 28).bin" size="2208528" crc="5f295417" sha1="21adfe16aa5042f7cb4c1ed0d0e19c92247be89d" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 29).bin" size="6155184" crc="44525a43" sha1="0093a6186a01a211cc17fabcad09b2e6b1cd9b49" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 30).bin" size="6338640" crc="8f769927" sha1="6c367e1bdd3c330a9db107f7c49e7121895ece6f" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 31).bin" size="2646000" crc="f34fd531" sha1="4a4eeea2239b94be2751898a7048b9ce1d3afda2" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 32).bin" size="22082928" crc="9dd41cd5" sha1="70e5b2139058f4266a5140ecc10ae0517c8b1f39" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 33).bin" size="22431024" crc="98cbe15d" sha1="d8daa7d89235c0578d0dd51965f77feda14d6bf4" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 34).bin" size="16767408" crc="9c8605d3" sha1="61fcd1929149fe5b56df4548c2f887dcbd4bc004" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 35).bin" size="1455888" crc="5de591e4" sha1="60fe39bcbd6e1dc873c06aeb0970946228c7be16" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 36).bin" size="16010064" crc="3731841a" sha1="11123f04899d6de0cdb0eaf9b89cf5c1f8faa87c" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 37).bin" size="15817200" crc="1f26d9db" sha1="2e5faa8de4e3499b6f3560caff2a4abe981dac09" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 38).bin" size="14784672" crc="9b4a3d51" sha1="02b25561a566925b978326a4ccdbc70008e8d076" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 39).bin" size="15629040" crc="5f911745" sha1="39d824eb19cfec165249ba325e259c6e5e79abcd" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 40).bin" size="19361664" crc="363dd11f" sha1="bb030458eaba98113037ea0e11f71f83fba3c242" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 41).bin" size="14942256" crc="08d1f953" sha1="eac728e0248e8d01f94062340ab789080b38f6a2" /> --> + <!-- <rom name="Sonic CD (USA) (Rerelease) (Track 42).bin" size="13288800" crc="9e733fde" sha1="012f16a73d312306f466bd0529162bb0f7a1ee38" /> --> + <software name="soniccdo" cloneof="soniccd"> + <description>Sonic CD (USA, 1997 release)</description> + <year>1997</year> + <publisher>Sega / Expert Software</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (usa 1997 release)" sha1="82eb717a15b65bd0853892f242b8c67b2afab2b3" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/45321/ --> + <!-- <rom name="Sonic CD (USA).cue" size="4393" crc="ffe8f354" sha1="a714470ede676d4378aa45e418083f2b76d9f88a" /> --> + <!-- <rom name="Sonic CD (USA) (Track 01).bin" size="200181072" crc="c2f4027b" sha1="d277818c762f88140a549b2f76be4f48b14b1b0c" /> --> + <!-- <rom name="Sonic CD (USA) (Track 02).bin" size="1272432" crc="b6db3328" sha1="77c0ca622758e0ddef2394f5c72e686316cf68df" /> --> + <!-- <rom name="Sonic CD (USA) (Track 03).bin" size="19970832" crc="5c408f19" sha1="6d308207582da11f0281962ac2ed167a19587554" /> --> + <!-- <rom name="Sonic CD (USA) (Track 04).bin" size="14829360" crc="a30295af" sha1="9c9b7427777476b0bb28b47cd65e1c278b6d01cd" /> --> + <!-- <rom name="Sonic CD (USA) (Track 05).bin" size="15551424" crc="38860d9e" sha1="ce451518ebcfc86b1d67fb82b40b327791f05b00" /> --> + <!-- <rom name="Sonic CD (USA) (Track 06).bin" size="18185664" crc="456c4de9" sha1="2987c863bd830ec3fa764afed7be7a2b6e7cd7c0" /> --> + <!-- <rom name="Sonic CD (USA) (Track 07).bin" size="14657664" crc="14efe496" sha1="05770655d1189517d9751092ab927fe445291b07" /> --> + <!-- <rom name="Sonic CD (USA) (Track 08).bin" size="15001056" crc="ebd2567b" sha1="274d218e857bc66ee1939b9b445407b7bb94da72" /> --> + <!-- <rom name="Sonic CD (USA) (Track 09).bin" size="20848128" crc="87b1cfbd" sha1="853ecc97167e968116b9b2d2c3e197ef392bd655" /> --> + <!-- <rom name="Sonic CD (USA) (Track 10).bin" size="14650608" crc="cb9d307d" sha1="186709b944ec82ffb0c2d6609f5192141e71ecc3" /> --> + <!-- <rom name="Sonic CD (USA) (Track 11).bin" size="14302512" crc="0497cb13" sha1="f7518a37a8c03813c73594e700da27391be97c8f" /> --> + <!-- <rom name="Sonic CD (USA) (Track 12).bin" size="18712512" crc="f8be5345" sha1="4cfc98409a0c685f7e630d2804daad0273eb58b2" /> --> + <!-- <rom name="Sonic CD (USA) (Track 13).bin" size="14370720" crc="6fe7a22f" sha1="97e0825fdac8c149fb16a9b05c6b24c05ac85958" /> --> + <!-- <rom name="Sonic CD (USA) (Track 14).bin" size="12028128" crc="f4a94dec" sha1="7e03bd40adbb3c838ae7b627a93aad3bfdb7e3c7" /> --> + <!-- <rom name="Sonic CD (USA) (Track 15).bin" size="16769760" crc="7fa1876e" sha1="305dc1c48a0bba1629c7b7314128cceef20240a2" /> --> + <!-- <rom name="Sonic CD (USA) (Track 16).bin" size="11494224" crc="597c7c37" sha1="3e0c5bcb3b53ec7b6bc1d6b40f8aaef7839228c8" /> --> + <!-- <rom name="Sonic CD (USA) (Track 17).bin" size="14660016" crc="95967be1" sha1="f42f1622d11345bb07107ec490cf773f2f8a2c8b" /> --> + <!-- <rom name="Sonic CD (USA) (Track 18).bin" size="20843424" crc="26b46e07" sha1="5f7fff37413f4ded329968af009c096c6a0f2b3d" /> --> + <!-- <rom name="Sonic CD (USA) (Track 19).bin" size="13434624" crc="4527e70e" sha1="455bf7a11164ef3a1a3e5743b87bd87f34584f37" /> --> + <!-- <rom name="Sonic CD (USA) (Track 20).bin" size="12366816" crc="46851694" sha1="b4450d116585eb98eb90a5260e52a675775ea462" /> --> + <!-- <rom name="Sonic CD (USA) (Track 21).bin" size="15544368" crc="a1813894" sha1="2e39eefb54f8fb8ba1cba8e6d50159eecaa865a8" /> --> + <!-- <rom name="Sonic CD (USA) (Track 22).bin" size="12192768" crc="3983d8b1" sha1="79b20f099a01ebd3681e74d2f4e7bc7a93b10c07" /> --> + <!-- <rom name="Sonic CD (USA) (Track 23).bin" size="13425216" crc="ce90c65d" sha1="02d3393459fe8ad72ea17cf31c348b6301409002" /> --> + <!-- <rom name="Sonic CD (USA) (Track 24).bin" size="14655312" crc="0a58684d" sha1="3e2dc7ce79f4d5c71dcb0f7234464ea89ca5c383" /> --> + <!-- <rom name="Sonic CD (USA) (Track 25).bin" size="15353856" crc="efb50392" sha1="419df5f389fe6b82d96d7f5fb2ce047b00f8f7be" /> --> + <!-- <rom name="Sonic CD (USA) (Track 26).bin" size="5828256" crc="727720f4" sha1="727d0b69afd5cf8554164fed3c5029493763be90" /> --> + <!-- <rom name="Sonic CD (USA) (Track 27).bin" size="5828256" crc="af5865e1" sha1="95dcaabe915a52e354e68ee92a2664f8e60cb565" /> --> + <!-- <rom name="Sonic CD (USA) (Track 28).bin" size="2203824" crc="33edcac3" sha1="aa9a82153da07a443c2346724a4dd6b4c0ba18a4" /> --> + <!-- <rom name="Sonic CD (USA) (Track 29).bin" size="6355104" crc="cd01fcf8" sha1="45023e0c8552cf00ed86dc1abc6ed1ac6bb80315" /> --> + <!-- <rom name="Sonic CD (USA) (Track 30).bin" size="6333936" crc="e1ea3bd0" sha1="8b0d2186ea37bc8eb320af1c2d63b385c8f545ff" /> --> + <!-- <rom name="Sonic CD (USA) (Track 31).bin" size="2653056" crc="5f30755a" sha1="1fa01a613efbce61828711053acd9133640cb6ed" /> --> + <!-- <rom name="Sonic CD (USA) (Track 32).bin" size="22078224" crc="5dcc5dda" sha1="094f65315245072aded274f39bb630d29069f94e" /> --> + <!-- <rom name="Sonic CD (USA) (Track 33).bin" size="22428672" crc="a11f6b86" sha1="c020c64766fa04a746dee59de15c8f7bc9e2c0cc" /> --> + <!-- <rom name="Sonic CD (USA) (Track 34).bin" size="16767408" crc="e9296a83" sha1="28dfc3e12994ac0edb8169d2e1ba403f86c08788" /> --> + <!-- <rom name="Sonic CD (USA) (Track 35).bin" size="1448832" crc="f35e374a" sha1="4e6e674b9e98cee38d9c13ebc9b1163a94cae882" /> --> + <!-- <rom name="Sonic CD (USA) (Track 36).bin" size="16003008" crc="6d3342cd" sha1="44db9d6f1e7176e3389fce96c8b138476b9938d4" /> --> + <!-- <rom name="Sonic CD (USA) (Track 37).bin" size="15810144" crc="6e5498b0" sha1="a0aa9b7eaa51416339c5954b3cbd06561a666cbe" /> --> + <!-- <rom name="Sonic CD (USA) (Track 38).bin" size="14782320" crc="6a4752db" sha1="68dbf86f668bbd254be9b922a637eeafc730134a" /> --> + <!-- <rom name="Sonic CD (USA) (Track 39).bin" size="15624336" crc="e9567c41" sha1="f5b39191bb54ac086c3435e42d4cf719a35469d9" /> --> + <!-- <rom name="Sonic CD (USA) (Track 40).bin" size="19356960" crc="82b7324d" sha1="42b58a0e47690e36a13e4ca984c596f840c7f917" /> --> + <!-- <rom name="Sonic CD (USA) (Track 41).bin" size="14937552" crc="7d205133" sha1="ae7a6199463042b8aadf269b5d4fc0f19398a5a5" /> --> + <!-- <rom name="Sonic CD (USA) (Track 42).bin" size="13636896" crc="4a1f4050" sha1="f070c9ac2b541242ad222b0aec248e6fba1b7217" /> --> + <software name="soniccdo1" cloneof="soniccd"> + <description>Sonic CD (USA, 1996 release)</description> + <year>1996</year> + <publisher>Sega / Expert Software</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (usa 1996 release)" sha1="e1c3fca9a192a94b15c758ea11cdd6221759e048" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/2820/ --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt).cue" size="4353" crc="3d7267ac" sha1="108165cc63d2676cdbdcb9cd019fac9a9620b3f1" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 01).bin" size="185725680" crc="14a06afd" sha1="f6a7b4662a4ab5ab05fc8d519ef49f177aa69b8b" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 02).bin" size="1667568" crc="bfc979ab" sha1="8641b38d029c6aeaa37d2f82846f76fd473dcc56" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 03).bin" size="19792080" crc="990d9a2f" sha1="e50a2c4defb57610fe84cff5e0f0013bab04edeb" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 04).bin" size="14692944" crc="3044bb56" sha1="77e811ab2d077d682d11fd08ba99e900cfd9a9b2" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 05).bin" size="15415008" crc="0405bf26" sha1="819d3f1d4c453577123b2f1c512033dc240135c5" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 06).bin" size="18053952" crc="cdc00e3f" sha1="0fa4fddedf3f055492dd684b8d5c40bcb8284b7f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 07).bin" size="14518896" crc="39278078" sha1="971b65de492b66caa8135cfcb93a7b4bd455d9cd" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 08).bin" size="14862288" crc="446626db" sha1="976b4e61b5d7b63b95d6c68352b2dd1433476c6b" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 09).bin" size="20711712" crc="638b2909" sha1="69df6d80fe44cc3b24fcc8ec5c83749f0225b3b8" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 10).bin" size="14511840" crc="eeb1e49f" sha1="605ff49a344f9e4b174b1f8ea35de57c73964964" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 11).bin" size="14161392" crc="0f4f8431" sha1="1319be069c947786da194f578e1e5f2e59d24c75" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 12).bin" size="18578448" crc="9b95efa8" sha1="61f7957b3aae30353b944d68d71f58c4fc3d7ca4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 13).bin" size="14187264" crc="5c3c1083" sha1="bad6c12b949fa8bc0b6d53f74a3d69f5b333627a" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 14).bin" size="11891712" crc="85741e16" sha1="0a983e2d241abf81c0ea741698bf7c515629d38c" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 15).bin" size="16612176" crc="8bc1afd4" sha1="3ab8206c72db2b080c61343b46c6ee4ad6ba3e7f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 16).bin" size="11360160" crc="110c49db" sha1="35ea449ab6eb99ad8a9c20c8f451089edbd74b74" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 17).bin" size="14488320" crc="52ff5c7b" sha1="dface0a17f9462fa520d9d6ca920f70a4b888af0" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 18).bin" size="20709360" crc="855479ac" sha1="5cf271a13bcb26fc596c2ca95524319786303d79" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 19).bin" size="13298208" crc="5a0ee21f" sha1="cdc65b271c2e8ee111e70c9eb65a084b9337eb90" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 20).bin" size="12232752" crc="0b07d865" sha1="9adba6b129d214551bf30b1a466d094f83a550d6" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 21).bin" size="15407952" crc="55dd3f44" sha1="d87968cfecd2841e5913563da54200f8aefe1768" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 22).bin" size="12056352" crc="55dc7933" sha1="f5e71a608757b30fdfb37aa1dd30f9e2b9fcbcbe" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 23).bin" size="13288800" crc="cf109eb5" sha1="69f52e724307d172ea02d8844e8078b65be8c343" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 24).bin" size="14521248" crc="9adc29fa" sha1="b971b17ed6e4881e4887844e17aff94b4cde3c13" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 25).bin" size="15219792" crc="dce74faa" sha1="df8fc36a3391cfaaeb5d07286d213fa7ad52f794" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 26).bin" size="5611872" crc="0bdf26d7" sha1="31968be43391bfd2eed07ce60a08f687a1796c98" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 27).bin" size="5611872" crc="e2f856b8" sha1="25ee20c989108891558e300b4fb76000ae445a7d" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 28).bin" size="2069760" crc="02b222bf" sha1="5825e7b9f0b21e4d76637070e72a2e7d9151cb58" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 29).bin" size="4449984" crc="b49684ea" sha1="0112025f206eda01b29d545d3dfc19355c1e779a" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 30).bin" size="4372368" crc="98056bbd" sha1="f821e46be994bb6f0ec87624bdf300242b9a324f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 31).bin" size="2511936" crc="20e0c5a2" sha1="262826fd0f4167047dbe23470276bba32628b16f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 32).bin" size="21941808" crc="b9d7004e" sha1="aae92fd5d7e6837527e573f7c550180ed9668680" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 33).bin" size="22294608" crc="0f9f71f0" sha1="db6f660edb2482307a32eb2984cbf11e99b0ea05" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 34).bin" size="16633344" crc="4588d9eb" sha1="2903a44815cf8200ef377748010e85072d47b266" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 35).bin" size="32156544" crc="f35c5785" sha1="c6e91176e608ebb322410621a351323b57d8fa48" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 36).bin" size="15866592" crc="cfbe7e4f" sha1="136b587c03d9df9e75a1f1c0f36ed4bf57838364" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 37).bin" size="15676080" crc="05ba1957" sha1="7cd7eaa2c17f9ba31874c3d7ab81b6257a4b5a2c" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 38).bin" size="14648256" crc="3119cfeb" sha1="b75c1ed7bfe1640bd0ab8036f4cb17456b37e7a8" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 39).bin" size="15490272" crc="335dd050" sha1="d8560ed3c3b9b539700a9af7730205967cf4a9b9" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 40).bin" size="19220544" crc="c857b14a" sha1="4be2e5ac9abb99020f29f9948fd4b3f9c7df9a4b" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 41).bin" size="14803488" crc="b04fb2af" sha1="e94120542ffcc36f75ecd9dd43bfd630d9b14485" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Alt) (Track 42).bin" size="13855632" crc="36c99a26" sha1="28ab24400f850db254b435ec88320c2e4a917da9" /> --> + <software name="soniccdoem" cloneof="soniccd"> + <description>Sonic CD (USA, Pentium Processor Edition)</description> + <year>1996</year> <!-- Date on CD is 1995-12-28, but very likely this released in 1996 --> + <publisher>Sega / Intel</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (pentium processor edition)" sha1="5682e9c4b629e423ac310867df61345d9126d45b" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/38428/ --> + <!-- <rom name="Sonic CD (USA) (OEM).cue" size="5233" crc="ed8845c6" sha1="f59542a56618bc6164cee1de7dac5548ccd977d0" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 01).bin" size="185713920" crc="76a4f899" sha1="4e7a3cd6881c52dd25f38667413b04185a5735ff" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 02).bin" size="1495872" crc="0dc4147b" sha1="cdfe2345099c3f7d1cbc5bcb5e33c53dd3356cd4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 03).bin" size="19792080" crc="92007c35" sha1="ff4e77efd211098f12529077f873807481c6b7ac" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 04).bin" size="14692944" crc="c75fed10" sha1="22c0112c7d50146f63e2fe9dac8b5f228575eca0" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 05).bin" size="15415008" crc="e4ed4598" sha1="7c2caf3a9dd760291345302eafb85f604bc93b82" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 06).bin" size="18053952" crc="5411ef88" sha1="0f59d6c0b136e863496f75eea01a4d815b9e71f9" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 07).bin" size="14518896" crc="06888cb8" sha1="208d62525220f17ce23ff30df187adec71df0420" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 08).bin" size="14862288" crc="d03e1290" sha1="b8af9fd527255edfd4819a4611ecb3e668c06b37" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 09).bin" size="20714064" crc="c62f61f2" sha1="794e402385965e4b4a6adddb4bc09b9f6ebc2102" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 10).bin" size="14509488" crc="6a4a5673" sha1="438befd05f69d82cbf7479e010446d940c9970be" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 11).bin" size="14161392" crc="1d7010c9" sha1="ca72fdbf941184cc85eb0d5cba9a3aa0577cb906" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 12).bin" size="18578448" crc="6f6c3021" sha1="733dd0e047afbce44fead34087342dcc6759daf3" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 13).bin" size="14187264" crc="807562e7" sha1="917120838554d00ec1cde751a0c329ac3a6f48ab" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 14).bin" size="11891712" crc="601d4106" sha1="f5900724ad093e824c32915539101f18ae38dcbd" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 15).bin" size="16612176" crc="30c4d94f" sha1="6c07986b8042cb1a1e38d0311690f5b275ce6bc2" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 16).bin" size="11360160" crc="7dae6a5a" sha1="4bca5936004fc1f9d17dd7e91e9b21a22b044b0c" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 17).bin" size="14488320" crc="8c472015" sha1="fadf27d793bdf908529e0da3db6ab998d4577060" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 18).bin" size="20709360" crc="35cdf8d0" sha1="f137c939daefa5e1eb10974bd038981bf39e23f9" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 19).bin" size="13298208" crc="fe8cebaf" sha1="59277763110e8565a491cc045b09cd3c27abd932" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 20).bin" size="12232752" crc="a309aab0" sha1="33108c93958f4bf768b89078a0ecbf250fc71c69" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 21).bin" size="15407952" crc="244b2699" sha1="2cd7e5ee8f5011a03f7bba055af035ea36a444a4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 22).bin" size="12056352" crc="fe282ba4" sha1="7655fc82211c25d70dda0853fc518950161327ce" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 23).bin" size="13288800" crc="30a43c51" sha1="527314d2108d350b295e115ecfab1da3b445d144" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 24).bin" size="14521248" crc="faf4c29d" sha1="b6ec28d413a3db6871c924e36d9bed78d747ab28" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 25).bin" size="15219792" crc="a76ba05c" sha1="e06d39decf2238f302852621d7a9907192e40fac" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 26).bin" size="5611872" crc="369fea33" sha1="7e3954f64c8f2c4c51cb3ef274ceacdc47dce809" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 27).bin" size="5611872" crc="1365b6f4" sha1="df0706106208c50002a7b87fe18aa46151784074" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 28).bin" size="2069760" crc="fa87cbcf" sha1="8762691279fdb59a68972cc14831955d1c0e6a0d" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 29).bin" size="4449984" crc="bc9defbc" sha1="4bb604e3f22ffbb5d06a651c2880b0e60ac1ddb8" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 30).bin" size="4372368" crc="9ef70b1b" sha1="4b5c667c433f1ea4f9b6a30a969dc47bb9acb458" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 31).bin" size="2511936" crc="a6006a11" sha1="fbcecd3ed6b3ab7dd88c7c02c1029b6c1311edd4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 32).bin" size="21941808" crc="12a48522" sha1="12f9d94c2c7f723a3a296f9d8dbcf2e7cb6f93cd" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 33).bin" size="22294608" crc="1b0af6ee" sha1="72adefd182a5c217118ca9a97733fecfa0611280" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 34).bin" size="16633344" crc="b85fa030" sha1="9a3f57daea7d34a97824d8be85eac5e8e30158e4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 35).bin" size="32156544" crc="6cf32bf6" sha1="9d7a8a8fe70693d684a060d80d1e09635ead4f28" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 36).bin" size="15866592" crc="d00f350b" sha1="b3a77e28eb0d0a5bd0a4aa55201f3b6c3d73e4da" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 37).bin" size="15676080" crc="06bf65ff" sha1="cf6e6693a6758775ec1befd9a0fa0f3cad1e6f1e" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 38).bin" size="14648256" crc="922a82e2" sha1="fb7c584c1492c62fee6170360b4c644ff38f3ed1" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 39).bin" size="15490272" crc="4d5766d5" sha1="2f1b25c9014229a2eff4dc01c1c057862d130779" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 40).bin" size="19220544" crc="5d8ef82c" sha1="29cd3368b2ecb96070732448d15fd55befb347dc" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 41).bin" size="14803488" crc="fde56203" sha1="d4623261ca0c8eeab6aa1e8a7a1ffd091482d125" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (Track 42).bin" size="13498128" crc="e4cbd243" sha1="cc517df4479946828c9a6fc6e9bb956f9a83821a" /> --> + <software name="soniccdoem1" cloneof="soniccd"> + <description>Sonic CD (USA, Pentium Processor Edition alt)</description> + <year>1995</year> + <publisher>Sega / Intel</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (pentium processor edition alt)" sha1="4cd719c7f16d21316d7d798606f8e621814e48c4" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/36027/ --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01).cue" size="4123" crc="08c5b1b8" sha1="e4522615e58c1f120bbf3abc5d5e6a93f52f8924" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 01).bin" size="185728032" crc="d3a79c87" sha1="0ff28e88e5fec2f55e1f50eddb2e512ae5a8b305" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 02).bin" size="1665216" crc="304247e1" sha1="4e5f31ae82c5e6d096d3a3494fd489f1bfd44e22" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 03).bin" size="19792080" crc="7a93d47e" sha1="d2a1603970776cd492c33f656f7814c87774d38e" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 04).bin" size="14692944" crc="a8e29ede" sha1="672771d87871f5d805124efa65e18700ab273e13" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 05).bin" size="15415008" crc="795bfa70" sha1="432c2c81df252e9761119c83882daff2309f8cce" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 06).bin" size="18053952" crc="0adeac6b" sha1="4616304a0f40d334d3129245e943f5a761a267c0" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 07).bin" size="14518896" crc="04effb03" sha1="3697191da97f679470ddfba20ffba62af1764769" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 08).bin" size="14862288" crc="afc02f9b" sha1="e92ac01826200941ddde9b66ba85692aeb3a398e" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 09).bin" size="20711712" crc="603f150d" sha1="e79ad780424c785c98282404bd2163fb482584b2" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 10).bin" size="14511840" crc="7f0cfa03" sha1="b3cecc63f0676eebd6316abdeaadbea0c6f33fb2" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 11).bin" size="14161392" crc="fe8115cf" sha1="ecf43ca3ede412d22739b98f3e592c2ef4454585" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 12).bin" size="18578448" crc="0e89f6c4" sha1="e9283f71b16c91cd3d4096e37d1c7a0ad95163fe" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 13).bin" size="14187264" crc="54a941e0" sha1="62a0be1b712528787ca29c255e7642c55cc28d4f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 14).bin" size="11891712" crc="bb03bf87" sha1="3169e50af9f9ffcafdb33f5b01dd1b04817bfccf" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 15).bin" size="16612176" crc="58bbae49" sha1="c7c92059956b988021184584b5dd8ce3db275b54" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 16).bin" size="11360160" crc="5efcc4f5" sha1="0c3396c00d3305779ae3a023001044a8f4f959c5" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 17).bin" size="14488320" crc="8fb3dd1f" sha1="217193b3c661b1f45d0ccb1e23e1f3300c4b3c7f" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 18).bin" size="20709360" crc="4a765d01" sha1="0e1a92b4a670c3ffb86999e1df256888748b3c05" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 19).bin" size="13298208" crc="9d9d68de" sha1="3a8f6c5bf42225d480066a7cf7cef46f0725c9b6" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 20).bin" size="12232752" crc="83f767d2" sha1="30206677fe4e43b82c923627fc1aea1c29a57653" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 21).bin" size="15407952" crc="97d60e1c" sha1="6902eb07e9819fa352a3872b046066e1a2f080dc" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 22).bin" size="12056352" crc="45a4ed4f" sha1="33a547e78a3957699e2cebccbd0afd43c81403c7" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 23).bin" size="13288800" crc="89a9fe62" sha1="d6d99d3def87953c8f8acfd642f917b46ceae09a" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 24).bin" size="14521248" crc="ef4f8ca7" sha1="220c67496c7973c943d39ca7bac7d5bec6a8b9a4" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 25).bin" size="15219792" crc="070f497b" sha1="11fb423cb587909898b00b0b8ed4a7251990c3f7" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 26).bin" size="5611872" crc="3b1b92e1" sha1="06c29655fbbdf9634d3e24f1031f090f2daaf171" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 27).bin" size="5611872" crc="3cde4865" sha1="7e28650aa0801ab90cbcd0edabbb035156a4b24d" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 28).bin" size="2069760" crc="2d0672b3" sha1="417a6ff18ff925a9d25f18037ba29f1b53600bc5" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 29).bin" size="4449984" crc="5db9e4b4" sha1="e6842da14a0176029312f8366643825307769c4e" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 30).bin" size="4372368" crc="649b922d" sha1="82dbfa9683417f2a9a29294bb09554409ee1e21e" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 31).bin" size="2511936" crc="def61de0" sha1="f02c79081d9f5cc09244ffcd31ad130b92d17205" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 32).bin" size="21941808" crc="83e51eb5" sha1="f19ea7f16c8bee5a89ea95a215cae205aec6e56b" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 33).bin" size="22294608" crc="d1eb8136" sha1="cdcf66f8343641721bc45a4e16569ba8d8c0e806" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 34).bin" size="16633344" crc="46f3e8f2" sha1="c5d1bbf67cf8fc90bec2e89e4971504e1a51f72c" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 35).bin" size="32156544" crc="d2cc0de8" sha1="f8c7bf8189e9de9bd3ea162204f06d9ab8488e16" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 36).bin" size="15866592" crc="c911c49c" sha1="b31d9d4ebff83fc233b8e529a0c2af80511c5122" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 37).bin" size="15676080" crc="c3f4da85" sha1="085ef3811336724fef6bc87bd0177fe9b0a2df7a" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 38).bin" size="14648256" crc="d43d0968" sha1="4a9d6f110e6b714a139751dab0cc4cb0dd4369a8" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 39).bin" size="15490272" crc="0bed044e" sha1="bafffccb37960a56aa506d5d33d98bfaf0c64c71" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 40).bin" size="19220544" crc="a747ffee" sha1="f7d4ba40870a36cf1fc0e37d7d5015cd629c9f5d" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 41).bin" size="14803488" crc="0f8221a1" sha1="9f48782db81c79d2874773fa47eb4522079866fc" /> --> + <!-- <rom name="Sonic CD (USA) (OEM) (v1.01) (Track 42).bin" size="13502832" crc="8630a19a" sha1="94dceeef603fcfeb3486c6cfcfb7c25077981525" /> --> + <software name="soniccdoem2" cloneof="soniccd"> + <description>Sonic CD (USA, Packard Bell)</description> + <year>1996</year> <!-- Date on CD is 1995-12-28, but very likely this released in 1996 --> + <publisher>Sega / Packard Bell</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (packard bell)" sha1="046bb546be4f42c9871ffb351aee064b4ac240ac" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/47718/ --> + <!-- <rom name="Sonic CD (Europe) (Alt).cue" size="3913" crc="95c53b23" sha1="c1ff9d0dfe83637666ee0a28a5ab6215761b2b12" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 01).bin" size="202911744" crc="4b3e0035" sha1="706ef60744eb2505c6ebb23c149dd7ce3f9d8f0e" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 02).bin" size="1801632" crc="afd1aebc" sha1="e39634034abbef489d1e8db515e447855945c6ee" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 03).bin" size="19970832" crc="dc08a965" sha1="ee812028401b3d8175adc90b4b0fdfc322c6e939" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 04).bin" size="14829360" crc="222340fa" sha1="03167c4e119f3dcd386c709985399afc35bf8798" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 05).bin" size="15551424" crc="dd616b5b" sha1="f56733bd627db53694caeaf9d93ca8aae1f51b85" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 06).bin" size="18185664" crc="7d66ca1d" sha1="4ccd03488c96dbd98cb48e1d589b010985cacde1" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 07).bin" size="14657664" crc="e67aa5f4" sha1="df041d31d5707fcfc7f3de81883bc365c3e4df9f" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 08).bin" size="15001056" crc="681de6e1" sha1="9c30a8edc5a51e55209bfc2d001a8af7788f86ba" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 09).bin" size="20848128" crc="9f847186" sha1="6429391356801e68886cf0db2824fd8611e7ed0e" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 10).bin" size="14650608" crc="16162234" sha1="f93674c2f97a6268ebcc3a6db995b0515737dbd6" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 11).bin" size="14302512" crc="20fa1a48" sha1="e6b18e4f5b702f13ec9ad115f77a561af107ffcd" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 12).bin" size="18712512" crc="ee385ddc" sha1="1ed2d19a943a0f113958ba29f7a9b1eaad9c5005" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 13).bin" size="14370720" crc="48f8b1f7" sha1="d26b772ca3f54e212464ef5b3d0946480426fe9c" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 14).bin" size="12028128" crc="fb44ea07" sha1="b2b74c071ca1a9089c8d9dafaf0f5fa66356043c" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 15).bin" size="16769760" crc="31327051" sha1="1ccc49002eb73e1c5a0459beeeefa0d8ea743043" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 16).bin" size="11494224" crc="c297c7cb" sha1="6639e3508ce191e2c4962a4cef425fd9c81f627b" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 17).bin" size="14660016" crc="a78c677a" sha1="e2ed7d0ccaf22482a0f4dc413f46dc6833d4a853" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 18).bin" size="20843424" crc="5316130a" sha1="ed678ba465c52b386df420d37e5ca377f328141b" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 19).bin" size="13434624" crc="9f5e7a71" sha1="7e1f6c7bf732e04c2841ad1a302e180dd00f0f1a" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 20).bin" size="12366816" crc="7ab3b7a3" sha1="b10624a2b826092bad02119114d4d93f62b0df2e" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 21).bin" size="15544368" crc="a1e58b6d" sha1="7774b73347aa96c88666af6f2656fa166e59ba63" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 22).bin" size="12192768" crc="1c31dacd" sha1="b4d5659ca5a160c8abebb95c0e4135183762c3c3" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 23).bin" size="13425216" crc="a69d013a" sha1="1add2371bf5411c2a2d85ce452f20e13fdb277fd" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 24).bin" size="14655312" crc="b50fa82c" sha1="c3f237926681c8ccc2757c5561f6d4d0c35f5245" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 25).bin" size="15353856" crc="6b2774ad" sha1="1757caf632c89b61cc79666cbb7126702e414956" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 26).bin" size="5828256" crc="91db8f35" sha1="03b29863a649a38899a27e1238eec0ed00a777b7" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 27).bin" size="5828256" crc="4bd51c05" sha1="698d69ff8a9039acff5337b9a6cfb0f48d70fee0" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 28).bin" size="2203824" crc="57f075ac" sha1="298e2f3b5b3cce7c50d1c1cdad09bb1e3cf18a50" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 29).bin" size="6355104" crc="b482b3fd" sha1="29804905f80e68cb9f8709cd275517f4db68a545" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 30).bin" size="6333936" crc="02d1a9d4" sha1="dd460276143901b5911a34aadb1fe481e2c1c89c" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 31).bin" size="2653056" crc="3ceaf5ab" sha1="a46a953e80713775d2730ccb267e0de1e54e8c2f" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 32).bin" size="22078224" crc="247efa19" sha1="3ab2c7188d842d1a00c9bc11daa762931c657b46" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 33).bin" size="22428672" crc="22a47973" sha1="cc7c5529ebfdc4176f83dfb164442e25634e40d2" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 34).bin" size="16767408" crc="6aba8c63" sha1="682fe4acb202d77df80e96c38b48977323cd1f74" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 35).bin" size="1448832" crc="07f4d794" sha1="d4357d92ebbcfd8405195743c24e51a716663945" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 36).bin" size="16003008" crc="9d3103e7" sha1="2159f2e4ec571d5a7947c07274c320694bcd7796" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 37).bin" size="15810144" crc="fba72bc0" sha1="1399273ec1524e4d11f3921b7b273ae183ca8d54" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 38).bin" size="14782320" crc="bbe7f8d1" sha1="704b56eaaa72252642e861d8e623d3ce1efa5f5c" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 39).bin" size="15624336" crc="69ea62df" sha1="be317d77d9a44d153deee7f966fc8c86d554a555" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 40).bin" size="19356960" crc="afc1fe67" sha1="b0c290aee25fd432a68c94a6e3c388db6b2f4d91" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 41).bin" size="14937552" crc="d6f5face" sha1="c065bf9cc471a8e28a02e457023256d132cdd446" /> --> + <!-- <rom name="Sonic CD (Europe) (Alt) (Track 42).bin" size="13636896" crc="c212d279" sha1="4e8cd03b05406c1adb7490f5984498a00267e305" /> --> + <software name="soniccde" cloneof="soniccd"> + <description>Sonic CD (Europe)</description> + <year>1996</year> + <publisher>Sega / Expert Software</publisher> + <info name="language" value="English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (europe)" sha1="74414fef89e25d6187e09bce7256e783bae76beb" /> + </diskarea> + </part> + </software> + + <!-- Source: http://redump.org/disc/62356/ --> + <!-- <rom name="Sonic CD (China) (Rerelease).cue" size="4981" crc="4b6fd759" sha1="9eaf1e1e6662e70399a5ddcb2bbef5c52eca2208" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 01).bin" size="218307936" crc="c23e7d1c" sha1="0584a6bd6086fab14426792d3a3233585282c0ce" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 02).bin" size="1982736" crc="e4443c10" sha1="c32f98e65193a9cb4ea7b95bf0742698b3bd3ab3" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 03).bin" size="16805040" crc="f23a330d" sha1="4c2e29f399827866447bc3fbe640fa00336e3d60" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 04).bin" size="15186864" crc="5d9be717" sha1="57b3989ffb92b77d2e92d0a349a3ce197bd8d3ff" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 05).bin" size="15908928" crc="aa89d4d6" sha1="e0641276ed1d6d1e243dd5d1fbd18a2fb591b070" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 06).bin" size="18543168" crc="7672c3a0" sha1="67d7dc3e5027b25e6dc3f9b377ed42ac652531c5" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 07).bin" size="15015168" crc="2386f03a" sha1="429f657a6b7b3c6c543fe549879979d0b680cfb9" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 08).bin" size="15358560" crc="1bce4c29" sha1="2170942d953f087751e32dd3f1c24ec8ef2d8dd9" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 09).bin" size="21205632" crc="02d477b0" sha1="d891cc6bd0c48843c5c13721b6385a2e3011e28a" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 10).bin" size="15008112" crc="2b750a3a" sha1="e24a6fc1c7b81b94a8a6bf6b501fb5831284e676" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 11).bin" size="14660016" crc="ccc49ab7" sha1="be07ce492b5dea166804a4eed4b7764e0def3cbf" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 12).bin" size="19070016" crc="22c69dbd" sha1="061c36871f636f854d98d032e7a50a8d57a6af3f" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 13).bin" size="14728224" crc="d7955d3f" sha1="82d90bc6ff83a07f9e2ae770374788a683d67880" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 14).bin" size="12385632" crc="3daf862e" sha1="70e7de4a6ef7f6f31745f297075f38b468775458" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 15).bin" size="17127264" crc="1e6ce764" sha1="8f0d764849df6239e5b13aad86579d442b51b546" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 16).bin" size="11851728" crc="aa245cb3" sha1="99e5905a8722f0afd33db5f9b49cbabc9e1faf39" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 17).bin" size="15017520" crc="2a9756fc" sha1="b6b42f0ce5e0fde8698ee0d00a7761279016d9ce" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 18).bin" size="21200928" crc="ef7c9403" sha1="9a27ca3d6a9e81172786be974104b7a4ae027351" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 19).bin" size="13792128" crc="f24e5d08" sha1="7727be36089fb20ed20e9e8018f6ad6f82a99983" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 20).bin" size="12724320" crc="a1d61859" sha1="4c04c8f1c1b3b742f6dcb2b4c83a9463f1f2e968" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 21).bin" size="15901872" crc="d9d0688e" sha1="64ab8c8f35e2e6e865bf1e8f04d8dafee8f14454" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 22).bin" size="12550272" crc="6cacaa70" sha1="76e381393c66d4777059999f07083d099b158a05" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 23).bin" size="13782720" crc="f6f095f3" sha1="da5049cf9d455ea4c4acbe44e5d74bc1a7ce7333" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 24).bin" size="15012816" crc="670e0384" sha1="522bf286bc7299faa7e70255fa9e51bd42780632" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 25).bin" size="15711360" crc="ec2aa329" sha1="24a5dca94839df6bae9d7e1f2bf1fd074589e6bd" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 26).bin" size="6185760" crc="f6a6a7bd" sha1="f97ccb2c3d3919c159896931d09fbb1483089c6b" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 27).bin" size="6185760" crc="48355ae2" sha1="a1ab3e8c5c4c20cca18843574c8769a7b87cc386" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 28).bin" size="2561328" crc="b2b138d1" sha1="cd85ff4a73abe4ecb8967f13456afe0fd46972e5" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 29).bin" size="6712608" crc="0b3ec447" sha1="dbbe5fef644b8697380de378af8cd29a62a20f04" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 30).bin" size="6691440" crc="825f4cea" sha1="4340d217d43870880b4a78143525086477567c90" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 31).bin" size="3010560" crc="767423cc" sha1="b57d9bea099a11a3aca207e1b08661075314f86b" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 32).bin" size="22435728" crc="c20b1e27" sha1="a2ca4dd412554debf79d924dc5519ada943da09f" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 33).bin" size="22786176" crc="2fef1244" sha1="3fe30f1884528ff1e5eea667d7fd1b9bc8c464ed" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 34).bin" size="17124912" crc="f774eb11" sha1="7738dadd27c3f829737662327962ac561f421930" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 35).bin" size="1806336" crc="f743e15e" sha1="3352378655b4fc382b8b47c822e4f1f768df3e7b" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 36).bin" size="2072112" crc="917c2094" sha1="e5b6ba4da6772625fb3a9ad909b2f824e1a068d8" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 37).bin" size="16167648" crc="614d28ce" sha1="49ab3b7dfc49563c4d133b2549f6a9fc6f4afc35" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 38).bin" size="15139824" crc="84253d70" sha1="7e5d115ed78deebbe7b32257cd82de49cd9c54e3" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 39).bin" size="15981840" crc="912b8f21" sha1="23963e4b41275e0b56cf7621632e4f6b6d7be760" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 40).bin" size="19714464" crc="ae513d33" sha1="684d728c2c3006d04d1ade734421307a332b7e0b" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 41).bin" size="15295056" crc="08592d43" sha1="4557d702900b35982881892f980f7684bc6a1b1f" /> --> + <!-- <rom name="Sonic CD (China) (Rerelease) (Track 42).bin" size="13634544" crc="fcf2356b" sha1="520bbdce51114a163117980e0f87aa1af33c40aa" /> --> + <software name="soniccdzh" cloneof="soniccd"> + <description>Sonic CD (China)</description> + <year>2001</year> + <publisher>Sega / Expert Software</publisher> + <notes><![CDATA[ + Autorun fails to launch on Windows 95, but setup.exe and the game work. + ]]></notes> + <info name="alt_title" value="索尼克CD" /> + <info name="language" value="Chinese/English" /> + <part name="cdrom" interface="cdrom"> + <diskarea name="cdrom"> + <disk name="sonic cd (china)" sha1="14aba3162a0ed8c734c7713a1986f80aa58c6e47" /> + </diskarea> + </part> + </software> + <!-- Windows 3.1 / 95 --> <software name="spaceinv" supported="yes"> <description>Space Invaders for Windows</description> diff --git a/hash/microvision.xml b/hash/microvision.xml index 914aad3f7b8..50d6ad200e5 100644 --- a/hash/microvision.xml +++ b/hash/microvision.xml @@ -258,7 +258,7 @@ The "butmask" feature indicates cartridge button restrict mask (active-low) <software name="microbrd"> <description>MicroBird</description> <year>2018</year> - <publisher>Ayza</publisher> + <publisher>azya</publisher> <part name="cart" interface="microvision_cart"> <feature name="clock" value="3000000" /> <feature name="paddle" value="0" /> @@ -271,7 +271,7 @@ The "butmask" feature indicates cartridge button restrict mask (active-low) <software name="tetris"> <description>Tetris (TMS1100 version)</description> <year>2019</year> - <publisher>Ayza</publisher> + <publisher>azya</publisher> <part name="cart" interface="microvision_cart"> <feature name="clock" value="500000" /> <feature name="pla" value="1" /> @@ -285,7 +285,7 @@ The "butmask" feature indicates cartridge button restrict mask (active-low) <software name="tetriso" cloneof="tetris"> <description>Tetris (8021 version)</description> <year>2018</year> - <publisher>Ayza</publisher> + <publisher>azya</publisher> <part name="cart" interface="microvision_cart"> <feature name="clock" value="3000000" /> <feature name="paddle" value="0" /> diff --git a/hash/psx.xml b/hash/psx.xml index 07265667d80..d2fb19ee6dd 100644 --- a/hash/psx.xml +++ b/hash/psx.xml @@ -48,38 +48,59 @@ For an overview of US PS1 discs that have not been dumped and added to redump's </part> </software> - <!-- boot OK --> <software name="007tnd"> <!-- - Original images (Redump) + redump.org/disc/830 <rom name="007 - Tomorrow Never Dies (USA).cue" size="97" crc="dc22c9e3" sha1="55b145bd5563c4b62cf3fadeda704340824c7b55"/> <rom name="007 - Tomorrow Never Dies (USA).bin" size="573594000" crc="02f976df" sha1="5c635e990dc77c481eb177dc86deb7a198f17cf8"/> --> <description>007 - Tomorrow Never Dies (USA)</description> <year>1999</year> <publisher>Electronic Arts</publisher> + <info name="language" value="English" /> <info name="serial" value="SLUS-00975, SLUS-00975CE, SLUS-00975GH"/> <sharedfeat name="compatibility" value="NTSC-U"/> <part name="cdrom" interface="psx_cdrom"> <diskarea name="cdrom"> - <disk name="007 - tomorrow never dies (usa)" sha1="f48f0e79572be7d676341fb9f6cb0ccb5a31e0d9"/> + <disk name="007 - Tomorrow Never Dies (USA)" sha1="603abd8d718ddb72cf34a0d8eece062c03463dc5"/> </diskarea> </part> </software> <software name="007twine"> - <!-- Original images (Redump) + <!-- + redump.org/disc/2387 <rom name="007 - The World Is Not Enough (USA).cue" size="101" crc="adc163bd" sha1="1e4a0731b245ab3419a5e0f23cb1001e1f1e7613"/> <rom name="007 - The World Is Not Enough (USA).bin" size="726429312" crc="6e91b75f" sha1="0d6f886485318959b9a86209a91228840b61fbad"/> --> <description>007 - The World Is Not Enough (USA)</description> <year>2000</year> <publisher>Electronic Arts</publisher> + <info name="language" value="English" /> <info name="serial" value="SLUS-01272, SLUS-01272GH"/> <sharedfeat name="compatibility" value="NTSC-U"/> <part name="cdrom" interface="psx_cdrom"> <diskarea name="cdrom"> - <disk name="007 - the world is not enough (usa)" sha1="d79f4b8ce9db7c5dacd841e7d7ebbb306f88de70"/> + <disk name="007 - The World Is Not Enough (USA)" sha1="3af01c1f0a584751d161dc2c102639cd8c892ea9"/> + </diskarea> + </part> + </software> + + <software name="007twine_p" cloneof="007twine"> + <!-- + redump.org/disc/59807 + <rom name="007 - The World Is Not Enough (USA) (Beta) (2000-08-26).cue" size="121" crc="503a4cf6" sha1="79cf7463d72934e8887c3d9977bb384858588dae"/> + <rom name="007 - The World Is Not Enough (USA) (Beta) (2000-08-26).bin" size="750278592" crc="a709d8bd" sha1="edb14c9b988cf2a6052c9f770a0190077bd7de8e"/> + --> + <description>007 - The World Is Not Enough (USA, prototype 20000826)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="English" /> + <info name="serial" value="SLUS-00978"/> + <sharedfeat name="compatibility" value="NTSC-U"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - The World Is Not Enough (USA) (Beta) (2000-08-26)" sha1="385715ee6e34fa375a25582b9f3ebf03f46a1418"/> </diskarea> </part> </software> @@ -37207,6 +37228,27 @@ The entries in this section are intended to replace the existing "low-grade" Jap --> + <software name="007tnd_jp" cloneof="007tnd"> + <!-- + redump.org/disc/20884 + <rom name="007 - Tomorrow Never Dies (Japan).cue" size="99" crc="424cea74" sha1="a87f7a645cb57ae467656682773ea1e7a926adec"/> + <rom name="007 - Tomorrow Never Dies (Japan).bin" size="564764592" crc="da5649d7" sha1="b189c39cde5e35cd1d4f20c912de4aa0e2fc5897"/> + --> + <description>007 - Tomorrow Never Dies (Japan)</description> + <year>2000</year> + <publisher>Electronic Arts Square</publisher> + <info name="alt_title" value="007 ~トゥモロー・ネバー・ダイ~"/> + <info name="language" value="Japanese" /> + <info name="release" value="20000210" /> + <info name="serial" value="SLPS-02604" /> + <sharedfeat name="compatibility" value="NTSC-J"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Tomorrow Never Dies (Japan)" sha1="7ee3f0181a623f760884417eadd070a02b59d605"/> + </diskarea> + </part> + </software> + <!-- http://redump.org/disc/38429/ http://redump.org/disc/38430/ --> <software name="crshock"> <description>Creature Shock (Japan)</description> @@ -37494,27 +37536,6 @@ The entries in this section are intended to replace the existing "low-grade" Jap They should be replaced with better quality images once said images are available (and verified to be the same versions) --> - <!-- boot OK --> - <software name="007tndj" cloneof="007tnd"> - <!-- - Unknown source - <rom name="007 - Tomorrow Never Dies (Japan) [SLPS-02604].bin" size="564764592" crc="e8376955" sha1="516e6098930268494fd32038c49a07ed5feac3d4"/> - <rom name="007 - Tomorrow Never Dies (Japan) [SLPS-02604].cue" size="110" crc="f85b1630" sha1="f4be16a5d138e75d6b0635d5fc48aad290710fc3"/> - --> - <description>007 - Tomorrow Never Dies (Japan)</description> - <year>2000</year> - <publisher>Electronic Arts Square</publisher> - <info name="serial" value="SLPS-02604" /> - <info name="release" value="20000210" /> - <info name="alt_title" value="007 ~トゥモロー・ネバー・ダイ~"/> - <sharedfeat name="compatibility" value="NTSC-J"/> - <part name="cdrom" interface="psx_cdrom"> - <diskarea name="cdrom"> - <disk name="007 - tomorrow never dies (japan) [slps-02604]" sha1="966f52044cad485c3adab30e27683fc5f2e78c89" status="baddump"/> - </diskarea> - </part> - </software> - <!-- boot OK, a sound note seems stuck (btanb?) --> <software name="10101wil"> <!-- @@ -59450,6 +59471,159 @@ The entries in this section are intended to replace the existing "low-grade" Jap <!-- Redump PAL (Europe) --> + <software name="007tnd_eu" cloneof="007tnd"> + <!-- + redump.org/disc/967 + <rom name="007 - Tomorrow Never Dies (Europe).cue" size="100" crc="765606dd" sha1="fd5f043ce416db55a16a72ea4cd7b408aef20f2f"/> + <rom name="007 - Tomorrow Never Dies (Europe).bin" size="572408592" crc="763e4df9" sha1="c7022a564fa7d839f6a84c09c2ec47c96778b7c8"/> + --> + <description>007 - Tomorrow Never Dies (Europe)</description> + <year>1999</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="English" /> + <info name="serial" value="SLES-01324, SLES-01324-T, SLES-01324/P"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Tomorrow Never Dies (Europe)" sha1="0d341a0e7b704eaa1d44d4450666c4a8a95ce158"/> + </diskarea> + </part> + </software> + + <software name="007tnd_fr" cloneof="007tnd"> + <!-- + redump.org/disc/13398 + <rom name="007 - Demain ne Meurt Jamais (France).cue" size="103" crc="804de764" sha1="079196f7c1bce6e74a32db7185aa889cd40f634f"/> + <rom name="007 - Demain ne Meurt Jamais (France).bin" size="570611664" crc="20d12f7b" sha1="077bddb3f832e3f2ec660634cd37b50f0d927eb9"/> + --> + <description>007 - Demain ne Meurt Jamais (France)</description> + <year>1999</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="French" /> + <info name="serial" value="SLES-02375, SLES-02375-P"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Demain ne Meurt Jamais (France)" sha1="93e62f8c5d1fcbb32aceda03f6b319df2a238b5a"/> + </diskarea> + </part> + </software> + + <software name="007tnd_de" cloneof="007tnd"> + <!-- + redump.org/disc/4003 + <rom name="007 - Die Welt Ist Nicht Genug (Germany).cue" size="106" crc="4a7ed159" sha1="79eb3b595147b7b1058162d3aa126355a15e448e"/> + <rom name="007 - Die Welt Ist Nicht Genug (Germany).bin" size="724728816" crc="40fb0330" sha1="109bb1cb7e7fc9c9305d85a42d19c17bf467060d"/> + --> + <description>007 - Der Morgen Stirbt Nie (Germany)</description> + <year>1999</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="German" /> + <info name="serial" value="SLES-02376, SLES-02376-T"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Der Morgen Stirbt Nie (Germany)" sha1="18f50fbfc857c874c4a89a3689b99ea870f20d54"/> + </diskarea> + </part> + </software> + + <software name="007twine_eu" cloneof="007twine"> + <!-- + redump.org/disc/968 + <rom name="007 - The World Is Not Enough (Europe).cue" size="104" crc="7d9fe2b7" sha1="b46ef39f671f819d7077d38b401d251ebbb208fd"/> + <rom name="007 - The World Is Not Enough (Europe).bin" size="727292496" crc="8df63204" sha1="9062140eb4952b3addd0197cb6202723032117f7"/> + --> + <description>007 - The World Is Not Enough (Europe)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="English" /> + <info name="serial" value="SLES-03134, SLES-03134-T"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - The World Is Not Enough (Europe)" sha1="9626cffce3e2713aa9bbc3e2c07d1cc1b95c9831"/> + </diskarea> + </part> + </software> + + <software name="007twine_fr" cloneof="007twine"> + <!-- + redump.org/disc/28132 + <rom name="007 - Le Monde ne Suffit Pas (France).cue" size="103" crc="b7873d96" sha1="ff26ea5b4c4a840afbdc90123686a3012494b9d8"/> + <rom name="007 - Le Monde ne Suffit Pas (France).bin" size="727325424" crc="c2d1c87a" sha1="183815d71895adf29c7111ea9ac57ebdc4df7333"/> + --> + <description>007 - Le Monde ne Suffit Pas (France)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="French" /> + <info name="serial" value="SLES-03135"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Le Monde ne Suffit Pas (France)" sha1="c6725b155f2ac290d80a7e99fee18147c79e17b4"/> + </diskarea> + </part> + </software> + + <software name="007twine_de" cloneof="007twine"> + <!-- + redump.org/disc/3271 + <rom name="007 - Die Welt Ist Nicht Genug (Germany).cue" size="106" crc="4a7ed159" sha1="79eb3b595147b7b1058162d3aa126355a15e448e"/> + <rom name="007 - Die Welt Ist Nicht Genug (Germany).bin" size="724728816" crc="40fb0330" sha1="109bb1cb7e7fc9c9305d85a42d19c17bf467060d"/> + --> + <description>007 - Die Welt Ist Nicht Genug (Germany)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="German" /> + <info name="serial" value="SLES-03136, SLES-03136-P, SLES-03136-T"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - Die Welt Ist Nicht Genug (Germany)" sha1="63e6b4667bad77fc9ecabf23d889cc06883e70d7"/> + </diskarea> + </part> + </software> + + <software name="007twine_es" cloneof="007twine"> + <!-- + redump.org/disc/4881 + <rom name="007 - El Mundo Nunca es Suficiente (Spain).cue" size="108" crc="a0760ab7" sha1="4a3db376fded915a172ff249bd27b2b219c2455f"/> + <rom name="007 - El Mundo Nunca es Suficiente (Spain).bin" size="725182752" crc="f2614069" sha1="d058f1ae8891e5dcbb05fd872e2b4cf263be1a00"/> + --> + <description>007 - El Mundo Nunca es Suficiente (Spain)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="Spanish" /> + <info name="serial" value="SLES-03137-T"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - El Mundo Nunca es Suficiente (Spain)" sha1="2d1c93aa8452e051e30ba5045b1eb19ef0182538"/> + </diskarea> + </part> + </software> + + <software name="007twine_sv" cloneof="007twine"> + <!-- + redump.org/disc/48547 + <rom name="007 - The World Is Not Enough (Sweden).cue" size="104" crc="02fe70a7" sha1="535fe9288f572c2eff15a7cc1800ce33ec33296b"/> + <rom name="007 - The World Is Not Enough (Sweden).bin" size="727299552" crc="b535d4c5" sha1="73376a3287a874068ef32cc3bd2d918fb7f33d2b"/> + --> + <description>007 - The World Is Not Enough (Sweden)</description> + <year>2000</year> + <publisher>Electronic Arts</publisher> + <info name="language" value="Swedish" /> + <info name="speech" value="English" /> + <info name="serial" value="SLES-03138"/> + <sharedfeat name="compatibility" value="PAL-E"/> + <part name="cdrom" interface="psx_cdrom"> + <diskarea name="cdrom"> + <disk name="007 - The World Is Not Enough (Sweden)" sha1="3e7f2b632ef1c5db17d8c17cc26ff75cada9382d"/> + </diskarea> + </part> + </software> + <!-- http://redump.org/disc/19444/ --> <!-- Bundled with "Action Replay 2 Version 2" for PlayStation 2. Should be moved to that list when possible. --> <software name="ar2_223" cloneof="ar2_230"> diff --git a/hash/scv.xml b/hash/scv.xml index bd7d69afc34..430ee9f741f 100644 --- a/hash/scv.xml +++ b/hash/scv.xml @@ -363,11 +363,10 @@ Information found at http://www.rhod.fr/yeno_epoch.html </part> </software> - <software name="starspdr" supported="partial"> + <software name="starspdr"> <description>Star Speeder</description> <year>1985</year> <publisher>Epoch</publisher> - <notes>uPD1771 adpcm playback is not supported.</notes> <part name="cart" interface="scv_cart"> <feature name="slot" value="rom64k"/> <dataarea name="rom" size="0x10000"> diff --git a/hash/super_tv_pc_cart.xml b/hash/super_tv_pc_cart.xml index 8c5f55417ad..0f4f59d3788 100644 --- a/hash/super_tv_pc_cart.xml +++ b/hash/super_tv_pc_cart.xml @@ -27,6 +27,8 @@ license:CC0-1.0 <part name="cart" interface="super_tv_pc_cart"> <dataarea name="prg" size="0x400000"> <rom name="c-02.u1" size="0x400000" crc="99fb0088" sha1="b46400c850b08abd5c8ee649f483e0694b3eb059" /> + <!-- bypass EEPROM error until cart EEPROM is properly hooked up --> + <rom value="0xea" offset="0xd809" size="2" loadflag="fill" /> </dataarea> </part> </software> @@ -38,7 +40,8 @@ license:CC0-1.0 <info name="alt_title" value="ダブルマウスパーティー" /> <part name="cart" interface="super_tv_pc_cart"> <dataarea name="prg" size="0x200000"> - <rom name="c-03.u1" size="0x200000" crc="94634a7b" sha1="d69ec0a8c6061e749206927ee68dbcf852fcc03e" /> + <!-- baddump because code seems to be corrupt in places --> + <rom name="c-03.u1" size="0x200000" crc="94634a7b" sha1="d69ec0a8c6061e749206927ee68dbcf852fcc03e" status="baddump" /> </dataarea> </part> </software> @@ -51,6 +54,8 @@ license:CC0-1.0 <part name="cart" interface="super_tv_pc_cart"> <dataarea name="prg" size="0x400000"> <rom name="c-04.u1" size="0x400000" crc="89b6ef86" sha1="1af69047508fce08fa949a7d821255e306a329a3" /> + <!-- bypass (invisible) EEPROM error until cart EEPROM is properly hooked up --> + <rom value="0xea" offset="0xd5fa" size="2" loadflag="fill" /> </dataarea> </part> </software> diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 404c3093864..e53311cb949 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5787,6 +5787,8 @@ if (BUSES["H89BUS"]~=null) then MAME_DIR .. "src/devices/bus/heathzenith/h89/sigmasoft_parallel_port.h", MAME_DIR .. "src/devices/bus/heathzenith/h89/we_pullup.cpp", MAME_DIR .. "src/devices/bus/heathzenith/h89/we_pullup.h", + MAME_DIR .. "src/devices/bus/heathzenith/h89/z_89_11.cpp", + MAME_DIR .. "src/devices/bus/heathzenith/h89/z_89_11.h", MAME_DIR .. "src/devices/bus/heathzenith/h89/z37_fdc.cpp", MAME_DIR .. "src/devices/bus/heathzenith/h89/z37_fdc.h", } diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua index 014c27a25d3..2598688fe97 100644 --- a/scripts/src/cpu.lua +++ b/scripts/src/cpu.lua @@ -1424,6 +1424,8 @@ if CPUS["KL1839VM1"] then files { MAME_DIR .. "src/devices/cpu/mpk1839/kl1839vm1.cpp", MAME_DIR .. "src/devices/cpu/mpk1839/kl1839vm1.h", + MAME_DIR .. "src/devices/cpu/vax/vaxdasm.cpp", + MAME_DIR .. "src/devices/cpu/vax/vaxdasm.h", } end @@ -3928,6 +3930,13 @@ end --@src/devices/cpu/upd177x/upd177x.h,CPUS["UPD177X"] = true -------------------------------------------------- +if CPUS["UPD177X"] then + files { + MAME_DIR .. "src/devices/cpu/upd177x/upd177x.cpp", + MAME_DIR .. "src/devices/cpu/upd177x/upd177x.h", + } +end + if opt_tool(CPUS, "UPD177X") then table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/upd177x/upd177xd.cpp") table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/upd177x/upd177xd.h") diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua index c3f2f79f586..df21e945310 100644 --- a/scripts/src/sound.lua +++ b/scripts/src/sound.lua @@ -1425,18 +1425,6 @@ if (SOUNDS["AD1848"]~=null) then end --------------------------------------------------- --- UPD1771 ---@src/devices/sound/upd1771.h,SOUNDS["UPD1771"] = true ---------------------------------------------------- - -if (SOUNDS["UPD1771"]~=null) then - files { - MAME_DIR .. "src/devices/sound/upd1771.cpp", - MAME_DIR .. "src/devices/sound/upd1771.h", - } -end - ---------------------------------------------------- -- GB_SOUND --@src/devices/sound/gb.h,SOUNDS["GB_SOUND"] = true --------------------------------------------------- diff --git a/src/devices/bus/amiga/zorro/rainbow2.cpp b/src/devices/bus/amiga/zorro/rainbow2.cpp index 90e4907acca..41c67e17773 100644 --- a/src/devices/bus/amiga/zorro/rainbow2.cpp +++ b/src/devices/bus/amiga/zorro/rainbow2.cpp @@ -150,14 +150,17 @@ uint32_t rainbow2_device::screen_update(screen_device &screen, bitmap_rgb32 &bit } else { - unsigned i = 0; - - for (unsigned y = screen.visible_area().min_y; y <= screen.visible_area().max_y; y++) + for (unsigned y = cliprect.min_y; y <= cliprect.max_y; y++) { - for (unsigned x = screen.visible_area().min_x; x <= screen.visible_area().max_x; x++) + unsigned const i = y * 768 * 2; // line data start in memory + auto *const dst = &bitmap.pix(y); + + for (unsigned x = cliprect.min_x; x <= cliprect.max_x; x++) { - uint32_t *const vram = reinterpret_cast<uint32_t *>(&m_vram[0]); - bitmap.pix(y, x) = vram[i++]; + uint16_t const v1 = m_vram[(i + (x << 1)) | 0]; // green, blue + uint16_t const v2 = m_vram[(i + (x << 1)) | 1]; // alpha, red + + dst[x] = (uint32_t(v2) << 16) | v1; } } } diff --git a/src/devices/bus/ekara/rom.cpp b/src/devices/bus/ekara/rom.cpp index b08f5cc2fc4..a6e5523e84c 100644 --- a/src/devices/bus/ekara/rom.cpp +++ b/src/devices/bus/ekara/rom.cpp @@ -117,12 +117,32 @@ void ekara_rom_i2c_base_device::write_bus_control(offs_t offset, uint8_t data) void ekara_rom_i2c_base_device::write_rom(offs_t offset, uint8_t data) { - logerror("ekara_rom_i2c_base_device::write_rom %08x %02x\n", offset, data); + if (is_write_access_not_rom()) + { + if (offset == 0x3fffff) + write_extra(offset,data); + else + logerror("ekara_rom_i2c_base_device::write_rom %08x %02x\n", offset, data); + } + else + { + logerror("ekara_rom_i2c_base_device::write_rom %08x %02x\n", offset, data); + } } uint8_t ekara_rom_i2c_base_device::read_rom(offs_t offset) { - return m_rom[offset & (m_rom_size - 1)]; + if (is_read_access_not_rom()) + { + if (offset == 0x5fffff) + return read_extra(offset); + else + return m_rom[offset & (m_rom_size - 1)]; + } + else + { + return m_rom[offset & (m_rom_size - 1)]; + } } uint8_t ekara_rom_i2c_base_device::read_extra(offs_t offset) diff --git a/src/devices/bus/heathzenith/h89/cards.cpp b/src/devices/bus/heathzenith/h89/cards.cpp index 0f22c6401f8..888a6b275d9 100644 --- a/src/devices/bus/heathzenith/h89/cards.cpp +++ b/src/devices/bus/heathzenith/h89/cards.cpp @@ -16,6 +16,7 @@ #include "sigmasoft_parallel_port.h" #include "sigmasoft_sound.h" #include "we_pullup.h" +#include "z_89_11.h" #include "z37_fdc.h" void h89_left_cards(device_slot_interface &device) @@ -30,6 +31,8 @@ void h89_right_cards(device_slot_interface &device) device.option_add("ha_88_3", H89BUS_HA_88_3); device.option_add("h_88_5", H89BUS_H_88_5); device.option_add("ss_snd", H89BUS_SIGMASOFT_SND); + device.option_add("z_89_11", H89BUS_Z_89_11); + device.option_add("z37fdc", H89BUS_Z37); } diff --git a/src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp b/src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp index da3d7bf02ac..7a9b080e3c8 100644 --- a/src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp +++ b/src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp @@ -59,7 +59,7 @@ private: required_ioport m_joystick1, m_joystick2; required_ioport m_config; - u8 port_selection; + u8 m_port_selection; }; //************************************************************************** @@ -74,18 +74,18 @@ static INPUT_PORTS_START( sigma_sound ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_START("joystick_p2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_START("CONFIG") - PORT_CONFNAME(0x03, 0x01, "Port selection") - PORT_CONFSETTING( 0x00, "Disabled") - PORT_CONFSETTING( 0x01, "AUX - 320 Octal (0xD0)") - PORT_CONFSETTING( 0x02, "MODEM - 330 Octal (0xD8)") - PORT_CONFSETTING( 0x03, "LP - 340 Octal (0xE0)") + PORT_CONFNAME( 0x03, 0x01, "Port selection" ) + PORT_CONFSETTING( 0x00, "Disabled" ) + PORT_CONFSETTING( 0x01, "AUX - 320 Octal (0xD0)" ) + PORT_CONFSETTING( 0x02, "MODEM - 330 Octal (0xD8)" ) + PORT_CONFSETTING( 0x03, "LP - 340 Octal (0xE0)" ) INPUT_PORTS_END @@ -101,8 +101,7 @@ h89bus_sigmasoft_snd_device::h89bus_sigmasoft_snd_device(const machine_config &m void h89bus_sigmasoft_snd_device::write(u8 select_lines, u8 reg, u8 val) { - // we respond to the SER0 decode - if (!(select_lines & port_selection)) + if (!(select_lines & m_port_selection)) { return; } @@ -111,20 +110,20 @@ void h89bus_sigmasoft_snd_device::write(u8 select_lines, u8 reg, u8 val) switch (reg) { - case 0: - m_ay8910->data_w(val); - break; - case 1: - m_ay8910->address_w(val); - break; - default: - LOGERR("%s: unexpected port write: %d - 0x%02x]n", FUNCNAME, reg, val); + case 0: + m_ay8910->data_w(val); + break; + case 1: + m_ay8910->address_w(val); + break; + default: + LOGERR("%s: unexpected port write: %d - 0x%02x\n", FUNCNAME, reg, val); } } u8 h89bus_sigmasoft_snd_device::read(u8 select_lines, u8 reg) { - if (!(select_lines & port_selection)) + if (!(select_lines & m_port_selection)) { return 0; } @@ -133,14 +132,14 @@ u8 h89bus_sigmasoft_snd_device::read(u8 select_lines, u8 reg) switch (reg) { - case 0: - value = m_ay8910->data_r(); - break; - case 1: - value = this->read_joystick(); - break; - default: - LOGERR("%s: unexpected port read: %d\n", FUNCNAME, reg); + case 0: + value = m_ay8910->data_r(); + break; + case 1: + value = this->read_joystick(); + break; + default: + LOGERR("%s: unexpected port read: %d\n", FUNCNAME, reg); } LOGFUNC("%s: reg: %d val: %d\n", FUNCNAME, reg, value); @@ -169,7 +168,7 @@ u8 h89bus_sigmasoft_snd_device::read_joystick() u8 joy1 = m_joystick1->read(); u8 joy2 = m_joystick2->read(); - return this->transform_joystick_input(joy1) << 4 & this->transform_joystick_input(joy2); + return (this->transform_joystick_input(joy1) << 4) | this->transform_joystick_input(joy2); } void h89bus_sigmasoft_snd_device::device_start() @@ -180,20 +179,19 @@ void h89bus_sigmasoft_snd_device::device_reset() { ioport_value const config(m_config->read()); - switch (config & 0x03) { case 0x00: - port_selection = 0; + m_port_selection = 0; break; case 0x01: - port_selection = h89bus_device::H89_SER0; + m_port_selection = h89bus_device::H89_SER0; break; case 0x02: - port_selection = h89bus_device::H89_SER1; + m_port_selection = h89bus_device::H89_SER1; break; case 0x03: - port_selection = h89bus_device::H89_LP; + m_port_selection = h89bus_device::H89_LP; break; } } diff --git a/src/devices/bus/heathzenith/h89/z_89_11.cpp b/src/devices/bus/heathzenith/h89/z_89_11.cpp new file mode 100644 index 00000000000..cc2dd7a1972 --- /dev/null +++ b/src/devices/bus/heathzenith/h89/z_89_11.cpp @@ -0,0 +1,330 @@ +// license:BSD-3-Clause +// copyright-holders:Mark Garlanger +/*************************************************************************** + + Heath/Zenith Z-89-11 Multi-Mode Interface Card + +****************************************************************************/ + +#include "emu.h" + +#include "z_89_11.h" + +#include "bus/rs232/rs232.h" +#include "machine/i8255.h" +#include "machine/ins8250.h" +#include "machine/scn_pci.h" + +namespace { + +class z_89_11_device : public device_t, public device_h89bus_right_card_interface +{ +public: + + z_89_11_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = XTAL(1'843'200).value()); + + virtual void write(u8 select_lines, u8 offset, u8 data) override; + virtual u8 read(u8 select_lines, u8 offset) override; + +protected: + + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + void lp_w(offs_t reg, u8 val); + u8 lp_r(offs_t reg); + + void aux_w(offs_t reg, u8 val); + u8 aux_r(offs_t reg); + + void modem_w(offs_t reg, u8 val); + u8 modem_r(offs_t reg); + + void update_intr(u8 level); + + void aux_int(int data); + + required_device<i8255_device> m_lp; + required_device<ins8250_device> m_aux; + required_device<scn2661c_device> m_modem; + required_ioport m_cfg_lp; + required_ioport m_cfg_aux; + required_ioport m_cfg_modem; + + + bool m_lp_enabled; + bool m_aux_enabled; + bool m_modem_enabled; + + u8 m_lp_int_idx; + u8 m_aux_int_idx; + u8 m_modem_int_idx; + + int m_lp_intr; + int m_aux_intr; + int m_modem_intr; + +}; + + +z_89_11_device::z_89_11_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock): + device_t(mconfig, H89BUS_Z_89_11, tag, owner, clock), + device_h89bus_right_card_interface(mconfig, *this), + m_lp(*this, "lp"), + m_aux(*this, "aux"), + m_modem(*this, "modem"), + m_cfg_lp(*this, "CFG_LP"), + m_cfg_aux(*this, "CFG_AUX"), + m_cfg_modem(*this, "CFG_MODEM"), + m_lp_intr(0), + m_aux_intr(0), + m_modem_intr(0) +{ +} + +u8 z_89_11_device::read(u8 select_lines, u8 offset) +{ + if ((select_lines & h89bus_device::H89_SER0) && (m_aux_enabled)) + { + return aux_r(offset); + } + + if ((select_lines & h89bus_device::H89_SER1) && (m_modem_enabled)) + { + return modem_r(offset); + } + + if ((select_lines & h89bus_device::H89_LP) && (m_lp_enabled)) + { + return lp_r(offset); + } + + return 0; +} + +void z_89_11_device::write(u8 select_lines, u8 offset, u8 data) +{ + if ((select_lines & h89bus_device::H89_SER0) && (m_aux_enabled)) + { + aux_w(offset, data); + return; + } + + if ((select_lines & h89bus_device::H89_SER1) && (m_modem_enabled)) + { + modem_w(offset, data); + return; + } + + if ((select_lines & h89bus_device::H89_LP) && (m_lp_enabled)) + { + lp_w(offset, data); + return; + } +} + +u8 z_89_11_device::lp_r(offs_t reg) +{ + return m_lp->read(reg); +} + +void z_89_11_device::lp_w(offs_t reg, u8 val) +{ + m_lp->write(reg, val); +} + +u8 z_89_11_device::aux_r(offs_t reg) +{ + return m_aux->ins8250_r(reg); +} + +void z_89_11_device::aux_w(offs_t reg, u8 val) +{ + m_aux->ins8250_w(reg, val); +} + +u8 z_89_11_device::modem_r(offs_t reg) +{ + return m_modem->read(reg); +} + +void z_89_11_device::modem_w(offs_t reg, u8 val) +{ + m_modem->write(reg, val); +} + +void z_89_11_device::update_intr(u8 level) +{ + // check for interrupt disabled + if (level == 0) + { + return; + } + + // Handle multiple ports set to the same interrupt. If any are set, interrupt should be triggered + int data = 0; + + if (m_lp_enabled && (m_lp_int_idx == level)) + { + data |= m_lp_intr; + } + if (m_aux_enabled && (m_aux_int_idx == level)) + { + data |= m_aux_intr; + } + if (m_modem_enabled && (m_modem_int_idx == level)) + { + data |= m_modem_intr; + } + + switch(level) + { + case 1: + set_slot_int3(data); + break; + case 2: + set_slot_int4(data); + break; + case 3: + set_slot_int5(data); + break; + } +} + +void z_89_11_device::aux_int(int data) +{ + if (!m_aux_enabled) + { + return; + } + + m_aux_intr = data; + + update_intr(m_aux_int_idx); +} + +void z_89_11_device::device_start() +{ + save_item(NAME(m_lp_enabled)); + save_item(NAME(m_lp_int_idx)); + save_item(NAME(m_aux_enabled)); + save_item(NAME(m_aux_int_idx)); + save_item(NAME(m_modem_enabled)); + save_item(NAME(m_modem_int_idx)); + save_item(NAME(m_lp_intr)); + save_item(NAME(m_aux_intr)); + save_item(NAME(m_modem_intr)); +} + +void z_89_11_device::device_reset() +{ + ioport_value const cfg_lp(m_cfg_lp->read()); + ioport_value const cfg_aux(m_cfg_aux->read()); + ioport_value const cfg_modem(m_cfg_modem->read()); + + m_lp_enabled = bool(BIT(cfg_lp, 0)); + m_aux_enabled = bool(BIT(cfg_aux, 0)); + m_modem_enabled = bool(BIT(cfg_modem, 0)); + + // LP Interrupt level + m_lp_int_idx = BIT(cfg_lp, 1, 2); + + // AUX Interrupt level + m_aux_int_idx = BIT(cfg_aux, 1, 2); + + // MODEM Interrupt level + m_modem_int_idx = BIT(cfg_modem, 1, 2); +} + +void z_89_11_device::device_add_mconfig(machine_config &config) +{ + // Parallel 0xD0-0xD7 (320 - 327 octal) + I8255(config, m_lp, m_clock); + + // AUX DCE 0xE0-0xE7 (340 - 347 octal) + // + INS8250(config, m_aux, XTAL(1'843'200)); + m_aux->out_tx_callback().set("dce2", FUNC(rs232_port_device::write_txd)); + m_aux->out_dtr_callback().set("dce2", FUNC(rs232_port_device::write_dtr)); + m_aux->out_rts_callback().set("dce2", FUNC(rs232_port_device::write_rts)); + m_aux->out_int_callback().set(FUNC(z_89_11_device::aux_int)); + + rs232_port_device &dce2(RS232_PORT(config, "dce2", default_rs232_devices, "loopback")); + dce2.rxd_handler().set(m_aux, FUNC(ins8250_device::rx_w)); + dce2.dcd_handler().set(m_aux, FUNC(ins8250_device::dcd_w)); + dce2.dsr_handler().set(m_aux, FUNC(ins8250_device::dsr_w)); + dce2.cts_handler().set(m_aux, FUNC(ins8250_device::cts_w)); + dce2.ri_handler().set(m_aux, FUNC(ins8250_device::ri_w)); + + // Modem DTE 0xD7-0xDF (330 - 337 octal) + SCN2661C(config, m_modem, XTAL(5'068'800)); + m_modem->txd_handler().set("dte", FUNC(rs232_port_device::write_txd)); + m_modem->dtr_handler().set("dte", FUNC(rs232_port_device::write_dtr)); + m_modem->rts_handler().set("dte", FUNC(rs232_port_device::write_rts)); + + + rs232_port_device &dte(RS232_PORT(config, "dte", default_rs232_devices, "loopback")); + dte.rxd_handler().set(m_modem, FUNC(scn2661c_device::rxd_w)); + dte.dcd_handler().set(m_modem, FUNC(scn2661c_device::dcd_w)); + dte.dsr_handler().set(m_modem, FUNC(scn2661c_device::dsr_w)); + dte.cts_handler().set(m_modem, FUNC(scn2661c_device::cts_w)); +} + + +static INPUT_PORTS_START( z_89_11_device ) + + // INS8250 + PORT_START("CFG_LP") + PORT_CONFNAME(0x01, 0x01, "LP - DCE (340 octal) Enabled" ) + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x01, DEF_STR( Yes )) + PORT_CONFNAME(0x06, 0x00, "LP - DCE (340 octal) Interrupt level") + PORT_CONFSETTING( 0x00, DEF_STR( None )) + PORT_CONFSETTING( 0x02, "3") + PORT_CONFSETTING( 0x04, "4") + PORT_CONFSETTING( 0x06, "5") + + // 8255 chip + PORT_START("CFG_AUX") + PORT_CONFNAME(0x01, 0x01, "AUX - DCE (320 octal) Enabled" ) + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x01, DEF_STR( Yes )) + PORT_CONFNAME(0x06, 0x00, "AUX - DCE (320 octal) Interrupt level") + PORT_CONFSETTING( 0x00, DEF_STR( None )) + PORT_CONFSETTING( 0x02, "3") + PORT_CONFSETTING( 0x04, "4") + PORT_CONFSETTING( 0x06, "5") + + // 2661 + PORT_START("CFG_MODEM") + PORT_CONFNAME(0x01, 0x01, "MODEM - DTE (330 octal) Enabled" ) + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x01, DEF_STR( Yes )) + PORT_CONFNAME(0x06, 0x00, "MODEM - DTE (330 octal) Interrupt level") + PORT_CONFSETTING( 0x00, DEF_STR( None )) + PORT_CONFSETTING( 0x02, "3") + PORT_CONFSETTING( 0x04, "4") + PORT_CONFSETTING( 0x06, "5") + PORT_CONFNAME(0x08, 0x00, "Interrupt on Rx Ready Enabled") + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x08, DEF_STR( Yes )) + PORT_CONFNAME(0x10, 0x00, "Interrupt on Tx Ready Enabled") + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x10, DEF_STR( Yes )) + PORT_CONFNAME(0x20, 0x00, "Interrupt on Tx Empty Enabled") + PORT_CONFSETTING( 0x00, DEF_STR( No )) + PORT_CONFSETTING( 0x20, DEF_STR( Yes )) + +INPUT_PORTS_END + + +ioport_constructor z_89_11_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(z_89_11_device); +} + +} + +DEFINE_DEVICE_TYPE_PRIVATE(H89BUS_Z_89_11, device_h89bus_right_card_interface, z_89_11_device, "z_89_11", "Heath/Zenith Z-89-11 Multi-Function I/O Card"); diff --git a/src/devices/bus/heathzenith/h89/z_89_11.h b/src/devices/bus/heathzenith/h89/z_89_11.h new file mode 100644 index 00000000000..76c6d7b230b --- /dev/null +++ b/src/devices/bus/heathzenith/h89/z_89_11.h @@ -0,0 +1,19 @@ +// license:BSD-3-Clause +// copyright-holders:Mark Garlanger +/*************************************************************************** + + Heath/Zenith Z-89-1 Multi-Function I/O card + +****************************************************************************/ + + +#ifndef MAME_BUS_HEATHZENITH_H89_Z_89_11_H +#define MAME_BUS_HEATHZENITH_H89_Z_89_11_H + +#pragma once + +#include "h89bus.h" + +DECLARE_DEVICE_TYPE(H89BUS_Z_89_11, device_h89bus_right_card_interface) + +#endif // MAME_BUS_HEATHZENITH_H89_Z_89_11_H diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp index 14cac9e5501..5e93429dbf6 100644 --- a/src/devices/cpu/drcbec.cpp +++ b/src/devices/cpu/drcbec.cpp @@ -181,6 +181,7 @@ enum // compute C and V flags for 32-bit add/subtract #define FLAGS32_C_ADD(a,b) ((uint32_t)~(a) < (uint32_t)(b)) #define FLAGS32_C_SUB(a,b) ((uint32_t)(b) > (uint32_t)(a)) +#define FLAGS32_C_SUBC(a,b,c) (((uint32_t)(c) != 0 && ((uint32_t)(b) + (uint32_t)(c)) == 0) || (uint32_t)(b) + (uint32_t)(c) > (uint32_t)(a)) #define FLAGS32_V_SUB(r,a,b) (((((a) ^ (b)) & ((a) ^ (r))) >> 30) & FLAG_V) #define FLAGS32_V_ADD(r,a,b) (((~((a) ^ (b)) & ((a) ^ (r))) >> 30) & FLAG_V) @@ -188,10 +189,12 @@ enum #define FLAGS32_NZ(v) ((((v) >> 28) & FLAG_S) | (((uint32_t)(v) == 0) << 2)) #define FLAGS32_NZCV_ADD(r,a,b) (FLAGS32_NZ(r) | FLAGS32_C_ADD(a,b) | FLAGS32_V_ADD(r,a,b)) #define FLAGS32_NZCV_SUB(r,a,b) (FLAGS32_NZ(r) | FLAGS32_C_SUB(a,b) | FLAGS32_V_SUB(r,a,b)) +#define FLAGS32_NZCV_SUBC(r,a,b,c) (FLAGS32_NZ(r) | FLAGS32_C_SUBC(a,b,c) | FLAGS32_V_SUB(r,a,b)) // compute C and V flags for 64-bit add/subtract #define FLAGS64_C_ADD(a,b) ((uint64_t)~(a) < (uint64_t)(b)) #define FLAGS64_C_SUB(a,b) ((uint64_t)(b) > (uint64_t)(a)) +#define FLAGS64_C_SUBC(a,b,c) (((uint64_t)(c) != 0 && ((uint64_t)(b) + (uint64_t)(c)) == 0) || (uint64_t)(b) + (uint64_t)(c) > (uint64_t)(a)) #define FLAGS64_V_SUB(r,a,b) (((((a) ^ (b)) & ((a) ^ (r))) >> 62) & FLAG_V) #define FLAGS64_V_ADD(r,a,b) (((~((a) ^ (b)) & ((a) ^ (r))) >> 62) & FLAG_V) @@ -199,6 +202,7 @@ enum #define FLAGS64_NZ(v) ((((v) >> 60) & FLAG_S) | (((uint64_t)(v) == 0) << 2)) #define FLAGS64_NZCV_ADD(r,a,b) (FLAGS64_NZ(r) | FLAGS64_C_ADD(a,b) | FLAGS64_V_ADD(r,a,b)) #define FLAGS64_NZCV_SUB(r,a,b) (FLAGS64_NZ(r) | FLAGS64_C_SUB(a,b) | FLAGS64_V_SUB(r,a,b)) +#define FLAGS64_NZCV_SUBC(r,a,b,c) (FLAGS64_NZ(r) | FLAGS64_C_SUBC(a,b,c) | FLAGS64_V_SUB(r,a,b)) @@ -320,13 +324,30 @@ void drcbe_c::reset() void drcbe_c::generate(drcuml_block &block, const instruction *instlist, uint32_t numinst) { + // Calculate the max possible number of register clears required + uint32_t regclears = 0; + + for (int inum = 0; inum < numinst; inum++) + { + const instruction &inst = instlist[inum]; + + if (inst.size() != 4) + continue; + + for (int pnum = 0; pnum < inst.numparams(); pnum++) + { + if (inst.is_param_out(pnum) && inst.param(pnum).is_int_register()) + regclears++; + } + } + // tell all of our utility objects that a block is beginning - m_hash.block_begin(block, instlist, numinst); + m_hash.block_begin(block, instlist, numinst + regclears); m_labels.block_begin(block); m_map.block_begin(block); // begin codegen; fail if we can't - drccodeptr *cachetop = m_cache.begin_codegen(numinst * sizeof(drcbec_instruction) * 4); + drccodeptr *cachetop = m_cache.begin_codegen((numinst + regclears) * sizeof(drcbec_instruction) * 4); if (cachetop == nullptr) block.abort(); @@ -334,6 +355,9 @@ void drcbe_c::generate(drcuml_block &block, const instruction *instlist, uint32_ drcbec_instruction *base = (drcbec_instruction *)(((uintptr_t)*cachetop + sizeof(drcbec_instruction) - 1) & ~(sizeof(drcbec_instruction) - 1)); drcbec_instruction *dst = base; + bool ireg_needs_clearing[REG_I_COUNT]; + std::fill(std::begin(ireg_needs_clearing), std::end(ireg_needs_clearing), true); + // generate code by copying the instructions and extracting immediates for (int inum = 0; inum < numinst; inum++) { @@ -359,9 +383,10 @@ void drcbe_c::generate(drcuml_block &block, const instruction *instlist, uint32_ m_labels.set_codeptr(inst.param(0).label(), (drccodeptr)dst); break; - // ignore COMMENT and NOP opcodes + // ignore COMMENT, NOP, and BREAK opcodes case OP_COMMENT: case OP_NOP: + case OP_BREAK: break; // when we hit a MAPVAR opcode, log the change for the current PC @@ -386,10 +411,14 @@ void drcbe_c::generate(drcuml_block &block, const instruction *instlist, uint32_ psize[2] = 4; if (opcode == OP_STORE || opcode == OP_FSTORE) psize[1] = 4; - if (opcode == OP_READ || opcode == OP_READM || opcode == OP_FREAD) + if (opcode == OP_READ || opcode == OP_FREAD) psize[1] = psize[2] = 4; - if (opcode == OP_WRITE || opcode == OP_WRITEM || opcode == OP_FWRITE) + if (opcode == OP_WRITE || opcode == OP_FWRITE) psize[0] = psize[2] = 4; + if (opcode == OP_READM) + psize[1] = psize[3] = 4; + if (opcode == OP_WRITEM) + psize[0] = psize[3] = 4; if (opcode == OP_SEXT && inst.param(2).size() != SIZE_QWORD) psize[1] = 4; if (opcode == OP_FTOINT) @@ -444,6 +473,41 @@ void drcbe_c::generate(drcuml_block &block, const instruction *instlist, uint32_ // point past the end of the immediates dst += immedwords; + + // Keep track of which registers had an 8 byte write and clear it the next time it's written + if (inst.size() == 4) + { + for (int pnum = 0; pnum < inst.numparams(); pnum++) + { + if (inst.is_param_out(pnum) && inst.param(pnum).is_int_register() && ireg_needs_clearing[inst.param(pnum).ireg() - REG_I0]) + { + immedwords = (8 + sizeof(drcbec_instruction) - 1) / sizeof(drcbec_instruction); + + (dst++)->i = MAKE_OPCODE_FULL(OP_AND, 8, 0, 0, 3 + immedwords); + + immed = dst + 3; + + output_parameter(&dst, &immed, 8, inst.param(pnum)); + output_parameter(&dst, &immed, 8, inst.param(pnum)); + output_parameter(&dst, &immed, 8, 0xffffffff); + + dst += immedwords; + + ireg_needs_clearing[inst.param(pnum).ireg() - REG_I0] = false; + } + } + } + else if (inst.size() == 8) + { + for (int pnum = 0; pnum < inst.numparams(); pnum++) + { + if (inst.is_param_out(pnum) && inst.param(pnum).is_int_register()) + { + ireg_needs_clearing[inst.param(pnum).ireg() - REG_I0] = true; + } + } + } + break; } } @@ -518,6 +582,10 @@ int drcbe_c::execute(code_handle &entry) // these opcodes should be processed at compile-time only fatalerror("Unexpected opcode\n"); + case MAKE_OPCODE_SHORT(OP_BREAK, 4, 0): + osd_break_into_debugger("break from drc"); + break; + case MAKE_OPCODE_SHORT(OP_DEBUG, 4, 0): // DEBUG pc if (m_device.machine().debug_flags & DEBUG_FLAG_CALL_HOOK) m_device.debug()->instruction_hook(PARAM0); @@ -628,6 +696,11 @@ int drcbe_c::execute(code_handle &entry) PARAM0 = flags & PARAM1; break; + case MAKE_OPCODE_SHORT(OP_SETFLGS, 4, 0): // SETFLGS src + case MAKE_OPCODE_SHORT(OP_SETFLGS, 4, 1): + flags = PARAM0; + break; + case MAKE_OPCODE_SHORT(OP_SAVE, 4, 0): // SAVE dst *inst[0].state = m_state; inst[0].state->flags = flags; @@ -826,7 +899,8 @@ int drcbe_c::execute(code_handle &entry) m_space[PARAM3]->write_dword(PARAM0, PARAM1, PARAM2); break; - case MAKE_OPCODE_SHORT(OP_CARRY, 4, 1): // CARRY src,bitnum + case MAKE_OPCODE_SHORT(OP_CARRY, 4, 0): // CARRY src,bitnum + case MAKE_OPCODE_SHORT(OP_CARRY, 4, 1): flags = (flags & ~FLAG_C) | ((PARAM0 >> (PARAM1 & 31)) & FLAG_C); break; @@ -930,16 +1004,7 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SUBB, 4, 1): temp32 = PARAM1 - PARAM2 - (flags & FLAG_C); - temp64 = (uint64_t)PARAM1 - (uint64_t)PARAM2 - (uint64_t)(flags & FLAG_C); - if (PARAM2 + 1 != 0) - flags = FLAGS32_NZCV_SUB(temp32, PARAM1, PARAM2 + (flags & FLAG_C)); - else - { - flags = FLAGS32_NZCV_SUB(temp32, PARAM1 - (flags & FLAG_C), PARAM2); - flags &= ~(FLAG_C | FLAG_V); - flags |= ((temp64>>32) & 1) ? FLAG_C : 0; - flags |= (((PARAM1) ^ (PARAM2)) & ((PARAM1) ^ (temp64)) & 0x80000000) ? FLAG_V : 0; - } + flags = FLAGS32_NZCV_SUBC(temp32, PARAM1, PARAM2, flags & FLAG_C); PARAM0 = temp32; break; @@ -964,6 +1029,20 @@ int drcbe_c::execute(code_handle &entry) flags |= FLAG_V; break; + case MAKE_OPCODE_SHORT(OP_MULULW, 4, 0): // MULULW dst,src1,src2[,f] + temp64 = mulu_32x32(PARAM1, PARAM2); + PARAM0 = (uint32_t)temp64; + break; + + case MAKE_OPCODE_SHORT(OP_MULULW, 4, 1): + temp64 = mulu_32x32(PARAM1, PARAM2); + temp32 = (uint32_t)temp64; + flags = FLAGS32_NZ(temp32); + PARAM0 = temp32; + if (temp64 > temp32) + flags |= FLAG_V; + break; + case MAKE_OPCODE_SHORT(OP_MULS, 4, 0): // MULS dst,edst,src1,src2[,f] temp64 = mul_32x32(PARAM2, PARAM3); PARAM1 = temp64 >> 32; @@ -972,11 +1051,24 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_MULS, 4, 1): temp64 = mul_32x32(PARAM2, PARAM3); - temp32 = (int32_t)temp64; - flags = FLAGS32_NZ(temp32); + flags = FLAGS64_NZ(temp64); PARAM1 = temp64 >> 32; PARAM0 = (uint32_t)temp64; - if (temp64 != (int32_t)temp64) + if ((int64_t)temp64 != (int32_t)temp64) + flags |= FLAG_V; + break; + + case MAKE_OPCODE_SHORT(OP_MULSLW, 4, 0): // MULSLW dst,src1,src2[,f] + temp64 = mul_32x32(PARAM1, PARAM2); + PARAM0 = (int32_t)temp64; + break; + + case MAKE_OPCODE_SHORT(OP_MULSLW, 4, 1): + temp64 = mul_32x32(PARAM1, PARAM2); + temp32 = (int32_t)temp64; + flags = FLAGS32_NZ(temp32); + PARAM0 = temp32; + if ((int64_t)temp64 != (int32_t)temp64) flags |= FLAG_V; break; @@ -1084,8 +1176,8 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_BSWAP, 4, 1): temp32 = PARAM1; - flags = FLAGS32_NZ(temp32); PARAM0 = swapendian_int32(temp32); + flags = FLAGS32_NZ(PARAM0); break; case MAKE_OPCODE_SHORT(OP_SHL, 4, 0): // SHL dst,src,count[,f] @@ -1154,6 +1246,8 @@ int drcbe_c::execute(code_handle &entry) PARAM0 = (PARAM1 << shift) | ((flags & FLAG_C) << (shift - 1)) | (PARAM1 >> (33 - shift)); else if (shift == 1) PARAM0 = (PARAM1 << shift) | (flags & FLAG_C); + else + PARAM0 = PARAM1; break; case MAKE_OPCODE_SHORT(OP_ROLC, 4, 1): @@ -1164,8 +1258,11 @@ int drcbe_c::execute(code_handle &entry) temp32 = (PARAM1 << shift) | (flags & FLAG_C); else temp32 = PARAM1; - flags = FLAGS32_NZ(temp32); - if (shift != 0) flags |= ((PARAM1 << (shift - 1)) >> 31) & FLAG_C; + if (shift != 0) + { + flags = FLAGS32_NZ(temp32); + flags |= ((PARAM1 << (shift - 1)) >> 31) & FLAG_C; + } PARAM0 = temp32; break; @@ -1176,8 +1273,11 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROR, 4, 1): shift = PARAM2 & 31; temp32 = rotr_32(PARAM1, shift); - flags = FLAGS32_NZ(temp32); - if (shift != 0) flags |= (PARAM1 >> (shift - 1)) & FLAG_C; + if (shift != 0) + { + flags = FLAGS32_NZ(temp32); + flags |= (PARAM1 >> (shift - 1)) & FLAG_C; + } PARAM0 = temp32; break; @@ -1187,6 +1287,8 @@ int drcbe_c::execute(code_handle &entry) PARAM0 = (PARAM1 >> shift) | (((flags & FLAG_C) << 31) >> (shift - 1)) | (PARAM1 << (33 - shift)); else if (shift == 1) PARAM0 = (PARAM1 >> shift) | ((flags & FLAG_C) << 31); + else + PARAM0 = PARAM1; break; case MAKE_OPCODE_SHORT(OP_RORC, 4, 1): @@ -1197,8 +1299,11 @@ int drcbe_c::execute(code_handle &entry) temp32 = (PARAM1 >> shift) | ((flags & FLAG_C) << 31); else temp32 = PARAM1; - flags = FLAGS32_NZ(temp32); - if (shift != 0) flags |= (PARAM1 >> (shift - 1)) & FLAG_C; + if (shift != 0) + { + flags = FLAGS32_NZ(temp32); + flags |= (PARAM1 >> (shift - 1)) & FLAG_C; + } PARAM0 = temp32; break; @@ -1409,20 +1514,20 @@ int drcbe_c::execute(code_handle &entry) DPARAM0 = m_space[PARAM2]->read_dword(PARAM1); break; - case MAKE_OPCODE_SHORT(OP_READ8, 8, 0): // DREAD dst,src1,space_QOWRD + case MAKE_OPCODE_SHORT(OP_READ8, 8, 0): // DREAD dst,src1,space_QWORD DPARAM0 = m_space[PARAM2]->read_qword(PARAM1); break; case MAKE_OPCODE_SHORT(OP_READM2, 8, 0): // DREADM dst,src1,mask,space_WORD - DPARAM0 = m_space[PARAM3]->read_word(PARAM1, PARAM2); + DPARAM0 = m_space[PARAM3]->read_word(PARAM1, DPARAM2); break; case MAKE_OPCODE_SHORT(OP_READM4, 8, 0): // DREADM dst,src1,mask,space_DWORD - DPARAM0 = m_space[PARAM3]->read_dword(PARAM1, PARAM2); + DPARAM0 = m_space[PARAM3]->read_dword(PARAM1, DPARAM2); break; case MAKE_OPCODE_SHORT(OP_READM8, 8, 0): // DREADM dst,src1,mask,space_QWORD - DPARAM0 = m_space[PARAM3]->read_qword(PARAM1, PARAM2); + DPARAM0 = m_space[PARAM3]->read_qword(PARAM1, DPARAM2); break; case MAKE_OPCODE_SHORT(OP_WRITE1, 8, 0): // DWRITE dst,src1,space_BYTE @@ -1454,6 +1559,7 @@ int drcbe_c::execute(code_handle &entry) break; case MAKE_OPCODE_SHORT(OP_CARRY, 8, 0): // DCARRY src,bitnum + case MAKE_OPCODE_SHORT(OP_CARRY, 8, 1): flags = (flags & ~FLAG_C) | ((DPARAM0 >> (DPARAM1 & 63)) & FLAG_C); break; @@ -1559,10 +1665,7 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SUBB, 8, 1): temp64 = DPARAM1 - DPARAM2 - (flags & FLAG_C); - if (DPARAM2 + 1 != 0) - flags = FLAGS64_NZCV_SUB(temp64, DPARAM1, DPARAM2 + (flags & FLAG_C)); - else - flags = FLAGS64_NZCV_SUB(temp64, DPARAM1 - (flags & FLAG_C), DPARAM2); + flags = FLAGS64_NZCV_SUBC(temp64, DPARAM1, DPARAM2, flags & FLAG_C); DPARAM0 = temp64; break; @@ -1579,6 +1682,15 @@ int drcbe_c::execute(code_handle &entry) flags = dmulu(*inst[0].puint64, *inst[1].puint64, DPARAM2, DPARAM3, true); break; + case MAKE_OPCODE_SHORT(OP_MULULW, 8, 0): // DMULULW dst,src1,src2[,f] + dmulu(*inst[0].puint64, *inst[0].puint64, DPARAM1, DPARAM2, false); + break; + + case MAKE_OPCODE_SHORT(OP_MULULW, 8, 1): + flags = dmulu(*inst[0].puint64, *inst[0].puint64, DPARAM1, DPARAM2, true); + flags = FLAGS64_NZ(DPARAM0) | (flags & FLAG_V); + break; + case MAKE_OPCODE_SHORT(OP_MULS, 8, 0): // DMULS dst,edst,src1,src2[,f] dmuls(*inst[0].puint64, *inst[1].puint64, DPARAM2, DPARAM3, false); break; @@ -1587,6 +1699,15 @@ int drcbe_c::execute(code_handle &entry) flags = dmuls(*inst[0].puint64, *inst[1].puint64, DPARAM2, DPARAM3, true); break; + case MAKE_OPCODE_SHORT(OP_MULSLW, 8, 0): // DMULSLW dst,src1,src2[,f] + dmuls(*inst[0].puint64, *inst[0].puint64, DPARAM1, DPARAM2, false); + break; + + case MAKE_OPCODE_SHORT(OP_MULSLW, 8, 1): + flags = dmuls(*inst[0].puint64, *inst[0].puint64, DPARAM1, DPARAM2, true); + flags = FLAGS64_NZ(DPARAM0) | (flags & FLAG_V); + break; + case MAKE_OPCODE_SHORT(OP_DIVU, 8, 0): // DDIVU dst,edst,src1,src2[,f] if (DPARAM3 != 0) { @@ -1691,8 +1812,8 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_BSWAP, 8, 1): temp64 = DPARAM1; - flags = FLAGS64_NZ(temp64); DPARAM0 = swapendian_int64(temp64); + flags = FLAGS64_NZ(DPARAM0); break; case MAKE_OPCODE_SHORT(OP_SHL, 8, 0): // DSHL dst,src,count[,f] @@ -1702,8 +1823,11 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHL, 8, 1): shift = DPARAM2 & 63; temp64 = DPARAM1 << shift; - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1714,8 +1838,11 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SHR, 8, 1): shift = DPARAM2 & 63; temp64 = DPARAM1 >> shift; - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1725,9 +1852,12 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_SAR, 8, 1): shift = DPARAM2 & 63; - temp64 = (int32_t)DPARAM1 >> shift; - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + temp64 = (int64_t)DPARAM1 >> shift; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1738,8 +1868,11 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROL, 8, 1): shift = DPARAM2 & 63; temp64 = rotl_64(DPARAM1, shift); - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1749,6 +1882,8 @@ int drcbe_c::execute(code_handle &entry) DPARAM0 = (DPARAM1 << shift) | ((flags & FLAG_C) << (shift - 1)) | (DPARAM1 >> (65 - shift)); else if (shift == 1) DPARAM0 = (DPARAM1 << shift) | (flags & FLAG_C); + else + DPARAM0 = DPARAM1; break; case MAKE_OPCODE_SHORT(OP_ROLC, 8, 1): @@ -1759,8 +1894,11 @@ int drcbe_c::execute(code_handle &entry) temp64 = (DPARAM1 << shift) | (flags & FLAG_C); else temp64 = DPARAM1; - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= ((DPARAM1 << (shift - 1)) >> 63) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1771,8 +1909,11 @@ int drcbe_c::execute(code_handle &entry) case MAKE_OPCODE_SHORT(OP_ROR, 8, 1): shift = DPARAM2 & 63; temp64 = rotr_64(DPARAM1, shift); - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + } DPARAM0 = temp64; break; @@ -1782,6 +1923,8 @@ int drcbe_c::execute(code_handle &entry) DPARAM0 = (DPARAM1 >> shift) | ((((uint64_t)flags & FLAG_C) << 63) >> (shift - 1)) | (DPARAM1 << (65 - shift)); else if (shift == 1) DPARAM0 = (DPARAM1 >> shift) | (((uint64_t)flags & FLAG_C) << 63); + else + DPARAM0 = DPARAM1; break; case MAKE_OPCODE_SHORT(OP_RORC, 8, 1): @@ -1792,8 +1935,11 @@ int drcbe_c::execute(code_handle &entry) temp64 = (DPARAM1 >> shift) | (((uint64_t)flags & FLAG_C) << 63); else temp64 = DPARAM1; - flags = FLAGS64_NZ(temp64); - if (shift != 0) flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + if (shift != 0) + { + flags = FLAGS64_NZ(temp64); + flags |= (DPARAM1 >> (shift - 1)) & FLAG_C; + } DPARAM0 = temp64; break; @@ -2108,7 +2254,6 @@ void drcbe_c::output_parameter(drcbec_instruction **dstptr, void **immedptr, int { drcbec_instruction *dst = *dstptr; void *immed = *immedptr; - parameter temp_param; switch (param.type()) { @@ -2145,8 +2290,7 @@ void drcbe_c::output_parameter(drcbec_instruction **dstptr, void **immedptr, int // convert mapvars to immediates case parameter::PTYPE_MAPVAR: - temp_param = m_map.get_last_value(param.mapvar()); - return output_parameter(dstptr, immedptr, size, temp_param); + return output_parameter(dstptr, immedptr, size, param.mapvar()); // memory just points to the memory case parameter::PTYPE_MEMORY: @@ -2239,7 +2383,7 @@ int drcbe_c::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src // store the results dsthi = hi; dstlo = lo; - return ((hi >> 60) & FLAG_S) | ((dsthi != 0) << 1); + return ((hi >> 60) & FLAG_S) | ((hi != 0) << 1); } @@ -2290,7 +2434,7 @@ int drcbe_c::dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2, // store the results dsthi = hi; dstlo = lo; - return ((hi >> 60) & FLAG_S) | ((dsthi != ((int64_t)lo >> 63)) << 1); + return ((hi >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1); } uint32_t drcbe_c::tzcount32(uint32_t value) diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 96f4b9142b4..17b25bba958 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -324,6 +324,7 @@ const drcbe_x64::opcode_table_entry drcbe_x64::s_opcode_table_source[] = // Control Flow Operations { uml::OP_NOP, &drcbe_x64::op_nop }, // NOP + { uml::OP_BREAK, &drcbe_x64::op_break }, // BREAK { uml::OP_DEBUG, &drcbe_x64::op_debug }, // DEBUG pc { uml::OP_EXIT, &drcbe_x64::op_exit }, // EXIT src1[,c] { uml::OP_HASHJMP, &drcbe_x64::op_hashjmp }, // HASHJMP mode,pc,handle @@ -339,6 +340,7 @@ const drcbe_x64::opcode_table_entry drcbe_x64::s_opcode_table_source[] = { uml::OP_GETFMOD, &drcbe_x64::op_getfmod }, // GETFMOD dst { uml::OP_GETEXP, &drcbe_x64::op_getexp }, // GETEXP dst { uml::OP_GETFLGS, &drcbe_x64::op_getflgs }, // GETFLGS dst[,f] + { uml::OP_SETFLGS, &drcbe_x64::op_setflgs }, // SETFLGS src { uml::OP_SAVE, &drcbe_x64::op_save }, // SAVE dst { uml::OP_RESTORE, &drcbe_x64::op_restore }, // RESTORE dst @@ -362,7 +364,9 @@ const drcbe_x64::opcode_table_entry drcbe_x64::s_opcode_table_source[] = { uml::OP_SUBB, &drcbe_x64::op_subc }, // SUBB dst,src1,src2[,f] { uml::OP_CMP, &drcbe_x64::op_cmp }, // CMP src1,src2[,f] { uml::OP_MULU, &drcbe_x64::op_mulu }, // MULU dst,edst,src1,src2[,f] + { uml::OP_MULULW, &drcbe_x64::op_mululw }, // MULULW dst,src1,src2[,f] { uml::OP_MULS, &drcbe_x64::op_muls }, // MULS dst,edst,src1,src2[,f] + { uml::OP_MULSLW, &drcbe_x64::op_mulslw }, // MULSLW dst,src1,src2[,f] { uml::OP_DIVU, &drcbe_x64::op_divu }, // DIVU dst,edst,src1,src2[,f] { uml::OP_DIVS, &drcbe_x64::op_divs }, // DIVS dst,edst,src1,src2[,f] { uml::OP_AND, &drcbe_x64::op_and }, // AND dst,src1,src2[,f] @@ -1059,33 +1063,188 @@ void drcbe_x64::alu_op_param(Assembler &a, Inst::Id const opcode, Operand const // use temporary register for memory,memory Gp const tmp = is64 ? param.select_register(rax) : param.select_register(eax); - a.mov(tmp, MABS(param.memory())); // mov tmp,param - a.emit(opcode, dst, tmp); // op [dst],tmp + a.mov(tmp, MABS(param.memory())); + a.emit(opcode, dst, tmp); } else if (opcode != Inst::kIdTest) // most instructions are register,memory - a.emit(opcode, dst, MABS(param.memory())); // op dst,[param] + a.emit(opcode, dst, MABS(param.memory())); else // test instruction requires memory,register - a.emit(opcode, MABS(param.memory()), dst); // op [param],dst + a.emit(opcode, MABS(param.memory()), dst); } else if (param.is_int_register()) { Gp const src = Gp::fromTypeAndId(is64 ? RegType::kX86_Gpq : RegType::kX86_Gpd, param.ireg()); - a.emit(opcode, dst, src); // op dst,param + a.emit(opcode, dst, src); } } -void drcbe_x64::shift_op_param(Assembler &a, Inst::Id const opcode, Operand const &dst, be_parameter const ¶m) +void drcbe_x64::calculate_status_flags(Assembler &a, uint32_t instsize, Operand const &dst, u8 flags) +{ + // calculate status flags in a way that does not modify any other status flags + uint32_t flagmask = 0; + + // can't get FLAG_V from lahf so implement it using seto if needed in the future + if (flags & FLAG_C) flagmask |= 0x0100; + if (flags & FLAG_Z) flagmask |= 0x4000; + if (flags & FLAG_S) flagmask |= 0x8000; + if (flags & FLAG_U) flagmask |= 0x0400; + + if ((flags & (FLAG_Z | FLAG_S)) == flags) + { + Gp tempreg = r10; + Gp tempreg2 = r11; + + a.mov(tempreg, rax); + + if (dst.isMem()) + a.mov(tempreg2, dst.as<Mem>()); + else + a.mov(tempreg2, dst.as<Gpq>().r64()); + + a.lahf(); + a.and_(rax, ~flagmask); + if (instsize == 4) + a.test(tempreg2.r32(), tempreg2.r32()); + else + a.test(tempreg2, tempreg2); + a.mov(tempreg2, rax); + + a.lahf(); + a.and_(rax, flagmask); + a.or_(rax, tempreg2); + a.sahf(); + + a.mov(rax, tempreg); + } + else + { + fatalerror("drcbe_x64::calculate_status_flags: unknown flag combination requested: %02x\n", flags); + } +} + +void drcbe_x64::calculate_status_flags_mul(Assembler &a, uint32_t instsize, asmjit::x86::Gp const &lo, asmjit::x86::Gp const &hi) +{ + Gp tempreg = r11; + Gp tempreg2 = r10; + + if (lo.id() == rax.id() || hi.id() == rax.id()) + a.mov(tempreg2, rax); + + a.seto(al); + a.movzx(rax, al); // clear out the rest of rax for lahf + a.mov(tempreg, rax); + + a.lahf(); + a.shl(tempreg, 16); + a.or_(tempreg, rax); + + if (hi.id() == rax.id()) + a.mov(rax, tempreg2); + + if (instsize == 4) + a.test(hi.r32(), hi.r32()); + else + a.test(hi, hi); + + a.lahf(); // will have the sign flag + upper half zero + a.mov(hi, rax); + + if (lo.id() == rax.id()) + a.mov(rax, tempreg2); + + if (instsize == 4) + a.test(lo.r32(), lo.r32()); + else + a.test(lo, lo); + + a.lahf(); // lower half zero + a.and_(rax, hi); // if top and bottom are zero then this will leave the zero flag + a.and_(rax, 0x4000); // zero + a.and_(hi, 0x8000); // sign + a.or_(rax, hi); // combine sign flag from top and zero flags for both + + a.and_(tempreg, ~(0x4000 | 0x8000)); + a.or_(tempreg, rax); + + // restore overflow flag + a.mov(rax, tempreg); + a.shr(rax, 16); + a.add(al, 0x7f); + + a.mov(rax, tempreg); + a.sahf(); +} + +void drcbe_x64::calculate_status_flags_mul_low(Assembler &a, uint32_t instsize, asmjit::x86::Gp const &lo) +{ + // calculate zero, sign flags based on the lower half of the result but keep the overflow from the multiplication + a.seto(dl); + + if (instsize == 4) + a.test(lo.r32(), lo.r32()); + else + a.test(lo, lo); + + // restore overflow flag + a.lahf(); + a.add(dl, 0x7f); + a.sahf(); +} + +void drcbe_x64::shift_op_param(Assembler &a, Inst::Id const opcode, size_t opsize, Operand const &dst, be_parameter const ¶m, bool update_flags) { - Operand shift = cl; if (param.is_immediate()) - shift = imm(param.immediate()); + { + if ((param.immediate() & (opsize * 8 - 1)) == 0) + return; + + a.emit(opcode, dst, imm(param.immediate())); + + if (update_flags) + calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + } else - mov_reg_param(a, ecx, param); + { + Label restore_flags = a.newLabel(); + Label end = a.newLabel(); + + Gp shift = cl; + + a.mov(r10, rax); + a.seto(al); + a.movzx(r11, al); + a.lahf(); // no status flags should change if shift is 0, so preserve flags + + mov_reg_param(a, shift, param); + + a.and_(shift, opsize * 8 - 1); + a.test(shift, shift); + a.short_().jz(restore_flags); + + a.sahf(); // restore flags to keep carry for rolc/rorc + a.mov(rax, r10); + + a.emit(opcode, dst, shift); + + if (update_flags) + calculate_status_flags(a, opsize, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + + a.short_().jmp(end); + + a.bind(restore_flags); + + // restore overflow flag + a.add(r11.r32(), 0x7fffffff); - a.emit(opcode, dst, shift); + // restore other flags + a.sahf(); + a.mov(rax, r10); + + a.bind(end); + } } void drcbe_x64::mov_reg_param(Assembler &a, Gp const ®, be_parameter const ¶m, bool const keepflags) @@ -1396,6 +1555,17 @@ void drcbe_x64::op_nop(Assembler &a, const instruction &inst) // nothing } +//------------------------------------------------- +// op_break - process a BREAK opcode +//------------------------------------------------- + +void drcbe_x64::op_break(Assembler &a, const instruction &inst) +{ + static const char *const message = "break from drc"; + mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)message); + smart_call_r64(a, (x86code *)(uintptr_t)&osd_break_into_debugger, rax); +} + //------------------------------------------------- // op_debug - process a DEBUG opcode @@ -1741,7 +1911,7 @@ void drcbe_x64::op_setfmod(Assembler &a, const instruction &inst) if (srcp.is_immediate()) { int value = srcp.immediate() & 3; - a.mov(MABS(&m_state.fmod), value); // mov [fmod],srcp + a.mov(MABS(&m_state.fmod, 1), value); // mov [fmod],srcp a.ldmxcsr(MABS(&m_near.ssecontrol[value])); // ldmxcsr fp_control[srcp] } @@ -1827,10 +1997,13 @@ void drcbe_x64::op_getflgs(Assembler &a, const instruction &inst) // pick a target register for the general case Gp dstreg = dstp.select_register(eax); + a.lahf(); + a.mov(r10, rax); + // compute mask for flags + // can't get FLAG_V from lahf uint32_t flagmask = 0; if (maskp.immediate() & FLAG_C) flagmask |= 0x001; - if (maskp.immediate() & FLAG_V) flagmask |= 0x800; if (maskp.immediate() & FLAG_Z) flagmask |= 0x040; if (maskp.immediate() & FLAG_S) flagmask |= 0x080; if (maskp.immediate() & FLAG_U) flagmask |= 0x004; @@ -1923,10 +2096,20 @@ void drcbe_x64::op_getflgs(Assembler &a, const instruction &inst) // default cases default: - a.pushfq(); // pushf - a.pop(eax); // pop eax - a.and_(eax, flagmask); // and eax,flagmask - a.movzx(dstreg, byte_ptr(rbp, rax, 0, offset_from_rbp(&m_near.flagsmap[0]))); // movzx dstreg,[flags_map] + if (maskp.immediate() & FLAG_V) + { + a.seto(al); + a.movzx(eax, al); + a.shl(eax, 1); + } + + a.mov(r11, r10); + a.shr(r11, 8); + a.and_(r11, flagmask); + a.movzx(dstreg, byte_ptr(rbp, r11, 0, offset_from_rbp(&m_near.flagsmap[0]))); // movzx dstreg,[flags_map] + + if (maskp.immediate() & FLAG_V) + a.or_(dstreg, eax); break; } @@ -1937,6 +2120,42 @@ void drcbe_x64::op_getflgs(Assembler &a, const instruction &inst) // 64-bit form else if (inst.size() == 8) mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg + + if (maskp.immediate() & FLAG_V) + { + // Restore overflow flag + a.mov(eax, dstreg); + a.shr(eax, 1); + a.and_(eax, 1); + a.add(al, 0x7f); + } + + a.mov(rax, r10); + a.sahf(); +} + + +//------------------------------------------------- +// op_setflgs - process a SETFLGS opcode +//------------------------------------------------- + +void drcbe_x64::op_setflgs(Assembler &a, const instruction &inst) +{ + assert(inst.size() == 4); + assert_no_condition(inst); + assert_no_flags(inst); + + be_parameter srcp(*this, inst.param(0), PTYPE_MRI); + + a.pushfq(); + + mov_reg_param(a, rax, srcp); + + a.mov(rax, ptr(rbp, rax, 3, offset_from_rbp(&m_near.flagsunmap[0]))); + a.and_(qword_ptr(rsp), ~0x8c5); + a.or_(qword_ptr(rsp), rax); + + a.popfq(); } @@ -1975,7 +2194,7 @@ void drcbe_x64::op_save(Assembler &a, const instruction &inst) for (int regnum = 0; regnum < std::size(m_state.r); regnum++) { if (int_register_map[regnum] != 0) - a.mov(ptr(rcx, regoffs + 8 * regnum), Gpq(regnum)); + a.mov(ptr(rcx, regoffs + 8 * regnum), Gpq(int_register_map[regnum])); else { a.mov(rax, MABS(&m_state.r[regnum].d)); @@ -1988,7 +2207,7 @@ void drcbe_x64::op_save(Assembler &a, const instruction &inst) for (int regnum = 0; regnum < std::size(m_state.f); regnum++) { if (float_register_map[regnum] != 0) - a.movsd(ptr(rcx, regoffs + 8 * regnum), Xmm(regnum)); + a.movsd(ptr(rcx, regoffs + 8 * regnum), Xmm(float_register_map[regnum])); else { a.mov(rax, MABS(&m_state.f[regnum].d)); @@ -2019,7 +2238,7 @@ void drcbe_x64::op_restore(Assembler &a, const instruction &inst) for (int regnum = 0; regnum < std::size(m_state.r); regnum++) { if (int_register_map[regnum] != 0) - a.mov(Gpq(regnum), ptr(rcx, regoffs + 8 * regnum)); + a.mov(Gpq(int_register_map[regnum]), ptr(rcx, regoffs + 8 * regnum)); else { a.mov(rax, ptr(rcx, regoffs + 8 * regnum)); @@ -2032,7 +2251,7 @@ void drcbe_x64::op_restore(Assembler &a, const instruction &inst) for (int regnum = 0; regnum < std::size(m_state.f); regnum++) { if (float_register_map[regnum] != 0) - a.movsd(Xmm(regnum), ptr(rcx, regoffs + 8 * regnum)); + a.movsd(Xmm(float_register_map[regnum]), ptr(rcx, regoffs + 8 * regnum)); else { a.mov(rax, ptr(rcx, regoffs + 8 * regnum)); @@ -2053,7 +2272,7 @@ void drcbe_x64::op_restore(Assembler &a, const instruction &inst) // copy flags a.movzx(eax, byte_ptr(rcx, offsetof(drcuml_machine_state, flags))); // movzx eax,state->flags - a.push(ptr(rbp, rax, 3, offset_from_rbp(&m_near.flagsunmap[0]))); // push flags_unmap[eax*8] + a.push(qword_ptr(rbp, rax, 3, offset_from_rbp(&m_near.flagsunmap[0]))); // push flags_unmap[eax*8] a.popfq(); // popf } @@ -2087,7 +2306,7 @@ void drcbe_x64::op_load(Assembler &a, const instruction &inst) Gp basereg = get_base_register_and_offset(a, basep.memory(), rdx, baseoffs); // pick a target register for the general case - Gp dstreg = dstp.select_register(eax); + Gp dstreg = (inst.size() == 4) ? dstp.select_register(eax) : dstp.select_register(rax); // immediate index if (indp.is_immediate()) @@ -2095,13 +2314,13 @@ void drcbe_x64::op_load(Assembler &a, const instruction &inst) s32 const offset = baseoffs + (s32(indp.immediate()) << scalesizep.scale()); if (size == SIZE_BYTE) - a.movzx(dstreg, byte_ptr(basereg, offset)); // movzx dstreg,[basep + scale*indp] + a.movzx(dstreg, byte_ptr(basereg, offset)); else if (size == SIZE_WORD) - a.movzx(dstreg, word_ptr(basereg, offset)); // movzx dstreg,[basep + scale*indp] + a.movzx(dstreg, word_ptr(basereg, offset)); else if (size == SIZE_DWORD) - a.mov(dstreg, ptr(basereg, offset)); // mov dstreg,[basep + scale*indp] + a.mov(dstreg, dword_ptr(basereg, offset)); else if (size == SIZE_QWORD) - a.mov(dstreg.r64(), ptr(basereg, offset)); // mov dstreg,[basep + scale*indp] + a.mov(dstreg, ptr(basereg, offset)); } // other index @@ -2110,20 +2329,17 @@ void drcbe_x64::op_load(Assembler &a, const instruction &inst) Gp indreg = indp.select_register(rcx); movsx_r64_p32(a, indreg, indp); if (size == SIZE_BYTE) - a.movzx(dstreg, byte_ptr(basereg, indreg, scalesizep.scale(), baseoffs)); // movzx dstreg,[basep + scale*indp] + a.movzx(dstreg, byte_ptr(basereg, indreg, scalesizep.scale(), baseoffs)); else if (size == SIZE_WORD) - a.movzx(dstreg, word_ptr(basereg, indreg, scalesizep.scale(), baseoffs)); // movzx dstreg,[basep + scale*indp] + a.movzx(dstreg, word_ptr(basereg, indreg, scalesizep.scale(), baseoffs)); else if (size == SIZE_DWORD) - a.mov(dstreg, ptr(basereg, indreg, scalesizep.scale(), baseoffs)); // mov dstreg,[basep + scale*indp] + a.mov(dstreg, dword_ptr(basereg, indreg, scalesizep.scale(), baseoffs)); else if (size == SIZE_QWORD) - a.mov(dstreg.r64(), ptr(basereg, indreg, scalesizep.scale(), baseoffs)); // mov dstreg,[basep + scale*indp] + a.mov(dstreg, ptr(basereg, indreg, scalesizep.scale(), baseoffs)); } // store result - if (inst.size() == 4) - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg - else - mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg + mov_param_reg(a, dstp, dstreg); } @@ -2645,33 +2861,44 @@ void drcbe_x64::op_carry(Assembler &a, const instruction &inst) // degenerate case: source is immediate if (srcp.is_immediate() && bitp.is_immediate()) { - if (srcp.immediate() & ((uint64_t)1 << bitp.immediate())) + if (srcp.immediate() & ((uint64_t)1 << (bitp.immediate() & (inst.size() * 8 - 1)))) a.stc(); else a.clc(); + + return; } // load non-immediate bit numbers into a register + + Gp const bitreg = rcx; if (!bitp.is_immediate()) { - mov_reg_param(a, ecx, bitp); - a.and_(ecx, inst.size() * 8 - 1); + mov_reg_param(a, bitreg, bitp); + a.and_(bitreg, inst.size() * 8 - 1); } if (srcp.is_memory()) { if (bitp.is_immediate()) - a.bt(MABS(srcp.memory(), inst.size()), bitp.immediate()); // bt [srcp],bitp + a.bt(MABS(srcp.memory(), inst.size()), (bitp.immediate() & (inst.size() * 8 - 1))); else - a.bt(MABS(srcp.memory(), inst.size()), ecx); // bt [srcp],ecx + a.bt(MABS(srcp.memory(), inst.size()), bitreg); } else if (srcp.is_int_register()) { - Gp const src = Gp::fromTypeAndId((inst.size() == 4) ? RegType::kX86_Gpd : RegType::kX86_Gpq, srcp.ireg()); + Gp const src = Gp::fromTypeAndId(RegType::kX86_Gpq, srcp.ireg()); if (bitp.is_immediate()) - a.bt(src, bitp.immediate()); // bt srcp,bitp + a.bt(src, (bitp.immediate() & (inst.size() * 8 - 1))); else - a.bt(src, ecx); // bt srcp,ecx + a.bt(src, bitreg); + } + else if (srcp.is_immediate()) + { + a.push(rax); + mov_reg_param(a, rax, srcp); + a.bt(rax, bitreg); + a.pop(rax); } } @@ -2718,32 +2945,40 @@ void drcbe_x64::op_mov(Assembler &a, const instruction &inst) // add a conditional branch unless a conditional move is possible Label skip = a.newLabel(); if (inst.condition() != uml::COND_ALWAYS && !(dstp.is_int_register() && !srcp.is_immediate())) - a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // jcc skip + a.short_().j(X86_NOT_CONDITION(inst.condition()), skip); // register to memory if (dstp.is_memory() && srcp.is_int_register()) { Gp const src = Gp::fromTypeAndId((inst.size() == 4) ? RegType::kX86_Gpd : RegType::kX86_Gpq, srcp.ireg()); - a.mov(MABS(dstp.memory()), src); // mov [dstp],srcp + a.mov(MABS(dstp.memory()), src); } // immediate to memory else if (dstp.is_memory() && srcp.is_immediate() && short_immediate(srcp.immediate())) - a.mov(MABS(dstp.memory(), inst.size()), s32(srcp.immediate())); // mov [dstp],srcp + a.mov(MABS(dstp.memory(), inst.size()), s32(srcp.immediate())); // conditional memory to register - else if (inst.condition() != 0 && dstp.is_int_register() && srcp.is_memory()) + else if (dstp.is_int_register() && srcp.is_memory()) { Gp const dst = Gp::fromTypeAndId((inst.size() == 4) ? RegType::kX86_Gpd : RegType::kX86_Gpq, dstp.ireg()); - a.cmov(X86_CONDITION(inst.condition()), dst, MABS(srcp.memory())); // cmovcc dstp,[srcp] + + if (inst.condition() != uml::COND_ALWAYS) + a.cmov(X86_CONDITION(inst.condition()), dst, MABS(srcp.memory())); + else + a.mov(dst, MABS(srcp.memory())); } // conditional register to register - else if (inst.condition() != 0 && dstp.is_int_register() && srcp.is_int_register()) + else if (dstp.is_int_register() && srcp.is_int_register()) { Gp const src = Gp::fromTypeAndId((inst.size() == 4) ? RegType::kX86_Gpd : RegType::kX86_Gpq, srcp.ireg()); Gp const dst = Gp::fromTypeAndId((inst.size() == 4) ? RegType::kX86_Gpd : RegType::kX86_Gpq, dstp.ireg()); - a.cmov(X86_CONDITION(inst.condition()), dst, src); // cmovcc dstp,srcp + + if (inst.condition() != uml::COND_ALWAYS) + a.cmov(X86_CONDITION(inst.condition()), dst, src); + else + a.mov(dst, src); } // general case @@ -2751,8 +2986,8 @@ void drcbe_x64::op_mov(Assembler &a, const instruction &inst) { Gp dstreg = (inst.size() == 4) ? dstp.select_register(eax) : dstp.select_register(rax); - mov_reg_param(a, dstreg, srcp, true); // mov dstreg,srcp - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, dstreg, srcp, true); + mov_param_reg(a, dstp, dstreg); } // resolve the jump @@ -2789,22 +3024,32 @@ void drcbe_x64::op_sext(Assembler &a, const instruction &inst) if (srcp.is_memory()) { if (sizep.size() == SIZE_BYTE) - a.movsx(dstreg, MABS(srcp.memory(), 1)); // movsx dstreg,[srcp] + a.movsx(dstreg, MABS(srcp.memory(), 1)); else if (sizep.size() == SIZE_WORD) - a.movsx(dstreg, MABS(srcp.memory(), 2)); // movsx dstreg,[srcp] + a.movsx(dstreg, MABS(srcp.memory(), 2)); else if (sizep.size() == SIZE_DWORD) - a.mov(dstreg, MABS(srcp.memory())); // mov dstreg,[srcp] + a.mov(dstreg, MABS(srcp.memory())); } else if (srcp.is_int_register()) { if (sizep.size() == SIZE_BYTE) - a.movsx(dstreg, GpbLo(srcp.ireg())); // movsx dstreg,srcp + a.movsx(dstreg, GpbLo(srcp.ireg())); else if (sizep.size() == SIZE_WORD) - a.movsx(dstreg, Gpw(srcp.ireg())); // movsx dstreg,srcp + a.movsx(dstreg, Gpw(srcp.ireg())); else if (sizep.size() == SIZE_DWORD) - a.mov(dstreg, Gpd(srcp.ireg())); // mov dstreg,srcp + a.mov(dstreg, Gpd(srcp.ireg())); } - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + else if (srcp.is_immediate()) + { + if (sizep.size() == SIZE_BYTE) + a.mov(dstreg, (int8_t)srcp.immediate()); + else if (sizep.size() == SIZE_WORD) + a.mov(dstreg, (int16_t)srcp.immediate()); + else if (sizep.size() == SIZE_DWORD) + a.mov(dstreg, (int32_t)srcp.immediate()); + } + + mov_param_reg(a, dstp, dstreg); } // 64-bit form @@ -2814,30 +3059,42 @@ void drcbe_x64::op_sext(Assembler &a, const instruction &inst) if (srcp.is_memory()) { if (sizep.size() == SIZE_BYTE) - a.movsx(dstreg, MABS(srcp.memory(), 1)); // movsx dstreg,[srcp] + a.movsx(dstreg, MABS(srcp.memory(), 1)); else if (sizep.size() == SIZE_WORD) - a.movsx(dstreg, MABS(srcp.memory(), 2)); // movsx dstreg,[srcp] + a.movsx(dstreg, MABS(srcp.memory(), 2)); else if (sizep.size() == SIZE_DWORD) - a.movsxd(dstreg, MABS(srcp.memory(), 4)); // movsxd dstreg,[srcp] + a.movsxd(dstreg, MABS(srcp.memory(), 4)); else if (sizep.size() == SIZE_QWORD) - a.mov(dstreg, MABS(srcp.memory())); // mov dstreg,[srcp] + a.mov(dstreg, MABS(srcp.memory())); } else if (srcp.is_int_register()) { if (sizep.size() == SIZE_BYTE) - a.movsx(dstreg, GpbLo(srcp.ireg())); // movsx dstreg,srcp + a.movsx(dstreg, GpbLo(srcp.ireg())); else if (sizep.size() == SIZE_WORD) - a.movsx(dstreg, Gpw(srcp.ireg())); // movsx dstreg,srcp + a.movsx(dstreg, Gpw(srcp.ireg())); else if (sizep.size() == SIZE_DWORD) - a.movsxd(dstreg, Gpd(srcp.ireg())); // movsxd dstreg,srcp + a.movsxd(dstreg, Gpd(srcp.ireg())); else if (sizep.size() == SIZE_QWORD) - a.mov(dstreg, Gpq(srcp.ireg())); // mov dstreg,srcp + a.mov(dstreg, Gpq(srcp.ireg())); } - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + else if (srcp.is_immediate()) + { + if (sizep.size() == SIZE_BYTE) + a.mov(dstreg, (int8_t)srcp.immediate()); + else if (sizep.size() == SIZE_WORD) + a.mov(dstreg, (int16_t)srcp.immediate()); + else if (sizep.size() == SIZE_DWORD) + a.mov(dstreg, (int32_t)srcp.immediate()); + else if (sizep.size() == SIZE_QWORD) + a.mov(dstreg, (int64_t)srcp.immediate()); + } + + mov_param_reg(a, dstp, dstreg); } if (inst.flags() != 0) - a.test(dstreg, dstreg); // test dstreg,dstreg + a.test(dstreg, dstreg); } @@ -2861,10 +3118,9 @@ void drcbe_x64::op_roland(Assembler &a, const instruction &inst) // pick a target register Gp dstreg = (inst.size() == 4) ? dstp.select_register(eax, shiftp, maskp) : dstp.select_register(rax, shiftp, maskp); - mov_reg_param(a, dstreg, srcp); // mov dstreg,srcp - if (!shiftp.is_immediate_value(0)) - shift_op_param(a, Inst::kIdRol, dstreg, shiftp); // rol dstreg,shiftp - alu_op_param(a, Inst::kIdAnd, dstreg, maskp, // and dstreg,maskp + mov_reg_param(a, dstreg, srcp); + shift_op_param(a, Inst::kIdRol, inst.size(), dstreg, shiftp, false); + alu_op_param(a, Inst::kIdAnd, dstreg, maskp, [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize all-zero and all-one cases @@ -2905,24 +3161,23 @@ void drcbe_x64::op_rolins(Assembler &a, const instruction &inst) // pick a target register Gp dstreg = dstp.select_register(ecx, shiftp, maskp); - mov_reg_param(a, eax, srcp); // mov eax,srcp - if (!shiftp.is_immediate_value(0)) - shift_op_param(a, Inst::kIdRol, eax, shiftp); // rol eax,shiftp - mov_reg_param(a, dstreg, dstp); // mov dstreg,dstp + mov_reg_param(a, eax, srcp); + shift_op_param(a, Inst::kIdRol, inst.size(), eax, shiftp, false); + mov_reg_param(a, dstreg, dstp); if (maskp.is_immediate()) { - a.and_(eax, maskp.immediate()); // and eax,maskp - a.and_(dstreg, ~maskp.immediate()); // and dstreg,~maskp + a.and_(eax, maskp.immediate()); + a.and_(dstreg, ~maskp.immediate()); } else { - mov_reg_param(a, edx, maskp); // mov edx,maskp - a.and_(eax, edx); // and eax,edx - a.not_(edx); // not edx - a.and_(dstreg, edx); // and dstreg,edx + mov_reg_param(a, edx, maskp); + a.and_(eax, edx); + a.not_(edx); + a.and_(dstreg, edx); } - a.or_(dstreg, eax); // or dstreg,eax - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + a.or_(dstreg, eax); + mov_param_reg(a, dstp, dstreg); } // 64-bit form @@ -2931,16 +3186,15 @@ void drcbe_x64::op_rolins(Assembler &a, const instruction &inst) // pick a target register Gp dstreg = dstp.select_register(rcx, shiftp, maskp); - mov_reg_param(a, rax, srcp); // mov rax,srcp - mov_reg_param(a, rdx, maskp); // mov rdx,maskp - if (!shiftp.is_immediate_value(0)) - shift_op_param(a, Inst::kIdRol, rax, shiftp); // rol rax,shiftp - mov_reg_param(a, dstreg, dstp); // mov dstreg,dstp - a.and_(rax, rdx); // and eax,rdx - a.not_(rdx); // not rdx - a.and_(dstreg, rdx); // and dstreg,rdx - a.or_(dstreg, rax); // or dstreg,rax - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, rax, srcp); + mov_reg_param(a, rdx, maskp); + shift_op_param(a, Inst::kIdRol, inst.size(), rax, shiftp, false); + mov_reg_param(a, dstreg, dstp); + a.and_(rax, rdx); + a.not_(rdx); + a.and_(dstreg, rdx); + a.or_(dstreg, rax); + mov_param_reg(a, dstp, dstreg); } } @@ -3179,9 +3433,6 @@ void drcbe_x64::op_cmp(Assembler &a, const instruction &inst) void drcbe_x64::op_mulu(Assembler &a, const instruction &inst) { - uint8_t zsflags = inst.flags() & (FLAG_Z | FLAG_S); - uint8_t vflag = inst.flags() & FLAG_V; - // validate instruction assert(inst.size() == 4 || inst.size() == 8); assert_no_condition(inst); @@ -3198,112 +3449,111 @@ void drcbe_x64::op_mulu(Assembler &a, const instruction &inst) // 32-bit form if (inst.size() == 4) { + Gp dstreg = eax; + Gp edstreg = edx; + // general case - mov_reg_param(a, eax, src1p); // mov eax,src1p + mov_reg_param(a, dstreg, src1p); if (src2p.is_memory()) - a.mul(MABS(src2p.memory(), 4)); // mul [src2p] + a.mul(MABS(src2p.memory(), 4)); else if (src2p.is_int_register()) - a.mul(Gpd(src2p.ireg())); // mul src2p + a.mul(Gpd(src2p.ireg())); else if (src2p.is_immediate()) { - a.mov(edx, src2p.immediate()); // mov edx,src2p - a.mul(edx); // mul edx + a.mov(edstreg, src2p.immediate()); + a.mul(edstreg); } - mov_param_reg(a, dstp, eax); // mov dstp,eax + mov_param_reg(a, dstp, dstreg); if (compute_hi) - mov_param_reg(a, edstp, edx); // mov edstp,edx - - // compute flags - if (inst.flags() != 0) - { - if (zsflags != 0) - { - if (vflag) - a.pushfq(); // pushf - if (compute_hi) - { - if (zsflags == FLAG_Z) - a.or_(edx, eax); // or edx,eax - else if (zsflags == FLAG_S) - a.test(edx, edx); // test edx,edx - else - { - a.movzx(ecx, ax); // movzx ecx,ax - a.shr(eax, 16); // shr eax,16 - a.or_(edx, ecx); // or edx,ecx - a.or_(edx, eax); // or edx,eax - } - } - else - a.test(eax, eax); // test eax,eax - - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfq(); // pushf - a.pop(rax); // pop rax - a.and_(qword_ptr(rsp), ~0x84); // and [rsp],~0x84 - a.or_(ptr(rsp), rax); // or [rsp],rax - a.popfq(); // popf - } - } - } + mov_param_reg(a, edstp, edstreg); } // 64-bit form else if (inst.size() == 8) { + Gp dstreg = rax; + Gp edstreg = rdx; + // general case - mov_reg_param(a, rax, src1p); // mov rax,src1p + mov_reg_param(a, dstreg, src1p); if (src2p.is_memory()) - a.mul(MABS(src2p.memory(), 8)); // mul [src2p] + a.mul(MABS(src2p.memory(), 8)); else if (src2p.is_int_register()) - a.mul(Gpq(src2p.ireg())); // mul src2p + a.mul(Gpq(src2p.ireg())); else if (src2p.is_immediate()) { - mov_r64_imm(a, rdx, src2p.immediate()); // mov rdx,src2p - a.mul(rdx); // mul rdx + mov_r64_imm(a, edstreg, src2p.immediate()); + a.mul(edstreg); } - mov_param_reg(a, dstp, rax); // mov dstp,rax + mov_param_reg(a, dstp, dstreg); if (compute_hi) - mov_param_reg(a, edstp, rdx); // mov edstp,rdx + mov_param_reg(a, edstp, edstreg); + } - // compute flags - if (inst.flags() != 0) + if (inst.flags()) + calculate_status_flags_mul(a, inst.size(), rax, rdx); +} + + +//------------------------------------------------- +// op_mululw - process a MULULW (32x32=32) opcode +//------------------------------------------------- + +void drcbe_x64::op_mululw(Assembler &a, const instruction &inst) +{ + // validate instruction + assert(inst.size() == 4 || inst.size() == 8); + assert_no_condition(inst); + assert_flags(inst, FLAG_V | FLAG_Z | FLAG_S); + + // normalize parameters + be_parameter dstp(*this, inst.param(0), PTYPE_MR); + be_parameter src1p(*this, inst.param(1), PTYPE_MRI); + be_parameter src2p(*this, inst.param(2), PTYPE_MRI); + normalize_commutative(src1p, src2p); + + // 32-bit form + if (inst.size() == 4) + { + Gp dstreg = eax; + Gp hireg = edx; + + // general case + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.mul(MABS(src2p.memory(), 4)); + else if (src2p.is_int_register()) + a.mul(Gpd(src2p.ireg())); + else if (src2p.is_immediate()) { - if (zsflags != 0) - { - if (vflag) - a.pushfq(); // pushf - if (compute_hi) - { - if (zsflags == FLAG_Z) - a.or_(rdx, rax); // or rdx,rax - else if (zsflags == FLAG_S) - a.test(rdx, rdx); // test rdx,rdx - else - { - a.mov(ecx, eax); // mov ecx,eax - a.shr(rax, 32); // shr rax,32 - a.or_(rdx, rcx); // or rdx,rcx - a.or_(rdx, rax); // or rdx,rax - } - } - else - a.test(rax, rax); // test rax,rax + a.mov(hireg, src2p.immediate()); + a.mul(hireg); + } + mov_param_reg(a, dstp, dstreg); + } - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfq(); // pushf - a.pop(rax); // pop rax - a.and_(qword_ptr(rsp), ~0x84); // and [rsp],~0x84 - a.or_(ptr(rsp), rax); // or [rsp],rax - a.popfq(); // popf - } - } + // 64-bit form + else if (inst.size() == 8) + { + Gp dstreg = rax; + Gp hireg = rdx; + + // general case + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.mul(MABS(src2p.memory(), 8)); + else if (src2p.is_int_register()) + a.mul(Gpq(src2p.ireg())); + else if (src2p.is_immediate()) + { + mov_r64_imm(a, hireg, src2p.immediate()); + a.mul(hireg); } + mov_param_reg(a, dstp, dstreg); } + + if (inst.flags()) + calculate_status_flags_mul_low(a, inst.size(), rax); } @@ -3313,9 +3563,6 @@ void drcbe_x64::op_mulu(Assembler &a, const instruction &inst) void drcbe_x64::op_muls(Assembler &a, const instruction &inst) { - uint8_t zsflags = inst.flags() & (FLAG_Z | FLAG_S); - uint8_t vflag = inst.flags() & FLAG_V; - // validate instruction assert(inst.size() == 4 || inst.size() == 8); assert_no_condition(inst); @@ -3332,162 +3579,107 @@ void drcbe_x64::op_muls(Assembler &a, const instruction &inst) // 32-bit form if (inst.size() == 4) { - // 32-bit destination with memory/immediate or register/immediate - if (!compute_hi && !src1p.is_immediate() && src2p.is_immediate()) - { - Gp dstreg = dstp.is_int_register() ? Gpd(dstp.ireg()) : eax; - if (src1p.is_memory()) - a.imul(dstreg, MABS(src1p.memory()), src2p.immediate()); // imul dstreg,[src1p],src2p - else if (src1p.is_int_register()) - a.imul(dstreg, Gpd(src1p.ireg()), src2p.immediate()); // imul dstreg,src1p,src2p - mov_param_reg(a, dstp, dstreg); // mov dstp,eax - } - - // 32-bit destination, general case - else if (!compute_hi) - { - Gp dstreg = dstp.is_int_register() ? Gpd(dstp.ireg()) : eax; - mov_reg_param(a, dstreg, src1p); // mov dstreg,src1p - if (src2p.is_memory()) - a.imul(dstreg, MABS(src2p.memory())); // imul dstreg,[src2p] - else if (src2p.is_int_register()) - a.imul(dstreg, Gpd(src2p.ireg())); // imul dstreg,src2p - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg - } - - // 64-bit destination, general case - else - { - mov_reg_param(a, eax, src1p); // mov eax,src1p - if (src2p.is_memory()) - a.imul(MABS(src2p.memory(), 4)); // imul [src2p] - else if (src2p.is_int_register()) - a.imul(Gpd(src2p.ireg())); // imul src2p - else if (src2p.is_immediate()) - { - a.mov(edx, src2p.immediate()); // mov edx,src2p - a.imul(edx); // imul edx - } - mov_param_reg(a, dstp, eax); // mov dstp,eax - mov_param_reg(a, edstp, edx); // mov edstp,edx - } + Gp dstreg = eax; + Gp edstreg = edx; - // compute flags - if (inst.flags() != 0) + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.imul(MABS(src2p.memory(), 4)); + else if (src2p.is_int_register()) + a.imul(Gpd(src2p.ireg())); + else if (src2p.is_immediate()) { - if (zsflags != 0) - { - if (vflag) - a.pushfq(); // pushf - if (compute_hi) - { - if (zsflags == FLAG_Z) - a.or_(edx, eax); // or edx,eax - else if (zsflags == FLAG_S) - a.test(edx, edx); // test edx,edx - else - { - a.movzx(ecx, ax); // movzx ecx,ax - a.shr(eax, 16); // shr eax,16 - a.or_(edx, ecx); // or edx,ecx - a.or_(edx, eax); // or edx,eax - } - } - else - a.test(eax, eax); // test eax,eax - - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfq(); // pushf - a.pop(rax); // pop rax - a.and_(qword_ptr(rsp), ~0x84); // and [rsp],~0x84 - a.or_(ptr(rsp), rax); // or [rsp],rax - a.popfq(); // popf - } - } + a.mov(edstreg, src2p.immediate()); + a.imul(edstreg); } + mov_param_reg(a, dstp, dstreg); + if (compute_hi) + mov_param_reg(a, edstp, edstreg); } // 64-bit form else if (inst.size() == 8) { - // 64-bit destination with memory/immediate or register/immediate - if (!compute_hi && !src1p.is_immediate() && src2p.is_immediate() && short_immediate(src2p.immediate())) - { - Gp dstreg = dstp.is_int_register() ? Gpq(dstp.ireg()) : rax; - if (src1p.is_memory()) - a.imul(dstreg, MABS(src1p.memory()), src2p.immediate()); // imul dstreg,[src1p],src2p - else if (src1p.is_int_register()) - a.imul(dstreg, Gpq(src1p.ireg()), src2p.immediate()); // imul rax,src1p,src2p - mov_param_reg(a, dstp, dstreg); // mov dstp,rax - } + Gp dstreg = rax; + Gp edstreg = rdx; - // 64-bit destination, general case - else if (!compute_hi) + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.imul(MABS(src2p.memory(), 8)); + else if (src2p.is_int_register()) + a.imul(Gpq(src2p.ireg())); + else if (src2p.is_immediate()) { - Gp dstreg = dstp.is_int_register() ? Gpq(dstp.ireg()) : rax; - mov_reg_param(a, dstreg, src1p); // mov dstreg,src1p - if (src2p.is_memory()) - a.imul(dstreg, MABS(src2p.memory())); // imul dstreg,[src2p] - else if (src2p.is_int_register()) - a.imul(dstreg, Gpq(src2p.ireg())); // imul dstreg,src2p - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_r64_imm(a, edstreg, src2p.immediate()); + a.imul(edstreg); } + mov_param_reg(a, dstp, dstreg); + if (compute_hi) + mov_param_reg(a, edstp, edstreg); + } - // 128-bit destination, general case - else + if (inst.flags()) + calculate_status_flags_mul(a, inst.size(), rax, rdx); +} + + +//------------------------------------------------- +// op_mulslw - process a MULSLW (32x32=32) opcode +//------------------------------------------------- + +void drcbe_x64::op_mulslw(Assembler &a, const instruction &inst) +{ + // validate instruction + assert(inst.size() == 4 || inst.size() == 8); + assert_no_condition(inst); + assert_flags(inst, FLAG_V | FLAG_Z | FLAG_S); + + // normalize parameters + be_parameter dstp(*this, inst.param(0), PTYPE_MR); + be_parameter src1p(*this, inst.param(1), PTYPE_MRI); + be_parameter src2p(*this, inst.param(2), PTYPE_MRI); + normalize_commutative(src1p, src2p); + + // 32-bit form + if (inst.size() == 4) + { + Gp dstreg = eax; + Gp hireg = edx; + + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.imul(MABS(src2p.memory(), 4)); + else if (src2p.is_int_register()) + a.imul(Gpd(src2p.ireg())); + else if (src2p.is_immediate()) { - mov_reg_param(a, rax, src1p); // mov rax,src1p - if (src2p.is_memory()) - a.imul(MABS(src2p.memory(), 8)); // imul [src2p] - else if (src2p.is_int_register()) - a.imul(Gpq(src2p.ireg())); // imul src2p - else if (src2p.is_immediate()) - { - mov_r64_imm(a, rdx, src2p.immediate()); // mov rdx,src2p - a.imul(rdx); // imul rdx - } - mov_param_reg(a, dstp, rax); // mov dstp,rax - mov_param_reg(a, edstp, rdx); // mov edstp,rdx + a.mov(hireg, src2p.immediate()); + a.imul(hireg); } + mov_param_reg(a, dstp, dstreg); + } - // compute flags - if (inst.flags() != 0) - { - if (zsflags != 0) - { - if (vflag) - a.pushfq(); // pushf - if (compute_hi) - { - if (zsflags == FLAG_Z) - a.or_(rdx, rax); // or rdx,rax - else if (zsflags == FLAG_S) - a.test(rdx, rdx); // test rdx,rdx - else - { - a.mov(ecx, eax); // mov ecx,eax - a.shr(rax, 32); // shr rax,32 - a.or_(rdx, rcx); // or rdx,rcx - a.or_(rdx, rax); // or rdx,rax - } - } - else - a.test(rax, rax); // test rax,rax + // 64-bit form + else if (inst.size() == 8) + { + Gp dstreg = rax; + Gp hireg = rdx; - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfq(); // pushf - a.pop(rax); // pop rax - a.and_(qword_ptr(rsp), ~0x84); // and [rsp],~0x84 - a.or_(ptr(rsp), rax); // or [rsp],rax - a.popfq(); // popf - } - } + mov_reg_param(a, dstreg, src1p); + if (src2p.is_memory()) + a.imul(MABS(src2p.memory(), 8)); + else if (src2p.is_int_register()) + a.imul(Gpq(src2p.ireg())); + else if (src2p.is_immediate()) + { + mov_r64_imm(a, hireg, src2p.immediate()); + a.imul(hireg); } + mov_param_reg(a, dstp, dstreg); } + + if (inst.flags()) + calculate_status_flags_mul_low(a, inst.size(), rax); } @@ -3953,18 +4145,27 @@ void drcbe_x64::op_lzcnt(Assembler &a, const instruction &inst) be_parameter dstp(*this, inst.param(0), PTYPE_MR); be_parameter srcp(*this, inst.param(1), PTYPE_MRI); + if (inst.flags()) + { + a.xor_(eax, eax); // reset status flags + a.test(eax, eax); + } + // 32-bit form if (inst.size() == 4) { // pick a target register Gp dstreg = dstp.select_register(eax); - mov_reg_param(a, dstreg, srcp); // mov dstreg,src1p - a.mov(ecx, 32 ^ 31); // mov ecx,32 ^ 31 - a.bsr(dstreg, dstreg); // bsr dstreg,dstreg - a.cmovz(dstreg, ecx); // cmovz dstreg,ecx - a.xor_(dstreg, 31); // xor dstreg,31 - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, dstreg, srcp); + a.mov(ecx, 32 ^ 31); + a.bsr(dstreg, dstreg); + a.cmovz(dstreg, ecx); + a.xor_(dstreg, 31); + mov_param_reg(a, dstp, dstreg); + + if (inst.flags()) + a.test(dstreg, dstreg); } // 64-bit form @@ -3973,12 +4174,15 @@ void drcbe_x64::op_lzcnt(Assembler &a, const instruction &inst) // pick a target register Gp dstreg = dstp.select_register(rax); - mov_reg_param(a, dstreg, srcp); // mov dstreg,src1p - a.mov(ecx, 64 ^ 63); // mov ecx,64 ^ 63 - a.bsr(dstreg, dstreg); // bsr dstreg,dstreg - a.cmovz(dstreg, rcx); // cmovz dstreg,rcx - a.xor_(dstreg, 63); // xor dstreg,63 - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, dstreg, srcp); + a.mov(ecx, 64 ^ 63); + a.bsr(dstreg, dstreg); + a.cmovz(dstreg, rcx); + a.xor_(dstreg, 63); + mov_param_reg(a, dstp, dstreg); + + if (inst.flags()) + a.test(dstreg, dstreg); } } @@ -3998,16 +4202,22 @@ void drcbe_x64::op_tzcnt(Assembler &a, const instruction &inst) be_parameter dstp(*this, inst.param(0), PTYPE_MR); be_parameter srcp(*this, inst.param(1), PTYPE_MRI); + if (inst.flags()) + { + a.xor_(eax, eax); // reset status flags + a.test(eax, eax); + } + // 32-bit form if (inst.size() == 4) { Gp dstreg = dstp.select_register(eax); - mov_reg_param(a, dstreg, srcp); // mov dstreg,srcp - a.mov(ecx, 32); // mov ecx,32 - a.bsf(dstreg, dstreg); // bsf dstreg,dstreg - a.cmovz(dstreg, ecx); // cmovz dstreg,ecx - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, dstreg, srcp); + a.mov(ecx, 32); + a.bsf(dstreg, dstreg); + a.cmovz(dstreg, ecx); + mov_param_reg(a, dstp, dstreg); } // 64-bit form @@ -4015,11 +4225,11 @@ void drcbe_x64::op_tzcnt(Assembler &a, const instruction &inst) { Gp dstreg = dstp.select_register(rax); - mov_reg_param(a, dstreg, srcp); // mov dstreg,srcp - a.mov(ecx, 64); // mov ecx,64 - a.bsf(dstreg, dstreg); // bsf dstreg,dstreg - a.cmovz(dstreg, rcx); // cmovz dstreg,rcx - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_reg_param(a, dstreg, srcp); + a.mov(rcx, 64); + a.bsf(dstreg, dstreg); + a.cmovz(dstreg, rcx); + mov_param_reg(a, dstp, dstreg); } } @@ -4064,25 +4274,25 @@ template <Inst::Id Opcode> void drcbe_x64::op_shift(Assembler &a, const uml::ins const bool carry = (Opcode == Inst::kIdRcl) || (Opcode == Inst::kIdRcr); // optimize immediate zero case - if (carry || inst.flags() || !src2p.is_immediate_value(0)) + if (!carry && !inst.flags() && src2p.is_immediate() && (src2p.immediate() & (inst.size() * 8 - 1)) == 0) + return; + + // dstp == src1p in memory + if (dstp.is_memory() && dstp == src1p) + shift_op_param(a, Opcode, inst.size(), MABS(dstp.memory(), inst.size()), src2p, true); + + // general case + else { - // dstp == src1p in memory - if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Opcode, MABS(dstp.memory(), inst.size()), src2p); // op [dstp],src2p + // pick a target register + Gp dstreg = (inst.size() == 4) ? dstp.select_register(eax, src2p) : dstp.select_register(rax, src2p); - // general case + if (carry) + mov_reg_param(a, dstreg, src1p, true); else - { - // pick a target register - Gp dstreg = (inst.size() == 4) ? dstp.select_register(eax, src2p) : dstp.select_register(rax, src2p); - - if (carry) - mov_reg_param(a, dstreg, src1p, true); // mov dstreg,src1p - else - mov_reg_param(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Opcode, dstreg, src2p); // op dstreg,src2p - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg - } + mov_reg_param(a, dstreg, src1p); + shift_op_param(a, Opcode, inst.size(), dstreg, src2p, true); + mov_param_reg(a, dstp, dstreg); } } @@ -4800,29 +5010,44 @@ void drcbe_x64::op_fneg(Assembler &a, const instruction &inst) be_parameter dstp(*this, inst.param(0), PTYPE_MF); be_parameter srcp(*this, inst.param(1), PTYPE_MF); - // pick a target register for the general case Xmm dstreg = dstp.select_register(xmm0, srcp); + Xmm tempreg = xmm1; + + // note: using memory addrs with xorpd is dangerous because MAME does not guarantee + // the memory address will be 16 byte aligned so there's a good chance it'll crash + if (srcp.is_memory()) + { + if (inst.size() == 4) + { + a.mov(eax, MABS(srcp.memory())); + a.movd(tempreg, eax); + } + else if (inst.size() == 8) + { + a.mov(rax, MABS(srcp.memory())); + a.movq(tempreg, rax); + } + } - // 32-bit form if (inst.size() == 4) { - a.xorps(dstreg, dstreg); // xorps dstreg,dstreg + a.mov(rax, 0x80000000); + a.movd(dstreg, rax); if (srcp.is_memory()) - a.subss(dstreg, MABS(srcp.memory())); // subss dstreg,[srcp] + a.xorpd(dstreg, tempreg); else if (srcp.is_float_register()) - a.subss(dstreg, Xmm(srcp.freg())); // subss dstreg,srcp - movss_p32_r128(a, dstp, dstreg); // movss dstp,dstreg + a.xorpd(dstreg, Xmm(srcp.freg())); + movss_p32_r128(a, dstp, dstreg); } - - // 64-bit form else if (inst.size() == 8) { - a.xorpd(dstreg, dstreg); // xorpd dstreg,dstreg + a.mov(rax, 0x8000000000000000); + a.movq(dstreg, rax); if (srcp.is_memory()) - a.subsd(dstreg, MABS(srcp.memory())); // subsd dstreg,[srcp] + a.xorpd(dstreg, tempreg); else if (srcp.is_float_register()) - a.subsd(dstreg, Xmm(srcp.freg())); // subsd dstreg,srcp - movsd_p64_r128(a, dstp, dstreg); // movsd dstp,dstreg + a.xorpd(dstreg, Xmm(srcp.freg())); + movsd_p64_r128(a, dstp, dstreg); } } @@ -5058,20 +5283,17 @@ void drcbe_x64::op_fcopyi(Assembler &a, const instruction &inst) { if (srcp.is_memory()) { - a.movd(dstreg, MABS(srcp.memory())); // movd dstreg,[srcp] - movss_p32_r128(a, dstp, dstreg); // movss dstp,dstreg + a.movd(dstreg, MABS(srcp.memory())); + movss_p32_r128(a, dstp, dstreg); + } + else if (dstp.is_memory()) + { + mov_param_reg(a, dstp, Gpd(srcp.ireg())); } else { - if (dstp.is_memory()) - { - mov_param_reg(a, dstp, Gpd(srcp.ireg())); // mov dstp,srcp - } - else - { - a.movd(dstreg, Gpd(srcp.ireg())); // movd dstreg,srcp - movss_p32_r128(a, dstp, dstreg); // movss dstp,dstreg - } + a.movd(dstreg, Gpd(srcp.ireg())); + movss_p32_r128(a, dstp, dstreg); } } @@ -5081,22 +5303,18 @@ void drcbe_x64::op_fcopyi(Assembler &a, const instruction &inst) { if (srcp.is_memory()) { - a.movq(dstreg, MABS(srcp.memory())); // movq dstreg,[srcp] - movsd_p64_r128(a, dstp, dstreg); // movsd dstp,dstreg + a.movq(dstreg, MABS(srcp.memory())); + movsd_p64_r128(a, dstp, dstreg); + } + else if (dstp.is_memory()) + { + mov_param_reg(a, dstp, Gpq(srcp.ireg())); } else { - if (dstp.is_memory()) - { - mov_param_reg(a, dstp, Gpq(srcp.ireg())); // mov dstp,srcp - } - else - { - a.movq(dstreg, Gpq(srcp.ireg())); // movq dstreg,srcp - movsd_p64_r128(a, dstp, dstreg); // movsd dstp,dstreg - } + a.movq(dstreg, Gpq(srcp.ireg())); + movsd_p64_r128(a, dstp, dstreg); } - } } @@ -5122,19 +5340,16 @@ void drcbe_x64::op_icopyf(Assembler &a, const instruction &inst) if (srcp.is_memory()) { Gp dstreg = dstp.select_register(eax); - a.mov(dstreg, MABS(srcp.memory())); // mov dstreg,[srcp] - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + a.mov(dstreg, MABS(srcp.memory())); + mov_param_reg(a, dstp, dstreg); + } + else if (dstp.is_memory()) + { + a.movd(MABS(dstp.memory()), Xmm(srcp.freg())); } else { - if (dstp.is_memory()) - { - a.movd(MABS(dstp.memory()), Xmm(srcp.freg())); // movd dstp,srcp - } - else - { - a.movd(Gpd(dstp.ireg()), Xmm(srcp.freg())); // movd dstp,srcp - } + a.movd(Gpd(dstp.ireg()), Xmm(srcp.freg())); } } @@ -5144,19 +5359,16 @@ void drcbe_x64::op_icopyf(Assembler &a, const instruction &inst) if (srcp.is_memory()) { Gp dstreg = dstp.select_register(rax); - a.mov(dstreg, MABS(srcp.memory())); // mov dstreg,[srcp] - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + a.mov(dstreg, MABS(srcp.memory())); + mov_param_reg(a, dstp, dstreg); + } + else if (dstp.is_memory()) + { + a.movq(MABS(dstp.memory()), Xmm(srcp.freg())); } else { - if (dstp.is_memory()) - { - a.movq(MABS(dstp.memory()), Xmm(srcp.freg())); // movq dstp,srcp - } - else - { - a.movq(Gpq(dstp.ireg()), Xmm(srcp.freg())); // movq dstp,srcp - } + a.movq(Gpq(dstp.ireg()), Xmm(srcp.freg())); } } } diff --git a/src/devices/cpu/drcbex64.h b/src/devices/cpu/drcbex64.h index 51e0c94fed3..db8c1543aa5 100644 --- a/src/devices/cpu/drcbex64.h +++ b/src/devices/cpu/drcbex64.h @@ -135,6 +135,7 @@ private: void op_mapvar(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_nop(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_break(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_debug(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_exit(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_hashjmp(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -149,6 +150,7 @@ private: void op_getfmod(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_getexp(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_getflgs(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_setflgs(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_save(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_restore(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -171,7 +173,9 @@ private: void op_subc(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_cmp(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_mulu(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_mululw(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_muls(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_mulslw(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_divu(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_divs(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_and(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -208,7 +212,7 @@ private: // alu and shift operation helpers static bool ones(u64 const value, unsigned const size) noexcept { return (size == 4) ? u32(value) == 0xffffffffU : value == 0xffffffff'ffffffffULL; } void alu_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, asmjit::Operand const &dst, be_parameter const ¶m, std::function<bool(asmjit::x86::Assembler &a, asmjit::Operand const &dst, be_parameter const &src)> optimize = [](asmjit::x86::Assembler &a, asmjit::Operand dst, be_parameter const &src) { return false; }); - void shift_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, asmjit::Operand const &dst, be_parameter const ¶m); + void shift_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, size_t opsize, asmjit::Operand const &dst, be_parameter const ¶m, bool update_flags); // parameter helpers void mov_reg_param(asmjit::x86::Assembler &a, asmjit::x86::Gp const ®, be_parameter const ¶m, bool const keepflags = false); @@ -225,6 +229,10 @@ private: void movsd_r128_p64(asmjit::x86::Assembler &a, asmjit::x86::Xmm const ®, be_parameter const ¶m); void movsd_p64_r128(asmjit::x86::Assembler &a, be_parameter const ¶m, asmjit::x86::Xmm const ®); + void calculate_status_flags(asmjit::x86::Assembler &a, uint32_t instsize, asmjit::Operand const &dst, u8 flags); + void calculate_status_flags_mul(asmjit::x86::Assembler &a, uint32_t instsize, asmjit::x86::Gp const &lo, asmjit::x86::Gp const &hi); + void calculate_status_flags_mul_low(asmjit::x86::Assembler &a, uint32_t instsize, asmjit::x86::Gp const &lo); + size_t emit(asmjit::CodeHolder &ch); // internal state diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index 0233ddef33b..6e187e6846a 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -205,6 +205,7 @@ const drcbe_x86::opcode_table_entry drcbe_x86::s_opcode_table_source[] = // Control Flow Operations { uml::OP_NOP, &drcbe_x86::op_nop }, // NOP + { uml::OP_BREAK, &drcbe_x86::op_break }, // BREAK { uml::OP_DEBUG, &drcbe_x86::op_debug }, // DEBUG pc { uml::OP_EXIT, &drcbe_x86::op_exit }, // EXIT src1[,c] { uml::OP_HASHJMP, &drcbe_x86::op_hashjmp }, // HASHJMP mode,pc,handle @@ -220,6 +221,7 @@ const drcbe_x86::opcode_table_entry drcbe_x86::s_opcode_table_source[] = { uml::OP_GETFMOD, &drcbe_x86::op_getfmod }, // GETFMOD dst { uml::OP_GETEXP, &drcbe_x86::op_getexp }, // GETEXP dst { uml::OP_GETFLGS, &drcbe_x86::op_getflgs }, // GETFLGS dst[,f] + { uml::OP_SETFLGS, &drcbe_x86::op_setflgs }, // GETFLGS src { uml::OP_SAVE, &drcbe_x86::op_save }, // SAVE dst { uml::OP_RESTORE, &drcbe_x86::op_restore }, // RESTORE dst @@ -243,7 +245,9 @@ const drcbe_x86::opcode_table_entry drcbe_x86::s_opcode_table_source[] = { uml::OP_SUBB, &drcbe_x86::op_subc }, // SUBB dst,src1,src2[,f] { uml::OP_CMP, &drcbe_x86::op_cmp }, // CMP src1,src2[,f] { uml::OP_MULU, &drcbe_x86::op_mulu }, // MULU dst,edst,src1,src2[,f] + { uml::OP_MULULW, &drcbe_x86::op_mululw }, // MULULW dst,src1,src2[,f] { uml::OP_MULS, &drcbe_x86::op_muls }, // MULS dst,edst,src1,src2[,f] + { uml::OP_MULSLW, &drcbe_x86::op_mulslw }, // MULSLW dst,src1,src2[,f] { uml::OP_DIVU, &drcbe_x86::op_divu }, // DIVU dst,edst,src1,src2[,f] { uml::OP_DIVS, &drcbe_x86::op_divs }, // DIVS dst,edst,src1,src2[,f] { uml::OP_AND, &drcbe_x86::op_and }, // AND dst,src1,src2[,f] @@ -417,12 +421,30 @@ inline void drcbe_x86::emit_combine_z_flags(Assembler &a) { // this assumes that the flags from the low 32-bit op are on the stack // and the flags from the high 32-bit op are live - a.pushfd(); // pushf - a.mov(ecx, ptr(esp, 4)); // mov ecx,[esp+4] - a.or_(ecx, ~0x40); // or ecx,~0x40 - a.and_(ptr(esp, 0), ecx); // and [esp],ecx - a.popfd(); // popf - a.lea(esp, ptr(esp, 4)); // lea esp,[esp+4] + a.pushfd(); + + a.mov(ecx, dword_ptr(esp, 4)); // zero flag + a.or_(ecx, ~0x40); + a.and_(dword_ptr(esp, 0), ecx); + + a.popfd(); + a.lea(esp, ptr(esp, 4)); +} + +inline void drcbe_x86::emit_combine_zs_flags(Assembler &a) +{ + // this assumes that the flags from the low 32-bit op are on the stack + // and the flags from the high 32-bit op are live + a.pushfd(); + + a.mov(ecx, dword_ptr(esp, 4)); // zero flag + a.or_(ecx, ~(0x40 | 0x80)); + a.and_(dword_ptr(esp, 0), ecx); + a.and_(ecx, 0x80); // sign flag + a.or_(dword_ptr(esp, 0), ecx); + + a.popfd(); + a.lea(esp, ptr(esp, 4)); } @@ -435,11 +457,11 @@ inline void drcbe_x86::emit_combine_z_shl_flags(Assembler &a) { // this assumes that the flags from the high 32-bit op are on the stack // and the flags from the low 32-bit op are live - a.pushfd(); // pushf - a.pop(ecx); // pop ecx - a.or_(ecx, ~0x40); // or ecx,~0x40 - a.and_(ptr(esp, 0), ecx); // and [esp],ecx - a.popfd(); // popf + a.pushfd(); + a.pop(ecx); + a.or_(ecx, ~0x40); + a.and_(ptr(esp, 0), ecx); + a.popfd(); } @@ -998,6 +1020,7 @@ void drcbe_x86::emit_mov_p32_r32(Assembler &a, be_parameter const ¶m, Gp con { if (reg.id() != param.ireg()) a.mov(Gpd(param.ireg()), reg); // mov param,reg + a.mov(MABS(m_reghi[param.ireg()], 4), 0); } } @@ -1030,21 +1053,95 @@ void drcbe_x86::alu_op_param(Assembler &a, Inst::Id const opcode, Operand const a.emit(opcode, dst, Gpd(param.ireg())); // op dst,param } +void drcbe_x86::calculate_status_flags(Assembler &a, Operand const &dst, u8 flags) +{ + // calculate status flags in a way that does not modify any other status flags + uint32_t flagmask = 0; + + if (flags & FLAG_C) flagmask |= 0x001; + if (flags & FLAG_V) flagmask |= 0x800; + if (flags & FLAG_Z) flagmask |= 0x040; + if (flags & FLAG_S) flagmask |= 0x080; + if (flags & FLAG_U) flagmask |= 0x004; -void drcbe_x86::shift_op_param(Assembler &a, Inst::Id const opcode, Operand const &dst, be_parameter const ¶m, std::function<bool(Assembler &a, Operand const &dst, be_parameter const &src)> optimize) + if ((flags & (FLAG_Z | FLAG_S)) == flags) + { + Gp tempreg = dst.isMem() ? eax : dst.as<Gpd>().id() == ebx.id() ? eax : ebx; + Gp tempreg2 = dst.isMem() ? edx : dst.as<Gpd>().id() == ecx.id() ? edx : ecx; + + if (dst.isMem()) + { + a.push(tempreg2); + a.mov(tempreg2, dst.as<Mem>()); + } + + a.push(tempreg); + + a.pushfd(); + a.pop(tempreg); + a.and_(tempreg, ~flagmask); + + a.add(dst.isMem() ? tempreg2.as<Gpd>() : dst.as<Gpd>(), 0); + + a.pushfd(); + a.and_(dword_ptr(esp), flagmask); + a.or_(dword_ptr(esp), tempreg); + a.popfd(); + + a.pop(tempreg); + + if (dst.isMem()) + a.pop(tempreg2); + } + else + { + fatalerror("drcbe_x86::calculate_status_flags: unknown flag combination requested: %02x\n", flags); + } +} + +void drcbe_x86::shift_op_param(Assembler &a, Inst::Id const opcode, size_t opsize, Operand const &dst, be_parameter const ¶m, std::function<bool(Assembler &a, Operand const &dst, be_parameter const &src)> optimize, bool update_flags) { - Operand shift = cl; if (param.is_immediate()) { - if (optimize(a, dst, param)) + uint32_t bitshift = (param.immediate() & (opsize * 8 - 1)); + + if (optimize(a, dst, param) || bitshift == 0) return; - shift = imm(param.immediate()); + a.emit(opcode, dst, imm(bitshift)); + + if (update_flags) + calculate_status_flags(a, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry } else - emit_mov_r32_p32(a, ecx, param); + { + Label restore_flags = a.newLabel(); + Label end = a.newLabel(); + + Gp shift = dst.as<Gpd>().id() == ecx.id() ? ebx : ecx; + + a.pushfd(); // no status flags should change if shift is 0, so preserve flags + + emit_mov_r32_p32(a, shift, param); + + a.and_(shift, opsize * 8 - 1); + a.test(shift, shift); + a.short_().jz(restore_flags); + + a.popfd(); // restore flags to keep carry for rolc/rorc + + a.emit(opcode, dst, shift); + + if (update_flags) + calculate_status_flags(a, dst, FLAG_S | FLAG_Z); // calculate status flags but preserve carry + + a.short_().jmp(end); - a.emit(opcode, dst, shift); + a.bind(restore_flags); + a.popfd(); + + a.bind(end); + } } @@ -1428,7 +1525,7 @@ void drcbe_x86::emit_xor_m64_p64(Assembler &a, Mem const &memref_lo, Mem const & void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = (inst.flags() != 0); + int saveflags = inst.flags() != 0; if (param.is_immediate()) { int count = param.immediate() & 63; @@ -1436,6 +1533,8 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { + saveflags = saveflags && count > 0; + while (count >= 32) { if (inst.flags() != 0) @@ -1458,12 +1557,25 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shl(reglo, count); // shl reglo,count } } + + if (saveflags) + emit_combine_z_shl_flags(a); } else { + Label skipall = a.newLabel(); + Label end = a.newLabel(); Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); + + a.pushfd(); + emit_mov_r32_p32(a, ecx, param); // mov ecx,param + + a.and_(ecx, 63); + a.test(ecx, ecx); + a.short_().jz(skipall); + a.test(ecx, 0x20); // test ecx,0x20 a.short_().jz(skip1); // jz skip1 if (inst.flags() != 0) @@ -1489,9 +1601,19 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shld(reghi, reglo, cl); // shld reghi,reglo,cl if (saveflags) a.pushfd(); // pushf a.shl(reglo, cl); // shl reglo,cl + + if (saveflags) + emit_combine_z_shl_flags(a); + + a.lea(esp, ptr(esp, 4)); + + a.jmp(end); + + a.bind(skipall); + a.popfd(); + + a.bind(end); } - if (saveflags) - emit_combine_z_shl_flags(a); } @@ -1502,7 +1624,7 @@ void drcbe_x86::emit_shl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = ((inst.flags() & FLAG_Z) != 0); + int saveflags = inst.flags() != 0; if (param.is_immediate()) { int count = param.immediate() & 63; @@ -1510,6 +1632,8 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { + saveflags = saveflags && count > 0; + while (count >= 32) { if (inst.flags() != 0) @@ -1532,12 +1656,35 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shr(reghi, count); // shr reghi,count } } + + if (saveflags) + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); + + emit_combine_z_flags(a); + } } else { + Label skipall = a.newLabel(); + Label end = a.newLabel(); Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); + + a.pushfd(); + emit_mov_r32_p32(a, ecx, param); // mov ecx,param + + a.and_(ecx, 63); + a.test(ecx, ecx); + a.short_().jz(skipall); + a.test(ecx, 0x20); // test ecx,0x20 a.short_().jz(skip1); // jz skip1 if (inst.flags() != 0) @@ -1563,9 +1710,29 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shrd(reglo, reghi, cl); // shrd reglo,reghi,cl if (saveflags) a.pushfd(); // pushf a.shr(reghi, cl); // shr reghi,cl + + if (saveflags) + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); + + emit_combine_z_flags(a); + } + + a.lea(esp, ptr(esp, 4)); + + a.jmp(end); + + a.bind(skipall); + a.popfd(); + + a.bind(end); } - if (saveflags) - emit_combine_z_flags(a); } @@ -1576,7 +1743,7 @@ void drcbe_x86::emit_shr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = ((inst.flags() & FLAG_Z) != 0); + int saveflags = inst.flags() != 0; if (param.is_immediate()) { int count = param.immediate() & 63; @@ -1584,6 +1751,8 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { + saveflags = saveflags && count > 0; + while (count >= 32) { if (inst.flags() != 0) @@ -1606,12 +1775,35 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.sar(reghi, count); // sar reghi,count } } + + if (saveflags) + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); + + emit_combine_z_flags(a); + } } else { + Label skipall = a.newLabel(); + Label end = a.newLabel(); Label skip1 = a.newLabel(); Label skip2 = a.newLabel(); + + a.pushfd(); + emit_mov_r32_p32(a, ecx, param); // mov ecx,param + + a.and_(ecx, 63); + a.test(ecx, ecx); + a.short_().jz(skipall); + a.test(ecx, 0x20); // test ecx,0x20 a.short_().jz(skip1); // jz skip1 if (inst.flags() != 0) @@ -1637,9 +1829,29 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, a.shrd(reglo, reghi, cl); // shrd reglo,reghi,cl if (saveflags) a.pushfd(); // pushf a.sar(reghi, cl); // sar reghi,cl + + if (saveflags) + { + // take carry from lower register's flags + a.pushfd(); + a.mov(ecx, dword_ptr(esp, 4)); + a.and_(ecx, 0x01); // carry flag + a.and_(dword_ptr(esp, 0), ~0x01); + a.or_(dword_ptr(esp, 0), ecx); + a.popfd(); + + emit_combine_z_flags(a); + } + + a.lea(esp, ptr(esp, 4)); + + a.jmp(end); + + a.bind(skipall); + a.popfd(); + + a.bind(end); } - if (saveflags) - emit_combine_z_flags(a); } @@ -1650,7 +1862,11 @@ void drcbe_x86::emit_sar_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = ((inst.flags() & FLAG_Z) != 0); + int saveflags = inst.flags() != 0; + + Gp tempreg = esi; // TODO: try to avoid collision with reglo and reghi? + a.push(tempreg); + if (param.is_immediate()) { int count = param.immediate() & 63; @@ -1658,65 +1874,88 @@ void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { + saveflags = saveflags && count > 0; + while (count >= 32) { if (inst.flags() != 0) { - a.mov(ecx, reglo); // mov ecx,reglo - a.shld(reglo, reghi, 31); // shld reglo,reghi,31 - a.shld(reghi, ecx, 31); // shld reghi,ecx,31 + a.mov(ecx, reglo); + a.shld(reglo, reghi, 31); + a.shld(reghi, ecx, 31); count -= 31; } else { - a.xchg(reghi, reglo); // xchg reghi,reglo + a.xchg(reghi, reglo); count -= 32; } } - if (inst.flags() != 0 || count > 0) - { - a.mov(ecx, reglo); // mov ecx,reglo - a.shld(reglo, reghi, count); // shld reglo,reghi,count - if (saveflags) a.pushfd(); // pushf - a.shld(reghi, ecx, count); // shld reghi,ecx,count - } + + a.mov(ecx, reglo); + a.shld(reglo, reghi, count); + if (saveflags) a.pushfd(); + a.shld(reghi, ecx, count); } + + if (saveflags) + emit_combine_zs_flags(a); } else { + Label end = a.newLabel(); + Label skipall = a.newLabel(); Label skip1 = a.newLabel(); - Label skip2 = a.newLabel(); - a.mov(ptr(esp, -8), ebx); // mov [esp-8],ebx - emit_mov_r32_p32(a, ecx, param); // mov ecx,param - a.test(ecx, 0x20); // test ecx,0x20 - a.short_().jz(skip1); // jz skip1 + Label shift_loop = a.newLabel(); + + emit_mov_r32_p32(a, ecx, param); + + a.pushfd(); + + a.and_(ecx, 63); + a.test(ecx, ecx); + a.short_().jz(skipall); + + a.cmp(ecx, 32); + a.short_().jl(skip1); + + a.bind(shift_loop); if (inst.flags() != 0) { - a.sub(ecx, 31); // sub ecx,31 - a.mov(ebx, reglo); // mov ebx,reglo - a.shld(reglo, reghi, 31); // shld reglo,reghi,31 - a.shld(reghi, ebx, 31); // shld reghi,ebx,31 - a.test(ecx, 0x20); // test ecx,0x20 - a.short_().jz(skip2); // jz skip2 - a.sub(ecx, 31); // sub ecx,31 - a.mov(ebx, reglo); // mov ebx,reglo - a.shld(reglo, reghi, 31); // shld reglo,reghi,31 - a.shld(reghi, ebx, 31); // shld reghi,ebx,31 - a.bind(skip2); // skip2: - reset_last_upper_lower_reg(); + a.sub(ecx, 31); + a.mov(tempreg, reglo); + a.shld(reglo, reghi, 31); + a.shld(reghi, tempreg, 31); } else - a.xchg(reghi, reglo); // xchg reghi,reglo - a.bind(skip1); // skip1: + { + a.xchg(reghi, reglo); + a.sub(ecx, 32); + } + a.cmp(ecx, 32); + a.short_().jge(shift_loop); + + a.bind(skip1); reset_last_upper_lower_reg(); - a.mov(ebx, reglo); // mov ebx,reglo - a.shld(reglo, reghi, cl); // shld reglo,reghi,cl - if (saveflags) a.pushfd(); // pushf - a.shld(reghi, ebx, cl); // shld reghi,ebx,cl - a.mov(ebx, ptr(esp, saveflags ? -4 : -8)); // mov ebx,[esp-8] + + a.mov(tempreg, reglo); + a.shld(reglo, reghi, cl); + if (saveflags) a.pushfd(); + a.shld(reghi, tempreg, cl); + + if (saveflags) + emit_combine_zs_flags(a); + + a.lea(esp, ptr(esp, 4)); + a.jmp(end); + + a.bind(skipall); + a.popfd(); + + a.bind(end); } - if (saveflags) - emit_combine_z_flags(a); + + a.pop(tempreg); } @@ -1727,7 +1966,11 @@ void drcbe_x86::emit_rol_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = ((inst.flags() & FLAG_Z) != 0); + int saveflags = inst.flags() != 0; + + Gp tempreg = esi; // TODO: try to avoid collision with reglo and reghi? + a.push(tempreg); + if (param.is_immediate()) { int count = param.immediate() & 63; @@ -1735,65 +1978,88 @@ void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, ;// skip else { + saveflags = saveflags && count > 0; + while (count >= 32) { if (inst.flags() != 0) { - a.mov(ecx, reglo); // mov ecx,reglo - a.shrd(reglo, reghi, 31); // shrd reglo,reghi,31 - a.shrd(reghi, ecx, 31); // shrd reghi,ecx,31 + a.mov(tempreg, reglo); + a.shrd(reglo, reghi, 31); + a.shrd(reghi, tempreg, 31); count -= 31; } else { - a.xchg(reghi, reglo); // xchg reghi,reglo + a.xchg(reghi, reglo); count -= 32; } } - if (inst.flags() != 0 || count > 0) - { - a.mov(ecx, reglo); // mov ecx,reglo - a.shrd(reglo, reghi, count); // shrd reglo,reghi,count - if (saveflags) a.pushfd(); // pushf - a.shrd(reghi, ecx, count); // shrd reghi,ecx,count - } + + a.mov(tempreg, reghi); + a.shrd(reghi, reglo, count); + if (saveflags) a.pushfd(); + a.shrd(reglo, tempreg, count); + + if (saveflags) + emit_combine_zs_flags(a); } } else { + Label end = a.newLabel(); + Label skipall = a.newLabel(); Label skip1 = a.newLabel(); - Label skip2 = a.newLabel(); - a.mov(ptr(esp, -8), ebx); // mov [esp-8],ebx - emit_mov_r32_p32(a, ecx, param); // mov ecx,param - a.test(ecx, 0x20); // test ecx,0x20 - a.short_().jz(skip1); // jz skip1 + Label shift_loop = a.newLabel(); + + emit_mov_r32_p32(a, ecx, param); + + a.pushfd(); + + a.and_(ecx, 63); + a.test(ecx, ecx); + a.short_().jz(skipall); + + a.cmp(ecx, 32); + a.short_().jl(skip1); + + a.bind(shift_loop); if (inst.flags() != 0) { - a.sub(ecx, 31); // sub ecx,31 - a.mov(ebx, reglo); // mov ebx,reglo - a.shrd(reglo, reghi, 31); // shrd reglo,reghi,31 - a.shrd(reghi, ebx, 31); // shrd reghi,ebx,31 - a.test(ecx, 0x20); // test ecx,0x20 - a.short_().jz(skip2); // jz skip2 - a.sub(ecx, 31); // sub ecx,31 - a.mov(ebx, reglo); // mov ebx,reglo - a.shrd(reglo, reghi, 31); // shrd reglo,reghi,31 - a.shrd(reghi, ebx, 31); // shrd reghi,ebx,31 - a.bind(skip2); // skip2: - reset_last_upper_lower_reg(); + a.sub(ecx, 31); + a.mov(tempreg, reglo); + a.shrd(reglo, reghi, 31); + a.shrd(reghi, tempreg, 31); } else - a.xchg(reghi, reglo); // xchg reghi,reglo - a.bind(skip1); // skip1: + { + a.xchg(reghi, reglo); + a.sub(ecx, 32); + } + a.cmp(ecx, 32); + a.short_().jge(shift_loop); + + a.bind(skip1); reset_last_upper_lower_reg(); - a.mov(ebx, reglo); // mov ebx,reglo - a.shrd(reglo, reghi, cl); // shrd reglo,reghi,cl - if (saveflags) a.pushfd(); // pushf - a.shrd(reghi, ebx, cl); // shrd reghi,ebx,cl - a.mov(ebx, ptr(esp, saveflags ? -4 : -8)); // mov ebx,[esp-8] + + a.mov(tempreg, reghi); + a.shrd(reghi, reglo, cl); + if (saveflags) a.pushfd(); + a.shrd(reglo, tempreg, cl); + + if (saveflags) + emit_combine_zs_flags(a); + + a.lea(esp, ptr(esp, 4)); + a.jmp(end); + + a.bind(skipall); + a.popfd(); + + a.bind(end); } - if (saveflags) - emit_combine_z_flags(a); + + a.pop(tempreg); } @@ -1804,42 +2070,41 @@ void drcbe_x86::emit_ror_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = ((inst.flags() & FLAG_Z) != 0); Label loop = a.newLabel(); Label skipall = a.newLabel(); Label skiploop = a.newLabel(); - emit_mov_r32_p32_keepflags(a, ecx, param); // mov ecx,param - if (!saveflags) - { - a.bind(loop); // loop: - a.jecxz(skipall); // jecxz skipall - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.rcl(reglo, 1); // rcl reglo,1 - a.rcl(reghi, 1); // rcl reghi,1 - a.jmp(loop); // jmp loop - a.bind(skipall); // skipall: - reset_last_upper_lower_reg(); - } - else + a.pushfd(); // keep carry flag after and + emit_mov_r32_p32_keepflags(a, ecx, param); + + a.and_(ecx, 63); + a.popfd(); + + a.jecxz(skipall); + a.lea(ecx, ptr(ecx, -1)); + + a.bind(loop); + a.jecxz(skiploop); + a.lea(ecx, ptr(ecx, -1)); + a.rcl(reglo, 1); + a.rcl(reghi, 1); + a.jmp(loop); + + a.bind(skiploop); + reset_last_upper_lower_reg(); + a.rcl(reglo, 1); + a.rcl(reghi, 1); + + if (inst.flags()) { - a.jecxz(skipall); // jecxz skipall - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.bind(loop); // loop: - a.jecxz(skiploop); // jecxz skiploop - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.rcl(reglo, 1); // rcl reglo,1 - a.rcl(reghi, 1); // rcl reghi,1 - a.jmp(loop); // jmp loop - a.bind(skiploop); // skiploop: - reset_last_upper_lower_reg(); - a.rcl(reglo, 1); // rcl reglo,1 - a.pushfd(); // pushf - a.rcl(reghi, 1); // rcl reghi,1 - a.bind(skipall); // skipall: - reset_last_upper_lower_reg(); + calculate_status_flags(a, reglo, FLAG_Z); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); emit_combine_z_flags(a); } + + a.bind(skipall); + reset_last_upper_lower_reg(); } @@ -1850,42 +2115,41 @@ void drcbe_x86::emit_rcl_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, void drcbe_x86::emit_rcr_r64_p64(Assembler &a, Gp const ®lo, Gp const ®hi, be_parameter const ¶m, const instruction &inst) { - int saveflags = (inst.flags() != 0); Label loop = a.newLabel(); Label skipall = a.newLabel(); Label skiploop = a.newLabel(); - emit_mov_r32_p32_keepflags(a, ecx, param); // mov ecx,param - if (!saveflags) - { - a.bind(loop); // loop: - a.jecxz(skipall); // jecxz skipall - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.rcr(reghi, 1); // rcr reghi,1 - a.rcr(reglo, 1); // rcr reglo,1 - a.jmp(loop); // jmp loop - a.bind(skipall); // skipall: - reset_last_upper_lower_reg(); - } - else + a.pushfd(); // keep carry flag after and + emit_mov_r32_p32_keepflags(a, ecx, param); + + a.and_(ecx, 63); + a.popfd(); + + a.jecxz(skipall); + a.lea(ecx, ptr(ecx, -1)); + + a.bind(loop); + a.jecxz(skiploop); + a.lea(ecx, ptr(ecx, -1)); + a.rcr(reghi, 1); + a.rcr(reglo, 1); + a.jmp(loop); + + a.bind(skiploop); + reset_last_upper_lower_reg(); + a.rcr(reghi, 1); + a.rcr(reglo, 1); + + if (inst.flags()) { - a.jecxz(skipall); // jecxz skipall - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.bind(loop); // loop: - a.jecxz(skiploop); // jecxz skiploop - a.lea(ecx, ptr(ecx, -1)); // lea ecx,[ecx-1] - a.rcr(reghi, 1); // rcr reghi,1 - a.rcr(reglo, 1); // rcr reglo,1 - a.jmp(loop); // jmp loop - a.bind(skiploop); // skiploop: - reset_last_upper_lower_reg(); - a.rcr(reghi, 1); // rcr reghi,1 - a.pushfd(); // pushf - a.rcr(reglo, 1); // rcr reglo,1 - a.bind(skipall); // skipall: - reset_last_upper_lower_reg(); - emit_combine_z_shl_flags(a); + calculate_status_flags(a, reglo, FLAG_Z); + a.pushfd(); + calculate_status_flags(a, reghi, FLAG_S | FLAG_Z); + emit_combine_z_flags(a); } + + a.bind(skipall); + reset_last_upper_lower_reg(); } @@ -1893,9 +2157,15 @@ void drcbe_x86::alu_op_param(Assembler &a, Inst::Id const opcode_lo, Inst::Id co { if (param.is_memory()) { - a.emit(opcode_lo, lo, MABS(param.memory(0))); // opl reglo,[param] + if (opcode_lo == Inst::kIdTest) // can't use memory on right of test + a.emit(opcode_lo, MABS(param.memory(0)), lo); // opl [param],reglo + else + a.emit(opcode_lo, lo, MABS(param.memory(0))); // opl reglo,[param] if (saveflags) a.pushfd(); // pushf - a.emit(opcode_hi, hi, MABS(param.memory(4))); // oph reghi,[param] + if (opcode_hi == Inst::kIdTest) // can't use memory on right of test + a.emit(opcode_hi, MABS(param.memory(4)), hi); // oph [param],reghi + else + a.emit(opcode_hi, hi, MABS(param.memory(4))); // oph reghi,[param] } else if (param.is_immediate()) { @@ -1907,7 +2177,11 @@ void drcbe_x86::alu_op_param(Assembler &a, Inst::Id const opcode_lo, Inst::Id co { a.emit(opcode_lo, lo, Gpd(param.ireg())); // opl reglo,param if (saveflags) a.pushfd(); // pushf - a.emit(opcode_hi, hi, MABS(m_reghi[param.ireg()])); // oph reghi,reghi[param] + + if (opcode_hi == Inst::kIdTest) // can't use memory on right of test + a.emit(opcode_hi, MABS(m_reghi[param.ireg()]), hi); // oph reghi[param],reghi + else + a.emit(opcode_hi, hi, MABS(m_reghi[param.ireg()])); // oph reghi,reghi[param] } if (saveflags) @@ -2108,6 +2382,16 @@ void drcbe_x86::op_nop(Assembler &a, const instruction &inst) // nothing } +//------------------------------------------------- +// op_break - process a BREAK opcode +//------------------------------------------------- + +void drcbe_x86::op_break(Assembler &a, const instruction &inst) +{ + static const char *const message = "break from drc"; + a.mov(dword_ptr(esp, 0), imm(message)); + a.call(imm(&osd_break_into_debugger)); +} //------------------------------------------------- // op_debug - process a DEBUG opcode @@ -2546,6 +2830,8 @@ void drcbe_x86::op_getflgs(Assembler &a, const instruction &inst) // pick a target register for the general case Gp const dstreg = dstp.select_register(eax); + a.pushfd(); + // compute mask for flags uint32_t flagmask = 0; if (maskp.immediate() & FLAG_C) flagmask |= 0x001; @@ -2661,6 +2947,32 @@ void drcbe_x86::op_getflgs(Assembler &a, const instruction &inst) else if (dstp.is_int_register()) a.mov(MABS(m_reghi[dstp.ireg()], 4), 0); // mov [reghi],0 } + + a.popfd(); +} + + +//------------------------------------------------- +// op_setflgs - process a SETFLGS opcode +//------------------------------------------------- + +void drcbe_x86::op_setflgs(Assembler &a, const instruction &inst) +{ + assert(inst.size() == 4); + assert_no_condition(inst); + assert_no_flags(inst); + + be_parameter srcp(*this, inst.param(0), PTYPE_MRI); + + a.pushfd(); + + emit_mov_r32_p32(a, eax, srcp); + + a.mov(eax, ptr(u64(flags_unmap), eax, 2)); + a.and_(dword_ptr(esp), ~0x8c5); + a.or_(dword_ptr(esp), eax); + + a.popfd(); } @@ -2859,7 +3171,12 @@ void drcbe_x86::op_loads(Assembler &a, const instruction &inst) // 64-bit form stores upper 32 bits if (inst.size() == 8) { - a.cdq(); // cdq + if (size != SIZE_QWORD) + { + if (dstreg.id() != eax.id()) + a.mov(eax, dstreg); + a.cdq(); // cdq + } if (dstp.is_memory()) a.mov(MABS(dstp.memory(4)), edx); // mov [dstp+4],edx else if (dstp.is_int_register()) @@ -3217,11 +3534,13 @@ void drcbe_x86::op_carry(Assembler &a, const instruction &inst) // degenerate case: source is immediate if (srcp.is_immediate() && bitp.is_immediate()) { - if (srcp.immediate() & ((uint64_t)1 << bitp.immediate())) + if (srcp.immediate() & ((uint64_t)1 << (bitp.immediate() & (inst.size() * 8 - 1)))) a.stc(); else a.clc(); - } + + return; + } // load non-immediate bit numbers into a register if (!bitp.is_immediate()) @@ -3233,43 +3552,98 @@ void drcbe_x86::op_carry(Assembler &a, const instruction &inst) // 32-bit form if (inst.size() == 4) { + if (srcp.is_immediate()) + emit_mov_r32_p32(a, edx, srcp); + if (bitp.is_immediate()) { if (srcp.is_memory()) - a.bt(MABS(srcp.memory(), 4), bitp.immediate()); // bt [srcp],bitp + a.bt(MABS(srcp.memory(), 4), (bitp.immediate() & (inst.size() * 8 - 1))); else if (srcp.is_int_register()) - a.bt(Gpd(srcp.ireg()), bitp.immediate()); // bt srcp,bitp + a.bt(Gpd(srcp.ireg()), (bitp.immediate() & (inst.size() * 8 - 1))); + else if (srcp.is_immediate()) + a.bt(edx, (bitp.immediate() & (inst.size() * 8 - 1))); } else { if (srcp.is_memory()) - a.bt(MABS(srcp.memory()), ecx); // bt [srcp],ecx + a.bt(MABS(srcp.memory()), ecx); else if (srcp.is_int_register()) - a.bt(Gpd(srcp.ireg()), ecx); // bt [srcp],ecx + a.bt(Gpd(srcp.ireg()), ecx); + else if (srcp.is_immediate()) + a.bt(edx, ecx); } } // 64-bit form else { + if (srcp.is_immediate()) + emit_mov_r64_p64(a, ebx, edx, srcp); + if (bitp.is_immediate()) { - if (srcp.is_memory()) - a.bt(MABS(srcp.memory(), 4), bitp.immediate()); // bt [srcp],bitp - else if (srcp.is_int_register() && bitp.immediate() < 32) - a.bt(Gpd(srcp.ireg()), bitp.immediate()); // bt srcp,bitp - else if (srcp.is_int_register() && bitp.immediate() >= 32) - a.bt(MABS(m_reghi[srcp.ireg()], 4), bitp.immediate() - 32); // bt [srcp.hi],bitp + uint32_t bitshift = (bitp.immediate() & (inst.size() * 8 - 1)); + if (bitshift < 32) + { + if (srcp.is_memory()) + a.bt(MABS(srcp.memory(), 4), bitshift); + else if (srcp.is_int_register()) + a.bt(Gpd(srcp.ireg()), bitshift); + else if (srcp.is_immediate()) + a.bt(ebx, bitshift); + } + else if (bitshift >= 32) + { + if (srcp.is_memory()) + a.bt(MABS((uint8_t*)srcp.memory() + 4, 4), bitshift - 32); + else if (srcp.is_int_register()) + a.bt(MABS(m_reghi[srcp.ireg()], 4), bitshift - 32); + else if (srcp.is_immediate()) + a.bt(edx, bitshift); + } } else { + Label end = a.newLabel(); + Label higher = a.newLabel(); + + a.cmp(ecx, 32); + a.jge(higher); + if (srcp.is_memory()) - a.bt(MABS(srcp.memory()), ecx); // bt [srcp],ecx + { + a.bt(MABS(srcp.memory(), 4), ecx); + } else if (srcp.is_int_register()) { - a.mov(MABS(m_reglo[srcp.ireg()]), Gpd(srcp.ireg())); // mov [srcp.lo],srcp - a.bt(MABS(m_reglo[srcp.ireg()]), ecx); // bt [srcp],ecx + a.mov(MABS(m_reglo[srcp.ireg()], 4), Gpd(srcp.ireg())); // mov [srcp.lo],srcp + a.bt(MABS(m_reglo[srcp.ireg()], 4), ecx); // bt [srcp],ecx } + else if (srcp.is_immediate()) + { + a.bt(ebx, ecx); + } + + a.short_().jmp(end); + + a.bind(higher); + a.sub(ecx, 32); + + if (srcp.is_memory()) + { + a.bt(MABS((uint8_t*)srcp.memory() + 4, 4), ecx); + } + else if (srcp.is_int_register()) + { + a.bt(MABS(m_reghi[srcp.ireg()], 4), ecx); + } + else if (srcp.is_immediate()) + { + a.bt(edx, ecx); + } + + a.bind(end); } } } @@ -3384,7 +3758,7 @@ void drcbe_x86::op_mov(Assembler &a, const instruction &inst) // general case else { - emit_mov_r64_p64(a, dstreg, edx, srcp); // mov edx:dstreg,srcp + emit_mov_r64_p64_keepflags(a, dstreg, edx, srcp); // mov edx:dstreg,srcp emit_mov_p64_r64(a, dstp, dstreg, edx); // mov dstp,edx:dstreg } } @@ -3416,7 +3790,7 @@ void drcbe_x86::op_sext(Assembler &a, const instruction &inst) assert(sizep.is_size()); // pick a target register for the general case - Gp const dstreg = dstp.select_register(eax); + Gp const dstreg = eax; // convert 8-bit source registers to EAX if (sizep.size() == SIZE_BYTE && srcp.is_int_register() && (srcp.ireg() & 4)) @@ -3444,6 +3818,16 @@ void drcbe_x86::op_sext(Assembler &a, const instruction &inst) else if (sizep.size() == SIZE_DWORD && dstreg.id() != srcp.ireg()) a.mov(dstreg, Gpd(srcp.ireg())); // mov dstreg,srcp } + else if (srcp.is_immediate()) + { + if (sizep.size() == SIZE_BYTE) + a.mov(dstreg, (int8_t)srcp.immediate()); + else if (sizep.size() == SIZE_WORD) + a.mov(dstreg, (int16_t)srcp.immediate()); + else if (sizep.size() == SIZE_DWORD) + a.mov(dstreg, (int32_t)srcp.immediate()); + } + if (inst.flags() != 0) a.test(dstreg, dstreg); // test dstreg,dstreg @@ -3455,7 +3839,7 @@ void drcbe_x86::op_sext(Assembler &a, const instruction &inst) else if (inst.size() == 8) { a.cdq(); // cdq - emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax + emit_mov_p64_r64(a, dstp, dstreg, edx); // mov dstp,edx:eax } } @@ -3484,12 +3868,12 @@ void drcbe_x86::op_roland(Assembler &a, const instruction &inst) if (inst.size() == 4) { emit_mov_r32_p32(a, dstreg, srcp); // mov dstreg,srcp - shift_op_param(a, Inst::kIdRol, dstreg, shiftp, // rol dstreg,shiftp + shift_op_param(a, Inst::kIdRol, inst.size(), dstreg, shiftp, // rol dstreg,shiftp [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, false); alu_op_param(a, Inst::kIdAnd, dstreg, maskp, // and dstreg,maskp [inst](Assembler &a, Operand const &dst, be_parameter const &src) { @@ -3542,12 +3926,12 @@ void drcbe_x86::op_rolins(Assembler &a, const instruction &inst) if (inst.size() == 4) { emit_mov_r32_p32(a, eax, srcp); // mov eax,srcp - shift_op_param(a, Inst::kIdRol, eax, shiftp, // rol eax,shiftp + shift_op_param(a, Inst::kIdRol, inst.size(), eax, shiftp, // rol eax,shiftp [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, false); emit_mov_r32_p32(a, dstreg, dstp); // mov dstreg,dstp if (maskp.is_immediate()) { @@ -3563,6 +3947,9 @@ void drcbe_x86::op_rolins(Assembler &a, const instruction &inst) } a.or_(dstreg, eax); // or dstreg,eax emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg + + if (inst.flags()) + a.test(dstreg, dstreg); } // 64-bit form @@ -3611,19 +3998,26 @@ void drcbe_x86::op_rolins(Assembler &a, const instruction &inst) a.or_(MABS(dstp.memory(0)), eax); // or dstp.lo,eax a.or_(MABS(dstp.memory(4)), edx); // or dstp.hi,edx } + + if (inst.flags()) + { + if (dstp.is_int_register()) + calculate_status_flags(a, Gpd(dstp.ireg()), FLAG_Z); + else + calculate_status_flags(a, MABS(dstp.memory(0)), FLAG_Z); + + a.pushfd(); + + if (dstp.is_int_register()) + calculate_status_flags(a, MABS(m_reghi[dstp.ireg()]), FLAG_S | FLAG_Z); + else + calculate_status_flags(a, MABS(dstp.memory(4)), FLAG_S | FLAG_Z); + + emit_combine_z_flags(a); + } + a.mov(ebx, ptr(esp, -8)); // mov ebx,[esp-8] } - if (inst.flags() == FLAG_Z) - a.or_(eax, edx); // or eax,edx - else if (inst.flags() == FLAG_S) - ;// do nothing -- final OR will have the right result - else if (inst.flags() == (FLAG_Z | FLAG_S)) - { - a.movzx(ecx, ax); // movzx ecx,ax - a.shr(eax, 16); // shr eax,16 - a.or_(edx, ecx); // or edx,ecx - a.or_(edx, eax); // or edx,eax - } } } @@ -3935,9 +4329,6 @@ void drcbe_x86::op_cmp(Assembler &a, const instruction &inst) void drcbe_x86::op_mulu(Assembler &a, const instruction &inst) { - uint8_t zsflags = inst.flags() & (FLAG_Z | FLAG_S); - uint8_t vflag = inst.flags() & FLAG_V; - // validate instruction assert(inst.size() == 4 || inst.size() == 8); assert_no_condition(inst); @@ -3956,53 +4347,36 @@ void drcbe_x86::op_mulu(Assembler &a, const instruction &inst) { // general case emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p - if (src2p.is_memory()) - a.mul(MABS(src2p.memory(), 4)); // mul [src2p] - else if (src2p.is_int_register()) - a.mul(Gpd(src2p.ireg())); // mul src2p - else if (src2p.is_immediate()) - { - a.mov(edx, src2p.immediate()); // mov edx,src2p - a.mul(edx); // mul edx - } + emit_mov_r32_p32(a, edx, src2p); // mov edx,src2p + a.mul(edx); // mul edx + emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax if (compute_hi) emit_mov_p32_r32(a, edstp, edx); // mov edstp,edx - // compute flags - if (inst.flags() != 0) + if (inst.flags()) { - if (zsflags != 0) - { - if (vflag) - a.pushfd(); // pushf - if (compute_hi) - { - if (zsflags == FLAG_Z) - a.or_(edx, eax); // or edx,eax - else if (zsflags == FLAG_S) - a.test(edx, edx); // test edx,edx - else - { - a.movzx(ecx, ax); // movzx ecx,ax - a.shr(eax, 16); // shr eax,16 - a.or_(edx, ecx); // or edx,ecx - a.or_(edx, eax); // or edx,eax - } - } - else - a.test(eax, eax); // test eax,eax + a.pushfd(); - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfd(); // pushf - a.pop(eax); // pop eax - a.and_(dword_ptr(esp, 0), ~0x84); // and [esp],~0x84 - a.or_(ptr(esp, 0), eax); // or [esp],eax - a.popfd(); // popf - } - } + a.test(edx, edx); + a.pushfd(); // will have the sign flag + upper half zero + a.pop(edx); + + a.test(eax, eax); + a.pushfd(); // lower half zero + a.pop(eax); + + a.and_(dword_ptr(esp, 0), ~(0x40 | 0x80)); + a.mov(ecx, edx); + a.and_(ecx, 0x80); // sign + + a.and_(eax, edx); + a.and_(eax, 0x40); // zero + + a.or_(eax, ecx); + a.or_(dword_ptr(esp, 0), eax); + + a.popfd(); } } @@ -4010,6 +4384,7 @@ void drcbe_x86::op_mulu(Assembler &a, const instruction &inst) else if (inst.size() == 8) { // general case + a.mov(dword_ptr(esp, 28), 0); // mov [esp+28],0 (calculate flags as 64x64=128) a.mov(dword_ptr(esp, 24), inst.flags()); // mov [esp+24],flags emit_mov_m64_p64(a, qword_ptr(esp, 16), src2p); // mov [esp+16],src2p emit_mov_m64_p64(a, qword_ptr(esp, 8), src1p); // mov [esp+8],src1p @@ -4020,7 +4395,7 @@ void drcbe_x86::op_mulu(Assembler &a, const instruction &inst) a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo a.call(imm(dmulu)); // call dmulu if (inst.flags() != 0) - a.push(ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax @@ -4037,14 +4412,79 @@ void drcbe_x86::op_mulu(Assembler &a, const instruction &inst) //------------------------------------------------- +// op_mululw - process a MULULW (32x32=32) opcode +//------------------------------------------------- + +void drcbe_x86::op_mululw(Assembler &a, const instruction &inst) +{ + // validate instruction + assert(inst.size() == 4 || inst.size() == 8); + assert_no_condition(inst); + assert_flags(inst, FLAG_V | FLAG_Z | FLAG_S); + + // normalize parameters + be_parameter dstp(*this, inst.param(0), PTYPE_MR); + be_parameter src1p(*this, inst.param(1), PTYPE_MRI); + be_parameter src2p(*this, inst.param(2), PTYPE_MRI); + normalize_commutative(src1p, src2p); + + // 32-bit form + if (inst.size() == 4) + { + // general case + emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p + emit_mov_r32_p32(a, edx, src2p); // mov edx,src2p + a.mul(edx); // mul edx + + emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax + + if (inst.flags()) + { + a.test(eax, eax); + a.pushfd(); // sign + zero + + // if edx is not zero then it overflowed + a.test(edx, edx); + a.pushfd(); + a.pop(edx); + a.and_(edx, 0x40); // zero + a.xor_(edx, 0x40); + a.shl(edx, 5); // turn into overflow flag + a.or_(dword_ptr(esp, 0), edx); + + a.popfd(); + } + } + + // 64-bit form + else if (inst.size() == 8) + { + // general case + a.mov(dword_ptr(esp, 28), 1); // mov [esp+28],1 (calculate flags as 64x64=64) + a.mov(dword_ptr(esp, 24), inst.flags()); // mov [esp+24],flags + emit_mov_m64_p64(a, qword_ptr(esp, 16), src2p); // mov [esp+16],src2p + emit_mov_m64_p64(a, qword_ptr(esp, 8), src1p); // mov [esp+8],src1p + a.mov(dword_ptr(esp, 4), imm(&m_reslo)); // mov [esp+4],&reslo + a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo + a.call(imm(dmulu)); // call dmulu + if (inst.flags() != 0) + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo + a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi + emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax + if (inst.flags() != 0) + a.popfd(); // popf + } + +} + + +//------------------------------------------------- // op_muls - process a MULS opcode //------------------------------------------------- void drcbe_x86::op_muls(Assembler &a, const instruction &inst) { - uint8_t zsflags = inst.flags() & (FLAG_Z | FLAG_S); - uint8_t vflag = inst.flags() & FLAG_V; - // validate instruction assert(inst.size() == 4 || inst.size() == 8); assert_no_condition(inst); @@ -4061,78 +4501,37 @@ void drcbe_x86::op_muls(Assembler &a, const instruction &inst) // 32-bit form if (inst.size() == 4) { - // 32-bit destination with memory/immediate or register/immediate - if (!compute_hi && !src1p.is_immediate() && src2p.is_immediate()) - { - if (src1p.is_memory()) - a.imul(eax, MABS(src1p.memory(), 4), src2p.immediate()); // imul eax,[src1p],src2p - else if (src1p.is_int_register()) - a.imul(eax, Gpd(src1p.ireg()), src2p.immediate()); // imul eax,src1p,src2p - emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax - } - - // 32-bit destination, general case - else if (!compute_hi) - { - emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p - if (src2p.is_memory()) - a.imul(eax, MABS(src2p.memory(), 4)); // imul eax,[src2p] - else if (src2p.is_int_register()) - a.imul(eax, Gpd(src2p.ireg())); // imul eax,src2p - emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax - } + emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p + emit_mov_r32_p32(a, edx, src2p); // mov edx,src2p + a.imul(edx); // imul edx - // 64-bit destination, general case - else - { - emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p - if (src2p.is_memory()) - a.imul(MABS(src2p.memory(), 4)); // imul [src2p] - else if (src2p.is_int_register()) - a.imul(Gpd(src2p.ireg())); // imul src2p - else if (src2p.is_immediate()) - { - a.mov(edx, src2p.immediate()); // mov edx,src2p - a.imul(edx); // imul edx - } - emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax + emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax + if (compute_hi) emit_mov_p32_r32(a, edstp, edx); // mov edstp,edx - } - // compute flags - if (inst.flags() != 0) + if (inst.flags()) { - if (zsflags != 0) - { - if (vflag) - a.pushfd(); // pushf - if (compute_hi) - { - if (inst.flags() == FLAG_Z) - a.or_(edx, eax); // or edx,eax - else if (inst.flags() == FLAG_S) - a.test(edx, edx); // test edx,edx - else - { - a.movzx(ecx, ax); // movzx ecx,ax - a.shr(eax, 16); // shr eax,16 - a.or_(edx, ecx); // or edx,ecx - a.or_(edx, eax); // or edx,eax - } - } - else - a.test(eax, eax); // test eax,eax + a.pushfd(); - // we rely on the fact that OF is cleared by all logical operations above - if (vflag) - { - a.pushfd(); // pushf - a.pop(eax); // pop eax - a.and_(dword_ptr(esp, 0), ~0x84); // and [esp],~0x84 - a.or_(ptr(esp, 0), eax); // or [esp],eax - a.popfd(); // popf - } - } + a.test(edx, edx); + a.pushfd(); // will have the sign flag + upper half zero + a.pop(edx); + + a.test(eax, eax); + a.pushfd(); // lower half zero + a.pop(eax); + + a.and_(dword_ptr(esp, 0), ~(0x40 | 0x80)); + a.mov(ecx, edx); + a.and_(ecx, 0x80); // sign + + a.and_(eax, edx); + a.and_(eax, 0x40); // zero + + a.or_(eax, ecx); + a.or_(dword_ptr(esp, 0), eax); + + a.popfd(); } } @@ -4140,6 +4539,7 @@ void drcbe_x86::op_muls(Assembler &a, const instruction &inst) else if (inst.size() == 8) { // general case + a.mov(dword_ptr(esp, 28), 0); // mov [esp+28],0 (calculate flags as 64x64=128) a.mov(dword_ptr(esp, 24), inst.flags()); // mov [esp+24],flags emit_mov_m64_p64(a, qword_ptr(esp, 16), src2p); // mov [esp+16],src2p emit_mov_m64_p64(a, qword_ptr(esp, 8), src1p); // mov [esp+8],src1p @@ -4150,7 +4550,7 @@ void drcbe_x86::op_muls(Assembler &a, const instruction &inst) a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo a.call(imm(dmuls)); // call dmuls if (inst.flags() != 0) - a.push(ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax @@ -4167,6 +4567,74 @@ void drcbe_x86::op_muls(Assembler &a, const instruction &inst) //------------------------------------------------- +// op_mulslw - process a MULSLW (32x32=32) opcode +//------------------------------------------------- + +void drcbe_x86::op_mulslw(Assembler &a, const instruction &inst) +{ + // validate instruction + assert(inst.size() == 4 || inst.size() == 8); + assert_no_condition(inst); + assert_flags(inst, FLAG_V | FLAG_Z | FLAG_S); + + // normalize parameters + be_parameter dstp(*this, inst.param(0), PTYPE_MR); + be_parameter src1p(*this, inst.param(1), PTYPE_MRI); + be_parameter src2p(*this, inst.param(2), PTYPE_MRI); + normalize_commutative(src1p, src2p); + + // 32-bit form + if (inst.size() == 4) + { + emit_mov_r32_p32(a, eax, src1p); // mov eax,src1p + emit_mov_r32_p32(a, edx, src2p); // mov edx,src2p + a.imul(edx); // imul edx + + emit_mov_p32_r32(a, dstp, eax); // mov dstp,eax + + if (inst.flags()) + { + a.test(eax, eax); + a.pushfd(); // sign + zero + + a.mov(ecx, edx); + a.cdq(); + + a.cmp(ecx, edx); + a.pushfd(); + a.pop(edx); + a.and_(edx, 0x40); // zero + a.xor_(edx, 0x40); + a.shl(edx, 5); // turn into overflow flag + a.or_(dword_ptr(esp, 0), edx); + + a.popfd(); + } + } + + // 64-bit form + else if (inst.size() == 8) + { + // general case + a.mov(dword_ptr(esp, 28), 1); // mov [esp+28],1 (calculate flags as 64x64=64) + a.mov(dword_ptr(esp, 24), inst.flags()); // mov [esp+24],flags + emit_mov_m64_p64(a, qword_ptr(esp, 16), src2p); // mov [esp+16],src2p + emit_mov_m64_p64(a, qword_ptr(esp, 8), src1p); // mov [esp+8],src1p + a.mov(dword_ptr(esp, 4), imm(&m_reslo)); // mov [esp+4],&reslo + a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo + a.call(imm(dmuls)); // call dmuls + if (inst.flags() != 0) + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo + a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi + emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax + if (inst.flags() != 0) + a.popfd(); // popf + } +} + + +//------------------------------------------------- // op_divu - process a DIVU opcode //------------------------------------------------- @@ -4221,7 +4689,7 @@ void drcbe_x86::op_divu(Assembler &a, const instruction &inst) a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo a.call(imm(ddivu)); // call ddivu if (inst.flags() != 0) - a.push(ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax @@ -4292,7 +4760,7 @@ void drcbe_x86::op_divs(Assembler &a, const instruction &inst) a.mov(dword_ptr(esp, 0), imm(&m_reslo)); // mov [esp],&reslo a.call(imm(ddivs)); // call ddivs if (inst.flags() != 0) - a.push(ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] + a.push(dword_ptr(u64(flags_unmap), eax, 2)); // push flags_unmap[eax*4] a.mov(eax, MABS((uint32_t *)&m_reslo + 0)); // mov eax,reslo.lo a.mov(edx, MABS((uint32_t *)&m_reslo + 1)); // mov edx,reslo.hi emit_mov_p64_r64(a, dstp, eax, edx); // mov dstp,edx:eax @@ -4802,6 +5270,12 @@ void drcbe_x86::op_lzcnt(Assembler &a, const instruction &inst) // pick a target register for the general case Gp const dstreg = dstp.select_register(eax); + if (inst.flags()) + { + a.xor_(eax, eax); // reset status flags + a.test(eax, eax); + } + // 32-bit form if (inst.size() == 4) { @@ -4811,24 +5285,37 @@ void drcbe_x86::op_lzcnt(Assembler &a, const instruction &inst) a.cmovz(dstreg, ecx); // cmovz dstreg,ecx a.xor_(dstreg, 31); // xor dstreg,31 emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg + + a.test(dstreg, dstreg); } // 64-bit form else if (inst.size() == 8) { - emit_mov_r64_p64(a, edx, dstreg, srcp); // mov dstreg:edx,srcp - a.bsr(dstreg, dstreg); // bsr dstreg,dstreg + emit_mov_r64_p64(a, dstreg, edx, srcp); // mov dstreg:edx,srcp + Label skip = a.newLabel(); - a.jnz(skip); // jnz skip - a.mov(ecx, 32 ^ 31); // mov ecx,32 ^ 31 - a.bsr(dstreg, edx); // bsr dstreg,edx - a.cmovz(dstreg, ecx); // cmovz dstreg,ecx - a.add(ecx, 32); // add ecx,32 - a.bind(skip); // skip: - reset_last_upper_lower_reg(); - a.xor_(edx, edx); // xor edx,edx - a.xor_(dstreg, 31); // xor dstreg,31 + Label end = a.newLabel(); + + a.bsr(edx, edx); + a.jz(skip); + a.xor_(edx, 31 ^ 63); + a.mov(dstreg, edx); + a.jmp(end); + + a.bind(skip); + a.mov(edx, 64 ^ 63); + a.bsr(dstreg, dstreg); + a.cmovz(dstreg, edx); + + a.bind(end); + + a.xor_(dstreg, 63); + a.mov(edx, 0); + emit_mov_p64_r64(a, dstp, dstreg, edx); // mov dstp,edx:dstreg + + a.test(dstreg, dstreg); } } @@ -4850,6 +5337,12 @@ void drcbe_x86::op_tzcnt(Assembler &a, const instruction &inst) Gp const dstreg = dstp.select_register(eax); + if (inst.flags()) + { + a.xor_(eax, eax); // reset status flags + a.test(eax, eax); + } + // 32-bit form if (inst.size() == 4) { @@ -4858,15 +5351,18 @@ void drcbe_x86::op_tzcnt(Assembler &a, const instruction &inst) a.bsf(dstreg, dstreg); // bsf dstreg,dstreg a.cmovz(dstreg, ecx); // cmovz dstreg,ecx emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg + + a.mov(ecx, dstreg); + a.xor_(ecx, 32); } // 64-bit form else if (inst.size() == 8) { Label skip = a.newLabel(); - emit_mov_r64_p64(a, edx, dstreg, srcp); // mov dstreg:edx,srcp + emit_mov_r64_p64(a, dstreg, edx, srcp); // mov dstreg:edx,srcp a.bsf(dstreg, dstreg); // bsf dstreg,dstreg - a.jz(skip); // jnz skip + a.jnz(skip); // jnz skip a.mov(ecx, 32); // mov ecx,32 a.bsf(dstreg, edx); // bsf dstreg,edx a.cmovz(dstreg, ecx); // cmovz dstreg,ecx @@ -4875,6 +5371,9 @@ void drcbe_x86::op_tzcnt(Assembler &a, const instruction &inst) reset_last_upper_lower_reg(); a.xor_(edx, edx); // xor edx,edx emit_mov_p64_r64(a, dstp, dstreg, edx); // mov dstp,edx:dstreg + + a.mov(ecx, dstreg); + a.xor_(ecx, 64); } } @@ -4954,23 +5453,23 @@ void drcbe_x86::op_shl(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdShl, MABS(dstp.memory(), 4), src2p, // shl [dstp],src2p + shift_op_param(a, Inst::kIdShl, inst.size(), MABS(dstp.memory(), 4), src2p, // shl [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdShl, dstreg, src2p, // shl dstreg,src2p + shift_op_param(a, Inst::kIdShl, inst.size(), dstreg, src2p, // shl dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5010,23 +5509,23 @@ void drcbe_x86::op_shr(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdShr, MABS(dstp.memory(), 4), src2p, // shr [dstp],src2p + shift_op_param(a, Inst::kIdShr, inst.size(), MABS(dstp.memory(), 4), src2p, // shr [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdShr, dstreg, src2p, // shr dstreg,src2p + shift_op_param(a, Inst::kIdShr, inst.size(), dstreg, src2p, // shr dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5066,23 +5565,23 @@ void drcbe_x86::op_sar(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdSar, MABS(dstp.memory(), 4), src2p, // sar [dstp],src2p + shift_op_param(a, Inst::kIdSar, inst.size(), MABS(dstp.memory(), 4), src2p, // sar [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdSar, dstreg, src2p, // sar dstreg,src2p + shift_op_param(a, Inst::kIdSar, inst.size(), dstreg, src2p, // sar dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5122,23 +5621,23 @@ void drcbe_x86::op_rol(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdRol, MABS(dstp.memory(), 4), src2p, // rol [dstp],src2p + shift_op_param(a, Inst::kIdRol, inst.size(), MABS(dstp.memory(), 4), src2p, // rol [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdRol, dstreg, src2p, // rol dstreg,src2p + shift_op_param(a, Inst::kIdRol, inst.size(), dstreg, src2p, // rol dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5178,23 +5677,23 @@ void drcbe_x86::op_ror(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdRor, MABS(dstp.memory(), 4), src2p, // ror [dstp],src2p + shift_op_param(a, Inst::kIdRor, inst.size(), MABS(dstp.memory(), 4), src2p, // ror [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdRor, dstreg, src2p, // rol dstreg,src2p + shift_op_param(a, Inst::kIdRor, inst.size(), dstreg, src2p, // rol dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5234,23 +5733,23 @@ void drcbe_x86::op_rolc(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdRcl, MABS(dstp.memory(), 4), src2p, // rcl [dstp],src2p + shift_op_param(a, Inst::kIdRcl, inst.size(), MABS(dstp.memory(), 4), src2p, // rcl [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32_keepflags(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdRcl, dstreg, src2p, // rcl dstreg,src2p + shift_op_param(a, Inst::kIdRcl, inst.size(), dstreg, src2p, // rcl dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5290,23 +5789,23 @@ void drcbe_x86::op_rorc(Assembler &a, const instruction &inst) { // dstp == src1p in memory if (dstp.is_memory() && dstp == src1p) - shift_op_param(a, Inst::kIdRcr, MABS(dstp.memory(), 4), src2p, // rcr [dstp],src2p + shift_op_param(a, Inst::kIdRcr, inst.size(), MABS(dstp.memory(), 4), src2p, // rcr [dstp],src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); // general case else { emit_mov_r32_p32_keepflags(a, dstreg, src1p); // mov dstreg,src1p - shift_op_param(a, Inst::kIdRcr, dstreg, src2p, // rcr dstreg,src2p + shift_op_param(a, Inst::kIdRcr, inst.size(), dstreg, src2p, // rcr dstreg,src2p [inst](Assembler &a, Operand const &dst, be_parameter const &src) { // optimize zero case return (!inst.flags() && !src.immediate()); - }); + }, true); emit_mov_p32_r32(a, dstp, dstreg); // mov dstp,dstreg } } @@ -5346,9 +5845,9 @@ void drcbe_x86::op_fload(Assembler &a, const instruction &inst) // immediate index if (indp.is_immediate()) { - a.mov(eax, MABS(basep.memory(4*indp.immediate()))); // mov eax,[basep + 4*indp] + a.mov(eax, MABS(basep.memory(inst.size()*indp.immediate()))); if (inst.size() == 8) - a.mov(edx, MABS(basep.memory(4 + 4*indp.immediate()))); // mov edx,[basep + 4*indp + 4] + a.mov(edx, MABS(basep.memory(4 + inst.size()*indp.immediate()))); } // other index @@ -5356,15 +5855,15 @@ void drcbe_x86::op_fload(Assembler &a, const instruction &inst) { Gp const indreg = indp.select_register(ecx); emit_mov_r32_p32(a, indreg, indp); - a.mov(eax, ptr(u64(basep.memory(0)), indreg, 2)); // mov eax,[basep + 4*indp] + a.mov(eax, ptr(u64(basep.memory(0)), indreg, (inst.size() == 8) ? 3 : 2)); if (inst.size() == 8) - a.mov(edx, ptr(u64(basep.memory(4)), indreg, 2)); // mov edx,[basep + 4*indp + 4] + a.mov(edx, ptr(u64(basep.memory(4)), indreg, (inst.size() == 8) ? 3 : 2)); } // general case - a.mov(MABS(dstp.memory(0)), eax); // mov [dstp],eax + a.mov(MABS(dstp.memory(0)), eax); if (inst.size() == 8) - a.mov(MABS(dstp.memory(4)), edx); // mov [dstp + 4],edx + a.mov(MABS(dstp.memory(4)), edx); } @@ -5385,16 +5884,16 @@ void drcbe_x86::op_fstore(Assembler &a, const instruction &inst) be_parameter srcp(*this, inst.param(2), PTYPE_MF); // general case - a.mov(eax, MABS(srcp.memory(0))); // mov eax,[srcp] + a.mov(eax, MABS(srcp.memory(0))); if (inst.size() == 8) - a.mov(edx, MABS(srcp.memory(4))); // mov edx,[srcp + 4] + a.mov(edx, MABS(srcp.memory(4))); // immediate index if (indp.is_immediate()) { - a.mov(MABS(basep.memory(4*indp.immediate())), eax); // mov [basep + 4*indp],eax + a.mov(MABS(basep.memory(inst.size()*indp.immediate())), eax); if (inst.size() == 8) - a.mov(MABS(basep.memory(4 + 4*indp.immediate())), edx); // mov [basep + 4*indp + 4],edx + a.mov(MABS(basep.memory(4 + inst.size()*indp.immediate())), edx); } // other index @@ -5402,9 +5901,9 @@ void drcbe_x86::op_fstore(Assembler &a, const instruction &inst) { Gp const indreg = indp.select_register(ecx); emit_mov_r32_p32(a, indreg, indp); - a.mov(ptr(u64(basep.memory(0)), indreg, 2), eax); // mov [basep + 4*indp],eax + a.mov(ptr(u64(basep.memory(0)), indreg, (inst.size() == 8) ? 3 : 2), eax); if (inst.size() == 8) - a.mov(ptr(u64(basep.memory(4)), indreg, 2), edx); // mov [basep + 4*indp + 4],edx + a.mov(ptr(u64(basep.memory(4)), indreg, (inst.size() == 8) ? 3 : 2), edx); } } @@ -6036,7 +6535,7 @@ void drcbe_x86::op_icopyf(Assembler &a, const instruction &inst) // dmulu - perform a double-wide unsigned multiply //------------------------------------------------- -int drcbe_x86::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src2, bool flags) +int drcbe_x86::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src2, bool flags, bool halfmul_flags) { // shortcut if we don't care about the high bits or the flags if (&dstlo == &dsthi && flags == false) @@ -6072,7 +6571,11 @@ int drcbe_x86::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t s // store the results dsthi = hi; dstlo = lo; - return ((hi >> 60) & FLAG_S) | ((dsthi != 0) << 1); + + if (halfmul_flags) + return ((lo >> 60) & FLAG_S) | ((hi != 0) << 1); + + return ((hi >> 60) & FLAG_S) | ((hi != 0) << 1); } @@ -6080,7 +6583,7 @@ int drcbe_x86::dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t s // dmuls - perform a double-wide signed multiply //------------------------------------------------- -int drcbe_x86::dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2, bool flags) +int drcbe_x86::dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2, bool flags, bool halfmul_flags) { uint64_t lo, hi, prevlo; uint64_t a, b, temp; @@ -6126,7 +6629,11 @@ int drcbe_x86::dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src // store the results dsthi = hi; dstlo = lo; - return ((hi >> 60) & FLAG_S) | ((dsthi != ((int64_t)lo >> 63)) << 1); + + if (halfmul_flags) + return ((lo >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1); + + return ((hi >> 60) & FLAG_S) | ((hi != ((int64_t)lo >> 63)) << 1); } diff --git a/src/devices/cpu/drcbex86.h b/src/devices/cpu/drcbex86.h index 9feb21f379b..b39093ddb82 100644 --- a/src/devices/cpu/drcbex86.h +++ b/src/devices/cpu/drcbex86.h @@ -117,6 +117,7 @@ private: asmjit::x86::Mem MABS(void const *base, u32 const size = 0) const { return asmjit::x86::Mem(u64(base), size); } void normalize_commutative(be_parameter &inner, be_parameter &outer); void emit_combine_z_flags(asmjit::x86::Assembler &a); + void emit_combine_zs_flags(asmjit::x86::Assembler &a); void emit_combine_z_shl_flags(asmjit::x86::Assembler &a); void reset_last_upper_lower_reg(); void set_last_lower_reg(asmjit::x86::Assembler &a, be_parameter const ¶m, asmjit::x86::Gp const ®lo); @@ -134,6 +135,7 @@ private: void op_mapvar(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_nop(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_break(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_debug(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_exit(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_hashjmp(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -148,6 +150,7 @@ private: void op_getfmod(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_getexp(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_getflgs(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_setflgs(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_save(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_restore(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -170,7 +173,9 @@ private: void op_subc(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_cmp(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_mulu(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_mululw(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_muls(asmjit::x86::Assembler &a, const uml::instruction &inst); + void op_mulslw(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_divu(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_divs(asmjit::x86::Assembler &a, const uml::instruction &inst); void op_and(asmjit::x86::Assembler &a, const uml::instruction &inst); @@ -217,7 +222,7 @@ private: void emit_mov_p32_r32(asmjit::x86::Assembler &a, be_parameter const ¶m, asmjit::x86::Gp const ®); void alu_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, asmjit::Operand const &dst, be_parameter const ¶m, std::function<bool(asmjit::x86::Assembler &a, asmjit::Operand const &dst, be_parameter const &src)> optimize = [](asmjit::x86::Assembler &a, asmjit::Operand dst, be_parameter const &src) { return false; }); - void shift_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, asmjit::Operand const &dst, be_parameter const ¶m, std::function<bool(asmjit::x86::Assembler &a, asmjit::Operand const &dst, be_parameter const &src)> optimize); + void shift_op_param(asmjit::x86::Assembler &a, asmjit::x86::Inst::Id const opcode, size_t opsize, asmjit::Operand const &dst, be_parameter const ¶m, std::function<bool(asmjit::x86::Assembler &a, asmjit::Operand const &dst, be_parameter const &src)> optimize, bool update_flags); // 64-bit code emission helpers void emit_mov_r64_p64(asmjit::x86::Assembler &a, asmjit::x86::Gp const ®lo, asmjit::x86::Gp const ®hi, be_parameter const ¶m); @@ -246,11 +251,13 @@ private: void emit_fstp_p(asmjit::x86::Assembler &a, int size, be_parameter const ¶m); // callback helpers - static int dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src2, bool flags); - static int dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2, bool flags); + static int dmulu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src2, bool flags, bool halfmul_flags); + static int dmuls(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2, bool flags, bool halfmul_flags); static int ddivu(uint64_t &dstlo, uint64_t &dsthi, uint64_t src1, uint64_t src2); static int ddivs(uint64_t &dstlo, uint64_t &dsthi, int64_t src1, int64_t src2); + void calculate_status_flags(asmjit::x86::Assembler &a, asmjit::Operand const &dst, u8 flags); + size_t emit(asmjit::CodeHolder &ch); // internal state diff --git a/src/devices/cpu/drcumlsh.h b/src/devices/cpu/drcumlsh.h index 5dec2d02dba..3660afb1979 100644 --- a/src/devices/cpu/drcumlsh.h +++ b/src/devices/cpu/drcumlsh.h @@ -29,6 +29,7 @@ /* ----- Control Flow Operations ----- */ #define UML_NOP(block) do { using namespace uml; block.append().nop(); } while (0) +#define UML_BREAK(block) do { using namespace uml; block.append().break_(); } while (0) #define UML_DEBUG(block, pc) do { using namespace uml; block.append().debug(pc); } while (0) #define UML_EXIT(block, param) do { using namespace uml; block.append().exit(param); } while (0) #define UML_EXITc(block, cond, param) do { using namespace uml; block.append().exit(param, cond); } while (0) @@ -53,6 +54,7 @@ #define UML_GETFMOD(block, dst) do { using namespace uml; block.append().getfmod(dst); } while (0) #define UML_GETEXP(block, dst) do { using namespace uml; block.append().getexp(dst); } while (0) #define UML_GETFLGS(block, dst, flags) do { using namespace uml; block.append().getflgs(dst, flags); } while (0) +#define UML_SETFLGS(block, flags) do { using namespace uml; block.append().setflgs(flags); } while (0) #define UML_SAVE(block, dst) do { using namespace uml; block.append().save(dst); } while (0) #define UML_RESTORE(block, src) do { using namespace uml; block.append().restore(src); } while (0) @@ -78,7 +80,9 @@ #define UML_SUBB(block, dst, src1, src2) do { using namespace uml; block.append().subb(dst, src1, src2); } while (0) #define UML_CMP(block, src1, src2) do { using namespace uml; block.append().cmp(src1, src2); } while (0) #define UML_MULU(block, dst, edst, src1, src2) do { using namespace uml; block.append().mulu(dst, edst, src1, src2); } while (0) +#define UML_MULULW(block, dst, src1, src2) do { using namespace uml; block.append().mululw(dst, src1, src2); } while (0) #define UML_MULS(block, dst, edst, src1, src2) do { using namespace uml; block.append().muls(dst, edst, src1, src2); } while (0) +#define UML_MULSLW(block, dst, src1, src2) do { using namespace uml; block.append().mulslw(dst, src1, src2); } while (0) #define UML_DIVU(block, dst, edst, src1, src2) do { using namespace uml; block.append().divu(dst, edst, src1, src2); } while (0) #define UML_DIVS(block, dst, edst, src1, src2) do { using namespace uml; block.append().divs(dst, edst, src1, src2); } while (0) #define UML_AND(block, dst, src1, src2) do { using namespace uml; block.append()._and(dst, src1, src2); } while (0) @@ -118,7 +122,9 @@ #define UML_DSUBB(block, dst, src1, src2) do { using namespace uml; block.append().dsubb(dst, src1, src2); } while (0) #define UML_DCMP(block, src1, src2) do { using namespace uml; block.append().dcmp(src1, src2); } while (0) #define UML_DMULU(block, dst, edst, src1, src2) do { using namespace uml; block.append().dmulu(dst, edst, src1, src2); } while (0) +#define UML_DMULULW(block, dst, src1, src2) do { using namespace uml; block.append().dmululw(dst, src1, src2); } while (0) #define UML_DMULS(block, dst, edst, src1, src2) do { using namespace uml; block.append().dmuls(dst, edst, src1, src2); } while (0) +#define UML_DMULSLW(block, dst, src1, src2) do { using namespace uml; block.append().dmulslw(dst, src1, src2); } while (0) #define UML_DDIVU(block, dst, edst, src1, src2) do { using namespace uml; block.append().ddivu(dst, edst, src1, src2); } while (0) #define UML_DDIVS(block, dst, edst, src1, src2) do { using namespace uml; block.append().ddivs(dst, edst, src1, src2); } while (0) #define UML_DAND(block, dst, src1, src2) do { using namespace uml; block.append().dand(dst, src1, src2); } while (0) @@ -140,8 +146,8 @@ /* ----- 32-bit Floating Point Arithmetic Operations ----- */ #define UML_FSLOAD(block, dst, base, index) do { using namespace uml; block.append().fsload(dst, base, index); } while (0) #define UML_FSSTORE(block, base, index, src1) do { using namespace uml; block.append().fsstore(base, index, src1); } while (0) -#define UML_FSREAD(block, dst, src1, space) do { using namespace uml; block.append().fsread(dst, src1, AS_##space); } while (0) -#define UML_FSWRITE(block, dst, src1, space) do { using namespace uml; block.append().fswrite(dst, src1, AS_##space); } while (0) +#define UML_FSREAD(block, dst, src1, space) do { using namespace uml; block.append().fsread(dst, src1, space); } while (0) +#define UML_FSWRITE(block, dst, src1, space) do { using namespace uml; block.append().fswrite(dst, src1, space); } while (0) #define UML_FSMOV(block, dst, src1) do { using namespace uml; block.append().fsmov(dst, src1); } while (0) #define UML_FSMOVc(block, cond, dst, src1) do { using namespace uml; block.append().fsmov(cond, dst, src1); } while (0) #define UML_FSTOINT(block, dst, src1, size, round) do { using namespace uml; block.append().fstoint(dst, src1, size, round); } while (0) @@ -164,8 +170,8 @@ /* ----- 64-bit Floating Point Arithmetic Operations ----- */ #define UML_FDLOAD(block, dst, base, index) do { using namespace uml; block.append().fdload(dst, base, index); } while (0) #define UML_FDSTORE(block, base, index, src1) do { using namespace uml; block.append().fdstore(base, index, src1); } while (0) -#define UML_FDREAD(block, dst, src1, space) do { using namespace uml; block.append().fdread(dst, src1, AS_##space); } while (0) -#define UML_FDWRITE(block, dst, src1, space) do { using namespace uml; block.append().fdwrite(dst, src1, AS_##space); } while (0) +#define UML_FDREAD(block, dst, src1, space) do { using namespace uml; block.append().fdread(dst, src1, space); } while (0) +#define UML_FDWRITE(block, dst, src1, space) do { using namespace uml; block.append().fdwrite(dst, src1, space); } while (0) #define UML_FDMOV(block, dst, src1) do { using namespace uml; block.append().fdmov(dst, src1); } while (0) #define UML_FDMOVc(block, cond, dst, src1) do { using namespace uml; block.append().fdmov(cond, dst, src1); } while (0) #define UML_FDTOINT(block, dst, src1, size, round) do { using namespace uml; block.append().fdtoint(dst, src1, size, round); } while (0) diff --git a/src/devices/cpu/e0c6200/e0c6200.cpp b/src/devices/cpu/e0c6200/e0c6200.cpp index e8c8852af9c..83c3eec704b 100644 --- a/src/devices/cpu/e0c6200/e0c6200.cpp +++ b/src/devices/cpu/e0c6200/e0c6200.cpp @@ -4,17 +4,17 @@ Seiko Epson E0C6200 CPU core and E0C62 MCU family - References: - - 1998 MF297-06a E0C6200/E0C6200A Core CPU Manual - - 1998 MF1049-01a E0C6S46 Technical Manual +References: +- 1998 MF297-06a E0C6200/E0C6200A Core CPU Manual +- 1998 MF1049-01a E0C6S46 Technical Manual - E0C6200 is a CPU core used as the basis of many chips, it is not standalone. - Seiko Epson often changed prefixes of their device names. Depending on when, - the E0C6200 is known as SMC6200, E0C6200, S1C6200. +E0C6200 is a CPU core used as the basis of many chips, it is not standalone. +Seiko Epson often changed prefixes of their device names. Depending on when, +the E0C6200 is known as SMC6200, E0C6200, S1C6200. - TODO: - - RLC is part of the r,q opcodes and requires that r == q, what happens otherwise? - - documentation is conflicting on whether or not the zero flag is set on RLC/RRC +TODO: +- RLC is part of the r,q opcodes and requires that r == q, what happens otherwise? +- documentation is conflicting on whether or not the zero flag is set on RLC/RRC */ @@ -839,7 +839,7 @@ void e0c6200_cpu_device::execute_one() // illegal opcode default: - logerror("unknown opcode $%03X at $%04X\n", m_op, m_prev_pc); + op_illegal(); break; } // 0xff0 diff --git a/src/devices/cpu/e0c6200/e0c6200.h b/src/devices/cpu/e0c6200/e0c6200.h index 0024092e02a..58c4769d55c 100644 --- a/src/devices/cpu/e0c6200/e0c6200.h +++ b/src/devices/cpu/e0c6200/e0c6200.h @@ -91,6 +91,7 @@ protected: void inc_x(); void inc_y(); void do_branch(int condition = 1); + void op_illegal(); // opcode handlers u8 op_inc(u8 x); diff --git a/src/devices/cpu/e0c6200/e0c6200op.cpp b/src/devices/cpu/e0c6200/e0c6200op.cpp index 93ab8011f7d..d637c3cb312 100644 --- a/src/devices/cpu/e0c6200/e0c6200op.cpp +++ b/src/devices/cpu/e0c6200/e0c6200op.cpp @@ -116,6 +116,11 @@ void e0c6200_cpu_device::do_branch(int condition) m_pc = m_jpc | (m_op & 0xff); } +void e0c6200_cpu_device::op_illegal() +{ + logerror("unknown opcode $%03X at $%04X\n", m_op, m_prev_pc); +} + // common opcodes (simpler ones are handled directly) // note: it is implied that all opcodes below except RRC take 7 clock cycles (5 already deducted) diff --git a/src/devices/cpu/e0c6200/e0c6s46.cpp b/src/devices/cpu/e0c6200/e0c6s46.cpp index fcc9ac6c5cf..23d110887e9 100644 --- a/src/devices/cpu/e0c6200/e0c6s46.cpp +++ b/src/devices/cpu/e0c6200/e0c6s46.cpp @@ -2,16 +2,16 @@ // copyright-holders:hap /* - Seiko Epson E0C6S46 MCU - QFP5-128pin, see manual for pinout + Seiko Epson E0C6S46 family - TODO: - - OSC3 - - K input interrupts - - finish i/o ports - - serial interface - - buzzer envelope addition - - add mask options for ports (eg. buzzer on output port R4x is optional) +E0C6S46: 6144x12 ROM, 640x4 RAM, 2*80x4 VRAM, LCD has 16 commons and 40 segments +E0C6S48: 8192x12 ROM, 768x4 RAM, 2*102x4 VRAM, LCD has 16 commons and 51 segments + +TODO: +- finish i/o ports +- serial interface +- what happens if OSC3 is selected while OSCC (bit 2) is low? +- add mask options for ports (eg. buzzer on output port R4x is optional) */ @@ -28,36 +28,59 @@ enum IRQREG_INPUT1 }; +// device definitions DEFINE_DEVICE_TYPE(E0C6S46, e0c6s46_device, "e0c6s46", "Seiko Epson E0C6S46") +DEFINE_DEVICE_TYPE(E0C6S48, e0c6s48_device, "e0c6s48", "Seiko Epson E0C6S48") // internal memory maps -void e0c6s46_device::e0c6s46_program(address_map &map) +void e0c6s46_device::program_map(address_map &map) { map(0x0000, 0x17ff).rom(); } +void e0c6s48_device::program_map(address_map &map) +{ + map(0x0000, 0x1fff).rom(); +} -void e0c6s46_device::e0c6s46_data(address_map &map) +void e0c6s46_device::data_map(address_map &map) { map(0x0000, 0x027f).ram(); - map(0x0e00, 0x0e4f).ram().share("vram1"); - map(0x0e80, 0x0ecf).ram().share("vram2"); + map(0x0e00, 0x0e4f).ram().share(m_vram[0]); + map(0x0e80, 0x0ecf).ram().share(m_vram[1]); map(0x0f00, 0x0f7f).rw(FUNC(e0c6s46_device::io_r), FUNC(e0c6s46_device::io_w)); } +void e0c6s48_device::data_map(address_map &map) +{ + map(0x0000, 0x02ff).ram(); + map(0x0e00, 0x0e65).ram().share(m_vram[0]); + map(0x0e80, 0x0ee5).ram().share(m_vram[1]); + map(0x0f00, 0x0f7f).rw(FUNC(e0c6s48_device::io_r), FUNC(e0c6s48_device::io_w)); +} -// device definitions -e0c6s46_device::e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : - e0c6200_cpu_device(mconfig, E0C6S46, tag, owner, clock, address_map_constructor(FUNC(e0c6s46_device::e0c6s46_program), this), address_map_constructor(FUNC(e0c6s46_device::e0c6s46_data), this)), - m_vram1(*this, "vram1"), - m_vram2(*this, "vram2"), - m_pixel_update_cb(*this), + +// constructor +e0c6s46_device::e0c6s46_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor program, address_map_constructor data) : + e0c6200_cpu_device(mconfig, type, tag, owner, clock, program, data), + m_vram(*this, "vram%u", 1U), + m_write_segs(*this), + m_write_contrast(*this), + m_pixel_cb(*this), m_write_r(*this), m_read_p(*this, 0), - m_write_p(*this) + m_write_p(*this), + m_osc3(0) { } +e0c6s46_device::e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + e0c6s46_device(mconfig, E0C6S46, tag, owner, clock, address_map_constructor(FUNC(e0c6s46_device::program_map), this), address_map_constructor(FUNC(e0c6s46_device::data_map), this)) +{ } + +e0c6s48_device::e0c6s48_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + e0c6s46_device(mconfig, E0C6S48, tag, owner, clock, address_map_constructor(FUNC(e0c6s48_device::program_map), this), address_map_constructor(FUNC(e0c6s48_device::data_map), this)) +{ } //------------------------------------------------- @@ -68,15 +91,24 @@ void e0c6s46_device::device_start() { e0c6200_cpu_device::device_start(); - m_pixel_update_cb.resolve(); + // misc init + m_osc1 = clock(); + if (m_osc3 == 0) + m_osc3 = m_osc1; - // create timers m_core_256_handle = timer_alloc(FUNC(e0c6s46_device::core_256_cb), this); - m_core_256_handle->adjust(attotime::from_ticks(64, unscaled_clock())); + m_core_256_handle->adjust(attotime::from_ticks(64, m_osc1)); m_prgtimer_handle = timer_alloc(FUNC(e0c6s46_device::prgtimer_cb), this); - m_prgtimer_handle->adjust(attotime::never); m_buzzer_handle = timer_alloc(FUNC(e0c6s46_device::buzzer_cb), this); - m_buzzer_handle->adjust(attotime::never); + m_osc_change = timer_alloc(FUNC(e0c6s46_device::osc_change), this); + m_lcd_driver = timer_alloc(FUNC(e0c6s46_device::lcd_driver_cb), this); + m_lcd_driver->adjust(attotime::from_ticks(1024, m_osc1)); + + m_pixel_cb.resolve(); + + const u32 render_buf_size = m_vram[0].bytes() * 2 * 4; + m_render_buf = make_unique_clear<u8[]>(render_buf_size); + save_pointer(NAME(m_render_buf), render_buf_size); // zerofill memset(m_port_r, 0x0, sizeof(m_port_r)); @@ -114,6 +146,7 @@ void e0c6s46_device::device_start() m_bz_43_on = 0; m_bz_freq = 0; m_bz_envelope = 0; + m_bz_envelope_count = 0; m_bz_duty_ratio = 0; m_bz_1shot_on = 0; m_bz_1shot_running = false; @@ -156,6 +189,7 @@ void e0c6s46_device::device_start() save_item(NAME(m_bz_43_on)); save_item(NAME(m_bz_freq)); save_item(NAME(m_bz_envelope)); + save_item(NAME(m_bz_envelope_count)); save_item(NAME(m_bz_duty_ratio)); save_item(NAME(m_bz_1shot_on)); save_item(NAME(m_bz_1shot_running)); @@ -177,12 +211,12 @@ void e0c6s46_device::device_reset() memset(m_irqflag, 0, sizeof(m_irqflag)); memset(m_irqmask, 0, sizeof(m_irqmask)); - // reset other i/o + // reset other I/O m_data->write_byte(0xf41, 0xf); m_data->write_byte(0xf54, 0xf); m_data->write_byte(0xf70, 0x0); m_data->write_byte(0xf71, 0x8); - m_data->write_byte(0xf73, m_svd & 0xc0); + m_data->write_byte(0xf73, m_svd & 3); m_data->write_byte(0xf74, 0x0); m_data->write_byte(0xf75, 0x4); @@ -195,6 +229,8 @@ void e0c6s46_device::device_reset() m_data->write_byte(0xf7d, 0x0); m_data->write_byte(0xf7e, 0x0); + m_write_contrast(m_lcd_contrast); + // reset ports for (int i = 0; i < 5; i++) write_r(i, m_port_r[i]); @@ -212,9 +248,9 @@ void e0c6s46_device::execute_one() { // E0C6S46 has no support for SLP opcode if (m_op == 0xff9) - return; - - e0c6200_cpu_device::execute_one(); + op_illegal(); + else + e0c6200_cpu_device::execute_one(); } @@ -240,13 +276,19 @@ bool e0c6s46_device::check_interrupt() for (int pri = 5; pri >= 0; pri--) { // hw glitch note, not emulated: if a new interrupt is requested in the - // middle of handling this interrupt, irq vector may be an OR of 2 vectors - m_irq_vector = 2*pri + 2; + // middle of handling this interrupt, IRQ vector may be an OR of 2 vectors + m_irq_vector = 2 * pri + 2; int reg = priorder[pri]; m_irq_id = reg; switch (reg) { + // IK0/IK1 only have 1 flag bit + case IRQREG_INPUT0: case IRQREG_INPUT1: + if (m_irqflag[reg]) + return true; + break; + // other: mask vs flag default: if (m_irqflag[reg] & m_irqmask[reg]) @@ -265,10 +307,24 @@ void e0c6s46_device::execute_set_input(int line, int state) return; state = (state) ? 1 : 0; - int port = line >> 2 & 1; + u8 port = line >> 2 & 1; u8 bit = 1 << (line & 3); + u8 prev = m_port_k[port]; m_port_k[port] = (m_port_k[port] & ~bit) | (state ? bit : 0); + + // set IRQ flag on falling/rising edge of input + u8 dfk = (port == 0) ? m_dfk0 : 0xf; + u8 edge = ~(prev ^ dfk) & (m_port_k[port] ^ dfk) & bit; + if (m_irqmask[IRQREG_INPUT0 + port] & edge) + { + m_irqflag[IRQREG_INPUT0 + port] |= 1; + m_possible_irq = true; + } + + // clock programmable timer on falling edge of K03 + if ((prev & ~m_port_k[port] & bit) && m_prgtimer_on && (m_prgtimer_select & 7) < 2) + clock_prgtimer(); } @@ -284,28 +340,22 @@ void e0c6s46_device::write_r(u8 port, u8 data) data &= 0xf; m_port_r[port] = data; - // ports R0x-R3x can be high-impedance - u8 out = data; - if (port < 4 && !(m_r_dir >> port & 1)) - out = 0xf; - - switch (port) + if (port < 4) { - case 0: m_write_r[0](port, out, 0xff); break; - case 1: m_write_r[1](port, out, 0xff); break; - case 2: m_write_r[2](port, out, 0xff); break; - case 3: m_write_r[3](port, out, 0xff); break; // TODO: R33 PTCLK/_SRDY - - // R4x: special output - case 4: - // d3: buzzer on: direct output or 1-shot output - if ((data & 8) != m_bz_43_on) - { - m_bz_43_on = data & 8; - reset_buzzer(); - } - write_r4_out(); - break; + // ports R0-R3 can be high-impedance + u8 mask = BIT(m_r_dir, port) ? 0xf : 0; + m_write_r[port](port, data | (mask ^ 0xf), mask); + } + else + { + // R43: buzzer on: direct output or 1-shot output + if ((data & 8) != m_bz_43_on) + { + m_bz_43_on = data & 8; + reset_bz_envelope(); + reset_buzzer(); + } + write_r4_out(); } } @@ -314,8 +364,8 @@ void e0c6s46_device::write_r4_out() // R40: _FOUT(clock inverted output) // R42: FOUT or _BZ // R43: BZ(buzzer) - u8 out = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4); - m_write_r[4](4, out, 0xff); + u8 data = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4); + m_write_r[4](4, data, 0xf); } @@ -326,20 +376,18 @@ void e0c6s46_device::write_p(u8 port, u8 data) data &= 0xf; m_port_p[port] = data; - // don't output if port direction is set to input - if (!(m_p_dir >> port & 1)) - return; - - m_write_p[port](port, data, 0xff); + // high-impedance if port is set to input + u8 mask = BIT(m_p_dir, port) ? 0xf : 0; + m_write_p[port](port, data | (mask ^ 0xf), mask); } u8 e0c6s46_device::read_p(u8 port) { // return written value if port direction is set to output - if (m_p_dir >> port & 1) + if (BIT(m_p_dir, port)) return m_port_p[port]; - return m_read_p[port](port, 0xff); + return m_read_p[port](port); } @@ -353,7 +401,7 @@ TIMER_CALLBACK_MEMBER(e0c6s46_device::core_256_cb) // clock-timer, stopwatch timer, and some features of the buzzer all run // from the same internal 256hz timer (64 ticks high+low at default clock of 32768hz) m_256_src_pulse ^= 1; - m_core_256_handle->adjust(attotime::from_ticks(64, unscaled_clock())); + m_core_256_handle->adjust(attotime::from_ticks(64, m_osc1)); // clock stopwatch on falling edge of pulse+on m_swl_cur_pulse = m_256_src_pulse | (m_stopwatch_on ^ 1); @@ -364,12 +412,22 @@ TIMER_CALLBACK_MEMBER(e0c6s46_device::core_256_cb) if (m_bz_1shot_on != 0 && m_256_src_pulse == 1) clock_bz_1shot(); + // clock buzzer envelope on rising edge if it's on + if (m_bz_envelope & 1 && m_256_src_pulse == 1) + clock_bz_envelope(); + // clock-timer is always running, advance it on falling edge // (handle clock_clktimer last in case of watchdog reset) if (m_256_src_pulse == 0) clock_clktimer(); } +TIMER_CALLBACK_MEMBER(e0c6s46_device::osc_change) +{ + // set MCU instruction clock on CLKCHG change + set_clock((m_osc & 8) ? m_osc3 : m_osc1); +} + // clock-timer @@ -388,7 +446,7 @@ void e0c6s46_device::clock_clktimer() { m_clktimer_count++; - // irq on falling edge of 32, 8, 2, 1hz + // IRQ on falling edge of 32, 8, 2, 1hz u8 flag = 0; if ((m_clktimer_count & 0x07) == 0) flag |= 1; @@ -426,7 +484,7 @@ void e0c6s46_device::clock_stopwatch() { m_swl_slice = 0; - // bcd counter, irq on falling edge of 10 and 1hz + // bcd counter, IRQ on falling edge of 10 and 1hz m_swl_count = (m_swl_count + 1) % 10; if (m_swl_count == 0) { @@ -434,10 +492,10 @@ void e0c6s46_device::clock_stopwatch() m_swh_count = (m_swh_count + 1) % 10; if (m_swh_count == 0) m_irqflag[IRQREG_STOPWATCH] |= 2; - } - if (m_irqflag[IRQREG_STOPWATCH] & m_irqmask[IRQREG_STOPWATCH]) - m_possible_irq = true; + if (m_irqflag[IRQREG_STOPWATCH] & m_irqmask[IRQREG_STOPWATCH]) + m_possible_irq = true; + } } } @@ -446,7 +504,7 @@ void e0c6s46_device::clock_stopwatch() void e0c6s46_device::clock_prgtimer() { - // irq and reload when it reaches zero + // IRQ and reload when it reaches zero if (--m_prgtimer_count == 0) { m_irqflag[IRQREG_PRGTIMER] |= 1; @@ -463,7 +521,7 @@ bool e0c6s46_device::prgtimer_reset_prescaler() // only 2 to 7 are clock dividers u8 sel = m_prgtimer_select & 7; if (sel >= 2) - m_prgtimer_handle->adjust(attotime::from_ticks(2 << (sel ^ 7), unscaled_clock())); + m_prgtimer_handle->adjust(attotime::from_ticks(2 << (sel ^ 7), m_osc1)); return (sel >= 2); } @@ -488,7 +546,7 @@ TIMER_CALLBACK_MEMBER(e0c6s46_device::prgtimer_cb) void e0c6s46_device::schedule_buzzer() { // only schedule next buzzer timeout if it's on - if (m_bz_43_on != 0 && !m_bz_1shot_running) + if (m_bz_43_on && !m_bz_1shot_running) return; // pulse width differs per frequency selection @@ -501,15 +559,18 @@ void e0c6s46_device::schedule_buzzer() high -= m_bz_duty_ratio; low -= high; - m_buzzer_handle->adjust(attotime::from_ticks(m_bz_pulse ? high : low, mul * unscaled_clock())); + m_buzzer_handle->adjust(attotime::from_ticks(m_bz_pulse ? high : low, mul * m_osc1)); } TIMER_CALLBACK_MEMBER(e0c6s46_device::buzzer_cb) { - // invert pulse wave and write to output - m_bz_pulse ^= 1; - write_r4_out(); + // invert pulse wave if buzzer is on + if (m_bz_43_on && !m_bz_1shot_running) + m_bz_pulse = 0; + else + m_bz_pulse ^= 1; + write_r4_out(); schedule_buzzer(); } @@ -527,8 +588,8 @@ void e0c6s46_device::clock_bz_1shot() // reload counter the 1st time if (m_bz_1shot_count == 0) { - reset_buzzer(); m_bz_1shot_count = (m_bz_freq & 8) ? 16 : 8; + reset_buzzer(); } // stop ringing when counter reaches 0 @@ -539,19 +600,35 @@ void e0c6s46_device::clock_bz_1shot() } } +void e0c6s46_device::clock_bz_envelope() +{ + if (--m_bz_envelope_count == 0) + { + m_bz_envelope_count = (m_bz_envelope & 2) ? 32 : 16; + + // maximum duty addition is 7 + if (m_bz_duty_ratio < 7) + m_bz_duty_ratio++; + } +} + +void e0c6s46_device::reset_bz_envelope() +{ + m_bz_envelope_count = (m_bz_envelope & 2) ? 32 : 16; + m_bz_duty_ratio = 0; +} + //------------------------------------------------- // LCD Driver //------------------------------------------------- -u32 e0c6s46_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +TIMER_CALLBACK_MEMBER(e0c6s46_device::lcd_driver_cb) { - // call this 32 times per second (osc1/1024: 32hz at default clock of 32768hz) + // this gets called 32 times per second (osc1/1024: 32hz at default clock of 32768hz) for (int bank = 0; bank < 2; bank++) { - const u8* vram = bank ? m_vram2 : m_vram1; - // determine operating mode bool lcd_on = false; int pixel = 0; @@ -563,25 +640,47 @@ u32 e0c6s46_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c lcd_on = true; // draw pixels - for (int offset = 0; offset < 0x50; offset++) + for (int offset = 0; offset < m_vram[0].bytes(); offset++) { for (int c = 0; c < 4; c++) { if (lcd_on) - pixel = vram[offset] >> c & 1; + pixel = m_vram[bank][offset] >> c & 1; // 16 COM(common) pins, 40 SEG(segment) pins int seg = offset / 2; int com = bank * 8 + (offset & 1) * 4 + c; - if (!m_pixel_update_cb.isnull()) - m_pixel_update_cb(bitmap, cliprect, m_lcd_contrast, seg, com, pixel); - else if (cliprect.contains(seg, com)) - bitmap.pix(com, seg) = pixel; + const u8 width = m_vram[0].bytes() * 4 / 8; + m_render_buf[com * width + seg] = pixel; + m_write_segs(seg << 4 | com, pixel); } } } + m_lcd_driver->adjust(attotime::from_ticks(1024, m_osc1)); +} + +u32 e0c6s46_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + const u8 *src = lcd_buffer(); + const u8 width = m_vram[0].bytes() * 4 / 8; + + for (int x = 0; x < width; x++) + { + for (int y = 0; y < 16; y++) + { + int dx = x; + int dy = y; + + if (!m_pixel_cb.isnull()) + m_pixel_cb(dx, dy); + + if (cliprect.contains(dx, dy)) + bitmap.pix(dy, dx) = src[y * width + x]; + } + } + return 0; } @@ -595,17 +694,17 @@ u8 e0c6s46_device::io_r(offs_t offset) { switch (offset) { - // irq flags, masks + // IRQ flags, masks case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: { - // irq flags are reset(acked) when read + // IRQ flags are reset(acked) when read u8 flag = m_irqflag[offset]; if (!machine().side_effects_disabled()) m_irqflag[offset] = 0; return flag; } case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: - return m_irqmask[offset-0x10]; + return m_irqmask[offset & 7]; // K input ports case 0x40: case 0x42: @@ -689,18 +788,34 @@ void e0c6s46_device::io_w(offs_t offset, u8 data) { switch (offset) { - // irq masks + // IRQ masks case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: { static const u8 maskmask[6] = { 0xf, 3, 1, 1, 0xf, 0xf }; - m_irqmask[offset-0x10] = data & maskmask[offset-0x10]; - m_possible_irq = true; + u8 prev = m_irqmask[offset & 7]; + m_irqmask[offset & 7] = data & maskmask[offset & 7]; + u8 rise = ~prev & m_irqmask[offset & 7]; + + if (rise) + { + m_possible_irq = true; + + if (offset >= 0x14) + { + u8 port = offset & 1; + u8 dfk = (port == 0) ? m_dfk0 : 0xf; + + // IK flag gets set if input is active at rising edge of mask bit + if (rise & (m_port_k[port] ^ dfk)) + m_irqflag[offset & 7] |= 1; + } + } break; } // K input ports case 0x41: - // d0-d3: K0x irq on 0: rising edge, 1: falling edge + // d0-d3: K0x IRQ on 0: rising edge, 1: falling edge m_dfk0 = data; break; @@ -745,8 +860,13 @@ void e0c6s46_device::io_w(offs_t offset, u8 data) // d0,d1: CPU operating voltage // d2: OSC3 on (high freq) // d3: clock source OSC1 or OSC3 - if (data & 8) - logerror("io_w selected OSC3! PC=$%04X\n", m_prev_pc); + if ((m_osc ^ data) & 8) + { + if (m_osc1 == m_osc3) + logerror("io_w unhandled OSC change, PC=$%04X\n", m_prev_pc); + else + m_osc_change->adjust(attotime::zero); + } m_osc = data; break; @@ -760,6 +880,7 @@ void e0c6s46_device::io_w(offs_t offset, u8 data) case 0x72: // contrast adjustment (0=light, 15=dark) m_lcd_contrast = data; + m_write_contrast(data); break; // SVD circuit (supply voltage detection) @@ -848,8 +969,8 @@ void e0c6s46_device::io_w(offs_t offset, u8 data) // d1: envelope cycle selection // d2: reset envelope // d3: trigger one-shot buzzer - if (data & 1) - logerror("io_w enabled envelope, PC=$%04X\n", m_prev_pc); + if (~m_bz_envelope & data & 1 || data & 4) + reset_bz_envelope(); m_bz_envelope = data & 3; m_bz_1shot_on |= data & 8; break; diff --git a/src/devices/cpu/e0c6200/e0c6s46.h b/src/devices/cpu/e0c6200/e0c6s46.h index 3f1e09e6c9e..d70d0779d99 100644 --- a/src/devices/cpu/e0c6200/e0c6s46.h +++ b/src/devices/cpu/e0c6200/e0c6s46.h @@ -2,7 +2,7 @@ // copyright-holders:hap /* - Seiko Epson E0C6S46 MCU + Seiko Epson E0C6S46 family */ @@ -11,6 +11,19 @@ #include "e0c6200.h" +// for the 2 K input ports, use set_input_line(line, state) +enum +{ + E0C6S46_LINE_K00 = 0, + E0C6S46_LINE_K01, + E0C6S46_LINE_K02, + E0C6S46_LINE_K03, + E0C6S46_LINE_K10, + E0C6S46_LINE_K11, + E0C6S46_LINE_K12, + E0C6S46_LINE_K13 +}; + enum { E0C6S46_PORT_R0X = 0, @@ -28,28 +41,13 @@ enum E0C6S46_PORT_P3X }; -// for the 2 K input ports, use set_input_line(line, state) -enum -{ - E0C6S46_LINE_K00 = 0, - E0C6S46_LINE_K01, - E0C6S46_LINE_K02, - E0C6S46_LINE_K03, - E0C6S46_LINE_K10, - E0C6S46_LINE_K11, - E0C6S46_LINE_K12, - E0C6S46_LINE_K13 -}; - - -// lcd driver -#define E0C6S46_PIXEL_UPDATE(name) void name(bitmap_ind16 &bitmap, const rectangle &cliprect, int contrast, int seg, int com, int state) +// no pinout diagram here, refer to the manual class e0c6s46_device : public e0c6200_cpu_device { public: - typedef device_delegate<void (bitmap_ind16 &bitmap, const rectangle &cliprect, int contrast, int seg, int com, int state)> pixel_update_delegate; + using pixel_delegate = device_delegate<void (int &dx, int &dy)>; e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); @@ -60,14 +58,24 @@ public: template <std::size_t Port> auto read_p() { return m_read_p[Port].bind(); } template <std::size_t Port> auto write_p() { return m_write_p[Port].bind(); } - template <typename... T> void set_pixel_update_cb(T &&... args) { m_pixel_update_cb.set(std::forward<T>(args)...); } + // LCD segment outputs: COM0-COM15 as a0-a3, SEG0-SEGx as a4-a10 + auto write_segs() { return m_write_segs.bind(); } - u8 io_r(offs_t offset); - void io_w(offs_t offset, u8 data); + // LCD contrast (adjusts VL pins overall voltage level) + auto write_contrast() { return m_write_contrast.bind(); } + // screen update (optional) + const u8 *lcd_buffer() { return &m_render_buf[0]; } // get intermediate LCD pixel buffer u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + template <typename... T> void set_pixel_callback(T &&... args) { m_pixel_cb.set(std::forward<T>(args)...); } // transform pixel x/y + + // OSC3 (set fast oscillator, via resistor) + void set_osc3(u32 osc) { m_osc3 = osc; } + protected: + e0c6s46_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, address_map_constructor program, address_map_constructor data); + // device-level overrides virtual void device_start() override ATTR_COLD; virtual void device_reset() override ATTR_COLD; @@ -77,21 +85,31 @@ protected: virtual void execute_one() override; virtual bool check_interrupt() override; - void e0c6s46_data(address_map &map) ATTR_COLD; - void e0c6s46_program(address_map &map) ATTR_COLD; + u8 io_r(offs_t offset); + void io_w(offs_t offset, u8 data); + + required_shared_ptr_array<u8, 2> m_vram; private: - required_shared_ptr<u8> m_vram1; - required_shared_ptr<u8> m_vram2; + void program_map(address_map &map) ATTR_COLD; + void data_map(address_map &map) ATTR_COLD; u8 m_irqflag[6]; u8 m_irqmask[6]; u8 m_osc; u8 m_svd; + // lcd driver u8 m_lcd_control; u8 m_lcd_contrast; - pixel_update_delegate m_pixel_update_cb; + devcb_write8 m_write_segs; + devcb_write8 m_write_contrast; + + emu_timer *m_lcd_driver; + TIMER_CALLBACK_MEMBER(lcd_driver_cb); + + std::unique_ptr<u8[]> m_render_buf; + pixel_delegate m_pixel_cb; // i/o ports devcb_write8::array<5> m_write_r; @@ -141,6 +159,7 @@ private: u8 m_bz_43_on; u8 m_bz_freq; u8 m_bz_envelope; + u8 m_bz_envelope_count; u8 m_bz_duty_ratio; u8 m_bz_1shot_on; bool m_bz_1shot_running; @@ -151,9 +170,27 @@ private: void schedule_buzzer(); void reset_buzzer(); void clock_bz_1shot(); + void clock_bz_envelope(); + void reset_bz_envelope(); + + u32 m_osc1; + u32 m_osc3; + emu_timer *m_osc_change; + TIMER_CALLBACK_MEMBER(osc_change); +}; + +class e0c6s48_device : public e0c6s46_device +{ +public: + e0c6s48_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +private: + void program_map(address_map &map) ATTR_COLD; + void data_map(address_map &map) ATTR_COLD; }; DECLARE_DEVICE_TYPE(E0C6S46, e0c6s46_device) +DECLARE_DEVICE_TYPE(E0C6S48, e0c6s48_device) #endif // MAME_CPU_E0C6200_E0C6S46_H diff --git a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx index 5b5b88fb748..22f049d8923 100644 --- a/src/devices/cpu/e132xs/e132xsdrc_ops.hxx +++ b/src/devices/cpu/e132xs/e132xsdrc_ops.hxx @@ -631,10 +631,6 @@ void hyperstone_device::generate_divsu(drcuml_block &block, compiler_state &comp UML_LOAD(block, I0, (void *)m_core->local_regs, I4, SIZE_DWORD, SCALE_x4); } -#ifndef PTR64 - UML_DAND(block, I0, I0, 0x00000000ffffffffULL); -#endif - if (DST_GLOBAL) { UML_LOAD(block, I1, (void *)m_core->global_regs, dst_code, SIZE_DWORD, SCALE_x4); @@ -650,10 +646,6 @@ void hyperstone_device::generate_divsu(drcuml_block &block, compiler_state &comp UML_LOAD(block, I2, (void *)m_core->local_regs, I6, SIZE_DWORD, SCALE_x4); } -#ifndef PTR64 - UML_DAND(block, I2, I2, 0x00000000ffffffffULL); -#endif - UML_DSHL(block, I1, I1, 32); UML_DOR(block, I1, I1, I2); @@ -879,7 +871,6 @@ void hyperstone_device::generate_sum(drcuml_block &block, compiler_state &compil #ifndef PTR64 UML_DAND(block, I1, I1, 0x00000000ffffffffULL); - UML_DAND(block, I2, I2, 0x00000000ffffffffULL); #endif UML_DADD(block, I5, I1, I2); @@ -974,7 +965,6 @@ void hyperstone_device::generate_cmp(drcuml_block &block, compiler_state &compil #ifndef PTR64 UML_DAND(block, I0, I0, 0x00000000ffffffffULL); - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); #endif UML_DSUB(block, I2, I1, I0); // tmp @@ -1115,7 +1105,7 @@ void hyperstone_device::generate_add(drcuml_block &block, compiler_state &compil if (SRC_GLOBAL) { if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, 1); + UML_AND(block, I0, DRC_SR, C_MASK); else UML_LOAD(block, I0, (void *)m_core->global_regs, src_code, SIZE_DWORD, SCALE_x4); } @@ -1253,9 +1243,6 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi if (src_code != SR_REGISTER) { UML_LOAD(block, I2, (void *)m_core->global_regs, src_code, SIZE_DWORD, SCALE_x4); -#ifndef PTR64 - UML_DAND(block, I2, I2, 0x00000000ffffffffULL); -#endif UML_DADD(block, I0, I2, I0); } } @@ -1264,9 +1251,6 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi UML_ADD(block, I2, I3, src_code); UML_AND(block, I2, I2, 0x3f); UML_LOAD(block, I2, (void *)m_core->local_regs, I2, SIZE_DWORD, SCALE_x4); -#ifndef PTR64 - UML_DAND(block, I2, I2, 0x00000000ffffffffULL); -#endif UML_DADD(block, I0, I2, I0); } @@ -1281,10 +1265,6 @@ void hyperstone_device::generate_subc(drcuml_block &block, compiler_state &compi UML_LOAD(block, I1, (void *)m_core->local_regs, I4, SIZE_DWORD, SCALE_x4); } -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); -#endif - UML_AND(block, I6, DRC_SR, Z_MASK); UML_AND(block, I5, DRC_SR, ~(C_MASK | V_MASK | Z_MASK | N_MASK)); @@ -1344,7 +1324,7 @@ void hyperstone_device::generate_sub(drcuml_block &block, compiler_state &compil if (SRC_GLOBAL) { if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, 1); + UML_AND(block, I0, DRC_SR, C_MASK); else UML_LOAD(block, I0, (void *)m_core->global_regs, src_code, SIZE_DWORD, SCALE_x4); } @@ -1368,7 +1348,6 @@ void hyperstone_device::generate_sub(drcuml_block &block, compiler_state &compil #ifndef PTR64 UML_DAND(block, I0, I0, 0x00000000ffffffffULL); - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); #endif UML_DSUB(block, I2, I1, I0); @@ -1436,7 +1415,7 @@ void hyperstone_device::generate_subs(drcuml_block &block, compiler_state &compi if (SRC_GLOBAL) { if (src_code == SR_REGISTER) - UML_AND(block, I0, DRC_SR, 1); + UML_AND(block, I0, DRC_SR, C_MASK); else UML_LOAD(block, I0, (void *)m_core->global_regs, src_code, SIZE_DWORD, SCALE_x4); } @@ -1526,14 +1505,13 @@ void hyperstone_device::generate_addc(drcuml_block &block, compiler_state &compi { if (src_code == SR_REGISTER) { - UML_AND(block, I0, DRC_SR, 1); + UML_AND(block, I0, DRC_SR, C_MASK); } else { UML_LOAD(block, I0, (void *)m_core->global_regs, src_code, SIZE_DWORD, SCALE_x4); - UML_AND(block, I1, DRC_SR, 1); + UML_AND(block, I1, DRC_SR, C_MASK); #ifndef PTR64 - UML_DAND(block, I0, I0, 0x00000000ffffffffULL); UML_DAND(block, I1, I1, 0x00000000ffffffffULL); #endif UML_DADD(block, I0, I0, I1); @@ -1544,9 +1522,8 @@ void hyperstone_device::generate_addc(drcuml_block &block, compiler_state &compi UML_ADD(block, I1, I3, src_code); UML_AND(block, I1, I1, 0x3f); UML_LOAD(block, I0, (void *)m_core->local_regs, I1, SIZE_DWORD, SCALE_x4); - UML_AND(block, I1, DRC_SR, 1); + UML_AND(block, I1, DRC_SR, C_MASK); #ifndef PTR64 - UML_DAND(block, I0, I0, 0x00000000ffffffffULL); UML_DAND(block, I1, I1, 0x00000000ffffffffULL); #endif UML_DADD(block, I0, I0, I1); @@ -1563,10 +1540,6 @@ void hyperstone_device::generate_addc(drcuml_block &block, compiler_state &compi UML_LOAD(block, I1, (void *)m_core->local_regs, I3, SIZE_DWORD, SCALE_x4); } -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); -#endif - UML_DADD(block, I2, I0, I1); UML_XOR(block, I4, I0, I2); @@ -1633,10 +1606,6 @@ void hyperstone_device::generate_neg(drcuml_block &block, compiler_state &compil UML_LOAD(block, I0, (void *)m_core->local_regs, I1, SIZE_DWORD, SCALE_x4); } -#ifndef PTR64 - UML_DAND(block, I0, I0, 0x00000000ffffffffULL); -#endif - UML_DSUB(block, I4, 0, I0); UML_SUB(block, I2, 0, I0); @@ -2020,11 +1989,6 @@ void hyperstone_device::generate_cmpi(drcuml_block &block, compiler_state &compi UML_AND(block, DRC_SR, DRC_SR, ~(V_MASK | Z_MASK | N_MASK | C_MASK)); -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); - UML_DAND(block, I2, I2, 0x00000000ffffffffULL); -#endif - UML_DSUB(block, I0, I2, I1); int no_v; @@ -2163,11 +2127,6 @@ void hyperstone_device::generate_addi(drcuml_block &block, compiler_state &compi UML_AND(block, I1, DRC_SR, I3); } -#ifndef PTR64 - UML_DAND(block, I0, I0, 0x00000000ffffffffULL); - UML_DAND(block, I1, I1, 0x00000000ffffffffULL); -#endif - UML_DADD(block, I3, I0, I1); UML_DROLAND(block, I6, I3, 32, C_MASK); @@ -2508,10 +2467,6 @@ void hyperstone_device::generate_shrdi(drcuml_block &block, compiler_state &comp UML_AND(block, I6, I2, 0x3f); UML_LOAD(block, I2, (void *)m_core->local_regs, I6, SIZE_DWORD, SCALE_x4); // I1 = sregf -#ifndef PTR64 - UML_DAND(block, I2, I2, 0x00000000ffffffff); -#endif - UML_DSHL(block, I0, I0, 32); UML_DOR(block, I2, I2, I0); @@ -2568,10 +2523,6 @@ void hyperstone_device::generate_shrd(drcuml_block &block, compiler_state &compi UML_AND(block, I5, I2, 0x3f); UML_LOAD(block, I1, (void *)m_core->local_regs, I5, SIZE_DWORD, SCALE_x4); -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffff); -#endif - UML_DSHL(block, I2, I0, 32); UML_DOR(block, I0, I1, I2); @@ -2728,10 +2679,6 @@ void hyperstone_device::generate_sardi(drcuml_block &block, compiler_state &comp UML_AND(block, I5, I2, 0x3f); UML_LOAD(block, I1, (void *)m_core->local_regs, I5, SIZE_DWORD, SCALE_x4); -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffff); -#endif - UML_DSHL(block, I2, I0, 32); UML_DOR(block, I0, I1, I2); @@ -2788,10 +2735,6 @@ void hyperstone_device::generate_sard(drcuml_block &block, compiler_state &compi UML_AND(block, I5, I2, 0x3f); UML_LOAD(block, I1, (void *)m_core->local_regs, I5, SIZE_DWORD, SCALE_x4); -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffff); -#endif - UML_DSHL(block, I2, I0, 32); UML_DOR(block, I0, I1, I2); @@ -2946,10 +2889,6 @@ void hyperstone_device::generate_shldi(drcuml_block &block, compiler_state &comp UML_AND(block, I3, I3, 0x3f); // I3: dstf_code UML_LOAD(block, I1, (void *)m_core->local_regs, I3, SIZE_DWORD, SCALE_x4); // I1: low_order -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffff); -#endif - UML_DSHL(block, I0, I6, 32); UML_DOR(block, I0, I0, I1); // I0: val, I1 free after this point @@ -3020,10 +2959,6 @@ void hyperstone_device::generate_shld(drcuml_block &block, compiler_state &compi UML_AND(block, I3, I3, 0x3f); // I3: dstf_code UML_LOAD(block, I1, (void *)m_core->local_regs, I3, SIZE_DWORD, SCALE_x4); // I1: low_order -#ifndef PTR64 - UML_DAND(block, I1, I1, 0x00000000ffffffff); -#endif - UML_DSHL(block, I0, I6, 32); UML_DOR(block, I0, I0, I1); // I0: val, I1 free after this point diff --git a/src/devices/cpu/hcd62121/hcd62121.cpp b/src/devices/cpu/hcd62121/hcd62121.cpp index 08b1707da15..7c68349f6a9 100644 --- a/src/devices/cpu/hcd62121/hcd62121.cpp +++ b/src/devices/cpu/hcd62121/hcd62121.cpp @@ -369,15 +369,22 @@ void hcd62121_cpu_device::device_start() save_item(NAME(m_f)); save_item(NAME(m_time)); save_item(NAME(m_time_op)); + save_item(NAME(m_unk_f5)); + save_item(NAME(m_cycles_until_timeout)); save_item(NAME(m_is_timer_started)); + save_item(NAME(m_is_timer_irq_enabled)); + save_item(NAME(m_is_timer_irq_asserted)); + save_item(NAME(m_is_timer_wait_elapsed)); save_item(NAME(m_is_infinite_timeout)); + save_item(NAME(m_timer_cycles)); save_item(NAME(m_lar)); save_item(NAME(m_reg)); - save_item(NAME(m_temp1)); - save_item(NAME(m_temp2)); save_item(NAME(m_opt)); save_item(NAME(m_port)); + save_item(NAME(m_temp1)); + save_item(NAME(m_temp2)); + // Register state for debugger state_add(STATE_GENPC, "GENPC", m_rtemp).callexport().formatstr("%8s"); state_add(STATE_GENPCBASE,"CURPC", m_rtemp).callexport().formatstr("%8s"); diff --git a/src/devices/cpu/i86/i286.cpp b/src/devices/cpu/i86/i286.cpp index b18abd01f89..bfe4dc7c728 100644 --- a/src/devices/cpu/i86/i286.cpp +++ b/src/devices/cpu/i86/i286.cpp @@ -384,21 +384,16 @@ void i80286_cpu_device::execute_set_input(int inptnum, int state) { if(inptnum == INPUT_LINE_NMI) { - if(m_nmi_state == state) - { - return; - } - m_nmi_state = state; - if(state != CLEAR_LINE) + if(!m_nmi_state && state) { m_pending_irq |= NMI_IRQ; } + m_nmi_state = state; } else if(inptnum == INPUT_LINE_A20) m_amask = m_a20_callback(state); else { - m_irq_state = state; if(state == CLEAR_LINE) { m_pending_irq &= ~INT_IRQ; @@ -760,7 +755,7 @@ void i80286_cpu_device::code_descriptor(uint16_t selector, uint16_t offset, int throw TRAP(FAULT_GP, IDXTBL(selector)); if(!PRES(r)) - throw TRAP(FAULT_NP, IDXTBL(selector)); // this order is important + throw TRAP(FAULT_NP, IDXTBL(selector)); // this order is important if(offset > LIMIT(desc)) throw TRAP(FAULT_GP, 0); @@ -774,7 +769,8 @@ void i80286_cpu_device::code_descriptor(uint16_t selector, uint16_t offset, int m_prev_ip = m_ip = offset; } else - { // systemdescriptor + { + // systemdescriptor uint16_t gatesel = GATESEL(desc); if(!gate) diff --git a/src/devices/cpu/i86/i86.cpp b/src/devices/cpu/i86/i86.cpp index 55f6de6b458..9d6ca4cf384 100644 --- a/src/devices/cpu/i86/i86.cpp +++ b/src/devices/cpu/i86/i86.cpp @@ -367,7 +367,6 @@ i8086_common_cpu_device::i8086_common_cpu_device(const machine_config &mconfig, , m_int_vector(0) , m_pending_irq(0) , m_nmi_state(0) - , m_irq_state(0) , m_test_state(1) , m_pc(0) , m_lock(false) @@ -489,7 +488,6 @@ void i8086_common_cpu_device::device_start() save_item(NAME(m_int_vector)); save_item(NAME(m_pending_irq)); save_item(NAME(m_nmi_state)); - save_item(NAME(m_irq_state)); save_item(NAME(m_AuxVal)); save_item(NAME(m_OverVal)); save_item(NAME(m_ZeroVal)); @@ -555,9 +553,7 @@ void i8086_common_cpu_device::device_reset() m_NT = 1; // 8086 NT always 1 m_MF = 1; // 8086 MF always 1, 80286 always 0 m_int_vector = 0; - m_pending_irq = 0; - m_nmi_state = 0; - m_irq_state = 0; + m_pending_irq &= INT_IRQ; m_no_interrupt = 0; m_fire_trap = 0; m_prefix_seg = 0; @@ -577,7 +573,7 @@ void i8086_common_cpu_device::device_reset() void i8086_common_cpu_device::interrupt(int int_num, int trap) { - PUSH( CompressFlags() ); + PUSH(CompressFlags()); m_TF = m_IF = 0; if (int_num == -1) @@ -599,15 +595,11 @@ void i8086_common_cpu_device::execute_set_input( int inptnum, int state ) { if (inptnum == INPUT_LINE_NMI) { - if ( m_nmi_state == state ) - { - return; - } - m_nmi_state = state; - if (state != CLEAR_LINE) + if (!m_nmi_state && state) { m_pending_irq |= NMI_IRQ; } + m_nmi_state = state; } else if (inptnum == INPUT_LINE_TEST) { @@ -615,7 +607,6 @@ void i8086_common_cpu_device::execute_set_input( int inptnum, int state ) } else { - m_irq_state = state; if (state == CLEAR_LINE) { m_pending_irq &= ~INT_IRQ; diff --git a/src/devices/cpu/i86/i86.h b/src/devices/cpu/i86/i86.h index 5f67265638e..3ceb94f672d 100644 --- a/src/devices/cpu/i86/i86.h +++ b/src/devices/cpu/i86/i86.h @@ -290,7 +290,6 @@ protected: uint32_t m_int_vector; uint32_t m_pending_irq; uint32_t m_nmi_state; - uint32_t m_irq_state; uint8_t m_no_interrupt; uint8_t m_fire_trap; uint8_t m_test_state; diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst index f3f248026c3..ec61ee4067a 100644 --- a/src/devices/cpu/m6502/oxavix2000.lst +++ b/src/devices/cpu/m6502/oxavix2000.lst @@ -332,8 +332,10 @@ orapa_imp prefetch(); andpa_imp - fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); read_pc(); + TMP = read_full_data(m_pa); + A &= TMP; + set_nz(A); prefetch(); eorpa_imp @@ -436,17 +438,19 @@ bit_xav_zpx prefetch(); bit_abx - fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); - read_pc(); + TMP = read_pc(); + PC++; + TMP = set_h(TMP, read_pc()); + PC++; + TMP += X; + TMP2 = read(TMP); + do_bit(TMP2); prefetch(); bit_imm TMP = read_pc(); PC++; - if(A & TMP) - P &= ~F_Z; - else - P |= F_Z; + do_bit(TMP); prefetch(); asr_xav_zpg @@ -454,6 +458,7 @@ asr_xav_zpg PC++; TMP2 = read_zeropage(TMP); do_asr(TMP2); + write_zeropage(TMP,TMP2); prefetch(); asr_aba @@ -468,8 +473,14 @@ asr_aba prefetch(); asr_xav_zpx - fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); + TMP = read_pc(); read_pc(); + PC++; + TMP = uint8_t(TMP+X); + TMP2 = read_zeropage(TMP); + read_zeropage((TMP+1) & 0xff); + TMP2 = do_asr(TMP2); + write_zeropage(TMP, TMP2); prefetch(); asr_acc @@ -477,13 +488,24 @@ asr_acc prefetch(); asr_abx - fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); - read_pc(); + TMP = read_pc(); + PC++; + TMP = set_h(TMP, read_pc()); + PC++; + read(set_l(TMP, TMP+X)); + TMP += X; + TMP2 = read(TMP); + read(TMP); + TMP2 = do_asr(TMP2); + write(TMP, TMP2); prefetch(); cmc_imp - logerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); read_pc(); + TMP = P & F_C; + P &= ~F_C; + TMP = ~TMP; + P |= TMP & F_C; prefetch(); sev_imp diff --git a/src/devices/cpu/m6502/xavix.cpp b/src/devices/cpu/m6502/xavix.cpp index 2a5392679ca..b97bd9999a0 100644 --- a/src/devices/cpu/m6502/xavix.cpp +++ b/src/devices/cpu/m6502/xavix.cpp @@ -152,12 +152,12 @@ inline uint8_t xavix_device::read_full_data(uint8_t databank, uint16_t adr) } else { - return m_extbus_space->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte(((databank << 16) | adr) & 0x7fffff ); } } else { - return m_extbus_space->read_byte((databank << 16) | adr); + return m_extbus_space->read_byte(((databank << 16) | adr) & 0x7fffff ); } } @@ -257,12 +257,12 @@ inline void xavix_device::write_full_data(uint8_t databank, uint16_t adr, uint8_ } else { - m_extbus_space->write_byte((databank << 16) | adr, val); + m_extbus_space->write_byte(((databank << 16) | adr) & 0x7fffff, val); } } else { - m_extbus_space->write_byte((databank << 16) | adr, val); + m_extbus_space->write_byte(((databank << 16) | adr) & 0x7fffff, val); } } diff --git a/src/devices/cpu/mpk1839/kl1839vm1.cpp b/src/devices/cpu/mpk1839/kl1839vm1.cpp index 00c30e8a5f2..5be6b534f6d 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1.cpp +++ b/src/devices/cpu/mpk1839/kl1839vm1.cpp @@ -5,22 +5,26 @@ #include "kl1839vm1.h" #include "kl1839vm1dasm.h" +#include "cpu/vax/vaxdasm.h" +#include <regex> -#define VERBOSE ( LOG_GENERAL ) +#define LOG_VAX (1U << 1) + +//#define VERBOSE ( LOG_GENERAL | LOG_VAX ) #include "logmacro.h" #define UNIMPLEMENTED(msg) LOG("Unimplemented: %s\n", msg) +#define LOGVAX(...) LOGMASKED(LOG_VAX, __VA_ARGS__) -#define MCA m_mca.w.l // Micro Command Address -#define VMA m_vma.d // Virtual Memory Address -#define RV m_rv.d -#define SCH m_sch.b.l // Program Counter -#define RSP m_rsp.b.l +#define AMC m_amc.d // Microcode PC +#define RV m_rv.d // Return Address +#define SCH m_sch.b.l // Counter +#define RSP m_rsp.b.l // Flags #define K(x) m_consts[x & 0x0f] #define PCM K(5) -#define RC K(6) +#define RC K(6) // Constant /* registers of various sizes */ #define R(x) m_reg[x].d @@ -65,8 +69,13 @@ device_memory_interface::space_config_vector kl1839vm1_device::memory_space_conf void kl1839vm1_device::flag(u32 op) { - const u8 copwt = BIT(op, 15, 1); + const bool tou = BIT(op, 16); + if (tou) + { + // TODO Stop BO till the end of DP (Memory Manager?) + } + const bool copwt = BIT(op, 15); if (copwt) { RNK = PC; @@ -94,7 +103,7 @@ u32 kl1839vm1_device::shr(u32 val, bool va, u8 fo, bool a_c, bool l_r) { case 0b00: left_bit = 31; break; case 0b01: left_bit = 15; break; - case 0b10: left_bit = 31; break; // ??? dd + case 0b10: left_bit = 31; break; case 0b11: left_bit = 7; break; } const u8 rd = l_r ? left_bit : 0; @@ -105,14 +114,13 @@ u32 kl1839vm1_device::shr(u32 val, bool va, u8 fo, bool a_c, bool l_r) res &= ~(1 << wr); if (!a_c) { - res |= (va ? (RSP & CF) : carry_out) << wr; + res |= (va ? (PSW & CF) : carry_out) << wr; } else if (l_r && !va) { res |= carry_out << wr; } - RSP &= ~(VF | CF); RSP |= carry_out; if (a_c && l_r && (fo == 0b10) && (carry_out != BIT(res, rd))) { @@ -121,23 +129,34 @@ u32 kl1839vm1_device::shr(u32 val, bool va, u8 fo, bool a_c, bool l_r) return res; } -void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u32 &z, u8 ps, bool va = false, u8 fo = 0) +void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va = false, u8 fo = 0) { - u32 res = 0; - RSP &= ~(NF | ZF | VF); - if ((kop & 0b1001) == 0b1001) // shr + u64 res = 0; + switch(fd) { - RSP &= ~CF; + case 0b11: + x = s8(x); + y = s8(y); + break; + case 0b01: + x = s16(x); + y = s16(y); + break; + case 0b00: + default: // 0b10 + break; } + + RSP &= ~(VF | CF); switch(kop) { case 0b0000: res = y; break; // 0b0001: - case 0b0010: res = x + y; break; + case 0b0010: res = u64(x) + y; break; case 0b0011: res = x; break; - case 0b0100: res = x - y; break; + case 0b0100: res = u64(x) - y; break; // 0b0101 - case 0b0110: res = y - x; break; + case 0b0110: res = u64(y) - x; break; case 0b0111: res = ~x; break; case 0b1000: res = x ^ y; break; case 0b1001: res = shr(x, va, fo, 1, 1); break; // AL @@ -150,40 +169,54 @@ void kl1839vm1_device::kop(u8 kop, u8 fd, u32 x, u32 y, u32 &z, u8 ps, bool va = default: break; // 0b0001, 0b0101 - reserved } - switch(fd) - { - case 0b00: - z = res; - RSP |= BIT(res, 31) ? NF : 0; - break; - case 0b01: - z = (z & 0xffff0000) | (res & 0x0000ffff); - RSP |= BIT(res, 15) ? NF : 0; - break; - case 0b11: - z = (z & 0xffffff00) | (res & 0x000000ff); - RSP |= BIT(res, 7) ? NF : 0; - break; - default: RKA = res; break; // 0b10 - } + // flags + RSP &= ~(NF | ZF); + RSP |= BIT(res, 31) ? NF : 0; RSP |= (res == 0) ? ZF : 0; + if (kop && ((kop & 0b1001) == 0b0000)) // +/- + { + const bool sig_y = BIT(y, 31); + const bool sig_x = BIT(x, 31); + RSP |= (kop == 0b0010) // + + ? (((sig_y == sig_x) && (BIT(res, 31) != sig_y)) ? VF : 0) + : (((sig_y != sig_x) && (BIT(res, 31) != ((kop == 0b0110) ? sig_y : sig_x))) ? VF : 0); + RSP |= (((kop & 0b1001) != 0b1001) && BIT(res, 32)) ? CF : 0; + } switch (ps) { case 0b00: PSW = (PSW & ~0x0f) | (RSP & 0x0f); break; - case 0b01: PSW = (PSW & ~0x0e) | (RSP & 0x0e); break; - case 0b10: PSW = (PSW & ~0x0f) | (RSP & 0x0c); break; + case 0b01: PSW = (PSW & ~0x0f) | (RSP & 0x0c); break; + case 0b10: PSW = (PSW & ~0x0e) | (RSP & 0x0e); break; default: break; } + + switch(fd) + { + case 0b11: + res &= 0x000000ff; + R(rz) &= 0xffffff00; + break; + case 0b01: + res &= 0x0000ffff; + R(rz) &= 0xffff0000; + break; + case 0b00: + default: // 0b10 + R(rz) = 0; + break; + } + R(rz) |= res; + if (rz == 0x1f) mreg_w(); } -void kl1839vm1_device::mreg_r() +bool kl1839vm1_device::mreg_r() { - const u8 kob_tmp = BIT(m_vma_tmp.d, 24, 3); - if (kob_tmp == 0b001) + const u8 kob = BIT(m_vma_tmp.d, 24, 3); + if ((kob & 0b101) == 0b001) { - const u8 no_tmp = BIT(m_vma_tmp.d, 30, 2); - switch (no_tmp) + const u8 no = BIT(m_vma_tmp.d, 30, 2); + switch (no) { case 0b00: BO = m_ram.read_dword(m_vma_tmp.d); @@ -198,16 +231,20 @@ void kl1839vm1_device::mreg_r() UNIMPLEMENTED("Read w/ catch BRA"); break; } + + return true; } + + return false; } void kl1839vm1_device::mreg_w() { - const u8 kob_tmp = BIT(m_vma_tmp.d, 24, 3); - if (kob_tmp == 0b010) + const u8 kob = BIT(m_vma_tmp.d, 24, 3); + if ((kob & 0b110) == 0b010) { - const u8 no_tmp = BIT(m_vma_tmp.d, 30, 2); - switch (no_tmp) + const u8 no = BIT(m_vma_tmp.d, 30, 2); + switch (no) { case 0b00: m_ram.write_dword(m_vma_tmp.d, BO); @@ -229,8 +266,8 @@ void kl1839vm1_device::ma(u32 op) { const u8 fd = BIT(op, 28, 2); const u8 kop1 = BIT(op, 24, 4); - const u8 am = BIT(op, 20, 4); - const u8 x = BIT(op, 15, 5); + u8 am = BIT(op, 20, 4); + u8 x = BIT(op, 15, 5); const u8 ps = BIT(op, 13, 2); const bool va = BIT(op, 12); const u8 no = BIT(op, 10, 2); @@ -241,28 +278,55 @@ void kl1839vm1_device::ma(u32 op) const bool py = BIT(op, 2); const bool px = BIT(op, 1); - if (am==5 || am==8 || am>=0xd) - UNIMPLEMENTED("Read regs with data mirror"); + if (am>=0xd) + UNIMPLEMENTED("Read const with data mirror K>0x0d"); + else if (am == 8) + UNIMPLEMENTED("Read const with data mirror K=8"); // CRM priveleges check - if (po | py | px) - UNIMPLEMENTED("MA: P*"); + if (po) + UNIMPLEMENTED("MA: PO"); u32 kob_data = kop1 ? R(x) : K(am); - kop(kop1, fd, R(x), K(am), R(x), ps, va, fo); - if (pd || x == 0x1f) mreg_w(); + + if (!m_pcm_queue.empty()) + { + if (py) + am = vax_pcm_pull(); + else if (am == 5) // PCM + K(5) = vax_pcm_pull(1); + else if (pd && (am == 0x1f)) + BO = vax_pcm_pull(1); + if (px) + x = vax_pcm_pull(); + else if (pd && (x == 0x1f)) + BO = vax_pcm_pull(1); + } + else if (pd) + { + mreg_r(); + } + + kop(kop1, fd, R(x), K(am), x, ps, va, fo); if (va) { kob_data = R(x); } - kob_process(no, fo, kob, kob_data); + if (fd == 0b10) + { + RKA = m_sysram.read_dword(R(x)); + } + else + { + kob_process(no, fo, kob, kob_data, R(x)); + } } void kl1839vm1_device::mb(u32 op) { const u8 fd = BIT(op, 28, 2); const u8 kop2 = BIT(op, 25, 3); - const u8 y = BIT(op, 20, 5); - const u8 x = BIT(op, 15, 5); + u8 y = BIT(op, 20, 5); + u8 x = BIT(op, 15, 5); const u8 ps = BIT(op, 13, 2); const bool va = BIT(op, 12); const u8 no = BIT(op, 10, 2); @@ -273,41 +337,70 @@ void kl1839vm1_device::mb(u32 op) const bool py = BIT(op, 2); const bool px = BIT(op, 1); - if (po | py | px) - UNIMPLEMENTED("MB: P*"); + if (po) + UNIMPLEMENTED("MB: PO"); u32 kob_data = kop2 ? R(x) : R(y); - if (pd || y == 0x1f) mreg_r(); - kop(kop2 << 1, fd, R(x), R(y), R(x), ps, va, fo); - if (pd || x == 0x1f) mreg_w(); + + if (!m_pcm_queue.empty()) + { + if (py) + y = vax_pcm_pull(); + else if (pd && !mreg_r() && (y == 0x1f)) + BO = vax_pcm_pull(1); + if (px) + x = vax_pcm_pull(); + else if (pd && (x == 0x1f)) + BO = vax_pcm_pull(1); + } + else if (pd) + { + mreg_r(); + } + + kop(kop2 << 1, fd, R(x), R(y), x, ps, va, fo); if (va) { kob_data = R(x); } - kob_process(no, fo, kob, kob_data); + kob_process(no, fo, kob, kob_data, R(x)); } void kl1839vm1_device::mc(u32 op) { const u8 fd = BIT(op, 28, 2); const u8 kop2 = BIT(op, 25, 3); - const u8 y = BIT(op, 20, 5); - const u8 x = BIT(op, 15, 5); + u8 y = BIT(op, 20, 5); + u8 x = BIT(op, 15, 5); const u8 ps = BIT(op, 13, 2); - - const u8 z = BIT(op, 7, 5); + u8 z = BIT(op, 7, 5); const bool pd = BIT(op, 4); const bool pz = BIT(op, 3); const bool py = BIT(op, 2); const bool px = BIT(op, 1); - if (pz | py | px) - UNIMPLEMENTED("MC: P*"); + if (!m_pcm_queue.empty()) + { + if (py) + y = vax_pcm_pull(); + else if (pd && !mreg_r() && (y == 0x1f)) + BO = vax_pcm_pull(1); + if (px) + x = vax_pcm_pull(); + else if (pd && !mreg_r() && (x == 0x1f)) + BO = vax_pcm_pull(1); + if (pz) + z = vax_pcm_pull(); + else if (pd && (z == 0x1f)) + BO = vax_pcm_pull(1); + } + else if (pd) + { + mreg_r(); + } - if (pd || x == 0x1f) mreg_r(); - kop(kop2 << 1, fd, R(x), kop2 ? R(y) : R(x), R(z), ps); - if (pd || z == 0x1f) mreg_w(); + kop(kop2 << 1, fd, R(x), kop2 ? R(y) : R(x), z, ps); } void kl1839vm1_device::mk(u32 op) @@ -315,7 +408,7 @@ void kl1839vm1_device::mk(u32 op) const bool ret = BIT(op, 17); if (!ret) { - RV = MCA; + RV = AMC; } if ((op & 0xfe000000) == 0xe0000000) @@ -323,19 +416,19 @@ void kl1839vm1_device::mk(u32 op) if (BIT(~op, 16)) // madr == 0 { const u16 addr = BIT(op, 2, 14); - MCA = addr; + AMC = addr; } else { u16 addr_hi = BIT(op, 8, 8) << 6; - MCA = addr_hi | (R(0x18) & 0x3f); + AMC = addr_hi | (R(0x18) & 0x3f); } } else if ((op & 0xfe000000) == 0xe2000000) { u16 addr_hi = BIT(op, 8, 8) << 6; //u8 rpp = BIT(op, 2, 4); // TODO rpp irq code - MCA = addr_hi; + AMC = addr_hi; } } @@ -347,7 +440,7 @@ void kl1839vm1_device::yp(u32 op) const bool v = BIT(op, 25); const bool c = BIT(op, 24); const bool fp = BIT(op, 23); - //const bool fpd = BIT(op, 22); + const bool fpd = BIT(op, 22); //const bool prb = BIT(op, 21); //const bool rst = BIT(op, 20); //const bool rd = BIT(op, 19); @@ -358,10 +451,16 @@ void kl1839vm1_device::yp(u32 op) bool jump = false; if (fp) { + // Jump based on SRF flags jump = uv == m_fp; } + else if (fpd) + { + jump = true; + } else { + // zhs=1 - don't wait for the state completed const u8 mask = (n << 3) | (z << 2) | (v << 1) | (c << 0); const u8 reg = zhs ? RSP : PSW; jump = uv ? ((reg & mask) != 0) : ((reg & mask) == 0); @@ -371,49 +470,56 @@ void kl1839vm1_device::yp(u32 op) { if (!ret) { - RV = MCA; + RV = AMC; } - MCA = addr; + AMC = addr; } } void kl1839vm1_device::zsch(u32 op) { - const bool madr = BIT(op, 16); - if (madr) + if (m_jzdra_waiting) { - const u8 cnst_hi = BIT(op, 8, 2) << 6; - SCH = cnst_hi | (R(0x18) & 0x3f); + SCH = R(0x19); + m_jzdra_waiting = false; } else { - const u8 cnst = BIT(op, 2, 8); - SCH = cnst; + const bool madr = BIT(op, 16); + if (madr) + { + const u8 cnst_hi = BIT(op, 8, 2) << 6; + SCH = cnst_hi | (R(0x18) & 0x3f); + } + else + { + const u8 cnst = BIT(op, 2, 8); + SCH = cnst; + } } } void kl1839vm1_device::psch(u32 op) { - const bool madr = BIT(op, 16); - if (madr) - { - const u16 addr_hi = BIT(op, 8, 8) << 6; - MCA = addr_hi | (R(0x18) & 0x3f); - } - else + if (SCH--) { - if (SCH--) + const bool madr = BIT(op, 16); + if (madr) + { + const u16 addr_hi = BIT(op, 8, 8) << 6; + AMC = addr_hi | (R(0x18) & 0x3f); + } + else { const u16 addr = BIT(op, 2, 14); - MCA = addr; + AMC = addr; } - } } void kl1839vm1_device::rts(u32 op) { - MCA = RV; + AMC = RV; } void kl1839vm1_device::acc(u32 op) @@ -463,11 +569,10 @@ void kl1839vm1_device::srf(u32 op) } if (BIT(op, 4)) // OCT { - --MCA; } if (BIT(op, 2)) // JDZRA { - UNIMPLEMENTED("SRF: JDZRA"); + m_jzdra_waiting = true; } if (BIT(op, 1)) // INC { @@ -479,23 +584,31 @@ void kl1839vm1_device::invalid(u32 op) { } -void kl1839vm1_device::kob_process(u8 no, u8 fo, u8 kob, u32 data) +void kl1839vm1_device::kob_process(u8 no, u8 fo, u8 kob, u32 kob_data, u32 data) { switch (kob) { + case 0b000: // NOP + break; case 0b001: // Data Read case 0b010: // Data Write case 0b011: // Read-Modify-Write - m_vma_tmp.d = (no << 30) | (fo << 28) | (kob << 24) | data; + m_vma_tmp.d = (no << 30) | (fo << 28) | (kob << 24) | kob_data; break; case 0b100: // Write Accum R(17) + R(0x17) = data; + break; case 0b101: // Read Command + m_vma_tmp.d = 0; + PC = data; + break; case 0b110: // Offset Write UNIMPLEMENTED("KOB"); break; - case 0b000: // NOP case 0b111: // Reserve - default: break; + default: + m_vma_tmp.d = 0; + break; } } @@ -539,43 +652,289 @@ void kl1839vm1_device::decode_op(u32 op) else if ((op & 0xfc000000) == 0xfc000000) srf(op); else - invalid(op); + UNIMPLEMENTED(op); } } +void kl1839vm1_device::vax_decode_pc() +{ + if (!m_pcm_queue.empty()) + { + LOGVAX("Unused decoded data\n"); + } + m_vma_tmp.d = 0; + + const u8 op = m_ram.read_byte(PC); + m_op_size = 1; + AMC = op << 4; + + m_pcm_queue.clear(); + const vax_disassembler::mode* args = vax_disassembler::get_operands(op); + u8 arg_n = 0; + do + { + m_mem_reg[arg_n] = ~0; // Default to unknown + + const vax_disassembler::mode mode = args[arg_n]; + switch (mode) + { + case vax_disassembler::mode::none: + break; + + // byte + case vax_disassembler::mode::bb: + m_pcm_queue.push_back(s8(m_ram.read_byte(PC + m_op_size))); + m_mem_reg[arg_n] = 0x8f; + m_op_size += 1; + break; + + case vax_disassembler::mode::cntb: + case vax_disassembler::mode::mb: + case vax_disassembler::mode::urb: + case vax_disassembler::mode::srb: + case vax_disassembler::mode::wb: + { + u8 p = m_ram.read_byte(PC + m_op_size); + if (p == 0x8f) // M + { + m_pcm_queue.push_back(m_ram.read_byte(PC + m_op_size + 1)); + m_mem_reg[arg_n] = p; + m_op_size += 2; + } + else if ((p & 0xf0) == 0x80) // M = R(n)+ + { + m_pcm_queue.push_back(p & 0x0f); + m_mem_reg[arg_n] = p; + m_op_size += 1; + } + else if ((p & 0xf0) == 0x50) // R + { + m_pcm_queue.push_back(p & 0x0f); + m_mem_reg[arg_n] = p; + m_op_size += 1; + } + else // ? + { + LOGVAX("OP=%02x unknown prefix %02x in operand mode::%02d\n", op, p, u8(mode)); + m_op_size = 0; + } + break; + } + + // word + case vax_disassembler::mode::bw: + m_pcm_queue.push_back(s16(m_ram.read_word(PC + m_op_size))); + m_mem_reg[arg_n] = 0x8f; + m_op_size += 2; + break; + + // dword + case vax_disassembler::mode::rl: + case vax_disassembler::mode::url: + case vax_disassembler::mode::ml: + case vax_disassembler::mode::prl: + case vax_disassembler::mode::srl: + case vax_disassembler::mode::wl: + { + u8 p = m_ram.read_byte(PC + m_op_size); + if (p == 0x8f) // M + { + m_pcm_queue.push_back(m_ram.read_dword(PC + m_op_size + 1)); + m_mem_reg[arg_n] = p; + m_op_size += 5; + } + else if ((p & 0xf0) == 0x80) // M = R(n)+ + { + m_pcm_queue.push_back(p & 0x0f); + m_mem_reg[arg_n] = p; + m_op_size += 1; + } + else if ((p & 0xf0) == 0x50) // R + { + m_pcm_queue.push_back(p & 0x0f); + m_mem_reg[arg_n] = p; + m_op_size += 1; + } + else // ? + { + LOGVAX("OP=%02x unknown prefix %02x in operand mode::%02d\n", op, p, u8(mode)); + m_op_size = 0; + } + break; + } + + default: + LOGVAX("(%x): unknown operand mode %02d in OP=%02x (n=%d)\n", PC, u8(mode), op, arg_n + 1); + m_pcm_queue.clear(); + m_op_size = 0; + break; + } + + ++arg_n; + } while ((arg_n < 6) && (args[arg_n] != vax_disassembler::mode::none)); + + if (m_op_size > 0) // above completed without failure + { + u8 args_type = 0; + if (!m_pcm_queue.empty()) + { + for (u8 i = 0; i < arg_n; ++i) + { + args_type <<= 1; + if ((m_mem_reg[i] & 0xf0) == 0x80) + args_type |= 1; + else if ((m_mem_reg[i] & 0xf0) == 0x50) + args_type |= 0; + else + LOGVAX("Unknown argument type: %02x\n", m_mem_reg[i]); + } + } + + switch (op) + { + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + assert(m_op_size == 1); // no operands + break; + + case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: + case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: + case 0x30: case 0x31: + assert(arg_n == 1); + break; + + case 0x94: case 0x95: case 0x96: case 0x97: + case 0xb4: case 0xb5: case 0xb6: case 0xb7: + case 0xd4: case 0xd5: case 0xd6: case 0xd7: + assert(arg_n == 1); + AMC += 0x0c * args_type; + break; + + case 0xda: + case 0xe8: case 0xe9: + assert(arg_n == 2); + break; + + case 0xdb: + assert(arg_n == 2); + AMC += BIT(args_type, 0) ? 0x0 : 0x2; + break; + + case 0x80: case 0x82: case 0x84: case 0x86: case 0x88: case 0x8a: case 0x8c: + case 0x90: case 0x92: + case 0xa0: case 0xa2: case 0xa4: case 0xa6: case 0xa8: case 0xaa: case 0xac: + case 0xb0: case 0xb2: + case 0xc0: case 0xc2: case 0xc4: case 0xc6: case 0xc8: case 0xca: case 0xcc: + case 0xd0: case 0xd2: + assert(arg_n == 2); + switch (args_type) + { + case 0b00: AMC += 0x0; break; // RR + case 0b01: AMC += 0x4; break; // RM + case 0b10: AMC += 0xe; break; // MR + case 0b11: AMC += 0xc; break; // MM + } + break; + + case 0x91: case 0x93: + case 0xb1: case 0xb3: + case 0xd1: case 0xd3: + assert(arg_n == 2); + switch (args_type) + { + case 0b00: AMC += 0x0; break; // RR + case 0b01: AMC += 0x4; break; // RM + case 0b10: + case 0b11: AMC += 0xc; break; // MM, MR + } + break; + + case 0x78: + assert(arg_n == 3); + AMC += BIT(args_type, 0) ? 0x0 : 0x2; + break; + + case 0x81: case 0x83: case 0x85: case 0x87: case 0x89: case 0x8b: case 0x8d: + case 0xa1: case 0xa3: case 0xa5: case 0xa7: case 0xa9: case 0xab: case 0xad: + case 0xc1: case 0xc3: case 0xc5: case 0xc7: case 0xc9: case 0xcb: case 0xcd: + assert(arg_n == 3); + switch (args_type) + { + case 0b000: AMC += 0x0; break; // RRR + case 0b011: AMC += 0x4; break; // RMM + case 0b010: AMC += 0x6; break; // RMR + case 0b001: AMC += 0x8; break; // RRM + case 0b110: AMC += 0xe; break; // MMR + case 0b111: AMC += 0xc; break; // MMM + } + break; + + default: + LOGVAX("(%x): OP=%02x with %d operands is not implemented or supported\n", PC, op, arg_n); + } + } + + if (!m_op_size) + LOGVAX("(%x): undecoded OP=%02x .. EXIT\n", PC, op); + else + PC += m_op_size; // move to a next op + ;//LOGVAX("(%x): Decoded: OP=%02x args:%d \n", PC, op, m_pcm_queue.size()); +} + +u32 kl1839vm1_device::vax_pcm_pull(bool is_bo) +{ + if (m_pcm_queue.empty()) + { + LOGVAX("Pooling empty decoder queue\n"); + } + else + { + PCM = m_pcm_queue.front(); + m_pcm_queue.pop_front(); + + bool is_mem = (m_mem_reg[0] & 0xf0) == 0x80; + if (is_bo && !is_mem) + { + PCM = R(PCM); + } + else if (is_mem && ((m_mem_reg[0] & 0x0f) != 0x0f)) + { + u8 r = PCM; + PCM = R(PCM); + R(r) = PCM + 1; + } + std::copy(std::begin(m_mem_reg) + 1, std::end(m_mem_reg), std::begin(m_mem_reg)); + } + + return PCM; +} + + void kl1839vm1_device::device_start() { + m_vax_dasm = std::make_unique<vax_disassembler>(); + space(AS_OPCODES).cache(m_microcode); space(AS_DATA).specific(m_sysram); space(AS_PROGRAM).specific(m_ram); space(AS_IO).specific(m_io); - save_item(NAME(m_mca)); - save_item(NAME(m_vma)); save_item(NAME(m_vma_tmp)); save_item(NAME(m_rv)); save_item(NAME(m_sch)); save_item(NAME(m_rsp)); + save_item(NAME(m_amc)); save_item(NAME(m_ppc)); save_item(NAME(m_fp)); save_pointer(NAME(m_reg), 0x20); save_pointer(NAME(m_consts), 0x10); // Register debugger state - state_add(KL1839_MCA, "MCA", MCA).formatstr("%04X"); - state_add(KL1839_VMA, "VMA", VMA).formatstr("%08X"); - state_add_divider(-1); - state_add(KL1839_IF, "cond", m_fp).formatstr("%08s"); - state_add(KL1839_RSP, "RSP", RSP).formatstr("%08s"); - state_add(KL1839_PCM, "PCM", PCM).formatstr("%08X"); - state_add(KL1839_RC, "RC", RC).formatstr("%08X"); - state_add(KL1839_RV, "RV", RV).formatstr("%08X"); - state_add(KL1839_SCH, "SCH", SCH).formatstr("%02X"); - state_add_divider(-1); - state_add(VAX_AP, "AP", AP).formatstr("%08X"); - state_add(VAX_FP, "FP", FP).formatstr("%08X"); - state_add(VAX_SP, "SP", SP).formatstr("%08X"); - state_add(VAX_PC, "PC", PC).formatstr("%08X"); + state_add(KL1839_AMC, "AMC", AMC).formatstr("%08X"); + state_add(KL1839_PSW, "PSW", PSW).formatstr("%08s"); + state_add(KL1839_IF, "cond", m_fp).formatstr("%08s"); + state_add(KL1839_RC, "RC", RC).formatstr("%08X"); + state_add(KL1839_RV, "RV", RV).formatstr("%08X"); + state_add(KL1839_SCH, "SCH", SCH).formatstr("%02X"); state_add_divider(-1); state_add(VAX_R0, "R0", R(0)).formatstr("%08X"); state_add(VAX_R1, "R1", R(1)).formatstr("%08X"); @@ -587,8 +946,15 @@ void kl1839vm1_device::device_start() state_add(VAX_R7, "R7", R(7)).formatstr("%08X"); state_add(VAX_R8, "R8", R(8)).formatstr("%08X"); state_add(VAX_R9, "R9", R(9)).formatstr("%08X"); - state_add(VAX_RA, "RA", R(0x0a)).formatstr("%08X"); - state_add(VAX_RB, "RB", R(0x0b)).formatstr("%08X"); + state_add(VAX_R10, "R10", R(10)).formatstr("%08X"); + state_add(VAX_R11, "R11", R(11)).formatstr("%08X"); + state_add_divider(-1); + state_add(VAX_AP, "AP", AP).formatstr("%08X"); + state_add(VAX_FP, "FP", FP).formatstr("%08X"); + state_add(VAX_SP, "SP", SP).formatstr("%08X"); + state_add(VAX_PC, "PC", PC).formatstr("%08X"); + state_add_divider(-1); + state_add(VAX_INST, "INST", PC).formatstr("%20s"); state_add_divider(-1); state_add(VAX_AK0, "AK0", R(0x14)).formatstr("%08X"); state_add(VAX_AK1, "AK1", R(0x15)).formatstr("%08X"); @@ -605,9 +971,9 @@ void kl1839vm1_device::device_start() state_add(VAX_PSL, "PSL", PSL).formatstr("%08X"); state_add(VAX_BO, "BO", BO).formatstr("%08X"); - state_add(STATE_GENPC, "GENPC", MCA).noshow(); // ??? - state_add(STATE_GENPCBASE, "CURPC", m_ppc.d).noshow(); - state_add(STATE_GENFLAGS, "GENFLAGS", PSW).formatstr("%8s").noshow(); + state_add(STATE_GENPC, "GENPC", AMC).noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_ppc.d).noshow(); + state_add(STATE_GENFLAGS, "GENFLAGS", RSP).formatstr("%8s").noshow(); set_icountptr(m_icount); } @@ -618,18 +984,6 @@ void kl1839vm1_device::state_string_export(const device_state_entry &entry, std: { case STATE_GENFLAGS: str = string_format("%c%c%c%c%c%c%c%c", - PSW & 0x80 ? '?' : '.', - PSW & 0x40 ? '?' : '.', - PSW & 0x20 ? '?' : '.', - PSW & 0x10 ? '?' : '.', - PSW & NF ? 'N' : '.', - PSW & ZF ? 'Z' : '.', - PSW & VF ? 'V' : '.', - PSW & CF ? 'C' : '.' - ); - break; - case KL1839_RSP: - str = string_format("%c%c%c%c%c%c%c%c", RSP & 0x80 ? '?' : '.', RSP & 0x40 ? '?' : '.', RSP & 0x20 ? '?' : '.', @@ -640,9 +994,37 @@ void kl1839vm1_device::state_string_export(const device_state_entry &entry, std: RSP & CF ? 'C' : '.' ); break; + case KL1839_PSW: + str = string_format("%c%c%c%c%c%c%c%c", + PSW & 0x80 ? '?' : '.', + PSW & 0x40 ? '?' : '.', + PSW & 0x20 ? '?' : '.', + PSW & 0x10 ? '?' : '.', + PSW & NF ? 'N' : '.', + PSW & ZF ? 'Z' : '.', + PSW & VF ? 'V' : '.', + PSW & CF ? 'C' : '.' + ); + break; case KL1839_IF: str = string_format("FP%d", m_fp); break; + case VAX_INST: + if (m_op_size) + { + address_space &space_prg = space(AS_PROGRAM); + std::ostringstream buffer; + disasm_data_buffer databuf(space_prg); + m_vax_dasm->disassemble(buffer, PC - m_op_size, databuf, databuf); + + const std::regex reg("\\s+"); + str = regex_replace(buffer.str(), reg, " "); + } + else + { + str = "--------"; + } + break; } } @@ -651,13 +1033,15 @@ void kl1839vm1_device::device_reset() for (auto ® : m_reg) reg.d = 0; - m_ppc.d = MCA = 0x2000; - VMA = 0; + m_ppc.d = AMC = 0x2000; m_fp = false; + m_jzdra_waiting = false; RSP = 0; m_vma_tmp.d = 0; RV = 0; SCH = 0; + m_pcm_queue.clear(); + m_op_size = 0; } void kl1839vm1_device::execute_set_input(int irqline, int state) @@ -668,14 +1052,19 @@ void kl1839vm1_device::execute_run() { do { - m_ppc.d = MCA; + m_ppc.d = AMC; debugger_instruction_hook(m_ppc.d); - u32 op = m_microcode.read_dword(MCA); + u32 op = m_microcode.read_dword(AMC); m_icount -= 2; - ++MCA &= 0x3fff; + ++AMC &= 0x3fff; decode_op(op); + + if (op & 1) // S-bit + { + vax_decode_pc(); + } } while (m_icount > 0); } @@ -683,4 +1072,3 @@ std::unique_ptr<util::disasm_interface> kl1839vm1_device::create_disassembler() { return std::make_unique<kl1839vm1_disassembler>(); } - diff --git a/src/devices/cpu/mpk1839/kl1839vm1.h b/src/devices/cpu/mpk1839/kl1839vm1.h index d04320cf838..4ee4d9eaeae 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1.h +++ b/src/devices/cpu/mpk1839/kl1839vm1.h @@ -6,14 +6,15 @@ #pragma once +#include <deque> enum { - KL1839_MCA = STATE_GENPC, KL1839_VMA, KL1839_IF, KL1839_RSP, KL1839_PCM, KL1839_RC, KL1839_RV, KL1839_SCH, - VAX_R0, VAX_R1, VAX_R2, VAX_R3, VAX_R4, VAX_R5, VAX_R6, VAX_R7, VAX_R8, VAX_R9, VAX_RA, VAX_RB, + KL1839_AMC = STATE_GENPC, KL1839_IF, KL1839_PSW, KL1839_RC, KL1839_RV, KL1839_SCH, + VAX_R0, VAX_R1, VAX_R2, VAX_R3, VAX_R4, VAX_R5, VAX_R6, VAX_R7, VAX_R8, VAX_R9, VAX_R10, VAX_R11, VAX_AP, VAX_FP, VAX_SP, VAX_PC, VAX_AK0, VAX_AK1, VAX_AK2, VAX_AK3, VAX_AK4, VAX_AK5, VAX_AK6, VAX_AK7, VAX_AK8, - VAX_RNK, VAX_RKA, VAX_PSL, VAX_BO + VAX_RNK, VAX_RKA, VAX_PSL, VAX_BO, VAX_INST }; @@ -43,6 +44,22 @@ protected: virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; private: + class disasm_data_buffer : public util::disasm_interface::data_buffer + { + public: + disasm_data_buffer(address_space &space) : m_space(space) + { + } + + virtual u8 r8(offs_t pc) const override { return m_space.read_byte(pc); } + virtual u16 r16(offs_t pc) const override { return m_space.read_word(pc); } + virtual u32 r32(offs_t pc) const override { return m_space.read_dword(pc); } + virtual u64 r64(offs_t pc) const override { return m_space.read_qword(pc); } + + private: + address_space &m_space; + }; + void flag(u32 op); void rest(u32 op); void ma(u32 op); @@ -60,12 +77,15 @@ private: void invalid(u32 op); u32 shr(u32 val, bool va, u8 fo, bool a_c, bool l_r); - void kob_process(u8 no, u8 fd, u8 kob, u32 data); - void kop(u8 kop, u8 fd, u32 x, u32 y, u32 &z, u8 ps, bool va, u8 fo); + void kob_process(u8 no, u8 fd, u8 kob, u32 kob_data, u32 data); + void kop(u8 kop, u8 fd, u32 x, u32 y, u8 rz, u8 ps, bool va, u8 fo); void mreg_w(); - void mreg_r(); + bool mreg_r(); void decode_op(u32 op); + void vax_decode_pc(); + u32 vax_pcm_pull(bool is_bo = 0); + address_space_config m_microcode_config; address_space_config m_sysram_config; address_space_config m_ram_config; @@ -75,17 +95,24 @@ private: memory_access<24, 0, 0, ENDIANNESS_BIG>::specific m_sysram; memory_access<24, 0, 0, ENDIANNESS_LITTLE>::specific m_ram; memory_access<6, 2, -2, ENDIANNESS_LITTLE>::specific m_io; - PAIR m_mca; - PAIR m_vma; - PAIR m_vma_tmp; // does we have int reg for this? - PAIR m_rv; - PAIR m_sch; - PAIR m_rsp; - PAIR m_ppc; // previous program counter - bool m_fp; - u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 }; - PAIR m_reg[0x20]; - int m_icount; + + std::unique_ptr<util::disasm_interface> m_vax_dasm; + + PAIR m_vma_tmp; // do we have int reg for this? + PAIR m_rv; + PAIR m_sch; + PAIR m_rsp; + PAIR m_amc; // Microdode PC + PAIR m_ppc; // previous program counter + bool m_fp; + bool m_jzdra_waiting; + u32 m_consts[0x10] = { 0x4, 0x2, 0x8, 0x1, 0x0, 0, 0, 0x66, 0, 0xc00000, 0xffffffff, 0x1f0000, 0x4000000, 0, 0, 0 }; + PAIR m_reg[0x20]; + int m_icount; + u32 m_op_size; + + std::deque<u32> m_pcm_queue; + u8 m_mem_reg[6]; }; DECLARE_DEVICE_TYPE(KL1839VM1, kl1839vm1_device) diff --git a/src/devices/cpu/mpk1839/kl1839vm1dasm.cpp b/src/devices/cpu/mpk1839/kl1839vm1dasm.cpp index 1b9ad4e7dc1..ea80d7a0613 100644 --- a/src/devices/cpu/mpk1839/kl1839vm1dasm.cpp +++ b/src/devices/cpu/mpk1839/kl1839vm1dasm.cpp @@ -12,6 +12,7 @@ static const std::string r_name(u8 id) std::ostringstream ss; switch (id) { + case 0x0f: ss << "PC"; break; case 0x14: ss << "AK0"; break; case 0x15: ss << "AK1"; break; case 0x16: ss << "AK2"; break; @@ -98,7 +99,7 @@ static const void ma(std::ostream &stream, u32 op) const bool py = BIT(op, 2); const bool px = BIT(op, 1); - m_base(stream, op, 'A', kop1, r_name(x), k_name(am), r_name(x)); + m_base(stream, op, 'A', kop1, px ? "RX" : r_name(x), py ? "RY" : k_name(am), px ? "RX" : r_name(x)); if (kob) { @@ -128,7 +129,7 @@ static const void ma(std::ostream &stream, u32 op) case 0b001: stream << "4D "; break; case 0b010: stream << "ZD "; break; case 0b011: stream << "4Z "; break; - case 0b100: stream << "?R(17)==ACC "; break; + case 0b100: stream << "WDAK "; break; case 0b101: stream << "4K "; break; case 0b110: break; // reserved case 0b111: stream << "BRD "; break; @@ -136,8 +137,8 @@ static const void ma(std::ostream &stream, u32 op) } } - if (px | po | py) - stream << "?:" << (px ? "PX " : "") << (po ? "PO " : "") << (py ? "PY " : ""); + if (po) + stream << "?:" << (po ? "RO" : ""); } static const void mb(std::ostream &stream, u32 op) @@ -150,11 +151,11 @@ static const void mb(std::ostream &stream, u32 op) const u8 no = BIT(op, 10, 2); const u8 fo = BIT(op, 8, 2); const u8 kob = BIT(op, 5, 3); - const bool pz = BIT(op, 3); + const bool po = BIT(op, 3); const bool py = BIT(op, 2); const bool px = BIT(op, 1); - m_base(stream, op, 'B', kop2 << 1, r_name(x), r_name(y), r_name(x)); + m_base(stream, op, 'B', kop2 << 1, px ? "RX" : r_name(x), py ? "RY" : r_name(y), px ? "RX" : r_name(x)); if (kob) { @@ -192,7 +193,7 @@ static const void mb(std::ostream &stream, u32 op) case 0b001: stream << "4D "; break; case 0b010: stream << "ZD "; break; case 0b011: stream << "4Z "; break; - case 0b100: stream << "?R(17)==ACC "; break; + case 0b100: stream << "WDAK "; break; case 0b101: stream << "4K "; break; case 0b110: break; // reserved case 0b111: stream << "BRD "; break; @@ -200,8 +201,8 @@ static const void mb(std::ostream &stream, u32 op) } } - if (px | pz | py) - stream << "?:" << (px ? "PX " : "") << (pz ? "PZ " : "") << (py ? "PY " : ""); + if (po) + stream << "?:" << (po ? "RO" : ""); } static const void mc(std::ostream &stream, u32 op) @@ -214,10 +215,7 @@ static const void mc(std::ostream &stream, u32 op) const bool py = BIT(op, 2); const bool px = BIT(op, 1); - m_base(stream, op, 'C', kop2 << 1, r_name(x), kop2 ? r_name(y) : r_name(x), r_name(z)); - - if (px | pz | py) - stream << "?:" << (px ? "PX " : "") << (pz ? "PZ " : "") << (py ? "PY " : ""); + m_base(stream, op, 'C', kop2 << 1, px ? "RX" : r_name(x), kop2 ? (py ? "RY" : r_name(y)) : (px ? "RX" : r_name(x)), pz ? "RZ" : r_name(z)); } static const u32 mk(std::ostream &stream, u32 op) @@ -228,11 +226,12 @@ static const u32 mk(std::ostream &stream, u32 op) if (BIT(~op, 16)) // madr == 0 { const u16 addr = BIT(op, 2, 14); - util::stream_format(stream, "BP%s : ;A=%04X", ret ? " " : "B" ,addr); + util::stream_format(stream, "BP%s : ;A=(%04X)", ret ? " " : "B" , addr); } else { - stream << "??MK-2"; + u16 addr_hi = BIT(op, 8, 8) << 6; + util::stream_format(stream, "BPV%s : ;A=(%04X+%s)", ret ? " " : "D" , addr_hi, r_name(0x18)); } } else if ((op & 0xfe000000) == 0xe2000000) @@ -437,5 +436,10 @@ offs_t kl1839vm1_disassembler::disassemble(std::ostream &stream, offs_t pc, cons stream << "<invalid>"; } + if (op & 1) + { + stream << "S"; + } + return 1 | SUPPORTED | step; } diff --git a/src/devices/cpu/powerpc/ppc.h b/src/devices/cpu/powerpc/ppc.h index 65ba50eded3..905132c0034 100644 --- a/src/devices/cpu/powerpc/ppc.h +++ b/src/devices/cpu/powerpc/ppc.h @@ -751,6 +751,9 @@ class ppc601_device : public ppc_device { public: ppc601_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; }; diff --git a/src/devices/cpu/powerpc/ppc_dasm.h b/src/devices/cpu/powerpc/ppc_dasm.h index 6aad80c62d2..1f5ff6dba00 100644 --- a/src/devices/cpu/powerpc/ppc_dasm.h +++ b/src/devices/cpu/powerpc/ppc_dasm.h @@ -30,8 +30,8 @@ public: I_POWERPC = 1 << 1, }; - powerpc_disassembler(bool powerpc = true) - : m_implementation(powerpc ? I_POWERPC : I_POWER) + powerpc_disassembler(implementation impl = I_POWERPC) + : m_implementation(impl) { }; virtual ~powerpc_disassembler() = default; @@ -157,7 +157,7 @@ class power_disassembler : public powerpc_disassembler { public: power_disassembler() - : powerpc_disassembler(false) + : powerpc_disassembler(implementation::I_POWER) { }; }; diff --git a/src/devices/cpu/powerpc/ppccom.cpp b/src/devices/cpu/powerpc/ppccom.cpp index 316728be729..68ba52cf509 100644 --- a/src/devices/cpu/powerpc/ppccom.cpp +++ b/src/devices/cpu/powerpc/ppccom.cpp @@ -285,6 +285,12 @@ ppc601_device::ppc601_device(const machine_config &mconfig, const char *tag, dev { } +std::unique_ptr<util::disasm_interface> ppc601_device::create_disassembler() +{ + // 601 has both POWER and PowerPC instructions + return std::make_unique<powerpc_disassembler>((powerpc_disassembler::implementation)(powerpc_disassembler::I_POWER|powerpc_disassembler::I_POWERPC)); +} + ppc604_device::ppc604_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : ppc_device(mconfig, PPC604, tag, owner, clock, 32, 64, PPC_MODEL_604, PPCCAP_OEA | PPCCAP_VEA | PPCCAP_FPU | PPCCAP_MISALIGNED | PPCCAP_604_MMU, 4, address_map_constructor()) { @@ -1219,7 +1225,7 @@ void ppc_device::device_reset() std::unique_ptr<util::disasm_interface> ppc_device::create_disassembler() { - return std::make_unique<powerpc_disassembler>(); + return std::make_unique<powerpc_disassembler>(powerpc_disassembler::I_POWERPC); } diff --git a/src/devices/cpu/powerpc/ppcdrc.cpp b/src/devices/cpu/powerpc/ppcdrc.cpp index 0c62dec346a..64d19498d12 100644 --- a/src/devices/cpu/powerpc/ppcdrc.cpp +++ b/src/devices/cpu/powerpc/ppcdrc.cpp @@ -2681,7 +2681,9 @@ bool ppc_device::generate_instruction_1f(drcuml_block &block, compiler_state *co case 0x0eb: /* MULLWx */ case 0x2eb: /* MULLWOx */ - UML_MULS(block, R32(G_RD(op)), R32(G_RD(op)), R32(G_RA(op)), R32(G_RB(op))); // muls rd,rd,ra,rb + // The flags are calculated based on the resulting 32-bit value from the 32x32=32 multiplication + // reference: example 4 https://www.ibm.com/docs/en/aix/7.2?topic=set-mullw-muls-multiply-low-word-instruction + UML_MULSLW(block, R32(G_RD(op)), R32(G_RA(op)), R32(G_RB(op))); // mulslw rd,ra,rb generate_compute_flags(block, desc, op & M_RC, ((op & M_OE) ? XER_OV : 0), false);// <update flags> return true; diff --git a/src/devices/cpu/uml.cpp b/src/devices/cpu/uml.cpp index 30dea00f6b2..7133a5ca0ad 100644 --- a/src/devices/cpu/uml.cpp +++ b/src/devices/cpu/uml.cpp @@ -137,45 +137,49 @@ opcode_info const instruction::s_opcode_info_table[OP_MAX] = // Control Flow Operations OPINFO0(NOP, "nop", 4, false, NONE, NONE, NONE) - OPINFO1(DEBUG, "debug", 4, false, NONE, NONE, ALL, PINFO(IN, OP, IANY)) + OPINFO1(DEBUG, "debug", 4, false, NONE, NONE, ALL, PINFO(IN, OP, IANY)) // MAME debugger breakpoint + OPINFO0(BREAK, "break", 4, false, NONE, NONE, NONE) // (for debugging) Issues a breakpoint exception to allow for debugging the generated assembly OPINFO1(EXIT, "exit", 4, true, NONE, NONE, ALL, PINFO(IN, OP, IANY)) OPINFO3(HASHJMP, "hashjmp", 4, false, NONE, NONE, ALL, PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, HANDLE)) OPINFO1(JMP, "jmp", 4, true, NONE, NONE, NONE, PINFO(IN, OP, LABEL)) - OPINFO2(EXH, "exh", 4, true, NONE, NONE, ALL, PINFO(IN, OP, HANDLE), PINFO(IN, OP, IANY)) - OPINFO1(CALLH, "callh", 4, true, NONE, NONE, ALL, PINFO(IN, OP, HANDLE)) + OPINFO2(EXH, "exh", 4, true, NONE, NONE, ALL, PINFO(IN, OP, HANDLE), PINFO(IN, OP, IANY)) // Call exception handler + OPINFO1(CALLH, "callh", 4, true, NONE, NONE, ALL, PINFO(IN, OP, HANDLE)) // Call handle OPINFO0(RET, "ret", 4, true, NONE, NONE, ALL) - OPINFO2(CALLC, "callc", 4, true, NONE, NONE, ALL, PINFO(IN, OP, CFUNC), PINFO(IN, OP, PTR)) - OPINFO2(RECOVER, "recover", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, MVAR)) + OPINFO2(CALLC, "callc", 4, true, NONE, NONE, ALL, PINFO(IN, OP, CFUNC), PINFO(IN, OP, PTR)) // Call C function + OPINFO2(RECOVER, "recover", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, MVAR)) // Get value from mapvar // Internal Register Operations - OPINFO1(SETFMOD, "setfmod", 4, false, NONE, NONE, ALL, PINFO(IN, OP, IANY)) - OPINFO1(GETFMOD, "getfmod", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) - OPINFO1(GETEXP, "getexp", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) - OPINFO2(GETFLGS, "getflgs", 4, false, P2, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IMV)) - OPINFO1(SAVE, "save", 4, false, ALL, NONE, ALL, PINFO(OUT, OP, STATE)) - OPINFO1(RESTORE, "restore", 4, false, NONE, ALL, ALL, PINFO(IN, OP, STATE)) + OPINFO1(SETFMOD, "setfmod", 4, false, NONE, NONE, ALL, PINFO(IN, OP, IANY)) // Set floating point control mode + OPINFO1(GETFMOD, "getfmod", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) // Get floating point control mode + OPINFO1(GETEXP, "getexp", 4, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) // Get exception parameter value + OPINFO2(GETFLGS, "getflgs", 4, false, P2, NONE, NONE, PINFO(OUT, OP, IRM), PINFO(IN, OP, IMV)) // Get status register flags + OPINFO1(SETFLGS, "setflgs", 4, false, NONE, ALL, ALL, PINFO(IN, OP, IANY)) // (for debugging) Set status register flags + OPINFO1(SAVE, "save", 4, false, ALL, NONE, ALL, PINFO(OUT, OP, STATE)) // Save current state to drcuml_machine_state + OPINFO1(RESTORE, "restore", 4, false, NONE, ALL, ALL, PINFO(IN, OP, STATE)) // Load saved state from drcuml_machine_state // Integer Operations - OPINFO4(LOAD, "!load", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSIZE)) - OPINFO4(LOADS, "!loads", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSIZE)) - OPINFO4(STORE, "!store", 4|8, false, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SCSIZE)) - OPINFO3(READ, "!read", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, SPSIZE)) - OPINFO4(READM, "!readm", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) - OPINFO3(WRITE, "!write", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) - OPINFO4(WRITEM, "!writem", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) - OPINFO2(CARRY, "!carry", 4|8, false, NONE, C, ALL, PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) - OPINFO1(SET, "!set", 4|8, true, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) + OPINFO4(LOAD, "!load", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSIZE)) // Load unsigned value from specified memory location + OPINFO4(LOADS, "!loads", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, SCSIZE)) // Load signed value from specified memory location + OPINFO4(STORE, "!store", 4|8, false, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SCSIZE)) // Store value to specified memory location + OPINFO3(READ, "!read", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, SPSIZE)) // Read memory from emulated machine using memory space reader + OPINFO4(READM, "!readm", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, IRM), PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) // Read memory from emulated machine using memory space reader (masked) + OPINFO3(WRITE, "!write", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) // Write to emulated machine's memory using memory space writer + OPINFO4(WRITEM, "!writem", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, SPSIZE)) // Write to emulated machine's memory using memory space writer (masked) + OPINFO2(CARRY, "!carry", 4|8, false, NONE, C, ALL, PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Set carry status flag on CPU + OPINFO1(SET, "!set", 4|8, true, NONE, NONE, ALL, PINFO(OUT, OP, IRM)) // Get the state of the specified condition (e.g. calling UML_SET with COND_NZ will return 0 if the condition is not met and 1 if the condition is met) OPINFO2(MOV, "!mov", 4|8, true, NONE, NONE, NONE, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY)) OPINFO3(SEXT, "!sext", 4|8, false, NONE, SZ, ALL, PINFO(OUT, OP, IRM), PINFO(IN, P3, IANY), PINFO(IN, OP, SIZE)) - OPINFO4(ROLAND, "!roland", 4|8, false, NONE, SZ, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) - OPINFO4(ROLINS, "!rolins", 4|8, false, NONE, SZ, ALL, PINFO(INOUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) + OPINFO4(ROLAND, "!roland", 4|8, false, NONE, SZ, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Rotate left + AND (see drcbec.cpp for implementation) + OPINFO4(ROLINS, "!rolins", 4|8, false, NONE, SZ, ALL, PINFO(INOUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Rotate left + OR (see drcbec.cpp for implementation) OPINFO3(ADD, "!add", 4|8, false, NONE, SZVC, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO3(ADDC, "!addc", 4|8, false, C, SZVC, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO3(SUB, "!sub", 4|8, false, NONE, SZVC, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO3(SUBB, "!subb", 4|8, false, C, SZVC, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO2(CMP, "!cmp", 4|8, false, NONE, SZVC, ALL, PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) - OPINFO4(MULU, "!mulu", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) - OPINFO4(MULS, "!muls", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) + OPINFO4(MULU, "!mulu", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Unsigned 32x32=64 and 64x64=128 multiplication + OPINFO3(MULULW, "!mululw", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Unsigned 32x32=32 and 64x64=64 multiplication (overflow set based on 32x32=64 calculation but zero and sign based on 32-bit result) + OPINFO4(MULS, "!muls", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Signed 32x32=64 and 64x64=128 multiplication + OPINFO3(MULSLW, "!mulslw", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Signed 32x32=32 and 64x64=64 multiplication (overflow set based on 32x32=64 calculation but zero and sign based on 32-bit result) OPINFO4(DIVU, "!divu", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO4(DIVS, "!divs", 4|8, false, NONE, SZV, ALL, PINFO(OUT, OP, IRM), PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) OPINFO3(AND, "!and", 4|8, false, NONE, SZ, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) @@ -194,18 +198,18 @@ opcode_info const instruction::s_opcode_info_table[OP_MAX] = OPINFO3(RORC, "!rorc", 4|8, false, C, SZC, ALL, PINFO(OUT, OP, IRM), PINFO(IN, OP, IANY), PINFO(IN, OP, IANY)) // Floating Point Operations - OPINFO3(FLOAD, "f#load", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY)) - OPINFO3(FSTORE, "f#store", 4|8, false, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, FRM)) - OPINFO3(FREAD, "f#read", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, 4, IANY), PINFO(IN, OP, SPSIZE)) - OPINFO3(FWRITE, "f#write", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, FANY), PINFO(IN, OP, SPSIZE)) + OPINFO3(FLOAD, "f#load", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, PTR), PINFO(IN, 4, IANY)) // Load float/double value from specified memory location + OPINFO3(FSTORE, "f#store", 4|8, false, NONE, NONE, ALL, PINFO(IN, OP, PTR), PINFO(IN, 4, IANY), PINFO(IN, OP, FRM)) // Save float/double value to specified memory location + OPINFO3(FREAD, "f#read", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, 4, IANY), PINFO(IN, OP, SPSIZE)) // Read float/double value from emulated machine using memory space reader + OPINFO3(FWRITE, "f#write", 4|8, false, NONE, NONE, ALL, PINFO(IN, 4, IANY), PINFO(IN, OP, FANY), PINFO(IN, OP, SPSIZE)) // Write float/double value to emulated machine using memory space writer OPINFO2(FMOV, "f#mov", 4|8, true, NONE, NONE, NONE, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY)) - OPINFO4(FTOINT, "f#toint", 4|8, false, NONE, NONE, ALL, PINFO(OUT, P3, IRM), PINFO(IN, OP, FANY), PINFO(IN, OP, SIZE), PINFO(IN, OP, ROUND)) - OPINFO3(FFRINT, "f#frint", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, IANY), PINFO(IN, OP, SIZE)) - OPINFO3(FFRFLT, "f#frflt", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, FANY), PINFO(IN, OP, SIZE)) - OPINFO2(FRNDS, "f#rnds", 8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, FANY)) + OPINFO4(FTOINT, "f#toint", 4|8, false, NONE, NONE, ALL, PINFO(OUT, P3, IRM), PINFO(IN, OP, FANY), PINFO(IN, OP, SIZE), PINFO(IN, OP, ROUND)) // Float/double to integer + OPINFO3(FFRINT, "f#frint", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, IANY), PINFO(IN, OP, SIZE)) // Float/double from integer + OPINFO3(FFRFLT, "f#frflt", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, FANY), PINFO(IN, OP, SIZE)) // Convert float to double or double to float + OPINFO2(FRNDS, "f#rnds", 8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, P3, FANY)) // Convert double to float and then back to double, or float to double and back to float OPINFO3(FADD, "f#add", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) OPINFO3(FSUB, "f#sub", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) - OPINFO2(FCMP, "f#cmp", 4|8, false, NONE, UZC, ALL, PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) + OPINFO2(FCMP, "f#cmp", 4|8, false, NONE, UZC, ALL, PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) // Note: status flags except FLAG_U are undefined when comparing with NaN OPINFO3(FMUL, "f#mul", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) OPINFO3(FDIV, "f#div", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY), PINFO(IN, OP, FANY)) OPINFO2(FNEG, "f#neg", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY)) @@ -213,8 +217,8 @@ opcode_info const instruction::s_opcode_info_table[OP_MAX] = OPINFO2(FSQRT, "f#sqrt", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY)) OPINFO2(FRECIP, "f#recip", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY)) OPINFO2(FRSQRT, "f#rsqrt", 4|8, false, NONE, NONE, ALL, PINFO(OUT, OP, FRM), PINFO(IN, OP, FANY)) - OPINFO2(FCOPYI, "f#copyi", 4|8, false, NONE, NONE, NONE, PINFO(OUT, OP, FRM), PINFO(IN, OP, IRM)) - OPINFO2(ICOPYF, "icopyf#", 4|8, false, NONE, NONE, NONE, PINFO(OUT, OP, IRM), PINFO(IN, OP, FRM)) + OPINFO2(FCOPYI, "f#copyi", 4|8, false, NONE, NONE, NONE, PINFO(OUT, OP, FRM), PINFO(IN, OP, IRM)) // Load float/double value from integer representation (e.g. 0x3f800000 -> 1.0f) + OPINFO2(ICOPYF, "icopyf#", 4|8, false, NONE, NONE, NONE, PINFO(OUT, OP, IRM), PINFO(IN, OP, FRM)) // Store float/double value as integer representation (e.g. 1.0f -> 0x3f800000) }; @@ -389,7 +393,7 @@ void uml::instruction::simplify() if (m_param[2].is_immediate_value(paramsizemask[m_param[3].size()])) { m_opcode = OP_READ; - m_numparams = 2; + m_numparams = 3; m_param[2] = m_param[3]; } break; @@ -399,7 +403,7 @@ void uml::instruction::simplify() if (m_param[2].is_immediate_value(paramsizemask[m_param[3].size()])) { m_opcode = OP_WRITE; - m_numparams = 2; + m_numparams = 3; m_param[2] = m_param[3]; } break; @@ -504,13 +508,26 @@ void uml::instruction::simplify() else if (m_param[2].is_immediate() && m_param[3].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(u32(u32(m_param[1].immediate()) * u32(m_param[2].immediate()))); + convert_to_mov_immediate(u32(u32(m_param[2].immediate()) * u32(m_param[3].immediate()))); else if (m_size == 8) - convert_to_mov_immediate(u64(u64(m_param[1].immediate()) * u64(m_param[2].immediate()))); + convert_to_mov_immediate(u64(u64(m_param[2].immediate()) * u64(m_param[3].immediate()))); } } break; + // MULULW: convert simple form to MOV if immediate, or if multiplying by 0 + case OP_MULULW: + if (m_param[1].is_immediate_value(0) || m_param[2].is_immediate_value(0)) + convert_to_mov_immediate(0); + else if (m_param[1].is_immediate() && m_param[2].is_immediate()) + { + if (m_size == 4) + convert_to_mov_immediate(u32(u32(m_param[1].immediate()) * u32(m_param[2].immediate()))); + else if (m_size == 8) + convert_to_mov_immediate(u64(u64(m_param[1].immediate()) * u64(m_param[2].immediate()))); + } + break; + // MULS: convert simple form to MOV if immediate, or if multiplying by 0 case OP_MULS: if (m_param[0] == m_param[1]) @@ -520,13 +537,26 @@ void uml::instruction::simplify() else if (m_param[2].is_immediate() && m_param[3].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(s32(s32(m_param[1].immediate()) * s32(m_param[2].immediate()))); + convert_to_mov_immediate(s32(s32(m_param[2].immediate()) * s32(m_param[3].immediate()))); else if (m_size == 8) - convert_to_mov_immediate(s64(s64(m_param[1].immediate()) * s64(m_param[2].immediate()))); + convert_to_mov_immediate(s64(s64(m_param[2].immediate()) * s64(m_param[3].immediate()))); } } break; + // MULSLW: convert simple form to MOV if immediate, or if multiplying by 0 + case OP_MULSLW: + if (m_param[1].is_immediate_value(0) || m_param[2].is_immediate_value(0)) + convert_to_mov_immediate(0); + else if (m_param[1].is_immediate() && m_param[2].is_immediate()) + { + if (m_size == 4) + convert_to_mov_immediate(s32(s32(m_param[1].immediate()) * s32(m_param[2].immediate()))); + else if (m_size == 8) + convert_to_mov_immediate(s64(s64(m_param[1].immediate()) * s64(m_param[2].immediate()))); + } + break; + // DIVU: convert simple form to MOV if immediate, or if dividing with 0 case OP_DIVU: if (m_param[0] == m_param[1] && !m_param[3].is_immediate_value(0)) @@ -536,9 +566,9 @@ void uml::instruction::simplify() else if (m_param[2].is_immediate() && m_param[3].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(u32(u32(m_param[1].immediate()) / u32(m_param[2].immediate()))); + convert_to_mov_immediate(u32(u32(m_param[2].immediate()) / u32(m_param[3].immediate()))); else if (m_size == 8) - convert_to_mov_immediate(u64(u64(m_param[1].immediate()) / u64(m_param[2].immediate()))); + convert_to_mov_immediate(u64(u64(m_param[2].immediate()) / u64(m_param[3].immediate()))); } } break; @@ -552,9 +582,9 @@ void uml::instruction::simplify() else if (m_param[2].is_immediate() && m_param[3].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(s32(s32(m_param[1].immediate()) / s32(m_param[2].immediate()))); + convert_to_mov_immediate(s32(s32(m_param[2].immediate()) / s32(m_param[3].immediate()))); else if (m_size == 8) - convert_to_mov_immediate(s64(s64(m_param[1].immediate()) / s64(m_param[2].immediate()))); + convert_to_mov_immediate(s64(s64(m_param[2].immediate()) / s64(m_param[3].immediate()))); } } break; @@ -624,7 +654,12 @@ void uml::instruction::simplify() // SHL: convert to MOV if immediate or shifting by 0 case OP_SHL: if (m_param[1].is_immediate() && m_param[2].is_immediate()) - convert_to_mov_immediate(m_param[1].immediate() << m_param[2].immediate()); + { + if (m_size == 4) + convert_to_mov_immediate(u32(m_param[1].immediate()) << (m_param[2].immediate() & 31)); + else if (m_size == 8) + convert_to_mov_immediate(u64(m_param[1].immediate()) << (m_param[2].immediate() & 63)); + } else if (m_param[2].is_immediate_value(0)) convert_to_mov_param(1); break; @@ -634,9 +669,9 @@ void uml::instruction::simplify() if (m_param[1].is_immediate() && m_param[2].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(u32(m_param[1].immediate()) >> m_param[2].immediate()); + convert_to_mov_immediate(u32(m_param[1].immediate()) >> (m_param[2].immediate() & 31)); else if (m_size == 8) - convert_to_mov_immediate(u64(m_param[1].immediate()) >> m_param[2].immediate()); + convert_to_mov_immediate(u64(m_param[1].immediate()) >> (m_param[2].immediate() & 63)); } else if (m_param[2].is_immediate_value(0)) convert_to_mov_param(1); @@ -647,9 +682,9 @@ void uml::instruction::simplify() if (m_param[1].is_immediate() && m_param[2].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(s32(m_param[1].immediate()) >> m_param[2].immediate()); + convert_to_mov_immediate(s32(m_param[1].immediate()) >> (m_param[2].immediate() & 31)); else if (m_size == 8) - convert_to_mov_immediate(s64(m_param[1].immediate()) >> m_param[2].immediate()); + convert_to_mov_immediate(s64(m_param[1].immediate()) >> (m_param[2].immediate() & 63)); } else if (m_param[2].is_immediate_value(0)) convert_to_mov_param(1); @@ -660,9 +695,9 @@ void uml::instruction::simplify() if (m_param[1].is_immediate() && m_param[2].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(rotl_32(m_param[1].immediate(), m_param[2].immediate())); + convert_to_mov_immediate(rotl_32(m_param[1].immediate(), m_param[2].immediate() & 31)); else if (m_size == 8) - convert_to_mov_immediate(rotl_64(m_param[1].immediate(), m_param[2].immediate())); + convert_to_mov_immediate(rotl_64(m_param[1].immediate(), m_param[2].immediate() & 63)); } else if (m_param[2].is_immediate_value(0)) convert_to_mov_param(1); @@ -673,9 +708,9 @@ void uml::instruction::simplify() if (m_param[1].is_immediate() && m_param[2].is_immediate()) { if (m_size == 4) - convert_to_mov_immediate(rotr_32(m_param[1].immediate(), m_param[2].immediate())); + convert_to_mov_immediate(rotr_32(m_param[1].immediate(), m_param[2].immediate() & 31)); else if (m_size == 8) - convert_to_mov_immediate(rotr_64(m_param[1].immediate(), m_param[2].immediate())); + convert_to_mov_immediate(rotr_64(m_param[1].immediate(), m_param[2].immediate() & 63)); } else if (m_param[2].is_immediate_value(0)) convert_to_mov_param(1); diff --git a/src/devices/cpu/uml.h b/src/devices/cpu/uml.h index 662a0dda2b6..3149d97f2c0 100644 --- a/src/devices/cpu/uml.h +++ b/src/devices/cpu/uml.h @@ -62,16 +62,16 @@ namespace uml { COND_ALWAYS = 0, - COND_Z = 0x80, // requires Z - COND_NZ, // requires Z - COND_S, // requires S - COND_NS, // requires S - COND_C, // requires C - COND_NC, // requires C - COND_V, // requires V - COND_NV, // requires V - COND_U, // requires U - COND_NU, // requires U + COND_Z = 0x80, // requires Z (zero/equal) + COND_NZ, // requires Z (not zero/unequal) + COND_S, // requires S (signed) + COND_NS, // requires S (not signed) + COND_C, // requires C (carry) + COND_NC, // requires C (no carry) + COND_V, // requires V (overflow) + COND_NV, // requires V (no overflow) + COND_U, // requires U (unordered) + COND_NU, // requires U (not unordered) COND_A, // requires CZ, unsigned COND_BE, // requires CZ, unsigned COND_G, // requires SVZ, signed @@ -143,6 +143,7 @@ namespace uml // control flow operations OP_NOP, // NOP OP_DEBUG, // DEBUG pc + OP_BREAK, // BREAK OP_EXIT, // EXIT src1[,c] OP_HASHJMP, // HASHJMP mode,pc,handle OP_JMP, // JMP imm[,c] @@ -157,6 +158,7 @@ namespace uml OP_GETFMOD, // GETFMOD dst OP_GETEXP, // GETEXP dst OP_GETFLGS, // GETFLGS dst[,f] + OP_SETFLGS, // SETFLGS src OP_SAVE, // SAVE mem OP_RESTORE, // RESTORE mem @@ -180,7 +182,9 @@ namespace uml OP_SUBB, // SUBB dst,src1,src2[,f] OP_CMP, // CMP src1,src2[,f] OP_MULU, // MULU dst,edst,src1,src2[,f] + OP_MULULW, // MULULW dst,src1,src2[,f] OP_MULS, // MULS dst,edst,src1,src2[,f] + OP_MULSLW, // MULSLW dst,src1,src2[,f] OP_DIVU, // DIVU dst,edst,src1,src2[,f] OP_DIVS, // DIVS dst,edst,src1,src2[,f] OP_AND, // AND dst,src1,src2[,f] @@ -394,6 +398,8 @@ namespace uml // construction/destruction constexpr instruction() : m_param{ } { } + bool is_param_out(int paramnum) const { assert(m_opcode < OP_MAX); assert(paramnum < m_numparams); return (s_opcode_info_table[m_opcode].param[paramnum].output & 0x02) != 0; } + // getters constexpr opcode_t opcode() const { return m_opcode; } constexpr condition_t condition() const { return m_condition; } @@ -422,6 +428,7 @@ namespace uml // control flow operations void nop() { configure(OP_NOP, 4); } + void break_() { configure(OP_BREAK, 4); } void debug(u32 pc) { configure(OP_DEBUG, 4, pc); } void exit(parameter param) { configure(OP_EXIT, 4, param); } void exit(condition_t cond, parameter param) { configure(OP_EXIT, 4, param, cond); } @@ -443,6 +450,7 @@ namespace uml void getfmod(parameter dst) { configure(OP_GETFMOD, 4, dst); } void getexp(parameter dst) { configure(OP_GETEXP, 4, dst); } void getflgs(parameter dst, u32 flags) { configure(OP_GETFLGS, 4, dst, flags); } + void setflgs(u32 flags) { configure(OP_SETFLGS, 4, flags); } void save(drcuml_machine_state *dst) { configure(OP_SAVE, 4, parameter::make_memory(dst)); } void restore(drcuml_machine_state *src) { configure(OP_RESTORE, 4, parameter::make_memory(src)); } @@ -467,7 +475,9 @@ namespace uml void subb(parameter dst, parameter src1, parameter src2) { configure(OP_SUBB, 4, dst, src1, src2); } void cmp(parameter src1, parameter src2) { configure(OP_CMP, 4, src1, src2); } void mulu(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_MULU, 4, dst, edst, src1, src2); } + void mululw(parameter dst, parameter src1, parameter src2) { configure(OP_MULULW, 4, dst, src1, src2); } void muls(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_MULS, 4, dst, edst, src1, src2); } + void mulslw(parameter dst, parameter src1, parameter src2) { configure(OP_MULSLW, 4, dst, src1, src2); } void divu(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_DIVU, 4, dst, edst, src1, src2); } void divs(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_DIVS, 4, dst, edst, src1, src2); } void _and(parameter dst, parameter src1, parameter src2) { configure(OP_AND, 4, dst, src1, src2); } @@ -506,7 +516,9 @@ namespace uml void dsubb(parameter dst, parameter src1, parameter src2) { configure(OP_SUBB, 8, dst, src1, src2); } void dcmp(parameter src1, parameter src2) { configure(OP_CMP, 8, src1, src2); } void dmulu(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_MULU, 8, dst, edst, src1, src2); } + void dmululw(parameter dst, parameter src1, parameter src2) { configure(OP_MULULW, 8, dst, src1, src2); } void dmuls(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_MULS, 8, dst, edst, src1, src2); } + void dmulslw(parameter dst, parameter src1, parameter src2) { configure(OP_MULSLW, 8, dst, src1, src2); } void ddivu(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_DIVU, 8, dst, edst, src1, src2); } void ddivs(parameter dst, parameter edst, parameter src1, parameter src2) { configure(OP_DIVS, 8, dst, edst, src1, src2); } void dand(parameter dst, parameter src1, parameter src2) { configure(OP_AND, 8, dst, src1, src2); } diff --git a/src/devices/cpu/upd177x/upd177x.cpp b/src/devices/cpu/upd177x/upd177x.cpp new file mode 100644 index 00000000000..b5cd302312f --- /dev/null +++ b/src/devices/cpu/upd177x/upd177x.cpp @@ -0,0 +1,794 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/* + +TODO: +- Only upd1771c supported +- Noise, time, and external interrupts not implemented +- CH1/CH2 not implemented +- Not all instructions implemented + +*/ + +#include "emu.h" +#include "upd177x.h" +#include "upd177xd.h" + +#define VERBOSE 0 +#include "logmacro.h" + + +DEFINE_DEVICE_TYPE(UPD1771C, upd1771c_cpu_device, "upd1771c", "NEC uPD1771C") + + +enum +{ + UPD177X_PC, UPD177X_SP, + UPD177X_A, UPD177X_A_SAVE, UPD177X_H, UPD177X_N, UPD177X_X, UPD177X_Y, + UPD177X_TIMER, UPD177X_PNC1, UPD177X_PNC2, + UPD177X_PA, UPD177X_PB, UPD177X_MD0, UPD177X_MD1, UPD177X_SKIP, UPD177X_SKIP_SAVE +}; + + +static constexpr u8 INT_TONE1 = 1 << 0; +static constexpr u8 INT_TONE2 = 1 << 1; +static constexpr u8 INT_TONE3 = 1 << 2; +static constexpr u8 INT_TONE4 = 1 << 3; +static constexpr u8 INT_NOISE = 1 << 4; +static constexpr u8 INT_EXT = 1 << 5; +static constexpr u8 INT_TIME = 1 << 6; + +static constexpr u8 MD0_3264_BIT = 0; +static constexpr u8 MD0_TN_BIT = 1; +static constexpr u8 MD0_NS_BIT = 2; +static constexpr u8 MD0_NSF1_BIT = 3; +static constexpr u8 MD0_NSF2_BIT = 4; +static constexpr u8 MD0_OUT_BIT = 5; +static constexpr u8 MD0_IF_BIT = 6; +static constexpr u8 MD1_NSF3_BIT = 0; +static constexpr u8 MD1_TIME_BIT = 1; +static constexpr u8 MD1_EXT_BIT = 2; + +static constexpr u16 VECTOR_TONE1 = 0x20; +static constexpr u16 VECTOR_TONE2 = 0x24; +static constexpr u16 VECTOR_TONE3 = 0x28; +static constexpr u16 VECTOR_TONE4 = 0x2c; +static constexpr u16 VECTOR_NOISE = 0x48; +static constexpr u16 VECTOR_EXT = 0x60; +static constexpr u16 VECTOR_TIME = 0x80; + +static constexpr u8 STACK_START = 0x20; + + +upd177x_cpu_device::upd177x_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : cpu_device(mconfig, type, tag, owner, clock) + , device_sound_interface(mconfig, *this) + , m_program_config("program", ENDIANNESS_LITTLE, 16, 16, -1, address_map_constructor(FUNC(upd177x_cpu_device::program_map), this)) + , m_pb_out_cb(*this) +{ } + + +upd1771c_cpu_device::upd1771c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : upd177x_cpu_device(mconfig, UPD1771C, tag, owner, clock) +{ } + + +device_memory_interface::space_config_vector upd177x_cpu_device::memory_space_config() const +{ + return space_config_vector + { + std::make_pair(AS_PROGRAM, &m_program_config) + }; +} + + +void upd177x_cpu_device::program_map(address_map &map) +{ + map(0, 0x1ff).rom(); +} + + +void upd177x_cpu_device::device_start() +{ + space(AS_PROGRAM).specific(m_program); + + state_add(UPD177X_PC, "PC", m_pc); + state_add(STATE_GENPC, "GENPC", m_pc).noshow(); + state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow(); + state_add(UPD177X_SP, "SP", m_sp); + state_add(UPD177X_A, "A", m_a); + state_add(UPD177X_A_SAVE, "A'", m_a_save); + state_add(UPD177X_H, "H", m_h); + state_add(UPD177X_N, "N", m_n); + state_add(UPD177X_TIMER, "Timer", m_timer); + state_add(UPD177X_X, "X", m_x); + state_add(UPD177X_Y, "Y", m_y); + state_add(UPD177X_PA, "PA", m_pa); + state_add(UPD177X_PB, "PB", m_pb); + state_add(UPD177X_MD0, "MD0", m_md0); + state_add(UPD177X_MD1, "MD1", m_md1); + state_add(UPD177X_PNC1, "PNC1", m_pnc1); + state_add(UPD177X_PNC2, "PNC2", m_pnc2); + state_add(UPD177X_SKIP, "SKIP", m_skip); + state_add(UPD177X_SKIP_SAVE, "SKIP'", m_skip_save); + + save_item(NAME(m_pc)); + save_item(NAME(m_sp)); + save_item(NAME(m_a)); + save_item(NAME(m_a_save)); + save_item(NAME(m_h)); + save_item(NAME(m_n)); + save_item(NAME(m_timer)); + save_item(NAME(m_x)); + save_item(NAME(m_y)); + save_item(NAME(m_pa)); + save_item(NAME(m_pb)); + save_item(NAME(m_ram)); + save_item(NAME(m_md0)); + save_item(NAME(m_md1)); + save_item(NAME(m_pnc1)); + save_item(NAME(m_pnc2)); + save_item(NAME(m_skip)); + save_item(NAME(m_skip_save)); + save_item(NAME(m_ts)); + save_item(NAME(m_ns)); + save_item(NAME(m_ss)); + save_item(NAME(m_dac)); + save_item(NAME(m_dac_sign)); + save_item(NAME(m_tn_int)); + save_item(NAME(m_counter)); + + set_icountptr(m_icount); + + m_channel = stream_alloc(0, 1, clock() / 4); +} + + +void upd177x_cpu_device::device_reset() +{ + m_pc = 0; + m_sp = 0; + m_a = 0; + m_a_save = 0; + m_h = 0; + m_n = 0; + m_x = 0; + m_y = 0; + m_pa = 0; + m_pb = 0; + m_md0 = 0; + m_md1 = 0; + m_skip = false; + m_skip_save = false; + m_ts = false; + m_ns = false; + m_ss = false; + m_dac = 0; + m_dac_sign = true; + m_tn_int = false; + m_counter = 0; + m_timer = 0; + set_noise_counter_bit(); +} + + +std::unique_ptr<util::disasm_interface> upd177x_cpu_device::create_disassembler() +{ + return std::make_unique<upd177x_disassembler>(); +} + + +void upd177x_cpu_device::op0xxx(u16 opcode) +{ + switch (opcode) + { + case 0x0000: // NOP + break; + case 0x0002: // OUT PA + m_pa = m_a; + break; + case 0x0004: // OUT PB + m_pb = m_a; + m_pb_out_cb(m_pb); + break; + case 0x0008: // MOV X,RG + m_x = m_pnc1 & 0x7f; + break; + case 0x0201: // MOV N,A + m_n = m_a; + break; + case 0x0208: // MOV X,A + m_x = m_a & 0x7f; + break; + case 0x0401: // IN PA + m_a = m_pa; + break; + case 0x0402: // IN PB + m_a = m_pb; + break; + case 0x0404: // RAR + m_a = ((m_a & 0x01) << 7) | (m_a >> 1); + break; + case 0x0408: // RAL + m_a = ((m_a & 0x80) >> 7) | (m_a << 1); + break; + case 0x0502: // OUT DA + m_channel->update(); + m_dac = (m_ss ^ m_ts) ? ~m_a : m_a; + m_dac_sign = m_ss; + break; + case 0x0504: // MUL1 + if (!BIT(m_y, 0)) + { + m_a = m_a >> 1; + } + m_y = m_y >> 1; + break; + case 0x050c: // MUL2, usually gets executed 5 times to calculate X * (Y / 32) + if (BIT(m_y, 0)) + { + m_a = (m_a + m_x) >> 1; + } + else + { + m_a = m_a >> 1; + } + m_y = m_y >> 1; + break; + case 0x0800: // RET + m_sp = (m_sp - 1) & 0x07; + m_pc = (m_ram[STACK_START + (m_sp * 2) + 1] << 8) | m_ram[STACK_START + (m_sp * 2)]; + break; + case 0x090f: // RETI + m_sp = (m_sp - 1) & 0x07; + m_pc = (m_ram[STACK_START + (m_sp * 2) + 1] << 8) | m_ram[STACK_START + (m_sp * 2)]; + m_a = m_a_save; + m_skip = m_skip_save; + m_tn_int = false; + break; + + case 0x0005: // STF + case 0x0101: // MON + case 0x0501: // JMPA + case 0x0602: // OFF + case 0x0801: // RETS + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::op1xxx(u16 opcode) +{ + switch (opcode & 0x0e0f) + { + case 0x0000: // MOV Y,Rr + m_y = m_ram[(opcode >> 4) & 0x1f] & 0x1f; + break; + case 0x0005: // MOV A,Rr + m_a = m_ram[(opcode >> 4) & 0x1f]; + break; + case 0x0201: // MOV Rr,A + m_ram[(opcode >> 4) & 0x1f] = m_a; + break; + case 0x0409: // MIX Rr + case 0x0509: // MIX Rr + m_ns = BIT(m_md0, MD0_NSF1_BIT) ? BIT(m_pnc2 , 2) : false; + if (m_ts ^ m_ns) + { + m_ss = m_ts ^ ((m_ram[(opcode >> 4) & 0x1f] < m_a) ? true : false); + m_a = m_ram[(opcode >> 4) & 0x1f] - m_a; + } + else + { + m_ss = m_ts ^ ((m_ram[(opcode >> 4) & 0x1f] + m_a > 255) ? true : false); + m_a = m_ram[(opcode >> 4) & 0x1f] + m_a; + } + break; + case 0x0601: // MOV (H),A + m_ram[m_h] = m_a; + break; + case 0x0801: // TBL0 A,(Rr) + case 0x0901: // TBL0 A,(Rr) + { + const u8 reg = (opcode >> 4) & 0x1e; + const u16 addr = (m_ram[reg + 1] << 8) | m_ram[reg]; + const u16 data = m_program.read_word(addr >> 1); + m_a = BIT(addr, 0) ? data >> 8 : data & 0xff; + } + m_cycle(); + break; + case 0x0802: // TBL0 X,(Rr) + case 0x0902: // TBL0 X,(Rr) + { + const u8 reg = (opcode >> 4) & 0x1e; + const u16 addr = (m_ram[reg + 1] << 8) | m_ram[reg]; + const u16 data = m_program.read_word(addr >> 1); + m_x = BIT(addr, 0) ? (data >> 8) : data; + m_ts = BIT(m_x, 7); + m_x &= 0x7f; + } + m_cycle(); + break; + + case 0x000a: // MOV H,Rr + case 0x0202: // MOV Rr,H + case 0x0205: // XCHG Rr,A + case 0x020a: // XCHG Rr,H + case 0x0405: // MOV A,(H) + case 0x0605: // XCHG (H),A + case 0x0804: // TBL0 Y,(Rr) + case 0x0904: // TBL0 Y,(Rr) + case 0x0808: // CALL0 (Rr) + case 0x0908: // CALL0 (Rr) + case 0x0a01: // TBL1 A,(Rr) + case 0x0b01: // TBL1 A,(Rr) + case 0x0a02: // TBL1 X,(Rr) + case 0x0b02: // TBL1 X,(Rr) + case 0x0a04: // TBL1 Y,(Rr) + case 0x0b04: // TBL1 Y,(Rr) + case 0x0a08: // CALL1 (Rr) + case 0x0b08: // CALL1 (Rr) + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::op2xxx(u16 opcode) +{ + switch (opcode & 0x0f00) + { + case 0x0100: // MVI MD0,A + m_md0 = opcode & 0x7f; + set_noise_counter_bit(); + break; + case 0x0000: // JPP n + case 0x8000: // JMPFZ n + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::op3xxx(u16 opcode) +{ + switch (opcode & 0x0f00) + { + case 0x0400: // MVI A,n + m_a = opcode & 0xff; + break; + case 0x0800: + if (!(opcode & 0x00c0)) + { + m_h = opcode & 0x3f; + } + break; + case 0x0100: // MVI MD1,n + case 0x0200: // MVI (H),n + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::op7xxx(u16 opcode) +{ + // CALL + m_ram[STACK_START + (m_sp * 2) + 1] = m_pc >> 8; + m_ram[STACK_START + (m_sp * 2)] = m_pc & 0xff; + m_sp = (m_sp + 1) & 0x07; + m_pc = (m_pc & 0xf000) | (opcode & 0x0fff); +} + + +void upd177x_cpu_device::op89xxx(u16 opcode) +{ + switch (opcode & 0x1f00) + { + case 0x0000: // ADI A,n + m_a = m_a + (opcode & 0xff); + break; + case 0x0200: // ANDI A,n + m_a = m_a & (opcode & 0xff); + break; + case 0x0600: // ORI A,n + m_a = m_a | (opcode & 0xff); + break; + case 0x0800: // ADIS A,n + m_a = m_a + (opcode & 0xff); + m_skip = (m_a < (opcode & 0xff)); + break; + case 0x0c00: // SBIS A,n + m_skip = m_a < (opcode & 0xff); + m_a = m_a - (opcode & 0xff); + break; + case 0x0e00: // XORI A,n + m_a = m_a ^ (opcode & 0xff); + break; + case 0x1000: // TADI NC A,n + m_skip = (m_a + (opcode & 0xff) < 0x100); + break; + case 0x1400: // TSBI NC A,n + m_skip = (m_a >= (opcode & 0xff)); + break; + case 0x1600: // TSBI NZ A,n + m_skip = (m_a != (opcode & 0xff)); + break; + case 0x1a00: // TANDI Z A,n + m_skip = (m_a & (opcode & 0xff)) == 0; + break; + case 0x1c00: // TSBI C A,n + m_skip = (m_a < (opcode & 0xff)); + break; + + case 0x0100: // ADI MD1,n + case 0x1100: // ADI MD0,n + case 0x0300: // ANDI MD1,n + case 0x1300: // ANDI MD0,n + case 0x0400: // SBI A,n + case 0x0500: // SBI MD1,n + case 0x1500: // SBI MD0,n + case 0x0700: // ORI MD1,n + case 0x1700: // ORI MD0,n + case 0x0900: // ADIS MD1,n + case 0x1900: // ADIS MD0,n + case 0x0a00: // ANDIS A,n + case 0x0b00: // ANDIS MD1,n + case 0x1b00: // ANDIS MD0,n + case 0x0d00: // SBIS MD1,n + case 0x1d00: // SBIS MD0,n + case 0x0f00: // XORI MD1,n + case 0x1f00: // XORI MD0,n + case 0x1200: // TANDI NZ A,n + case 0x1800: // TADI C A,n + case 0x1e00: // TSBI Z A,n + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::opabxxx(u16 opcode) +{ + switch (opcode & 0x1f00) + { + case 0x0d00: // SBS H,n + { + u8 old_h = m_h; + m_h = (m_h - (opcode & 0x3f)) & 0x3f; + if (old_h < m_h) + { + m_skip = true; + } + } + break; + case 0x1200: // TANDI NZ (H),n + m_skip = (m_ram[m_h] & (opcode & 0xff)); + break; + case 0x1a00: // TANDI Z (H),n + m_skip = (m_ram[m_h] & (opcode & 0xff)) == 0; + break; + case 0x1f00: // TSB Z H,n + m_skip = (m_h == (opcode & 0xff)); + break; + + case 0x0000: // AD (H),n + case 0x0100: // AD H,n + case 0x0200: // AND (H),n + case 0x0300: // AND H,n + case 0x0400: // SB (H),n + case 0x0500: // SB H,n + case 0x0600: // OR (H),n + case 0x0700: // OR H,n + case 0x0800: // ADS (H),n + case 0x0900: // ADS H,n + case 0x0a00: // ANDS (H),n + case 0x0b00: // ANDS H,n + case 0x0c00: // SBS (H),n + case 0x0e00: // XOR (H),n + case 0x0f00: // XOR H,n + case 0x1000: // TAD NC (H),n + case 0x1100: // TAD NC H,n + case 0x1300: // TAND NZ H,n + case 0x1400: // TSB NC (H),n + case 0x1500: // TSB NC H,n + case 0x1600: // TSB NZ (H),n + case 0x1700: // TSB NZ H,n + case 0x1800: // TAD C (H),n + case 0x1900: // TAD C H,n + case 0x1b00: // TAND Z H,n + case 0x1c00: // TSB C (H),n + case 0x1d00: // TSB C H,n + case 0x1e00: // TSB Z (H),n + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::opcdxxx(u16 opcode) +{ + switch (opcode & 0x1e0f) + { + case 0x0008: // AD Rr,A + m_ram[(opcode >> 4) & 0x1f] += m_a; + break; + case 0x1e00: // TSB Z A,Rr + m_skip = (m_a == m_ram[(opcode >> 4) & 0x1f]); + break; + case 0x0000: // AD A,Rr + m_a += m_ram[(opcode >> 4) & 0x1f]; + break; + + case 0x0001: // AD A,(H) + case 0x0009: // AD (H),A + case 0x0200: // AND A,Rr + case 0x0201: // AND A,(H) + case 0x0208: // AND Rr,A + case 0x0209: // AND (H),A + case 0x0400: // SB A,Rr + case 0x0401: // SB A,(H) + case 0x0408: // SB Rr,A + case 0x0409: // SB (H),A + case 0x0600: // OR A,Rr + case 0x0601: // OR A,(H) + case 0x0608: // OR Rr,A + case 0x0609: // OR (H),A + case 0x0800: // ADS A,Rr + case 0x0801: // ADS A,(H) + case 0x0808: // ADS Rr,A + case 0x0809: // ADS (H),A + case 0x0a00: // ANDS A,Rr + case 0x0a01: // ANDS A,(H) + case 0x0a08: // ANDS Rr,A + case 0x0a09: // ANDS (H),A + case 0x0c00: // SBS A,Rr + case 0x0c01: // SBS A,(H) + case 0x0c08: // SBS Rr,A + case 0x0c09: // SBS (H),A + case 0x0e00: // XOR A,Rr + case 0x0e01: // XOR A,(H) + case 0x0e08: // XOR Rr,A + case 0x0e09: // XOR (H),A + case 0x1000: // TAD NC A,Rr + case 0x1001: // TAD NC A,(H) + case 0x1008: // TAD NC Rr,A + case 0x1009: // TAD NC (H),A + case 0x1200: // TAND NZ A,Rr + case 0x1201: // TAND NZ A,(H) + case 0x1208: // TAND NZ Rr,A + case 0x1209: // TAND NZ (H),A + case 0x1400: // TSB NC A,Rr + case 0x1401: // TSB NC A,(H) + case 0x1408: // TSB NC Rr,A + case 0x1409: // TSB NC (H),A + case 0x1600: // TSB NZ A,Rr + case 0x1601: // TSB NZ A,(H) + case 0x1608: // TSB NZ Rr,A + case 0x1609: // TSB NZ (H),A + case 0x1800: // TAD C A,Rr + case 0x1801: // TAD C A,(H) + case 0x1808: // TAD C Rr,A + case 0x1809: // TAD C (H),A + case 0x1a00: // TAND Z A,Rr + case 0x1a01: // TAND Z A,(H) + case 0x1a08: // TAND Z Rr,A + case 0x1a09: // TAND Z (H),A + case 0x1c00: // TSB C A,Rr + case 0x1c01: // TSB C A,(H) + case 0x1c08: // TSB C Rr,A + case 0x1c09: // TSB C (H),A + case 0x1e01: // TSB Z A,(H) + case 0x1e08: // TSB Z Rr,A + case 0x1e09: // TSB Z (H),A + default: + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } +} + + +void upd177x_cpu_device::opefxxx(u16 opcode) +{ + switch (opcode & 0x1e00) + { + case 0x0000: // ADI Rr,n + m_ram[(opcode >> 4) & 0x1f] += (opcode & 0x0f); + break; + case 0x0200: // ADIS Rr,n + m_ram[(opcode >> 4) & 0x1f] += (opcode & 0x0f); + m_skip = (m_ram[(opcode >> 4) & 0x1f] < (opcode & 0x0f)); + break; + case 0x0400: // SBI Rr,n + m_ram[(opcode >> 4) & 0x1f] -= (opcode & 0x0f); + break; + case 0x0600: // SBIS Rr,n + m_skip = (m_ram[(opcode >> 4) & 0x1f] < (opcode & 0x0f)); + m_ram[(opcode >> 4) & 0x1f] -= (opcode & 0x0f); + break; + case 0x0800: // TADI NC Rr,n + m_skip = (m_ram[(opcode >> 4) & 0x1f] + (opcode & 0x0f) < 0x100); + break; + case 0x0c00: // TSBI NC Rr,n + m_skip = (m_ram[(opcode >> 4) & 0x1f] >= (opcode & 0x0f)); + break; + case 0x0e00: // TSBI C Rr,n + m_skip = (m_ram[(opcode >> 4) & 0x1f] < (opcode & 0x0f)); + break; + case 0x1200: // ADIMS Rr,n + { + const u8 reg = (opcode >> 4) & 0x1f; + if (BIT(m_md0, 0)) + { + m_skip = ((m_ram[reg] & 0x3f) + (opcode & 0x0f)) > 0x3f; + m_ram[reg] = (m_ram[reg] & 0xc0) | ((m_ram[reg] + (opcode & 0x0f)) & 0x3f); + } + else + { + m_skip = ((m_ram[reg] & 0x1f) + (opcode & 0x0f)) > 0x1f; + m_ram[reg] = (m_ram[reg] & 0xe0) | ((m_ram[reg] + (opcode & 0x0f)) & 0x1f); + } + } + break; + + case 0x0a00: // TADI C Rr,n + case 0x1000: // ADI5 Rr,n + case 0x1800: // TADI5 Rr,n + default: + if (opcode != 0xffff) + { + fatalerror("%s, %04x: Unsupported instruction %04x\n", tag(), m_pc - 1, opcode); + } + } +} + + +void upd177x_cpu_device::handle_timer() +{ + if (m_n >= 8) + { + if (m_timer == 0 || !--m_timer) + { + if (BIT(m_md0, MD0_TN_BIT) && !m_tn_int) + { + // Trigger TN IRQ + m_ram[STACK_START + (m_sp * 2) + 1] = m_pc >> 8; + m_ram[STACK_START + (m_sp * 2)] = m_pc & 0xff; + m_sp = (m_sp + 1) & 0x07; + m_skip_save = m_skip; + m_skip = false; + m_a_save = m_a; + if (m_n >= 0x40) + { + m_pc = VECTOR_TONE4; + } + else if (m_n >= 0x20) + { + m_pc = VECTOR_TONE3; + } + else if (m_n >= 0x10) + { + m_pc = VECTOR_TONE2; + } + else + { + m_pc = VECTOR_TONE1; + } + m_tn_int = true; + } + if (m_n >= 0x40) + { + m_timer = m_n; + } + else if (m_n >= 0x20) + { + m_timer = m_n * 2; + } + else if (m_n >= 0x10) + { + m_timer = m_n * 4; + } + else + { + m_timer = m_n * 8; + } + } + } +} + + +void upd177x_cpu_device::set_noise_counter_bit() +{ + if (BIT(m_md0, MD0_NSF2_BIT)) + { + m_noise_counter_bit = (BIT(m_md1, MD1_NSF3_BIT)) ? 5 : 8; + } + else + { + m_noise_counter_bit = (BIT(m_md1, MD1_NSF3_BIT)) ? 6 : 9; + } +} + + +void upd177x_cpu_device::m_cycle() +{ + m_icount -= 8; + const u16 old_counter = m_counter; + m_counter++; + const u16 counter_diff = old_counter ^ m_counter; + if (BIT(counter_diff, 9)) + { + if (BIT(m_md1, MD1_TIME_BIT)) + { + fatalerror("%s: TM int not supported\n", tag()); + } + } + if (BIT(counter_diff, m_noise_counter_bit)) + { + m_pnc1 = ((m_pnc1 << 1) | ((BIT(m_pnc1, 6) ^ BIT(m_pnc1, 5)) ? 1 : 0)) & 0x7f; + if (BIT(m_md0, MD0_NSF1_BIT)) + { + m_pnc2 = (m_pnc2 << 1) | (BIT(m_pnc2, 0) ? 0 : 1); + } + else + { + m_pnc2 = (m_pnc2 << 1) | ((BIT(m_pnc2, 2) ^ BIT(m_pnc2, 1)) ? 0 : 1); + } + + if (BIT(m_md0, MD0_NS_BIT)) + { + fatalerror("%s: NS int not supported\n", tag()); + } + } +} + + +void upd177x_cpu_device::execute_run() +{ + do + { + handle_timer(); + debugger_instruction_hook(m_pc); + if (!m_skip) + { + u16 opcode = m_program.read_word(m_pc++); + switch (opcode & 0xf000) + { + case 0x0000: op0xxx(opcode); break; + case 0x1000: op1xxx(opcode); break; + case 0x2000: op2xxx(opcode); break; + case 0x3000: op3xxx(opcode); break; + case 0x4000: m_ram[(opcode >> 8) & 0x1f] = opcode & 0xff; break; // MVI Rr,n + case 0x5000: m_ram[(opcode >> 8) & 0x1f] = opcode & 0xff; break; // MVI Rr,n + case 0x6000: m_pc = (m_pc & 0xf000) | (opcode & 0x0fff); break; // JMP n + case 0x7000: op7xxx(opcode); break; + case 0x8000: op89xxx(opcode); break; + case 0x9000: op89xxx(opcode); break; + case 0xa000: opabxxx(opcode); break; + case 0xb000: opabxxx(opcode); break; + case 0xc000: opcdxxx(opcode); break; + case 0xd000: opcdxxx(opcode); break; + case 0xe000: opefxxx(opcode); break; + case 0xf000: opefxxx(opcode); break; + } + } + else + { + m_pc++; + m_skip = false; + } + m_cycle(); + } while (m_icount > 0); +} + + +void upd177x_cpu_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) +{ + auto &buffer = outputs[0]; + + const int smpl = m_dac_sign ? -m_dac : m_dac; + for (int sampindex = 0; sampindex < buffer.samples(); sampindex++) + { + buffer.put_int(sampindex, smpl, 256); + } +} diff --git a/src/devices/cpu/upd177x/upd177x.h b/src/devices/cpu/upd177x/upd177x.h new file mode 100644 index 00000000000..70a186acc55 --- /dev/null +++ b/src/devices/cpu/upd177x/upd177x.h @@ -0,0 +1,124 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/***************************************************************************** + + uPD177x + +****************************************************************************** + + + ___ ___ + PB4 1 |* u | 28 PB3 + PB5 2 | | 27 PB2 + PB6 3 | | 26 PB1 + PB7 4 | | 25 PA8 + PB8 5 | u | 24 PA7 + /AC 6 | P | 23 PA6 + /PW ON 7 | D | 22 PA5 + Vdd 8 | 1 | 21 PA4 + X1 9 | 7 | 20 PA3 + X0 10 | 7 | 19 PA2 + SOUND2 11 | 1 | 18 PA1 + Vda 12 | | 17 CH2 + SOUND1 13 | | 16 /EXINT + GND 14 |_______| 15 CH1 + +****************************************************************************/ + + +#ifndef MAME_CPU_UPD177X_UPD177X_H +#define MAME_CPU_UPD177X_UPD177X_H + +class upd177x_cpu_device : public cpu_device + , public device_sound_interface +{ +public: + upd177x_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // configuration helpers + auto pb_out_cb() { return m_pb_out_cb.bind(); } + + u8 pa_r() { return m_pa; } + void pa_w(u8 data) { m_pa = data; } + void pb_w(u8 data) { m_pb = data; } + +protected: + upd177x_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + virtual u32 execute_min_cycles() const noexcept override { return 1; } + virtual u32 execute_max_cycles() const noexcept override { return 2; } + virtual uint32_t execute_default_irq_vector(int inputnum) const noexcept override { return 0xff; } + virtual void execute_run() override; + + virtual space_config_vector memory_space_config() const override; + + virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; + + virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; + + void program_map(address_map &map) ATTR_COLD; + +private: + void op0xxx(u16 opcode); + void op1xxx(u16 opcode); + void op2xxx(u16 opcode); + void op3xxx(u16 opcode); + void op7xxx(u16 opcode); + void op89xxx(u16 opcode); + void opabxxx(u16 opcode); + void opcdxxx(u16 opcode); + void opefxxx(u16 opcode); + void handle_timer(); + void set_noise_counter_bit(); + void m_cycle(); + + address_space_config m_program_config; + + memory_access<16, 1, -1, ENDIANNESS_LITTLE>::specific m_program; + devcb_write8 m_pb_out_cb; + sound_stream *m_channel; + + int m_icount; + + u16 m_pc; // 16 bits + u8 m_sp; // 3 bits + u8 m_a; // 8 bits + u8 m_a_save; // 8 bits + u8 m_h; // 6 bits + u8 m_n; // 8 bits + u8 m_timer; + u16 m_counter; + u8 m_x; // 7 bits + u8 m_y; // 5 bits + u8 m_pa; + u8 m_pb; + u8 m_ram[0x40]; + u8 m_md0; + u8 m_md1; + u8 m_pnc1; // 7 bits + u8 m_pnc2; // 3 bits + bool m_skip; + bool m_skip_save; + bool m_ts; + bool m_ns; + bool m_ss; + u8 m_dac; + bool m_dac_sign; + bool m_tn_int; + u8 m_noise_counter_bit; +}; + + +class upd1771c_cpu_device : public upd177x_cpu_device +{ +public: + upd1771c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); +}; + + +DECLARE_DEVICE_TYPE(UPD1771C, upd1771c_cpu_device) + +#endif // MAME_CPU_UPD177X_UPD177X_H diff --git a/src/devices/cpu/vax/vaxdasm.cpp b/src/devices/cpu/vax/vaxdasm.cpp index 423f5746ebc..229d3972fda 100644 --- a/src/devices/cpu/vax/vaxdasm.cpp +++ b/src/devices/cpu/vax/vaxdasm.cpp @@ -23,37 +23,11 @@ u32 vax_disassembler::opcode_alignment() const return 1; } -enum class vax_disassembler::mode : u8 -{ - none, - rb, srb, urb, cntb, rw, srw, urw, mskw, rl, srl, url, posl, prl, rq, srq, urq, ro, uro, - mb, mw, ml, mq, mo, - wb, ww, wl, wq, wo, - ab, aw, al, aq, ao, - bb, bw, - vb -}; - namespace { using namespace std::literals; using mode = vax_disassembler::mode; -static constexpr bool is_read_mode(mode m) -{ - switch (m) - { - case mode::rb: case mode::srb: case mode::urb: case mode::cntb: - case mode::rw: case mode::srw: case mode::urw: case mode::mskw: - case mode::rl: case mode::srl: case mode::url: case mode::posl: case mode::prl: - case mode::rq: case mode::urq: - case mode::ro: case mode::uro: - return true; - default: - return false; - } -} - static constexpr bool is_address_mode(mode m) { return m == mode::ab || m == mode::aw || m == mode::al || m == mode::aq || m == mode::ao; @@ -1119,3 +1093,23 @@ offs_t vax_disassembler::disassemble(std::ostream &stream, offs_t pc, const vax_ else return disassemble_inst(stream, s_nonprefix_ops[op], pc, ppc, opcodes); } + +bool vax_disassembler::is_read_mode(vax_disassembler::mode m) +{ + switch (m) + { + case mode::rb: case mode::srb: case mode::urb: case mode::cntb: + case mode::rw: case mode::srw: case mode::urw: case mode::mskw: + case mode::rl: case mode::srl: case mode::url: case mode::posl: case mode::prl: + case mode::rq: case mode::urq: + case mode::ro: case mode::uro: + return true; + default: + return false; + } +} + +const vax_disassembler::mode* vax_disassembler::get_operands(u8 op) +{ + return s_nonprefix_ops[op].operand; +} diff --git a/src/devices/cpu/vax/vaxdasm.h b/src/devices/cpu/vax/vaxdasm.h index e5549d4d59f..e12657daab9 100644 --- a/src/devices/cpu/vax/vaxdasm.h +++ b/src/devices/cpu/vax/vaxdasm.h @@ -9,7 +9,16 @@ class vax_disassembler : public util::disasm_interface { public: - enum class mode : u8; + enum class mode : u8 + { + none, + rb, srb, urb, cntb, rw, srw, urw, mskw, rl, srl, url, posl, prl, rq, srq, urq, ro, uro, + mb, mw, ml, mq, mo, + wb, ww, wl, wq, wo, + ab, aw, al, aq, ao, + bb, bw, + vb + }; struct opdef { @@ -21,6 +30,9 @@ public: // construction/destruction vax_disassembler(); + static bool is_read_mode(mode m); + static const mode* get_operands(u8 op); + protected: // disassembler overrides virtual u32 opcode_alignment() const override; diff --git a/src/devices/machine/akiko.cpp b/src/devices/machine/akiko.cpp index 5ebe4603a0e..be5d02c23c2 100644 --- a/src/devices/machine/akiko.cpp +++ b/src/devices/machine/akiko.cpp @@ -142,6 +142,7 @@ void akiko_device::device_start() m_cdrom_toc = nullptr; m_dma_timer = timer_alloc(FUNC(akiko_device::dma_proc), this); m_frame_timer = timer_alloc(FUNC(akiko_device::frame_proc), this); + m_toc_timer = timer_alloc(FUNC(akiko_device::cd_delayed_cmd), this); } //------------------------------------------------- @@ -694,8 +695,7 @@ void akiko_device::update_cdrom() { m_cdrom_cmd_start = (m_cdrom_cmd_start + 3) & 0xff; - machine().scheduler().timer_set( attotime::from_msec(1), timer_expired_delegate( FUNC( akiko_device::cd_delayed_cmd ), this ), resp[0] ); - + m_toc_timer->adjust(attotime::from_msec(1), resp[0] ); break; } else if ( cmd == 0x06 ) /* read subq */ diff --git a/src/devices/machine/akiko.h b/src/devices/machine/akiko.h index 1d1a61254ca..73a3b36b094 100644 --- a/src/devices/machine/akiko.h +++ b/src/devices/machine/akiko.h @@ -92,6 +92,7 @@ private: emu_timer *m_dma_timer; emu_timer *m_frame_timer; + emu_timer *m_toc_timer; void nvram_write(uint32_t data); uint32_t nvram_read(); diff --git a/src/devices/machine/amigafdc.cpp b/src/devices/machine/amigafdc.cpp index 662a80dffe4..5b0fb798b5a 100644 --- a/src/devices/machine/amigafdc.cpp +++ b/src/devices/machine/amigafdc.cpp @@ -511,6 +511,7 @@ void amiga_fdc_device::ciaaprb_w(uint8_t data) floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&amiga_fdc_device::index_callback, this)); } + // btanb: trackdisk has no HW interlock for motor running with disk not inserted. if(floppy) { floppy->ss_w(!(BIT(data, 2))); floppy->dir_w(BIT(data, 1)); diff --git a/src/devices/sound/upd1771.cpp b/src/devices/sound/upd1771.cpp deleted file mode 100644 index 71f50b4e794..00000000000 --- a/src/devices/sound/upd1771.cpp +++ /dev/null @@ -1,563 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Viens -/********************************************************************** - - NEC uPD1771-017 as used in the Epoch Super Cassette Vision (SCV) - - Made using recording/analysis on a Yeno (PAL Super Cassette Vision) - by plgDavid - - Full markings on my 2 specimens are - "NEC JAPAN 8431K9 D1771C 017" (31st week of 1984, mask rom #017) - - I've since (October 2012) got a Grandstand Firefox F-7 Handheld game - (AKA Epoch GalagaX6/Epoch Astro Thunder 7/Tandy Astro Thunder), - (http://www.handheldmuseum.com/Grandstand/Firefox.htm) - which includes a - "NEC JAPAN 8319K9 D1771C 011" (19th week of 1983, mask rom #011) - Thanks to user 'Blanka' from Dragonslairfans for the nice catch! - (http://www.dragonslairfans.com/smfor/index.php?topic=3061.0) - - Since the chip generates tones using ROM wavetables, - it is perfectly possible to generate other sounds with different rom code and data. - - Most upd17XXX devices are typically 4bit NEC MCUs, however based on information - in "Electronic Speech Synthesis" by Geoff Bristow (ISBN 0-07-007912-9, pages 148-152) - the upd1770/1771 is not one of these 4-bit ones. - - The uPD1770/uPD1771 SSM is a 16-bit-wide rom/ram mcu with 8kb (4kw) of rom code, - 64 bytes of ram (16x16bit words addressable as 16 or 2x8 bits each, the - remaining 32 bytes acting as an 8-level stack), 182 instructions, a complex - noise and tone internal interrupt system, external interrupts, - and two 8-bit ports with multiple modes allowing for chips to operate as master - or slave devices. - SSM stands for "Sound Synthesis Microcomputer". - - People who I *THINK* worked on the uPD1771 and what part I think they worked on: - Toshio Oura - Project Lead(?), VSRSSS/TSRSSS speech synthesis engine (on upd1776C), master/slave i/o controls, author of bristow article and primary author of the IEEE article - Hatsuhide Igarashi - Clock oscillator and pad layout, coauthor on the IEEE article, other IEEE stuff - Tomoaki Isozaki - ? (senior NEC engineer?), coauthor on the IEEE article - Sachiyuki Toufuku - ?, coauthor on the IEEE article - Tojiro Mukawa - IGFETs and the DAC - M. Sakai ? - digital filtering for VSRSSS? (IEEE 4131979, 1169295) - M. Endo ? - digital design system or speech synthesis? (IEEE 4069656, another? person: IEEE 150330, 225838) - H. Aoyama ? - logic design system used to assemble/lay out the chip? (IEEE 1585393) - I. Fujitaka ? (no IEEE) - Eiji Sugimoto - cpu design? 1156033 1155824 - F. Tsukuda ? (no IEEE) - N. Miyake ? switched capacitor stuff? (IEEE nnnnnn) - - - The uPD1771 internal workings are described to some extent by the Bristow book - and the IEEE article "A Single-Chip Sound Synthesis Microcomputer" which complements the book - and are covered by at least four US patents: - 4184152 - on IGFET-based DAC stuff - 4488061 - on the IGFET-based drive circuit part of the DAC. - 4408094 - covers the 3 pin DAC with the volume control/vref pin. Not all that interesting, - except it might describe to some extent how the (9->5bit?) PWM works in the text. - 4470113 - covers the multiplexed PB0/1/2/3 pins and their use as /CS /WR /RD and ALE - note as I have marked the pins below I assume the final pins connected - to /CS /WR /RD and /ALE are PB7,6,5,4 but this is just a guess of mine: - The actual order may well match the patent. - 4577343 - covers the VSRSSS implementation as discussed in the Bristow book. - This patent has an internal diagram of the workings of the chips and - a limited description of how many registers etc it has. - 4805508 - on the operation of the tone divider register and correction for accurate period when - the tone interrupt frequency is not perfectly divisible from the clock. - These next two may not be specific to the 1771 or even related at all! - 4321562 - on a self-adjusting circuit for internal coupling to the clock crystal inputs. - This may be a generic NEC invention and probably isn't limited to the upd1771. - 4656491 - on a new method of distributing resistors and transistors on anti-ESD pin buffers - This may be a generic NEC invention and probably isn't limited to the upd1771. - - - Based on the 4577343 patent mostly, plus the bristow and IEEE article: - * these are the registers: - 8bits: - AH, AL (forming the 16-bit A' accumulator), - B, C (a pair of general purpose registers), - 4bits (may be technically part of ALU): - H -> points to one of the 16 words of ram - 1bit: - L -> selector of left or right half of the ram word - ?bits: - D (having to do with the DAC) - N (3 bits? having to do with the pseudorandom noise interrupt, namely setting the clock divider ratio for the PRNG clock vs cpu clock) - MODE (5 or more bits? enabling/disabling/acking the noise interrupt, and the tone interrupts (there are four!)) - SP (the stack pointer, probably 5 bits, points to the stack ram; may encompass H and L as above!) - FLO: unsure. quite possibly 'flag overflow' used for branching. there likely exists other flags as well... - ODF: 'output data flag?', selects which half of a selected ram word is output to the dac not really sure of this? - - - Mask roms known: - uPD1776C: mentioned in the bristow book, implements VSRSSS speech concatenation - (see US Patent 4577343 which is a patent on this VSRSSS implementation) - uPD1771C-006: used in NEC APC for sound as the "MPU" - -011: used on Firefox F-4/Astro Thunder handheld - -015: unknown, known to exist from part scalper sites only. - -017: used on Epoch Super Cassette Vision for sound; This audio driver HLEs that part only. - - Used pinout in the SCV: - - NC 1 28 NC - NC 2 27 NC - NC 3 26 ACK - !WR 4 25 D7 - !CS 5 24 D6 - RESET 6 23 D5 - NC 7 22 D4 - VCC 8 21 D3 - 6Mhz XIN 9 20 D2 - 6Mhz XOUT 10 19 D1 - AUDOUT 11 18 D0 - NC(recheck!)12 17 GND - AUDOUT(inv) 13 16 VCC - GND 14 15 ? tied to pin 16 (VCC) through a resistor (pullup?) - - Pinout based on guesses and information in "Electronic Speech Synthesis" by Geoff Bristow - (ISBN 0-07-007912-9, pages 148-152), and the data on page 233 of the Nec APC technical manual at - http://bitsavers.trailing-edge.com/pdf/nec/APC/819-000100-1003_APC_System_Reference_Guide_Apr83.pdf - I/O pin purpose based on testing by kevtris. - [x] is unsure: - PB3 <> 1 28 <> PB2 - PB4(/ALE) <> 2 27 <> PB1 - PB5(/RD) <> 3 26 <> PB0 - PB6(/WR) <> 4 25 <> D7(PA7) - PB7(/CS) <> 5 24 <> D6(PA6) - /RESET -> 6 23 <> D5(PA5) - [/TSTOUT?] <- 7 22 <> D4(PA4) - VCC -- 8 21 <> D3(PA3) - XI(CLK) -> 9 20 <> D2(PA2) - XO <- 10 19 <> D1(PA1) - D/A OUT + <- 11 18 <> D0(PA0) - D/A POWER -- 12 17 <- CH2 - D/A OUT - <- 13 16 <> /EXTINT and [/TSTOUT2?] (test out is related to pin 15 state) - GND -- 14 15 <- CH1 tied to pin 16 (VCC) through a resistor, on APC to VCC thru a 12k resistor and thru a 10uf cap to gnd - - CH1 and CH2 are mode selects, purpose based on testing by kevtris: - CH1 CH2 - H L - 'master' mode, pb4-pb7 are i/o? /EXTINT is an input - L L - 'slave' mode where pb4-pb7 are /ale /rd /wr /cs? /EXTINT may be an output in this mode? - X H - test mode: the 512 byte 16-bit wide ROM is output sequentially on pins pa7-pa0 and pb7-pb0 for the high and low bytes of each word respectively - D/A POWER is the FET source for the D/A OUT+ and D/A OUT- push-pull dac drains; it should be tied to VCC or thereabouts - - In the SCV (info from plgDavid): - pin 5 is tied to the !SCPU pin on the Epoch TV chip pin 29 (0x3600 writes) - pin 6 is tied to the PC3 pin of the upD7801 CPU - pin 26 is tied to the INT1 pin of the upD7801 (CPU pin 12), - - 1,2,3,28,27 don't generate any digital signals - 6 seems to be lowered 2.5 ms before an audio write - 7 is always low. - 12 is always high - - (NOTE: the photomicrograph in the bristow book makes it fairly clear due to - pad thicknessess that the real VCC is pin 8 and the real GND is pin 14. - The function of pin 7 is unknown. - - Pins 11 and 13 go to a special circuit, which according to kevtris's analysis - of my schematics, consist of a balanced output (not unlike XLR cables), - which are then combined together then sent to the RF box. - (The bristow book explains that there are two DAC pins and one DAC - VREF/volume pin. The dac+ and dac- are pins 11 and 13, and based on the - photomicrograph it looks like dac vref is probably pin 12) - - HLE: - All writes are made through address 0x3600 on the upD7801 - Instead of using register=value, this chip require sending multiple - bytes for each command, one after the other. - -**********************************************************************/ - -#include "emu.h" -#include "upd1771.h" - -//#define VERBOSE 1 -#include "logmacro.h" - - -namespace { - -/* - Each of the 8 waveforms have been extracted from the uPD1771c-017 internal - ROM, from offset 0x1fd (start of first waveform) to offset 0x2fc (end of - last waveform). - (note: given test mode dumping offset non-clarity it may be 0x200-0x2ff) - The waveforms are stored in an 8-bit sign-magnitude format, so if in ROM the - upper bit is 0x80, invert the lower 7 bits to get the 2's complement result - seen here. - Note that only the last 4 waveforms appear to have been intended for use as - waveforms; the first four look as if they're playing back a piece of code as - wave data. -*/ -const signed char WAVEFORMS[8][32]={ -{ 0, 0,-123,-123, -61, -23, 125, 107, 94, 83,-128,-128,-128, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,-128,-128,-128, 0, 0, 0, 0, 0, 0}, -{ 37, 16, 32, -21, 32, 52, 4, 4, 33, 18, 60, 56, 0, 8, 5, 16, 65, 19, 69, 16, -2, 19, 37, 16, 97, 19, 0, 87, 127, -3, 1, 2}, -{ 0, 8, 1, 52, 4, 0, 0, 77, 81,-109, 47, 97, -83,-109, 38, 97, 0, 52, 4, 0, 1, 4, 1, 22, 2, -46, 33, 97, 0, 8, -85, -99}, -{ 47, 97, 40, 97, -3, 25, 64, 17, 0, 52, 12, 5, 12, 5, 12, 5, 12, 5, 12, 5, 8, 4,-114, 19, 0, 52,-122, 21, 2, 5, 0, 8}, -{ -52, -96,-118,-128,-111, -74, -37, -5, 31, 62, 89, 112, 127, 125, 115, 93, 57, 23, 0, -16, -8, 15, 37, 54, 65, 70, 62, 54, 43, 31, 19, 0}, -{ -81,-128, -61, 13, 65, 93, 127, 47, 41, 44, 52, 55, 56, 58, 58, 34, 0, 68, 76, 72, 61, 108, 55, 29, 32, 39, 43, 49, 50, 51, 51, 0}, -{ -21, -45, -67, -88,-105,-114,-122,-128,-123,-116,-103, -87, -70, -53, -28, -9, 22, 46, 67, 86, 102, 114, 123, 125, 127, 117, 104, 91, 72, 51, 28, 0}, -{ -78,-118,-128,-102, -54, -3, 40, 65, 84, 88, 84, 80, 82, 88, 94, 103, 110, 119, 122, 125, 122, 122, 121, 123, 125, 126, 127, 127, 125, 118, 82, 0} -}; - - -#define NOISE_SIZE 255 - - -const unsigned char noise_tbl[]= -{ - 0x1c,0x86,0x8a,0x8f,0x98,0xa1,0xad,0xbe,0xd9,0x8a,0x66,0x4d,0x40,0x33,0x2b,0x23, - 0x1e,0x8a,0x90,0x97,0xa4,0xae,0xb8,0xd6,0xec,0xe9,0x69,0x4a,0x3e,0x34,0x2d,0x27, - 0x24,0x24,0x89,0x8e,0x93,0x9c,0xa5,0xb0,0xc1,0xdd,0x40,0x36,0x30,0x29,0x27,0x24, - 0x8b,0x90,0x96,0x9e,0xa7,0xb3,0xc4,0xe1,0x25,0x21,0x8a,0x8f,0x93,0x9d,0xa5,0xb2, - 0xc2,0xdd,0xdd,0x98,0xa2,0xaf,0xbf,0xd8,0xfd,0x65,0x4a,0x3c,0x31,0x2b,0x24,0x22, - 0x1e,0x87,0x8c,0x91,0x9a,0xa3,0xaf,0xc0,0xdb,0xbe,0xd9,0x8c,0x66,0x4d,0x40,0x34, - 0x2c,0x24,0x1f,0x88,0x90,0x9a,0xa4,0xb2,0xc2,0xda,0xff,0x67,0x4d,0x3d,0x34,0x2d, - 0x26,0x24,0x20,0x89,0x8e,0x93,0x9c,0xa5,0xb1,0xc2,0xde,0xc1,0xda,0xff,0x67,0x4d, - 0x3d,0x33,0x2d,0x26,0x24,0x20,0x89,0x8e,0x93,0x9c,0xa5,0xb1,0xc2,0xdd,0xa3,0xb0, - 0xc0,0xd9,0xfe,0x66,0x4b,0x3c,0x32,0x2b,0x24,0x23,0x1e,0x88,0x8d,0x92,0x9b,0xa4, - 0xb0,0xc1,0xdc,0xad,0xbe,0xda,0x22,0x20,0x1c,0x85,0x8a,0x8f,0x98,0xa1,0xad,0xbe, - 0xda,0x20,0x1b,0x85,0x8d,0x97,0xa1,0xaf,0xbf,0xd8,0xfd,0x64,0x49,0x3a,0x30,0x2a, - 0x23,0x21,0x1d,0x86,0x8b,0x91,0x9a,0xa2,0xae,0xc0,0xdb,0x33,0x2b,0x24,0x1f,0x88, - 0x90,0x9a,0xa4,0xb2,0xc2,0xda,0xff,0x67,0x4c,0x3e,0x33,0x2d,0x25,0x24,0x1f,0x89, - 0x8e,0x93,0x9c,0xa5,0xb1,0xc2,0xde,0x85,0x8e,0x98,0xa2,0xb0,0xc0,0xd9,0xfe,0x64, - 0x4b,0x3b,0x31,0x2a,0x23,0x22,0x1e,0x88,0x8c,0x91,0x9b,0xa3,0xaf,0xc1,0xdc,0xdc -}; - - -#define STATE_SILENCE 0 -#define STATE_NOISE 1 -#define STATE_TONE 2 -#define STATE_ADPCM 3 - -} // anonymous namespace - - -DEFINE_DEVICE_TYPE(UPD1771C, upd1771c_device, "upd1771c", "NEC uPD1771C 017") - - -upd1771c_device::upd1771c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, UPD1771C, tag, owner, clock) - , device_sound_interface(mconfig, *this) - , m_ack_handler(*this) -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void upd1771c_device::device_start() -{ - m_timer = timer_alloc(FUNC(upd1771c_device::ack_callback), this); - - m_channel = stream_alloc(0, 1, clock() / 4); - - save_item(NAME(m_packet)); - save_item(NAME(m_index)); - save_item(NAME(m_expected_bytes)); - save_item(NAME(m_state)); - save_item(NAME(m_pc3)); - save_item(NAME(m_t_timbre)); - save_item(NAME(m_t_offset)); - save_item(NAME(m_t_period)); - save_item(NAME(m_t_volume)); - save_item(NAME(m_t_tpos)); - save_item(NAME(m_t_ppos)); - save_item(NAME(m_nw_timbre)); - save_item(NAME(m_nw_volume)); - save_item(NAME(m_nw_period)); - save_item(NAME(m_nw_tpos)); - save_item(NAME(m_nw_ppos)); - save_item(NAME(m_n_value)); - save_item(NAME(m_n_volume)); - save_item(NAME(m_n_period)); - save_item(NAME(m_n_ppos)); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void upd1771c_device::device_reset() -{ - m_index = 0; - m_expected_bytes = 0; - m_pc3 = 0; - m_t_tpos = 0; - m_t_ppos = 0; - m_state = STATE_SILENCE; - m_nw_tpos = 0; - memset(m_n_value, 0x00, sizeof(m_n_value)); - memset(m_n_ppos, 0x00, sizeof(m_n_ppos)); -} - - - -uint8_t upd1771c_device::read() -{ - return 0x80; // TODO -} - -/* -*************TONE***************** -Tone consists of a wavetable playback mechanism. -Each wavetable is a looping period of 32 samples but can be played with an offset from any point in the table -effectively shrinking the sample loop, thus allowing different pitch "macros ranges" to be played. -This method is rather crude because the spectrum of the sound get heavily altered... -unless that was the intent. - -Tone Write (4 bytes): - -Byte0: 0x02 - -Byte1: 0bTTTOOOOO - MSB 3 bits of Timbre (8 wavetables) - LSB 5 bits offset in the table. - -Byte2: 0bPPPPPPPP - 8bits of clock divider/period - Anything under <= 0x20 give the same value - -Byte3: 0b???VVVVV - MSB 3 bits unknown - LSB 5 bits of "Volume" - - Note: volume is not a volume in a normal sense but some kind - of bit cropping/rounding. -*/ - - -/* -*************NOISE***************** -Noise consists on 4 different components -A weird Wavetable LFSR (for lack of a better term), -and three independent (but equal) low frequency -50/50 pulse wavs. - -The 4 components are mixed in a mysterious way, -a weird ORing with volume having a huge effect. - -Byte0: 0x01 - -Byte1: 0bTTTOOOOO - MSB 3 bits of LFSR Timbre (8 wavetables) - LSB 5 bits ????????? - -Byte2: 0bPPPPPPPP - 8bits of clock divider/period - -Byte3: 0b???VVVVV - MSB 3 bits unknown - LSB 5 bits of "Volume" - - -Byte4: 0bPPPPPPPP Low Freq0 period(if not 0 this periodically resets the Wavetable LFSR) -Byte5: 0bPPPPPPPP Low Freq1 period(if not 0 this periodically resets the Wavetable LFSR) -Byte6: 0bPPPPPPPP Low Freq2 period(if not 0 this periodically resets the Wavetable LFSR) - -Byte7: 0b???VVVVV Low Freq0 volume -Byte8: 0b???VVVVV Low Freq1 volume -Byte9: 0b???VVVVV Low Freq2 volume -*/ - -void upd1771c_device::write(uint8_t data) -{ - LOG("upd1771_w: received byte 0x%02x\n", data); - - m_ack_handler(0); - - if (m_index < MAX_PACKET_SIZE) - m_packet[m_index++] = data; - else - { - logerror("upd1771_w: received byte 0x%02x overload!\n", data); - return; - } - - switch (m_packet[0]) - { - case 0: - m_state = STATE_SILENCE; - m_index = 0; - //logerror( "upd1771_w: ----------------silence state reset\n"); - break; - - case 1: - if (m_index == 10) - { - m_state = STATE_NOISE; - m_index = 0; - - m_nw_timbre = (m_packet[1] & 0xe0) >> 5; - m_nw_period = ((uint32_t)m_packet[2] + 1) << 7; - m_nw_volume = m_packet[3] & 0x1f; - - //very long clocked periods.. used for engine drones - m_n_period[0] = (((uint32_t)m_packet[4]) + 1) << 7; - m_n_period[1] = (((uint32_t)m_packet[5]) + 1) << 7; - m_n_period[2] = (((uint32_t)m_packet[6]) + 1) << 7; - - m_n_volume[0] = m_packet[7] & 0x1f; - m_n_volume[1] = m_packet[8] & 0x1f; - m_n_volume[2] = m_packet[9] & 0x1f; - - //logerror( "upd1771_w: ----------------noise state reset\n"); - } - else - m_timer->adjust(attotime::from_ticks(512, clock())); - break; - - case 2: - if (m_index == 4) - { - //logerror( "upd1771_w: ----------------tone state reset\n"); - m_t_timbre = (m_packet[1] & 0xe0) >> 5; - m_t_offset = (m_packet[1] & 0x1f); - m_t_period = m_packet[2]; - //smaller periods don't all equal to 0x20 - if (m_t_period < 0x20) - m_t_period = 0x20; - - m_t_volume = m_packet[3] & 0x1f; - m_state = STATE_TONE; - m_index = 0; - } - else - m_timer->adjust(attotime::from_ticks(512, clock())); - break; - - case 0x1f: - //6Khz(ish) DIGI playback - - //end capture - { - bool have_all_data = false; - if (m_index >= 2 && m_packet[m_index - 2] == 0xfe && m_packet[m_index - 1] == 0x00) - { - //TODO play capture! - if (m_index >= 6) - { - // offsets 2 and 3 in the transferred pcm data seem to contain the number of samples - uint16_t count = (m_packet[4] << 8) | m_packet[3]; - count--; - m_packet[3] = count & 0xff; - m_packet[4] = (count >> 8); - if (count == 0) - { - m_index = 0; - m_packet[0] = 0; - m_state = STATE_ADPCM; - have_all_data = true; - } - } - } - if (!have_all_data) - m_timer->adjust(attotime::from_ticks(512, clock())); - } - break; - - //garbage: wipe stack - default: - m_state = STATE_SILENCE; - m_index = 0; - break; - } -} - - -void upd1771c_device::pcm_write(int state) -{ - //RESET upon HIGH - if (state != m_pc3) - { - logerror("upd1771_pc3 change!: state = %d\n", state); - m_index = 0; - m_packet[0] = 0; - m_state = STATE_SILENCE; - } - - m_pc3 = state; -} - - -TIMER_CALLBACK_MEMBER( upd1771c_device::ack_callback ) -{ - m_ack_handler(1); -} - - -//------------------------------------------------- -// sound_stream_update - handle a stream update -//------------------------------------------------- - -void upd1771c_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) -{ - auto &buffer = outputs[0]; - - switch (m_state) - { - case STATE_TONE: - //logerror( "upd1771_STATE_TONE samps:%d %d %d %d %d %d\n",(int)samples, - // (int)m_t_timbre,(int)m_t_offset,(int)m_t_volume,(int)m_t_period,(int)m_t_tpos); - - for (int sampindex = 0; sampindex < buffer.samples(); sampindex++) - { - buffer.put_int(sampindex, (WAVEFORMS[m_t_timbre][m_t_tpos]) * m_t_volume, 32768 / 2); - - m_t_ppos++; - if (m_t_ppos >= m_t_period) - { - m_t_tpos++; - if (m_t_tpos == 32) - m_t_tpos = m_t_offset; - - m_t_ppos = 0; - } - } - break; - - case STATE_NOISE: - for (int sampindex = 0; sampindex < buffer.samples(); sampindex++) - { - //"wavetable-LFSR" component - int wlfsr_val = ((int)noise_tbl[m_nw_tpos]) - 127;//data too wide - - m_nw_ppos++; - if (m_nw_ppos >= m_nw_period) - { - m_nw_tpos++; - if (m_nw_tpos == NOISE_SIZE) - m_nw_tpos = 0; - m_nw_ppos = 0; - } - - //mix in each of the noise's 3 pulse components - char res[3]; - for (int i = 0; i < 3; ++i) - { - res[i] = m_n_value[i] * 127; - m_n_ppos[i]++; - if (m_n_ppos[i] >= m_n_period[i]) - { - m_n_ppos[i] = 0; - m_n_value[i] = !m_n_value[i]; - } - } - //not quite, but close. - buffer.put_int(sampindex, - (wlfsr_val * m_nw_volume) | - (res[0] * m_n_volume[0]) | - (res[1] * m_n_volume[1]) | - (res[2] * m_n_volume[2]), - 32768) ; - } - break; - - default: - //fill buffer with silence - buffer.fill(0); - break; - } -} diff --git a/src/devices/sound/upd1771.h b/src/devices/sound/upd1771.h deleted file mode 100644 index 91c39ba6a41..00000000000 --- a/src/devices/sound/upd1771.h +++ /dev/null @@ -1,78 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Wilbert Pol -/********************************************************************** - - NEC uPD1771 - -**********************************************************************/ - -#ifndef MAME_SOUND_UPD1771_H -#define MAME_SOUND_UPD1771_H - - -/*************************************************************************** - MACROS / CONSTANTS -***************************************************************************/ - -class upd1771c_device : public device_t, - public device_sound_interface -{ -public: - upd1771c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - auto ack_handler() { return m_ack_handler.bind(); } - - uint8_t read(); - void write(uint8_t data); - void pcm_write(int state); - -protected: - // device-level overrides - virtual void device_start() override ATTR_COLD; - virtual void device_reset() override ATTR_COLD; - - // sound stream update overrides - virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; - -private: - static constexpr unsigned MAX_PACKET_SIZE = 0x8000; - - TIMER_CALLBACK_MEMBER(ack_callback); - - // internal state - sound_stream *m_channel; - devcb_write_line m_ack_handler; - emu_timer *m_timer; - - uint8_t m_packet[MAX_PACKET_SIZE]; - uint32_t m_index; - uint8_t m_expected_bytes; - - uint8_t m_state;//0:silence, 1 noise, 2 tone - uint8_t m_pc3; - - //tone - uint8_t m_t_timbre; //[0; 7] - uint8_t m_t_offset; //[0; 32] - uint16_t m_t_period; //[0;255] - uint8_t m_t_volume; //[0; 31] - uint8_t m_t_tpos;//timbre pos - uint16_t m_t_ppos;//period pos - - //noise wavetable LFSR - uint8_t m_nw_timbre; //[0; 7] - uint8_t m_nw_volume; //[0; 31] - uint32_t m_nw_period; - uint32_t m_nw_tpos; //timbre pos - uint32_t m_nw_ppos; //period pos - - //noise pulse components - uint8_t m_n_value[3]; //[0;1] - uint16_t m_n_volume[3]; //[0; 31] - uint32_t m_n_period[3]; - uint32_t m_n_ppos[3]; //period pos -}; - -DECLARE_DEVICE_TYPE(UPD1771C, upd1771c_device) - -#endif // MAME_SOUND_UPD1771_H diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 53455d8cc5f..d84dbd358b9 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -1463,7 +1463,7 @@ void lua_engine::initialize() machine_type["images"] = sol::property([] (running_machine &m) { return devenum<image_interface_enumerator>(m.root_device()); }); machine_type["slots"] = sol::property([](running_machine &m) { return devenum<slot_interface_enumerator>(m.root_device()); }); machine_type["phase"] = sol::property( - [](running_machine& m) + [] (running_machine const &m) -> char const * { switch (m.phase()) { @@ -1472,10 +1472,11 @@ void lua_engine::initialize() case machine_phase::RESET: return "reset"; case machine_phase::RUNNING: return "running"; case machine_phase::EXIT: return "exit"; - default: return ""; } + return nullptr; }); + auto game_driver_type = sol().registry().new_usertype<game_driver>("game_driver", sol::no_constructor); game_driver_type["name"] = sol::property([] (game_driver const &driver) { return &driver.name[0]; }); game_driver_type["description"] = sol::property([] (game_driver const &driver) { return &driver.type.fullname()[0]; }); @@ -2105,6 +2106,7 @@ void lua_engine::initialize() ui_type["options"] = sol::property([] (mame_ui_manager &m) { return static_cast<core_options *>(&m.options()); }); ui_type["line_height"] = sol::property([] (mame_ui_manager &m) { return m.get_line_height(); }); ui_type["menu_active"] = sol::property(&mame_ui_manager::is_menu_active); + ui_type["show_menu"] = &mame_ui_manager::show_menu; ui_type["ui_active"] = sol::property(&mame_ui_manager::ui_active, &mame_ui_manager::set_ui_active); ui_type["single_step"] = sol::property(&mame_ui_manager::single_step, &mame_ui_manager::set_single_step); ui_type["show_fps"] = sol::property(&mame_ui_manager::show_fps, &mame_ui_manager::set_show_fps); diff --git a/src/frontend/mame/ui/selmenu.cpp b/src/frontend/mame/ui/selmenu.cpp index 240bbd2b663..c32f04d27e6 100644 --- a/src/frontend/mame/ui/selmenu.cpp +++ b/src/frontend/mame/ui/selmenu.cpp @@ -1363,18 +1363,18 @@ bool menu_select_launch::scale_icon(bitmap_argb32 &&src, texture_and_bitmap &dst { // scale the source bitmap bitmap_argb32 tmp; - float const ratio((std::min)({ float(m_icon_height) / src.height(), float(m_icon_width) / src.width() })); - if (1.0F == ratio) - { - tmp = std::move(src); - } - else + float const ratio((std::min)(float(m_icon_height) / src.height(), float(m_icon_width) / src.width())); + if ((1.0F > ratio) || (1.2F < ratio)) { float const pix_height(std::ceil(src.height() * ratio)); float const pix_width(std::ceil(src.width() * ratio)); tmp.allocate(s32(pix_width), s32(pix_height)); render_resample_argb_bitmap_hq(tmp, src, render_color{ 1.0F, 1.0F, 1.0F, 1.0F }, true); } + else + { + tmp = std::move(src); + } // copy into the destination dst.bitmap.allocate(m_icon_width, m_icon_height); diff --git a/src/lib/formats/fs_vtech.cpp b/src/lib/formats/fs_vtech.cpp index 27e7f93a056..6b414518437 100644 --- a/src/lib/formats/fs_vtech.cpp +++ b/src/lib/formats/fs_vtech.cpp @@ -19,7 +19,7 @@ namespace fs { const vtech_image VTECH; } // Filesystem has no subdirectories. // // Track 0 sectors 0-14 have the file names. 16 bytes/entry -// offset 0 : File type 'T' (basic) or 'B' (binary) +// offset 0 : File type 'T' (basic), 'B' (binary), or some other letter (application-specific) // offset 1 : 0x3a // offset 2-9: File name // offset a : Track number of first file sector @@ -114,7 +114,9 @@ std::vector<meta_description> vtech_image::file_meta_description() const res.emplace_back(meta_description(meta_name::name, "", false, [](const meta_value &m) { return m.as_string().size() <= 8; }, "File name, 8 chars")); res.emplace_back(meta_description(meta_name::loading_address, 0x7ae9, false, [](const meta_value &m) { return m.as_number() < 0x10000; }, "Loading address of the file")); res.emplace_back(meta_description(meta_name::length, 0, true, nullptr, "Size of the file in bytes")); - res.emplace_back(meta_description(meta_name::basic, true, true, nullptr, "Basic file")); + res.emplace_back(meta_description(meta_name::file_type, "T", true, + [](const meta_value &m) { return m.as_string().size() == 1 && m.as_string()[0] >= 'A' && m.as_string()[0] <= 'Z'; }, + "File type (e.g. T = text, B = binary)")); return res; } @@ -143,9 +145,9 @@ meta_data vtech_impl::file_metadata(const u8 *entry) meta_data res; res.set(meta_name::name, trim_end_spaces(rstr(entry+2, 8))); - res.set(meta_name::basic, entry[0] == 'T'); + res.set(meta_name::file_type, std::string{ char(entry[0]) }); res.set(meta_name::loading_address, get_u16le(entry + 0xc)); - res.set(meta_name::length, ((get_u16le(entry + 0xe) - get_u16le(entry + 0xc) + 1) & 0xffff)); + res.set(meta_name::length, (get_u16le(entry + 0xe) - get_u16le(entry + 0xc)) & 0xffff); return res; } @@ -157,12 +159,12 @@ std::tuple<fsblk_t::block_t, u32> vtech_impl::file_find(std::string_view name) for(u32 i = 0; i != 8; i ++) { u32 off = i*16; u8 type = bdir.r8(off); - if(type != 'T' && type != 'B') + if(type < 'A' || type > 'Z') continue; if(bdir.r8(off+1) != ':') continue; if(trim_end_spaces(bdir.rstr(off+2, 8)) == name) { - return std::make_tuple(bdir, i); + return std::make_tuple(bdir, off); } } } @@ -187,12 +189,12 @@ err_t vtech_impl::metadata_change(const std::vector<std::string> &path, const me return ERR_NOT_FOUND; auto [bdir, off] = file_find(path[0]); - if(!off) + if(off == 0xffffffff) return ERR_NOT_FOUND; u8 *entry = bdir.data() + off; - if(meta.has(meta_name::basic)) - entry[0x0] = meta.get_flag(meta_name::basic) ? 'T' : 'B'; + if(meta.has(meta_name::file_type)) + entry[0x0] = meta.get_string(meta_name::file_type)[0]; if(meta.has(meta_name::name)) { std::string name = meta.get_string(meta_name::name); name.resize(8, ' '); @@ -224,7 +226,7 @@ std::pair<err_t, std::vector<dir_entry>> vtech_impl::directory_contents(const st for(u32 i = 0; i != 8; i ++) { u32 off = i*16; u8 type = bdir.r8(off); - if(type != 'T' && type != 'B') + if(type < 'A' || type > 'Z') continue; if(bdir.r8(off+1) != ':') continue; @@ -241,7 +243,7 @@ err_t vtech_impl::rename(const std::vector<std::string> &opath, const std::vecto return ERR_NOT_FOUND; auto [bdir, off] = file_find(opath[0]); - if(!off) + if(off == 0xffffffff) return ERR_NOT_FOUND; std::string name = npath[0]; @@ -272,13 +274,13 @@ err_t vtech_impl::file_create(const std::vector<std::string> &path, const meta_d std::string fname = meta.get_string(meta_name::name, ""); fname.resize(8, ' '); - bdir.w8 (off+0x0, meta.get_flag(meta_name::basic, true) ? 'T' : 'B'); + bdir.w8 (off+0x0, meta.get_string(meta_name::file_type, "T")[0]); bdir.w8 (off+0x1, ':'); bdir.wstr(off+0x2, fname); bdir.w8 (off+0xa, 0x00); bdir.w8 (off+0xb, 0x00); bdir.w16l(off+0xc, meta.get_number(meta_name::loading_address, 0x7ae9)); - bdir.w16l(off+0xe, bdir.r16l(off+0xc) - 1); // Size 0 initially + bdir.w16l(off+0xe, bdir.r16l(off+0xc)); // Size 0 initially return ERR_OK; } } @@ -301,7 +303,7 @@ std::pair<err_t, std::vector<u8>> vtech_impl::file_read(const std::vector<std::s u8 track = entry[0xa]; u8 sector = entry[0xb]; - int len = ((get_u16le(entry + 0xe) - get_u16le(entry + 0xc)) & 0xffff) + 1; + int len = (get_u16le(entry + 0xe) - get_u16le(entry + 0xc)) & 0xffff; data.resize(len, 0); int pos = 0; @@ -331,7 +333,7 @@ err_t vtech_impl::file_write(const std::vector<std::string> &path, const std::ve u8 *entry = bdir.data() + off; - u32 cur_len = ((get_u16le(entry + 0xe) - get_u16le(entry + 0xc) + 1) & 0xffff); + u32 cur_len = (get_u16le(entry + 0xe) - get_u16le(entry + 0xc)) & 0xffff; u32 new_len = data.size(); if(new_len > 65535) new_len = 65535; @@ -370,7 +372,7 @@ err_t vtech_impl::file_write(const std::vector<std::string> &path, const std::ve dblk.w16l(126, 0); } - u16 end_address = (get_u16le(entry + 0xc) + data.size() - 1) & 0xffff; + u16 end_address = (get_u16le(entry + 0xc) + data.size()) & 0xffff; put_u16le(entry + 0xe, end_address); if(need_ns) { entry[0xa] = blocks[0].first; diff --git a/src/lib/formats/fsmeta.cpp b/src/lib/formats/fsmeta.cpp index f3e91e706a0..3c731f21939 100644 --- a/src/lib/formats/fsmeta.cpp +++ b/src/lib/formats/fsmeta.cpp @@ -14,7 +14,6 @@ namespace fs { const char *meta_data::entry_name(meta_name name) { switch(name) { - case meta_name::basic: return "basic"; case meta_name::creation_date: return "creation_date"; case meta_name::length: return "length"; case meta_name::loading_address: return "loading_address"; diff --git a/src/lib/formats/fsmeta.h b/src/lib/formats/fsmeta.h index 0f6baf20133..ff0b505ab8b 100644 --- a/src/lib/formats/fsmeta.h +++ b/src/lib/formats/fsmeta.h @@ -21,7 +21,6 @@ namespace fs { enum class meta_name { - basic, creation_date, length, loading_address, diff --git a/src/lib/formats/vt_dsk.cpp b/src/lib/formats/vt_dsk.cpp index 00284d2bd9e..da7e450b673 100644 --- a/src/lib/formats/vt_dsk.cpp +++ b/src/lib/formats/vt_dsk.cpp @@ -224,7 +224,7 @@ const char *vtech_dsk_format::description() const noexcept const char *vtech_dsk_format::extensions() const noexcept { - return "dsk"; + return "dsk,dvz"; } int vtech_bin_format::identify(util::random_read &io, uint32_t form_factor, const std::vector<uint32_t> &variants) const diff --git a/src/mame/amiga/amiga.cpp b/src/mame/amiga/amiga.cpp index 1f607a0ca9a..d908d262b10 100644 --- a/src/mame/amiga/amiga.cpp +++ b/src/mame/amiga/amiga.cpp @@ -1704,6 +1704,7 @@ void amiga_state::amiga_base(machine_config &config) SOFTWARE_LIST(config, "flop_list").set_original("amiga_flop"); SOFTWARE_LIST(config, "ocs_list").set_original("amigaocs_flop"); SOFTWARE_LIST(config, "demos_list").set_original("amiga_demos"); + SOFTWARE_LIST(config, "amigacd_list").set_original("amiga_cd"); } void a1000_state::a1000(machine_config &config) @@ -2239,7 +2240,7 @@ void cd32_state::cd32(machine_config &config) m_cia_0->sp_wr_callback().set_nop(); SOFTWARE_LIST(config, "cd32_list").set_original("cd32"); - SOFTWARE_LIST(config, "cd_list").set_original("cdtv"); + SOFTWARE_LIST(config, "cd_list").set_compatible("cdtv"); } void cd32_state::cd32n(machine_config &config) diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp index 6f5c074bb53..68a6336e659 100644 --- a/src/mame/amiga/amiga_m.cpp +++ b/src/mame/amiga/amiga_m.cpp @@ -919,7 +919,8 @@ void amiga_state::blitter_setup() /* is there another blitting in progress? */ if (CUSTOM_REG(REG_DMACON) & 0x4000) { - logerror("%s - This program is playing tricks with the blitter\n", machine().describe_context() ); + popmessage("In-flight blitter_setup() call, ignored"); + //logerror("%s - This program is playing tricks with the blitter\n", machine().describe_context() ); return; } @@ -1285,7 +1286,7 @@ void amiga_state::bplcon0_w(u16 data) if ((data & (BPLCON0_BPU0 | BPLCON0_BPU1 | BPLCON0_BPU2)) == (BPLCON0_BPU0 | BPLCON0_BPU1 | BPLCON0_BPU2)) { /* planes go from 0 to 6, inclusive */ - popmessage( "bplcon0_w: setting up planes > 6, %04x", data ); + popmessage( "bplcon0_w: setting up planes > 6, %04x (bug if not AGA SW)", data ); data &= ~BPLCON0_BPU0; } CUSTOM_REG(REG_BPLCON0) = data; @@ -1387,7 +1388,8 @@ uint16_t amiga_state::custom_chip_r(offs_t offset) return m_fdc->adkcon_r(); case REG_DSKDATR: - popmessage("DSKDAT R"); + if (!machine().side_effects_disabled()) + popmessage("DSKDAT R"); break; } @@ -1411,7 +1413,9 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data) return; case REG_DSKDAT: - popmessage("DSKDAT W %04x",data); + // WHDLoad inits with a 0 here, not enough for actual use case. + if (data) + popmessage("DSKDAT W %04x",data); break; case REG_DSKSYNC: diff --git a/src/mame/apple/apple2video.cpp b/src/mame/apple/apple2video.cpp index c3a735b17ab..8f9ee6c67bd 100644 --- a/src/mame/apple/apple2video.cpp +++ b/src/mame/apple/apple2video.cpp @@ -971,7 +971,7 @@ uint32_t a2_video_device::screen_update(screen_device &screen, bitmap_ind16 &bit if (m_hires) { - if ((Model == model::IIE || Model == model::IIGS) && m_dhires && m_80col) + if ((Model == model::IIE || Model == model::IIGS) && m_dhires && m_80col && m_aux_ptr) { dhgr_update(screen, bitmap, cliprect, 0, text_start_row - 1); } @@ -982,7 +982,7 @@ uint32_t a2_video_device::screen_update(screen_device &screen, bitmap_ind16 &bit } else // lo-res { - if ((Model == model::IIE || Model == model::IIGS) && m_dhires && m_80col) + if ((Model == model::IIE || Model == model::IIGS) && m_dhires && m_80col && m_aux_ptr) { lores_update<true>(screen, bitmap, cliprect, 0, text_start_row - 1); } diff --git a/src/mame/apple/cuda.cpp b/src/mame/apple/cuda.cpp index 6d2d21ba29a..54835ecaed5 100644 --- a/src/mame/apple/cuda.cpp +++ b/src/mame/apple/cuda.cpp @@ -86,6 +86,7 @@ void cuda_device::device_add_mconfig(machine_config &config) m_maincpu->write_p<1>().set(FUNC(cuda_device::pb_w)); m_maincpu->write_p<2>().set(FUNC(cuda_device::pc_w)); m_maincpu->set_pullups<1>(0xc0); // pull-ups on port B bits 6 & 7 (DFAC/I2C SDA & SCL) + m_maincpu->set_pullups<2>(0x04); // pull-up on port C bit 2 (NMI) } const tiny_rom_entry *cuda_device::device_rom_region() const @@ -101,6 +102,7 @@ cuda_device::cuda_device(const machine_config &mconfig, device_type type, const : device_t(mconfig, type, tag, owner, clock), device_nvram_interface(mconfig, *this), write_reset(*this), + write_nmi(*this), write_linechange(*this), write_via_clock(*this), write_via_data(*this), @@ -110,8 +112,8 @@ cuda_device::cuda_device(const machine_config &mconfig, device_type type, const m_maincpu(*this, "cudamcu"), m_default_nvram(*this, "defaultnv"), m_treq(0), m_byteack(0), m_tip(0), m_via_data(0), m_last_adb(0), - m_iic_sda(0), m_last_adb_time(0), m_cuda_controls_power(false), m_adb_in(false), - m_reset_line(0), m_adb_dtime(0), m_pram_loaded(false) + m_iic_sda(1), m_last_adb_time(0), m_cuda_controls_power(false), m_adb_in(false), m_adb_power(false), + m_reset_line(0), m_nmi_line(0), m_adb_dtime(0), m_pram_loaded(false) { std::fill(std::begin(m_disk_pram), std::end(m_disk_pram), 0); } @@ -124,6 +126,7 @@ void cuda_device::device_start() save_item(NAME(m_via_data)); save_item(NAME(m_adb_in)); save_item(NAME(m_reset_line)); + save_item(NAME(m_nmi_line)); save_item(NAME(m_adb_dtime)); save_item(NAME(m_pram_loaded)); save_item(NAME(m_disk_pram)); @@ -196,7 +199,7 @@ void cuda_device::pb_w(u8 data) void cuda_device::pc_w(u8 data) { - if ((data & 8) != m_reset_line) + if (BIT(data, 3) != m_reset_line) { LOGMASKED(LOG_HOSTCOMM, "680x0 reset: %d -> %d (PC=%x)\n", m_reset_line, BIT(data, 3), m_maincpu->pc()); // falling edge, should reset the machine too @@ -246,6 +249,12 @@ void cuda_device::pc_w(u8 data) } } } + + if ((!BIT(data, 2)) != m_nmi_line) + { + m_nmi_line = !BIT(data, 2); + write_nmi(m_nmi_line); + } } u8 cuda_device::pa_r() @@ -261,10 +270,8 @@ u8 cuda_device::pa_r() rv = 0x02 | 0x01; // pull-up + PFW } - if (m_adb_in) - { - rv |= 0x40; - } + rv |= (m_adb_in) ? 0x40 : 0; + rv |= (m_adb_power) ? 0 : 0x04; return rv; } diff --git a/src/mame/apple/cuda.h b/src/mame/apple/cuda.h index 43f9368f87c..1a37011659e 100644 --- a/src/mame/apple/cuda.h +++ b/src/mame/apple/cuda.h @@ -30,13 +30,15 @@ public: void set_byteack(u8 val) { m_byteack = val; } u8 get_via_data() { return m_via_data; } void set_via_data(u8 dat) { m_via_data = dat; } - void set_adb_line(int linestate) { m_adb_in = (linestate == ASSERT_LINE) ? true : false; } + void set_adb_line(int linestate) { m_adb_in = (linestate == ASSERT_LINE); } + void set_adb_power(int linestate) { m_adb_power = (linestate == ASSERT_LINE); } void set_iic_sda(u8 data) { m_iic_sda = (data & 1); } int get_adb_dtime() { return m_adb_dtime; } int rom_offset; auto reset_callback() { return write_reset.bind(); } + auto nmi_callback() { return write_nmi.bind(); } auto linechange_callback() { return write_linechange.bind(); } auto via_clock_callback() { return write_via_clock.bind(); } auto via_data_callback() { return write_via_data.bind(); } @@ -44,7 +46,7 @@ public: auto iic_sda_callback() { return write_iic_sda.bind(); } auto dfac_latch_callback() { return write_dfac_latch.bind(); } - devcb_write_line write_reset, write_linechange, write_via_clock, write_via_data; + devcb_write_line write_reset, write_nmi, write_linechange, write_via_clock, write_via_data; devcb_write_line write_iic_scl, write_iic_sda, write_dfac_latch; protected: @@ -70,7 +72,8 @@ private: u64 m_last_adb_time; bool m_cuda_controls_power; bool m_adb_in; - s32 m_reset_line; + bool m_adb_power; + s32 m_reset_line, m_nmi_line; s32 m_adb_dtime; u8 m_disk_pram[0x100]{}; bool m_pram_loaded; diff --git a/src/mame/apple/maclc.cpp b/src/mame/apple/maclc.cpp index 754c1b3a849..1e2717a6758 100644 --- a/src/mame/apple/maclc.cpp +++ b/src/mame/apple/maclc.cpp @@ -480,7 +480,9 @@ void maclc_state::maccclas(machine_config &config) m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w)); m_cuda->via_clock_callback().set(m_v8, FUNC(v8_device::cb1_w)); m_cuda->via_data_callback().set(m_v8, FUNC(v8_device::cb2_w)); + m_cuda->nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7); m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + m_macadb->adb_power_callback().set(m_cuda, FUNC(cuda_device::set_adb_power)); config.set_perfect_quantum(m_maincpu); SPICE(config.replace(), m_v8, C15M); @@ -518,12 +520,14 @@ void maclc_state::mactv(machine_config &config) config.device_remove("fdc"); CUDA_V2XX(config, m_cuda, XTAL(32'768)); - m_cuda->set_default_bios_tag("341s0788"); // TODO: 0789 freezes during boot, possible VIA bug or 6522/6523 difference? + m_cuda->set_default_bios_tag("341s0789"); m_cuda->reset_callback().set(FUNC(maclc_state::egret_reset_w)); m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w)); m_cuda->via_clock_callback().set(m_v8, FUNC(v8_device::cb1_w)); m_cuda->via_data_callback().set(m_v8, FUNC(v8_device::cb2_w)); + m_cuda->nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7); m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + m_macadb->adb_power_callback().set(m_cuda, FUNC(cuda_device::set_adb_power)); config.set_perfect_quantum(m_maincpu); TINKERBELL(config.replace(), m_v8, C15M); diff --git a/src/mame/apple/maclc3.cpp b/src/mame/apple/maclc3.cpp index 077e8eb8c10..2c28aaebcae 100644 --- a/src/mame/apple/maclc3.cpp +++ b/src/mame/apple/maclc3.cpp @@ -263,7 +263,7 @@ void macvail_state::maclc3_base(machine_config &config) m_ram->set_extra_options("8M,16M,32M,48M,64M,80M"); NSCSI_BUS(config, "scsi"); - NSCSI_CONNECTOR(config, "scsi:0", mac_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:0", mac_scsi_devices, "harddisk"); NSCSI_CONNECTOR(config, "scsi:1", mac_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:2", mac_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:3").option_set("cdrom", NSCSI_CDROM_APPLE).machine_config( @@ -274,7 +274,7 @@ void macvail_state::maclc3_base(machine_config &config) }); NSCSI_CONNECTOR(config, "scsi:4", mac_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:5", mac_scsi_devices, nullptr); - NSCSI_CONNECTOR(config, "scsi:6", mac_scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsi:6", mac_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi:7").option_set("ncr5380", NCR53C80).machine_config([this](device_t *device) { ncr53c80_device &adapter = downcast<ncr53c80_device &>(*device); @@ -384,7 +384,9 @@ void macvail_state::maclc520(machine_config &config) m_cuda->iic_scl_callback().set(m_omega, FUNC(omega_device::clock_write)); m_cuda->iic_sda_callback().set(m_omega, FUNC(omega_device::data_write)); m_cuda->dfac_latch_callback().set(m_omega, FUNC(omega_device::latch_write)); + m_cuda->nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7); m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + m_macadb->adb_power_callback().set(m_cuda, FUNC(cuda_device::set_adb_power)); config.set_perfect_quantum(m_maincpu); m_sonora->pb3_callback().set(m_cuda, FUNC(cuda_device::get_treq)); diff --git a/src/mame/apple/macquadra605.cpp b/src/mame/apple/macquadra605.cpp index a59db98ea16..ca036edaeaa 100644 --- a/src/mame/apple/macquadra605.cpp +++ b/src/mame/apple/macquadra605.cpp @@ -213,7 +213,9 @@ void quadra605_state::macqd605(machine_config &config) m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w)); m_cuda->via_clock_callback().set(m_primetime, FUNC(primetime_device::cb1_w)); m_cuda->via_data_callback().set(m_primetime, FUNC(primetime_device::cb2_w)); + m_cuda->nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7); m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + m_macadb->adb_power_callback().set(m_cuda, FUNC(cuda_device::set_adb_power)); config.set_perfect_quantum(m_maincpu); m_primetime->pb3_callback().set(m_cuda, FUNC(cuda_device::get_treq)); diff --git a/src/mame/apple/macquadra630.cpp b/src/mame/apple/macquadra630.cpp index a04a559c05a..a14662bebde 100644 --- a/src/mame/apple/macquadra630.cpp +++ b/src/mame/apple/macquadra630.cpp @@ -176,7 +176,9 @@ void quadra630_state::macqd630(machine_config &config) m_cuda->linechange_callback().set(m_macadb, FUNC(macadb_device::adb_linechange_w)); m_cuda->via_clock_callback().set(m_primetimeii, FUNC(primetime_device::cb1_w)); m_cuda->via_data_callback().set(m_primetimeii, FUNC(primetime_device::cb2_w)); + m_cuda->nmi_callback().set_inputline(m_maincpu, M68K_IRQ_7); m_macadb->adb_data_callback().set(m_cuda, FUNC(cuda_device::set_adb_line)); + m_macadb->adb_power_callback().set(m_cuda, FUNC(cuda_device::set_adb_power)); config.set_perfect_quantum(m_maincpu); input_merger_device &sda_merger(INPUT_MERGER_ALL_HIGH(config, "sda")); diff --git a/src/mame/atari/atarig1.h b/src/mame/atari/atarig1.h index c9e5df83bae..43a8b627ea0 100644 --- a/src/mame/atari/atarig1.h +++ b/src/mame/atari/atarig1.h @@ -18,17 +18,18 @@ class atarig1_state : public atarigen_state { public: - atarig1_state(const machine_config &mconfig, device_type type, const char *tag) - : atarigen_state(mconfig, type, tag), - m_slapstic(*this, "slapstic"), - m_slapstic_bank(*this, "slapstic_bank"), - m_jsa(*this, "jsa"), - m_playfield_tilemap(*this, "playfield"), - m_alpha_tilemap(*this, "alpha"), - m_rle(*this, "rle"), - m_adc(*this, "adc"), - m_in1(*this, "IN1"), - m_mo_command(*this, "mo_command") { } + atarig1_state(const machine_config &mconfig, device_type type, const char *tag) : + atarigen_state(mconfig, type, tag), + m_slapstic(*this, "slapstic"), + m_slapstic_bank(*this, "slapstic_bank"), + m_jsa(*this, "jsa"), + m_playfield_tilemap(*this, "playfield"), + m_alpha_tilemap(*this, "alpha"), + m_rle(*this, "rle"), + m_adc(*this, "adc"), + m_in1(*this, "IN1"), + m_mo_command(*this, "mo_command") + { } void atarig1(machine_config &config); void pfslap111(machine_config &config); @@ -64,11 +65,11 @@ private: bool m_bslapstic_primed = false; - uint8_t m_pfscroll_xoffset = 0; - uint16_t m_current_control = 0; - uint8_t m_playfield_tile_bank = 0; - uint16_t m_playfield_xscroll = 0; - uint16_t m_playfield_yscroll = 0; + uint8_t m_pfscroll_xoffset = 0; + uint16_t m_current_control = 0; + uint8_t m_playfield_tile_bank = 0; + uint16_t m_playfield_xscroll = 0; + uint16_t m_playfield_yscroll = 0; void video_int_ack_w(uint16_t data = 0); TIMER_DEVICE_CALLBACK_MEMBER(scanline_update); diff --git a/src/mame/atari/flyball.cpp b/src/mame/atari/flyball.cpp index 70aa8ea5993..c334896ea2c 100644 --- a/src/mame/atari/flyball.cpp +++ b/src/mame/atari/flyball.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Stefan Jokisch, Ivan Vangelista, Ryan Holtz +// copyright-holders:Stefan Jokisch, Ryan Holtz /*************************************************************************** Atari Flyball Driver diff --git a/src/mame/atari/nl_flyball.cpp b/src/mame/atari/nl_flyball.cpp index 416f55ca205..86e020ba3aa 100644 --- a/src/mame/atari/nl_flyball.cpp +++ b/src/mame/atari/nl_flyball.cpp @@ -1,5 +1,5 @@ // license:CC0-1.0 -// copyright-holders:Ryan Holtz, Ivan Vangelista +// copyright-holders:Ryan Holtz // // Netlist for Atari's Flyball // diff --git a/src/mame/atari/nl_flyball.h b/src/mame/atari/nl_flyball.h index 816bb44852d..a3dbd4d82ab 100644 --- a/src/mame/atari/nl_flyball.h +++ b/src/mame/atari/nl_flyball.h @@ -1,5 +1,5 @@ // license:CC0-1.0 -// copyright-holders:Ivan Vangelista, Ryan Holtz +// copyright-holders:Ryan Holtz #ifndef MAME_ATARI_NL_FLYBALL_H #define MAME_ATARI_NL_FLYBALL_H diff --git a/src/mame/bandai/tamag1.cpp b/src/mame/bandai/tamag1.cpp deleted file mode 100644 index 36e9f7c47a1..00000000000 --- a/src/mame/bandai/tamag1.cpp +++ /dev/null @@ -1,173 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:hap -// thanks-to:digshadow, Segher -/******************************************************************************* - -Bandai Tamagotchi generation 1 hardware - -Hardware notes: -- PCB label: TMG-M1 -- Seiko Epson E0C6S46 MCU under epoxy -- 32*16 LCD screen + 8 custom segments -- 1-bit sound - -TODO: -- change to SVG screen -- add the Mothra version that was recently dumped (has a E0C6S48) - -*******************************************************************************/ - -#include "emu.h" - -#include "cpu/e0c6200/e0c6s46.h" -#include "sound/spkrdev.h" - -#include "emupal.h" -#include "screen.h" -#include "speaker.h" - -#include "tama.lh" - - -namespace { - -class tamag1_state : public driver_device -{ -public: - tamag1_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_out_x(*this, "%u.%u", 0U, 0U) - { } - - void tama(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(input_changed); - -protected: - virtual void machine_start() override ATTR_COLD; - -private: - void tama_palette(palette_device &palette) const; - E0C6S46_PIXEL_UPDATE(pixel_update); - - required_device<e0c6s46_device> m_maincpu; - output_finder<16, 40> m_out_x; -}; - -void tamag1_state::machine_start() -{ - m_out_x.resolve(); -} - - - -/******************************************************************************* - Video -*******************************************************************************/ - -E0C6S46_PIXEL_UPDATE(tamag1_state::pixel_update) -{ - // 16 COM(common) pins, 40 SEG(segment) pins from MCU, 32x16 LCD screen: - static const int seg2x[0x28] = - { - 0, 1, 2, 3, 4, 5, 6, 7, - 35,8, 9, 10,11,12,13,14, - 15,34,33,32,31,30,29,28, - 27,26,25,24,36,23,22,21, - 20,19,18,17,16,37,38,39 - }; - - int y = com, x = seg2x[seg]; - if (cliprect.contains(x, y)) - bitmap.pix(y, x) = state; - - // 2 rows of indicators: - // above screen: 0:meal, 1:lamp, 2:play, 3:medicine - // under screen: 4:bath, 5:scales, 6:shout, 7:attention - // they are on pin SEG8(x=35) + COM0-3, pin SEG28(x=36) + COM12-15 - - // output to y.x - m_out_x[y][x] = state; -} - -void tamag1_state::tama_palette(palette_device &palette) const -{ - palette.set_pen_color(0, rgb_t(0xf1, 0xf0, 0xf9)); // background - palette.set_pen_color(1, rgb_t(0x3c, 0x38, 0x38)); // lcd pixel -} - - - -/******************************************************************************* - Input Ports -*******************************************************************************/ - -INPUT_CHANGED_MEMBER(tamag1_state::input_changed) -{ - // inputs are hooked up backwards here, because MCU input ports are all tied to its interrupt controller - m_maincpu->set_input_line(param, newval ? ASSERT_LINE : CLEAR_LINE); -} - -static INPUT_PORTS_START( tama ) - PORT_START("K0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(tamag1_state::input_changed), E0C6S46_LINE_K00) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(tamag1_state::input_changed), E0C6S46_LINE_K01) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(tamag1_state::input_changed), E0C6S46_LINE_K02) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) -INPUT_PORTS_END - - - -/******************************************************************************* - Machine Configs -*******************************************************************************/ - -void tamag1_state::tama(machine_config &config) -{ - // basic machine hardware - E0C6S46(config, m_maincpu, 32.768_kHz_XTAL); - m_maincpu->set_pixel_update_cb(FUNC(tamag1_state::pixel_update)); - m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); - - // video hardware - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(32.768_kHz_XTAL/1024); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - screen.set_size(40, 16); - screen.set_visarea(0, 32-1, 0, 16-1); - screen.set_screen_update("maincpu", FUNC(e0c6s46_device::screen_update)); - screen.set_palette("palette"); - config.set_default_layout(layout_tama); - - PALETTE(config, "palette", FUNC(tamag1_state::tama_palette), 2); - - // sound hardware - SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); -} - - - -/******************************************************************************* - ROM Definitions -*******************************************************************************/ - -ROM_START( tama ) - ROM_REGION( 0x3000, "maincpu", 0 ) - ROM_LOAD( "tama.bin", 0x0000, 0x3000, CRC(5c864cb1) SHA1(4b4979cf92dc9d2fb6d7295a38f209f3da144f72) ) - - ROM_REGION( 0x3000, "maincpu:test", 0 ) - ROM_LOAD( "test.bin", 0x0000, 0x3000, CRC(4372220e) SHA1(6e13d015113e16198c0059b9d0c38d7027ae7324) ) // this rom is on the die too, test pin enables it? -ROM_END - -} // anonymous namespace - - - -/******************************************************************************* - Drivers -*******************************************************************************/ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -SYST( 1997, tama, 0, 0, tama, tama, tamag1_state, empty_init, "Bandai", "Tamagotchi (USA)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/casio/pickytlk.cpp b/src/mame/casio/pickytlk.cpp index bced0df7fb0..508b82cc636 100644 --- a/src/mame/casio/pickytlk.cpp +++ b/src/mame/casio/pickytlk.cpp @@ -65,21 +65,6 @@ namespace { class pickytlk_base_state : public driver_device { public: - pickytlk_base_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_display_ram(*this, "display_ram") - , m_maincpu(*this, "maincpu") - , m_io_buttons(*this, "BUTTONS") - , m_io_pen_x(*this, "PEN_X") - , m_io_pen_y(*this, "PEN_Y") - , m_io_pen_y_rescale(*this, "PEN_Y_RESCALE") - , m_ko(0) - , m_port(0) - , m_opt(0) - { } - - void pickytlk(machine_config &config); - DECLARE_CROSSHAIR_MAPPER_MEMBER(pen_y_mapper); ioport_value pen_y_rescale_r(); ioport_value pen_target_r(); @@ -98,9 +83,24 @@ protected: PEN_HOLD = 2, }; + pickytlk_base_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_display_ram(*this, "display_ram") + , m_maincpu(*this, "maincpu") + , m_io_buttons(*this, "BUTTONS") + , m_io_pen_x(*this, "PEN_X") + , m_io_pen_y(*this, "PEN_Y") + , m_io_pen_y_rescale(*this, "PEN_Y_RESCALE") + , m_ko(0) + , m_port(0) + , m_opt(0) + { } + virtual void machine_start() override ATTR_COLD; virtual void machine_reset() override ATTR_COLD; + void pickytlk(machine_config &config) ATTR_COLD; + void kol_w(u8 data); void koh_w(u8 data); void port_w(u8 data); @@ -112,10 +112,9 @@ protected: TIMER_CALLBACK_MEMBER(io_timer_tick); u8 io_pen_x_read(); u8 io_pen_y_read(); - virtual u8 tablet_read(offs_t offset); + virtual u8 tablet_read(offs_t offset) = 0; void tablet_write(offs_t offset, u8 data); - virtual void pickytlk_layout(machine_config &config); void update_crosshair(screen_device &screen); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -231,12 +230,6 @@ u8 pickytlk_base_state::io_pen_y_read() : rescale(io_pen_y_pos, io_pen_y_min, io_pen_y_max, 0xa0, 0xf0); } -u8 pickytlk_base_state::tablet_read(offs_t offset) -{ - // Default (overriden by each system) - return 0; -} - void pickytlk_base_state::tablet_write(offs_t offset, u8 data) { LOGMASKED(LOG_TABLET, "%s: tablet_write [%02x] = %02x\n", machine().describe_context(), offset, data); @@ -286,7 +279,7 @@ u8 pickytlk_base_state::ki_r() m_io_timer->reset(attotime::never); } - return m_pen_state == PEN_PRESS ? 0x80 : 0; + return (m_pen_state == PEN_PRESS) ? 0x80 : 0; } u8 pickytlk_base_state::in0_r() @@ -303,12 +296,7 @@ u8 pickytlk_base_state::in0_r() u8 pickytlk_base_state::input_flag_read() { - return m_pen_state == PEN_PRESS || m_pen_state == PEN_HOLD ? 0 : 1; -} - -void pickytlk_base_state::pickytlk_layout(machine_config &config) -{ - // Nothing (overriden by each system) + return (m_pen_state == PEN_PRESS || m_pen_state == PEN_HOLD) ? 0 : 1; } void pickytlk_base_state::update_crosshair(screen_device &screen) @@ -384,8 +372,6 @@ void pickytlk_base_state::pickytlk(machine_config &config) screen.set_visarea(0, 126, 0, 63); screen.set_screen_update(FUNC(pickytlk_base_state::screen_update)); screen.set_palette("palette"); - - pickytlk_layout(config); } @@ -396,20 +382,14 @@ public: : pickytlk_base_state(mconfig, type, tag) { } - void pickytlk_monocolor(machine_config &config); + void pickytlk_monocolor(machine_config &config) ATTR_COLD; private: virtual u8 tablet_read(offs_t offset) override; - virtual void pickytlk_layout(machine_config &config) override; - void pickytlk_mem(address_map &map); - void pickytlk_palette(palette_device &palette) const; + void pickytlk_mem(address_map &map) ATTR_COLD; + void pickytlk_palette(palette_device &palette) const ATTR_COLD; }; -void pickytlk_monocolor_state::pickytlk_layout(machine_config &config) -{ - config.set_default_layout(layout_pickytlk); -} - u8 pickytlk_monocolor_state::tablet_read(offs_t offset) { LOGMASKED(LOG_TABLET, "%s: tablet_read [%02x] = %02x\n", machine().describe_context(), offset, m_io_tablet_regs[offset]); @@ -460,6 +440,8 @@ void pickytlk_monocolor_state::pickytlk_monocolor(machine_config &config) // TODO: Verify palette. Colors can be changed by changing the contrast. PALETTE(config, "palette", FUNC(pickytlk_monocolor_state::pickytlk_palette), 4); + + config.set_default_layout(layout_pickytlk); } @@ -470,20 +452,15 @@ public: : pickytlk_base_state(mconfig, type, tag) { } - void pickytlk_multicolor(machine_config &config); + void plets(machine_config &config) ATTR_COLD; + void pickytlk_multicolor(machine_config &config) ATTR_COLD; private: virtual u8 tablet_read(offs_t offset) override; - virtual void pickytlk_layout(machine_config &config) override; - void pickytlk_mem(address_map &map); - void pickytlk_palette(palette_device &palette) const; + void pickytlk_mem(address_map &map) ATTR_COLD; + void pickytlk_palette(palette_device &palette) const ATTR_COLD; }; -void pickytlk_multicolor_state::pickytlk_layout(machine_config &config) -{ - config.set_default_layout(layout_pickytlk); -} - u8 pickytlk_multicolor_state::tablet_read(offs_t offset) { /* @@ -545,7 +522,7 @@ void pickytlk_multicolor_state::pickytlk_palette(palette_device &palette) const palette.set_pen_color(3, 0xee, 0x77, 0x33); } -void pickytlk_multicolor_state::pickytlk_multicolor(machine_config &config) +void pickytlk_multicolor_state::plets(machine_config &config) { pickytlk_base_state::pickytlk(config); @@ -555,21 +532,11 @@ void pickytlk_multicolor_state::pickytlk_multicolor(machine_config &config) PALETTE(config, "palette", FUNC(pickytlk_multicolor_state::pickytlk_palette), 4); } - -class plets_state : public pickytlk_multicolor_state +void pickytlk_multicolor_state::pickytlk_multicolor(machine_config &config) { -public: - plets_state(const machine_config &mconfig, device_type type, const char *tag) - : pickytlk_multicolor_state(mconfig, type, tag) - { } + plets(config); -private: - virtual void pickytlk_layout(machine_config &config) override; -}; - -void plets_state::pickytlk_layout(machine_config &config) -{ - // Nothing + config.set_default_layout(layout_pickytlk); } @@ -617,14 +584,14 @@ ROM_START(pickytlk) ROM_LOAD("d23c8000xgx-c64.lsi5", 0x00000, 0x100000, CRC(6ed6feae) SHA1(f9a63db3d048da0954cab052690deb01ec384b22)) ROM_END -ROM_START(mk300) +ROM_START(plets300) CPU_ROM_MULTICOLOR ROM_REGION(0x100000, "mask_rom", 0) ROM_LOAD("d23c8000xgx-c77.lsi5", 0x00000, 0x100000, CRC(50ecb853) SHA1(5f2564ccb6ff7e0e5a21064ca32626f35dc81506)) ROM_END -ROM_START(mk350) +ROM_START(plets350) CPU_ROM_MULTICOLOR ROM_REGION(0x100000, "mask_rom", 0) @@ -650,7 +617,7 @@ COMP(1997?, jd368, 0, 0, pickytlk_multicolor, pickytlk, pickytlk_multicolor_stat COMP(1998, pickytlk, 0, 0, pickytlk_multicolor, pickytlk, pickytlk_multicolor_state, empty_init, "Casio", "Super Picky Talk - Forest of Gurutan", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // Release date 1999-09 from "Casio Game Perfect Catalogue" -COMP(1999, mk300, 0, 0, pickytlk_multicolor, pickytlk, plets_state, empty_init, "Casio", "Plet's (MK-300)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP(1999, plets300, 0, 0, plets, pickytlk, pickytlk_multicolor_state, empty_init, "Casio", "Plet's (MK-300)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // ROM date 0019K7001 -COMP(2000?, mk350, 0, 0, pickytlk_multicolor, pickytlk, plets_state, empty_init, "Casio", "Plet's (MK-350)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +COMP(2000?, plets350, 0, 0, plets, pickytlk, pickytlk_multicolor_state, empty_init, "Casio", "Plet's (MK-350)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) diff --git a/src/mame/dynax/ddenlovr.cpp b/src/mame/dynax/ddenlovr.cpp index 81b897701ed..4c15de497c4 100644 --- a/src/mame/dynax/ddenlovr.cpp +++ b/src/mame/dynax/ddenlovr.cpp @@ -124,6 +124,8 @@ Notes: #include "emu.h" #include "dynax.h" +#include "mjdipsw.h" + #include "mahjong.h" #include "cpu/m68000/m68000.h" @@ -588,6 +590,7 @@ public: void daimyojn(machine_config &config); void kotbinyo(machine_config &config); void daireach(machine_config &config); + void hnrose(machine_config &config); void init_momotaro(); @@ -628,6 +631,7 @@ private: uint8_t momotaro_protection_r(); uint8_t jongteia_protection_r(); uint8_t daireach_protection_r(); + uint8_t hnrose_protection_r(); void daimyojn_palette_sel_w(uint8_t data); void daimyojn_blitter_data_palette_w(uint8_t data); uint8_t daimyojn_year_hack_r(offs_t offset); @@ -643,6 +647,7 @@ private: void daireach_portmap(address_map &map) ATTR_COLD; void hanakanz_portmap(address_map &map) ATTR_COLD; void hkagerou_portmap(address_map &map) ATTR_COLD; + void hnrose_portmap(address_map &map) ATTR_COLD; void jongtei_portmap(address_map &map) ATTR_COLD; void jongteia_portmap(address_map &map) ATTR_COLD; void kotbinsp_portmap(address_map &map) ATTR_COLD; @@ -4685,6 +4690,46 @@ void hanakanz_state::daireach_portmap(address_map &map) map(0x7e, 0x7e).w(FUNC(hanakanz_state::seljan2_palette_enab_w)); // writes: 1 = palette RAM at b000, 0 = ROM } +/*************************************************************************** + Hana Night Rose +***************************************************************************/ + +// 29EE: D4 ED 76 C9 CB +// 29F3: 4D 74 EF 50 52 + +uint8_t hanakanz_state::hnrose_protection_r() +{ + switch (m_prot_val) + { + case 0xd4: return 0x4d; + case 0xed: return 0x74; + case 0x76: return 0xef; + case 0xc9: return 0x50; + case 0xcb: return 0x52; + } + return 0xff; +} + + +void hanakanz_state::hnrose_portmap(address_map &map) +{ + map.global_mask(0xff); + map(0x40, 0x40).w(FUNC(hanakanz_state::daimyojn_blitter_data_palette_w)); + map(0x42, 0x44).r(FUNC(hanakanz_state::hanakanz_gfxrom_r)); + map(0x60, 0x61).w("ym2413", FUNC(ym2413_device::write)); + map(0x62, 0x62).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x68, 0x68).portr("SYSTEM"); + map(0x6a, 0x6a).r(FUNC(hanakanz_state::daimyojn_keyb1_r)); + map(0x6c, 0x6c).r(FUNC(hanakanz_state::daimyojn_keyb2_r)); + map(0x6e, 0x6e).w(FUNC(hanakanz_state::hanakanz_coincounter_w)); + map(0x70, 0x70).w(FUNC(hanakanz_state::mjmyster_rambank_w)); + map(0x80, 0x8f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write)); + map(0x8a, 0x8b).r(FUNC(hanakanz_state::daimyojn_year_hack_r)); // ? + map(0xa0, 0xa0).r(FUNC(hanakanz_state::hanakanz_rand_r)); + map(0xb0, 0xb0).rw(FUNC(hanakanz_state::hnrose_protection_r), FUNC(hanakanz_state::daimyojn_protection_w)); + map(0xc0, 0xc0).w(FUNC(hanakanz_state::mjflove_rombank_w)); +} + static INPUT_PORTS_START( ddenlovj ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) @@ -9940,6 +9985,12 @@ void hanakanz_state::daimyojn(machine_config &config) MSM6242(config, "rtc", XTAL(32'768)).out_int_handler().set("maincpu:kp69", FUNC(kp69_device::ir_w<1>)); } +void hanakanz_state::hnrose(machine_config &config) +{ + daimyojn(config); + + m_maincpu->set_addrmap(AS_IO, &hanakanz_state::hnrose_portmap); +} /*************************************************************************** @@ -12370,6 +12421,56 @@ ROM_START( htengoku ) ROM_LOAD( "6510.11b", 0x280000, 0x20000, CRC(0fdd6edf) SHA1(c6870ab538987110337e6e154cba98391c68fb98) ) ROM_END +/*************************************************************************** + +Mahjong Tenho + +Techno-Top, Limited + +TTL.0302 sticker + +Has 4 banks of 10 DIP switches + +***************************************************************************/ + +ROM_START( mjtenho ) + ROM_REGION( 0x80000, "maincpu", 0 ) // Z80 Code + ROM_LOAD( "p016021.6b", 0x00000, 0x80000, CRC(8acd16f1) SHA1(07120be1da0d72aea9f9499673d4e3bd99c291ba) ) + + ROM_REGION( 0x400000, "blitter", 0 ) + ROM_LOAD( "t01063.7b", 0x000000, 0x200000, CRC(ead305a8) SHA1(a794fa7ed31c5f33538eba1d7f1bb4aa367ce55c) ) + ROM_LOAD( "t01064.8b", 0x200000, 0x200000, CRC(9d3240d8) SHA1(71fa31732300d60dedaa5d98c846e83b6130ce60) ) + + ROM_REGION( 0x80000, "oki", 0 ) // samples + ROM_LOAD( "t01601.2b", 0x00000, 0x80000, CRC(e5678713) SHA1(e5442111b3306869dba13a2b0a0085effc55b52a) ) +ROM_END + +/*************************************************************************** + +Hana Night Rose + +Techno-Top, Limited + +TTL.1001 and TSM008-0008 stickers + +Has 4 banks of 10 DIP switches + +***************************************************************************/ + +ROM_START( hnrose ) + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD( "00802a4.6b", 0x00000, 0x80000, CRC(f08f7d21) SHA1(e47a10c1ec0544ec5457d4bd5e0d080a515ddc6a) ) + + ROM_REGION( 0x800000, "blitter", 0 ) + ROM_LOAD( "00803.7b", 0x000000, 0x200000, CRC(93060501) SHA1(908d63b0ac81a23a3b972916e313c0f9f0f74d6e) ) + ROM_LOAD( "00804.8b", 0x200000, 0x200000, CRC(7deb12ab) SHA1(a021c02071820bed4c3f2cb158ed12f9c2f42f92) ) + ROM_LOAD( "00805.9b", 0x400000, 0x200000, CRC(6f026843) SHA1(ea88e21af8247e125de99bf96295eb005e18b77c) ) + ROM_LOAD( "00806.11b", 0x600000, 0x200000, CRC(ab006626) SHA1(6c9a68a6c4e4a229769a3cc07894eb6d848130d4) ) + + ROM_REGION( 0x200000, "oki", 0 ) + ROM_LOAD( "00801.2a", 0x000000, 0x200000, CRC(3e9f7a5a) SHA1(c4d79d250fbff7922b19da4029529e2d0d1a1a0f) ) // 1xxxxxxxxxxxxxxxxxxxx = 0xFF +ROM_END + } // anonymous namespace @@ -12456,8 +12557,12 @@ GAME( 2000, jongteia, jongtei, jongteia, jongtei, hanakanz_state, empty_init GAME( 2000, mjgnight, 0, mjgnight, mjgnight, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Gorgeous Night (Japan, TSM003-01)", MACHINE_NO_COCKTAIL ) +GAME( 2000, hnrose, 0, hnrose, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Hana Night Rose (Japan, TSM008-04)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL ) + GAME( 2001, daireach, 0, daireach, seljan2, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Dai-Reach (Japan, TSM012-C01)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL ) GAME( 2002, daimyojn, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Dynax / Techno-Top / Techno-Planning", "Mahjong Daimyojin (Japan, T017-PB-00)", MACHINE_NO_COCKTAIL ) +GAME( 2002, mjtenho, 0, daimyojn, daimyojn, hanakanz_state, empty_init, ROT0, "Techno-Top", "Mahjong Tenho (Japan, P016B-000)", MACHINE_NOT_WORKING | MACHINE_NO_COCKTAIL ) + GAME( 2004, momotaro, 0, daimyojn, daimyojn, hanakanz_state, init_momotaro, ROT0, "Techno-Top", "Mahjong Momotarou (Japan, T027-RB-01)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) diff --git a/src/mame/dynax/dynax.cpp b/src/mame/dynax/dynax.cpp index 61488f6735b..73dbf5279fb 100644 --- a/src/mame/dynax/dynax.cpp +++ b/src/mame/dynax/dynax.cpp @@ -82,6 +82,8 @@ TODO: #include "emu.h" #include "dynax.h" +#include "mjdipsw.h" + #include "mahjong.h" #include "cpu/tlcs90/tlcs90.h" @@ -1577,13 +1579,6 @@ INPUT_PORTS_END PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) /* Coin */ \ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* Service */ -#define MAHJONG_ODDS_RATE(shift, loc) \ - PORT_DIPNAME( 0x03 << shift, 0x00 << shift, "Odds Rate" ) PORT_DIPLOCATION(loc) \ - PORT_DIPSETTING( 0x03 << shift, "1 2 4 8 12 16 24 32" ) \ - PORT_DIPSETTING( 0x00 << shift, "1 2 3 5 8 15 30 50" ) \ - PORT_DIPSETTING( 0x01 << shift, "1 2 3 5 10 25 50 100" ) \ - PORT_DIPSETTING( 0x02 << shift, "1 2 3 5 10 50 100 200" ) - static INPUT_PORTS_START( cdracula ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) @@ -3492,7 +3487,7 @@ static INPUT_PORTS_START( tenkai ) PORT_START("DSW4") /* (top) */ MAHJONG_NOTE_CREDITS(0, "SW 1:9", "DSW1", 0) // NOTE RATE - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転 + PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転 PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転 PORT_DIPNAME( 0x04, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9") // コンピューターの強さ @@ -4354,12 +4349,12 @@ void jantouki_state::machine_reset() void jantouki_state::jantouki(machine_config &config) { /* basic machine hardware */ - Z80(config, m_maincpu, 22000000 / 4); /* 5.5MHz */ + Z80(config, m_maincpu, 22000000 / 8); /* 2.75MHz */ m_maincpu->set_addrmap(AS_PROGRAM, &jantouki_state::jantouki_mem_map); m_maincpu->set_addrmap(AS_IO, &jantouki_state::jantouki_io_map); m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus - Z80(config, m_soundcpu, 22000000 / 4); /* 5.5MHz */ + Z80(config, m_soundcpu, 22000000 / 8); /* 2.75MHz */ m_soundcpu->set_addrmap(AS_PROGRAM, &jantouki_state::jantouki_sound_mem_map); m_soundcpu->set_addrmap(AS_IO, &jantouki_state::jantouki_sound_io_map); m_soundcpu->set_irq_acknowledge_callback("soundirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus diff --git a/src/mame/dynax/dynax.h b/src/mame/dynax/dynax.h index f4b46e20e37..061a660a6b3 100644 --- a/src/mame/dynax/dynax.h +++ b/src/mame/dynax/dynax.h @@ -462,52 +462,4 @@ private: INPUT_PORTS_EXTERN(dynax_mahjong_keys); INPUT_PORTS_EXTERN(dynax_hanafuda_keys_bet); -#define MAHJONG_PAYOUT_RATE(shift, loc) \ - PORT_DIPNAME( 0x0f << shift, 0x07 << shift, "Payout Rate" ) PORT_DIPLOCATION(loc) \ - PORT_DIPSETTING( 0x00 << shift, "50%" ) \ - PORT_DIPSETTING( 0x01 << shift, "53%" ) \ - PORT_DIPSETTING( 0x02 << shift, "56%" ) \ - PORT_DIPSETTING( 0x03 << shift, "59%" ) \ - PORT_DIPSETTING( 0x04 << shift, "62%" ) \ - PORT_DIPSETTING( 0x05 << shift, "65%" ) \ - PORT_DIPSETTING( 0x06 << shift, "68%" ) \ - PORT_DIPSETTING( 0x07 << shift, "71%" ) \ - PORT_DIPSETTING( 0x08 << shift, "75%" ) \ - PORT_DIPSETTING( 0x09 << shift, "78%" ) \ - PORT_DIPSETTING( 0x0a << shift, "81%" ) \ - PORT_DIPSETTING( 0x0b << shift, "84%" ) \ - PORT_DIPSETTING( 0x0c << shift, "87%" ) \ - PORT_DIPSETTING( 0x0d << shift, "90%" ) \ - PORT_DIPSETTING( 0x0e << shift, "93%" ) \ - PORT_DIPSETTING( 0x0f << shift, "96%" ) - -#define MAHJONG_COINAGE(shift, loc) \ - PORT_DIPNAME( 0x03 << shift, 0x03 << shift, DEF_STR(Coinage) ) PORT_DIPLOCATION(loc) /* COIN RATE */ \ - PORT_DIPSETTING( 0x03 << shift, DEF_STR(1C_1C) ) /* 1コイン 1プレイ */ \ - PORT_DIPSETTING( 0x02 << shift, DEF_STR(1C_2C) ) /* 1コイン 2プレイ */ \ - PORT_DIPSETTING( 0x01 << shift, DEF_STR(1C_5C) ) /* 1コイン 5プレイ */ \ - PORT_DIPSETTING( 0x00 << shift, "1 Coin/10 Credits" ) /* 1コイン 10プレイ */ - -#define MAHJONG_NOTE_CREDITS(shift, loc, ct, cs) \ - PORT_DIPNAME( 0x01 << shift, 0x00 << shift, "Credits Per Note" ) PORT_DIPLOCATION(loc) /* NOTE RATE */ \ - PORT_DIPSETTING( 0x01 << shift, "5" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x03 << cs) /* COIN×5 */ \ - PORT_DIPSETTING( 0x01 << shift, "10" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x02 << cs) \ - PORT_DIPSETTING( 0x01 << shift, "25" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x01 << cs) \ - PORT_DIPSETTING( 0x01 << shift, "50" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x00 << cs) \ - PORT_DIPSETTING( 0x00 << shift, "10" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x03 << cs) /* COIN×10 */ \ - PORT_DIPSETTING( 0x00 << shift, "20" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x02 << cs) \ - PORT_DIPSETTING( 0x00 << shift, "50" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x01 << cs) \ - PORT_DIPSETTING( 0x00 << shift, "100" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x00 << cs) - -#define MAHJONG_YAKUMAN_BONUS(shift, loc) \ - PORT_DIPNAME( 0x07 << shift, 0x04 << shift, "Yakuman Bonus Cycle" ) PORT_DIPLOCATION(loc) /* 役満ボーナスの設定周期 */ \ - PORT_DIPSETTING( 0x07 << shift, "None" ) /* 無し */ \ - PORT_DIPSETTING( 0x06 << shift, "First time only" ) /* 初回のみ */ \ - PORT_DIPSETTING( 0x05 << shift, "Every 300 coins" ) /* 300コイン毎 */ \ - PORT_DIPSETTING( 0x04 << shift, "Every 500 coins" ) /* 500コイン毎 */ \ - PORT_DIPSETTING( 0x03 << shift, "Every 700 coins" ) /* 700コイン毎 */ \ - PORT_DIPSETTING( 0x02 << shift, "Every 1000 coins" ) /* 1000コイン毎 */ \ - /* PORT_DIPSETTING( 0x01 << shift, "Every 1000 coins" )*/ \ - /* PORT_DIPSETTING( 0x00 << shift, "Every 1000 coins" )*/ - #endif // MAME_DYNAX_DYNAX_H diff --git a/src/mame/dynax/mjdipsw.h b/src/mame/dynax/mjdipsw.h new file mode 100644 index 00000000000..e086be93105 --- /dev/null +++ b/src/mame/dynax/mjdipsw.h @@ -0,0 +1,69 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/*************************************************************************** + + Common Dynax mahjong DIP switch settings + +***************************************************************************/ +#ifndef MAME_DYNAX_MJDIPSW_H +#define MAME_DYNAX_MJDIPSW_H + +#pragma once + + +#define MAHJONG_PAYOUT_RATE(shift, loc) \ + PORT_DIPNAME( 0x0f << shift, 0x07 << shift, "Payout Rate" ) PORT_DIPLOCATION(loc) \ + PORT_DIPSETTING( 0x00 << shift, "50%" ) \ + PORT_DIPSETTING( 0x01 << shift, "53%" ) \ + PORT_DIPSETTING( 0x02 << shift, "56%" ) \ + PORT_DIPSETTING( 0x03 << shift, "59%" ) \ + PORT_DIPSETTING( 0x04 << shift, "62%" ) \ + PORT_DIPSETTING( 0x05 << shift, "65%" ) \ + PORT_DIPSETTING( 0x06 << shift, "68%" ) \ + PORT_DIPSETTING( 0x07 << shift, "71%" ) \ + PORT_DIPSETTING( 0x08 << shift, "75%" ) \ + PORT_DIPSETTING( 0x09 << shift, "78%" ) \ + PORT_DIPSETTING( 0x0a << shift, "81%" ) \ + PORT_DIPSETTING( 0x0b << shift, "84%" ) \ + PORT_DIPSETTING( 0x0c << shift, "87%" ) \ + PORT_DIPSETTING( 0x0d << shift, "90%" ) \ + PORT_DIPSETTING( 0x0e << shift, "93%" ) \ + PORT_DIPSETTING( 0x0f << shift, "96%" ) + +#define MAHJONG_ODDS_RATE(shift, loc) \ + PORT_DIPNAME( 0x03 << shift, 0x00 << shift, "Odds Rate" ) PORT_DIPLOCATION(loc) \ + PORT_DIPSETTING( 0x03 << shift, "1 2 4 8 12 16 24 32" ) \ + PORT_DIPSETTING( 0x00 << shift, "1 2 3 5 8 15 30 50" ) \ + PORT_DIPSETTING( 0x01 << shift, "1 2 3 5 10 25 50 100" ) \ + PORT_DIPSETTING( 0x02 << shift, "1 2 3 5 10 50 100 200" ) + +#define MAHJONG_COINAGE(shift, loc) \ + PORT_DIPNAME( 0x03 << shift, 0x03 << shift, DEF_STR(Coinage) ) PORT_DIPLOCATION(loc) /* COIN RATE */ \ + PORT_DIPSETTING( 0x03 << shift, DEF_STR(1C_1C) ) /* 1コイン 1プレイ */ \ + PORT_DIPSETTING( 0x02 << shift, DEF_STR(1C_2C) ) /* 1コイン 2プレイ */ \ + PORT_DIPSETTING( 0x01 << shift, DEF_STR(1C_5C) ) /* 1コイン 5プレイ */ \ + PORT_DIPSETTING( 0x00 << shift, "1 Coin/10 Credits" ) /* 1コイン 10プレイ */ + +#define MAHJONG_NOTE_CREDITS(shift, loc, ct, cs) \ + PORT_DIPNAME( 0x01 << shift, 0x00 << shift, "Credits Per Note" ) PORT_DIPLOCATION(loc) /* NOTE RATE */ \ + PORT_DIPSETTING( 0x01 << shift, "5" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x03 << cs) /* COIN×5 */ \ + PORT_DIPSETTING( 0x01 << shift, "10" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x02 << cs) \ + PORT_DIPSETTING( 0x01 << shift, "25" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x01 << cs) \ + PORT_DIPSETTING( 0x01 << shift, "50" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x00 << cs) \ + PORT_DIPSETTING( 0x00 << shift, "10" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x03 << cs) /* COIN×10 */ \ + PORT_DIPSETTING( 0x00 << shift, "20" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x02 << cs) \ + PORT_DIPSETTING( 0x00 << shift, "50" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x01 << cs) \ + PORT_DIPSETTING( 0x00 << shift, "100" ) PORT_CONDITION(ct, 0x03 << cs, EQUALS, 0x00 << cs) + +#define MAHJONG_YAKUMAN_BONUS(shift, loc) \ + PORT_DIPNAME( 0x07 << shift, 0x04 << shift, "Yakuman Bonus Cycle" ) PORT_DIPLOCATION(loc) /* 役満ボーナスの設定周期 */ \ + PORT_DIPSETTING( 0x07 << shift, "None" ) /* 無し */ \ + PORT_DIPSETTING( 0x06 << shift, "First time only" ) /* 初回のみ */ \ + PORT_DIPSETTING( 0x05 << shift, "Every 300 coins" ) /* 300コイン毎 */ \ + PORT_DIPSETTING( 0x04 << shift, "Every 500 coins" ) /* 500コイン毎 */ \ + PORT_DIPSETTING( 0x03 << shift, "Every 700 coins" ) /* 700コイン毎 */ \ + PORT_DIPSETTING( 0x02 << shift, "Every 1000 coins" ) /* 1000コイン毎 */ \ + /* PORT_DIPSETTING( 0x01 << shift, "Every 1000 coins" )*/ \ + /* PORT_DIPSETTING( 0x00 << shift, "Every 1000 coins" )*/ + +#endif // MAME_DYNAX_MJDIPSW_H diff --git a/src/mame/dynax/royalmah.cpp b/src/mame/dynax/royalmah.cpp index 510635970ef..20d8778cd34 100644 --- a/src/mame/dynax/royalmah.cpp +++ b/src/mame/dynax/royalmah.cpp @@ -106,6 +106,8 @@ Stephh's notes (based on the games Z80 code and some tests) : #include "emu.h" +#include "mjdipsw.h" + #include "mahjong.h" #include "cpu/tlcs90/tlcs90.h" @@ -3155,137 +3157,221 @@ static INPUT_PORTS_START( mjtensin ) INPUT_PORTS_END static INPUT_PORTS_START( cafetime ) // dips definitions and defaults taken from MT05580, this uses 10 switch dip banks + // The manual provides two sets of standard settings: + // 標準設定 シングル向け 標準設定 コーナー向け + // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF + // SW 2 OFF OFF OFF OFF ON ON OFF ON ON OFF OFF OFF OFF OFF ON OFF ON ON ON OFF + // SW 3 OFF OFF ON ON ON ON ON OFF OFF OFF OFF OFF ON ON ON ON ON OFF OFF OFF + // SW 4 OFF ON ON ON ON ON OFF ON OFF OFF ON ON OFF ON ON ON OFF ON OFF OFF + PORT_INCLUDE( mjctrl2 ) PORT_START("DSW1") // IN11 - PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate" ) PORT_DIPLOCATION("SW1:1,2,3,4") - PORT_DIPSETTING( 0x0f, "96%" ) - PORT_DIPSETTING( 0x0e, "93%" ) - PORT_DIPSETTING( 0x0d, "90%" ) - PORT_DIPSETTING( 0x0c, "87%" ) - PORT_DIPSETTING( 0x0b, "84%" ) - PORT_DIPSETTING( 0x0a, "81%" ) - PORT_DIPSETTING( 0x09, "78%" ) - PORT_DIPSETTING( 0x08, "75%" ) - PORT_DIPSETTING( 0x07, "71%" ) - PORT_DIPSETTING( 0x06, "68%" ) - PORT_DIPSETTING( 0x05, "65%" ) - PORT_DIPSETTING( 0x04, "62%" ) - PORT_DIPSETTING( 0x03, "59%" ) - PORT_DIPSETTING( 0x02, "56%" ) - PORT_DIPSETTING( 0x01, "53%" ) - PORT_DIPSETTING( 0x00, "50%" ) - PORT_DIPNAME( 0x30, 0x00, "Odds Rate" ) PORT_DIPLOCATION("SW1:5,6") // Yakuman - Triple - Double - Haneman - Mangan - 3 Han - 2 Han - 1 Han - PORT_DIPSETTING( 0x30, "32-24-16-12-8-4-2-1" ) - PORT_DIPSETTING( 0x00, "50-30-15-8-5-3-2-1" ) - PORT_DIPSETTING( 0x10, "100-50-25-10-5-3-2-1" ) - PORT_DIPSETTING( 0x20, "200-100-50-10-5-3-2-1" ) - PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("SW1:7,8") + MAHJONG_PAYOUT_RATE(0, "SW 1:1,2,3,4") // PAY-OUT RATE + MAHJONG_ODDS_RATE(4, "SW 1:5,6") // ODDS RATE + PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("SW 1:7,8") // BET-MAX PORT_DIPSETTING( 0xc0, "1" ) PORT_DIPSETTING( 0x80, "5" ) PORT_DIPSETTING( 0x40, "10" ) PORT_DIPSETTING( 0x00, "20" ) - PORT_START("DSW2") // IN12, defaults for 'single type' - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x00, "1C_10C" ) - PORT_DIPNAME( 0x0c, 0x0c, "Minimum Rate" ) PORT_DIPLOCATION("SW2:3,4") - PORT_DIPSETTING( 0x0c, "1" ) - PORT_DIPSETTING( 0x08, "2" ) - PORT_DIPSETTING( 0x04, "3" ) - PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x70, 0x40, "Yakuman Bonus" ) PORT_DIPLOCATION("SW2:5,6,7") // default for 'corner type' would be 0x20 - PORT_DIPSETTING( 0x70, DEF_STR( No ) ) - PORT_DIPSETTING( 0x60, "Once on Start" ) - PORT_DIPSETTING( 0x50, "Every 300 Coins" ) - PORT_DIPSETTING( 0x40, "Every 500 Coins" ) - PORT_DIPSETTING( 0x30, "Every 700 Coins" ) - PORT_DIPSETTING( 0x20, "Every 1000 Coins" ) - PORT_DIPSETTING( 0x10, DEF_STR( Unknown ) ) // not listed on dip sheet - PORT_DIPSETTING( 0x00, DEF_STR( Unknown ) ) // not listed on dip sheet - PORT_DIPNAME( 0x80, 0x00, "Yakuman Bonus Cycle" ) PORT_DIPLOCATION("SW2:8") - PORT_DIPSETTING( 0x00, "Once" ) - PORT_DIPSETTING( 0x80, "Twice" ) + PORT_START("DSW2") // IN12 + MAHJONG_COINAGE(0, "SW 2:1,2") // COIN RATE + PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("SW 2:3,4") // ゲーム・スタート時の最低レート数 + PORT_DIPSETTING( 0x0c, "1" ) // レート 1 + PORT_DIPSETTING( 0x08, "2" ) // レート 2 + PORT_DIPSETTING( 0x04, "3" ) // レート 3 + PORT_DIPSETTING( 0x00, "5" ) // レート 5 + MAHJONG_YAKUMAN_BONUS(4, "SW 2:5,6,7") // 役満ボーナスの設定周期 + PORT_DIPNAME( 0x80, 0x00, "Yakuman Bonuses Per Cycle" ) PORT_DIPLOCATION("SW 2:8") // 役満ボーナスの回数設定周期毎に + PORT_DIPSETTING( 0x00, "1" ) // 1回 + PORT_DIPSETTING( 0x80, "2" ) // 2回 PORT_START("DSW3") // IN13 - PORT_DIPNAME( 0x01, 0x01, "Payout Type" ) PORT_DIPLOCATION("SW3:1") - PORT_DIPSETTING( 0x01, "Credits" ) - PORT_DIPSETTING( 0x00, "Hopper" ) - PORT_DIPNAME( 0x02, 0x02, "Hopper Type" ) PORT_DIPLOCATION("SW3:2") - PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x00, "Reversed" ) - PORT_DIPNAME( 0x04, 0x00, "W-Bet" ) PORT_DIPLOCATION("SW3:3") - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "Renchan Rate" ) PORT_DIPLOCATION("SW3:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW3:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, "Good Time Timer" ) PORT_DIPLOCATION("SW3:6") - PORT_DIPSETTING( 0x00, "3 Minutes" ) - PORT_DIPSETTING( 0x20, "5 Minutes" ) - PORT_DIPNAME( 0x40, 0x00, "Quiz Bonus" ) PORT_DIPLOCATION("SW3:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Quiz Bonus Points" ) PORT_DIPLOCATION("SW3:8") - PORT_DIPSETTING( 0x00, "2" ) - PORT_DIPSETTING( 0x80, "3" ) + PORT_DIPNAME( 0x01, 0x01, "Payout Mode" ) PORT_DIPLOCATION("SW 3:1") // ゲーム・タイプ + PORT_DIPSETTING( 0x01, "Key-out" ) // クレジット・タイプ + PORT_DIPSETTING( 0x00, "Hopper" ) // ホッパー・タイプ + PORT_DIPNAME( 0x02, 0x02, "Hopper Polarity" ) PORT_DIPLOCATION("SW 3:2") // ホッパー・アクティブ + PORT_DIPSETTING( 0x02, DEF_STR(Normal) ) // 通常 + PORT_DIPSETTING( 0x00, "Inverted" ) // 反転 + PORT_DIPNAME( 0x04, 0x00, "Double Bet" ) PORT_DIPLOCATION("SW 3:3") // W-BET + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x08, 0x00, "Renchan Rate" ) PORT_DIPLOCATION("SW 3:4") // 連荘レート + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW 3:5") // ラスト・チャンス + PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x20, 0x00, "Good Time Duration" ) PORT_DIPLOCATION("SW 3:6") // Good Time の時間 + PORT_DIPSETTING( 0x00, "3 Minutes" ) // 3分間 + PORT_DIPSETTING( 0x20, "5 Minutes" ) // 5分間 + PORT_DIPNAME( 0x40, 0x00, "Quiz Bonus" ) PORT_DIPLOCATION("SW 3:7") // クイズ・ボーナス + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x80, 0x80, "Quiz Bonus Points" ) PORT_DIPLOCATION("SW 3:8") // クイズ・ボーナスのポイント + PORT_DIPSETTING( 0x00, "2" ) // 2点 + PORT_DIPSETTING( 0x80, "3" ) // 3点 + + PORT_START("DSW4") // IN14 + PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("SW 4:1") // デモ・サウンド + PORT_DIPSETTING( 0x01, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) PORT_DIPLOCATION("SW 4:2") // ゲーム・サウンド + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x04, 0x00, "Don Den Button" ) PORT_DIPLOCATION("SW 4:3") // Don・Den 機能ボタン変更 + PORT_DIPSETTING( 0x04, "Start" ) // スタート・ボタ + PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F・ボタン + PORT_DIPNAME( 0x08, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW 4:4") // オート・リーチ + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x00, "Show 4-Panel Comics" ) PORT_DIPLOCATION("SW 4:5") // 4コマ・漫画表示 + PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x20, 0x00, "Background Color" ) PORT_DIPLOCATION("SW 4:6") // バック・カラー + PORT_DIPSETTING( 0x20, "Black" ) // 黒 + PORT_DIPSETTING( 0x00, "Green" ) // 緑 + PORT_DIPNAME( 0x40, 0x40, "Stage Select" ) PORT_DIPLOCATION("SW 4:7") // 本(ステージ)セレクト + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x80, 0x00, "Yakuman Match" ) PORT_DIPLOCATION("SW 4:8") // 役満勝負 + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + + PORT_START("DSWTOP") // IN15, actually switches 9-10 of the first 4 banks + MAHJONG_NOTE_CREDITS(0, "SW 1:9", "DSW2", 0) // NOTE RATE + PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転 + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転 + PORT_DIPNAME( 0x04, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9") // コンピューターの強さ + PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 普通 + PORT_DIPSETTING( 0x04, "Strong" ) // 強い + PORT_DIPNAME( 0x08, 0x08, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW 2:10") // OFF固定 + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x30, 0x30, "Quiz Questions Table" ) PORT_DIPLOCATION("SW 3:9,10") // クイズ問題テーブル + PORT_DIPSETTING( 0x30, "A" ) // テーブル A + PORT_DIPSETTING( 0x20, "B" ) // テーブル B + PORT_DIPSETTING( 0x10, "C" ) // テーブル C + PORT_DIPSETTING( 0x00, "D" ) // テーブル D + PORT_DIPNAME( 0x40, 0x40, "Yakuman Match Frequency" ) PORT_DIPLOCATION("SW 4:9") // 役満勝負の頻度 + PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 普通 + PORT_DIPSETTING( 0x40, "Frequent" ) // よく出る + PORT_DIPNAME( 0x80, 0x80, "4-Panel Comic Type" ) PORT_DIPLOCATION("SW 4:10") // 4コマ・漫画 タイプ + PORT_DIPSETTING( 0x00, "A" ) // Aタイプ + PORT_DIPSETTING( 0x80, "B" ) // Bタイプ +INPUT_PORTS_END - PORT_START("DSW4") // IN14, defaults for 'single type' - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW4:1") // Should be off for 'single type' and on for 'corner type', left on for easier regression testing - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "BGM during Gameplay" ) PORT_DIPLOCATION("SW4:2") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, "Don Den Button" ) PORT_DIPLOCATION("SW4:3") // Off for 'corner type' - PORT_DIPSETTING( 0x04, "Start Button" ) - PORT_DIPSETTING( 0x00, "F/F Button" ) - PORT_DIPNAME( 0x08, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW4:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, "Full Test" ) PORT_DIPLOCATION("SW4:5") // 4 koma comic test - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, "Background" ) PORT_DIPLOCATION("SW4:6") - PORT_DIPSETTING( 0x20, "Black" ) - PORT_DIPSETTING( 0x00, "Green" ) - PORT_DIPNAME( 0x40, 0x40, "Book (Stage) Select" ) PORT_DIPLOCATION("SW4:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, "Yakuman Match" ) PORT_DIPLOCATION("SW4:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +static INPUT_PORTS_START( cafedoll ) + // The manual provides three sets of standard settings: + // 標準設定 シングル向け 標準設定 メダル コーナー向け 標準設定 アミューズ コーナー向け + // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF ON OFF OFF ON OFF OFF ON OFF ON OFF + // SW 2 OFF OFF OFF OFF ON ON ON ON ON ON OFF OFF OFF OFF ON ON ON ON ON ON OFF OFF OFF OFF ON ON ON ON ON ON + // SW 3 ON OFF ON ON ON OFF OFF ON OFF OFF OFF ON ON ON ON OFF OFF ON OFF OFF OFF OFF OFF OFF OFF OFF OFF OFF ON ON + // SW 4 OFF ON ON ON ON ON ON ON OFF OFF ON ON ON ON OFF ON ON ON ON OFF ON ON ON ON OFF ON ON ON ON OFF - PORT_START("DSWTOP") // IN15, actually dips 9-10 of the first 4 banks - PORT_DIPNAME( 0x01, 0x00, "Credits Per Note" ) PORT_DIPLOCATION("SW1:9") - PORT_DIPSETTING( 0x01, "5" ) - PORT_DIPSETTING( 0x00, "10" ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:10") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:9") - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:10") // listed as Unused OFF - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, "Quiz Questions Table" ) PORT_DIPLOCATION("SW3:9,10") - PORT_DIPSETTING( 0x30, "A" ) - PORT_DIPSETTING( 0x20, "B" ) - PORT_DIPSETTING( 0x10, "C" ) - PORT_DIPSETTING( 0x00, "D" ) - PORT_DIPNAME( 0x40, 0x40, "Yakuman Match Frequency" ) PORT_DIPLOCATION("SW4:9") - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x40, "Often" ) - PORT_DIPNAME( 0x80, 0x80, "4 Koma Comic Type" ) PORT_DIPLOCATION("SW4:10") - PORT_DIPSETTING( 0x00, "A" ) - PORT_DIPSETTING( 0x80, "B" ) + PORT_INCLUDE( mjctrl2 ) + + PORT_START("DSW1") // IN11 + MAHJONG_PAYOUT_RATE(0, "SW 1:1,2,3,4") // PAY-OUT RATE + MAHJONG_ODDS_RATE(4, "SW 1:5,6") // ODDS RATE + PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("SW 1:7,8") // BET-MAX + PORT_DIPSETTING( 0xc0, "1" ) + PORT_DIPSETTING( 0x80, "5" ) + PORT_DIPSETTING( 0x40, "10" ) + PORT_DIPSETTING( 0x00, "20" ) + + PORT_START("DSW2") // IN12 + MAHJONG_COINAGE(0, "SW 2:1,2") // COIN RATE + PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("SW 2:3,4") // ゲーム・スタート時の最低レート数 + PORT_DIPSETTING( 0x0c, "1" ) // レート 1 + PORT_DIPSETTING( 0x08, "2" ) // レート 2 + PORT_DIPSETTING( 0x04, "3" ) // レート 3 + PORT_DIPSETTING( 0x00, "5" ) // レート 5 + PORT_DIPNAME( 0x30, 0x00, "Credit Limit" ) PORT_DIPLOCATION("SW 2:5,6") // クレジット・コインリミット + PORT_DIPSETTING( 0x30, "300" ) + PORT_DIPSETTING( 0x20, "500" ) + PORT_DIPSETTING( 0x10, "700" ) + PORT_DIPSETTING( 0x00, "1000" ) + PORT_DIPNAME( 0x40, 0x00, "Double Bet" ) PORT_DIPLOCATION("SW 2:7") // W-BET機能 + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x80, 0x00, "Renchan Rate" ) PORT_DIPLOCATION("SW 2:8") // 連荘レート + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + + PORT_START("DSW3") // IN13 + PORT_DIPNAME( 0x03, 0x02, "Bonus Chance Cycle" ) PORT_DIPLOCATION("SW 3:1,2") // ボーナス・チャンスの設定周期 + PORT_DIPSETTING( 0x03, "First time only" ) // 初回のみ + PORT_DIPSETTING( 0x02, "Every 500 coins" ) // 500コイン毎 + PORT_DIPSETTING( 0x01, "Every 700 coins" ) // 700コイン毎 + PORT_DIPSETTING( 0x00, "Every 1000 coins" ) // 1000コイン毎 + PORT_DIPNAME( 0x04, 0x00, "Bonus Chances Per Cycle" ) PORT_DIPLOCATION("SW 3:3") // ボーナス・チャンスの回数設定周期毎に + PORT_DIPSETTING( 0x00, "1" ) // 1回 + PORT_DIPSETTING( 0x04, "2" ) // 2回 + PORT_DIPNAME( 0x18, 0x00, "Bonus Chance Combination" ) PORT_DIPLOCATION("SW 3:4,5") // ボーナス・チャンスの組みあわせ + PORT_DIPSETTING( 0x18, "No Bonus Chance" ) // ボーナス・チャンス無し + PORT_DIPSETTING( 0x10, "Yakuman Chance Only" ) // 役満チャンスのみ + PORT_DIPSETTING( 0x08, "Renzoku Chance Only" ) // 連続チャンスのみ + PORT_DIPSETTING( 0x00, "(A) Yakuman Chance and (B) Renzoku Chance" ) // (A)役満チャンスと(B)連続チャンス + PORT_DIPNAME( 0x60, 0x60, "Ratio of (A) and (B) When Combined" ) PORT_DIPLOCATION("SW 3:6,7") // 組み合わせ複合時の(A)(B)の出率 + PORT_DIPSETTING( 0x60, "Equal" ) // 同等 + PORT_DIPSETTING( 0x40, "More of (A)" ) // (A)が多い + PORT_DIPSETTING( 0x20, "More of (B)" ) // (B)が多い + PORT_DIPNAME( 0x80, 0x00, "Renzoku Chance Payout" ) PORT_DIPLOCATION("SW 3:8") // 連続チャンスの配当 + PORT_DIPSETTING( 0x80, DEF_STR(Low) ) // 小さい + PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 通常 + + PORT_START("DSW4") // IN14 + PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("SW 4:1") // デモ・サウンド + PORT_DIPSETTING( 0x01, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) PORT_DIPLOCATION("SW 4:2") // ゲーム・サウンド + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x04, 0x00, "Background Color" ) PORT_DIPLOCATION("SW 4:3") // バック・カラー + PORT_DIPSETTING( 0x04, "Black" ) // 黒 + PORT_DIPSETTING( 0x00, "Green" ) // グリーン + PORT_DIPNAME( 0x08, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW 4:4") // ラスト・チャンス + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x00, "Don Den Button" ) PORT_DIPLOCATION("SW 4:5") // Don・Den 機能ボタン変更 + PORT_DIPSETTING( 0x10, "Start" ) // スタート・ボタ + PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F・ボタン + PORT_DIPNAME( 0x20, 0x00, "Show 4-Panel Comics" ) PORT_DIPLOCATION("SW 4:6") // 4コマ・漫画表示 + PORT_DIPSETTING( 0x20, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x40, 0x00, "Quiz Bonus" ) PORT_DIPLOCATION("SW 4:7") // クイズ・ボーナス + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x80, 0x00, "Mid-Game Bonus Game" ) PORT_DIPLOCATION("SW 4:8") // ゲーム中のボーナス ゲーム + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + + PORT_START("DSWTOP") // IN15, actually switches 9-10 of the first 4 banks + MAHJONG_NOTE_CREDITS(0, "SW 1:9", "DSW2", 0) // NOTE RATE + PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転 + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転 + PORT_DIPNAME( 0x04, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9") // コンピューターの強さ + PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 普通 + PORT_DIPSETTING( 0x04, "Strong" ) // 強い + PORT_DIPNAME( 0x08, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW 2:10") // オート・リーチ機能 + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x10, "Game Type" ) PORT_DIPLOCATION("SW 3:9") // ゲーム タイプ + PORT_DIPSETTING( 0x10, "Credit Type" ) // クレジット タイプ + PORT_DIPSETTING( 0x00, "Credit Timer Type" ) // クレジット タイマー タイプ + PORT_DIPNAME( 0x20, 0x20, "Game Start Rate 1" ) PORT_DIPLOCATION("SW 3:10") // ゲームスタート レート1 + PORT_DIPSETTING( 0x20, DEF_STR(Normal) ) // 通常 + PORT_DIPSETTING( 0x00, "Fixed" ) // 固定 + PORT_DIPNAME( 0x40, 0x40, "Just Time Bonus Standard Settings" ) PORT_DIPLOCATION("SW 4:9") // ジャスト・タイム・ボーナス 標準設定 + PORT_DIPSETTING( 0x40, "Single" ) // シングル向け + PORT_DIPSETTING( 0x00, "Medal Corner" ) // メダル コーナー向け + PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW 4:10") // OFF固定 + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) INPUT_PORTS_END static INPUT_PORTS_START( ippatsu ) @@ -6256,8 +6342,8 @@ GAME( 1990, mjifb3, mjifb, mjifb, mjifb, royalmah_prgbank_state, GAME( 1991, mjvegasa, 0, mjvegasa, mjvegasa, royalmah_prgbank_state, init_mjvegasa, ROT0, "Dynax", "Mahjong Vegas (Japan, unprotected)", 0 ) GAME( 1991, mjvegas, mjvegasa, mjvegas, mjvegasa, royalmah_prgbank_state, init_mjvegas, ROT0, "Dynax", "Mahjong Vegas (Japan)", 0 ) GAME( 1992, cafetime, 0, cafetime, cafetime, royalmah_prgbank_state, init_cafetime, ROT0, "Dynax", "Mahjong Cafe Time", 0 ) -GAME( 1993, cafedoll, 0, cafedoll, cafetime, royalmah_prgbank_state, init_cafedoll, ROT0, "Dynax", "Mahjong Cafe Doll (Japan, Ver. 1.00)", MACHINE_NOT_WORKING ) // fails protection check (at 0x178 it puts 0x55 in 0xFFBF instead of 0x56 like the code expects and chaos ensues) -GAME( 1993, cafedollg, cafedoll, cafedoll, cafetime, royalmah_prgbank_state, init_cafedoll, ROT0, "Dynax", "Mahjong Cafe Doll Great (Japan, Ver. 1.00)", MACHINE_NOT_WORKING ) // fails protection check (at 0x178 it puts 0x55 in 0xFFBF instead of 0x56 like the code expects and chaos ensues) +GAME( 1993, cafedoll, 0, cafedoll, cafedoll, royalmah_prgbank_state, init_cafedoll, ROT0, "Dynax", "Mahjong Cafe Doll (Japan, Ver. 1.00)", MACHINE_NOT_WORKING ) // fails protection check (at 0x178 it puts 0x55 in 0xFFBF instead of 0x56 like the code expects and chaos ensues) +GAME( 1993, cafedollg, cafedoll, cafedoll, cafedoll, royalmah_prgbank_state, init_cafedoll, ROT0, "Dynax", "Mahjong Cafe Doll Great (Japan, Ver. 1.00)", MACHINE_NOT_WORKING ) // fails protection check (at 0x178 it puts 0x55 in 0xFFBF instead of 0x56 like the code expects and chaos ensues) GAME( 1993, ichiban, 0, ichiban, ichiban, royalmah_prgbank_state, init_ichiban, ROT0, "Excel", "Ichi Ban Jyan", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // ROM banking is wrong, causing several GFX problems GAME( 1993, dragonmj, 0, ichiban, ichiban, royalmah_prgbank_state, init_ichiban, ROT0, "OCT", "Dragon Mahjong (Ver 1.20)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // " - DRAGON Ver1.20 1993/11/09 GAME( 1993, dragonmj103, dragonmj, ichiban, ichiban, royalmah_prgbank_state, init_ichiban, ROT0, "OCT", "Dragon Mahjong (Ver 1.03)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // " - DRAGON Ver1.03 1993/10/16 diff --git a/src/mame/epoch/scv.cpp b/src/mame/epoch/scv.cpp index 271d52ec1b8..450d369b67f 100644 --- a/src/mame/epoch/scv.cpp +++ b/src/mame/epoch/scv.cpp @@ -5,15 +5,14 @@ Driver for Epoch Super Cassette Vision TODO: -- adpcm playback by upd1771, needed for star speeder. - verify video clock in European units. - verify raw video parameters. ***************************************************************************/ #include "emu.h" +#include "cpu/upd177x/upd177x.h" #include "cpu/upd7810/upd7810.h" -#include "sound/upd1771.h" #include "bus/scv/slot.h" #include "bus/scv/rom.h" #include "emupal.h" @@ -47,6 +46,7 @@ protected: virtual void machine_reset() override ATTR_COLD; TIMER_CALLBACK_MEMBER(vblank_update); + TIMER_CALLBACK_MEMBER(pa_w_update); private: void scv_palette(palette_device &palette) const; @@ -71,11 +71,12 @@ private: required_shared_ptr<u8> m_videoram; required_device<upd7801_device> m_maincpu; required_device<screen_device> m_screen; - required_device<upd1771c_device> m_upd1771c; + required_device<upd1771c_cpu_device> m_upd1771c; required_device<scv_cart_slot_device> m_cart; required_ioport_array<8> m_pa; required_ioport m_pc0; required_memory_region m_charrom; + emu_timer *m_pa_w_timer; }; @@ -88,7 +89,12 @@ void scv_state::scv_mem(address_map &map) map(0x0000, 0x0fff).rom(); // BIOS map(0x2000, 0x3403).ram().share(m_videoram); // VRAM + 4 registers - map(0x3600, 0x3600).w(m_upd1771c, FUNC(upd1771c_device::write)); + map(0x3600, 0x3600).lw8(NAME([this] (u8 data) { + // With the current cores there are sync issues between writing and clearing PA in scv kungfurd when playing back adpcm. + // During a reset an OUT PA gets executed just around the same time when the main cpu is writing to PA. + // Since the OUT PA completes while the external write to PA is still in progress the external write to PA wins. + m_pa_w_timer->adjust(m_upd1771c->cycles_to_attotime(8), data); + })); // 8000 - ff7f - Cartridge // ff80 - ffff - CPU internal RAM @@ -480,9 +486,16 @@ u32 scv_state::screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, co } +TIMER_CALLBACK_MEMBER(scv_state::pa_w_update) +{ + m_upd1771c->pa_w(param); +} + + void scv_state::machine_start() { m_vb_timer = timer_alloc(FUNC(scv_state::vblank_update), this); + m_pa_w_timer = timer_alloc(FUNC(scv_state::pa_w_update), this); save_item(NAME(m_porta)); save_item(NAME(m_portc)); @@ -540,13 +553,14 @@ void scv_state::scv(machine_config &config) return data; }); m_maincpu->pc_in_cb().set([this] () { - return (m_pc0->read() & 0x01); + return BIT(m_pc0->read(), 0); }); m_maincpu->pc_out_cb().set([this] (u8 data) { m_portc = data; m_cart->write_bank(m_portc); // Only bits 5 & 6 are exposed to the cartridge? - m_upd1771c->pcm_write(BIT(m_portc, 3)); + m_upd1771c->set_input_line(INPUT_LINE_RESET, BIT(m_portc, 3) ? CLEAR_LINE : ASSERT_LINE); }); + config.set_perfect_quantum(m_maincpu); // Video chip is EPOCH TV-1 SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -560,8 +574,8 @@ void scv_state::scv(machine_config &config) // Sound is generated by UPD1771C clocked at XTAL(6'000'000) SPEAKER(config, "mono").front_center(); UPD1771C(config, m_upd1771c, 6_MHz_XTAL); - m_upd1771c->ack_handler().set([this] (int state) { m_maincpu->set_input_line(UPD7810_INTF1, (state) ? ASSERT_LINE : CLEAR_LINE); }); - m_upd1771c->add_route(ALL_OUTPUTS, "mono", 1.00); + m_upd1771c->pb_out_cb().set([this] (u8 data) { m_maincpu->set_input_line(UPD7810_INTF1, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); }); + m_upd1771c->add_route(ALL_OUTPUTS, "mono", 0.70); SCV_CART_SLOT(config, m_cart, scv_cart, nullptr); m_cart->set_address_space(m_maincpu, AS_PROGRAM); @@ -587,6 +601,9 @@ ROM_START(scv) ROM_REGION(0x400, "charrom", 0) ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509)) + + ROM_REGION(0x400, "upd1771c", 0) + ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0)) ROM_END @@ -596,6 +613,9 @@ ROM_START(scv_pal) ROM_REGION(0x400, "charrom", 0) ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509)) + + ROM_REGION(0x400, "upd1771c", 0) + ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0)) ROM_END } // anonymous namespace diff --git a/src/mame/handheld/hh_e0c6200.cpp b/src/mame/handheld/hh_e0c6200.cpp new file mode 100644 index 00000000000..17590e03217 --- /dev/null +++ b/src/mame/handheld/hh_e0c6200.cpp @@ -0,0 +1,577 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:digshadow, Segher, azya +/******************************************************************************* + +Seiko Epson E0C6200-based handhelds, mostly electronic keychain toys from the +late-1990s. The first Tamagotchi games are on this MCU. + +These were meant to stay on 24/7, so make sure to use save states if you want +to play the games for a longer time or remember high scores. + +For most of the games, external artwork is required for the background inlays. +For the drivers that don't have an SVG screen, use -prescale or -nofilter to +disable bilinear filtering. + +TODO: +- in stackch, you can still move around when the game is paused, maybe BTANB? +- digimon external port is unemulated +- alienfev unmapped reads/writes, or are they harmless? +- SVGs could be more accurate? Instead of 1:1 scans like with Game & Watch, + they were created by tracing segments by hand from macro photos +- redo tamamot SVG, LCD was not available and azya redrew it from online photos +- add LCD deflicker like hh_sm510? see venusdm for example +- hook up LCD contrast, stackch and alienfev support user-defined contrast, + but it doesn't look like any game uses it for eg. fade-out + +*******************************************************************************/ + +#include "emu.h" + +#include "cpu/e0c6200/e0c6s46.h" +#include "sound/spkrdev.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + +// internal artwork +#include "hh_e0c6200_lcd.lh" + + +namespace { + +class hh_e0c6200_state : public driver_device +{ +public: + hh_e0c6200_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_out_x(*this, "%u.%u", 0U, 0U) + { } + + DECLARE_INPUT_CHANGED_MEMBER(input_changed); + DECLARE_INPUT_CHANGED_MEMBER(reset_button); + +protected: + virtual void machine_start() override ATTR_COLD; + + void lcd_segment_w(offs_t offset, u8 data) { m_out_x[offset & 0xf][offset >> 4] = data; } + + required_device<e0c6s46_device> m_maincpu; + output_finder<16, 51> m_out_x; // max 16 * 51 +}; + +void hh_e0c6200_state::machine_start() +{ + m_out_x.resolve(); +} + + + +/******************************************************************************* + + Helper Functions + +*******************************************************************************/ + +// generic input handlers + +#define PORT_CHANGED_CB(x) \ + PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(hh_e0c6200_state::input_changed), E0C6S46_LINE_K00 + x) + +INPUT_CHANGED_MEMBER(hh_e0c6200_state::input_changed) +{ + // inputs are hooked up backwards here, because MCU input ports are all tied to its interrupt controller + m_maincpu->set_input_line(param, newval ? ASSERT_LINE : CLEAR_LINE); +} + +INPUT_CHANGED_MEMBER(hh_e0c6200_state::reset_button) +{ + // when an input is directly wired to MCU RESET pin + m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); +} + + + +/******************************************************************************* + + Minidrivers (subclass, I/O, Inputs, Machine Config, ROM Defs) + +*******************************************************************************/ + +/******************************************************************************* + + Bandai Tamagotchi (Generation 1) + * PCB label: TMG-M1 + * Seiko Epson E0C6S46 MCU under epoxy + * 32*16 LCD screen + 8 custom segments, 1-bit sound + + Generation 2 is on the exact same hardware. It's nearly the same game, they + only changed the graphics. + +*******************************************************************************/ + +class tama_state : public hh_e0c6200_state +{ +public: + tama_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void tama(machine_config &config); +}; + +// inputs + +static INPUT_PORTS_START( tama ) + PORT_START("K0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_CB(0) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_CB(1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +// config + +void tama_state::tama(machine_config &config) +{ + // basic machine hardware + E0C6S46(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + m_maincpu->write_segs().set(FUNC(tama_state::lcd_segment_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1119, 1080); + screen.set_visarea_full(); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tama ) + ROM_REGION( 0x3000, "maincpu", 0 ) + ROM_LOAD( "tama.bin", 0x0000, 0x3000, CRC(5c864cb1) SHA1(4b4979cf92dc9d2fb6d7295a38f209f3da144f72) ) + + ROM_REGION( 0x3000, "maincpu:test", 0 ) + ROM_LOAD( "test.bin", 0x0000, 0x3000, CRC(4372220e) SHA1(6e13d015113e16198c0059b9d0c38d7027ae7324) ) // this rom is on the die too, test pin enables it? + + ROM_REGION( 139072, "screen", 0) + ROM_LOAD( "tama.svg", 0, 139072, CRC(9468b964) SHA1(ab49471db21a00a3b3a68da39c40da69da5d7e1b) ) +ROM_END + +ROM_START( tamag2 ) + ROM_REGION( 0x3000, "maincpu", 0 ) + ROM_LOAD( "tamag2.bin", 0x0000, 0x3000, CRC(9f97539e) SHA1(09e5101b37636a314fc599d5d69b4846721b3c88) ) + + ROM_REGION( 139072, "screen", 0) + ROM_LOAD( "tama.svg", 0, 139072, CRC(9468b964) SHA1(ab49471db21a00a3b3a68da39c40da69da5d7e1b) ) +ROM_END + + + + + +/******************************************************************************* + + Bandai Tamagotchi Angel (Tenshitchi no Tamagotchi (aka Angel Gotch) in Japan) + * PCB label: TAL-1, 00-83520-001 + * Seiko Epson E0C6S48 under epoxy + * 32*16 LCD screen + 8 custom segments, 1-bit sound + + Mothra no Tamagotchi is on similar hardware. + +*******************************************************************************/ + +class tamaang_state : public hh_e0c6200_state +{ +public: + tamaang_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void tamaang(machine_config &config); +}; + +// inputs + +static INPUT_PORTS_START( tamaang ) + PORT_INCLUDE( tama ) + + PORT_MODIFY("K0") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_CHANGED_CB(3) PORT_NAME("Vibration Sensor") +INPUT_PORTS_END + +// config + +void tamaang_state::tamaang(machine_config &config) +{ + // basic machine hardware + E0C6S48(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->set_osc3(1'000'000); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + m_maincpu->write_segs().set(FUNC(tamaang_state::lcd_segment_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1119, 1080); + screen.set_visarea_full(); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( tamaang ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "tamaang.bin", 0x0000, 0x4000, CRC(87bcb59f) SHA1(f5899bb7717756ac581451cf16cf97d909961c5c) ) + + ROM_REGION( 139978, "screen", 0) + ROM_LOAD( "tamaang.svg", 0, 139978, CRC(76f27f06) SHA1(b416275a12173316e053fa994c5fd68a4d5c1a5c) ) +ROM_END + +ROM_START( tamamot ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "tamamot.bin", 0x0000, 0x4000, CRC(85e4bee9) SHA1(74c1f6761724b7cbda8bca3113db78586b786d2d) ) + + ROM_REGION( 138289, "screen", 0) + ROM_LOAD( "tamamot.svg", 0, 138289, CRC(4e8210c2) SHA1(522536ae5bf744889c0d028c3a292bdf649f81e3) ) +ROM_END + + + + + +/******************************************************************************* + + Bandai Digital Monster (retroactively called Ver. 1) + * PCB label: TDM-1, 00-83830-001 + * Seiko Epson E0C6S48 MCU under epoxy + * external port on P20, for connecting to another Digimon handheld + * 32*16 LCD screen + 8 custom segments, 1-bit sound + + The sequels (Ver. 2 to Ver. 4) are on the same hardware, and are compatible + with each other for battle mode. + +*******************************************************************************/ + +class digimon_state : public hh_e0c6200_state +{ +public: + digimon_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void digimon(machine_config &config); +}; + +// inputs + +static INPUT_PORTS_START( digimon ) + PORT_INCLUDE( tama ) + + PORT_START("RESET") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_POWER_ON ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(digimon_state::reset_button), 0) PORT_NAME("Reset") +INPUT_PORTS_END + +// config + +void digimon_state::digimon(machine_config &config) +{ + // basic machine hardware + E0C6S48(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->set_osc3(1'000'000); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + m_maincpu->write_segs().set(FUNC(digimon_state::lcd_segment_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(1113, 1080); + screen.set_visarea_full(); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( digimon ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "digimon.bin", 0x0000, 0x4000, CRC(08ffac1b) SHA1(1dde9b0aa81c8f4a1e22d3a79d4743833fc6cba7) ) + + ROM_REGION( 158040, "screen", 0) + ROM_LOAD( "digimon.svg", 0, 158040, CRC(0a6ad374) SHA1(e0bafc2c907dbe49e366ff76f2aef622e058f915) ) +ROM_END + +ROM_START( digimonv2 ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "digimonv2.bin", 0x0000, 0x4000, CRC(19a9e54e) SHA1(ab860ca9f31f478532122cb9d20f59964a080a27) ) + + ROM_REGION( 158040, "screen", 0) + ROM_LOAD( "digimon.svg", 0, 158040, CRC(0a6ad374) SHA1(e0bafc2c907dbe49e366ff76f2aef622e058f915) ) +ROM_END + +ROM_START( digimonv3 ) + ROM_REGION( 0x4000, "maincpu", 0 ) + ROM_LOAD( "digimonv3.bin", 0x0000, 0x4000, CRC(3000cf30) SHA1(0acd50e623e20d857e13bae150ac03405896cf2b) ) + + ROM_REGION( 158040, "screen", 0) + ROM_LOAD( "digimon.svg", 0, 158040, CRC(0a6ad374) SHA1(e0bafc2c907dbe49e366ff76f2aef622e058f915) ) +ROM_END + + + + + +/******************************************************************************* + + Epoch Chibi Pachi: Alien Fever + * Seiko Epson E0C6S46 MCU + * 39*16 LCD screen, 1-bit sound + + It's a Pachislot keychain game, the MCU constantly runs on the higher-speed OSC3. + +*******************************************************************************/ + +class alienfev_state : public hh_e0c6200_state +{ +public: + alienfev_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void alienfev(machine_config &config); +}; + +// inputs + +static INPUT_PORTS_START( alienfev ) + PORT_START("K0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_CB(0) PORT_NAME("Mode") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_CB(1) PORT_NAME("Select") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(2) PORT_NAME("Sound") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(3) PORT_NAME("Handle") +INPUT_PORTS_END + +// config + +void alienfev_state::alienfev(machine_config &config) +{ + // basic machine hardware + E0C6S46(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->set_osc3(1'000'000); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(39, 16); + screen.set_visarea_full(); + screen.set_screen_update(m_maincpu, FUNC(e0c6s46_device::screen_update)); + screen.set_palette("palette"); + + PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( alienfev ) + ROM_REGION( 0x3000, "maincpu", 0 ) + ROM_LOAD( "alienfev.bin", 0x0000, 0x3000, CRC(e561599c) SHA1(7927e198f8989861ba057150e59d1f4ad403c1d2) ) +ROM_END + + + + + +/******************************************************************************* + + Nikko Beans Collection: Venus Diet Monogatari + * Seiko Epson E0C6S46 MCU + * 32*20 LCD screen, 1-bit sound + +*******************************************************************************/ + +class venusdm_state : public hh_e0c6200_state +{ +public: + venusdm_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void venusdm(machine_config &config); + +private: + void pixel_callback(int &dx, int &dy) { int x = dx; dx = dy | (dx / 20) << 4; dy = x % 20; } +}; + +// inputs + +static INPUT_PORTS_START( venusdm ) + PORT_START("K1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CHANGED_CB(4) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_CB(5) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(6) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +// config + +void venusdm_state::venusdm(machine_config &config) +{ + // basic machine hardware + E0C6S46(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + m_maincpu->set_pixel_callback(FUNC(venusdm_state::pixel_callback)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(32, 20); + screen.set_visarea_full(); + screen.set_screen_update(m_maincpu, FUNC(e0c6s46_device::screen_update)); + screen.set_palette("palette"); + + PALETTE(config, "palette", palette_device::MONOCHROME_INVERTED); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( venusdm ) + ROM_REGION( 0x3000, "maincpu", 0 ) + ROM_LOAD( "venusdm.bin", 0x0000, 0x3000, CRC(2228b081) SHA1(22f6a2ede6259e76f1c8b9b50171c54d8a7de502) ) +ROM_END + + + + + +/******************************************************************************* + + Tandy (Radio Shack division) Stack Challenge (model 60-2247) + * Seiko Epson E0C6S46 MCU + * 10*21 LCD screen + custom segments, 1-bit sound + + It's a brick game clone. The game is supposedly from 1991 (it's included in + the 1992 Radio Shack catalog). Did E0C6S46 exist already, or is this a newer + revision? + + BTANB: + - it doesn't allow 2 button presses at the same time, making fast gameplay + impossible (eg. left or right + rotate button) + +*******************************************************************************/ + +class stackch_state : public hh_e0c6200_state +{ +public: + stackch_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_e0c6200_state(mconfig, type, tag) + { } + + void stackch(machine_config &config); +}; + +// inputs + +static INPUT_PORTS_START( stackch ) + PORT_START("K0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_16WAY PORT_CHANGED_CB(0) PORT_NAME("Left / Level") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_16WAY PORT_CHANGED_CB(1) PORT_NAME("Down / Start") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_16WAY PORT_CHANGED_CB(2) PORT_NAME("Right / Height") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_CB(3) PORT_NAME("Rotate / Contrast") + + PORT_START("K1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POWER_ON ) PORT_CHANGED_CB(4) PORT_NAME("On / Off") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SELECT ) PORT_CHANGED_CB(5) PORT_NAME("Pause") + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(6) PORT_NAME("Sound") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + +// config + +void stackch_state::stackch(machine_config &config) +{ + // basic machine hardware + E0C6S46(config, m_maincpu, 32.768_kHz_XTAL); + m_maincpu->set_osc3(1'000'000); + m_maincpu->write_r<4>().set("speaker", FUNC(speaker_sound_device::level_w)).bit(3); + m_maincpu->write_segs().set(FUNC(stackch_state::lcd_segment_w)); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(856, 1080); + screen.set_visarea_full(); + + config.set_default_layout(layout_hh_e0c6200_lcd); + + // sound hardware + SPEAKER(config, "mono").front_center(); + SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.25); +} + +// roms + +ROM_START( stackch ) + ROM_REGION( 0x3000, "maincpu", 0 ) + ROM_LOAD( "stackch.bin", 0x0000, 0x3000, CRC(28b9310a) SHA1(52b80d70aa7fc3b6323799403b3aba0e3d957f3b) ) + + ROM_REGION( 133022, "screen", 0) + ROM_LOAD( "stackch.svg", 0, 133022, CRC(caf74ad4) SHA1(2f2e836b0efe377305bb113a550f1cb4ec939273) ) +ROM_END + +} // anonymous namespace + + + +/******************************************************************************* + + Game driver(s) + +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +SYST( 1997, tama, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 1, World)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1997, tamag2, 0, 0, tama, tama, tama_state, empty_init, "Bandai", "Tamagotchi (Gen. 2, Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1997, tamaang, 0, 0, tamaang, tamaang, tamaang_state, empty_init, "Bandai", "Tenshitchi no Tamagotchi (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1997, tamamot, 0, 0, tamaang, tama, tamaang_state, empty_init, "Bandai", "Mothra no Tamagotchi (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK ) +SYST( 1997, digimon, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN ) +SYST( 1998, digimonv2, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster Ver. 2 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN ) +SYST( 1998, digimonv3, 0, 0, digimon, digimon, digimon_state, empty_init, "Bandai", "Digital Monster Ver. 3 (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK | MACHINE_NODEVICE_LAN ) + +SYST( 1997, alienfev, 0, 0, alienfev, alienfev, alienfev_state, empty_init, "Epoch", "Chibi Pachi: Alien Fever", MACHINE_SUPPORTS_SAVE ) + +SYST( 1997, venusdm, 0, 0, venusdm, venusdm, venusdm_state, empty_init, "Nikko", "Beans Collection: Venus Diet Monogatari", MACHINE_SUPPORTS_SAVE ) + +SYST( 1991, stackch, 0, 0, stackch, stackch, stackch_state, empty_init, "Tandy Corporation", "Stack Challenge", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/handheld/hh_ht11xx.cpp b/src/mame/handheld/hh_ht11xx.cpp index 05b1910d2ce..b8299a82761 100644 --- a/src/mame/handheld/hh_ht11xx.cpp +++ b/src/mame/handheld/hh_ht11xx.cpp @@ -1,5 +1,6 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +// thanks-to:azya /* @@ -32,11 +33,13 @@ TODO: #include "speaker.h" // internal artwork -#include "hh_ht11xx_single.lh" +#include "hh_ht11xx_lcd.lh" namespace { +// base class + class hh_ht11xx_state : public driver_device { public: @@ -53,16 +56,34 @@ protected: required_device<ht1130_device> m_maincpu; }; -class hh_ht1190_state : public hh_ht11xx_state +INPUT_CHANGED_MEMBER(hh_ht11xx_state::input_wakeup) +{ + m_maincpu->set_input_line(HT1130_EXT_WAKEUP_LINE, newval ? CLEAR_LINE : ASSERT_LINE); +} + +void hh_ht11xx_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) +{ + screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(width, height); + screen.set_visarea_full(); + + config.set_default_layout(layout_hh_ht11xx_lcd); +} + + +// HT1130 class + +class hh_ht1130_state : public hh_ht11xx_state { public: - hh_ht1190_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ht1130_state(const machine_config &mconfig, device_type type, const char *tag) : hh_ht11xx_state(mconfig, type, tag), m_out_x(*this, "%u.%u", 0U, 0U), m_in(*this, "IN%u", 1) { } - void brke23p2(machine_config &config); + void ga888(machine_config &config); protected: virtual void machine_start() override ATTR_COLD; @@ -70,21 +91,35 @@ protected: void segment_w(offs_t offset, u64 data); private: - output_finder<8, 40> m_out_x; - required_ioport_array<2> m_in; + output_finder<4, 32> m_out_x; + required_ioport_array<3> m_in; }; +void hh_ht1130_state::machine_start() +{ + m_out_x.resolve(); +} -class hh_ht1130_state : public hh_ht11xx_state +void hh_ht1130_state::segment_w(offs_t offset, u64 data) +{ + // output to x.y where x = COM# and y = SEG# + for (int i = 0; i < 32; i++) + m_out_x[offset][i] = BIT(data, i); +} + + +// HT1190 class + +class hh_ht1190_state : public hh_ht11xx_state { public: - hh_ht1130_state(const machine_config &mconfig, device_type type, const char *tag) : + hh_ht1190_state(const machine_config &mconfig, device_type type, const char *tag) : hh_ht11xx_state(mconfig, type, tag), m_out_x(*this, "%u.%u", 0U, 0U), m_in(*this, "IN%u", 1) { } - void ga888(machine_config &config); + void brke23p2(machine_config &config); protected: virtual void machine_start() override ATTR_COLD; @@ -92,8 +127,8 @@ protected: void segment_w(offs_t offset, u64 data); private: - output_finder<4, 32> m_out_x; - required_ioport_array<3> m_in; + output_finder<8, 40> m_out_x; + required_ioport_array<2> m_in; }; void hh_ht1190_state::machine_start() @@ -101,16 +136,30 @@ void hh_ht1190_state::machine_start() m_out_x.resolve(); } -void hh_ht1130_state::machine_start() +void hh_ht1190_state::segment_w(offs_t offset, u64 data) { - m_out_x.resolve(); + // output to x.y where x = COM# and y = SEG# + for (int i = 0; i < 40; i++) + m_out_x[offset][i] = BIT(data, i); } -INPUT_CHANGED_MEMBER(hh_ht11xx_state::input_wakeup) -{ - m_maincpu->set_input_line(HT1130_EXT_WAKEUP_LINE, newval ? CLEAR_LINE : ASSERT_LINE); -} + +/******************************************************************************* + + Minidrivers (optional subclass, I/O, Inputs, Machine Config, ROM Defs) + +*******************************************************************************/ + +/******************************************************************************* + + E-Star Brick Game 96 in 1 (E-23 Plus Mark II) + * Holtek HT1190 + * 10*20 LCD screen + custom segments, 1-bit sound + +*******************************************************************************/ + +// inputs static INPUT_PORTS_START( brke23p2 ) PORT_START("IN1") @@ -126,6 +175,48 @@ static INPUT_PORTS_START( brke23p2 ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Left") INPUT_PORTS_END +// config + +void hh_ht1190_state::brke23p2(machine_config &config) +{ + HT1190(config, m_maincpu, 1000000/8); // frequency? + m_maincpu->segment_out_cb().set(FUNC(hh_ht1190_state::segment_w)); + + m_maincpu->ps_in_cb().set_ioport(m_in[0]); + m_maincpu->pp_in_cb().set_ioport(m_in[1]); + + SPEAKER(config, "speaker").front_center(); + + mcfg_svg_screen(config, 755, 1080); +} + +// roms + +ROM_START( brke23p2 ) + ROM_REGION( 0x1000, "maincpu", 0 ) + ROM_LOAD( "brke23p2.bin", 0x0000, 0x1000, CRC(8045fac4) SHA1(a36213309e6add31f31e4248f02f17de9914a5c1) ) // visual decap + + ROM_REGION( 0x280, "melody", 0 ) + ROM_LOAD( "e23plusmarkii96in1.srom", 0x000, 0x280, CRC(591a8a21) SHA1(f039359e8e1d1bf75581a4c852b263c8c140e072) ) + + ROM_REGION( 160500, "screen", 0) + ROM_LOAD( "brke23p2.svg", 0, 160500, CRC(9edf8aab) SHA1(f2ab907d23517612196648f1b5b0cb9b4a1ab3bd) ) +ROM_END + + + + + +/******************************************************************************* + + Block Game & Echo Key GA888 + * Holtek HT1130 + * 8*12 LCD screen + 8 custom segments, 1-bit sound + +*******************************************************************************/ + +// inputs + static INPUT_PORTS_START( ga888 ) // the unit also has an up button, and a reset button, is 'up' connected to anything? PORT_START("IN1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_VOLUME_DOWN ) PORT_NAME("Pause / Power") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(hh_ht11xx_state::input_wakeup), 0) @@ -146,47 +237,7 @@ static INPUT_PORTS_START( ga888 ) // the unit also has an up button, and a reset PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Left") INPUT_PORTS_END -void hh_ht1190_state::segment_w(offs_t offset, u64 data) -{ - for (int i = 0; i < 40; i++) - { - // output to x.y where x = COM# and y = SEG# - m_out_x[offset][i] = BIT(data, i); - } -} - -void hh_ht1130_state::segment_w(offs_t offset, u64 data) -{ - for (int i = 0; i < 32; i++) - { - // output to x.y where x = COM# and y = SEG# - m_out_x[offset][i] = BIT(data, i); - } -} - - -void hh_ht11xx_state::mcfg_svg_screen(machine_config &config, u16 width, u16 height, const char *tag) -{ - screen_device &screen(SCREEN(config, tag, SCREEN_TYPE_SVG)); - screen.set_refresh_hz(60); - screen.set_size(width, height); - screen.set_visarea_full(); - - config.set_default_layout(layout_hh_ht11xx_single); -} - -void hh_ht1190_state::brke23p2(machine_config &config) -{ - HT1190(config, m_maincpu, 1000000/8); // frequency? - m_maincpu->segment_out_cb().set(FUNC(hh_ht1190_state::segment_w)); - - m_maincpu->ps_in_cb().set_ioport(m_in[0]); - m_maincpu->pp_in_cb().set_ioport(m_in[1]); - - SPEAKER(config, "speaker").front_center(); - - mcfg_svg_screen(config, 755, 1080); -} +// config void hh_ht1130_state::ga888(machine_config &config) { @@ -202,16 +253,7 @@ void hh_ht1130_state::ga888(machine_config &config) mcfg_svg_screen(config, 698, 1080); } -ROM_START( brke23p2 ) - ROM_REGION( 0x1000, "maincpu", 0 ) - ROM_LOAD( "brke23p2.bin", 0x0000, 0x1000, CRC(8045fac4) SHA1(a36213309e6add31f31e4248f02f17de9914a5c1) ) // visual decap - - ROM_REGION( 0x280, "melody", 0 ) - ROM_LOAD( "e23plusmarkii96in1.srom", 0x000, 0x280, CRC(591a8a21) SHA1(f039359e8e1d1bf75581a4c852b263c8c140e072) ) - - ROM_REGION( 160500, "screen", 0) - ROM_LOAD( "brke23p2.svg", 0, 160500, CRC(9edf8aab) SHA1(f2ab907d23517612196648f1b5b0cb9b4a1ab3bd) ) -ROM_END +// roms ROM_START( ga888 ) ROM_REGION( 0x1000, "maincpu", 0 ) @@ -224,11 +266,17 @@ ROM_START( ga888 ) ROM_LOAD( "ga888.svg", 0, 85508, CRC(9ab6dd67) SHA1(a4365a00204bf4e376f28600c0b87289bda0cbb0) ) ROM_END - } // anonymous namespace -// some other dieshots have 1996 on them, it is also possible the software is from Holtek -CONS( 1993, brke23p2, 0, 0, brke23p2, brke23p2, hh_ht1190_state, empty_init, "E-Star", "Brick Game 96 in 1 (E-23 Plus Mark II)", MACHINE_IMPERFECT_TIMING | MACHINE_NO_SOUND ) -CONS( 199?, ga888, 0, 0, ga888, ga888, hh_ht1130_state, empty_init, "<unknown>", "Block Game & Echo Key GA888", MACHINE_IMPERFECT_TIMING | MACHINE_NO_SOUND ) // clone of Tetris Jr? +/******************************************************************************* + + Game driver(s) + +*******************************************************************************/ + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS +CONS( 1993, brke23p2, 0, 0, brke23p2, brke23p2, hh_ht1190_state, empty_init, "E-Star", "Brick Game 96 in 1 (E-23 Plus Mark II)", MACHINE_IMPERFECT_TIMING | MACHINE_NO_SOUND ) // some other dieshots have 1996 on them, it is also possible the software is from Holtek + +CONS( 199?, ga888, 0, 0, ga888, ga888, hh_ht1130_state, empty_init, "<unknown>", "Block Game & Echo Key GA888", MACHINE_IMPERFECT_TIMING | MACHINE_NO_SOUND ) // clone of Tetris Jr? diff --git a/src/mame/igs/goldstar.cpp b/src/mame/igs/goldstar.cpp index 39f119d97e7..e1b3bd05a0f 100644 --- a/src/mame/igs/goldstar.cpp +++ b/src/mame/igs/goldstar.cpp @@ -14576,13 +14576,13 @@ ROM_START( lucky8n ) ROM_LOAD( "g13", 0x00, 0x20, BAD_DUMP CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END -// only the subboard available (Z80, ROM, 2 stickered chips, 2 banks of 8 DIP switches (marked SW5 and SW6) and a rotary switch (SW7)) +// only the subboard available (Z80, ROM, 2 stickered chips (sanded), 2 banks of 8 DIP switches (marked SW5 and SW6) and a rotary switch (SW7)) // very professional-looking subboard marked Excel Planning // needs correct GFX ROMs / color PROMs (using the ones from wcat3, for now) ROM_START( wcat ) ROM_REGION( 0x20000, "maincpu", 0 ) ROM_LOAD( "y8.u1.sub", 0x00000, 0x20000, CRC(49e11ff4) SHA1(ce421f85b298c2e9c335fdbf0547a355ae29f1a6) ) - ROM_FILL( 0x1c000, 0x1000, 0xc9 ) // jumps in this area multiple times, but nothing there. Something to do with the 2 stickered chips? + ROM_FILL( 0x1c000, 0x1000, 0xc9 ) // jumps in this area multiple times, but nothing here. Something to do with the 2 stickered chips? ROM_REGION( 0x18000, "gfx1", 0 ) ROM_LOAD( "wcat3.h7", 0x10000, 0x8000, BAD_DUMP CRC(065cb575) SHA1(4dd49773c4caeaa489342e61f26c8eaaae876edc) ) diff --git a/src/mame/konami/battlnts.cpp b/src/mame/konami/battlnts.cpp index 0201fe3c6c1..6d3590c29b6 100644 --- a/src/mame/konami/battlnts.cpp +++ b/src/mame/konami/battlnts.cpp @@ -454,9 +454,9 @@ ROM_END * *************************************/ -GAME( 1987, battlnts, 0, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (program code G)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, battlntsa, battlnts, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (program code F)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, battlntsj, battlnts, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (Japan, program code E)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, rackemup, 0, battlnts, rackemup, battlnts_state, empty_init, ROT90, "Konami", "Rack 'em Up (program code L)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, thehustl, rackemup, battlnts, thehustl, battlnts_state, empty_init, ROT90, "Konami", "The Hustler (Japan, program code M)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1987, thehustlj, rackemup, battlnts, thehustl, battlnts_state, empty_init, ROT90, "Konami", "The Hustler (Japan, program code J)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, battlnts, 0, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (version G)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, battlntsa, battlnts, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (version F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, battlntsj, battlnts, battlnts, battlnts, battlnts_state, empty_init, ROT90, "Konami", "Battlantis (Japan, version E)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, rackemup, 0, battlnts, rackemup, battlnts_state, empty_init, ROT90, "Konami", "Rack 'em Up (version L)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, thehustl, rackemup, battlnts, thehustl, battlnts_state, empty_init, ROT90, "Konami", "The Hustler (Japan, version M)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1987, thehustlj, rackemup, battlnts, thehustl, battlnts_state, empty_init, ROT90, "Konami", "The Hustler (Japan, version J)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/gradius3.cpp b/src/mame/konami/gradius3.cpp index db9b1a7678d..722420f507b 100644 --- a/src/mame/konami/gradius3.cpp +++ b/src/mame/konami/gradius3.cpp @@ -11,14 +11,7 @@ on cpu B and the needed parts are copied to RAM at run time. There's also something wrong in the way tile banks are implemented in - k052109.c. They don't seem to be used by this game. - - 2009-03: - Added dsw locations and verified factory setting based on Guru's notes - - 2015-05: - gradius3js set added, same as normal gradius3j set in content but with - some ROMs split and populated differently. + k052109.cpp. They don't seem to be used by this game. ***************************************************************************/ @@ -60,6 +53,11 @@ public: void gradius3(machine_config &config); +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + private: /* memory pointers */ required_shared_ptr<uint16_t> m_gfxram; @@ -87,9 +85,6 @@ private: uint16_t gradius3_gfxrom_r(offs_t offset); void gradius3_gfxram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); void sound_bank_w(uint8_t data); - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; uint32_t screen_update_gradius3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(cpuA_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(gradius3_sub_scanline); @@ -118,6 +113,7 @@ K052109_CB_MEMBER(gradius3_state::tile_callback) *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5); } + /*************************************************************************** Callbacks for the K051960 @@ -151,6 +147,7 @@ K051960_CB_MEMBER(gradius3_state::sprite_callback) *color = sprite_colorbase + ((*color & 0x1e) >> 1); } + /*************************************************************************** Start the video hardware emulation. @@ -167,26 +164,6 @@ void gradius3_state::video_start() machine().save().register_postload(save_prepost_delegate(FUNC(gradius3_state::gradius3_postload), this)); } -/*************************************************************************** - - Memory handlers - -***************************************************************************/ - -uint16_t gradius3_state::gradius3_gfxrom_r(offs_t offset) -{ - return (m_gfxrom[2 * offset + 1] << 8) | m_gfxrom[2 * offset]; -} - -void gradius3_state::gradius3_gfxram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - int oldword = m_gfxram[offset]; - - COMBINE_DATA(&m_gfxram[offset]); - - if (oldword != m_gfxram[offset]) - m_k052109->gfx(0)->mark_dirty(offset / 16); -} /*************************************************************************** @@ -221,6 +198,28 @@ uint32_t gradius3_state::screen_update_gradius3(screen_device &screen, bitmap_in } +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +uint16_t gradius3_state::gradius3_gfxrom_r(offs_t offset) +{ + return (m_gfxrom[2 * offset + 1] << 8) | m_gfxrom[2 * offset]; +} + +void gradius3_state::gradius3_gfxram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + int oldword = m_gfxram[offset]; + + COMBINE_DATA(&m_gfxram[offset]); + + if (oldword != m_gfxram[offset]) + m_k052109->gfx(0)->mark_dirty(offset / 16); +} + + uint16_t gradius3_state::k052109_halfword_r(offs_t offset) { return m_k052109->read(offset); @@ -233,8 +232,10 @@ void gradius3_state::k052109_halfword_w(offs_t offset, uint16_t data, uint16_t m /* is this a bug in the game or something else? */ if (!ACCESSING_BITS_0_7) + { m_k052109->write(offset, (data >> 8) & 0xff); -// logerror("%s half %04x = %04x\n",machine().describe_context(),offset,data); + // logerror("%s half %04x = %04x\n",machine().describe_context(),offset,data); + } } void gradius3_state::cpuA_ctrl_w(offs_t offset, uint16_t data, uint16_t mem_mask) @@ -312,6 +313,11 @@ void gradius3_state::sound_bank_w(uint8_t data) } +/*************************************************************************** + + Address maps + +***************************************************************************/ void gradius3_state::gradius3_map(address_map &map) { @@ -360,6 +366,11 @@ void gradius3_state::gradius3_s_map(address_map &map) } +/*************************************************************************** + + Input ports + +***************************************************************************/ static INPUT_PORTS_START( gradius3 ) PORT_START("SYSTEM") @@ -418,6 +429,12 @@ static INPUT_PORTS_START( gradius3 ) INPUT_PORTS_END +/*************************************************************************** + + Machine configuration + +***************************************************************************/ + void gradius3_state::volume_callback(uint8_t data) { m_k007232->set_volume(0, (data >> 4) * 0x11, 0); @@ -500,10 +517,9 @@ void gradius3_state::gradius3(machine_config &config) } - /*************************************************************************** - Game driver(s) + ROM definitions ***************************************************************************/ @@ -548,6 +564,45 @@ ROM_END ROM_START( gradius3j ) ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "945_313.f15", 0x00000, 0x20000, CRC(706494e1) SHA1(f14fd1f01ee6a9cdcb441432608ba26dedd71b57) ) + ROM_LOAD16_BYTE( "945_312.e15", 0x00001, 0x20000, CRC(6dcd00ab) SHA1(d0cffcb00f89ccaba5fda8a64d1cb6e4af8c2f27) ) + + ROM_REGION( 0x100000, "sub", 0 ) + ROM_LOAD16_BYTE( "945_m09.r17", 0x000000, 0x20000, CRC(b4a6df25) SHA1(85533cf140d28f6f81c0b49b8061bda0924a613a) ) + ROM_LOAD16_BYTE( "945_m08.n17", 0x000001, 0x20000, CRC(74e981d2) SHA1(e7b47a2da01ff73293d2100c48fdf00b33125af5) ) + ROM_LOAD16_BYTE( "945_l06b.r11", 0x040000, 0x20000, CRC(83772304) SHA1(a90c75a3de670b6ec5e0fc201876d463b4a76766) ) + ROM_LOAD16_BYTE( "945_l06a.n11", 0x040001, 0x20000, CRC(e1fd75b6) SHA1(6160d80a2f1bf550e85d6253cf521a96f5a644cc) ) + ROM_LOAD16_BYTE( "945_l07c.r15", 0x080000, 0x20000, CRC(c1e399b6) SHA1(e95bd478dd3beea0175bf9ee4cededb111c4ace1) ) + ROM_LOAD16_BYTE( "945_l07a.n15", 0x080001, 0x20000, CRC(96222d04) SHA1(b55700f683a556b0e73dbac9c7b4ce485420d21c) ) + ROM_LOAD16_BYTE( "945_l07d.r13", 0x0c0000, 0x20000, CRC(4c16d4bd) SHA1(01dcf169b78a1e495214b10181401d1920b0c924) ) + ROM_LOAD16_BYTE( "945_l07b.n13", 0x0c0001, 0x20000, CRC(5e209d01) SHA1(0efa1bbfdc7e2ba1e0bb96245e2bfe961258b446) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "945_m05.d9", 0x00000, 0x10000, CRC(c8c45365) SHA1(b9a7b736b52bca42c7b8c8ed64c8df73e0116158) ) + + ROM_REGION( 0x200000, "k051960", 0 ) /* graphics (addressable by the main CPU) */ + ROM_LOAD32_WORD( "945_a02.l3", 0x000000, 0x80000, CRC(4dfffd74) SHA1(588210bac27448240ef08961f70b714b69cb3ffd) ) + ROM_LOAD32_WORD( "945_a01.h3", 0x000002, 0x80000, CRC(339d6dd2) SHA1(6a52b826aba92c75fc6a5926184948735dc20812) ) + ROM_LOAD32_BYTE( "945_l04a.k6", 0x100000, 0x20000, CRC(884e21ee) SHA1(ce86dd3a06775e5b1aa09db010dcb674e67828e7) ) + ROM_LOAD32_BYTE( "945_l04c.m6", 0x100001, 0x20000, CRC(45bcd921) SHA1(e51a8a71362a6fb55124aa1dce74519c0a3c6e3f) ) + ROM_LOAD32_BYTE( "945_l03a.e6", 0x100002, 0x20000, CRC(a67ef087) SHA1(fd63474f3bbde5dfc53ed4c1db25d6411a8b54d2) ) + ROM_LOAD32_BYTE( "945_l03c.h6", 0x100003, 0x20000, CRC(a56be17a) SHA1(1d387736144c30fcb5de54235331ab1ff70c356e) ) + ROM_LOAD32_BYTE( "945_l04b.k8", 0x180000, 0x20000, CRC(843bc67d) SHA1(cdf8421083f24ab27867ed5d08d8949da192b2b9) ) + ROM_LOAD32_BYTE( "945_l04d.m8", 0x180001, 0x20000, CRC(0a98d08e) SHA1(1e0ca51a2d45c01fa3f11950ddd387f41ddae691) ) + ROM_LOAD32_BYTE( "945_l03b.e8", 0x180002, 0x20000, CRC(933e68b9) SHA1(f3a39446ca77d17fdbd938bd5f718ae9d5570879) ) + ROM_LOAD32_BYTE( "945_l03d.h8", 0x180003, 0x20000, CRC(f375e87b) SHA1(6427b966795c907c8e516244872fe52217da62c4) ) + + ROM_REGION( 0x0100, "proms", 0 ) + ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */ + + ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */ + ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) ) + ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) ) + ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) ) +ROM_END + +ROM_START( gradius3ja ) + ROM_REGION( 0x40000, "maincpu", 0 ) ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) ) ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) ) @@ -585,7 +640,8 @@ ROM_START( gradius3j ) ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) ) ROM_END -ROM_START( gradius3js ) +// Same as normal gradius3ja set in content but with some ROMs split and populated differently. +ROM_START( gradius3jas ) ROM_REGION( 0x40000, "maincpu", 0 ) ROM_LOAD16_BYTE( "945_s13.f15", 0x00000, 0x20000, CRC(70c240a2) SHA1(82dc391572e1f61b0182cb031654d71adcdd5f6e) ) ROM_LOAD16_BYTE( "945_s12.e15", 0x00001, 0x20000, CRC(bbc300d4) SHA1(e1ca98bc591575285d7bd2d4fefdf35fed10dcb6) ) @@ -674,7 +730,8 @@ ROM_END } // anonymous namespace -GAME( 1989, gradius3, 0, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (World, program code R)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, gradius3j, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Japan, program code S)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, gradius3js, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Japan, program code S, split)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, gradius3a, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Asia)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, gradius3, 0, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (World, version R)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, gradius3j, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III: Densetsu kara Shinwa e (Japan, version 3, newer)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, gradius3ja, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III: Densetsu kara Shinwa e (Japan, version S)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, gradius3jas, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III: Densetsu kara Shinwa e (Japan, version S, split)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, gradius3a, gradius3, gradius3, gradius3, gradius3_state, empty_init, ROT0, "Konami", "Gradius III (Asia)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/megazone.cpp b/src/mame/konami/megazone.cpp index f3f79038342..abc259c3179 100644 --- a/src/mame/konami/megazone.cpp +++ b/src/mame/konami/megazone.cpp @@ -941,9 +941,9 @@ ROM_END } // anonymous namespace -GAME( 1983, megazone, 0, megazone, megazone, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (program code L)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, megazonej, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Interlogic / Kosuka license)", "Mega Zone (program code J)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, megazonei, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (program code I)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, megazoneh, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Kosuka license)", "Mega Zone (program code H)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, megazonea, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Interlogic / Kosuka license)", "Mega Zone (unknown program code 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, megazoneb, megazone, megazone, megazona, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (unknown program code 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazone, 0, megazone, megazone, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (version L)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazonej, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Interlogic / Kosuka license)", "Mega Zone (version J)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazonei, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (version I)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazoneh, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Kosuka license)", "Mega Zone (version H)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazonea, megazone, megazone, megazone, megazone_state, empty_init, ROT90, "Konami (Interlogic / Kosuka license)", "Mega Zone (unknown version 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, megazoneb, megazone, megazone, megazona, megazone_state, empty_init, ROT90, "Konami", "Mega Zone (unknown version 2)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/rungun.cpp b/src/mame/konami/rungun.cpp index a30508862a4..db7dd28a097 100644 --- a/src/mame/konami/rungun.cpp +++ b/src/mame/konami/rungun.cpp @@ -1,6 +1,6 @@ // license:BSD-3-Clause // copyright-holders:R. Belmont -/************************************************************************* +/******************************************************************************* Run and Gun / Slam Dunk (c) 1993 Konami @@ -15,13 +15,16 @@ should be fine. Known Issues: - - CRTC and video registers needs syncronization with current video draw state, it's very noticeable if for example scroll values are in very different states between screens. - - Current draw state could be improved optimization-wise (for example by supporting it in the core in some way). + - CRTC and video registers needs syncronization with current video draw state, + it's very noticeable if for example scroll values are in very different states + between screens. + - Current draw state could be improved optimization-wise (for example by supporting + it in the core in some way). - sprite palettes are not entirely right (fixed?) - sound volume mixing, handtune with set_gain() with m_k054539 devices. Also notice that "volume" in sound options is for k054539_1 (SFX) -*************************************************************************/ +*******************************************************************************/ #include "emu.h" @@ -53,8 +56,7 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_soundcpu(*this, "soundcpu"), - m_k054539_1(*this, "k054539_1"), - m_k054539_2(*this, "k054539_2"), + m_k054539(*this, "k054539_%u", 0), m_k053936(*this, "k053936"), m_k055673(*this, "k055673"), m_k053252(*this, "k053252"), @@ -84,8 +86,7 @@ private: /* devices */ required_device<cpu_device> m_maincpu; required_device<cpu_device> m_soundcpu; - required_device<k054539_device> m_k054539_1; - required_device<k054539_device> m_k054539_2; + required_device_array<k054539_device, 2> m_k054539; required_device<k053936_device> m_k053936; required_device<k055673_device> m_k055673; required_device<k053252_device> m_k053252; @@ -110,23 +111,23 @@ private: tilemap_t *m_ttl_tilemap[2]{}; tilemap_t *m_936_tilemap[2]{}; std::unique_ptr<uint16_t[]> m_psac2_vram; - std::unique_ptr<uint16_t[]> m_ttl_vram; - std::unique_ptr<uint16_t[]> m_pal_ram; - uint8_t m_current_display_bank = 0; + std::unique_ptr<uint16_t[]> m_ttl_vram; + std::unique_ptr<uint16_t[]> m_pal_ram; + uint8_t m_current_display_bank = 0; int m_ttl_gfx_index = 0; int m_sprite_colorbase = 0; - uint8_t *m_roz_rom = nullptr; - uint8_t m_roz_rombase = 0; + uint8_t *m_roz_rom = nullptr; + uint8_t m_roz_rombase = 0; /* sound */ - uint8_t m_sound_ctrl = 0; - uint8_t m_sound_nmi_clk = 0; + uint8_t m_sound_ctrl = 0; + uint8_t m_sound_nmi_clk = 0; bool m_video_priority_mode = false; std::unique_ptr<uint16_t[]> m_banked_ram; bool m_single_screen_mode = false; - uint8_t m_video_mux_bank = 0; + uint8_t m_video_mux_bank = 0; uint16_t sysregs_r(offs_t offset, uint16_t mem_mask = ~0); void sysregs_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); @@ -140,9 +141,8 @@ private: TILE_GET_INFO_MEMBER(ttl_get_tile_info); TILE_GET_INFO_MEMBER(get_rng_936_tile_info); void k054539_nmi_gen(int state); - uint16_t palette_read(offs_t offset); - void palette_write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - + uint16_t palette_r(offs_t offset); + void palette_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); K055673_CB_MEMBER(sprite_callback); @@ -152,7 +152,7 @@ private: uint32_t screen_update_rng_dual_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); bitmap_ind16 m_rng_dual_demultiplex_left_temp; bitmap_ind16 m_rng_dual_demultiplex_right_temp; - void sprite_dma_trigger(void); + void sprite_dma_trigger(void); INTERRUPT_GEN_MEMBER(rng_interrupt); @@ -182,10 +182,11 @@ uint16_t rungun_state::sysregs_r(offs_t offset, uint16_t mem_mask) */ { uint8_t field_bit = m_screen->frame_number() & 1; - if(m_single_screen_mode == true) + if (m_single_screen_mode == true) field_bit = 1; return (m_system->read() & 0xfdff) | (field_bit << 9); } + case 0x06/2: if (ACCESSING_BITS_0_7) { @@ -231,7 +232,7 @@ void rungun_state::sysregs_w(offs_t offset, uint16_t data, uint16_t mem_mask) if (!(data & 0x400)) // actually a 0 -> 1 transition m_maincpu->set_input_line(M68K_IRQ_5, CLEAR_LINE); } - break; + break; case 0x0c/2: /* @@ -243,7 +244,7 @@ void rungun_state::sysregs_w(offs_t offset, uint16_t data, uint16_t mem_mask) */ m_k055673->k053246_set_objcha_line((data & 0x04) ? ASSERT_LINE : CLEAR_LINE); m_roz_rombase = (data & 0xf0) >> 4; - break; + break; } } @@ -267,38 +268,36 @@ uint8_t rungun_state::k53936_rom_r(offs_t offset) { // TODO: odd addresses returns ...? uint32_t rom_addr = offset; - rom_addr+= (m_roz_rombase)*0x20000; + rom_addr += m_roz_rombase * 0x20000; return m_roz_rom[rom_addr]; } -uint16_t rungun_state::palette_read(offs_t offset) +uint16_t rungun_state::palette_r(offs_t offset) { return m_pal_ram[offset + m_video_mux_bank*0x800/2]; } -void rungun_state::palette_write(offs_t offset, uint16_t data, uint16_t mem_mask) +void rungun_state::palette_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - palette_device &cur_paldevice = m_video_mux_bank == 0 ? *m_palette : *m_palette2; uint32_t addr = offset + m_video_mux_bank*0x800/2; COMBINE_DATA(&m_pal_ram[addr]); - uint8_t r,g,b; + uint8_t r = m_pal_ram[addr] & 0x1f; + uint8_t g = (m_pal_ram[addr] & 0x3e0) >> 5; + uint8_t b = (m_pal_ram[addr] & 0x7e00) >> 10; - r = m_pal_ram[addr] & 0x1f; - g = (m_pal_ram[addr] & 0x3e0) >> 5; - b = (m_pal_ram[addr] & 0x7e00) >> 10; - - cur_paldevice.set_pen_color(offset,pal5bit(r),pal5bit(g),pal5bit(b)); + palette_device &cur_paldevice = m_video_mux_bank == 0 ? *m_palette : *m_palette2; + cur_paldevice.set_pen_color(offset, pal5bit(r), pal5bit(g), pal5bit(b)); } void rungun_state::rungun_map(address_map &map) { map(0x000000, 0x2fffff).rom(); // main program + data - map(0x300000, 0x3007ff).rw(FUNC(rungun_state::palette_read), FUNC(rungun_state::palette_write)); + map(0x300000, 0x3007ff).rw(FUNC(rungun_state::palette_r), FUNC(rungun_state::palette_w)); map(0x380000, 0x39ffff).ram(); // work RAM map(0x400000, 0x43ffff).r(FUNC(rungun_state::k53936_rom_r)).umask16(0x00ff); // '936 ROM readback window map(0x480000, 0x48001f).rw(FUNC(rungun_state::sysregs_r), FUNC(rungun_state::sysregs_w)).share("sysreg"); - map(0x4c0000, 0x4c001f).rw(m_k053252, FUNC(k053252_device::read), FUNC(k053252_device::write)).umask16(0x00ff); // CCU (for scanline and vblank polling) + map(0x4c0000, 0x4c001f).rw(m_k053252, FUNC(k053252_device::read), FUNC(k053252_device::write)).umask16(0x00ff); // CCU (for scanline and vblank polling) map(0x540000, 0x540001).w(FUNC(rungun_state::sound_irq_w)); map(0x580000, 0x58001f).m(m_k054321, FUNC(k054321_device::main_map)).umask16(0xff00); map(0x5c0000, 0x5c000f).r(m_k055673, FUNC(k055673_device::k055673_rom_word_r)); // 246A ROM readback window @@ -334,12 +333,12 @@ K055673_CB_MEMBER(rungun_state::sprite_callback) uint16_t rungun_state::ttl_ram_r(offs_t offset) { - return m_ttl_vram[offset+(m_video_mux_bank*0x1000)]; + return m_ttl_vram[offset + (m_video_mux_bank*0x1000)]; } void rungun_state::ttl_ram_w(offs_t offset, uint16_t data, uint16_t mem_mask) { - COMBINE_DATA(&m_ttl_vram[offset+(m_video_mux_bank*0x1000)]); + COMBINE_DATA(&m_ttl_vram[offset + (m_video_mux_bank*0x1000)]); m_ttl_tilemap[m_video_mux_bank]->mark_tile_dirty(offset / 2); } @@ -398,7 +397,7 @@ void rungun_state::video_start() m_ttl_gfx_index = gfx_index; // create the tilemaps - for(uint32_t screen_num = 0;screen_num < 2;screen_num++) + for (uint32_t screen_num = 0; screen_num < 2; screen_num++) { m_ttl_tilemap[screen_num] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(rungun_state::ttl_get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); m_ttl_tilemap[screen_num]->set_user_data((void *)(uintptr_t)(screen_num * 0x2000)); @@ -420,10 +419,10 @@ uint32_t rungun_state::screen_update_rng(screen_device &screen, bitmap_ind16 &bi bitmap.fill(m_palette->black_pen(), cliprect); screen.priority().fill(0, cliprect); m_current_display_bank = m_screen->frame_number() & 1; - if(m_single_screen_mode == true) + if (m_single_screen_mode == true) m_current_display_bank = 0; - if(m_video_priority_mode == false) + if (m_video_priority_mode == false) { m_k053936->zoom_draw(screen, bitmap, cliprect, m_936_tilemap[m_current_display_bank], 0, 0, 1); m_k055673->k053247_sprites_draw(bitmap, cliprect); @@ -464,14 +463,14 @@ void rungun_state::sprite_dma_trigger(void) { uint32_t src_address; - if(m_single_screen_mode == true) + if (m_single_screen_mode == true) src_address = 1*0x2000; else src_address = m_current_display_bank*0x2000; // TODO: size could be programmable somehow. - for(int i=0;i<0x1000;i+=2) - m_k055673->k053247_word_w(i/2, m_banked_ram[(i + src_address) /2]); + for (int i = 0; i < 0x1000; i += 2) + m_k055673->k053247_word_w(i / 2, m_banked_ram[(i + src_address) / 2]); } @@ -514,9 +513,9 @@ void rungun_state::rungun_sound_map(address_map &map) map(0x0000, 0x7fff).rom(); map(0x8000, 0xbfff).bankr("bank2"); map(0xc000, 0xdfff).ram(); - map(0xe000, 0xe22f).rw(m_k054539_1, FUNC(k054539_device::read), FUNC(k054539_device::write)); + map(0xe000, 0xe22f).rw(m_k054539[0], FUNC(k054539_device::read), FUNC(k054539_device::write)); map(0xe230, 0xe3ff).ram(); - map(0xe400, 0xe62f).rw(m_k054539_2, FUNC(k054539_device::read), FUNC(k054539_device::write)); + map(0xe400, 0xe62f).rw(m_k054539[1], FUNC(k054539_device::read), FUNC(k054539_device::write)); map(0xe630, 0xe7ff).ram(); map(0xf000, 0xf003).m(m_k054321, FUNC(k054321_device::sound_map)); map(0xf800, 0xf800).w(FUNC(rungun_state::sound_ctrl_w)); @@ -624,19 +623,16 @@ void rungun_state::machine_start() m_bank2->configure_entries(0, 8, &ROM[0x10000], 0x4000); m_banked_ram = make_unique_clear<uint16_t[]>(0x2000); - m_pal_ram = make_unique_clear<uint16_t[]>(0x800*2); - m_spriteram_bank->configure_entries(0,2,&m_banked_ram[0],0x2000); + m_pal_ram = make_unique_clear<uint16_t[]>(0x800); + m_spriteram_bank->configure_entries(0, 2, &m_banked_ram[0], 0x2000); save_item(NAME(m_sound_ctrl)); save_item(NAME(m_sound_nmi_clk)); - //save_item(NAME(m_ttl_vram)); } void rungun_state::machine_reset() { memset(m_sysreg, 0, 0x20); - //memset(m_ttl_vram, 0, 0x1000 * sizeof(uint16_t)); - m_sound_ctrl = 0; } @@ -685,8 +681,8 @@ void rungun_state::rng(machine_config &config) m_k053252->set_screen("screen"); PALETTE(config, m_palette2).set_format(palette_device::xBGR_555, 1024); - m_palette->enable_shadows(); - m_palette->enable_hilights(); + m_palette2->enable_shadows(); + m_palette2->enable_hilights(); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -695,17 +691,17 @@ void rungun_state::rng(machine_config &config) K054321(config, m_k054321, "lspeaker", "rspeaker"); // SFX - K054539(config, m_k054539_1, 18.432_MHz_XTAL); - m_k054539_1->set_device_rom_tag("k054539"); - m_k054539_1->timer_handler().set(FUNC(rungun_state::k054539_nmi_gen)); - m_k054539_1->add_route(0, "rspeaker", 1.0); - m_k054539_1->add_route(1, "lspeaker", 1.0); + K054539(config, m_k054539[0], 18.432_MHz_XTAL); + m_k054539[0]->set_device_rom_tag("k054539"); + m_k054539[0]->timer_handler().set(FUNC(rungun_state::k054539_nmi_gen)); + m_k054539[0]->add_route(0, "rspeaker", 1.0); + m_k054539[0]->add_route(1, "lspeaker", 1.0); // BGM, volumes handtuned to make SFXs audible (still not 100% right tho) - K054539(config, m_k054539_2, 18.432_MHz_XTAL); - m_k054539_2->set_device_rom_tag("k054539"); - m_k054539_2->add_route(0, "rspeaker", 0.6); - m_k054539_2->add_route(1, "lspeaker", 0.6); + K054539(config, m_k054539[1], 18.432_MHz_XTAL); + m_k054539[1]->set_device_rom_tag("k054539"); + m_k054539[1]->add_route(0, "rspeaker", 0.6); + m_k054539[1]->add_route(1, "lspeaker", 0.6); } // for dual-screen output Run and Gun requires the video de-multiplexer board connected to the Jamma output, this gives you 2 Jamma connectors, one for each screen. @@ -717,16 +713,16 @@ void rungun_state::rng_dual(machine_config &config) m_screen->set_screen_update(FUNC(rungun_state::screen_update_rng_dual_left)); - screen_device &demultiplex2(SCREEN(config, "demultiplex2", SCREEN_TYPE_RASTER)); - demultiplex2.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); - demultiplex2.set_refresh_hz(59.185606); - demultiplex2.set_vblank_time(ATTOSECONDS_IN_USEC(0)); - demultiplex2.set_size(64*8, 32*8); - demultiplex2.set_visarea(88, 88+416-1, 24, 24+224-1); - demultiplex2.set_screen_update(FUNC(rungun_state::screen_update_rng_dual_right)); - demultiplex2.set_palette(m_palette2); + screen_device &screen2(SCREEN(config, "screen2", SCREEN_TYPE_RASTER)); + screen2.set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK); + screen2.set_refresh_hz(59.185606); + screen2.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen2.set_size(64*8, 32*8); + screen2.set_visarea(88, 88+416-1, 24, 24+224-1); + screen2.set_screen_update(FUNC(rungun_state::screen_update_rng_dual_right)); + screen2.set_palette(m_palette2); - m_k053252->set_slave_screen("demultiplex2"); + m_k053252->set_slave_screen("screen2"); } diff --git a/src/mame/konami/simpsons.cpp b/src/mame/konami/simpsons.cpp index ad93ff0b1f7..da9e1a05d7b 100644 --- a/src/mame/konami/simpsons.cpp +++ b/src/mame/konami/simpsons.cpp @@ -712,7 +712,7 @@ ROM_START( simpsons ) /* World 4 Player */ ROM_LOAD( "simpsons.12c.nv", 0x0000, 0x080, CRC(ec3f0449) SHA1(da35b98cd10bfabe9df3ede05462fabeb0e01ca9) ) ROM_END -ROM_START( simpsons4pe ) /* World 4 Player, later? (by use of later leters) */ +ROM_START( simpsons4pe ) /* World 4 Player, later? (by use of later letters) */ ROM_REGION( 0x80000, "maincpu", 0 ) /* code + banked roms */ ROM_LOAD( "072-g02.16c", 0x00000, 0x20000, CRC(580ce1d6) SHA1(5b07fb8e8041e1663980aa35d853fdc13b22dac5) ) ROM_LOAD( "072-g01.17c", 0x20000, 0x20000, CRC(9f843def) SHA1(858432b59101b0577c5cec6ac0c7c20ab0780c9a) ) diff --git a/src/mame/konami/thunderx.cpp b/src/mame/konami/thunderx.cpp index 4f6a1630fae..be5623907f0 100644 --- a/src/mame/konami/thunderx.cpp +++ b/src/mame/konami/thunderx.cpp @@ -1173,8 +1173,8 @@ ROM_END ROM_START( gbustersa ) ROM_REGION( 0x20000, "maincpu", 0 ) /* banked program ROMs */ - ROM_LOAD( "878_02.k13", 0x00000, 0x10000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version leter */ - ROM_LOAD( "878_03.k15", 0x10000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version leter */ + ROM_LOAD( "878_02.k13", 0x00000, 0x10000, CRC(57178414) SHA1(89b1403158f6ce18706c8a941109554d03cf77d9) ) /* unknown region/version letter */ + ROM_LOAD( "878_03.k15", 0x10000, 0x10000, CRC(6c59e660) SHA1(66a92eb8a93c9f542489fa31bec6ed1819d174da) ) /* unknown region/version letter */ ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the sound CPU */ ROM_LOAD( "878h01.f8", 0x00000, 0x08000, CRC(96feafaa) SHA1(8b6547e610cb4fa1c1f5bf12cb05e9a12a353903) ) @@ -1224,7 +1224,7 @@ ROM_END GAME( 1988, scontra, 0, scontra, scontra, scontra_state, empty_init, ROT90, "Konami", "Super Contra (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, scontraa, scontra, scontra, scontra, scontra_state, empty_init, ROT90, "Konami", "Super Contra (set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, scontraj, scontra, scontra, scontra, scontra_state, empty_init, ROT90, "Konami", "Super Contra - Alien no Gyakushuu (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, scontraj, scontra, scontra, scontra, scontra_state, empty_init, ROT90, "Konami", "Super Contra: Alien no Gyakushuu (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, thunderx, 0, thunderx, thunderx, thunderx_state, empty_init, ROT0, "Konami", "Thunder Cross (set 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, thunderxa, thunderx, thunderx, thunderx, thunderx_state, empty_init, ROT0, "Konami", "Thunder Cross (set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, thunderxb, thunderx, thunderx, thunderx, thunderx_state, empty_init, ROT0, "Konami", "Thunder Cross (set 3)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/twin16.cpp b/src/mame/konami/twin16.cpp index aa9b8945781..0756ce2e20c 100644 --- a/src/mame/konami/twin16.cpp +++ b/src/mame/konami/twin16.cpp @@ -1272,17 +1272,17 @@ GAME( 1987, devilw, 0, devilw, devilw, twin16_state, init_twi GAME( 1987, majuu, devilw, devilw, devilw, twin16_state, init_twin16, ROT0, "Konami", "Majuu no Ohkoku", MACHINE_SUPPORTS_SAVE ) GAME( 1987, darkadv, devilw, devilw, darkadv, twin16_state, init_twin16, ROT0, "Konami", "Dark Adventure", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vulcan, 0, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (New)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vulcana, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (Old)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vulcanb, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (Oldest)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, gradius2, vulcan, twin16, gradius2, twin16_state, init_twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan New Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, gradius2a, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan Old Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, gradius2b, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Gradius II - GOFER no Yabou (Japan Older Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vulcan, 0, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (new)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vulcana, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (old)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vulcanb, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Vulcan Venture (older)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, gradius2, vulcan, twin16, gradius2, twin16_state, init_twin16, ROT0, "Konami", "Gradius II: GOFER no Yabou (Japan, new)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, gradius2a, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Gradius II: GOFER no Yabou (Japan, old)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, gradius2b, vulcan, twin16, vulcan, twin16_state, init_twin16, ROT0, "Konami", "Gradius II: GOFER no Yabou (Japan, older)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, fround, 0, fround, fround, fround_state, init_fround, ROT0, "Konami", "The Final Round (version M)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, froundl, fround, fround, fround, fround_state, init_fround, ROT0, "Konami", "The Final Round (version L)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, hpuncher, fround, twin16, fround, twin16_state, init_twin16, ROT0, "Konami", "Hard Puncher (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, miaj, mia, miaj, miaj, twin16_state, init_twin16, ROT0, "Konami", "M.I.A. - Missing in Action (version R) (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, miaj, mia, miaj, miaj, twin16_state, init_twin16, ROT0, "Konami", "M.I.A.: Missing in Action (Japan, version R)", MACHINE_SUPPORTS_SAVE ) GAME( 1989, cuebrickj, cuebrick, cuebrickj, cuebrickj, cuebrickj_state, init_cuebrickj, ROT0, "Konami", "Cue Brick (Japan)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/konami/yiear.cpp b/src/mame/konami/yiear.cpp index 0d277ff6721..1849277593c 100644 --- a/src/mame/konami/yiear.cpp +++ b/src/mame/konami/yiear.cpp @@ -568,5 +568,5 @@ ROM_END } // anonymous namespace -GAME( 1985, yiear, 0, yiear, yiear, yiear_state, empty_init, ROT0, "Konami", "Yie Ar Kung-Fu (program code I)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, yiear2, yiear, yiear, yiear, yiear_state, empty_init, ROT0, "Konami", "Yie Ar Kung-Fu (program code G)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, yiear, 0, yiear, yiear, yiear_state, empty_init, ROT0, "Konami", "Yie Ar Kung-Fu (version I)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, yiear2, yiear, yiear, yiear, yiear_state, empty_init, ROT0, "Konami", "Yie Ar Kung-Fu (version G)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/layout/hh_ht11xx_single.lay b/src/mame/layout/hh_e0c6200_lcd.lay index 1e847d9b611..1e847d9b611 100644 --- a/src/mame/layout/hh_ht11xx_single.lay +++ b/src/mame/layout/hh_e0c6200_lcd.lay diff --git a/src/mame/layout/hh_ht11xx_lcd.lay b/src/mame/layout/hh_ht11xx_lcd.lay new file mode 100644 index 00000000000..1e847d9b611 --- /dev/null +++ b/src/mame/layout/hh_ht11xx_lcd.lay @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<!-- +license:CC0-1.0 +authors:hap +--> +<mamelayout version="2"> + + <element name="lcdm"><rect><color red="0.7" green="0.71" blue="0.72" /></rect></element> + + <view name="LCD Pixel Aspect (~scr0nativexaspect~:~scr0nativeyaspect~)"> + <screen index="0"><bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" /></screen> + <element ref="lcdm" blend="multiply"><bounds left="0" top="0" right="~scr0width~" bottom="~scr0height~" /></element> + </view> + +</mamelayout> diff --git a/src/mame/layout/tama.lay b/src/mame/layout/tama.lay deleted file mode 100644 index 403676fee81..00000000000 --- a/src/mame/layout/tama.lay +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0"?> -<!-- -license:CC0-1.0 -authors:hap ---> -<mamelayout version="2"> - -<!-- define elements --> - - <element name="yellow"><rect><color red="0.91" green="0.9" blue="0.78" /></rect></element> - - <element name="ind0" defstate="0"> - <text state="0" string="FOOD"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="FOOD"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind1" defstate="0"> - <text state="0" string="LAMP"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="LAMP"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind2" defstate="0"> - <text state="0" string="PLAY"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="PLAY"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind3" defstate="0"> - <text state="0" string="MEDS"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="MEDS"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind4" defstate="0"> - <text state="0" string="BATH"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="BATH"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind5" defstate="0"> - <text state="0" string="STATS"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="STATS"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind6" defstate="0"> - <text state="0" string="SHOUT"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="SHOUT"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - <element name="ind7" defstate="0"> - <text state="0" string="ATTN"><color red="0.87" green="0.86" blue="0.74" /></text> - <text state="1" string="ATTN"><color red="0.22" green="0.2" blue="0.2" /></text> - </element> - - -<!-- build screen --> - - <view name="Internal Layout"> - <bounds left="0" top="0" right="32" bottom="26" /> - - <screen index="0"> - <bounds x="0" y="5" width="32" height="16" /> - </screen> - <element ref="yellow"><bounds x="0" y="0" width="32" height="4" /></element> - <element ref="yellow"><bounds x="0" y="22" width="32" height="4" /></element> - - <element name="0.35" ref="ind0"><bounds x="0" y="1" width="8" height="2" /></element> - <element name="1.35" ref="ind1"><bounds x="8" y="1" width="8" height="2" /></element> - <element name="2.35" ref="ind2"><bounds x="16" y="1" width="8" height="2" /></element> - <element name="3.35" ref="ind3"><bounds x="24" y="1" width="8" height="2" /></element> - - <element name="12.36" ref="ind4"><bounds x="0" y="23" width="8" height="2" /></element> - <element name="13.36" ref="ind5"><bounds x="8" y="23" width="8" height="2" /></element> - <element name="14.36" ref="ind6"><bounds x="16" y="23" width="8" height="2" /></element> - <element name="15.36" ref="ind7"><bounds x="24" y="23" width="8" height="2" /></element> - - </view> -</mamelayout> diff --git a/src/mame/layout/vgmplay.lay b/src/mame/layout/vgmplay.lay index 2317397478d..0101a2375cd 100644 --- a/src/mame/layout/vgmplay.lay +++ b/src/mame/layout/vgmplay.lay @@ -97,31 +97,79 @@ license:CC0-1.0 <element name="act_label_c352"><text string="C352" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> <element name="act_label_ga20"><text string="GA20" align="1"><color red="1.0" green="1.0" blue="1.0" /></text></element> - <element name="static_black2"><rect><color red="0.2" green="0.21" blue="0.23" /></rect></element> - <element name="hl1" defstate="0"> - <text string=" "><color red="0.0" green="0.0" blue="0.0" /></text> - <rect state="1"><color red="1.0" green="1.0" blue="1.0" /></rect> + <rect state="1" /> </element> - <element name="text_l1"> - <rect><color red="0.2" green="0.21" blue="0.23" /></rect> - <text string="■"><color red="0.9" green="0.9" blue="0.2" /></text> + + <element name="button_l1"> + <rect> + <bounds x="0" y="0" width="11" height="5" /> + <color red="0.2" green="0.21" blue="0.23" /> + </rect> + <image> + <bounds xc="5.5" yc="2.5" width="4" height="2" /> + <data><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="100" viewBox="0 0 200 100"> + <path fill="#E5E533" stroke="none" d="M 50,0 l 100,0 l 0,100 l -100,0 z" /> + </svg> + ]]></data> + </image> </element> - <element name="text_l2"> - <rect><color red="0.2" green="0.21" blue="0.23" /></rect> - <text string="◫"><color red="0.9" green="0.9" blue="0.2" /></text> + <element name="button_l2"> + <rect> + <bounds x="0" y="0" width="11" height="5" /> + <color red="0.2" green="0.21" blue="0.23" /> + </rect> + <image> + <bounds xc="5.5" yc="2.5" width="4" height="2" /> + <data><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="100" viewBox="0 0 200 100"> + <path fill="#E5E533" stroke="none" d="M 55,0 l 30,0 l 0,100 l -30,0 z m 60,0 l 30,0 l 0,100 l -30,0 z" /> + </svg> + ]]></data> + </image> </element> - <element name="text_l3"> - <rect><color red="0.2" green="0.21" blue="0.23" /></rect> - <text string="▶"><color red="0.9" green="0.9" blue="0.2" /></text> + <element name="button_l3"> + <rect> + <bounds x="0" y="0" width="11" height="5" /> + <color red="0.2" green="0.21" blue="0.23" /> + </rect> + <image> + <bounds xc="5.5" yc="2.5" width="4" height="2" /> + <data><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="100" viewBox="0 0 200 100"> + <path fill="#E5E533" stroke="none" d="M 40,0 l 120,50 l -120,50 z" /> + </svg> + ]]></data> + </image> </element> - <element name="text_l4"> - <rect><color red="0.2" green="0.21" blue="0.23" /></rect> - <text string="◄"><color red="0.9" green="0.9" blue="0.2" /></text> + <element name="button_l4"> + <rect> + <bounds x="0" y="0" width="11" height="5" /> + <color red="0.2" green="0.21" blue="0.23" /> + </rect> + <image> + <bounds xc="5.5" yc="2.5" width="4" height="2" /> + <data><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="100" viewBox="0 0 200 100"> + <path fill="#E5E533" stroke="none" d="M 10,0 l 15,0 l 0,45 l 85,-45 l 0,45 l 85,-45 l 0,100 l -85,-45 l 0,45 l -85,-45 l 0,45 l -15,0 z" /> + </svg> + ]]></data> + </image> </element> - <element name="text_l5"> - <rect><color red="0.2" green="0.21" blue="0.23" /></rect> - <text string="◎"><color red="0.9" green="0.9" blue="0.2" /></text> + <element name="button_l5"> + <rect> + <bounds x="0" y="0" width="11" height="5" /> + <color red="0.2" green="0.21" blue="0.23" /> + </rect> + <image> + <bounds xc="5.5" yc="2.5" width="4" height="2" /> + <data><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="100" viewBox="0 0 200 100"> + <path fill="#E5E533" stroke="none" d="M 120,15 l 40,0 a 40,40,0,0,1,0,80 l -120,0 a 40,40,0,0,1,0,-80 l 30,0 l 0,-15 l 40,25 l -40,25 l 0,-15 l -30,0 a 20,20,0,0,0,0,40 l 120,0 a 20,20,0,0,0,0,-40 l -40,0 z" /> + </svg> + ]]></data> + </image> </element> <group name="activity"> @@ -218,23 +266,13 @@ license:CC0-1.0 <element ref="act_label_ga20"><bounds x="49" y="22.2" width="10" height="1.6" /></element> </group> - <group name="lights"> - - </group> - <view name="Full View"> <collection name="Controls"> - <element ref="static_black2"><bounds x="0" y="4" width="11" height="5" /></element> - <element ref="static_black2"><bounds x="12" y="4" width="11" height="5" /></element> - <element ref="static_black2"><bounds x="24" y="4" width="11" height="5" /></element> - <element ref="static_black2"><bounds x="36" y="4" width="11" height="5" /></element> - <element ref="static_black2"><bounds x="48" y="4" width="11" height="5" /></element> - - <element ref="text_l1"><bounds x="0" y="5" width="11" height="3.5" /></element> - <element ref="text_l2"><bounds x="12" y="5" width="11" height="3.5" /></element> - <element ref="text_l3"><bounds x="24" y="5" width="11" height="3.5" /></element> - <element ref="text_l4"><bounds x="36" y="5" width="11" height="3.5" /></element> - <element ref="text_l5"><bounds x="48" y="5" width="11" height="3.5" /></element> + <element ref="button_l1"><bounds x="0" y="4" width="11" height="5" /></element> + <element ref="button_l2"><bounds x="12" y="4" width="11" height="5" /></element> + <element ref="button_l3"><bounds x="24" y="4" width="11" height="5" /></element> + <element ref="button_l4"><bounds x="36" y="4" width="11" height="5" /></element> + <element ref="button_l5"><bounds x="48" y="4" width="11" height="5" /></element> <element ref="hl1" inputtag="CONTROLS" inputmask="0x0001"><bounds x="0" y="4" width="11" height="5" /><color alpha="0.15" /></element> <element ref="hl1" inputtag="CONTROLS" inputmask="0x0002"><bounds x="12" y="4" width="11" height="5" /><color alpha="0.15" /></element> diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 9152bbe0472..92d1bcd35dd 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -2498,9 +2498,6 @@ rx78 // @source:bandai/sv8000.cpp sv8000 // Super Vision 8000 -@source:bandai/tamag1.cpp -tama // Bandai - @source:bandai/wswan.cpp pockchv2 // Benesse Pocket Challenge V2 wscolor // Bandai WonderSwan Color Handheld @@ -16192,10 +16189,10 @@ pb2000c // Casio PB-2000C jd363 // Casio Picky Talk - Super Denshi Techou jd364 // Casio Color Picky Talk - Super Denshi Techou jd368 // Casio Super Picky Talk - Access Pet -mk300 // Casio Plet's (MK-300) -mk350 // Casio Plet's (MK-350) pickydis // Tsukuda Original Disney Characters - Tegaki Electronic Note pickytlk // Casio Super Picky Talk - Forest of Gurutan +plets300 // Casio Plet's (MK-300) +plets350 // Casio Plet's (MK-350) @source:casio/pv1000.cpp pv1000 // Casio PV-1000 @@ -17553,6 +17550,7 @@ hgokbang // "116" (c) 1995 Dynax hgokou // "108" (c) 1995 Dynax (Alba license) hgokoua // "108" (c) 1995 Dynax (Alba license) hkagerou // "510" Hana Kagerou 1996 Nakanihon +hnrose // Hana Night Rose (C) 2000 Techno-Top hparadis // "101" (c) 1994 Nakanihon htengoku // "65" (c) 1992 Dynax janshinp // "700j" 1996 Dynax / Sigma @@ -17572,6 +17570,7 @@ mjmyuniv // "85" (c) 1994 Dynax mjmywrld // "77" (c) 1994 Dynax mjreach1 // "526" Mahjong Reach Ippatsu 1998 Nihon System/Dynax mjschuka // "115" (c) 1995 Dynax +mjtenho // Mahjong Tenho (C) 2002 Techno-Top mmpanic // "70" (c) 1992 Nakanihon/Taito momotaro // "027" 2004 Techno-Top nettoqc // "103" (c) 1995 Nakanihon @@ -19148,6 +19147,18 @@ msoccer // Mattel qkracer // National Semiconductor qkspeller // National Semiconductor +@source:handheld/hh_e0c6200.cpp +alienfev // Epoch +digimon // Bandai +digimonv2 // Bandai +digimonv3 // Bandai +stackch // Tandy Corporation +tama // Bandai +tamaang // Bandai +tamag2 // Bandai +tamamot // Bandai +venusdm // Nikko + @source:handheld/hh_hmcs40.cpp alnattck // Coleco bambball // Bambino @@ -24158,7 +24169,8 @@ glregion gradius3 // GX945 (c) 1989 (World) gradius3a // GX945 (c) 1989 (Asia) gradius3j // GX945 (c) 1989 (Japan) -gradius3js // GX945 (c) 1989 (Japan, split) +gradius3ja // GX945 (c) 1989 (Japan) +gradius3jas // GX945 (c) 1989 (Japan, split) @source:konami/gryzor_ms.cpp gryzorm // bootleg (Modular System) @@ -29181,9 +29193,16 @@ abigchs // Big Cheese aclown // Clown atlantca // Atlantica atlantcaa // +atrbonpk // Bonus Poker +atrbtlma // Beetlemania +atricmon // I C Money +atricmona // atronic // atronica // -baboshka // Baboshka +atronicb // +atrwild // Wild Thing +baboshka // Babooshka +baboshkar // beachpt // Beach Patrol bearnec // Bear Necessities beetleup // Beetles Unplugged @@ -29193,21 +29212,23 @@ castawaya // cfblue // Crazy Fruits Blue cfbluea // cfgreen // Crazy Fruits Green +chicdale // Chickendales chicken // Chicken dncsprt // Dancing Spirit drmmake // Dream Maker +drmmaker // goldcity // Gold City goldglen // Golden Glenn +haphippy // Happy Happy Hippy iccash // I C Cash jumpjkpt // Jumping Jackpots mushmagi // Mushroom Magic santam // Santa Maria -shpinxii // Sphinx II +sphinxii // Sphinx II +sphinxiir // splmastr // Spell Master tajmah // Tajmahal -atrwild -atricmon -atrbonpk +tylagoon // Typhoon Lagoon @source:misc/attckufo.cpp attckufo // (c) 1980 Ryoto Electric Co. @@ -36892,6 +36913,7 @@ bmf_cn // bmf_de // bmf_fr // bmf_it // +bmf_ita // bmf_jp // bmf_nl // bmf_nl302 // @@ -45498,6 +45520,7 @@ snowbro2ny // TP-033 (c) 1994 Nyanko burgkids // (c) 1995 Sunwise othldrby // (c) 1995 Sunwise pwrkick // (c) 1994 Sunwise +pyutakun // (c) 1995 Sunwise @source:toaplan/tekipaki.cpp tekipaki // TP-020 (c) 1991 Toaplan @@ -45981,6 +46004,7 @@ rad_digi @source:tvgames/spg2xx_dreamlife.cpp dreamlif // dsgnwrld +gigapets @source:tvgames/spg2xx_ican.cpp icanguit // @@ -45990,7 +46014,11 @@ icanpian // jak_batm // The Batman, 2004 jak_mk jak_mpacw +jak_potc +jak_powr jak_sbjd +jak_spd3 +jak_supm jak_wall @source:tvgames/spg2xx_jakks_gkr.cpp @@ -46260,6 +46288,7 @@ tvpc_ham tvpc_tom @source:tvgames/xavix2.cpp +ban_db2j ltv_naru // domfitad // dombikec // @@ -46286,13 +46315,20 @@ ttv_sw // ttv_swj // @source:tvgames/xavix_2002.cpp +anpanmdx +apmj2009 +ban_dn1j ban_kksj +epo_ntpj ban_ordj domdance // domfitch // domfitex // domstepc // +doradraw +epo_doka epo_tfit +maxheart mrangbat suprtvpc suprtvpcdo diff --git a/src/mame/misc/atronic.cpp b/src/mame/misc/atronic.cpp index 6ab24871532..d850771bfcd 100644 --- a/src/mame/misc/atronic.cpp +++ b/src/mame/misc/atronic.cpp @@ -1,6 +1,7 @@ // license:BSD-3-Clause // copyright-holders:David Haywood -/* Atronic Video Fruit Machines */ + +// Atronic Video Slot Machines /* From 1999? (documentation is dated August 99) @@ -134,7 +135,7 @@ CashLine: There was PC software with these too, I think they're meant to connect to a PC for configuration? I've put what there was in an ISO, and converted it to a CHD for later inspection. - Some of these are probably bad dumps (the ones with strange sized roms, castawaya, tajmahal, maybe magimush) + Some of these are probably bad dumps (the ones with strange sized ROMs, castawaya, tajmahal, maybe magimush) Anybody is welcome to try and figure out what this is. @@ -436,14 +437,17 @@ Markings bottom: 6 470.5020 00.07 */ #include "emu.h" -#include "cpu/z180/z180.h" + #include "cpu/tms34010/tms34010.h" +#include "cpu/z180/z180.h" #include "machine/ds1386.h" #include "machine/pcf8584.h" #include "machine/z80scc.h" +#include "video/ramdac.h" + #include "emupal.h" #include "screen.h" -#include "video/ramdac.h" + namespace { @@ -463,6 +467,14 @@ public: void atronic(machine_config &config); private: + required_device<screen_device> m_screen; + required_device<palette_device> m_palette; + required_device<cpu_device> m_maincpu; + required_device<tms34020_device> m_videocpu; + required_device<ramdac_device> m_ramdac; + + required_shared_ptr<uint32_t> m_vidram; + [[maybe_unused]] u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); u8 serial_r(); @@ -475,22 +487,13 @@ private: void ramdac_map(address_map &map) ATTR_COLD; - // devices - required_device<screen_device> m_screen; - required_device<palette_device> m_palette; - required_device<cpu_device> m_maincpu; - required_device<tms34020_device> m_videocpu; - required_device<ramdac_device> m_ramdac; - - required_shared_ptr<uint32_t> m_vidram; - TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg); TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg); TMS340X0_SCANLINE_RGB32_CB_MEMBER(scanline_update); }; -u32 atronic_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) +u32 atronic_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { return 0; } @@ -546,7 +549,7 @@ TMS340X0_FROM_SHIFTREG_CB_MEMBER(atronic_state::from_shiftreg) TMS340X0_SCANLINE_RGB32_CB_MEMBER(atronic_state::scanline_update) { uint32_t fulladdr = ((params->rowaddr << 16) | params->coladdr) >> 5; - uint32_t const *const bg0_base = &m_vidram[(fulladdr & 0x7fe00)]; // this probably isn't screen ram, but some temp gfx are copied on startup + uint32_t const *const bg0_base = &m_vidram[(fulladdr & 0x7fe00)]; // this probably isn't screen RAM, but some temp gfx are copied on startup uint32_t *const dst = &bitmap.pix(scanline); int coladdr = fulladdr & 0x1ff; const pen_t *pens = m_palette->pens(); @@ -573,9 +576,6 @@ void atronic_state::video_map(address_map &map) } -#define VIDEO_CLOCK XTAL(40'000'000) -#define PIXEL_CLOCK XTAL(25'000'000) - // CPU BOARD // OSC1: 18.432MHz @@ -590,7 +590,7 @@ void atronic_state::ramdac_map(address_map &map) void atronic_state::atronic(machine_config &config) { - /* basic machine hardware */ + // basic machine hardware Z80180(config, m_maincpu, 18.432_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &atronic_state::atronic_map); m_maincpu->set_addrmap(AS_IO, &atronic_state::atronic_portmap); @@ -603,17 +603,17 @@ void atronic_state::atronic(machine_config &config) SCC85C30(config, "scc", 5000000); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_raw(VIDEO_CLOCK/2, 640, 0, 512, 257, 0, 224); // ?? + m_screen->set_raw(40_MHz_XTAL / 2, 640, 0, 512, 257, 0, 224); // ?? m_screen->set_screen_update("tms", FUNC(tms34020_device::tms340x0_rgb32)); PALETTE(config, "palette").set_entries(256); RAMDAC(config, m_ramdac, 0, m_palette); m_ramdac->set_addrmap(0, &atronic_state::ramdac_map); - TMS34020(config, m_videocpu, VIDEO_CLOCK); + TMS34020(config, m_videocpu, 40_MHz_XTAL); m_videocpu->set_addrmap(AS_PROGRAM, &atronic_state::video_map); m_videocpu->set_halt_on_reset(false); - m_videocpu->set_pixel_clock(PIXEL_CLOCK/4); + m_videocpu->set_pixel_clock(25_MHz_XTAL / 4); m_videocpu->set_pixels_per_clock(4); m_videocpu->set_scanline_rgb32_callback(FUNC(atronic_state::scanline_update)); m_videocpu->set_shiftreg_in_callback(FUNC(atronic_state::to_shiftreg)); @@ -622,42 +622,63 @@ void atronic_state::atronic(machine_config &config) ROM_START( atronic ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "atronic u2.bin", 0x0000, 0x080000, CRC(ddcfa9ed) SHA1(008ffaf56ccdb3eb60fa5a0ad2f14d1988c2fa5a) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "atronic u2.bin", 0x000000, 0x080000, CRC(ddcfa9ed) SHA1(008ffaf56ccdb3eb60fa5a0ad2f14d1988c2fa5a) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "atronic u6.bin", 0x0000, 0x020000, CRC(9742b2d8) SHA1(9f5851c78f92055730b834de18f8dc7bd9b29a37) ) + ROM_LOAD( "atronic u6.bin", 0x000000, 0x020000, CRC(9742b2d8) SHA1(9f5851c78f92055730b834de18f8dc7bd9b29a37) ) // VERSION=CK-RDW_-A-C - ROM_REGION32_LE( 0x800000, "user1", ROMREGION_ERASE00 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", ROMREGION_ERASE00 ) // TMS34020APCM-40 code (34020) ROM_REGION( 0x400000, "u18u21",ROMREGION_ERASE00 ) // sound ROM_REGION( 0x400000, "pals",ROMREGION_ERASE00 ) // pal (converted from JED) - DISK_REGION( "cdrom" ) // some kind of PC based utlities for these games.. + DISK_REGION( "cdrom" ) // some kind of PC based utilities for these games.. DISK_IMAGE_READONLY_OPTIONAL( "atronic", 0,SHA1(3335e9f8f67f1b176e043f078456d2b13178b7ef) ) ROM_END + ROM_START( atronica ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "atronic u2.bin", 0x0000, 0x080000, CRC(ddcfa9ed) SHA1(008ffaf56ccdb3eb60fa5a0ad2f14d1988c2fa5a) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "atronic u2.bin", 0x000000, 0x080000, CRC(ddcfa9ed) SHA1(008ffaf56ccdb3eb60fa5a0ad2f14d1988c2fa5a) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "atronic u6 std.bin", 0x0000, 0x020000, CRC(9ef7ae79) SHA1(3ed0ea056b23cee8829421c2369ff869b370ee80) ) + ROM_LOAD( "atronic u6 std.bin", 0x000000, 0x020000, CRC(9ef7ae79) SHA1(3ed0ea056b23cee8829421c2369ff869b370ee80) ) // VERSION=CK-STD-A-A-STD_ - ROM_REGION32_LE( 0x800000, "user1", ROMREGION_ERASE00 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", ROMREGION_ERASE00 ) // TMS34020APCM-40 code (34020) ROM_REGION( 0x400000, "u18u21",ROMREGION_ERASE00 ) // sound ROM_REGION( 0x400000, "pals",ROMREGION_ERASE00 ) // pal (converted from JED) ROM_END +ROM_START( atronicb ) // assortment of setchips and config chips, needs verification + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "atronic reset cl", 0x000000, 0x080000, CRC(b6fc07c6) SHA1(9921cf9d9e95034d0353e9e72e4879449a261e21) ) + ROM_LOAD( "demo mode 4meg", 0x000000, 0x080000, CRC(79c31e59) SHA1(9e0f2ea4e8a6bce9840a70608bd4db2edbd01ef7) ) + ROM_LOAD( "masterreset.040", 0x000000, 0x080000, CRC(e6e58b97) SHA1(3250211255a280ff018e6c5912878d01fa3cfaff) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "atronic config key cl u2", 0x000000, 0x020000, CRC(062a7ee9) SHA1(562df047fcba0b9e2a26c7935cef5dade5b3f946) ) // VERSION=CK-ARI_-A-B + ROM_LOAD( "atronic ram clear", 0x000000, 0x020000, CRC(61fe0ce0) SHA1(682d4a99f777f7b7dd77fcc739a1f752ed602aa1) ) + ROM_LOAD( "u6 ck-rdw_-a-a", 0x000000, 0x020000, CRC(edff62cb) SHA1(9be8351e32f3e095abc0f304fe1609770890b833) ) // VERSION=CK-RDW_-A-A + ROM_LOAD( "u6 ck-rdw_-a-b", 0x000000, 0x020000, CRC(15bd42ec) SHA1(ff0bb157bf5d477befc71de11ff2a866cdbaecdf) ) // VERSION=CK-RDW_-A-B + + ROM_REGION32_LE( 0x800000, "user1", ROMREGION_ERASE00 ) // TMS34020APCM-40 code (34020) + ROM_REGION( 0x400000, "u18u21",ROMREGION_ERASE00 ) // sound + + ROM_REGION( 0x400000, "pals",ROMREGION_ERASE00 ) // pal (converted from JED) + ROM_LOAD( "galu35.bin", 0x000000, 0x0002e5, CRC(c81159c9) SHA1(36222e0a72310986fd4a76c0677a6bd74a0ad7df) ) +ROM_END + +// Atlantica (Russia) (set 1) ROM_START( atlantca ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2.8 o-atla01-abaaa-ca-rus", 0x0000, 0x100000, CRC(c3f2aa47) SHA1(eda0088bfaea7a9a341dd63ae587c989742c6630) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2.8 o-atla01-abaaa-ca-rus", 0x000000, 0x100000, CRC(c3f2aa47) SHA1(eda0088bfaea7a9a341dd63ae587c989742c6630) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6.1 atla01-a-zb-std-5-xx-xx-axx", 0x0000, 0x020000, CRC(5d09a4bf) SHA1(94aea5396a968ff659ac9e2f4879262c55eba2fe) ) + ROM_LOAD( "u6.1 atla01-a-zb-std-5-xx-xx-axx", 0x000000, 0x020000, CRC(5d09a4bf) SHA1(94aea5396a968ff659ac9e2f4879262c55eba2fe) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "u9.8 atla01-a-e-std-5", 0x000000, 0x100000, CRC(7f8210fa) SHA1(f71faee0d606c6aa06287f6ea31f41727e2a22d9) ) ROM_LOAD32_BYTE( "u11.8 atla01-a-e-std-5", 0x000001, 0x100000, CRC(af648717) SHA1(8ab57dc9962ed47a8beb03dcfc686c57de326793) ) ROM_LOAD32_BYTE( "u13.8 atla01-a-e-std-5", 0x000002, 0x100000, CRC(6e89bf2b) SHA1(0c3346a5da6c67bf2ef38cf657860dccb03a0461) ) @@ -674,18 +695,19 @@ ROM_START( atlantca ) ROM_LOAD( "u21.8 atla01-aa-a-std", 0x300000, 0x100000, CRC(a1bcd0a3) SHA1(0fd66c3bda92cead9457c35ce4b39f97293bb119) ) ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) - ROM_LOAD( "atlantica.bin", 0x0000, 0x0002dd, CRC(c3fdcd7d) SHA1(b56c859689e44689474142e537951c1cef40e46b) ) + ROM_LOAD( "atlantica.bin", 0x000000, 0x0002dd, CRC(c3fdcd7d) SHA1(b56c859689e44689474142e537951c1cef40e46b) ) ROM_END +// Atlantica (Russia) (set 2) ROM_START( atlantcaa ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(e4553537) SHA1(c61e708511c7790f7d7a7955378b8ceb975c2c55) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(e4553537) SHA1(c61e708511c7790f7d7a7955378b8ceb975c2c55) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6.1 atla01-a-zb-std-5-xx-xx-axx", 0x0000, 0x020000, CRC(5d09a4bf) SHA1(94aea5396a968ff659ac9e2f4879262c55eba2fe) ) + ROM_LOAD( "u6.1 atla01-a-zb-std-5-xx-xx-axx", 0x000000, 0x020000, CRC(5d09a4bf) SHA1(94aea5396a968ff659ac9e2f4879262c55eba2fe) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(1c51f9e1) SHA1(9300c80409f28ba55b94b93a3359fac732262b27) ) ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(b2b1f41f) SHA1(7551c7acc5c6c26b672e4a42d847ec9af79b50fe) ) ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(515820fa) SHA1(2f5def7145b45f8cd63d5463880a548e58e2b2d3) ) @@ -702,19 +724,45 @@ ROM_START( atlantcaa ) ROM_LOAD( "u21.8 atla01-aa-a-std", 0x300000, 0x100000, CRC(a1bcd0a3) SHA1(0fd66c3bda92cead9457c35ce4b39f97293bb119) ) ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) - ROM_LOAD( "atlantica.bin", 0x0000, 0x0002dd, CRC(c3fdcd7d) SHA1(b56c859689e44689474142e537951c1cef40e46b) ) + ROM_LOAD( "atlantica.bin", 0x000000, 0x0002dd, CRC(c3fdcd7d) SHA1(b56c859689e44689474142e537951c1cef40e46b) ) ROM_END - +// Babooshka ROM_START( baboshka ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(6084ca88) SHA1(608a23b4567271c89ed6a6b9e9a4999699a7b7a0) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "babooshka_u2_1a73.u2", 0x000000, 0x100000, CRC(b49d4c44) SHA1(fe533d6dbff95b4600ea1e68345097e1ae3d418d) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "babooshka_u6_f4ab.u6", 0x000000, 0x020000, CRC(8b0ccfd2) SHA1(abdc59ebddc9e4fc3aa5b723a746de1419f7d6e7) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "babooshka_u9_2830.u9", 0x000000, 0x100000, CRC(bbd0c880) SHA1(d249f701de2639f58aea35f4a19949708fa01f5e) ) + ROM_LOAD32_BYTE( "babooshka_u11_03bb.u11", 0x000001, 0x100000, CRC(3ac1eea2) SHA1(b43a1c93af1b8cfb13e5f9088308676ed17abbcc) ) + ROM_LOAD32_BYTE( "babooshka_u13_ed0c.u13", 0x000002, 0x100000, CRC(ece10619) SHA1(329dd7e64d84cd8d803fb6ec25f7ee4c65d3d1eb) ) + ROM_LOAD32_BYTE( "babooshka_u15_a406.u15", 0x000003, 0x100000, CRC(c5540973) SHA1(23e9faec39fefebc211c15444fdeb940f70344b2) ) + ROM_LOAD32_BYTE( "babooshka_u8_15d7.u8", 0x400000, 0x100000, CRC(d2bf54a6) SHA1(8226343f81c382190bf8ba38142a474c47b72fe2) ) + ROM_LOAD32_BYTE( "babooshka_u10_4868.u10", 0x400001, 0x100000, CRC(6e78855b) SHA1(1f1cee4ddeb58c854eb6e43191681e3dd7c0e377) ) + ROM_LOAD32_BYTE( "babooshka_u12_7f1b.u12", 0x400002, 0x100000, CRC(404ad088) SHA1(3b8caf927d36fccdbda53450a98cbd1b187094cc) ) + ROM_LOAD32_BYTE( "babooshka_u14_c087.u14", 0x400003, 0x100000, CRC(46a2b520) SHA1(7684672e8775aca8eb586148f1917963ef33dc5c) ) + + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "babooshka_u18_c845.u18", 0x000000, 0x100000, CRC(d26dfd1b) SHA1(7a1ddd4ac4429908997f14295d445586f2c9a26f) ) + ROM_LOAD( "babooshka_u19_8015.u19", 0x000000, 0x100000, CRC(273c7212) SHA1(0689fd7e3862d01f258fba9773f460ea4803d0a3) ) + ROM_LOAD( "babooshka_u20_7bc8.u20", 0x000000, 0x100000, CRC(a030de64) SHA1(fb3d73416e180dfc15c469eca499ee5060482f16) ) + ROM_LOAD( "babooshka_u21_9532.u21", 0x000000, 0x100000, CRC(ef05d889) SHA1(431f3a057aff474221f64a2fdee35ca328db42de) ) +ROM_END + + +// Babooshka (Russia) +ROM_START( baboshkar ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(6084ca88) SHA1(608a23b4567271c89ed6a6b9e9a4999699a7b7a0) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(8b0ccfd2) SHA1(abdc59ebddc9e4fc3aa5b723a746de1419f7d6e7) ) + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(8b0ccfd2) SHA1(abdc59ebddc9e4fc3aa5b723a746de1419f7d6e7) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(1a5d8a4f) SHA1(ff8160f000ecb032831ef4320b686fdd37c19bc9) ) ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(713e18c9) SHA1(eb14213101c3ee09601bf01000631c3a2509e876) ) ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(dfbc8c2f) SHA1(1ae2dcd572fa5fc31be5cdb7d6de2bced06ff94e) ) @@ -725,359 +773,377 @@ ROM_START( baboshka ) ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(b6343ede) SHA1(d19b2dc79c7b95cf09759709b422fb78008f5c37) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(d26dfd1b) SHA1(7a1ddd4ac4429908997f14295d445586f2c9a26f) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(273c7212) SHA1(0689fd7e3862d01f258fba9773f460ea4803d0a3) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(a030de64) SHA1(fb3d73416e180dfc15c469eca499ee5060482f16) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(ef05d889) SHA1(431f3a057aff474221f64a2fdee35ca328db42de) ) + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(d26dfd1b) SHA1(7a1ddd4ac4429908997f14295d445586f2c9a26f) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(273c7212) SHA1(0689fd7e3862d01f258fba9773f460ea4803d0a3) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(a030de64) SHA1(fb3d73416e180dfc15c469eca499ee5060482f16) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(ef05d889) SHA1(431f3a057aff474221f64a2fdee35ca328db42de) ) ROM_END -ROM_START( cfblue ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2.bin", 0x0000, 0x100000, CRC(0b5035d0) SHA1(f77ce0d16da39c259c0f764c23c23d0313166612) ) +// Beach Patrol (Russia) +ROM_START( beachpt ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u02_o_-wave-a-b-cb-rus_.bin", 0x000000, 0x100000, CRC(b26085fc) SHA1(19f350c46088b58438dfc234d4ac543105913286) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6.bin", 0x0000, 0x020000, CRC(63690e7e) SHA1(9dcb3d64bae03556875185ead23d9b911773f5bd) ) + ROM_LOAD( "u06_crp5bs1a.bin", 0x000000, 0x020000, CRC(0db0531d) SHA1(391e41b2dcd38669dcc24e938e9838feee972559) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9.bin", 0x000000, 0x100000, CRC(d1c2ad08) SHA1(e53c7e91b2ab86e64f4ae753404aa86ae881becf) ) - ROM_LOAD32_BYTE( "u11.bin", 0x000001, 0x100000, CRC(42872aef) SHA1(54d7cf6a9f3d5d8b2b14fa381fd7b9db974525e1) ) - ROM_LOAD32_BYTE( "u13.bin", 0x000002, 0x100000, CRC(7da9415b) SHA1(aaa73465417dcf92838021b37cb412d52ccb4d85) ) - ROM_LOAD32_BYTE( "u15.bin", 0x000003, 0x100000, CRC(e0270268) SHA1(6bf5281eb5418903403873547690bdfa04597fea) ) - ROM_LOAD32_BYTE( "u8.bin", 0x400000, 0x100000, CRC(a870d32c) SHA1(0014b9b2a2b35ae8a10ed2910213ccea50f8ba61) ) - ROM_LOAD32_BYTE( "u10.bin", 0x400001, 0x100000, CRC(f99ae371) SHA1(b468a18eb7604f191198aae68e961db97cae0332) ) - ROM_LOAD32_BYTE( "u12.bin", 0x400002, 0x100000, CRC(2b2fcd96) SHA1(ce4a8d1267874e5d615e8b3abbb4d1b16630ae7a) ) - ROM_LOAD32_BYTE( "u14.bin", 0x400003, 0x100000, CRC(d66b735c) SHA1(6c4c1e5b5b21b60e950cf70d2d6ad72d5b22237a) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u09_bep5a01d.bin", 0x000000, 0x100000, CRC(0f4614de) SHA1(2181c552e9a3669fda5e87d0c596d5534d24d4b3) ) + ROM_LOAD32_BYTE( "u11_bep5a01d.bin", 0x000001, 0x100000, CRC(4f8c6fee) SHA1(2b75fe948bddda899969ef4a7663a52dc7b0eb81) ) + ROM_LOAD32_BYTE( "u13_bep5a01d.bin", 0x000002, 0x100000, CRC(ca9a24e5) SHA1(67276f680f3aedf480c54c666f0db1110cd77aee) ) + ROM_LOAD32_BYTE( "u15_bep5a01d.bin", 0x000003, 0x100000, CRC(ac904dc8) SHA1(165f66423a9c9231baa4e8b2e465d7f10f61202d) ) + ROM_LOAD32_BYTE( "u08_bep5a01d.bin", 0x400000, 0x100000, CRC(1f19cba6) SHA1(201975c7b440d2f53439e7383fb49b921015f22c) ) + ROM_LOAD32_BYTE( "u10_bep5a01d.bin", 0x400001, 0x100000, CRC(940bb1b2) SHA1(a57d6e5d3872787ff1821cbc80032269b378ecf0) ) + ROM_LOAD32_BYTE( "u12_bep5a01d.bin", 0x400002, 0x100000, CRC(07851214) SHA1(d088243f11ba51c79796986e99f0aa34d0d697d6) ) + ROM_LOAD32_BYTE( "u14_bep5a01d.bin", 0x400003, 0x100000, CRC(16a5ce9c) SHA1(3551e6eb7ff34f9ea70b7e6e940044ea1b4c59bb) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18.bin", 0x0000, 0x100000, CRC(77d6c103) SHA1(667c4c77eeba3af9c8c772a9ffe2941f8f3df38f) ) - ROM_LOAD( "u19.bin", 0x0000, 0x100000, CRC(36371ef6) SHA1(83a454a71e01962937b23817419fe2e071f077ee) ) - ROM_LOAD( "u20.bin", 0x0000, 0x100000, CRC(d9548179) SHA1(12537373a6a3f79952d2c7c48d41e156fc578902) ) - ROM_LOAD( "u21.bin", 0x0000, 0x100000, CRC(3a620cc6) SHA1(1dced1a40c6b3d734ea463fe58bdd9ee9e3b8822) ) + ROM_LOAD( "u18_bep_aa_a.bin", 0x000000, 0x100000, CRC(a0c6dafd) SHA1(9a09224b2d91cbf4efad5563a7633b973b0e5ce1) ) + ROM_LOAD( "u19_bep_aa_a.bin", 0x000000, 0x100000, CRC(69f1f267) SHA1(4fa837bf285670ed26ed0f0dada5e2a54ca7f142) ) + ROM_LOAD( "u20_bep_aa_a.bin", 0x000000, 0x100000, CRC(3dc030aa) SHA1(f01305fb187ae150b1264e8b72439e638772fbcc) ) + ROM_LOAD( "u21_bep_aa_a.bin", 0x000000, 0x100000, CRC(791c809a) SHA1(68af52cb2032a0c3f76030681baaaac8fb0bf51b) ) ROM_END -ROM_START( cfbluea ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(4ee3805e) SHA1(45d9438a26230f50013feda1b2c68ab2f8d4f419) ) + +// Beetlemania +ROM_START( atrbtlma ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mu2.080", 0x000000, 0x100000, CRC(689901a5) SHA1(be9b1f799c108259d0f5c0e9e423b316bb390baf) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(0db0531d) SHA1(391e41b2dcd38669dcc24e938e9838feee972559) ) - ROM_LOAD( "u6low-10.bin", 0x0000, 0x020000, CRC(3cbad206) SHA1(d2a468d5bfd441b74ef85be088873d1f74d5c66e) ) + ROM_LOAD( "mu6.010", 0x000000, 0x020000, CRC(1912e0df) SHA1(3e864b5535bb24793d491e8ee74973f7612a3308) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(37b3a499) SHA1(eb3252185596dd513d3cce95f3425241ca8513ab) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(d98b2b1d) SHA1(414d300d113e9737d63efea09b358aeb8eeed7fc) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(478bb4a5) SHA1(94304fe1477bfc66e8dcf2c2c91226754cb8c32a) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(cfe9e4d4) SHA1(8cd4aadd885fc5500b0a2c1e41b1f096bd4cd2b5) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(39670383) SHA1(cd78289377c75497f96dd6b76dc717b2ddc8d9c6) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(f9d054ae) SHA1(244733f7ee6e82fef5d0245c3fd947d369b296f9) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(5e95768f) SHA1(ba616bf41a2bb205d366e19e773ee5f0009be212) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(89aaf76b) SHA1(6e731ba815c20b184e44495dd2231d9ae315a146) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.080", 0x000000, 0x100000, CRC(d3458270) SHA1(afb17ee1e568f66ac95c17afd3ae403019531caf) ) + ROM_LOAD32_BYTE( "u11.080", 0x000001, 0x100000, CRC(5a1ee58b) SHA1(8fb81a4e4d5bdd3892db33ad044137f2a43f877a) ) + ROM_LOAD32_BYTE( "u13.080", 0x000002, 0x100000, CRC(1948f27c) SHA1(414e6c507513524aa559c6cb2970f3b2d27b72a0) ) + ROM_LOAD32_BYTE( "u15.080", 0x000003, 0x100000, CRC(d1e734d8) SHA1(3b8fd88f9318ce8adc70dce93b20191f61cb0c45) ) + ROM_LOAD32_BYTE( "u8.080", 0x400000, 0x100000, CRC(075df52c) SHA1(4abd6d1080d93306fc4a741501255f56f24bef59) ) + ROM_LOAD32_BYTE( "u10.080", 0x400001, 0x100000, CRC(5eb6d001) SHA1(ae03e247995e83e355b37e477316654d157a15b6) ) + ROM_LOAD32_BYTE( "u12.080", 0x400002, 0x100000, CRC(d6a7df27) SHA1(0798de5f3676d56623933489a777795cd839a348) ) + ROM_LOAD32_BYTE( "u14.080", 0x400003, 0x100000, CRC(8c5a9df5) SHA1(81cfa3a548dc16b2e996b7e416abd43aa6f11e5f) ) - ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(77d6c103) SHA1(667c4c77eeba3af9c8c772a9ffe2941f8f3df38f) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(36371ef6) SHA1(83a454a71e01962937b23817419fe2e071f077ee) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(d9548179) SHA1(12537373a6a3f79952d2c7c48d41e156fc578902) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(3a620cc6) SHA1(1dced1a40c6b3d734ea463fe58bdd9ee9e3b8822) ) + // sound (missing or not needed here) + + ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) + ROM_LOAD( "galu35.bin", 0x000000, 0x0002e5, CRC(c81159c9) SHA1(36222e0a72310986fd4a76c0677a6bd74a0ad7df) ) ROM_END -ROM_START( cfgreen ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(2afda383) SHA1(8a1d1a780f710119cbf7ee6a53d5de91cfe120c2) ) +// Beetles Unplugged (Russia) +ROM_START( beetleup ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u02_0-beet-a-a-cc.0def.bin", 0x000000, 0x100000, CRC(b5eedf40) SHA1(40a9baac99e9844cef5d3922c853f5e4903a7833) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(3cbad206) SHA1(d2a468d5bfd441b74ef85be088873d1f74d5c66e) ) + ROM_LOAD( "u06_n5b0-a-04-b.65aa.bin", 0x000000, 0x020000, CRC(d68d08e4) SHA1(548577d43f4136cf16266fe6855898a30fa49965) ) + ROM_LOAD( "u06_n5b0-a-05-b.648f.bin", 0x000000, 0x020000, CRC(2d2ff35f) SHA1(97759fbad4b6b30ca8f8ea74da74cfaa433a7fa2) ) + ROM_LOAD( "u06_n5b0-a-06-b.64 56.bin", 0x000000, 0x020000, CRC(7b4a6a97) SHA1(e3d54476730ca34a9f7214219cf991a220e15d5c) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(19a47a1b) SHA1(ae9ad2027fddf96062833345a5e2b9e7101b3380) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(7d805f07) SHA1(0bb27a702e45d3d660363ac75c0f52f07248d40a) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(104110dc) SHA1(9322598a94e3c71f546da3b42f137a22fc78a894) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(c752e5b1) SHA1(98832603529c99d83885a9b72bf30aa5eb1eee93) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(63e91841) SHA1(a9644b4ed37c2143273e782bd0e85906466c1173) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(b198a826) SHA1(361f9a055633831f45b148ca5e23cbb9be97c95f) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(9eb176c4) SHA1(73dea223338235a3ebd224c210df4923dbb01b56) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(ad654d75) SHA1(31804c2fae178b2614759542cba1af34b82e5f12) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u09_7b88.bin", 0x000000, 0x100000, CRC(8443972b) SHA1(5f2eea84ba18a83502f36eeaa52cff49a1631668) ) + ROM_LOAD32_BYTE( "u11_1957.bin", 0x000001, 0x100000, CRC(36c7e5c5) SHA1(2bad0bb6b363af6a37f5b11c7ca8b3b674df4072) ) + ROM_LOAD32_BYTE( "u13_b661.bin", 0x000002, 0x100000, CRC(0e74726c) SHA1(3103d801a622315877fc09d9c99290b54b266885) ) + ROM_LOAD32_BYTE( "u15_fd57.bin", 0x000003, 0x100000, CRC(9eabc514) SHA1(ed89b068b381ad4e007352bddf3aebe10ebebf4a) ) + ROM_LOAD32_BYTE( "u08_5804.bin", 0x400000, 0x100000, CRC(65a020e3) SHA1(2bb781905338e2d444222095d8430137632fae3d) ) + ROM_LOAD32_BYTE( "u10_647c.bin", 0x400001, 0x100000, CRC(c46c064d) SHA1(6181cf0e1d53f0a79c266b4f87d3b0c32313c593) ) + ROM_LOAD32_BYTE( "u12_07f3.bin", 0x400002, 0x100000, CRC(cefdfdad) SHA1(2032e0942f52d025f8da225c31ca7f7121c7b7f8) ) + ROM_LOAD32_BYTE( "u14_fe27.bin", 0x400003, 0x100000, CRC(50cfd898) SHA1(8b881ae8c60f215bb0f75e14493ee4a0c9f2b364) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(40a74e38) SHA1(6ea3458c449434353bbc7d03bbd7a83294584603) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(6769a6c2) SHA1(5eddf6a86897b39a6c75462b5047d5175b543b18) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(9c3288a0) SHA1(feb3b9fefd38052a5fd2fcee6a653c6043ff1759) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(71367522) SHA1(0d82940ff87396e8722f8250cd4961d11dfa46a0) ) + ROM_LOAD( "u18_f978.bin", 0x000000, 0x100000, CRC(afa9a1a8) SHA1(a06bdd776ca7ba9e9ceecc0935761e6d88cad90e) ) + ROM_LOAD( "u19_8766.bin", 0x000000, 0x100000, CRC(f63ed18c) SHA1(59d05582bbd125009a6bc226ec0ef2120c768694) ) + ROM_LOAD( "u20_26f0.bin", 0x000000, 0x100000, CRC(39f8e6d9) SHA1(59cd29d08610f601e3228364ae52a4e49e325f40) ) + ROM_LOAD( "u21_ea59.bin", 0x000000, 0x100000, CRC(0bd2f188) SHA1(f29a67c3cd36e7ee6fd7ef72a7724dc9df5b5657) ) ROM_END -ROM_START( chicken ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(51430fa1) SHA1(cb4357cc0b5c05704c984c9ab373201612f7d340) ) +// Big Blue (Russia) +ROM_START( bigblue ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "o_-bbbu01-adbaa-cb-std_.8mu02.bin", 0x000000, 0x100000, CRC(62d08d90) SHA1(fa563dd59eacd3021744863245aa7f82dea2c266) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(bac68023) SHA1(fdc5d540ceb4a2d44013dfd59b46103ec6745dea) ) + ROM_LOAD( "big blue bags.bin", 0x000000, 0x020000, CRC(4ec3fc1c) SHA1(7a081d370c54a6ea333957958b1341560458e845) ) + ROM_LOAD( "bbbu01-c-za-std_-5-xx-xx-axx.1mu06.bin", 0x000000, 0x020000, CRC(09e6df0b) SHA1(85961160f95cb8d223f73483d6edad79fa37d729) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(1109b7d6) SHA1(c0f6f5d56ee95982688b595894a2985ef53629e7) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(5a1449f6) SHA1(3903858239223c37615f12a8db6a8e873722e34c) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(e1081c7a) SHA1(dd6390d64cda9af93093092361ca24b551d82549) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(2f3930db) SHA1(6dbc3b4c3d43fc6ecec6082dbb1e1d29df43d50e) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(d560038c) SHA1(dece84d3e0691d53806382091dfd540dee1a3cdf) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(5c6c3a8d) SHA1(43be71f50318d12e4d55b9e1df34b0bfdb719fdf) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(a5a119e2) SHA1(decac8c7cea764224ed7e2da8af4f551f99739e6) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(9008b8b3) SHA1(b4dd717f46018a7005eff5dc6655d3d473311c16) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu09.bin", 0x000000, 0x100000, CRC(6f11b908) SHA1(663382bc295615afbc3a9a39c7089470b8b55926) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu11.bin", 0x000001, 0x100000, CRC(4cddcb5a) SHA1(e23354ab36f814b22c39564111558d4935fe8d70) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu13.bin", 0x000002, 0x100000, CRC(3a6dd649) SHA1(0f2b6cdf4f10ded99adc4fe0b47e4fada4aa6643) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu15.bin", 0x000003, 0x100000, CRC(2efd2269) SHA1(3923ec31e245c29786cd67a89d582bc051967580) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu08.bin", 0x400000, 0x100000, CRC(32f01864) SHA1(f515cfa2ecdc239b441f6f5f7033516e88030ad6) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu10.bin", 0x400001, 0x100000, CRC(97efddfd) SHA1(1303733596b725b705fa9dfd4150b4a6df9d4172) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu12.bin", 0x400002, 0x100000, CRC(36c4f212) SHA1(1e7ea33114f1ca836849242d717023b1315a466e) ) + ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu14.bin", 0x400003, 0x100000, CRC(bde8af9e) SHA1(095e567d35c45ae5e377cdf07ab77f6781e39cca) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(12c922c1) SHA1(d463328a203667dad42a7cbfb6853289095fa4c9) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(5e9c8810) SHA1(711c85a81dc61290fc43b56ccd955b4e46caee32) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(4ce349e4) SHA1(4499e570211aeed44db93a7c3b7b5d0b4390b0ca) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(6c7343cf) SHA1(28c282857f0c29198865444061fcf37e84697cf7) ) + ROM_LOAD( "bbbu01-ba-a-std_-_.8su18.bin", 0x000000, 0x100000, CRC(451687c9) SHA1(5165586a7ab69529396e4b387002e1dcbe3d892d) ) + ROM_LOAD( "bbbu01-ba-a-std_-_.8su19.bin", 0x000000, 0x100000, CRC(bb0029ec) SHA1(ab460d40ee46ee43b195b7a2ece42bcaaa043892) ) + ROM_LOAD( "bbbu01-ba-a-std_-_.8su20.bin", 0x000000, 0x100000, CRC(fb1bd294) SHA1(78dcaffc56f56d2b31d0c20d48d91696910be160) ) + ROM_LOAD( "bbbu01-ba-a-std_-_.8su21.bin", 0x000000, 0x100000, CRC(ec6d68ea) SHA1(91167b6379a6e1748e635c4b2b603a39fb6b049d) ) ROM_END -ROM_START( aclown ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(162915c4) SHA1(333d2ac8323eaaa0c7b85804b7d4ceef347118d1) ) +// Bonus Poker +ROM_START( atrbonpk ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mb-u2.bin", 0x000000, 0x80000, CRC(7f9d9d3c) SHA1(501d3f1482b3c67cbc94a3af40ef31fb5a6e7921) ) - ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(ab86b3d4) SHA1(b0d32887674f971a3ccd482775ec3f978a2ea0c1) ) + ROM_REGION( 0x080000, "u6", 0 ) // config? + ROM_LOAD( "mb-u6.bin", 0x000000, 0x080000, CRC(0b8d47ba) SHA1(aa1d5b37c330f4f44c1af5caca24bbf670c0bbcb) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(8bcbb27f) SHA1(d953268213580af11a2cc0dbd8bf1652f97f3929) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(73fb3169) SHA1(8bbe5d8b8898e2d3368506e7b66d05b8f8ac7d02) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(47580998) SHA1(37a6e409618aa3fe7d24bd3580fa93269895b059) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(948e3737) SHA1(43225f114a3ae66caf95821a1e8a01f1a129e38d) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(b4607b04) SHA1(81eff1246c68017e123fbfa46b4b8234808727d7) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(df875d3b) SHA1(262ec7db996f13fa32d17c1c5d0c89c2f98ca1cc) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(dbab3a76) SHA1(a85b76ade2d410cbbee7a62de96bed333ce23dc3) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(f3a6bbd5) SHA1(5a9e81ee9ce533b3ab1aeaa4ca9185f5bf0b2a65) ) + ROM_REGION( 0x2e5, "mbpals", 0 ) + ROM_LOAD( "mb-u22-d.bin", 0x000, 0x117, CRC(dc097847) SHA1(305294284d0ffd578f9115b836ef1f9e906c1599) ) + ROM_LOAD( "mb-u32-i.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8)) + ROM_LOAD( "mb-u35-poke-s6366.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) - ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(c3efd917) SHA1(7f675c27d616a489c22544e98f726a62cfcb1bdf) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(a6e90bbf) SHA1(4aa4746b3d474caf653396171b42b56a3e16caa3) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(fef1ae8e) SHA1(efc5c289be052c56b5cb7976da25bd5bfacd97fc) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(47108677) SHA1(864f767c54c0f9ff63fad3829e828abbd5e84f0b) ) -ROM_END + ROM_REGION( 0x117, "gfxpals", 0 ) + ROM_LOAD( "u2-f.bin", 0x000, 0x117, CRC(eb5548c2) SHA1(7ccc6a7de0c0765e0da3563f3ee83dd99acc50bf) ) + ROM_LOAD( "u3-i.bin", 0x000, 0x117, CRC(769f7b32) SHA1(72df7c92367403a95c5bda3d6a643cc8fc24e153) ) + ROM_LOAD( "u4-c.bin", 0x000, 0x117, CRC(91e043ea) SHA1(d4d0c721c6c37cbe8babe148bc9887038cdf4820) ) + ROM_LOAD( "u5-a.bin", 0x000, 0x117, CRC(18ffc746) SHA1(e32dd74fb535fd4a754579173a788712b3e6ec30) ) + ROM_LOAD( "u6-b.bin", 0x000, 0x117, CRC(2750fb0a) SHA1(3814c4755a215073425a9d6bb048315498962c76) ) + ROM_LOAD( "u7-a.bin", 0x000, 0x117, CRC(adcb2789) SHA1(cc2ebd69abec73d66665faaec19b8706e539b34c) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.bin", 0x400000, 0x080000, CRC(5b8450f1) SHA1(27fc771c3fb824cdb845237324984778fcd0a737) ) + ROM_LOAD32_BYTE( "u11.bin", 0x400001, 0x080000, CRC(c8c52bd1) SHA1(081b8b4c46f18d030329bf519a8ed50385f7c062) ) + ROM_LOAD32_BYTE( "u13.bin", 0x400002, 0x080000, CRC(23164a85) SHA1(e6de6aac28f1dac9ea908aaab9760b56ded1bb91) ) + ROM_LOAD32_BYTE( "u15.bin", 0x400003, 0x080000, CRC(aabbb4ff) SHA1(4a13475929141a4824b15347873cf330f7f7b0d0) ) + ROM_LOAD32_BYTE( "u8.bin", 0x600000, 0x080000, CRC(d6dfde87) SHA1(f3221adecb67ee593d52a1bbbdcee78dde497dbd) ) + ROM_LOAD32_BYTE( "u10.bin", 0x600001, 0x080000, CRC(d81a1f77) SHA1(c3ec3a06dacc3f528c9bcfa7a18e25e0126b1d85) ) + ROM_LOAD32_BYTE( "u12.bin", 0x600002, 0x080000, CRC(4b24dc03) SHA1(f875f09c6d44821b169e111cb1ea3d9716746d5f) ) + ROM_LOAD32_BYTE( "u14.bin", 0x600003, 0x080000, CRC(a6dc78ff) SHA1(96457601e7f90ce14a88765f70accc07d7236d30) ) + + // no dedicated sound ROM board present in cage, missing or not needed here? there is an OKI M6585 on the mainboard +ROM_END -ROM_START( goldglen ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(94c48e59) SHA1(b660d81f1659004e08df402ef9da61a1f4818b48) ) +// Castaway (Russia) (set 1) +ROM_START( castaway ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2.8 o-cast-b-a-cc", 0x000000, 0x100000, CRC(8f103bb3) SHA1(65596aff9cfb2345a36a0e2a2b03a2b4310d421c) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(94409a39) SHA1(99af058e48147fc75a8c23e4f1a28484f3d5f625) ) + ROM_LOAD( "u6.1 c5bo-a-03-a", 0x000000, 0x020000, CRC(3917302a) SHA1(39b0672c36554712825a0e310522933be4b46d84) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(01e69d2d) SHA1(a6e6974aec52931aeeb1f90d8f917ab85ebe843e) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(6c39a180) SHA1(95f91ec10961d36c86dee5ce42fc7c8ab693e271) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(e60a093f) SHA1(fa0af661f869f80e11097e101ec6100a75d1e63f) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(9877e8aa) SHA1(2073d451446709d92700cf4afb68e5b04580c620) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(631d617c) SHA1(44cbd9a8275537f2f8804b1d17645f74cd12fdb1) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(cdd5e435) SHA1(659b29ab16d5a3878e4984599e83f8d1cf377ca7) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(dcb50d70) SHA1(7f8c36d5dea9c3ce61c31aef7b310f546095d72e) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(6c0277b1) SHA1(266c6eb08cb3d9e49cf397a7e01785627892200e) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.8 cw5_b-03-b", 0x000000, 0x100000, CRC(c49aaf25) SHA1(5518312046208b4f912e9dee2ff24653a9976c6f) ) + ROM_LOAD32_BYTE( "u11.8 cw5_b-03-b", 0x000001, 0x100000, CRC(24267b4b) SHA1(9103923dd1bba0b01f6020f7c357ac9b7bef4951) ) + ROM_LOAD32_BYTE( "u13.8 cw5_b-03-b", 0x000002, 0x100000, CRC(3e606516) SHA1(5edad0a3099700bfeedff5a143591a85b3c4f582) ) + ROM_LOAD32_BYTE( "u15.8 cw5_b-03-b", 0x000003, 0x100000, CRC(7211abc5) SHA1(acaa9ad55abeb34e2d97b419f5213e44e80adde0) ) + ROM_LOAD32_BYTE( "u8.8 cw5_b-03-b", 0x400000, 0x100000, CRC(03839c9e) SHA1(56ad8843192ca47c1d467c69ab2d13189a19a905) ) + ROM_LOAD32_BYTE( "u10.8 cw5_b-03-b", 0x400001, 0x100000, CRC(cbe7399e) SHA1(da829dcab116b48a56526750546287e33d3de3c7) ) + ROM_LOAD32_BYTE( "u12.8 cw5_b-03-b", 0x400002, 0x100000, CRC(770e92de) SHA1(c358b0f528fc5c1efd2dd4a0563e958d90b55d64) ) + ROM_LOAD32_BYTE( "u14.8 cw5_b-03-b", 0x400003, 0x100000, CRC(dadd0d0b) SHA1(87750c506f6429f382149d205849663b622abda3) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(2afed5cf) SHA1(633214458cd47666675464fb3621aaffbe0ca63a) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(0bcaa5b2) SHA1(c964b7ec99cfc641f91c1a483e68999fc3e23fa4) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(e2aad0ee) SHA1(2678ae011a820da644e78e0c5d2a6af39c35ac4d) ) + ROM_LOAD( "u18.8 castaa_a", 0x000000, 0x100000, CRC(98b0a1f3) SHA1(2a6298a82dc549078857e43d60e692062b1cd022) ) + ROM_LOAD( "u19.8 castaa_a", 0x000000, 0x100000, CRC(2c7aa4a4) SHA1(7e495ce9e18ae759e9ecf21f55c6bc7c7b06a92d) ) + ROM_LOAD( "u20.8 castaa_a", 0x000000, 0x100000, CRC(cbb5824d) SHA1(626fd9c0f76942c7c040743519e2af867afed75a) ) + ROM_LOAD( "u21.8 castaa_a", 0x000000, 0x100000, CRC(31554b6b) SHA1(6af8dc72e0fcec7f73b54b728f8c61a51f5f0d48) ) ROM_END -ROM_START( iccash ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(27b1c41e) SHA1(55a24301578b2d4e46948362aab8bfbb2918169a) ) +// Castaway (Russia) (set 2) +ROM_START( castawaya ) // bad dump? (ROMs all look incorrect size to me) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u-2 m27c801.bin", 0x000000, 0x080000, CRC(55b61206) SHA1(abdbe887a6739dbc9f51838b31d23d3c8d8f03dd) ) - ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(5e7d8a05) SHA1(255355cf594c2818d358860e616b5b578a87e974) ) + ROM_REGION( 0x080000, "u6", 0 ) // config? + ROM_LOAD( "u-6 m27c801.bin", 0x000000, 0x080000, CRC(86538b30) SHA1(6b8d732b59af2cc1a6524989f8cf12a4d4dac484) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(db77fe46) SHA1(2502c5c165a9720e5ff1196eaa17189281c3145c) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(3a512c6c) SHA1(ba8592773d71e57b3dc6aaff7df1214a57429b10) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(75fadda8) SHA1(5a968f10e582fbe74000f3de33dc1e2d07c3fec1) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(10e5a8e7) SHA1(e91de378c9485dce080d2d00a923e75f8be30f9a) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(0ac57377) SHA1(cbbac3434b5b46f30abe880990300bf0a0393557) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(03c67464) SHA1(d5a1e657140a31c3f77c6490bcf35075d0546b71) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(622992ef) SHA1(6a31212436dcda308f1f78abff714bbd97df71ef) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(ce62e7f9) SHA1(af9eeb7bdb76870e914f1233c9fd496d6c33a615) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + // seem to be half size, doesn't have the TMS vectors + ROM_LOAD32_BYTE( "u-9 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(4a5efe38) SHA1(23e82eeadccdd0224858686b1d96bd5d184904cb) ) + ROM_LOAD32_BYTE( "u-11 m27c801.bin", 0x000001, 0x080000, BAD_DUMP CRC(099e27e2) SHA1(4419ac8090ccab673e61f4f73c837971e341e7e2) ) + ROM_LOAD32_BYTE( "u-13 m27c801.bin", 0x000002, 0x080000, BAD_DUMP CRC(f65eb71f) SHA1(9e116cc2b6768c1525759735eecc05db5906f2dc) ) + ROM_LOAD32_BYTE( "u-15 m27c801.bin", 0x000003, 0x080000, BAD_DUMP CRC(319c8bb6) SHA1(8de3c66b375f0ff200ff240765c6f37609c4935e) ) + ROM_LOAD32_BYTE( "u-8 m27c801.bin", 0x400000, 0x080000, BAD_DUMP CRC(74e21aeb) SHA1(dce3b413c6efdc2d85357dd1f9e4e2808aef4f7e) ) + ROM_LOAD32_BYTE( "u-10 m27c801.bin", 0x400001, 0x080000, BAD_DUMP CRC(45294960) SHA1(1b5b33ef730c44a4800e80891369d4e21e1729d2) ) + ROM_LOAD32_BYTE( "u-12 m27c801.bin", 0x400002, 0x080000, BAD_DUMP CRC(be19a02c) SHA1(8968d4ec5ff58dcf50c3c9ac9601c6416399091d) ) + ROM_LOAD32_BYTE( "u-14 m27c801.bin", 0x400003, 0x080000, BAD_DUMP CRC(cda73f12) SHA1(dd5556d7e19ef1a9fec1b914a7464fbc4f97effe) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(8e322415) SHA1(14685d1f426187d1fbe878713cd60ece177fdd1b) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(8ce5ba46) SHA1(012d8686291d9078be8a489e21180681ace06b8b) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(be59025d) SHA1(b64c707129c1418833c1b5601d0a194c2e29d9a8) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(d6b79eae) SHA1(a128adbca125f3811edc8c7042bf41b45dc61083) ) + ROM_LOAD( "u-18 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(2e3d7181) SHA1(eed1a1594405f416efb379e134c12be89d495402) ) + ROM_LOAD( "u-19 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(a3c906f6) SHA1(25314d79f420c177424bf1de492ba8d9a928f643) ) + ROM_LOAD( "u-20 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(ec395eaa) SHA1(fa27b928971c039fb1586631f136bd7577be1c57) ) + ROM_LOAD( "u-21 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(324d0539) SHA1(71639e3fc40c09e07221524580046dc2447b43f1) ) + + ROM_REGION( 0x400000, "others", 0 ) + ROM_LOAD( "ds1225y.bin", 0x000000, 0x002000, CRC(76af0395) SHA1(ce6aef5349b155f8e103bb4dd33933c501a490ae) ) + ROM_LOAD( "ds1386-32k.bin", 0x000000, 0x002000, CRC(4e28ebc9) SHA1(dfd60c53ffdd0b44b7f894e19b212bc88e81192f) ) ROM_END -ROM_START( shpinxii ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-80.bin", 0x0000, 0x100000, CRC(943d35a7) SHA1(17ead3a7f084b5e384f99903f57360ff9e133026) ) +// Chicken (Russia) +ROM_START( chicken ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(51430fa1) SHA1(cb4357cc0b5c05704c984c9ab373201612f7d340) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-10.bin", 0x0000, 0x020000, CRC(4d37999a) SHA1(678dc788cfe00ab2599df08941660324793d7f6c) ) - ROM_LOAD( "sphinx ii.bin", 0x0000, 0x020000, CRC(7fae09a6) SHA1(5c26798337d3691d81f853ee447cb7119fce7b14) ) + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(bac68023) SHA1(fdc5d540ceb4a2d44013dfd59b46103ec6745dea) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(c54e4e07) SHA1(1249494773dae044a7bb4381b084e3d2e14367d7) ) - ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(5c1e82ab) SHA1(f22ba1dc6799388e855d8f3064b96d568619a75b) ) - ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(fb49ae3e) SHA1(bf0cb5815639ebc3db3333249ab2ed81d3bdc684) ) - ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(ac741fb5) SHA1(a52eaa4a43cd522885d5d9b024c0646279dffe25) ) - ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(ca4c1626) SHA1(6a883f713272ea70fd0757f9d0e07379925973a3) ) - ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(b64deef1) SHA1(b3c4baef7137af5b25402cec474f92333d93e727) ) - ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(cf5a97b7) SHA1(6cb490a5a0c9e908593beff3aee374eddef19a5f) ) - ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(98730028) SHA1(86b782bea8caf33dab9656c93856fc345977f7cc) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(1109b7d6) SHA1(c0f6f5d56ee95982688b595894a2985ef53629e7) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(5a1449f6) SHA1(3903858239223c37615f12a8db6a8e873722e34c) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(e1081c7a) SHA1(dd6390d64cda9af93093092361ca24b551d82549) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(2f3930db) SHA1(6dbc3b4c3d43fc6ecec6082dbb1e1d29df43d50e) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(d560038c) SHA1(dece84d3e0691d53806382091dfd540dee1a3cdf) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(5c6c3a8d) SHA1(43be71f50318d12e4d55b9e1df34b0bfdb719fdf) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(a5a119e2) SHA1(decac8c7cea764224ed7e2da8af4f551f99739e6) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(9008b8b3) SHA1(b4dd717f46018a7005eff5dc6655d3d473311c16) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-80.bin", 0x0000, 0x100000, CRC(52da6133) SHA1(51ba2c586ffeddca1d8e345c644525cbccffdba8) ) - ROM_LOAD( "u19-80.bin", 0x0000, 0x100000, CRC(3aed50bc) SHA1(c7abc91dbddf9bccac9cc9a5b73fbd9b22878ca9) ) - ROM_LOAD( "u20-80.bin", 0x0000, 0x100000, CRC(0a8ac239) SHA1(7d58abaff09a7e61d1380121d085a5601549e908) ) - ROM_LOAD( "u21-80.bin", 0x0000, 0x100000, CRC(d4621e8d) SHA1(6ec49c52b88e648dbe2fe3c47868946369d717cf) ) + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(12c922c1) SHA1(d463328a203667dad42a7cbfb6853289095fa4c9) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(5e9c8810) SHA1(711c85a81dc61290fc43b56ccd955b4e46caee32) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(4ce349e4) SHA1(4499e570211aeed44db93a7c3b7b5d0b4390b0ca) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(6c7343cf) SHA1(28c282857f0c29198865444061fcf37e84697cf7) ) ROM_END - - - -ROM_START( beachpt ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u02_o_-wave-a-b-cb-rus_.bin", 0x0000, 0x100000, CRC(b26085fc) SHA1(19f350c46088b58438dfc234d4ac543105913286) ) +// Chickendales +ROM_START( chicdale ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mu2.040", 0x000000, 0x100000, CRC(2f2670b4) SHA1(3530a3f0f149da0221e1c25351f62de0e8e6a2b7) ) + ROM_LOAD( "chick_u2_0e52.u2", 0x000000, 0x100000, CRC(c213b510) SHA1(9549f16a2bbfc735d55b908adad59283abf1b221) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u06_crp5bs1a.bin", 0x0000, 0x020000, CRC(0db0531d) SHA1(391e41b2dcd38669dcc24e938e9838feee972559) ) + ROM_LOAD( "mu6.010", 0x000000, 0x020000, CRC(bac68023) SHA1(fdc5d540ceb4a2d44013dfd59b46103ec6745dea) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u09_bep5a01d.bin", 0x000000, 0x100000, CRC(0f4614de) SHA1(2181c552e9a3669fda5e87d0c596d5534d24d4b3) ) - ROM_LOAD32_BYTE( "u11_bep5a01d.bin", 0x000001, 0x100000, CRC(4f8c6fee) SHA1(2b75fe948bddda899969ef4a7663a52dc7b0eb81) ) - ROM_LOAD32_BYTE( "u13_bep5a01d.bin", 0x000002, 0x100000, CRC(ca9a24e5) SHA1(67276f680f3aedf480c54c666f0db1110cd77aee) ) - ROM_LOAD32_BYTE( "u15_bep5a01d.bin", 0x000003, 0x100000, CRC(ac904dc8) SHA1(165f66423a9c9231baa4e8b2e465d7f10f61202d) ) - ROM_LOAD32_BYTE( "u08_bep5a01d.bin", 0x400000, 0x100000, CRC(1f19cba6) SHA1(201975c7b440d2f53439e7383fb49b921015f22c) ) - ROM_LOAD32_BYTE( "u10_bep5a01d.bin", 0x400001, 0x100000, CRC(940bb1b2) SHA1(a57d6e5d3872787ff1821cbc80032269b378ecf0) ) - ROM_LOAD32_BYTE( "u12_bep5a01d.bin", 0x400002, 0x100000, CRC(07851214) SHA1(d088243f11ba51c79796986e99f0aa34d0d697d6) ) - ROM_LOAD32_BYTE( "u14_bep5a01d.bin", 0x400003, 0x100000, CRC(16a5ce9c) SHA1(3551e6eb7ff34f9ea70b7e6e940044ea1b4c59bb) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.080", 0x000000, 0x100000, CRC(9b74ec99) SHA1(99834a3ad4ccbd594ae9de0edde7920619bcad5e) ) + ROM_LOAD32_BYTE( "u11.080", 0x000001, 0x100000, CRC(1b783bf7) SHA1(7018ce74b67370fdf679646d049a64569e7d1906) ) + ROM_LOAD32_BYTE( "u13.080", 0x000002, 0x100000, CRC(f21780da) SHA1(b40ee4de5d7b68bd723affecc9160bd78198390e) ) + ROM_LOAD32_BYTE( "u15.080", 0x000003, 0x100000, CRC(e62e2d2d) SHA1(b06443f0a67f93b3cc8f18fc3b1bdce54ba2c792) ) + ROM_LOAD32_BYTE( "u8.080", 0x400000, 0x100000, CRC(7f2f9e2b) SHA1(ecbf5fc17ea45fd47f6b2a87ee0cd4b8e63eb5b8) ) + ROM_LOAD32_BYTE( "u10.080", 0x400001, 0x100000, CRC(631e4449) SHA1(4b0da20238523efd0235fc95bbf6eea0a0866ca1) ) + ROM_LOAD32_BYTE( "u12.080", 0x400002, 0x100000, CRC(b927f5dc) SHA1(5c9af46b54b7e919ffc0098114bee6fbcc45167a) ) + ROM_LOAD32_BYTE( "u14.080", 0x400003, 0x100000, CRC(6d0f1d70) SHA1(d096ac8b501e3a6664c3042f86aa03fe35626b09) ) - ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18_bep_aa_a.bin", 0x0000, 0x100000, CRC(a0c6dafd) SHA1(9a09224b2d91cbf4efad5563a7633b973b0e5ce1) ) - ROM_LOAD( "u19_bep_aa_a.bin", 0x0000, 0x100000, CRC(69f1f267) SHA1(4fa837bf285670ed26ed0f0dada5e2a54ca7f142) ) - ROM_LOAD( "u20_bep_aa_a.bin", 0x0000, 0x100000, CRC(3dc030aa) SHA1(f01305fb187ae150b1264e8b72439e638772fbcc) ) - ROM_LOAD( "u21_bep_aa_a.bin", 0x0000, 0x100000, CRC(791c809a) SHA1(68af52cb2032a0c3f76030681baaaac8fb0bf51b) ) -ROM_END + // sound (missing or not needed here?) + ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) + ROM_LOAD( "galu35.bin", 0x000000, 0x0002e5, CRC(c81159c9) SHA1(36222e0a72310986fd4a76c0677a6bd74a0ad7df) ) +ROM_END -ROM_START( beetleup ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u02_0-beet-a-a-cc.0def.bin", 0x0000, 0x100000, CRC(b5eedf40) SHA1(40a9baac99e9844cef5d3922c853f5e4903a7833) ) +// Clown (Russia) +ROM_START( aclown ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mu2.040", 0x000000, 0x100000, CRC(162915c4) SHA1(333d2ac8323eaaa0c7b85804b7d4ceef347118d1) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u06_n5b0-a-04-b.65aa.bin", 0x0000, 0x020000, CRC(d68d08e4) SHA1(548577d43f4136cf16266fe6855898a30fa49965) ) - ROM_LOAD( "u06_n5b0-a-05-b.648f.bin", 0x0000, 0x020000, CRC(2d2ff35f) SHA1(97759fbad4b6b30ca8f8ea74da74cfaa433a7fa2) ) - ROM_LOAD( "u06_n5b0-a-06-b.64 56.bin", 0x0000, 0x020000, CRC(7b4a6a97) SHA1(e3d54476730ca34a9f7214219cf991a220e15d5c) ) + ROM_LOAD( "mu6.010", 0x000000, 0x020000, CRC(ab86b3d4) SHA1(b0d32887674f971a3ccd482775ec3f978a2ea0c1) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u09_7b88.bin", 0x000000, 0x100000, CRC(8443972b) SHA1(5f2eea84ba18a83502f36eeaa52cff49a1631668) ) - ROM_LOAD32_BYTE( "u11_1957.bin", 0x000001, 0x100000, CRC(36c7e5c5) SHA1(2bad0bb6b363af6a37f5b11c7ca8b3b674df4072) ) - ROM_LOAD32_BYTE( "u13_b661.bin", 0x000002, 0x100000, CRC(0e74726c) SHA1(3103d801a622315877fc09d9c99290b54b266885) ) - ROM_LOAD32_BYTE( "u15_fd57.bin", 0x000003, 0x100000, CRC(9eabc514) SHA1(ed89b068b381ad4e007352bddf3aebe10ebebf4a) ) - ROM_LOAD32_BYTE( "u08_5804.bin", 0x400000, 0x100000, CRC(65a020e3) SHA1(2bb781905338e2d444222095d8430137632fae3d) ) - ROM_LOAD32_BYTE( "u10_647c.bin", 0x400001, 0x100000, CRC(c46c064d) SHA1(6181cf0e1d53f0a79c266b4f87d3b0c32313c593) ) - ROM_LOAD32_BYTE( "u12_07f3.bin", 0x400002, 0x100000, CRC(cefdfdad) SHA1(2032e0942f52d025f8da225c31ca7f7121c7b7f8) ) - ROM_LOAD32_BYTE( "u14_fe27.bin", 0x400003, 0x100000, CRC(50cfd898) SHA1(8b881ae8c60f215bb0f75e14493ee4a0c9f2b364) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(8bcbb27f) SHA1(d953268213580af11a2cc0dbd8bf1652f97f3929) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(73fb3169) SHA1(8bbe5d8b8898e2d3368506e7b66d05b8f8ac7d02) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(47580998) SHA1(37a6e409618aa3fe7d24bd3580fa93269895b059) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(948e3737) SHA1(43225f114a3ae66caf95821a1e8a01f1a129e38d) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(b4607b04) SHA1(81eff1246c68017e123fbfa46b4b8234808727d7) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(df875d3b) SHA1(262ec7db996f13fa32d17c1c5d0c89c2f98ca1cc) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(dbab3a76) SHA1(a85b76ade2d410cbbee7a62de96bed333ce23dc3) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(f3a6bbd5) SHA1(5a9e81ee9ce533b3ab1aeaa4ca9185f5bf0b2a65) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18_f978.bin", 0x0000, 0x100000, CRC(afa9a1a8) SHA1(a06bdd776ca7ba9e9ceecc0935761e6d88cad90e) ) - ROM_LOAD( "u19_8766.bin", 0x0000, 0x100000, CRC(f63ed18c) SHA1(59d05582bbd125009a6bc226ec0ef2120c768694) ) - ROM_LOAD( "u20_26f0.bin", 0x0000, 0x100000, CRC(39f8e6d9) SHA1(59cd29d08610f601e3228364ae52a4e49e325f40) ) - ROM_LOAD( "u21_ea59.bin", 0x0000, 0x100000, CRC(0bd2f188) SHA1(f29a67c3cd36e7ee6fd7ef72a7724dc9df5b5657) ) + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(c3efd917) SHA1(7f675c27d616a489c22544e98f726a62cfcb1bdf) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(a6e90bbf) SHA1(4aa4746b3d474caf653396171b42b56a3e16caa3) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(fef1ae8e) SHA1(efc5c289be052c56b5cb7976da25bd5bfacd97fc) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(47108677) SHA1(864f767c54c0f9ff63fad3829e828abbd5e84f0b) ) ROM_END - -ROM_START( bigblue ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "o_-bbbu01-adbaa-cb-std_.8mu02.bin", 0x0000, 0x100000, CRC(62d08d90) SHA1(fa563dd59eacd3021744863245aa7f82dea2c266) ) +// Crazy Fruits Blue (Russia) (set 1) +ROM_START( cfblue ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2.bin", 0x000000, 0x100000, CRC(0b5035d0) SHA1(f77ce0d16da39c259c0f764c23c23d0313166612) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "big blue bags.bin", 0x0000, 0x020000, CRC(4ec3fc1c) SHA1(7a081d370c54a6ea333957958b1341560458e845) ) - ROM_LOAD( "bbbu01-c-za-std_-5-xx-xx-axx.1mu06.bin", 0x0000, 0x020000, CRC(09e6df0b) SHA1(85961160f95cb8d223f73483d6edad79fa37d729) ) + ROM_LOAD( "u6.bin", 0x000000, 0x020000, CRC(63690e7e) SHA1(9dcb3d64bae03556875185ead23d9b911773f5bd) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu09.bin", 0x000000, 0x100000, CRC(6f11b908) SHA1(663382bc295615afbc3a9a39c7089470b8b55926) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu11.bin", 0x000001, 0x100000, CRC(4cddcb5a) SHA1(e23354ab36f814b22c39564111558d4935fe8d70) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu13.bin", 0x000002, 0x100000, CRC(3a6dd649) SHA1(0f2b6cdf4f10ded99adc4fe0b47e4fada4aa6643) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu15.bin", 0x000003, 0x100000, CRC(2efd2269) SHA1(3923ec31e245c29786cd67a89d582bc051967580) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu08.bin", 0x400000, 0x100000, CRC(32f01864) SHA1(f515cfa2ecdc239b441f6f5f7033516e88030ad6) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu10.bin", 0x400001, 0x100000, CRC(97efddfd) SHA1(1303733596b725b705fa9dfd4150b4a6df9d4172) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu12.bin", 0x400002, 0x100000, CRC(36c4f212) SHA1(1e7ea33114f1ca836849242d717023b1315a466e) ) - ROM_LOAD32_BYTE( "bbbu01-a_-a-std_-5_.8gu14.bin", 0x400003, 0x100000, CRC(bde8af9e) SHA1(095e567d35c45ae5e377cdf07ab77f6781e39cca) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.bin", 0x000000, 0x100000, CRC(d1c2ad08) SHA1(e53c7e91b2ab86e64f4ae753404aa86ae881becf) ) + ROM_LOAD32_BYTE( "u11.bin", 0x000001, 0x100000, CRC(42872aef) SHA1(54d7cf6a9f3d5d8b2b14fa381fd7b9db974525e1) ) + ROM_LOAD32_BYTE( "u13.bin", 0x000002, 0x100000, CRC(7da9415b) SHA1(aaa73465417dcf92838021b37cb412d52ccb4d85) ) + ROM_LOAD32_BYTE( "u15.bin", 0x000003, 0x100000, CRC(e0270268) SHA1(6bf5281eb5418903403873547690bdfa04597fea) ) + ROM_LOAD32_BYTE( "u8.bin", 0x400000, 0x100000, CRC(a870d32c) SHA1(0014b9b2a2b35ae8a10ed2910213ccea50f8ba61) ) + ROM_LOAD32_BYTE( "u10.bin", 0x400001, 0x100000, CRC(f99ae371) SHA1(b468a18eb7604f191198aae68e961db97cae0332) ) + ROM_LOAD32_BYTE( "u12.bin", 0x400002, 0x100000, CRC(2b2fcd96) SHA1(ce4a8d1267874e5d615e8b3abbb4d1b16630ae7a) ) + ROM_LOAD32_BYTE( "u14.bin", 0x400003, 0x100000, CRC(d66b735c) SHA1(6c4c1e5b5b21b60e950cf70d2d6ad72d5b22237a) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "bbbu01-ba-a-std_-_.8su18.bin", 0x0000, 0x100000, CRC(451687c9) SHA1(5165586a7ab69529396e4b387002e1dcbe3d892d) ) - ROM_LOAD( "bbbu01-ba-a-std_-_.8su19.bin", 0x0000, 0x100000, CRC(bb0029ec) SHA1(ab460d40ee46ee43b195b7a2ece42bcaaa043892) ) - ROM_LOAD( "bbbu01-ba-a-std_-_.8su20.bin", 0x0000, 0x100000, CRC(fb1bd294) SHA1(78dcaffc56f56d2b31d0c20d48d91696910be160) ) - ROM_LOAD( "bbbu01-ba-a-std_-_.8su21.bin", 0x0000, 0x100000, CRC(ec6d68ea) SHA1(91167b6379a6e1748e635c4b2b603a39fb6b049d) ) + ROM_LOAD( "u18.bin", 0x000000, 0x100000, CRC(77d6c103) SHA1(667c4c77eeba3af9c8c772a9ffe2941f8f3df38f) ) + ROM_LOAD( "u19.bin", 0x000000, 0x100000, CRC(36371ef6) SHA1(83a454a71e01962937b23817419fe2e071f077ee) ) + ROM_LOAD( "u20.bin", 0x000000, 0x100000, CRC(d9548179) SHA1(12537373a6a3f79952d2c7c48d41e156fc578902) ) + ROM_LOAD( "u21.bin", 0x000000, 0x100000, CRC(3a620cc6) SHA1(1dced1a40c6b3d734ea463fe58bdd9ee9e3b8822) ) ROM_END -ROM_START( castaway ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2.8 o-cast-b-a-cc", 0x0000, 0x100000, CRC(8f103bb3) SHA1(65596aff9cfb2345a36a0e2a2b03a2b4310d421c) ) + +// Crazy Fruits Blue (Russia) (set 2) +ROM_START( cfbluea ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(4ee3805e) SHA1(45d9438a26230f50013feda1b2c68ab2f8d4f419) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6.1 c5bo-a-03-a", 0x0000, 0x020000, CRC(3917302a) SHA1(39b0672c36554712825a0e310522933be4b46d84) ) + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(0db0531d) SHA1(391e41b2dcd38669dcc24e938e9838feee972559) ) + ROM_LOAD( "u6low-10.bin", 0x000000, 0x020000, CRC(3cbad206) SHA1(d2a468d5bfd441b74ef85be088873d1f74d5c66e) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9.8 cw5_b-03-b", 0x000000, 0x100000, CRC(c49aaf25) SHA1(5518312046208b4f912e9dee2ff24653a9976c6f) ) - ROM_LOAD32_BYTE( "u11.8 cw5_b-03-b", 0x000001, 0x100000, CRC(24267b4b) SHA1(9103923dd1bba0b01f6020f7c357ac9b7bef4951) ) - ROM_LOAD32_BYTE( "u13.8 cw5_b-03-b", 0x000002, 0x100000, CRC(3e606516) SHA1(5edad0a3099700bfeedff5a143591a85b3c4f582) ) - ROM_LOAD32_BYTE( "u15.8 cw5_b-03-b", 0x000003, 0x100000, CRC(7211abc5) SHA1(acaa9ad55abeb34e2d97b419f5213e44e80adde0) ) - ROM_LOAD32_BYTE( "u8.8 cw5_b-03-b", 0x400000, 0x100000, CRC(03839c9e) SHA1(56ad8843192ca47c1d467c69ab2d13189a19a905) ) - ROM_LOAD32_BYTE( "u10.8 cw5_b-03-b", 0x400001, 0x100000, CRC(cbe7399e) SHA1(da829dcab116b48a56526750546287e33d3de3c7) ) - ROM_LOAD32_BYTE( "u12.8 cw5_b-03-b", 0x400002, 0x100000, CRC(770e92de) SHA1(c358b0f528fc5c1efd2dd4a0563e958d90b55d64) ) - ROM_LOAD32_BYTE( "u14.8 cw5_b-03-b", 0x400003, 0x100000, CRC(dadd0d0b) SHA1(87750c506f6429f382149d205849663b622abda3) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(37b3a499) SHA1(eb3252185596dd513d3cce95f3425241ca8513ab) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(d98b2b1d) SHA1(414d300d113e9737d63efea09b358aeb8eeed7fc) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(478bb4a5) SHA1(94304fe1477bfc66e8dcf2c2c91226754cb8c32a) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(cfe9e4d4) SHA1(8cd4aadd885fc5500b0a2c1e41b1f096bd4cd2b5) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(39670383) SHA1(cd78289377c75497f96dd6b76dc717b2ddc8d9c6) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(f9d054ae) SHA1(244733f7ee6e82fef5d0245c3fd947d369b296f9) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(5e95768f) SHA1(ba616bf41a2bb205d366e19e773ee5f0009be212) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(89aaf76b) SHA1(6e731ba815c20b184e44495dd2231d9ae315a146) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18.8 castaa_a", 0x0000, 0x100000, CRC(98b0a1f3) SHA1(2a6298a82dc549078857e43d60e692062b1cd022) ) - ROM_LOAD( "u19.8 castaa_a", 0x0000, 0x100000, CRC(2c7aa4a4) SHA1(7e495ce9e18ae759e9ecf21f55c6bc7c7b06a92d) ) - ROM_LOAD( "u20.8 castaa_a", 0x0000, 0x100000, CRC(cbb5824d) SHA1(626fd9c0f76942c7c040743519e2af867afed75a) ) - ROM_LOAD( "u21.8 castaa_a", 0x0000, 0x100000, CRC(31554b6b) SHA1(6af8dc72e0fcec7f73b54b728f8c61a51f5f0d48) ) + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(77d6c103) SHA1(667c4c77eeba3af9c8c772a9ffe2941f8f3df38f) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(36371ef6) SHA1(83a454a71e01962937b23817419fe2e071f077ee) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(d9548179) SHA1(12537373a6a3f79952d2c7c48d41e156fc578902) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(3a620cc6) SHA1(1dced1a40c6b3d734ea463fe58bdd9ee9e3b8822) ) ROM_END -ROM_START( castawaya ) // bad dump? (roms all look incorrect size to me) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u-2 m27c801.bin", 0x0000, 0x080000, CRC(55b61206) SHA1(abdbe887a6739dbc9f51838b31d23d3c8d8f03dd) ) - ROM_REGION( 0x080000, "u6", 0 ) // config? - ROM_LOAD( "u-6 m27c801.bin", 0x0000, 0x080000, CRC(86538b30) SHA1(6b8d732b59af2cc1a6524989f8cf12a4d4dac484) ) +// Crazy Fruits Green (Russia) +ROM_START( cfgreen ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(2afda383) SHA1(8a1d1a780f710119cbf7ee6a53d5de91cfe120c2) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - // seem to be half size, doesn't have the TMS vectors - ROM_LOAD32_BYTE( "u-9 m27c801.bin", 0x000000, 0x080000, BAD_DUMP CRC(4a5efe38) SHA1(23e82eeadccdd0224858686b1d96bd5d184904cb) ) - ROM_LOAD32_BYTE( "u-11 m27c801.bin", 0x000001, 0x080000, BAD_DUMP CRC(099e27e2) SHA1(4419ac8090ccab673e61f4f73c837971e341e7e2) ) - ROM_LOAD32_BYTE( "u-13 m27c801.bin", 0x000002, 0x080000, BAD_DUMP CRC(f65eb71f) SHA1(9e116cc2b6768c1525759735eecc05db5906f2dc) ) - ROM_LOAD32_BYTE( "u-15 m27c801.bin", 0x000003, 0x080000, BAD_DUMP CRC(319c8bb6) SHA1(8de3c66b375f0ff200ff240765c6f37609c4935e) ) - ROM_LOAD32_BYTE( "u-8 m27c801.bin", 0x400000, 0x080000, BAD_DUMP CRC(74e21aeb) SHA1(dce3b413c6efdc2d85357dd1f9e4e2808aef4f7e) ) - ROM_LOAD32_BYTE( "u-10 m27c801.bin", 0x400001, 0x080000, BAD_DUMP CRC(45294960) SHA1(1b5b33ef730c44a4800e80891369d4e21e1729d2) ) - ROM_LOAD32_BYTE( "u-12 m27c801.bin", 0x400002, 0x080000, BAD_DUMP CRC(be19a02c) SHA1(8968d4ec5ff58dcf50c3c9ac9601c6416399091d) ) - ROM_LOAD32_BYTE( "u-14 m27c801.bin", 0x400003, 0x080000, BAD_DUMP CRC(cda73f12) SHA1(dd5556d7e19ef1a9fec1b914a7464fbc4f97effe) ) + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(3cbad206) SHA1(d2a468d5bfd441b74ef85be088873d1f74d5c66e) ) - ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u-18 m27c801.bin", 0x0000, 0x080000, BAD_DUMP CRC(2e3d7181) SHA1(eed1a1594405f416efb379e134c12be89d495402) ) - ROM_LOAD( "u-19 m27c801.bin", 0x0000, 0x080000, BAD_DUMP CRC(a3c906f6) SHA1(25314d79f420c177424bf1de492ba8d9a928f643) ) - ROM_LOAD( "u-20 m27c801.bin", 0x0000, 0x080000, BAD_DUMP CRC(ec395eaa) SHA1(fa27b928971c039fb1586631f136bd7577be1c57) ) - ROM_LOAD( "u-21 m27c801.bin", 0x0000, 0x080000, BAD_DUMP CRC(324d0539) SHA1(71639e3fc40c09e07221524580046dc2447b43f1) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(19a47a1b) SHA1(ae9ad2027fddf96062833345a5e2b9e7101b3380) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(7d805f07) SHA1(0bb27a702e45d3d660363ac75c0f52f07248d40a) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(104110dc) SHA1(9322598a94e3c71f546da3b42f137a22fc78a894) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(c752e5b1) SHA1(98832603529c99d83885a9b72bf30aa5eb1eee93) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(63e91841) SHA1(a9644b4ed37c2143273e782bd0e85906466c1173) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(b198a826) SHA1(361f9a055633831f45b148ca5e23cbb9be97c95f) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(9eb176c4) SHA1(73dea223338235a3ebd224c210df4923dbb01b56) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(ad654d75) SHA1(31804c2fae178b2614759542cba1af34b82e5f12) ) - ROM_REGION( 0x400000, "others", 0 ) - ROM_LOAD( "ds1225y.bin", 0x0000, 0x002000, CRC(76af0395) SHA1(ce6aef5349b155f8e103bb4dd33933c501a490ae) ) - ROM_LOAD( "ds1386-32k.bin", 0x0000, 0x002000, CRC(4e28ebc9) SHA1(dfd60c53ffdd0b44b7f894e19b212bc88e81192f) ) + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(40a74e38) SHA1(6ea3458c449434353bbc7d03bbd7a83294584603) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(6769a6c2) SHA1(5eddf6a86897b39a6c75462b5047d5175b543b18) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(9c3288a0) SHA1(feb3b9fefd38052a5fd2fcee6a653c6043ff1759) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(71367522) SHA1(0d82940ff87396e8722f8250cd4961d11dfa46a0) ) ROM_END +// Dancing Spirit (Russia) ROM_START( dncsprt ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "o_-dasp01-adaaa-cc-std_.8mu02", 0x0000, 0x100000, CRC(744b40d7) SHA1(f7b3f507ccccb36ae55ac3b567956c45a83d3b63) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "o_-dasp01-adaaa-cc-std_.8mu02", 0x000000, 0x100000, CRC(744b40d7) SHA1(f7b3f507ccccb36ae55ac3b567956c45a83d3b63) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "dasp01-d-za-std_-5-xx-xx-axx.1mu06", 0x0000, 0x020000, CRC(2d5f7976) SHA1(77de321ba2f46726a0c26aa498a4c3deb7f8c421) ) + ROM_LOAD( "dasp01-d-za-std_-5-xx-xx-axx.1mu06", 0x000000, 0x020000, CRC(2d5f7976) SHA1(77de321ba2f46726a0c26aa498a4c3deb7f8c421) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "dasp01-a_-c-std_-5_.8gu09", 0x000000, 0x100000, CRC(e6941863) SHA1(c9fe08bd070c9fac7b8c9089a6ecbff581265b3a) ) ROM_LOAD32_BYTE( "dasp01-a_-c-std_-5_.8gu11", 0x000001, 0x100000, CRC(400b82ab) SHA1(5af6daf65e50b0c5ad27c43b0f3d4d8d24f38102) ) ROM_LOAD32_BYTE( "dasp01-a_-c-std_-5_.8gu13", 0x000002, 0x100000, CRC(b425a8f6) SHA1(82d8e0d8602a81c6d4cf528b73f3c84ab5dde11b) ) @@ -1088,21 +1154,48 @@ ROM_START( dncsprt ) ROM_LOAD32_BYTE( "dasp01-a_-c-std_-5_.8gu14", 0x400003, 0x100000, CRC(b6dd4982) SHA1(45ff8232eb965ad60e4cf066ab3addb532b39b56) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "dasp01-aa-a-std_-_.8su18", 0x0000, 0x100000, CRC(65aeacb0) SHA1(97bbdb4e70e50c14ecb2cc18756c581a2069715f) ) - ROM_LOAD( "dasp01-aa-a-std_-_.8su19", 0x0000, 0x100000, CRC(0f81c833) SHA1(5568c92484c2b52b04034d99a7531a78bc1d5eb1) ) - ROM_LOAD( "dasp01-aa-a-std_-_.8su20", 0x0000, 0x100000, CRC(97302d05) SHA1(4a03d337a5e46f9b5686d1e16fa72f83cf4674f0) ) - ROM_LOAD( "dasp01-aa-a-std_-_.8su21", 0x0000, 0x100000, CRC(849e86f9) SHA1(cba1379b4cef793fc08c20607867d01c53d397a4) ) + ROM_LOAD( "dasp01-aa-a-std_-_.8su18", 0x000000, 0x100000, CRC(65aeacb0) SHA1(97bbdb4e70e50c14ecb2cc18756c581a2069715f) ) + ROM_LOAD( "dasp01-aa-a-std_-_.8su19", 0x000000, 0x100000, CRC(0f81c833) SHA1(5568c92484c2b52b04034d99a7531a78bc1d5eb1) ) + ROM_LOAD( "dasp01-aa-a-std_-_.8su20", 0x000000, 0x100000, CRC(97302d05) SHA1(4a03d337a5e46f9b5686d1e16fa72f83cf4674f0) ) + ROM_LOAD( "dasp01-aa-a-std_-_.8su21", 0x000000, 0x100000, CRC(849e86f9) SHA1(cba1379b4cef793fc08c20607867d01c53d397a4) ) ROM_END + +// Dream Maker ROM_START( drmmake ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2-801", 0x0000, 0x100000, CRC(c809ecf0) SHA1(4ab641f9b805cd13d1fb860a3e9776505474a95d) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mu2.080", 0x000000, 0x100000, CRC(cf54db9e) SHA1(79ad505c766bcdd51e08ff43c0221c14c9f519df) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6-1001", 0x0000, 0x020000, CRC(7a00ad2a) SHA1(67d90b10b4f62922c4ed94bb8a0f77e474ee385d) ) - ROM_LOAD( "dream maker.bin", 0x0000, 0x020000, CRC(49c19eb3) SHA1(a55d4f9a0dd2b1db41fb28f475efa7e9f7c85be6) ) + ROM_LOAD( "mu6.010", 0x000000, 0x020000, CRC(7a00ad2a) SHA1(67d90b10b4f62922c4ed94bb8a0f77e474ee385d) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9.080", 0x000000, 0x100000, CRC(6a453363) SHA1(228652e3915b6d8c1a5523acc77caa65b0c61a1f) ) + ROM_LOAD32_BYTE( "u11.080", 0x000001, 0x100000, CRC(81185cbd) SHA1(0367f0d9c6adf13be4f74863463ed8570209658b) ) + ROM_LOAD32_BYTE( "u13.080", 0x000002, 0x100000, CRC(96c7434f) SHA1(0ed6b3a905d811e9069de446f26b22050d305d7b) ) + ROM_LOAD32_BYTE( "u15.080", 0x000003, 0x100000, CRC(0f8b4209) SHA1(e9f1e03446e9252b843273879e647bf85ed6e1ac) ) + ROM_LOAD32_BYTE( "u8.080", 0x400000, 0x100000, CRC(3975a3da) SHA1(2e2e0647984f38341f6a647964792e60b0b63cd4) ) + ROM_LOAD32_BYTE( "u10.080", 0x400001, 0x100000, CRC(72288580) SHA1(72c430747453df09b3bf13cd1cf044de18ab1333) ) + ROM_LOAD32_BYTE( "u12.080", 0x400002, 0x100000, CRC(2c657b56) SHA1(7377fd4a5e7bd64ece9bb68db993be5a308d9bc8) ) + ROM_LOAD32_BYTE( "u14.080", 0x400003, 0x100000, CRC(146a9774) SHA1(426184154b6ae89a8e659e6a4fdb433a3ce6c449) ) + + // sound (missing or not needed here? there is an OKI M6585 on the mainboard) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) + ROM_LOAD( "galu35.bin", 0x000000, 0x0002e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) +ROM_END + + +// Dream Maker (Russia) +ROM_START( drmmaker ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-801", 0x000000, 0x100000, CRC(c809ecf0) SHA1(4ab641f9b805cd13d1fb860a3e9776505474a95d) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6-1001", 0x000000, 0x020000, CRC(7a00ad2a) SHA1(67d90b10b4f62922c4ed94bb8a0f77e474ee385d) ) + ROM_LOAD( "dream maker.bin", 0x000000, 0x020000, CRC(49c19eb3) SHA1(a55d4f9a0dd2b1db41fb28f475efa7e9f7c85be6) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "u9-801", 0x000000, 0x100000, CRC(e560eeff) SHA1(fe33927a91be7ecd2a283bb09b87f5f3d659cf09) ) ROM_LOAD32_BYTE( "u11-801", 0x000001, 0x100000, CRC(693cec8e) SHA1(83d33603fa11aa4341a40b2ffc4862992307dcfc) ) ROM_LOAD32_BYTE( "u13-801", 0x000002, 0x100000, CRC(8b78f6aa) SHA1(74804c44124b71f0f11446da342d0548130394f6) ) @@ -1113,23 +1206,146 @@ ROM_START( drmmake ) ROM_LOAD32_BYTE( "u14-801", 0x400003, 0x100000, CRC(416bcc36) SHA1(9e550f49ba63335b21f45786b87aa6e5b42f2acb) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18-801", 0x0000, 0x100000, CRC(ee2dabf6) SHA1(8fbace51d38d354318d223f259e5b5ae9d922ec5) ) - ROM_LOAD( "u19-801", 0x0000, 0x100000, CRC(bb0029ec) SHA1(ab460d40ee46ee43b195b7a2ece42bcaaa043892) ) - ROM_LOAD( "u20-801", 0x0000, 0x100000, CRC(d9fe585c) SHA1(d5e6d407ce67e7d536a68fcfe834c66cf365716d) ) - ROM_LOAD( "u21-801", 0x0000, 0x100000, CRC(d5e81837) SHA1(ebbd5a3a73c3f440e518103da7e8db8c0818f351) ) + ROM_LOAD( "u18-801", 0x000000, 0x100000, CRC(ee2dabf6) SHA1(8fbace51d38d354318d223f259e5b5ae9d922ec5) ) + ROM_LOAD( "u19-801", 0x000000, 0x100000, CRC(bb0029ec) SHA1(ab460d40ee46ee43b195b7a2ece42bcaaa043892) ) + ROM_LOAD( "u20-801", 0x000000, 0x100000, CRC(d9fe585c) SHA1(d5e6d407ce67e7d536a68fcfe834c66cf365716d) ) + ROM_LOAD( "u21-801", 0x000000, 0x100000, CRC(d5e81837) SHA1(ebbd5a3a73c3f440e518103da7e8db8c0818f351) ) ROM_END +// Golden Glenn (Russia) +ROM_START( goldglen ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(94c48e59) SHA1(b660d81f1659004e08df402ef9da61a1f4818b48) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(94409a39) SHA1(99af058e48147fc75a8c23e4f1a28484f3d5f625) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(01e69d2d) SHA1(a6e6974aec52931aeeb1f90d8f917ab85ebe843e) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(6c39a180) SHA1(95f91ec10961d36c86dee5ce42fc7c8ab693e271) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(e60a093f) SHA1(fa0af661f869f80e11097e101ec6100a75d1e63f) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(9877e8aa) SHA1(2073d451446709d92700cf4afb68e5b04580c620) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(631d617c) SHA1(44cbd9a8275537f2f8804b1d17645f74cd12fdb1) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(cdd5e435) SHA1(659b29ab16d5a3878e4984599e83f8d1cf377ca7) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(dcb50d70) SHA1(7f8c36d5dea9c3ce61c31aef7b310f546095d72e) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(6c0277b1) SHA1(266c6eb08cb3d9e49cf397a7e01785627892200e) ) + + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(2afed5cf) SHA1(633214458cd47666675464fb3621aaffbe0ca63a) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(0bcaa5b2) SHA1(c964b7ec99cfc641f91c1a483e68999fc3e23fa4) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(e2aad0ee) SHA1(2678ae011a820da644e78e0c5d2a6af39c35ac4d) ) +ROM_END + + +// Happy Happy Hippy +ROM_START( haphippy ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "hippy_u2_618c.u2", 0x000000, 0x80000, CRC(36600001) SHA1(906647a7901a4bbf7a347580d8a6d49d0378ed86) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "hippy_u6_e8a7.u6", 0x000000, 0x020000, CRC(16c84599) SHA1(af14cb98c95fad16424f1f9582fcede10f187ef0) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + // No TMS34020 code or sound data? + ROM_LOAD32_BYTE( "haphippy.u9", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u11", 0x000001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u13", 0x000002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u15", 0x000003, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u8", 0x400000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u10", 0x400001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u12", 0x400002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "haphippy.u14", 0x400003, 0x100000, NO_DUMP ) +ROM_END + + +// I C Cash (Russia) +ROM_START( iccash ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(27b1c41e) SHA1(55a24301578b2d4e46948362aab8bfbb2918169a) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(5e7d8a05) SHA1(255355cf594c2818d358860e616b5b578a87e974) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(db77fe46) SHA1(2502c5c165a9720e5ff1196eaa17189281c3145c) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(3a512c6c) SHA1(ba8592773d71e57b3dc6aaff7df1214a57429b10) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(75fadda8) SHA1(5a968f10e582fbe74000f3de33dc1e2d07c3fec1) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(10e5a8e7) SHA1(e91de378c9485dce080d2d00a923e75f8be30f9a) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(0ac57377) SHA1(cbbac3434b5b46f30abe880990300bf0a0393557) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(03c67464) SHA1(d5a1e657140a31c3f77c6490bcf35075d0546b71) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(622992ef) SHA1(6a31212436dcda308f1f78abff714bbd97df71ef) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(ce62e7f9) SHA1(af9eeb7bdb76870e914f1233c9fd496d6c33a615) ) + + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(8e322415) SHA1(14685d1f426187d1fbe878713cd60ece177fdd1b) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(8ce5ba46) SHA1(012d8686291d9078be8a489e21180681ace06b8b) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(be59025d) SHA1(b64c707129c1418833c1b5601d0a194c2e29d9a8) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(d6b79eae) SHA1(a128adbca125f3811edc8c7042bf41b45dc61083) ) +ROM_END + + +// I C Money (set 1) +ROM_START( atricmon ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mb-u2.bin", 0x000000, 0x80000, CRC(0fc3f42f) SHA1(53d189205ede16bc0199a6163a11eb39c2e3f2f1) ) + + ROM_REGION( 0x040000, "u6", 0 ) // config? + ROM_LOAD( "mb-u6.bin", 0x000000, 0x040000, CRC(eb8d3b4f) SHA1(598fb921026685ccfdb0b1804d92b3c6b3313ff4) ) + + ROM_REGION( 0x2e5, "mbpals", 0 ) + ROM_LOAD( "mb-u22-d.bin", 0x000, 0x117, CRC(dc097847) SHA1(305294284d0ffd578f9115b836ef1f9e906c1599) ) + ROM_LOAD( "mb-u32-d.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) + ROM_LOAD( "mb-u35-65994077_icm-s.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "gb-u9.bin", 0x000000, 0x100000, CRC(eff83f95) SHA1(743f2fb0dd84a83387919db70175aa62f5f6f858) ) + ROM_LOAD32_BYTE( "gb-u11.bin", 0x000001, 0x100000, CRC(3fc27ae9) SHA1(896da175c11b48fb28dbb0678849b8f167cf5f6e) ) + ROM_LOAD32_BYTE( "gb-u13.bin", 0x000002, 0x100000, CRC(6ad50f67) SHA1(b32781f06acc3e9929467d6d1212cf0dc757e5b3) ) + ROM_LOAD32_BYTE( "gb-u15.bin", 0x000003, 0x100000, CRC(6ae46bb3) SHA1(edc51f9a885c483283edb9b0873b980727205a91) ) + ROM_LOAD32_BYTE( "gb-u8.bin", 0x400000, 0x100000, CRC(7dee3392) SHA1(718333ad5552351702e95a76cc2b61f7c3bf14ac) ) + ROM_LOAD32_BYTE( "gb-u10.bin", 0x400001, 0x100000, CRC(db88f900) SHA1(83638b46fd7b6e4229fa5295479c9763c2f690c0) ) + ROM_LOAD32_BYTE( "gb-u12.bin", 0x400002, 0x100000, CRC(fcbada90) SHA1(3206409c9a689e196694831ff5e6ba0fd32d676a) ) + ROM_LOAD32_BYTE( "gb-u14.bin", 0x400003, 0x100000, CRC(055c7ed6) SHA1(8b8f537b8dfd898d2f9eb123303f9488a6ae4567) ) + + // no dedicated sound ROM board present in cage, missing or not needed here? there is an OKI M6585 on the mainboard +ROM_END + + +// I C Money (set 2) +ROM_START( atricmona ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2.040", 0x000000, 0x80000, CRC(0c047e55) SHA1(73805271a73aa6a573164625801e021b22b1bfaf) ) + + ROM_REGION( 0x040000, "u6", 0 ) // config? + ROM_LOAD( "u6.020", 0x000000, 0x040000, CRC(87f0c657) SHA1(fc537474de157c304d35c852fc15d392753df356) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + // No TMS34020 code or sound data? + ROM_LOAD32_BYTE( "atricmona.u9", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u11", 0x000001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u13", 0x000002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u15", 0x000003, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u8", 0x400000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u10", 0x400001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u12", 0x400002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "atricmona.u14", 0x400003, 0x100000, NO_DUMP ) + + ROM_REGION( 0x400000, "pals", 0 ) // pal (converted from JED) + ROM_LOAD( "u35.bin", 0x000000, 0x0002dd, CRC(6c7f3f2a) SHA1(826e5b6bddbc77a19713345c82e388a994c23262) ) +ROM_END +// Jumping Jackpots (Russia) ROM_START( jumpjkpt ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "o_-jujp01-abaaa-ca-std_u02.bin", 0x0000, 0x100000, CRC(d384b881) SHA1(0816fd33578b28c605978dd306b110c421bf5793) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "o_-jujp01-abaaa-ca-std_u02.bin", 0x000000, 0x100000, CRC(d384b881) SHA1(0816fd33578b28c605978dd306b110c421bf5793) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "jujp01-a-za-std_-5_u06.bin", 0x0000, 0x020000, CRC(0f19b0c1) SHA1(c118215bcf502287277c34e6f389af70ab945674) ) + ROM_LOAD( "jujp01-a-za-std_-5_u06.bin", 0x000000, 0x020000, CRC(0f19b0c1) SHA1(c118215bcf502287277c34e6f389af70ab945674) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "jujp01-a_-b-std_-5_u09.bin", 0x000000, 0x100000, CRC(7d3cb293) SHA1(e9f102620f01309327678e115e206fd29dcffde6) ) ROM_LOAD32_BYTE( "jujp01-a_-b-std_-5_u11.bin", 0x000001, 0x100000, CRC(d92c0c7e) SHA1(680032b81e76c74539ff56f8c5fc7d4d16fd4793) ) ROM_LOAD32_BYTE( "jujp01-a_-b-std_-5_u13.bin", 0x000002, 0x100000, CRC(555ced70) SHA1(1ec115a2e2a1c171070775913a3eb831efc81dab) ) @@ -1140,22 +1356,22 @@ ROM_START( jumpjkpt ) ROM_LOAD32_BYTE( "jujp01-a_-b-std_-5_u14.bin", 0x400003, 0x100000, CRC(c4754688) SHA1(1bf172d28795a7313586e9874036be0f7864d7c2) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "jujp01-aa-a-std_-_u18.bin", 0x0000, 0x100000, CRC(fe453a28) SHA1(ec39ac2bd8c7014f61a8db1a8896c771532b6d3b) ) - ROM_LOAD( "jujp01-aa-a-std_-_u19.bin", 0x0000, 0x100000, CRC(273c7212) SHA1(0689fd7e3862d01f258fba9773f460ea4803d0a3) ) - ROM_LOAD( "jujp01-aa-a-std_-_u20.bin", 0x0000, 0x100000, CRC(45290607) SHA1(f7af3cf323c7e9c3b1f86b230e73012c56fbf103) ) - ROM_LOAD( "jujp01-aa-a-std_-_u21.bin", 0x0000, 0x100000, CRC(ca8d5cf5) SHA1(17202eb6235ecbfd6301269fe36887c078fd6292) ) + ROM_LOAD( "jujp01-aa-a-std_-_u18.bin", 0x000000, 0x100000, CRC(fe453a28) SHA1(ec39ac2bd8c7014f61a8db1a8896c771532b6d3b) ) + ROM_LOAD( "jujp01-aa-a-std_-_u19.bin", 0x000000, 0x100000, CRC(273c7212) SHA1(0689fd7e3862d01f258fba9773f460ea4803d0a3) ) + ROM_LOAD( "jujp01-aa-a-std_-_u20.bin", 0x000000, 0x100000, CRC(45290607) SHA1(f7af3cf323c7e9c3b1f86b230e73012c56fbf103) ) + ROM_LOAD( "jujp01-aa-a-std_-_u21.bin", 0x000000, 0x100000, CRC(ca8d5cf5) SHA1(17202eb6235ecbfd6301269fe36887c078fd6292) ) ROM_END - +// Mushroom Magic (Russia) ROM_START( mushmagi ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "mb-u02.bin", 0x0000, 0x100000, CRC(bb36ee69) SHA1(3a9ce792941250277c5a8f53bd94f7c38b2e5130) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mb-u02.bin", 0x000000, 0x100000, CRC(bb36ee69) SHA1(3a9ce792941250277c5a8f53bd94f7c38b2e5130) ) ROM_REGION( 0x080000, "u6", 0 ) // config? - ROM_LOAD( "mb-u06.bin", 0x0000, 0x080000, CRC(10e3f3f6) SHA1(458f5be7ee01e361b4c31c099fc721521fbe3864) ) + ROM_LOAD( "mb-u06.bin", 0x000000, 0x080000, CRC(10e3f3f6) SHA1(458f5be7ee01e361b4c31c099fc721521fbe3864) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "gb-u09.bin", 0x000000, 0x100000, CRC(f2d82cee) SHA1(78a15f757bbbb1f4f0a5ab889a9807d886a543a8) ) ROM_LOAD32_BYTE( "gb-u11.bin", 0x000001, 0x100000, CRC(3ead238a) SHA1(21956bd6b24e3281db70b6d28d97ee7bbd9ae75f) ) ROM_LOAD32_BYTE( "gb-u13.bin", 0x000002, 0x100000, CRC(58c191e6) SHA1(b0f86f407958de2b8e0f5e61288f8b6c7a2c0c2f) ) @@ -1166,22 +1382,23 @@ ROM_START( mushmagi ) ROM_LOAD32_BYTE( "gb-u14.bin", 0x400003, 0x100000, CRC(952ada33) SHA1(976492f12db27cedc3219e29536a3256d7ae5675) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "sb-u18.bin", 0x0000, 0x100000, CRC(3ee4c1bd) SHA1(6885585ca1f40790eafac3161de3bcca9a2117c7) ) - ROM_LOAD( "sb-u19.bin", 0x0000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) - ROM_LOAD( "sb-u20.bin", 0x0000, 0x100000, CRC(f92276e5) SHA1(62628e9ef166607c42e873d116116dee6bf9b623) ) - ROM_LOAD( "sb-u21.bin", 0x0000, 0x100000, CRC(3c168653) SHA1(ce77851f64cf14e5b074f667d3a723097f78496f) ) + ROM_LOAD( "sb-u18.bin", 0x000000, 0x100000, CRC(3ee4c1bd) SHA1(6885585ca1f40790eafac3161de3bcca9a2117c7) ) + ROM_LOAD( "sb-u19.bin", 0x000000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) + ROM_LOAD( "sb-u20.bin", 0x000000, 0x100000, CRC(f92276e5) SHA1(62628e9ef166607c42e873d116116dee6bf9b623) ) + ROM_LOAD( "sb-u21.bin", 0x000000, 0x100000, CRC(3c168653) SHA1(ce77851f64cf14e5b074f667d3a723097f78496f) ) ROM_END +// Spell Master (Russia) ROM_START( splmastr ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "mb-u2 24e1.bin", 0x0000, 0x100000, CRC(e601e214) SHA1(7ff898245198350ea53ca1c3a71b491d55f60880) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mb-u2 24e1.bin", 0x000000, 0x100000, CRC(e601e214) SHA1(7ff898245198350ea53ca1c3a71b491d55f60880) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "mb-u6 ebda.bin", 0x0000, 0x020000, CRC(7e73e9c7) SHA1(a8b00af9a3bf936e54391a96777ac78773b3cee0) ) - ROM_LOAD( "speel master.bin", 0x0000, 0x020000, CRC(04168ab7) SHA1(70a387599bf6629a9a8a6ff38ed0d40e92e54504) ) + ROM_LOAD( "mb-u6 ebda.bin", 0x000000, 0x020000, CRC(7e73e9c7) SHA1(a8b00af9a3bf936e54391a96777ac78773b3cee0) ) + ROM_LOAD( "speel master.bin", 0x000000, 0x020000, CRC(04168ab7) SHA1(70a387599bf6629a9a8a6ff38ed0d40e92e54504) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "gb-u9 b408.bin", 0x000000, 0x100000, CRC(e7146c72) SHA1(21b143ae93a73dd59b652a0033ceaa9116575239) ) ROM_LOAD32_BYTE( "gb-u11 abf6.bin", 0x000001, 0x100000, CRC(de54f849) SHA1(b628a69c8ad5f81543cd78c458dd9348226114a7) ) ROM_LOAD32_BYTE( "gb-u13 6526.bin", 0x000002, 0x100000, CRC(e5744b4f) SHA1(8c36b087dc4fad6cd463abea5b1e7c0bd9c30074) ) @@ -1192,24 +1409,79 @@ ROM_START( splmastr ) ROM_LOAD32_BYTE( "gb-u14 f911.bin", 0x400003, 0x100000, CRC(6d77b13c) SHA1(dab85782a98cc5c21f236044dea0c7617b40469b) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "sb-u18 e1e5.bin", 0x0000, 0x100000, CRC(b0eb4ceb) SHA1(410990faeef6e371205a4344622b88d0db1e09e9) ) - ROM_LOAD( "sb-u19 7d08.bin", 0x0000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) - ROM_LOAD( "sb-u20 06ad.bin", 0x0000, 0x100000, CRC(fe354878) SHA1(44abb1a6ba5234c4909ef9f0a2f8b353b0695ff0) ) - ROM_LOAD( "sb-u21 4f56.bin", 0x0000, 0x100000, CRC(54d631a2) SHA1(1fe4278642b5c01e863af5c2ac7ee38d7c94d776) ) + ROM_LOAD( "sb-u18 e1e5.bin", 0x000000, 0x100000, CRC(b0eb4ceb) SHA1(410990faeef6e371205a4344622b88d0db1e09e9) ) + ROM_LOAD( "sb-u19 7d08.bin", 0x000000, 0x100000, CRC(70279081) SHA1(15933d81af85b2c6f831e765f2a4e4f0e44fdc18) ) + ROM_LOAD( "sb-u20 06ad.bin", 0x000000, 0x100000, CRC(fe354878) SHA1(44abb1a6ba5234c4909ef9f0a2f8b353b0695ff0) ) + ROM_LOAD( "sb-u21 4f56.bin", 0x000000, 0x100000, CRC(54d631a2) SHA1(1fe4278642b5c01e863af5c2ac7ee38d7c94d776) ) +ROM_END + + +// Sphinx II +ROM_START( sphinxii ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "sphinx2_3ab9.u2", 0x000000, 0x100000, CRC(5e29a69b) SHA1(fbbff1187390a27dd385c091bb69dc4d73c2a72f) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "sphinx2.u6", 0x000000, 0x020000, CRC(4d37999a) SHA1(678dc788cfe00ab2599df08941660324793d7f6c) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "gpg.u9", 0x000000, 0x100000, CRC(3714e7af) SHA1(5213207ef525367f82a1ce5e49751c2d987a05c9) ) + ROM_LOAD32_BYTE( "gpg.u11", 0x000001, 0x100000, CRC(9d7c4f17) SHA1(5ffe06a23642f3915087f6499bf83aec8ea7a4f2) ) + ROM_LOAD32_BYTE( "gpg.u13", 0x000002, 0x100000, CRC(07a167bd) SHA1(451e0fb2c268618f554f3782aad78056f66fbbbc) ) + ROM_LOAD32_BYTE( "gpg.u15", 0x000003, 0x100000, CRC(552ca8bf) SHA1(091c5fa821d33facda8810e3f3ed1ec0c84dd055) ) + ROM_LOAD32_BYTE( "gpg.u8", 0x400000, 0x100000, CRC(a719fd7f) SHA1(de09676375f21f816828fde8a6b7ae5ed741fc4c) ) + ROM_LOAD32_BYTE( "gpg.u10", 0x400001, 0x100000, CRC(9886a639) SHA1(752b759269a401493bce41590691feafe0bf2998) ) + ROM_LOAD32_BYTE( "gpg.u12", 0x400002, 0x100000, CRC(6f6dd839) SHA1(01ffa589df669ebe4825418617a532e128c5514d) ) + ROM_LOAD32_BYTE( "gpg.u14", 0x400003, 0x100000, NO_DUMP ) + + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "spxsndu18.080", 0x000000, 0x100000, CRC(52da6133) SHA1(51ba2c586ffeddca1d8e345c644525cbccffdba8) ) + ROM_LOAD( "spxsndu19.080", 0x000000, 0x100000, CRC(3aed50bc) SHA1(c7abc91dbddf9bccac9cc9a5b73fbd9b22878ca9) ) + ROM_LOAD( "spxsndu20.080", 0x000000, 0x100000, CRC(0a8ac239) SHA1(7d58abaff09a7e61d1380121d085a5601549e908) ) + ROM_LOAD( "spxsndu21.080", 0x000000, 0x100000, CRC(d4621e8d) SHA1(6ec49c52b88e648dbe2fe3c47868946369d717cf) ) ROM_END + +// Sphinx II (Russia) +ROM_START( sphinxiir ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2-80.bin", 0x000000, 0x100000, CRC(943d35a7) SHA1(17ead3a7f084b5e384f99903f57360ff9e133026) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6-10.bin", 0x000000, 0x020000, CRC(4d37999a) SHA1(678dc788cfe00ab2599df08941660324793d7f6c) ) + ROM_LOAD( "sphinx ii.bin", 0x000000, 0x020000, CRC(7fae09a6) SHA1(5c26798337d3691d81f853ee447cb7119fce7b14) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + ROM_LOAD32_BYTE( "u9-80.bin", 0x000000, 0x100000, CRC(c54e4e07) SHA1(1249494773dae044a7bb4381b084e3d2e14367d7) ) + ROM_LOAD32_BYTE( "u11-80.bin", 0x000001, 0x100000, CRC(5c1e82ab) SHA1(f22ba1dc6799388e855d8f3064b96d568619a75b) ) + ROM_LOAD32_BYTE( "u13-80.bin", 0x000002, 0x100000, CRC(fb49ae3e) SHA1(bf0cb5815639ebc3db3333249ab2ed81d3bdc684) ) + ROM_LOAD32_BYTE( "u15-80.bin", 0x000003, 0x100000, CRC(ac741fb5) SHA1(a52eaa4a43cd522885d5d9b024c0646279dffe25) ) + ROM_LOAD32_BYTE( "u8-80.bin", 0x400000, 0x100000, CRC(ca4c1626) SHA1(6a883f713272ea70fd0757f9d0e07379925973a3) ) + ROM_LOAD32_BYTE( "u10-80.bin", 0x400001, 0x100000, CRC(b64deef1) SHA1(b3c4baef7137af5b25402cec474f92333d93e727) ) + ROM_LOAD32_BYTE( "u12-80.bin", 0x400002, 0x100000, CRC(cf5a97b7) SHA1(6cb490a5a0c9e908593beff3aee374eddef19a5f) ) + ROM_LOAD32_BYTE( "u14-80.bin", 0x400003, 0x100000, CRC(98730028) SHA1(86b782bea8caf33dab9656c93856fc345977f7cc) ) + + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "u18-80.bin", 0x000000, 0x100000, CRC(52da6133) SHA1(51ba2c586ffeddca1d8e345c644525cbccffdba8) ) + ROM_LOAD( "u19-80.bin", 0x000000, 0x100000, CRC(3aed50bc) SHA1(c7abc91dbddf9bccac9cc9a5b73fbd9b22878ca9) ) + ROM_LOAD( "u20-80.bin", 0x000000, 0x100000, CRC(0a8ac239) SHA1(7d58abaff09a7e61d1380121d085a5601549e908) ) + ROM_LOAD( "u21-80.bin", 0x000000, 0x100000, CRC(d4621e8d) SHA1(6ec49c52b88e648dbe2fe3c47868946369d717cf) ) +ROM_END + + +// Taj Mahal (Russia) ROM_START( tajmah ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "ovtddfxe.8u2", 0x0000, 0x100000, CRC(83639f76) SHA1(f982222f8ae635c34413b316fe55de76fdc8535e) ) - ROM_LOAD( "vtddfxd.801", 0x0000, 0x100000, CRC(b0eb5468) SHA1(09e8ceca4cf3bea6447b9c9c0ee5776cbd32f098) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "ovtddfxe.8u2", 0x000000, 0x100000, CRC(83639f76) SHA1(f982222f8ae635c34413b316fe55de76fdc8535e) ) + ROM_LOAD( "vtddfxd.801", 0x000000, 0x100000, CRC(b0eb5468) SHA1(09e8ceca4cf3bea6447b9c9c0ee5776cbd32f098) ) ROM_REGION( 0x040000, "u6", 0 ) // config? - ROM_LOAD( "590f4-d.u6", 0x0000, 0x040000, CRC(b346765d) SHA1(567ae4fa740a4bd26485b72f3fd0e57d7a18512e) ) - ROM_LOAD( "t510f14b.2u6", 0x0000, 0x040000, CRC(ff6add95) SHA1(b1fa169e61a774d1ce5c0c1b4f80baa289ca696e) ) - ROM_LOAD( "t595f03c.2u6", 0x0000, 0x040000, CRC(b173164c) SHA1(91390cc2568de1c61df6b427bec9060fa7b0829a) ) - ROM_LOAD( "t595f07b.u6", 0x0000, 0x040000, CRC(7ef35e2f) SHA1(d2b4d392d66784900bf8413d4adbd1e37de11a67) ) + ROM_LOAD( "590f4-d.u6", 0x000000, 0x040000, CRC(b346765d) SHA1(567ae4fa740a4bd26485b72f3fd0e57d7a18512e) ) + ROM_LOAD( "t510f14b.2u6", 0x000000, 0x040000, CRC(ff6add95) SHA1(b1fa169e61a774d1ce5c0c1b4f80baa289ca696e) ) + ROM_LOAD( "t595f03c.2u6", 0x000000, 0x040000, CRC(b173164c) SHA1(91390cc2568de1c61df6b427bec9060fa7b0829a) ) + ROM_LOAD( "t595f07b.u6", 0x000000, 0x040000, CRC(7ef35e2f) SHA1(d2b4d392d66784900bf8413d4adbd1e37de11a67) ) - ROM_REGION16_LE( 0x800000, "user2", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION16_LE( 0x800000, "user2", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "t5_d01d.u9", 0x400000, 0x080000, CRC(d1a0e88b) SHA1(c68c9be2413725b698fccda74c120a732bc1b5ab) ) ROM_LOAD32_BYTE( "t5_d01d.u11", 0x400001, 0x080000, CRC(e063b35e) SHA1(54fb8831e4529b85740f22ddb181649ebfad8f03) ) ROM_LOAD32_BYTE( "t5_d01d.u13", 0x400002, 0x080000, CRC(9d3f04d2) SHA1(a6f6b564f7165aa992bc0dd8c090fa8cecd1953c) ) @@ -1219,7 +1491,7 @@ ROM_START( tajmah ) ROM_LOAD32_BYTE( "t5_d01d.u12", 0x600002, 0x080000, CRC(c2ca0b17) SHA1(cfd553f1943552620f6d324f767fd1f1957e8e25) ) ROM_LOAD32_BYTE( "t5_d01d.u14", 0x600003, 0x080000, CRC(0d512057) SHA1(f5f43dad25940193516d467725ecbe1989cc9003) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) - is this an alt set, or a 2nd video board? */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) - is this an alt set, or a 2nd video board? ROM_LOAD32_BYTE( "u9", 0x400000, 0x080000, CRC(157b9860) SHA1(6e04f035a945a63617e32b196fa0c1b6fd26b281) ) ROM_LOAD32_BYTE( "u11", 0x400001, 0x080000, CRC(6aa2cecc) SHA1(7b1d6bb81fed7413f69e926e7cefe1ee171453b4) ) ROM_LOAD32_BYTE( "u13", 0x400002, 0x080000, CRC(5c091b7a) SHA1(d1c758a6d155bbc7359f3f46a29bac44d96ec4b1) ) @@ -1232,27 +1504,28 @@ ROM_START( tajmah ) // sound (missing or not needed here? there is an OKI M6585 on the mainboard) /* ROM_REGION( 0x400000, "u18u21", 0 ) - ROM_LOAD( "u18", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u19", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u20", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u21", 0x0000, 0x100000, NO_DUMP ) + ROM_LOAD( "u18", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u19", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u20", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u21", 0x000000, 0x100000, NO_DUMP ) */ ROM_END +// Three Wishes Red (Russia) ROM_START( 3wishrd ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "3w-baca.8u2", 0x0000, 0x100000, CRC(14ca9f18) SHA1(8bf5eaa11ca70d14c7ed69a17c4610ecca6f76f8) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "3w-baca.8u2", 0x000000, 0x100000, CRC(14ca9f18) SHA1(8bf5eaa11ca70d14c7ed69a17c4610ecca6f76f8) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "3590a25a.1u6", 0x0000, 0x020000, CRC(8a10399e) SHA1(9658705821cdd39e1022a2b63dd61355d44c23f6) ) - ROM_LOAD( "3590a26a.1u6", 0x0000, 0x020000, CRC(86ec866d) SHA1(1fbcbfec49900e45ed7866857b0314de07020405) ) - ROM_LOAD( "35b0a03a.1u6", 0x0000, 0x020000, CRC(a25650d7) SHA1(72c1c58cf933c7b6fc85c071f48768e482e99ff7) ) - ROM_LOAD( "35b0a04a.1u6", 0x0000, 0x020000, CRC(36930b7c) SHA1(23d578450fc3185389058da367345ac20883b6f4) ) - ROM_LOAD( "three wishes.bin", 0x0000, 0x020000, CRC(37d85da7) SHA1(64db855e06dab5ea85c669bd72f1e8ee8856607a) ) - ROM_LOAD( "590a13a.1u6", 0x0000, 0x020000, CRC(3e674907) SHA1(ca933c416764ebf355d8e04f871f8421c9039078) ) - - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_LOAD( "3590a25a.1u6", 0x000000, 0x020000, CRC(8a10399e) SHA1(9658705821cdd39e1022a2b63dd61355d44c23f6) ) + ROM_LOAD( "3590a26a.1u6", 0x000000, 0x020000, CRC(86ec866d) SHA1(1fbcbfec49900e45ed7866857b0314de07020405) ) + ROM_LOAD( "35b0a03a.1u6", 0x000000, 0x020000, CRC(a25650d7) SHA1(72c1c58cf933c7b6fc85c071f48768e482e99ff7) ) + ROM_LOAD( "35b0a04a.1u6", 0x000000, 0x020000, CRC(36930b7c) SHA1(23d578450fc3185389058da367345ac20883b6f4) ) + ROM_LOAD( "three wishes.bin", 0x000000, 0x020000, CRC(37d85da7) SHA1(64db855e06dab5ea85c669bd72f1e8ee8856607a) ) + ROM_LOAD( "590a13a.1u6", 0x000000, 0x020000, CRC(3e674907) SHA1(ca933c416764ebf355d8e04f871f8421c9039078) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "tw5b01a.8u9", 0x000000, 0x100000, CRC(2410659a) SHA1(2bcd2539c0e3e7389c27c21e58d9199b9c7c742e) ) ROM_LOAD32_BYTE( "tw5b01a.u11", 0x000001, 0x100000, CRC(44ca9ce1) SHA1(b1c6d83f749202c072c6ce99c0470a31cfab8986) ) ROM_LOAD32_BYTE( "tw5b01a.u13", 0x000002, 0x100000, CRC(6c60097b) SHA1(f5ddb86b481b7b95d6ec151b37d662b583817813) ) @@ -1263,25 +1536,47 @@ ROM_START( 3wishrd ) ROM_LOAD32_BYTE( "tw5b01a.u14", 0x400003, 0x100000, CRC(85f30657) SHA1(e055e1fdeeab2fd82bb23b80416b421eb9143967) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "wishaaa.u18", 0x0000, 0x100000, CRC(c258c2c7) SHA1(900497e2e023e2ac1b62c5dabfaf95e5bf0b855b) ) - ROM_LOAD( "wishaaa.u19", 0x0000, 0x100000, CRC(09d186a9) SHA1(1d784fd3591583c99fac516a8c4cf47c3932d084) ) - ROM_LOAD( "wishaaa.u20", 0x0000, 0x100000, CRC(be187745) SHA1(c96458bbc9164a4ca3bca94f0ac5a4fe9f1b1dfa) ) - ROM_LOAD( "wishaaa.u21", 0x0000, 0x100000, CRC(466b34e1) SHA1(3f5236ea78bde8bfb998367e913f42d23b4c17f1) ) + ROM_LOAD( "wishaaa.u18", 0x000000, 0x100000, CRC(c258c2c7) SHA1(900497e2e023e2ac1b62c5dabfaf95e5bf0b855b) ) + ROM_LOAD( "wishaaa.u19", 0x000000, 0x100000, CRC(09d186a9) SHA1(1d784fd3591583c99fac516a8c4cf47c3932d084) ) + ROM_LOAD( "wishaaa.u20", 0x000000, 0x100000, CRC(be187745) SHA1(c96458bbc9164a4ca3bca94f0ac5a4fe9f1b1dfa) ) + ROM_LOAD( "wishaaa.u21", 0x000000, 0x100000, CRC(466b34e1) SHA1(3f5236ea78bde8bfb998367e913f42d23b4c17f1) ) +ROM_END + + +// Typhoon Lagoon +ROM_START( tylagoon ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "typhoonu241co", 0x000000, 0x100000, CRC(5a619390) SHA1(c96ed082fcf6650da0770ff2fdff0ba387bf639e) ) + + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "typhoonu69b00", 0x000000, 0x020000, CRC(31077e74) SHA1(953b63c91b3ace5d9e5af01c355bdbc7cbc8005f) ) + + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + // No TMS34020 code or sound data? + ROM_LOAD32_BYTE( "tylagoon.u9", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u11", 0x000001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u13", 0x000002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u15", 0x000003, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u8" , 0x400000, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u10", 0x400001, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u12", 0x400002, 0x100000, NO_DUMP ) + ROM_LOAD32_BYTE( "tylagoon.u14", 0x400003, 0x100000, NO_DUMP ) ROM_END +// Wild Thing ROM_START( atrwild ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "mb-u2.bin", 0x0000, 0x80000, CRC(e72a2339) SHA1(ad191dbbd0ac1f3288c45e336f27f693877273a9) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "mb-u2.bin", 0x000000, 0x80000, CRC(e72a2339) SHA1(ad191dbbd0ac1f3288c45e336f27f693877273a9) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "mb-u6.bin", 0x0000, 0x020000, CRC(f310e88d) SHA1(5d354e2a9de9eff27e66a4b1ca0925b19c6c86cc) ) + ROM_LOAD( "mb-u6.bin", 0x000000, 0x020000, CRC(f310e88d) SHA1(5d354e2a9de9eff27e66a4b1ca0925b19c6c86cc) ) ROM_REGION( 0x117, "mbpals", 0 ) ROM_LOAD( "mb-u22-d.bin", 0x000, 0x117, CRC(dc097847) SHA1(305294284d0ffd578f9115b836ef1f9e906c1599) ) ROM_LOAD( "mb-u32-b.bin", 0x000, 0x117, CRC(78a9310b) SHA1(deb84d96b0411b05c54fb2c998bed020a37d5005) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) ROM_LOAD32_BYTE( "u8.bin", 0x600000, 0x080000, CRC(4acafd98) SHA1(d516c55ddce1470e4e19725b6d7dfd5f70ba1129) ) ROM_LOAD32_BYTE( "u10.bin", 0x600001, 0x080000, CRC(804800be) SHA1(5fb2a5479c2a7073c2abd40e14a162fbf783eb70) ) ROM_LOAD32_BYTE( "u12.bin", 0x600002, 0x080000, CRC(0845ff27) SHA1(5012569a79c9fcbee178a0cee45d25769a1cf9be) ) @@ -1290,73 +1585,44 @@ ROM_START( atrwild ) // no dedicated sound ROM board present in cage, missing or not needed here? there is an OKI M6585 on the mainboard ROM_END -ROM_START( atricmon ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "mb-u2.bin", 0x0000, 0x80000, CRC(0fc3f42f) SHA1(53d189205ede16bc0199a6163a11eb39c2e3f2f1) ) - - ROM_REGION( 0x040000, "u6", 0 ) // config? - ROM_LOAD( "mb-u6.bin", 0x0000, 0x040000, CRC(eb8d3b4f) SHA1(598fb921026685ccfdb0b1804d92b3c6b3313ff4) ) - - ROM_REGION( 0x2e5, "mbpals", 0 ) - ROM_LOAD( "mb-u22-d.bin", 0x000, 0x117, CRC(dc097847) SHA1(305294284d0ffd578f9115b836ef1f9e906c1599) ) - ROM_LOAD( "mb-u32-d.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) - ROM_LOAD( "mb-u35-65994077_icm-s.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) +/********** Sets below on different hardware? **********/ - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "gb-u9.bin", 0x000000, 0x100000, CRC(eff83f95) SHA1(743f2fb0dd84a83387919db70175aa62f5f6f858) ) - ROM_LOAD32_BYTE( "gb-u11.bin", 0x000001, 0x100000, CRC(3fc27ae9) SHA1(896da175c11b48fb28dbb0678849b8f167cf5f6e) ) - ROM_LOAD32_BYTE( "gb-u13.bin", 0x000002, 0x100000, CRC(6ad50f67) SHA1(b32781f06acc3e9929467d6d1212cf0dc757e5b3) ) - ROM_LOAD32_BYTE( "gb-u15.bin", 0x000003, 0x100000, CRC(6ae46bb3) SHA1(edc51f9a885c483283edb9b0873b980727205a91) ) - ROM_LOAD32_BYTE( "gb-u8.bin", 0x400000, 0x100000, CRC(7dee3392) SHA1(718333ad5552351702e95a76cc2b61f7c3bf14ac) ) - ROM_LOAD32_BYTE( "gb-u10.bin", 0x400001, 0x100000, CRC(db88f900) SHA1(83638b46fd7b6e4229fa5295479c9763c2f690c0) ) - ROM_LOAD32_BYTE( "gb-u12.bin", 0x400002, 0x100000, CRC(fcbada90) SHA1(3206409c9a689e196694831ff5e6ba0fd32d676a) ) - ROM_LOAD32_BYTE( "gb-u14.bin", 0x400003, 0x100000, CRC(055c7ed6) SHA1(8b8f537b8dfd898d2f9eb123303f9488a6ae4567) ) - - // no dedicated sound ROM board present in cage, missing or not needed here? there is an OKI M6585 on the mainboard -ROM_END - -ROM_START( atrbonpk ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "mb-u2.bin", 0x0000, 0x80000, CRC(7f9d9d3c) SHA1(501d3f1482b3c67cbc94a3af40ef31fb5a6e7921) ) - - ROM_REGION( 0x080000, "u6", 0 ) // config? - ROM_LOAD( "mb-u6.bin", 0x0000, 0x080000, CRC(0b8d47ba) SHA1(aa1d5b37c330f4f44c1af5caca24bbf670c0bbcb) ) - - ROM_REGION( 0x2e5, "mbpals", 0 ) - ROM_LOAD( "mb-u22-d.bin", 0x000, 0x117, CRC(dc097847) SHA1(305294284d0ffd578f9115b836ef1f9e906c1599) ) - ROM_LOAD( "mb-u32-i.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8)) - ROM_LOAD( "mb-u35-poke-s6366.bin", 0x000, 0x2e5, CRC(996854bc) SHA1(647d2f49b739f7ca55c0b85290b6a21256834fd8) ) +// Bear Necessities (Russia) +ROM_START( bearnec ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u2_0_-bene01-afaaa-ce-rus_b178.bin", 0x000000, 0x100000, CRC(fc71f0b8) SHA1(6c124211614101ef151fe405bef0ee88277b8d2b) ) - ROM_REGION( 0x117, "gfxpals", 0 ) - ROM_LOAD( "u2-f.bin", 0x000, 0x117, CRC(eb5548c2) SHA1(7ccc6a7de0c0765e0da3563f3ee83dd99acc50bf) ) - ROM_LOAD( "u3-i.bin", 0x000, 0x117, CRC(769f7b32) SHA1(72df7c92367403a95c5bda3d6a643cc8fc24e153) ) - ROM_LOAD( "u4-c.bin", 0x000, 0x117, CRC(91e043ea) SHA1(d4d0c721c6c37cbe8babe148bc9887038cdf4820) ) - ROM_LOAD( "u5-a.bin", 0x000, 0x117, CRC(18ffc746) SHA1(e32dd74fb535fd4a754579173a788712b3e6ec30) ) - ROM_LOAD( "u6-b.bin", 0x000, 0x117, CRC(2750fb0a) SHA1(3814c4755a215073425a9d6bb048315498962c76) ) - ROM_LOAD( "u7-a.bin", 0x000, 0x117, CRC(adcb2789) SHA1(cc2ebd69abec73d66665faaec19b8706e539b34c) ) + ROM_REGION( 0x020000, "u6", 0 ) // config? + ROM_LOAD( "u6_bene21-e-zg-std_-5-xx-xx-axx_0f78.bin", 0x000000, 0x020000, CRC(d956484f) SHA1(d2d659a4350d7204666234a511ebd4dd7a021d89) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - ROM_LOAD32_BYTE( "u9.bin", 0x400000, 0x080000, CRC(5b8450f1) SHA1(27fc771c3fb824cdb845237324984778fcd0a737) ) - ROM_LOAD32_BYTE( "u11.bin", 0x400001, 0x080000, CRC(c8c52bd1) SHA1(081b8b4c46f18d030329bf519a8ed50385f7c062) ) - ROM_LOAD32_BYTE( "u13.bin", 0x400002, 0x080000, CRC(23164a85) SHA1(e6de6aac28f1dac9ea908aaab9760b56ded1bb91) ) - ROM_LOAD32_BYTE( "u15.bin", 0x400003, 0x080000, CRC(aabbb4ff) SHA1(4a13475929141a4824b15347873cf330f7f7b0d0) ) - ROM_LOAD32_BYTE( "u8.bin", 0x600000, 0x080000, CRC(d6dfde87) SHA1(f3221adecb67ee593d52a1bbbdcee78dde497dbd) ) - ROM_LOAD32_BYTE( "u10.bin", 0x600001, 0x080000, CRC(d81a1f77) SHA1(c3ec3a06dacc3f528c9bcfa7a18e25e0126b1d85) ) - ROM_LOAD32_BYTE( "u12.bin", 0x600002, 0x080000, CRC(4b24dc03) SHA1(f875f09c6d44821b169e111cb1ea3d9716746d5f) ) - ROM_LOAD32_BYTE( "u14.bin", 0x600003, 0x080000, CRC(a6dc78ff) SHA1(96457601e7f90ce14a88765f70accc07d7236d30) ) + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) + // not valid TMS code, looks like some x86 drive image split into ROMs? + ROM_LOAD( "u09_a632.bin", 0x000000, 0x100000, CRC(a671b6e8) SHA1(86b97ba98fdd09575a371b5b7f7d42bf2916fe17) ) + ROM_LOAD( "u11_947b.bin", 0x100000, 0x100000, CRC(3dc60963) SHA1(d824cd4fbe4116744727180762fbf0ffe22e6398) ) + ROM_LOAD( "u13_60e8.bin", 0x200000, 0x100000, CRC(11b25ede) SHA1(07d4901e985ed9b83d8630b748b82a408e26bac6) ) + ROM_LOAD( "u15_6c49.bin", 0x300000, 0x100000, CRC(f56e40ac) SHA1(7c5e0bb7a8bafea6ae57b5933c93230478ac74b2) ) + ROM_LOAD( "u08_f54f.bin", 0x400000, 0x100000, CRC(ce601695) SHA1(585b9e7c57072e7bff03fd34748fdadab6ff1b08) ) + ROM_LOAD( "u10_d622.bin", 0x500000, 0x100000, CRC(4ac9e636) SHA1(35d0bfd6c456e2cd5d1f950ea58edc8e92e05933) ) + ROM_LOAD( "u12_8bfa.bin", 0x600000, 0x100000, CRC(fa722d3f) SHA1(1275d0f6f06604e736a03b6031b7aeb46d7c6f07) ) + ROM_LOAD( "u14_d9c6.bin", 0x700000, 0x100000, CRC(fd9e0ebf) SHA1(0c6b2ddb397994ca62e80cd7c802a778fc287549) ) - // no dedicated sound ROM board present in cage, missing or not needed here? there is an OKI M6585 on the mainboard + ROM_REGION( 0x400000, "u18u21", 0 ) // sound + ROM_LOAD( "u18_96c0.bin", 0x000000, 0x100000, CRC(0cf7eb95) SHA1(96e6f21b359198b0f893ed69d2bc23ad2db34f33) ) + ROM_LOAD( "u19_7c1c.bin", 0x000000, 0x100000, CRC(17ca92ee) SHA1(cdc4297c591db33a75ab716db7cf5620c13e8a84) ) + ROM_LOAD( "u20_3123.bin", 0x000000, 0x100000, CRC(0932857c) SHA1(a30c1e40811581230da72c384679c0c21cced4c2) ) + ROM_LOAD( "u21_8bb6.bin", 0x000000, 0x100000, CRC(c1a25921) SHA1(d54eb230c8ebde69f00bfab1088b7a39809e5ee2) ) ROM_END +// Big Cheese (Russia) ROM_START( abigchs ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "o_-bigc01-afbaa-cc-rus_.8mu02", 0x0000, 0x100000, CRC(969082d8) SHA1(f3bcdc631ac1c346993a8d7300ba6687a32669f7) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "o_-bigc01-afbaa-cc-rus_.8mu02", 0x000000, 0x100000, CRC(969082d8) SHA1(f3bcdc631ac1c346993a8d7300ba6687a32669f7) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "bigc21-d-zf-std_-5-xx-xx-axx.1mu06", 0x0000, 0x020000, CRC(0eb376fb) SHA1(34e1f28e71503ffb0e1e922bd3ba17bad0d37d99) ) + ROM_LOAD( "bigc21-d-zf-std_-5-xx-xx-axx.1mu06", 0x000000, 0x020000, CRC(0eb376fb) SHA1(34e1f28e71503ffb0e1e922bd3ba17bad0d37d99) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) // not valid TMS code, looks like some x86 drive image split into ROMs? ROM_LOAD( "bigc01-a_-f-rus_-5_-g101.wigu09", 0x000000, 0x100000, CRC(c87e6bb4) SHA1(387e2498625ff718fccaa7701dd595ee787b9a83) ) ROM_LOAD( "bigc01-a_-f-rus_-5_-g101.wigu11", 0x100000, 0x100000, CRC(c9e9fa7f) SHA1(1698215845f21cfde0274e880d89c66fb3226f04) ) @@ -1368,45 +1634,22 @@ ROM_START( abigchs ) ROM_LOAD( "bigc01-a_-f-rus_-5_-g101.wigu14", 0x700000, 0x100000, CRC(5cf1c75a) SHA1(951289b5cad7ede582da93103acacc41af7622d9) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "bigc01-ba-a-std_-_.8su18", 0x0000, 0x100000, CRC(79c99749) SHA1(bcdd61ff287877833ab6ca56a278b1d68e47608f) ) - ROM_LOAD( "bigc01-ba-a-std_-_.8su19", 0x0000, 0x100000, CRC(deb7a0b5) SHA1(d8526e42273003f8249007df2d8b6ba33b727324) ) - ROM_LOAD( "bigc01-ba-a-std_-_.8su20", 0x0000, 0x100000, CRC(f94998a7) SHA1(c0fced89584ce5b67ba68cd93f1f8348ac36fd26) ) - ROM_LOAD( "bigc01-ba-a-std_-_.8su21", 0x0000, 0x100000, CRC(08a34088) SHA1(009311d126eb78514133f0f6ef28548c42d50b1c) ) + ROM_LOAD( "bigc01-ba-a-std_-_.8su18", 0x000000, 0x100000, CRC(79c99749) SHA1(bcdd61ff287877833ab6ca56a278b1d68e47608f) ) + ROM_LOAD( "bigc01-ba-a-std_-_.8su19", 0x000000, 0x100000, CRC(deb7a0b5) SHA1(d8526e42273003f8249007df2d8b6ba33b727324) ) + ROM_LOAD( "bigc01-ba-a-std_-_.8su20", 0x000000, 0x100000, CRC(f94998a7) SHA1(c0fced89584ce5b67ba68cd93f1f8348ac36fd26) ) + ROM_LOAD( "bigc01-ba-a-std_-_.8su21", 0x000000, 0x100000, CRC(08a34088) SHA1(009311d126eb78514133f0f6ef28548c42d50b1c) ) ROM_END -ROM_START( bearnec ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u2_0_-bene01-afaaa-ce-rus_b178.bin", 0x0000, 0x100000, CRC(fc71f0b8) SHA1(6c124211614101ef151fe405bef0ee88277b8d2b) ) - - ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u6_bene21-e-zg-std_-5-xx-xx-axx_0f78.bin", 0x0000, 0x020000, CRC(d956484f) SHA1(d2d659a4350d7204666234a511ebd4dd7a021d89) ) - - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ - // not valid TMS code, looks like some x86 drive image split into ROMs? - ROM_LOAD( "u09_a632.bin", 0x000000, 0x100000, CRC(a671b6e8) SHA1(86b97ba98fdd09575a371b5b7f7d42bf2916fe17) ) - ROM_LOAD( "u11_947b.bin", 0x100000, 0x100000, CRC(3dc60963) SHA1(d824cd4fbe4116744727180762fbf0ffe22e6398) ) - ROM_LOAD( "u13_60e8.bin", 0x200000, 0x100000, CRC(11b25ede) SHA1(07d4901e985ed9b83d8630b748b82a408e26bac6) ) - ROM_LOAD( "u15_6c49.bin", 0x300000, 0x100000, CRC(f56e40ac) SHA1(7c5e0bb7a8bafea6ae57b5933c93230478ac74b2) ) - ROM_LOAD( "u08_f54f.bin", 0x400000, 0x100000, CRC(ce601695) SHA1(585b9e7c57072e7bff03fd34748fdadab6ff1b08) ) - ROM_LOAD( "u10_d622.bin", 0x500000, 0x100000, CRC(4ac9e636) SHA1(35d0bfd6c456e2cd5d1f950ea58edc8e92e05933) ) - ROM_LOAD( "u12_8bfa.bin", 0x600000, 0x100000, CRC(fa722d3f) SHA1(1275d0f6f06604e736a03b6031b7aeb46d7c6f07) ) - ROM_LOAD( "u14_d9c6.bin", 0x700000, 0x100000, CRC(fd9e0ebf) SHA1(0c6b2ddb397994ca62e80cd7c802a778fc287549) ) - - ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "u18_96c0.bin", 0x0000, 0x100000, CRC(0cf7eb95) SHA1(96e6f21b359198b0f893ed69d2bc23ad2db34f33) ) - ROM_LOAD( "u19_7c1c.bin", 0x0000, 0x100000, CRC(17ca92ee) SHA1(cdc4297c591db33a75ab716db7cf5620c13e8a84) ) - ROM_LOAD( "u20_3123.bin", 0x0000, 0x100000, CRC(0932857c) SHA1(a30c1e40811581230da72c384679c0c21cced4c2) ) - ROM_LOAD( "u21_8bb6.bin", 0x0000, 0x100000, CRC(c1a25921) SHA1(d54eb230c8ebde69f00bfab1088b7a39809e5ee2) ) -ROM_END +// Gold City (Russia) ROM_START( goldcity ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "o_-goci01-afaaa-cd-rus_.8mu02", 0x0000, 0x100000, CRC(59c19539) SHA1(7c40eee8e534795a44b33140535284b2bc2a9ac5) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "o_-goci01-afaaa-cd-rus_.8mu02", 0x000000, 0x100000, CRC(59c19539) SHA1(7c40eee8e534795a44b33140535284b2bc2a9ac5) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "goci21-e-zf-std_-5-xx-xx-axx.1mu06", 0x0000, 0x020000, CRC(73ab9c41) SHA1(0888923bdaede83f264979c0757894f5cb2e0ec8) ) + ROM_LOAD( "goci21-e-zf-std_-5-xx-xx-axx.1mu06", 0x000000, 0x020000, CRC(73ab9c41) SHA1(0888923bdaede83f264979c0757894f5cb2e0ec8) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) // not valid TMS code, looks like some x86 drive image split into ROMs? ROM_LOAD( "goci01-a_-c-rus_-5_-g101.wigu09", 0x000000, 0x100000, CRC(72c9b584) SHA1(1345e7ea34a819fbc01b9a64e9f9c1a2de927dda) ) ROM_LOAD( "goci01-a_-c-rus_-5_-g101.wigu11", 0x100000, 0x100000, CRC(2ebe1d71) SHA1(1b540c3bb9b232f475c3fe2b56c55f473d8c09ee) ) @@ -1420,21 +1663,23 @@ ROM_START( goldcity ) // sound (missing or not needed here? there is an OKI M6585 on the mainboard) /* ROM_REGION( 0x400000, "u18u21", 0 ) - ROM_LOAD( "u18", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u19", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u20", 0x0000, 0x100000, NO_DUMP ) - ROM_LOAD( "u21", 0x0000, 0x100000, NO_DUMP ) + ROM_LOAD( "u18", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u19", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u20", 0x000000, 0x100000, NO_DUMP ) + ROM_LOAD( "u21", 0x000000, 0x100000, NO_DUMP ) */ ROM_END + +// Santa Maria (Russia) ROM_START( santam ) - ROM_REGION( 0x100000, "maincpu", 0 ) /* Z8018010VSC code (Z180) */ - ROM_LOAD( "u02_8m_m27c801-100f1_d6f7h.bin", 0x0000, 0x100000, CRC(8c0ed828) SHA1(e24cd0783a4290799db11ca8764b70cd380f2879) ) + ROM_REGION( 0x100000, "maincpu", 0 ) // Z8018010VSC code (Z180) + ROM_LOAD( "u02_8m_m27c801-100f1_d6f7h.bin", 0x000000, 0x100000, CRC(8c0ed828) SHA1(e24cd0783a4290799db11ca8764b70cd380f2879) ) ROM_REGION( 0x020000, "u6", 0 ) // config? - ROM_LOAD( "u06_1m_m27c1001-10f_da21h.bin", 0x0000, 0x020000, CRC(51c0a380) SHA1(861c8b4f825f4bc11dd02ac03dcc2cc7e8c65129) ) + ROM_LOAD( "u06_1m_m27c1001-10f_da21h.bin", 0x000000, 0x020000, CRC(51c0a380) SHA1(861c8b4f825f4bc11dd02ac03dcc2cc7e8c65129) ) - ROM_REGION32_LE( 0x800000, "user1", 0 ) /* TMS34020APCM-40 code (34020) */ + ROM_REGION32_LE( 0x800000, "user1", 0 ) // TMS34020APCM-40 code (34020) // not valid TMS code, looks like some x86 drive image split into ROMs? ROM_LOAD( "gb_u09_8m_m27c801-100f1_9df6h.bin", 0x000000, 0x100000, CRC(470ccae5) SHA1(0521af7830cc59102edcc658df4d21a3d669d6db) ) ROM_LOAD( "gb_u11_8m_m27c801-100f1_7621h.bin", 0x100000, 0x100000, CRC(8f9a1031) SHA1(1aca654b62e73f3005e627625bea2b4198c04a99) ) @@ -1446,10 +1691,10 @@ ROM_START( santam ) ROM_LOAD( "gb_u14_8m_m27c801-100f1_2a48h.bin", 0x700000, 0x100000, CRC(bd1fdca3) SHA1(b4bc73ff6900c14525d10fb10ca7f5371351a198) ) ROM_REGION( 0x400000, "u18u21", 0 ) // sound - ROM_LOAD( "sb_u18_8m_m27c801-100f1_a52eh.bin", 0x0000, 0x100000, CRC(95fe949d) SHA1(953f730a37d8d661cbc8c212c459db3769ac502b) ) - ROM_LOAD( "sb_u19_8m_m27c801-100f1_a71bh.bin", 0x0000, 0x100000, CRC(6eae31f3) SHA1(08fcd8c49b31de874906205a47035a71f87f12d6) ) - ROM_LOAD( "sb_u20_8m_m27c801-100f1_7870h.bin", 0x0000, 0x100000, CRC(27639c24) SHA1(7fdc7e5e684dfbef00450e4c8fa998d73c035895) ) - ROM_LOAD( "sb_u21_8m_m27c801-100f1_94cch.bin", 0x0000, 0x100000, CRC(c740b5be) SHA1(dafe80431197fe22cddd0fc295436edc37256603) ) + ROM_LOAD( "sb_u18_8m_m27c801-100f1_a52eh.bin", 0x000000, 0x100000, CRC(95fe949d) SHA1(953f730a37d8d661cbc8c212c459db3769ac502b) ) + ROM_LOAD( "sb_u19_8m_m27c801-100f1_a71bh.bin", 0x000000, 0x100000, CRC(6eae31f3) SHA1(08fcd8c49b31de874906205a47035a71f87f12d6) ) + ROM_LOAD( "sb_u20_8m_m27c801-100f1_7870h.bin", 0x000000, 0x100000, CRC(27639c24) SHA1(7fdc7e5e684dfbef00450e4c8fa998d73c035895) ) + ROM_LOAD( "sb_u21_8m_m27c801-100f1_94cch.bin", 0x000000, 0x100000, CRC(c740b5be) SHA1(dafe80431197fe22cddd0fc295436edc37256603) ) ROM_END } // anonymous namespace @@ -1457,9 +1702,7 @@ ROM_END /* Possible CashLine games: * Aphrodite - * Babooshka? (Alternate spelling) * Break the Spell - * Chickendales (Alternate spelling?) * Diver's Dream * Golden Glen (Alternate spelling?) * Happy Happy Hippy @@ -1477,37 +1720,46 @@ ROM_END GAME( 1999, atronic, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 1999, atronica, atronic, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Atronic SetUp/Clear Chips (Russia, set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 1999, atronicb, atronic, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Atronic SetUp/Clear Chips", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, atlantca, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, atlantcaa, atlantca, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Atlantica (Russia) (Atronic) (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, baboshka, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Baboshka (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, baboshka, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Babooshka (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, baboshkar, baboshka, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Babooshka (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, beachpt, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Beach Patrol (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, atrbtlma, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Beetlemania (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, beetleup, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Beetles Unplugged (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, bigblue, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Big Blue (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 200?, atrbonpk, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Bonus Poker (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, castaway, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, castawaya, castaway, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, cfblue, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, cfbluea, cfblue, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Crazy Fruits Blue (Russia) (Atronic) (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, cfgreen, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Crazy Fruits Green (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, chicken, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Chicken (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, chicdale, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Chickendales (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, aclown, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Clown (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, dncsprt, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Dancing Spirit (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, drmmake, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Dream Maker (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, drmmaker, drmmake, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Dream Maker (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, goldglen, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Golden Glenn (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, haphippy, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Happy Happy Hippy (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, iccash, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "I C Cash (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, shpinxii, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Sphinx II (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, beachpt, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Beach Patrol (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, beetleup, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Beetles Unplugged (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, bigblue, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Big Blue (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, castaway, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, castawaya, castaway, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Castaway (Russia) (Atronic) (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, dncsprt, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Dancing Spirit (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 2002, drmmake, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Dream Maker (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 200?, atricmon, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "I C Money (Atronic) (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // related to I C Cash ? +GAME( 200?, atricmona, atricmon, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "I C Money (Atronic) (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // related to I C Cash ? GAME( 2002, jumpjkpt, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Jumping Jackpots (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, mushmagi, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Mushroom Magic (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, sphinxii, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Sphinx II (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, sphinxiir, sphinxii, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Sphinx II (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, splmastr, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Spell Master (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, tajmah, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Tajmahal (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, 3wishrd, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Three Wishes Red (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, tylagoon, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Typhoon Lagoon (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 200?, atrwild, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Wild Thing (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) -GAME( 200?, atricmon, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "I C Money (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // related to I C Cash ? -GAME( 200?, atrbonpk, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Bonus Poker (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) // could be different hardware (or just bad dumps) they don't seem to have valid TMS code, instead the video ROMs seem to be some x86 drive image? -GAME( 2002, abigchs, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Big Cheese (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, bearnec, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Bear Necessities (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) +GAME( 2002, abigchs, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Big Cheese (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, goldcity, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Gold City (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) GAME( 2002, santam, 0, atronic, atronic, atronic_state, empty_init, ROT0, "Atronic", "Santa Maria (Russia) (Atronic)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING) diff --git a/src/mame/misc/homedata.cpp b/src/mame/misc/homedata.cpp index 17436d9cee2..bf9fbfe5691 100644 --- a/src/mame/misc/homedata.cpp +++ b/src/mame/misc/homedata.cpp @@ -235,6 +235,8 @@ Custom: GX61A01 #include "emu.h" #include "homedata.h" +#include "mahjong.h" + #include "cpu/m6809/m6809.h" #include "cpu/upd7810/upd7810.h" #include "cpu/z80/z80.h" @@ -262,14 +264,11 @@ uint8_t mrokumei_state::mrokumei_keyboard_r(offs_t offset) { uint8_t res = 0x3f; - // offset 0 is player 1, offset 1 player 2 (not supported) - if (offset == 0) + // offset 0 is player 1, offset 1 player 2 + for (int i = 0; i < 5; i++) { - for (int i = 0; i < 5; i++) - { - if (BIT(m_keyb, i)) - res &= m_keys[i]->read() & 0x3f; - } + if (BIT(m_keyb, i)) + res &= m_keys[i + (offset * 5)]->read() & 0x3f; } if (offset == 0) @@ -662,45 +661,7 @@ static INPUT_PORTS_START( mjhokite ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START("KEY0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 ) - - PORT_START("KEY1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) - - PORT_START("KEY2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("KEY3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("KEY4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_FLIP_FLOP ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_INCLUDE(mahjong_matrix_2p_ff) INPUT_PORTS_END static INPUT_PORTS_START( reikaids ) diff --git a/src/mame/misc/triviaquiz.cpp b/src/mame/misc/triviaquiz.cpp index 7b7eae44dcb..ea9a4eb899b 100644 --- a/src/mame/misc/triviaquiz.cpp +++ b/src/mame/misc/triviaquiz.cpp @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Dirk Best, Ivan Vangelista +// copyright-holders:Dirk Best /* Trivia Quiz by Intermatic Manufacturing Ltd. 1985 diff --git a/src/mame/moog/source.cpp b/src/mame/moog/source.cpp index 490ffa7235b..2365998cb35 100644 --- a/src/mame/moog/source.cpp +++ b/src/mame/moog/source.cpp @@ -47,17 +47,18 @@ TODO: #include "moog_source.lh" -#define LOG_CV (1U << 1) -#define LOG_BUTTONS (1U << 2) -#define LOG_ENCODER (1U << 3) -#define LOG_KEYBOARD (1U << 4) -#define LOG_CV_KEYBOARD_APPROX (1U << 5) +#define LOG_CV (1U << 1) +#define LOG_BUTTONS (1U << 2) +#define LOG_ENCODER (1U << 3) +#define LOG_KEYBOARD (1U << 4) +#define LOG_CV_KEYBOARD_APPROX (1U << 5) + #define VERBOSE (LOG_GENERAL|LOG_CV) -#define LOG_OUTPUT_FUNC osd_printf_info +//#define LOG_OUTPUT_FUNC osd_printf_info + #include "logmacro.h" -namespace -{ +namespace { constexpr const char MAINCPU_TAG[] = "z80"; constexpr const char NVRAM_TAG[] = "nvram"; @@ -65,8 +66,7 @@ constexpr const char NVRAM_TAG[] = "nvram"; class source_state : public driver_device { public: - source_state(const machine_config& mconfig, device_type type, - const char* tag) ATTR_COLD + source_state(const machine_config &mconfig, device_type type, const char* tag) ATTR_COLD : driver_device(mconfig, type, tag) , m_maincpu(*this, MAINCPU_TAG) , m_octave_io(*this, "octave_buttons") @@ -90,14 +90,15 @@ public: , m_cv(static_cast<int>(CV::SIZE), -1) {} - void source(machine_config& config) ATTR_COLD; - - void machine_start() override ATTR_COLD; - void machine_reset() override ATTR_COLD; + void source(machine_config &config) ATTR_COLD; DECLARE_INPUT_CHANGED_MEMBER(octave_button_pressed); DECLARE_INPUT_CHANGED_MEMBER(encoder_moved); +protected: + void machine_start() override ATTR_COLD; + void machine_reset() override ATTR_COLD; + private: void update_octave_leds(); @@ -144,6 +145,8 @@ private: u8 m_button_row_latch = 0xff; bool m_encoder_incr = false; + std::vector<float> m_cv; + // All MUXes are CD4051B. // Component designations refer to board 2 (synthesizer board). // The enum names match the CV labels in the schematic, but some @@ -182,7 +185,6 @@ private: SIZE }; - std::vector<float> m_cv; static constexpr const float MAX_CV = 10; // In Volts. static constexpr const u8 PATTERNS_7447[16] = @@ -365,9 +367,9 @@ void source_state::cv_w(offs_t offset, u8 data) return; const float cv = MAX_CV * data / 255.0f; - if (cv == m_cv.at(offset)) + if (cv == m_cv[offset]) return; - m_cv.at(offset) = cv; + m_cv[offset] = cv; if (offset == static_cast<int>(CV::KEYBOARD_APPROX)) LOGMASKED(LOG_CV_KEYBOARD_APPROX, @@ -408,7 +410,7 @@ float source_state::get_keyboard_v() const // *** Convert pressed key to a voltage. - static constexpr const float KEYBOARD_VREF = 8.24; // From schematic. + static constexpr const float KEYBOARD_VREF = 8.24f; // From schematic. static constexpr const float RKEY = RES_R(100); static constexpr const float R74 = RES_R(150); static constexpr const float R76 = RES_K(220); @@ -445,7 +447,7 @@ u8 source_state::keyboard_r() // TODO: Compute keyboard voltage in an input callback. static constexpr const int KB_APPROX_INDEX = static_cast<int>(CV::KEYBOARD_APPROX); - const u8 d0 = (get_keyboard_v() >= m_cv.at(KB_APPROX_INDEX)) ? 1 : 0; + const u8 d0 = (get_keyboard_v() >= m_cv[KB_APPROX_INDEX]) ? 1 : 0; // D1, D2: Loudness and Filter contour peaks. // D1 <- U32, FILT CNTR <- S22-11: 0 when envolope reaches almost 10V @@ -833,7 +835,6 @@ ROM_START(moogsource) ROMX_LOAD("3p3.u23", 0x000000, 0x001000, CRC(4211331f) SHA1(8767ef6b1cbb032a89a78bdb77bb7dbc1c187974), ROM_BIOS(0)) ROM_END -} // Anonymous namespace. - -SYST(1981, moogsource, 0, 0, source, source, source_state, empty_init, "Moog Music", "Moog Source", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND) +} // anonymous namespace. +SYST(1981, moogsource, 0, 0, source, source, source_state, empty_init, "Moog Music", "Moog Source", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND) diff --git a/src/mame/namco/mappy.cpp b/src/mame/namco/mappy.cpp index de9de2ec171..e74b593705e 100644 --- a/src/mame/namco/mappy.cpp +++ b/src/mame/namco/mappy.cpp @@ -23,7 +23,7 @@ They can be divided in three "families": Despite the hardware differences, the memory map is almost identical to Super Pacman, and that's why it's included in this driver. There is no information about the custom ICs used by this board. The video - section is probably more similar to Gaplus than to Supr Pacman: the sprite + section is probably more similar to Gaplus than to Super Pacman: the sprite generator might be a 21XX (though Gaplus doesn't use 8x8 sprites), and the 00XX and 04XX address generators are probably replaced by the single CUS20 (which also handles the flip screen flag). @@ -59,7 +59,7 @@ Video board: sprites; in Mappy it handles the 4bpp sprites, while the tilemap is handled by standard LS components. -The I/O interface chips vary from game to game (see machine/namcoio.c) +The I/O interface chips vary from game to game (see namco/namcoio.cpp) Super Pac-Man memory map @@ -565,38 +565,38 @@ TODO: * *************************************/ -#define MASTER_CLOCK (XTAL(18'432'000)) +static constexpr XTAL MASTER_CLOCK = XTAL(18'432'000); -#define PIXEL_CLOCK (MASTER_CLOCK/3) +static constexpr XTAL PIXEL_CLOCK = MASTER_CLOCK / 3; // H counts from 128->511, HBLANK starts at 144 and ends at 240 -#define HTOTAL (384) -#define HBEND (0) // (96+16) -#define HBSTART (288) // (16) +static constexpr unsigned HTOTAL = 384; +static constexpr unsigned HBEND = 0; // (96+16) +static constexpr unsigned HBSTART = 288; // (16) -#define VTOTAL (264) -#define VBEND (0) // (16) -#define VBSTART (224) // (224+16) +static constexpr unsigned VTOTAL = 264; +static constexpr unsigned VBEND = 0; // (16) +static constexpr unsigned VBSTART = 224; // (224+16) /***************************************************************************/ -void mappy_state::int_on_w(int state) +void mappy_state::main_int_on_w(int state) { m_main_irq_mask = state; if (!state) m_maincpu->set_input_line(0, CLEAR_LINE); } -void mappy_state::int_on_2_w(int state) +void mappy_state::sub_int_on_w(int state) { m_sub_irq_mask = state; if (!state) m_subcpu->set_input_line(0, CLEAR_LINE); } -void mappy_state::int_on_3_w(int state) +void phozon_state::sub2_int_on_w(int state) { m_sub2_irq_mask = state; if (!state) @@ -626,75 +626,76 @@ void mappy_state::vblank_irq(int state) if (m_sub_irq_mask) m_subcpu->set_input_line(0, ASSERT_LINE); +} + +void phozon_state::phozon_vblank_irq(int state) +{ + if (!state) + return; - if (m_subcpu2.found() && m_sub2_irq_mask) + vblank_irq(state); + + if (m_sub2_irq_mask) m_subcpu2->set_input_line(0, ASSERT_LINE); } -void mappy_state::superpac_cpu1_map(address_map &map) +void mappy_state::superpac_main_map(address_map &map) { - map(0x0000, 0x07ff).ram().w(FUNC(mappy_state::superpac_videoram_w)).share("videoram"); - map(0x0800, 0x1fff).ram().share("spriteram"); // work RAM with embedded sprite RAM - map(0x2000, 0x2000).rw(FUNC(mappy_state::superpac_flipscreen_r), FUNC(mappy_state::superpac_flipscreen_w)); + map(0x0000, 0x07ff).ram().w(FUNC(mappy_state::superpac_videoram_w)).share(m_videoram); + map(0x0800, 0x1fff).ram().share(m_spriteram); // work RAM with embedded sprite RAM + map(0x2000, 0x2000).rw(FUNC(mappy_state::flipscreen_r), FUNC(mappy_state::flipscreen_w)); map(0x4000, 0x43ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the sound CPU - map(0x4800, 0x480f).rw("namcoio_1", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface - map(0x4810, 0x481f).rw("namcoio_2", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4800, 0x480f).rw(m_namcoio[0], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4810, 0x481f).rw(m_namcoio[1], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface map(0x5000, 0x500f).w("mainlatch", FUNC(ls259_device::write_a0)); // various control bits map(0x8000, 0x8000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0xa000, 0xffff).rom(); } -void mappy_state::phozon_cpu1_map(address_map &map) +void phozon_state::main_map(address_map &map) { - map(0x0000, 0x07ff).ram().w(FUNC(mappy_state::superpac_videoram_w)).share("videoram"); // video RAM - map(0x0800, 0x1fff).ram().share("spriteram"); // shared RAM with CPU #2/sprite RAM + map(0x0000, 0x07ff).ram().w(FUNC(phozon_state::superpac_videoram_w)).share(m_videoram); // video RAM + map(0x0800, 0x1fff).ram().share(m_spriteram); // shared RAM with CPU #2/sprite RAM map(0x4000, 0x43ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the sound CPU - map(0x4800, 0x480f).rw("namcoio_1", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface - map(0x4810, 0x481f).rw("namcoio_2", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4800, 0x480f).rw(m_namcoio[0], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4810, 0x481f).rw(m_namcoio[1], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface map(0x5000, 0x500f).w("mainlatch", FUNC(ls259_device::write_a0)); // various control bits map(0x7000, 0x7000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x8000, 0xffff).rom(); } -void mappy_state::mappy_cpu1_map(address_map &map) +void mappy_state::mappy_main_map(address_map &map) { - map(0x0000, 0x0fff).ram().w(FUNC(mappy_state::mappy_videoram_w)).share("videoram"); - map(0x1000, 0x27ff).ram().share("spriteram"); // work RAM with embedded sprite RAM + map(0x0000, 0x0fff).ram().w(FUNC(mappy_state::mappy_videoram_w)).share(m_videoram); + map(0x1000, 0x27ff).ram().share(m_spriteram); // work RAM with embedded sprite RAM map(0x3800, 0x3fff).w(FUNC(mappy_state::mappy_scroll_w)); // scroll map(0x4000, 0x43ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the sound CPU - map(0x4800, 0x480f).rw("namcoio_1", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface - map(0x4810, 0x481f).rw("namcoio_2", FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4800, 0x480f).rw(m_namcoio[0], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface + map(0x4810, 0x481f).rw(m_namcoio[1], FUNC(namcoio_device::read), FUNC(namcoio_device::write)); // custom I/O chips interface map(0x5000, 0x500f).w("mainlatch", FUNC(ls259_device::write_a0)); // various control bits map(0x8000, 0x8000).w("watchdog", FUNC(watchdog_timer_device::reset_w)); map(0x8000, 0xffff).rom(); // only a000-ffff in Mappy } -void mappy_state::superpac_cpu2_map(address_map &map) +void mappy_state::superpac_sub_map(address_map &map) { map(0x0000, 0x03ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the main CPU (also sound registers) map(0x2000, 0x200f).w("mainlatch", FUNC(ls259_device::write_a0)); // various control bits map(0xe000, 0xffff).rom(); } -void mappy_state::phozon_cpu2_map(address_map &map) +void phozon_state::sub_map(address_map &map) { map(0x0000, 0x03ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the main CPU + sound registers map(0xe000, 0xffff).rom(); } -void mappy_state::mappy_cpu2_map(address_map &map) -{ - map(0x0000, 0x03ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with the main CPU (also sound registers) - map(0x2000, 0x200f).w("mainlatch", FUNC(ls259_device::write_a0)); // various control bits - map(0xe000, 0xffff).rom(); -} - // extra CPU only present in Phozon -void mappy_state::phozon_cpu3_map(address_map &map) +void phozon_state::sub2_map(address_map &map) { - map(0x0000, 0x07ff).ram().w(FUNC(mappy_state::superpac_videoram_w)).share("videoram"); - map(0x0800, 0x1fff).ram().share("spriteram"); // shared RAM with CPU #2/sprite RAM + map(0x0000, 0x07ff).ram().w(FUNC(phozon_state::superpac_videoram_w)).share(m_videoram); + map(0x0800, 0x1fff).ram().share(m_spriteram); // shared RAM with CPU #2/sprite RAM map(0x4000, 0x43ff).rw(m_namco_15xx, FUNC(namco_15xx_device::sharedram_r), FUNC(namco_15xx_device::sharedram_w)); // shared RAM with CPU #2 map(0xa000, 0xa7ff).ram(); map(0xe000, 0xffff).rom(); @@ -1219,10 +1220,10 @@ static const gfx_layout charlayout = 8,8, RGN_FRAC(1,1), 2, - { 0, 4 }, - { 8*8+0, 8*8+1, 8*8+2, 8*8+3, 0, 1, 2, 3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 16*8 + { STEP2(0, 4) }, + { STEP4(8*8, 1), STEP4(0, 1) }, + { STEP8(0, 8) }, + 8*8*2 }; static const gfx_layout spritelayout_2bpp = @@ -1230,12 +1231,10 @@ static const gfx_layout spritelayout_2bpp = 16,16, RGN_FRAC(1,1), 2, - { 0, 4 }, - { 0, 1, 2, 3, 8*8, 8*8+1, 8*8+2, 8*8+3, - 16*8+0, 16*8+1, 16*8+2, 16*8+3, 24*8+0, 24*8+1, 24*8+2, 24*8+3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 }, - 64*8 + { STEP2(0, 4) }, + { STEP4(0, 1), STEP4(8*8, 1), STEP4(8*8*2, 1), STEP4(8*8*3, 1) }, + { STEP8(0, 8), STEP8(8*8*4, 8) }, + 16*16*2 }; static const gfx_layout spritelayout_8x8 = @@ -1243,45 +1242,43 @@ static const gfx_layout spritelayout_8x8 = 8,8, RGN_FRAC(1,1), 2, - { 0, 4 }, - { 0, 1, 2, 3, 8*8, 8*8+1, 8*8+2, 8*8+3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 }, - 16*8 + { STEP2(0, 4) }, + { STEP4(0, 1), STEP4(8*8, 1) }, + { STEP8(0, 8) }, + 8*8*2 }; static const gfx_layout spritelayout_4bpp = { 16,16, - RGN_FRAC(1,2), + RGN_FRAC(1,1), 4, - { 0, 4, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+4 }, - { 0, 1, 2, 3, 8*8, 8*8+1, 8*8+2, 8*8+3, 16*8+0, 16*8+1, 16*8+2, 16*8+3, - 24*8+0, 24*8+1, 24*8+2, 24*8+3 }, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - 32*8, 33*8, 34*8, 35*8, 36*8, 37*8, 38*8, 39*8 }, - 64*8 + { STEP4(0, 4) }, + { STEP4(0, 1), STEP4(8*16, 1), STEP4(8*16*2, 1), STEP4(8*16*3, 1) }, + { STEP8(0, 16), STEP8(8*16*4, 16) }, + 16*16*4 }; static GFXDECODE_START( gfx_superpac ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout_2bpp, 64*4, 64 ) + GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout_2bpp, 64*4, 64 ) GFXDECODE_END static GFXDECODE_START( gfx_phozon ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout_8x8, 64*4, 64 ) + GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout_8x8, 64*4, 64 ) GFXDECODE_END static GFXDECODE_START( gfx_mappy ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout_4bpp, 64*4, 16 ) + GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout_4bpp, 64*4, 16 ) GFXDECODE_END static GFXDECODE_START( gfx_todruaga ) - GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) - GFXDECODE_ENTRY( "gfx2", 0, spritelayout_4bpp, 64*4, 64 ) + GFXDECODE_ENTRY( "tiles", 0, charlayout, 0, 64 ) + GFXDECODE_ENTRY( "sprites", 0, spritelayout_4bpp, 64*4, 64 ) GFXDECODE_END @@ -1295,8 +1292,8 @@ void mappy_state::out_lamps(uint8_t data) { m_leds[0] = BIT(data, 0); m_leds[1] = BIT(data, 1); - machine().bookkeeping().coin_lockout_global_w(data & 4); - machine().bookkeeping().coin_counter_w(0, ~data & 8); + machine().bookkeeping().coin_lockout_global_w(BIT(data, 2)); + machine().bookkeeping().coin_counter_w(0, BIT(~data, 3)); } void mappy_state::machine_start() @@ -1308,6 +1305,12 @@ void mappy_state::machine_start() save_item(NAME(m_main_irq_mask)); save_item(NAME(m_sub_irq_mask)); +} + +void phozon_state::machine_start() +{ + mappy_state::machine_start(); + save_item(NAME(m_sub2_irq_mask)); } @@ -1316,14 +1319,14 @@ void mappy_state::superpac_common(machine_config &config) { // basic machine hardware MC6809E(config, m_maincpu, PIXEL_CLOCK/4); // 1.536 MHz - m_maincpu->set_addrmap(AS_PROGRAM, &mappy_state::superpac_cpu1_map); + m_maincpu->set_addrmap(AS_PROGRAM, &mappy_state::superpac_main_map); MC6809E(config, m_subcpu, PIXEL_CLOCK/4); // 1.536 MHz - m_subcpu->set_addrmap(AS_PROGRAM, &mappy_state::superpac_cpu2_map); + m_subcpu->set_addrmap(AS_PROGRAM, &mappy_state::superpac_sub_map); ls259_device &mainlatch(LS259(config, "mainlatch")); // 2M on CPU board - mainlatch.q_out_cb<0>().set(FUNC(mappy_state::int_on_2_w)); - mainlatch.q_out_cb<1>().set(FUNC(mappy_state::int_on_w)); + mainlatch.q_out_cb<0>().set(FUNC(mappy_state::sub_int_on_w)); + mainlatch.q_out_cb<1>().set(FUNC(mappy_state::main_int_on_w)); mainlatch.q_out_cb<3>().set(m_namco_15xx, FUNC(namco_15xx_device::sound_enable_w)); mainlatch.q_out_cb<4>().set(m_namcoio[0], FUNC(namcoio_device::set_reset_line)).invert(); mainlatch.q_out_cb<4>().append(m_namcoio[1], FUNC(namcoio_device::set_reset_line)).invert(); @@ -1352,7 +1355,7 @@ void mappy_state::superpac_common(machine_config &config) // sound hardware SPEAKER(config, "speaker").front_center(); - NAMCO_15XX(config, m_namco_15xx, 18432000/768); + NAMCO_15XX(config, m_namco_15xx, MASTER_CLOCK/768); m_namco_15xx->set_voices(8); m_namco_15xx->add_route(ALL_OUTPUTS, "speaker", 1.0); } @@ -1412,22 +1415,22 @@ void mappy_state::grobda(machine_config &config) m_namcoio[1]->out_callback<0>().set("dipmux", FUNC(ls157_device::select_w)).bit(0); } -void mappy_state::phozon(machine_config &config) +void phozon_state::phozon(machine_config &config) { // basic machine hardware MC6809E(config, m_maincpu, PIXEL_CLOCK/4); // MAIN CPU - m_maincpu->set_addrmap(AS_PROGRAM, &mappy_state::phozon_cpu1_map); + m_maincpu->set_addrmap(AS_PROGRAM, &phozon_state::main_map); MC6809E(config, m_subcpu, PIXEL_CLOCK/4); // SOUND CPU - m_subcpu->set_addrmap(AS_PROGRAM, &mappy_state::phozon_cpu2_map); + m_subcpu->set_addrmap(AS_PROGRAM, &phozon_state::sub_map); MC6809E(config, m_subcpu2, PIXEL_CLOCK/4); // SUB CPU - m_subcpu2->set_addrmap(AS_PROGRAM, &mappy_state::phozon_cpu3_map); + m_subcpu2->set_addrmap(AS_PROGRAM, &phozon_state::sub2_map); ls259_device &mainlatch(LS259(config, "mainlatch")); // 5C - mainlatch.q_out_cb<0>().set(FUNC(mappy_state::int_on_2_w)); - mainlatch.q_out_cb<1>().set(FUNC(mappy_state::int_on_w)); - mainlatch.q_out_cb<2>().set(FUNC(mappy_state::int_on_3_w)); + mainlatch.q_out_cb<0>().set(FUNC(phozon_state::sub_int_on_w)); + mainlatch.q_out_cb<1>().set(FUNC(phozon_state::main_int_on_w)); + mainlatch.q_out_cb<2>().set(FUNC(phozon_state::sub2_int_on_w)); mainlatch.q_out_cb<3>().set(m_namco_15xx, FUNC(namco_15xx_device::sound_enable_w)); mainlatch.q_out_cb<4>().set(m_namcoio[0], FUNC(namcoio_device::set_reset_line)).invert(); mainlatch.q_out_cb<4>().append(m_namcoio[1], FUNC(namcoio_device::set_reset_line)).invert(); @@ -1457,20 +1460,18 @@ void mappy_state::phozon(machine_config &config) // video hardware GFXDECODE(config, m_gfxdecode, m_palette, gfx_phozon); - PALETTE(config, m_palette, FUNC(mappy_state::phozon_palette), 64*4+64*4, 32); + PALETTE(config, m_palette, FUNC(phozon_state::palette), 64*4+64*4, 32); SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART); - m_screen->set_screen_update(FUNC(mappy_state::screen_update_phozon)); + m_screen->set_screen_update(FUNC(phozon_state::screen_update)); m_screen->set_palette(m_palette); - m_screen->screen_vblank().set(FUNC(mappy_state::vblank_irq)); // cause IRQs on all three CPUs; also update the custom I/O chips - - MCFG_VIDEO_START_OVERRIDE(mappy_state,phozon) + m_screen->screen_vblank().set(FUNC(phozon_state::phozon_vblank_irq)); // cause IRQs on all three CPUs; also update the custom I/O chips // sound hardware SPEAKER(config, "speaker").front_center(); - NAMCO_15XX(config, m_namco_15xx, 18432000/768); + NAMCO_15XX(config, m_namco_15xx, MASTER_CLOCK/768); m_namco_15xx->set_voices(8); m_namco_15xx->add_route(ALL_OUTPUTS, "speaker", 1.0); } @@ -1479,14 +1480,14 @@ void mappy_state::mappy_common(machine_config &config) { // basic machine hardware MC6809E(config, m_maincpu, PIXEL_CLOCK/4); // 1.536 MHz - m_maincpu->set_addrmap(AS_PROGRAM, &mappy_state::mappy_cpu1_map); + m_maincpu->set_addrmap(AS_PROGRAM, &mappy_state::mappy_main_map); MC6809E(config, m_subcpu, PIXEL_CLOCK/4); // 1.536 MHz - m_subcpu->set_addrmap(AS_PROGRAM, &mappy_state::mappy_cpu2_map); + m_subcpu->set_addrmap(AS_PROGRAM, &mappy_state::superpac_sub_map); ls259_device &mainlatch(LS259(config, "mainlatch")); // 2M on CPU board - mainlatch.q_out_cb<0>().set(FUNC(mappy_state::int_on_2_w)); - mainlatch.q_out_cb<1>().set(FUNC(mappy_state::int_on_w)); + mainlatch.q_out_cb<0>().set(FUNC(mappy_state::sub_int_on_w)); + mainlatch.q_out_cb<1>().set(FUNC(mappy_state::main_int_on_w)); mainlatch.q_out_cb<2>().set(FUNC(mappy_state::flip_screen_set)); mainlatch.q_out_cb<3>().set(m_namco_15xx, FUNC(namco_15xx_device::sound_enable_w)); mainlatch.q_out_cb<4>().set(m_namcoio[0], FUNC(namcoio_device::set_reset_line)).invert(); @@ -1516,7 +1517,7 @@ void mappy_state::mappy_common(machine_config &config) // sound hardware SPEAKER(config, "speaker").front_center(); - NAMCO_15XX(config, m_namco_15xx, 18432000/768); + NAMCO_15XX(config, m_namco_15xx, MASTER_CLOCK/768); m_namco_15xx->set_voices(8); m_namco_15xx->add_route(ALL_OUTPUTS, "speaker", 1.0); } @@ -1597,10 +1598,10 @@ ROM_START( superpac ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "spc-3.1k", 0xf000, 0x1000, CRC(04445ddb) SHA1(ce7d14963d5ddaefdeaf433a6f82c43cd1611d9b) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "sp1-6.3c", 0x0000, 0x1000, CRC(91c5935c) SHA1(10579edabc26a0910253fab7d41b4c19ecdaaa09) ) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "spv-2.3f", 0x0000, 0x2000, CRC(670a42f2) SHA1(9171922df07e31fd1dc415766f7d2cc50a9d10dc) ) ROM_REGION( 0x0220, "proms", 0 ) @@ -1620,10 +1621,10 @@ ROM_START( superpacm ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "spc-3.1k", 0xf000, 0x1000, CRC(04445ddb) SHA1(ce7d14963d5ddaefdeaf433a6f82c43cd1611d9b) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "spv-1.3c", 0x0000, 0x1000, CRC(78337e74) SHA1(11222adb55e6bce508896ccb1f6dbab0c1d44e5b) ) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "spv-2.3f", 0x0000, 0x2000, CRC(670a42f2) SHA1(9171922df07e31fd1dc415766f7d2cc50a9d10dc) ) ROM_REGION( 0x0220, "proms", 0 ) @@ -1644,10 +1645,10 @@ ROM_START( pacnpal ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "pap1-4.1k", 0xf000, 0x1000, CRC(330e20de) SHA1(5b23e5dcc38dc644a36efc8b03eba34cea540bea) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "pap1-6.3c", 0x0000, 0x1000, CRC(a36b96cb) SHA1(e0a11b5a43cbf756ddb045c743973d0a55dbb979) ) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "pap1-5.3f", 0x0000, 0x2000, CRC(fb6f56e3) SHA1(fd10d2ee49b4e059e9ef6046bc86d97e3185164d) ) ROM_REGION( 0x0220, "proms", 0 ) @@ -1668,10 +1669,10 @@ ROM_START( pacnpal2 ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "pap1-4.1k", 0xf000, 0x1000, CRC(330e20de) SHA1(5b23e5dcc38dc644a36efc8b03eba34cea540bea) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "pap1-6.3c", 0x0000, 0x1000, CRC(a36b96cb) SHA1(e0a11b5a43cbf756ddb045c743973d0a55dbb979) ) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "pap1-5.3f", 0x0000, 0x2000, CRC(fb6f56e3) SHA1(fd10d2ee49b4e059e9ef6046bc86d97e3185164d) ) ROM_REGION( 0x0220, "proms", 0 ) @@ -1693,10 +1694,10 @@ ROM_START( pacnchmp ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "pap1-4.1k", 0xf000, 0x1000, CRC(330e20de) SHA1(5b23e5dcc38dc644a36efc8b03eba34cea540bea) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "pap2-6.3c", 0x0000, 0x1000, CRC(93d15c30) SHA1(5da4120b680726c83a651b445254604cbf7cc883) ) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "pap2-5.3f", 0x0000, 0x2000, CRC(39f44aa4) SHA1(0696539cb2c7fcda2f6c295c7d65678dac18950b) ) ROM_REGION( 0x0220, "proms", 0 ) @@ -1717,10 +1718,10 @@ ROM_START( grobda ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "gr1-4.1k", 0xe000, 0x2000, CRC(3fe78c08) SHA1(dd49a96e613e0ced5b82eafcaf935e136e7db53a) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "gr1-7.3c", 0x0000, 0x1000, CRC(4ebfabfd) SHA1(fffce05f59e090c4281aca0c0494825027b764fb) ) // characters - ROM_REGION( 0x4000, "gfx2", 0 ) + ROM_REGION( 0x4000, "sprites", 0 ) ROM_LOAD( "gr1-5.3f", 0x0000, 0x2000, CRC(eed43487) SHA1(d2b39651f39bdfca3754f7bbd7a52e7bf843dabe) ) // sprites ROM_LOAD( "gr1-6.3e", 0x2000, 0x2000, CRC(cebb7362) SHA1(6efd57f9fa0f93f70e60efc387b3a782fad2665c) ) // sprites @@ -1742,10 +1743,10 @@ ROM_START( grobda2 ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "gr1-4.1k", 0xe000, 0x2000, CRC(3fe78c08) SHA1(dd49a96e613e0ced5b82eafcaf935e136e7db53a) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "gr1-7.3c", 0x0000, 0x1000, CRC(4ebfabfd) SHA1(fffce05f59e090c4281aca0c0494825027b764fb) ) // characters - ROM_REGION( 0x4000, "gfx2", 0 ) + ROM_REGION( 0x4000, "sprites", 0 ) ROM_LOAD( "gr1-5.3f", 0x0000, 0x2000, CRC(eed43487) SHA1(d2b39651f39bdfca3754f7bbd7a52e7bf843dabe) ) // sprites ROM_LOAD( "gr1-6.3e", 0x2000, 0x2000, CRC(cebb7362) SHA1(6efd57f9fa0f93f70e60efc387b3a782fad2665c) ) // sprites @@ -1767,10 +1768,10 @@ ROM_START( grobda3 ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "gr1-4.1k", 0xe000, 0x2000, CRC(3fe78c08) SHA1(dd49a96e613e0ced5b82eafcaf935e136e7db53a) ) - ROM_REGION( 0x1000, "gfx1", 0 ) + ROM_REGION( 0x1000, "tiles", 0 ) ROM_LOAD( "gr1-7.3c", 0x0000, 0x1000, CRC(4ebfabfd) SHA1(fffce05f59e090c4281aca0c0494825027b764fb) ) // characters - ROM_REGION( 0x4000, "gfx2", 0 ) + ROM_REGION( 0x4000, "sprites", 0 ) ROM_LOAD( "gr1-5.3f", 0x0000, 0x2000, CRC(eed43487) SHA1(d2b39651f39bdfca3754f7bbd7a52e7bf843dabe) ) // sprites ROM_LOAD( "gr1-6.3e", 0x2000, 0x2000, CRC(cebb7362) SHA1(6efd57f9fa0f93f70e60efc387b3a782fad2665c) ) // sprites @@ -1796,11 +1797,11 @@ ROM_START( phozon ) ROM_REGION( 0x10000, "sub2", 0 ) // 64k for the SUB CPU ROM_LOAD( "9r.rom", 0xe000, 0x2000, CRC(5d9f0a28) SHA1(2caef680229180b237f8c4becf052f1a96592efd) ) - ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_REGION( 0x2000, "tiles", 0 ) ROM_LOAD( "7j.rom", 0x0000, 0x1000, CRC(27f9db5b) SHA1(12ef817136b45927d7f279952fa19049a1349f60) ) // characters (set 1) ROM_LOAD( "8j.rom", 0x1000, 0x1000, CRC(15b12ef8) SHA1(e3303656b4e8b988e55a9551e5344e289958f677) ) // characters (set 2) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "5t.rom", 0x0000, 0x2000, CRC(d50f08f8) SHA1(4e9dda0d5ad1c1b8b3be7edb05b3060f5f63a9c7) ) // sprites ROM_REGION( 0x0520, "proms", 0 ) @@ -1828,11 +1829,11 @@ ROM_START( phozons ) ROM_REGION( 0x10000, "sub2", 0 ) // 64k for the SUB CPU ROM_LOAD( "9r.rom", 0xe000, 0x2000, CRC(5d9f0a28) SHA1(2caef680229180b237f8c4becf052f1a96592efd) ) // 9r.bin - ROM_REGION( 0x2000, "gfx1", 0 ) + ROM_REGION( 0x2000, "tiles", 0 ) ROM_LOAD( "7j.bin", 0x0000, 0x1000, CRC(312b3ece) SHA1(1d4d3371a42321644ec3669f95abcfe860020868) ) // characters (set 1) ROM_LOAD( "8j.bin", 0x1000, 0x1000, CRC(d21422a2) SHA1(0268651628d66dc67a3b6bb8fb682b668e7ebbad) ) // characters (set 2) - ROM_REGION( 0x2000, "gfx2", 0 ) + ROM_REGION( 0x2000, "sprites", 0 ) ROM_LOAD( "5t.rom", 0x0000, 0x2000, CRC(d50f08f8) SHA1(4e9dda0d5ad1c1b8b3be7edb05b3060f5f63a9c7) ) // sprites - 5t.bin ROM_REGION( 0x0500, "proms", 0 ) @@ -1860,12 +1861,12 @@ ROM_START( mappy ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "mp1_4.1k", 0xe000, 0x2000, CRC(8182dd5b) SHA1(f36b57f7f1e79f00b3f07afe1960bca5f5325ee2) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "mp1_5.3b", 0x0000, 0x1000, CRC(16498b9f) SHA1(76610149c65f955484fef1c033ddc3fed3f4e568) ) - ROM_REGION( 0x4000, "gfx2", 0 ) - ROM_LOAD( "mp1_6.3m", 0x0000, 0x2000, CRC(f2d9647a) SHA1(3cc216793c6a5f73c437ad2524563deb3b5e2890) ) - ROM_LOAD( "mp1_7.3n", 0x2000, 0x2000, CRC(757cf2b6) SHA1(8dfbf03953d5219d9eb5fc654ec3392442ba1dc4) ) + ROM_REGION( 0x4000, "sprites", 0 ) + ROM_LOAD16_BYTE( "mp1_6.3m", 0x0000, 0x2000, CRC(f2d9647a) SHA1(3cc216793c6a5f73c437ad2524563deb3b5e2890) ) + ROM_LOAD16_BYTE( "mp1_7.3n", 0x0001, 0x2000, CRC(757cf2b6) SHA1(8dfbf03953d5219d9eb5fc654ec3392442ba1dc4) ) ROM_REGION( 0x0220, "proms", 0 ) ROM_LOAD( "mp1-5.5b", 0x0000, 0x0020, CRC(56531268) SHA1(2e356706c07f43eeb67783fb122bdc7fed1b3589) ) // palette @@ -1885,12 +1886,12 @@ ROM_START( mappyj ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "mp1_4.1k", 0xe000, 0x2000, CRC(8182dd5b) SHA1(f36b57f7f1e79f00b3f07afe1960bca5f5325ee2) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "mp1_5.3b", 0x0000, 0x1000, CRC(16498b9f) SHA1(76610149c65f955484fef1c033ddc3fed3f4e568) ) - ROM_REGION( 0x4000, "gfx2", 0 ) - ROM_LOAD( "mp1_6.3m", 0x0000, 0x2000, CRC(f2d9647a) SHA1(3cc216793c6a5f73c437ad2524563deb3b5e2890) ) - ROM_LOAD( "mp1_7.3n", 0x2000, 0x2000, CRC(757cf2b6) SHA1(8dfbf03953d5219d9eb5fc654ec3392442ba1dc4) ) + ROM_REGION( 0x4000, "sprites", 0 ) + ROM_LOAD16_BYTE( "mp1_6.3m", 0x0000, 0x2000, CRC(f2d9647a) SHA1(3cc216793c6a5f73c437ad2524563deb3b5e2890) ) + ROM_LOAD16_BYTE( "mp1_7.3n", 0x0001, 0x2000, CRC(757cf2b6) SHA1(8dfbf03953d5219d9eb5fc654ec3392442ba1dc4) ) ROM_REGION( 0x0220, "proms", 0 ) ROM_LOAD( "mp1-5.5b", 0x0000, 0x0020, CRC(56531268) SHA1(2e356706c07f43eeb67783fb122bdc7fed1b3589) ) // palette @@ -1909,12 +1910,12 @@ ROM_START( todruaga ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "td1_4.1k", 0xe000, 0x2000, CRC(ae9d06d9) SHA1(3d8621fdd74fafa61f342886faa37f0aab50c5a7) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "td1_5.3b", 0x0000, 0x1000, CRC(d32b249f) SHA1(7d7cee4101ef615fb92c3702f89a9823a6231195) ) - ROM_REGION( 0x4000, "gfx2", 0 ) - ROM_LOAD( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) - ROM_LOAD( "td1_7.3n", 0x2000, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) + ROM_REGION( 0x4000, "sprites", 0 ) + ROM_LOAD16_BYTE( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) + ROM_LOAD16_BYTE( "td1_7.3n", 0x0001, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) ROM_REGION( 0x0520, "proms", 0 ) ROM_LOAD( "td1-5.5b", 0x0000, 0x0020, CRC(122cc395) SHA1(a648c53f2e95634bb5b27d79be3fd908021d056e) ) // palette @@ -1933,12 +1934,12 @@ ROM_START( todruagao ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "td1_4.1k", 0xe000, 0x2000, CRC(ae9d06d9) SHA1(3d8621fdd74fafa61f342886faa37f0aab50c5a7) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "td1_5.3b", 0x0000, 0x1000, CRC(d32b249f) SHA1(7d7cee4101ef615fb92c3702f89a9823a6231195) ) - ROM_REGION( 0x4000, "gfx2", 0 ) - ROM_LOAD( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) - ROM_LOAD( "td1_7.3n", 0x2000, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) + ROM_REGION( 0x4000, "sprites", 0 ) + ROM_LOAD16_BYTE( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) + ROM_LOAD16_BYTE( "td1_7.3n", 0x0001, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) ROM_REGION( 0x0520, "proms", 0 ) ROM_LOAD( "td1-5.5b", 0x0000, 0x0020, CRC(122cc395) SHA1(a648c53f2e95634bb5b27d79be3fd908021d056e) ) // palette @@ -1957,12 +1958,12 @@ ROM_START( todruagas ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "td1_4.1k", 0xe000, 0x2000, CRC(ae9d06d9) SHA1(3d8621fdd74fafa61f342886faa37f0aab50c5a7) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "td1_5.3b", 0x0000, 0x1000, CRC(d32b249f) SHA1(7d7cee4101ef615fb92c3702f89a9823a6231195) ) - ROM_REGION( 0x4000, "gfx2", 0 ) - ROM_LOAD( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) - ROM_LOAD( "td1_7.3n", 0x2000, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) + ROM_REGION( 0x4000, "sprites", 0 ) + ROM_LOAD16_BYTE( "td1_6.3m", 0x0000, 0x2000, CRC(e827e787) SHA1(74e0af4c7d6e334bcd211a33eb18dddc8a182aa7) ) + ROM_LOAD16_BYTE( "td1_7.3n", 0x0001, 0x2000, CRC(962bd060) SHA1(74cdcafc26475bda085bf62ed17e6474ed782453) ) ROM_REGION( 0x0520, "proms", 0 ) ROM_LOAD( "td1-5.5b", 0x0000, 0x0020, CRC(122cc395) SHA1(a648c53f2e95634bb5b27d79be3fd908021d056e) ) // palette @@ -1981,12 +1982,12 @@ ROM_START( digdug2 ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "d21_4.1k", 0xe000, 0x2000, CRC(737443b1) SHA1(0e46204089cc6e5ffab0d2a62f9a1728f8c35948) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "d21_5.3b", 0x0000, 0x1000, CRC(afcb4509) SHA1(c9a54df22b0b92efbe7417a00200587225906b46) ) - ROM_REGION( 0x8000, "gfx2", 0 ) - ROM_LOAD( "d21_6.3m", 0x0000, 0x4000, CRC(df1f4ad8) SHA1(004fba630018dbf03c4b0e284c98077e19fface3) ) - ROM_LOAD( "d21_7.3n", 0x4000, 0x4000, CRC(ccadb3ea) SHA1(77d8d8e6039272f73e63c8f76084138ec613365a) ) + ROM_REGION( 0x8000, "sprites", 0 ) + ROM_LOAD16_BYTE( "d21_6.3m", 0x0000, 0x4000, CRC(df1f4ad8) SHA1(004fba630018dbf03c4b0e284c98077e19fface3) ) + ROM_LOAD16_BYTE( "d21_7.3n", 0x0001, 0x4000, CRC(ccadb3ea) SHA1(77d8d8e6039272f73e63c8f76084138ec613365a) ) ROM_REGION( 0x0220, "proms", 0 ) ROM_LOAD( "d21-5.5b", 0x0000, 0x0020, CRC(9b169db5) SHA1(77e840d10ab59708a051c3b15305b33d431ee06d) ) // palette @@ -2005,12 +2006,12 @@ ROM_START( digdug2o ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "d21_4.1k", 0xe000, 0x2000, CRC(737443b1) SHA1(0e46204089cc6e5ffab0d2a62f9a1728f8c35948) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "d21_5.3b", 0x0000, 0x1000, CRC(afcb4509) SHA1(c9a54df22b0b92efbe7417a00200587225906b46) ) - ROM_REGION( 0x8000, "gfx2", 0 ) - ROM_LOAD( "d21_6.3m", 0x0000, 0x4000, CRC(df1f4ad8) SHA1(004fba630018dbf03c4b0e284c98077e19fface3) ) - ROM_LOAD( "d21_7.3n", 0x4000, 0x4000, CRC(ccadb3ea) SHA1(77d8d8e6039272f73e63c8f76084138ec613365a) ) + ROM_REGION( 0x8000, "sprites", 0 ) + ROM_LOAD16_BYTE( "d21_6.3m", 0x0000, 0x4000, CRC(df1f4ad8) SHA1(004fba630018dbf03c4b0e284c98077e19fface3) ) + ROM_LOAD16_BYTE( "d21_7.3n", 0x0001, 0x4000, CRC(ccadb3ea) SHA1(77d8d8e6039272f73e63c8f76084138ec613365a) ) ROM_REGION( 0x0220, "proms", 0 ) ROM_LOAD( "d21-5.5b", 0x0000, 0x0020, CRC(9b169db5) SHA1(77e840d10ab59708a051c3b15305b33d431ee06d) ) // palette @@ -2030,12 +2031,12 @@ ROM_START( motos ) ROM_REGION( 0x10000, "sub", 0 ) // 64k for the second CPU ROM_LOAD( "mo1_4.1k", 0xe000, 0x2000, CRC(55e45d21) SHA1(a8b195acfec542734751de29c9dafc2b165a5881) ) - ROM_REGION( 0x1000, "gfx1", ROMREGION_INVERT ) + ROM_REGION( 0x1000, "tiles", ROMREGION_INVERT ) ROM_LOAD( "mo1_5.3b", 0x0000, 0x1000, CRC(5d4a2a22) SHA1(4af9bf2ae9bb78d2d029ef38809181ffa3c0eb66) ) - ROM_REGION( 0x8000, "gfx2", 0 ) - ROM_LOAD( "mo1_6.3m", 0x0000, 0x4000, CRC(2f0e396e) SHA1(664679f9d3d74a3fccb086af910392b4fe40c9bc) ) - ROM_LOAD( "mo1_7.3n", 0x4000, 0x4000, CRC(cf8a3b86) SHA1(2b49cdec516e23783f2a291633d81ab8bd0245fc) ) + ROM_REGION( 0x8000, "sprites", 0 ) + ROM_LOAD16_BYTE( "mo1_6.3m", 0x0000, 0x4000, CRC(2f0e396e) SHA1(664679f9d3d74a3fccb086af910392b4fe40c9bc) ) + ROM_LOAD16_BYTE( "mo1_7.3n", 0x0001, 0x4000, CRC(cf8a3b86) SHA1(2b49cdec516e23783f2a291633d81ab8bd0245fc) ) ROM_REGION( 0x0220, "proms", 0 ) ROM_LOAD( "mo1-5.5b", 0x0000, 0x0020, CRC(71972383) SHA1(66b0619affcc5168b099108800a941d6e2416ab0) ) // palette @@ -2055,25 +2056,25 @@ void mappy_state::init_digdug2() // 2x6809, static tilemap, 2bpp sprites (Super Pacman type) -GAME( 1982, superpac, 0, superpac, superpac, mappy_state, empty_init, ROT90, "Namco", "Super Pac-Man", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, superpacm, superpac, superpac, superpac, mappy_state, empty_init, ROT90, "Namco (Bally Midway license)", "Super Pac-Man (Midway)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, pacnpal, 0, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac & Pal", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, pacnpal2, pacnpal, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac & Pal (older)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, pacnchmp, pacnpal, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac-Man & Chomp Chomp", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, grobda, 0, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (New Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, grobda2, grobda, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (Old Ver. set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, grobda3, grobda, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (Old Ver. set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, superpac, 0, superpac, superpac, mappy_state, empty_init, ROT90, "Namco", "Super Pac-Man", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, superpacm, superpac, superpac, superpac, mappy_state, empty_init, ROT90, "Namco (Bally Midway license)", "Super Pac-Man (Midway)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, pacnpal, 0, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac & Pal", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, pacnpal2, pacnpal, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac & Pal (older)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, pacnchmp, pacnpal, pacnpal, pacnpal, mappy_state, empty_init, ROT90, "Namco", "Pac-Man & Chomp Chomp", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, grobda, 0, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (New Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, grobda2, grobda, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (Old Ver. set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, grobda3, grobda, grobda, grobda, mappy_state, empty_init, ROT90, "Namco", "Grobda (Old Ver. set 2)", MACHINE_SUPPORTS_SAVE ) // 3x6809, static tilemap, 2bpp sprites (Gaplus type) -GAME( 1983, phozon, 0, phozon, phozon, mappy_state, empty_init, ROT90, "Namco", "Phozon (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, phozons, phozon, phozon, phozon, mappy_state, empty_init, ROT90, "Namco (Sidam license)", "Phozon (Sidam)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, phozon, 0, phozon, phozon, phozon_state, empty_init, ROT90, "Namco", "Phozon (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, phozons, phozon, phozon, phozon, phozon_state, empty_init, ROT90, "Namco (Sidam license)", "Phozon (Sidam)", MACHINE_SUPPORTS_SAVE ) // 2x6809, scroling tilemap, 4bpp sprites (Super Pacman type) -GAME( 1983, mappy, 0, mappy, mappy, mappy_state, empty_init, ROT90, "Namco", "Mappy (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, mappyj, mappy, mappy, mappy, mappy_state, empty_init, ROT90, "Namco", "Mappy (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, todruaga, 0, todruaga, todruaga, mappy_state, empty_init, ROT90, "Namco", "The Tower of Druaga (New Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, todruagao, todruaga, todruaga, todruaga, mappy_state, empty_init, ROT90, "Namco", "The Tower of Druaga (Old Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1984, todruagas, todruaga, todruaga, todruaga, mappy_state, empty_init, ROT90, "bootleg? (Sidam)", "The Tower of Druaga (Sidam)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, digdug2, 0, digdug2, digdug2, mappy_state, init_digdug2, ROT90, "Namco", "Dig Dug II (New Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, digdug2o, digdug2, digdug2, digdug2, mappy_state, init_digdug2, ROT90, "Namco", "Dig Dug II (Old Ver.)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, motos, 0, motos, motos, mappy_state, empty_init, ROT90, "Namco", "Motos", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, mappy, 0, mappy, mappy, mappy_state, empty_init, ROT90, "Namco", "Mappy (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, mappyj, mappy, mappy, mappy, mappy_state, empty_init, ROT90, "Namco", "Mappy (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, todruaga, 0, todruaga, todruaga, mappy_state, empty_init, ROT90, "Namco", "The Tower of Druaga (New Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, todruagao, todruaga, todruaga, todruaga, mappy_state, empty_init, ROT90, "Namco", "The Tower of Druaga (Old Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1984, todruagas, todruaga, todruaga, todruaga, mappy_state, empty_init, ROT90, "bootleg? (Sidam)", "The Tower of Druaga (Sidam)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, digdug2, 0, digdug2, digdug2, mappy_state, init_digdug2, ROT90, "Namco", "Dig Dug II (New Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, digdug2o, digdug2, digdug2, digdug2, mappy_state, init_digdug2, ROT90, "Namco", "Dig Dug II (Old Ver.)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, motos, 0, motos, motos, mappy_state, empty_init, ROT90, "Namco", "Motos", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/namco/mappy.h b/src/mame/namco/mappy.h index 4f14d1b640d..732c922d1fc 100644 --- a/src/mame/namco/mappy.h +++ b/src/mame/namco/mappy.h @@ -20,7 +20,6 @@ public: m_spriteram(*this, "spriteram"), m_maincpu(*this, "maincpu"), m_subcpu(*this, "sub"), - m_subcpu2(*this, "sub2"), m_namcoio(*this, "namcoio_%u", 1), m_namco_15xx(*this, "namco"), m_gfxdecode(*this, "gfxdecode"), @@ -31,7 +30,6 @@ public: void mappy_common(machine_config &config); void mappy(machine_config &config); - void phozon(machine_config &config); void motos(machine_config &config); void grobda(machine_config &config); void digdug2(machine_config &config); @@ -45,13 +43,11 @@ public: protected: virtual void machine_start() override ATTR_COLD; -private: required_shared_ptr<uint8_t> m_videoram; required_shared_ptr<uint8_t> m_spriteram; required_device<cpu_device> m_maincpu; required_device<cpu_device> m_subcpu; - optional_device<cpu_device> m_subcpu2; required_device_array<namcoio_device, 2> m_namcoio; required_device<namco_15xx_device> m_namco_15xx; required_device<gfxdecode_device> m_gfxdecode; @@ -66,46 +62,68 @@ private: uint8_t m_main_irq_mask = 0; uint8_t m_sub_irq_mask = 0; - uint8_t m_sub2_irq_mask = 0; emu_timer *m_namcoio_run_timer[2]{}; - void int_on_w(int state); - void int_on_2_w(int state); - void int_on_3_w(int state); + void main_int_on_w(int state); + void sub_int_on_w(int state); void superpac_videoram_w(offs_t offset, uint8_t data); void mappy_videoram_w(offs_t offset, uint8_t data); - void superpac_flipscreen_w(uint8_t data); - uint8_t superpac_flipscreen_r(); + void flipscreen_w(uint8_t data); + uint8_t flipscreen_r(); void mappy_scroll_w(offs_t offset, uint8_t data); void out_lamps(uint8_t data); TILEMAP_MAPPER_MEMBER(superpac_tilemap_scan); TILEMAP_MAPPER_MEMBER(mappy_tilemap_scan); TILE_GET_INFO_MEMBER(superpac_get_tile_info); - TILE_GET_INFO_MEMBER(phozon_get_tile_info); TILE_GET_INFO_MEMBER(mappy_get_tile_info); template<uint8_t Chip> TIMER_CALLBACK_MEMBER(namcoio_run_timer); DECLARE_VIDEO_START(superpac); void superpac_palette(palette_device &palette) const; - DECLARE_VIDEO_START(phozon); - void phozon_palette(palette_device &palette) const; DECLARE_VIDEO_START(mappy); void mappy_palette(palette_device &palette) const; uint32_t screen_update_superpac(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_phozon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_mappy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void vblank_irq(int state); void mappy_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base); - void phozon_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base); - - void mappy_cpu1_map(address_map &map) ATTR_COLD; - void mappy_cpu2_map(address_map &map) ATTR_COLD; - void phozon_cpu1_map(address_map &map) ATTR_COLD; - void phozon_cpu2_map(address_map &map) ATTR_COLD; - void phozon_cpu3_map(address_map &map) ATTR_COLD; - void superpac_cpu1_map(address_map &map) ATTR_COLD; - void superpac_cpu2_map(address_map &map) ATTR_COLD; + + void mappy_main_map(address_map &map) ATTR_COLD; + void superpac_main_map(address_map &map) ATTR_COLD; + void superpac_sub_map(address_map &map) ATTR_COLD; +}; + +class phozon_state : public mappy_state +{ +public: + phozon_state(const machine_config &mconfig, device_type type, const char *tag) : + mappy_state(mconfig, type, tag), + m_subcpu2(*this, "sub2") + { } + + void phozon(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + +private: + required_device<cpu_device> m_subcpu2; + + uint8_t m_sub2_irq_mask = 0; + + void sub2_int_on_w(int state); + + TILE_GET_INFO_MEMBER(get_tile_info); + + void palette(palette_device &palette) const; + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void phozon_vblank_irq(int state); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base); + + void main_map(address_map &map) ATTR_COLD; + void sub_map(address_map &map) ATTR_COLD; + void sub2_map(address_map &map) ATTR_COLD; }; #endif // MAME_NAMCO_MAPPY_H diff --git a/src/mame/namco/mappy_v.cpp b/src/mame/namco/mappy_v.cpp index b66f5bcb737..ff4864a4c91 100644 --- a/src/mame/namco/mappy_v.cpp +++ b/src/mame/namco/mappy_v.cpp @@ -154,7 +154,7 @@ void mappy_state::mappy_palette(palette_device &palette) const ***************************************************************************/ -void mappy_state::phozon_palette(palette_device &palette) const +void phozon_state::palette(palette_device &palette) const { const uint8_t *color_prom = memregion("proms")->base(); static constexpr int resistances[4] = { 2200, 1000, 470, 220 }; @@ -254,7 +254,7 @@ TILE_GET_INFO_MEMBER(mappy_state::superpac_get_tile_info) { uint8_t attr = m_videoram[tile_index + 0x400]; - tileinfo.category = (attr & 0x40) >> 6; + tileinfo.category = BIT(attr, 6); tileinfo.group = attr & 0x3f; tileinfo.set(0, m_videoram[tile_index], @@ -262,11 +262,11 @@ TILE_GET_INFO_MEMBER(mappy_state::superpac_get_tile_info) 0); } -TILE_GET_INFO_MEMBER(mappy_state::phozon_get_tile_info) +TILE_GET_INFO_MEMBER(phozon_state::get_tile_info) { uint8_t attr = m_videoram[tile_index + 0x400]; - tileinfo.category = (attr & 0x40) >> 6; + tileinfo.category = BIT(attr, 6); tileinfo.group = attr & 0x3f; tileinfo.set(0, m_videoram[tile_index] + ((attr & 0x80) << 1), @@ -278,7 +278,7 @@ TILE_GET_INFO_MEMBER(mappy_state::mappy_get_tile_info) { uint8_t attr = m_videoram[tile_index + 0x800]; - tileinfo.category = (attr & 0x40) >> 6; + tileinfo.category = BIT(attr, 6); tileinfo.group = attr & 0x3f; tileinfo.set(0, m_videoram[tile_index], @@ -302,9 +302,9 @@ VIDEO_START_MEMBER(mappy_state,superpac) m_bg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 31); } -VIDEO_START_MEMBER(mappy_state,phozon) +void phozon_state::video_start() { - m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(mappy_state::phozon_get_tile_info)), tilemap_mapper_delegate(*this, FUNC(mappy_state::superpac_tilemap_scan)), 8, 8, 36, 28); + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(phozon_state::get_tile_info)), tilemap_mapper_delegate(*this, FUNC(phozon_state::superpac_tilemap_scan)), 8, 8, 36, 28); m_bg_tilemap->configure_groups(*m_gfxdecode->gfx(0), 15); } @@ -339,14 +339,15 @@ void mappy_state::mappy_videoram_w(offs_t offset, uint8_t data) m_bg_tilemap->mark_tile_dirty(offset & 0x7ff); } -void mappy_state::superpac_flipscreen_w(uint8_t data) +void mappy_state::flipscreen_w(uint8_t data) { - flip_screen_set(data & 1); + flip_screen_set(BIT(data, 0)); } -uint8_t mappy_state::superpac_flipscreen_r() +uint8_t mappy_state::flipscreen_r() { - flip_screen_set(1); + if (!machine().side_effects_disabled()) + flip_screen_set(1); return 0xff; } @@ -365,15 +366,14 @@ void mappy_state::mappy_scroll_w(offs_t offset, uint8_t data) void mappy_state::mappy_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base) { - uint8_t *spriteram = spriteram_base + 0x780; - uint8_t *spriteram_2 = spriteram + 0x800; - uint8_t *spriteram_3 = spriteram_2 + 0x800; - int offs; + uint8_t const *const spriteram = spriteram_base + 0x780; + uint8_t const *const spriteram_2 = spriteram + 0x800; + uint8_t const *const spriteram_3 = spriteram_2 + 0x800; - for (offs = 0;offs < 0x80;offs += 2) + for (int offs = 0; offs < 0x80; offs += 2) { /* is it on? */ - if ((spriteram_3[offs+1] & 2) == 0) + if (BIT(~spriteram_3[offs+1], 1)) { static const uint8_t gfx_offs[2][2] = { @@ -381,14 +381,13 @@ void mappy_state::mappy_draw_sprites(bitmap_ind16 &bitmap, const rectangle &clip { 2, 3 } }; int sprite = spriteram[offs]; - int color = spriteram[offs+1]; - int sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 40; + int const color = spriteram[offs+1]; + int const sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 40; int sy = 256 - spriteram_2[offs] + 1; // sprites are buffered and delayed by one scanline - int flipx = (spriteram_3[offs] & 0x01); - int flipy = (spriteram_3[offs] & 0x02) >> 1; - int sizex = (spriteram_3[offs] & 0x04) >> 2; - int sizey = (spriteram_3[offs] & 0x08) >> 3; - int x,y; + int flipx = BIT(spriteram_3[offs], 0); + int flipy = BIT(spriteram_3[offs], 1); + int const sizex = (spriteram_3[offs] & 0x04) >> 2; + int const sizey = (spriteram_3[offs] & 0x08) >> 3; sprite &= ~sizex; sprite &= ~(sizey << 1); @@ -402,9 +401,9 @@ void mappy_state::mappy_draw_sprites(bitmap_ind16 &bitmap, const rectangle &clip flipy ^= 1; } - for (y = 0;y <= sizey;y++) + for (int y = 0; y <= sizey; y++) { - for (x = 0;x <= sizex;x++) + for (int x = 0; x <= sizex; x++) { m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)], @@ -440,17 +439,16 @@ spriteram_3 1 -------x X position MSB */ -void mappy_state::phozon_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base) +void phozon_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram_base) { - uint8_t *spriteram = spriteram_base + 0x780; - uint8_t *spriteram_2 = spriteram + 0x800; - uint8_t *spriteram_3 = spriteram_2 + 0x800; - int offs; + uint8_t const *const spriteram = spriteram_base + 0x780; + uint8_t const *const spriteram_2 = spriteram + 0x800; + uint8_t const *const spriteram_3 = spriteram_2 + 0x800; - for (offs = 0;offs < 0x80;offs += 2) + for (int offs = 0; offs < 0x80; offs += 2) { /* is it on? */ - if ((spriteram_3[offs+1] & 2) == 0) + if (BIT(~spriteram_3[offs+1], 1)) { static const uint8_t size[4] = { 1, 0, 3, 0 }; /* 16, 8, 32 pixels; fourth combination unused? */ static const uint8_t gfx_offs[4][4] = @@ -460,15 +458,14 @@ void mappy_state::phozon_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cli { 8, 9,12,13 }, {10,11,14,15 } }; - int sprite = (spriteram[offs] << 2) | ((spriteram_3[offs] & 0xc0) >> 6); - int color = spriteram[offs+1] & 0x3f; - int sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 69; + int const sprite = (spriteram[offs] << 2) | ((spriteram_3[offs] & 0xc0) >> 6); + int const color = spriteram[offs+1] & 0x3f; + int const sx = spriteram_2[offs+1] + 0x100 * (spriteram_3[offs+1] & 1) - 69; int sy = 256 - spriteram_2[offs]; int flipx = (spriteram_3[offs] & 0x01); int flipy = (spriteram_3[offs] & 0x02) >> 1; - int sizex = size[(spriteram_3[offs] & 0x0c) >> 2]; - int sizey = size[(spriteram_3[offs] & 0x30) >> 4]; - int x,y; + int const sizex = size[(spriteram_3[offs] & 0x0c) >> 2]; + int const sizey = size[(spriteram_3[offs] & 0x30) >> 4]; sy -= 8 * sizey; sy = (sy & 0xff) - 32; // fix wraparound @@ -479,9 +476,9 @@ void mappy_state::phozon_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cli flipy ^= 1; } - for (y = 0;y <= sizey;y++) + for (int y = 0; y <= sizey; y++) { - for (x = 0;x <= sizex;x++) + for (int x = 0; x <= sizex; x++) { m_gfxdecode->gfx(1)->transmask(bitmap,cliprect, sprite + gfx_offs[y ^ (sizey * flipy)][x ^ (sizex * flipx)], @@ -510,12 +507,12 @@ uint32_t mappy_state::screen_update_superpac(screen_device &screen, bitmap_ind16 m_bg_tilemap->draw(screen, bitmap, cliprect, 1,0); /* sprite color 0/1 still has priority over that (ghost eyes in Pac 'n Pal) */ - for (int y = 0;y < sprite_bitmap.height();y++) + for (int y = 0; y < sprite_bitmap.height(); y++) { - for (int x = 0;x < sprite_bitmap.width();x++) + for (int x = 0; x < sprite_bitmap.width(); x++) { - int spr_entry = sprite_bitmap.pix(y, x); - int spr_pen = m_palette->pen_indirect(spr_entry); + uint16_t const spr_entry = sprite_bitmap.pix(y, x); + int const spr_pen = m_palette->pen_indirect(spr_entry); if (spr_pen == 0 || spr_pen == 1) bitmap.pix(y, x) = spr_entry; } @@ -523,14 +520,14 @@ uint32_t mappy_state::screen_update_superpac(screen_device &screen, bitmap_ind16 return 0; } -uint32_t mappy_state::screen_update_phozon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t phozon_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { /* flip screen control is embedded in RAM */ - flip_screen_set(m_spriteram[0x1f7f-0x800] & 1); + flip_screen_set(BIT(m_spriteram[0x1f7f-0x800], 0)); m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); - phozon_draw_sprites(bitmap,cliprect,m_spriteram); + draw_sprites(bitmap,cliprect,m_spriteram); /* Redraw the high priority characters */ m_bg_tilemap->draw(screen, bitmap, cliprect, 1,0); @@ -539,9 +536,7 @@ uint32_t mappy_state::screen_update_phozon(screen_device &screen, bitmap_ind16 & uint32_t mappy_state::screen_update_mappy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - int offs; - - for (offs = 2;offs < 34;offs++) + for (int offs = 2; offs < 34; offs++) m_bg_tilemap->set_scrolly(offs,m_scroll); m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES,0); diff --git a/src/mame/namco/namcos2.cpp b/src/mame/namco/namcos2.cpp index 8bbfb305a34..3dbfc3f441b 100644 --- a/src/mame/namco/namcos2.cpp +++ b/src/mame/namco/namcos2.cpp @@ -568,7 +568,7 @@ C102 - Controls CPU access to ROZ Memory Area. #define M68B09_CPU_CLOCK (MAIN_OSC_CLOCK / 24) /* 2.048MHz clock for 68B09 sound CPU */ #define C65_CPU_CLOCK (MAIN_OSC_CLOCK / 24) /* 2.048MHz clock for 63705 (or 63B05) I/O CPU */ #define C68_CPU_CLOCK (MAIN_OSC_CLOCK / 6) /* 8.192MHz clock for 37450 I/O CPU */ -#define YM2151_SOUND_CLOCK XTAL(3'579'545) /* 3.579545MHz FM clock */ +#define YM2151_SOUND_CLOCK XTAL(3'579'545) /* 3.579545MHz FM clock */ #define C140_SOUND_CLOCK (MAIN_OSC_CLOCK / 384 / 6) /* 21.333kHz C140 clock (was 8000000/374 or 21.390kHz) */ @@ -1121,11 +1121,11 @@ static INPUT_PORTS_START( finallap ) PORT_START("AN4") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 4 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("AN5") /* Steering Wheel */ /* sensitivity, delta, min, max */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_START("AN6") /* Brake Pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("AN7") /* Accelerator Pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1184,11 +1184,11 @@ static INPUT_PORTS_START( finalap3 ) PORT_START("AN4") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 4 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("AN5") /* Steering Wheel */ /* sensitivity, delta, min, max */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(10) PORT_START("AN6") /* Brake Pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("AN7") /* Accelerator Pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1271,11 +1271,11 @@ static INPUT_PORTS_START( fourtrax ) PORT_START("AN4") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 4 6 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("AN5") /* Steering Wheel 7 */ /* sensitivity, delta, min, max */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(75) PORT_KEYDELTA(50) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(75) PORT_KEYDELTA(50) PORT_START("AN6") /* Brake Pedal 8 */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("AN7") /* Accelerator Pedal 9 */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_DIPNAME( 0x01, 0x01, "PortH 0x01") @@ -1363,11 +1363,11 @@ static INPUT_PORTS_START( suzuka ) PORT_START("AN4") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 4 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("AN5") /* Steering Wheel */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(50) PORT_KEYDELTA(100) PORT_START("AN6") /* Brake pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("AN7") /* Accelerator pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -1434,11 +1434,11 @@ static INPUT_PORTS_START( luckywld ) PORT_START("AN4") PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(8) PORT_START("AN5") /* Steering Wheel */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_CODE(INPUT_CODE_INVALID) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_CODE(INPUT_CODE_INVALID) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) PORT_START("AN6") /* Brake pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("AN7") /* Accelerator pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1497,7 +1497,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( dirtfox ) PORT_START("MCUB") /* 63B05Z0 - PORT B */ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Gear Shift Down") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Gear Shift Up") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Gear Shift Up") NAMCOS2_MCU_PORT_C_DEFAULT @@ -1512,11 +1512,11 @@ static INPUT_PORTS_START( dirtfox ) PORT_START("AN4") /* 63B05Z0 - 8 CHANNEL ANALOG - CHANNEL 4 */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START("AN5") /* Steering Wheel */ - PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_SENSITIVITY(70) PORT_KEYDELTA(50) + PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX(0x01,0xff) PORT_SENSITIVITY(70) PORT_KEYDELTA(50) PORT_START("AN6") /* Brake pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(100) PORT_KEYDELTA(30) PORT_NAME("Brake") + PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0x00,0x40) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_NAME("Brake") PORT_START("AN7") /* Accelerator pedal */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_NAME("Accelerator") + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0x80) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_NAME("Accelerator") PORT_START("MCUH") /* 63B05Z0 - PORT H */ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -1736,13 +1736,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) m_c68->ext_interrupt(ASSERT_LINE); } - if(scanline == 240) + if (scanline == 240) { m_master_intc->vblank_irq_trigger(); m_slave_intc->vblank_irq_trigger(); } - if(scanline == cur_posirq) + if (scanline == cur_posirq) { m_master_intc->pos_irq_trigger(); m_slave_intc->pos_irq_trigger(); diff --git a/src/mame/namco/namcos2_m.cpp b/src/mame/namco/namcos2_m.cpp index 54513263f50..f41f6b0692d 100644 --- a/src/mame/namco/namcos2_m.cpp +++ b/src/mame/namco/namcos2_m.cpp @@ -373,15 +373,15 @@ void namcos2_state::namcos2_68k_key_w(offs_t offset, u16 data) { if (m_gametype == NAMCOS2_MARVEL_LAND && offset == 5) { - if (data == 0x615E) m_sendval = true; + if (data == 0x615e) m_sendval = true; } if (m_gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4) { - if (data == 0x13EC) m_sendval = true; + if (data == 0x13ec) m_sendval = true; } if (m_gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7) { - if (data == 0x13EC) m_sendval = true; + if (data == 0x13ec) m_sendval = true; } if (m_gametype == NAMCOS2_MARVEL_LAND && offset == 6) { diff --git a/src/mame/nec/apc.cpp b/src/mame/nec/apc.cpp index 1e74f6c8a50..5639920a20a 100644 --- a/src/mame/nec/apc.cpp +++ b/src/mame/nec/apc.cpp @@ -54,6 +54,7 @@ #include "emu.h" #include "cpu/i86/i86.h" +#include "cpu/upd177x/upd177x.h" #include "imagedev/floppy.h" #include "machine/am9517a.h" #include "machine/nvram.h" @@ -61,7 +62,6 @@ #include "machine/pit8253.h" #include "machine/upd1990a.h" #include "machine/upd765.h" -#include "sound/upd1771.h" #include "video/upd7220.h" #include "emupal.h" #include "screen.h" @@ -123,7 +123,7 @@ private: uint8_t *m_char_rom = nullptr; required_device<speaker_device> m_speaker; - required_device<upd1771c_device> m_sound; + required_device<upd1771c_cpu_device> m_sound; required_shared_ptr<uint16_t> m_video_ram_1; required_shared_ptr<uint16_t> m_video_ram_2; @@ -500,7 +500,7 @@ void apc_state::apc_io(address_map &map) // 0x5a APU data (Arithmetic Processing Unit!) // 0x5b, Power Off // 0x5e APU status/command - map(0x60, 0x60).rw(m_sound, FUNC(upd1771c_device::read), FUNC(upd1771c_device::write)); + map(0x60, 0x60).rw(m_sound, FUNC(upd1771c_cpu_device::pa_r), FUNC(upd1771c_cpu_device::pa_w)); // map(0x68, 0x6f) i8255 , ODA printer port (A: status (R) B: data (W) C: command (W)) // map(0x70, 0x76).rw("upd7220_btm", FUNC(upd7220_device::read), FUNC(upd7220_device::write)).umask16(0x00ff); // 0x71, 0x77 IDA Controller @@ -992,6 +992,9 @@ ROM_START( apc ) ROM_REGION( 0x2000, "gfx", ROMREGION_ERASE00 ) ROM_LOAD("pfcu1r.bin", 0x000000, 0x002000, CRC(683efa94) SHA1(43157984a1746b2e448f3236f571011af9a3aa73) ) + + ROM_REGION( 0x400, "upd1771c", ROMREGION_ERASE00 ) + ROM_LOAD( "upd1771c_006", 0, 0x400, NO_DUMP ) ROM_END void apc_state::init_apc() diff --git a/src/mame/nec/pc88va.cpp b/src/mame/nec/pc88va.cpp index 35965150fdb..f401d5484d2 100644 --- a/src/mame/nec/pc88va.cpp +++ b/src/mame/nec/pc88va.cpp @@ -256,7 +256,7 @@ void pc88va_state::sys_port5_w(u8 data) u8 pc88va_state::sys_port5_r() { - return m_rstmd | 8; + return (m_rstmd ? 1 : 0) | 8; } uint8_t pc88va_state::hdd_status_r() diff --git a/src/mame/nichibutsu/galivan.cpp b/src/mame/nichibutsu/galivan.cpp index 9b296f4330c..85e36276480 100644 --- a/src/mame/nichibutsu/galivan.cpp +++ b/src/mame/nichibutsu/galivan.cpp @@ -1908,5 +1908,5 @@ GAME( 1986, ninjemak, 0, ninjemak, ninjemak, ninjemak_state, empty_init, GAME( 1986, ninjemat, ninjemak, galivan, galivan, ninjemak_state, empty_init, ROT270, "Nichibutsu (Tecfri license)", "Ninja Emaki (Tecfri license)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) GAME( 1986, youma, ninjemak, ninjemak, ninjemak, ninjemak_state, empty_init, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) GAME( 1986, youma2, ninjemak, ninjemak, ninjemak, ninjemak_state, empty_init, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan, alt)", MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) -GAME( 1986, youmab, ninjemak, youmab, ninjemak, youmab_state, empty_init , ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) // player is invincible +GAME( 1986, youmab, ninjemak, youmab, ninjemak, youmab_state, empty_init, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 1)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) // player is invincible GAME( 1986, youmab2, ninjemak, youmab, ninjemak, youmab_state, empty_init, ROT270, "bootleg", "Youma Ninpou Chou (Game Electronics bootleg, set 2)", MACHINE_NOT_WORKING|MACHINE_SUPPORTS_SAVE|MACHINE_UNEMULATED_PROTECTION ) // "" diff --git a/src/mame/novag/cnchess.cpp b/src/mame/novag/cnchess.cpp index 9abe253b034..d4b6ac00ff7 100644 --- a/src/mame/novag/cnchess.cpp +++ b/src/mame/novag/cnchess.cpp @@ -5,9 +5,9 @@ Novag Chinese Chess (象棋, model 866) -Novag's first Xiangqi computer, mainly sold in Hong Kong. Model 8710 is the same -as model 866, maybe one was for export. The newer model 9300 (distributed by Yorter) -is also presumed to be the same. +Novag's first Xiangqi computer, mainly sold in Hong Kong. Model 8710 (棋王, Chess +King) was distributed by Yorter Electronics for the local market. It's the same +hardware as model 866. The newer model 9300 is also presumed to be the same. Hardware notes: - PCB label: 100054 diff --git a/src/mame/omori/yakyuken.cpp b/src/mame/omori/yakyuken.cpp index d26c645159a..1c7c55ab416 100644 --- a/src/mame/omori/yakyuken.cpp +++ b/src/mame/omori/yakyuken.cpp @@ -341,4 +341,4 @@ ROM_END * *************************************/ -GAME( 1982, yakyuken, 0, yakyuken, yakyuken, yakyuken_state, empty_init, ROT0, "bootleg", "The Yakyuken", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1982, yakyuken, 0, yakyuken, yakyuken, yakyuken_state, empty_init, ROT0, "bootleg", "The Yakyuken (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/pinball/de_3.cpp b/src/mame/pinball/de_3.cpp index 10308af99de..d4f698753ac 100644 --- a/src/mame/pinball/de_3.cpp +++ b/src/mame/pinball/de_3.cpp @@ -1825,6 +1825,19 @@ ROM_START(bmf_it) ROM_LOAD("bmfu21.bin", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) ROM_END +ROM_START(bmf_ita) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("bmcpu_italy.c5", 0x0000, 0x10000, CRC(adab3152) SHA1(d99124f4199988e50933f8fb9de2677e5327e139)) + ROM_REGION16_BE(0x100000, "decodmd3", 0) + ROM_LOAD16_BYTE("bmf_dmd0i.bin", 0x000001, 0x80000, CRC(78e15b14) SHA1(67fba0efcd94e2210ea3532e6a3a8f4a6d5891b0)) + ROM_LOAD16_BYTE("bmf_dmd3i.bin", 0x000000, 0x80000, CRC(759f676b) SHA1(622c105fa30d44b244ef9eeecfdd6f753031fc4d)) + ROM_REGION(0x010000, "decobsmt:soundcpu", 0) + ROM_LOAD("bmfu7.bin", 0x0000, 0x10000, CRC(58c0d144) SHA1(88a404d3625c7c154892282598b4949ac97de12b)) + ROM_REGION(0x1000000, "decobsmt:bsmt", 0) + ROM_LOAD("bmfu17.bin", 0x000000, 0x80000, CRC(edcd5c10) SHA1(561f22fb7817f64e09ef6adda646f58f31b80bf4)) + ROM_LOAD("bmfu21.bin", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) +ROM_END + ROM_START(bmf_sp) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("batnova.401", 0x0000, 0x10000, CRC(4e62df4e) SHA1(6c3be65fc8825f47cd08755b58fdcf3652ede702)) @@ -2187,7 +2200,8 @@ GAME(1995, bmf_be, batmanf, de_3b, de3, de_3_state, empty_init, ROT GAME(1995, bmf_fr, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (French)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_nl, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 4.0)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_nl302, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 3.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_it, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_it, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Nov. 1 1995, Display Rev. 4.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_ita, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian, 4.0, Sept. 26 1995, Display Rev. 4.00)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_sp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Spanish)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_jp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Japanese)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_time, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Timed Play)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_MECHANICAL | MACHINE_REQUIRES_ARTWORK | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/sega/segaybd.h b/src/mame/sega/segaybd.h index 8f43a4827ca..6a7424a0df3 100644 --- a/src/mame/sega/segaybd.h +++ b/src/mame/sega/segaybd.h @@ -53,7 +53,7 @@ public: , m_upright_wheel_motor(*this, "upright_wheel_motor") , m_left_start_lamp(*this, "left_start_lamp") , m_right_start_lamp(*this, "right_start_lamp") - , m_gun_recoil(*this, "P%_Gun_Recoil", 1U) + , m_gun_recoil(*this, "P%u_Gun_Recoil", 1U) { } diff --git a/src/mame/sega/system1.cpp b/src/mame/sega/system1.cpp index 3443a59d3a3..577f5c20e70 100644 --- a/src/mame/sega/system1.cpp +++ b/src/mame/sega/system1.cpp @@ -11,8 +11,6 @@ to run on IDENTICAL hardware (they were sold by Bally-Midway as ROM swaps). TODO: - fully understand nobb ports involved in the protection -- different XTAL/divider configurations for some Star Jacker cabinets? - See you.tube/-a7srHVPb_U ******************************************************************************* diff --git a/src/mame/sega/system1_v.cpp b/src/mame/sega/system1_v.cpp index 67ecd75561e..69d1b3ead4c 100644 --- a/src/mame/sega/system1_v.cpp +++ b/src/mame/sega/system1_v.cpp @@ -533,7 +533,7 @@ void system1_state::video_update_common(screen_device &screen, bitmap_ind16 &bit const u16 sprpix = sprbase[x]; // using the sprite, background, and foreground pixels, look up the color behavior - const u8 lookup_index = (((sprpix & 0xf) == 0) << 0) | + const u8 lookup_index = (((sprpix & 0xf) == 0) << 0) | (((fgpix & 7) == 0) << 1) | (((fgpix >> 9) & 3) << 2) | (((bgpix & 7) == 0) << 4) | diff --git a/src/mame/sinclair/atm.cpp b/src/mame/sinclair/atm.cpp index 7b37c488aa5..5df94a09d1e 100644 --- a/src/mame/sinclair/atm.cpp +++ b/src/mame/sinclair/atm.cpp @@ -95,7 +95,7 @@ void atm_state::atm_port_ff_w(offs_t offset, u8 data) { // Must read current ULA value (which is doesn't work now) from the BUS. // Good enough as non-border case is too complicated and possibly no software uses it. - u8 pen = get_border_color(m_screen->hpos(), m_screen->vpos()); + u8 pen = 0x0f & get_border_color(m_screen->hpos(), m_screen->vpos()); m_palette_data[pen] = data; m_palette->set_pen_color(pen, (BIT(~data, 1) * 0xaa) | (BIT(~data, 6) * 0x55), @@ -440,12 +440,12 @@ void atm_state::machine_reset() m_beta->enable(); m_beta_drive_selected = 0; + m_port_fe_data = -1; m_port_7ffd_data = 0; m_port_1ffd_data = -1; m_port_77_data = 0; m_br3 = 0; - m_palette_data = { 0xff }; atm_port_77_w(0x4000, 3); // m_port_77_data: CPM=0(on), PEN=0(off), PEN2=1(off); vmode: zx } diff --git a/src/mame/sinclair/atm.h b/src/mame/sinclair/atm.h index e6cbfeaaa2b..c04285a083a 100644 --- a/src/mame/sinclair/atm.h +++ b/src/mame/sinclair/atm.h @@ -102,7 +102,7 @@ protected: bool m_pen2; // palette selector u8 m_rg = 0b011; // 0:320x200lo, 2:640:200hi, 3:256x192zx, 6:80x25txt u8 m_br3; - std::vector<u8> m_palette_data; + u8 m_palette_data[16]; u8 m_ata_data_latch; u8 m_beta_drive_selected; }; diff --git a/src/mame/sinclair/pentevo.cpp b/src/mame/sinclair/pentevo.cpp index 2a7896255e8..c1ac0017368 100644 --- a/src/mame/sinclair/pentevo.cpp +++ b/src/mame/sinclair/pentevo.cpp @@ -194,7 +194,7 @@ void pentevo_state::atm_port_ff_w(offs_t offset, u8 data) { if (BIT(m_port_bf_data, 5) && !m_pen2) { - u8 pen = get_border_color(m_screen->hpos(), m_screen->vpos()); + u8 pen = 0x0f & get_border_color(m_screen->hpos(), m_screen->vpos()); m_palette_data[pen] = data; m_palette->set_pen_color(pen, (BIT(~data, 1) * 0x88) | (BIT(~data, 6) * 0x44) | (BIT(~offset, 9) * 0x22) | (BIT(~offset, 14) * 0x11), diff --git a/src/mame/taito/bublbobl.cpp b/src/mame/taito/bublbobl.cpp index 9ff0eb3190a..2ec52e78cfa 100644 --- a/src/mame/taito/bublbobl.cpp +++ b/src/mame/taito/bublbobl.cpp @@ -848,7 +848,7 @@ void bublbobl_state::tokio(machine_config &config) TAITO68705_MCU(config, "bmcu", MAIN_XTAL/8); // 3 Mhz - config.set_perfect_quantum(m_maincpu); // is this necessary? + config.set_maximum_quantum(attotime::from_hz(6000)); WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 128); // 74LS393, counts 128 vblanks before firing watchdog; same circuit as taitosj uses @@ -943,7 +943,7 @@ void bublbobl_state::bublbobl_nomcu(machine_config &config) Z80(config, m_audiocpu, MAIN_XTAL/8); // 3 MHz m_audiocpu->set_addrmap(AS_PROGRAM, &bublbobl_state::sound_map); // IRQs are triggered by the YM2203 - config.set_maximum_quantum(attotime::from_hz(6000)); // 100 CPU slices per frame - a high value to ensure proper synchronization of the CPUs + config.set_maximum_quantum(attotime::from_hz(6000)); // a high value to ensure proper synchronization of the CPUs WATCHDOG_TIMER(config, "watchdog").set_vblank_count("screen", 128); // 74LS393, counts 128 vblanks before firing watchdog; same circuit as taitosj uses @@ -2127,11 +2127,11 @@ GAME( 1986, tokioo, tokio, tokio, tokio, bublbobl_state, init_co GAME( 1986, tokiou, tokio, tokio, tokio, bublbobl_state, init_common, ROT90, "Taito America Corporation (Romstar license)", "Tokio / Scramble Formation (US)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, tokiob, tokio, tokiob, tokio_base, bublbobl_state, init_common, ROT90, "bootleg", "Tokio / Scramble Formation (bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, bublboblp, bublbobl, bublboblp, bublboblp, bublbobl_state, init_common, ROT0, "Taito Corporation", "Bubble Bobble (prototype on Tokio hardware)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, bublbobl, 0, bublbobl, bublbobl, bublbobl_state, init_common, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.1)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, bublbobl1, bublbobl, bublbobl, bublbobl, bublbobl_state, init_common, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.0)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, bublboblr, bublbobl, bublbobl, bublbobl, bublbobl_state, init_common, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 5.1)", MACHINE_SUPPORTS_SAVE ) // newest release, with mode select GAME( 1986, bublboblr1, bublbobl, bublbobl, bublbobl, bublbobl_state, init_common, ROT0, "Taito America Corporation (Romstar license)", "Bubble Bobble (US, Ver 1.0)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, bublboblp, bublbobl, bublboblp, bublboblp, bublbobl_state, init_common, ROT0, "Taito Corporation", "Bubble Bobble (prototype on Tokio hardware)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, boblbobl, bublbobl, boblbobl, boblbobl, bublbobl_state, init_common, ROT0, "bootleg", "Bobble Bobble (bootleg of Bubble Bobble)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, sboblbobl, bublbobl, boblbobl, sboblbobl, bublbobl_state, init_common, ROT0, "bootleg (Datsu)", "Super Bobble Bobble (bootleg, set 1)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/taito/bublbobl.h b/src/mame/taito/bublbobl.h index 3c4a1432166..41fbb6530f5 100644 --- a/src/mame/taito/bublbobl.h +++ b/src/mame/taito/bublbobl.h @@ -12,6 +12,7 @@ #include "machine/gen_latch.h" #include "sound/ymopn.h" #include "sound/ymopl.h" + #include "emupal.h" #include "screen.h" diff --git a/src/mame/taito/taito_z.cpp b/src/mame/taito/taito_z.cpp index b0ddf5db258..b297d324296 100644 --- a/src/mame/taito/taito_z.cpp +++ b/src/mame/taito/taito_z.cpp @@ -2551,8 +2551,8 @@ static INPUT_PORTS_START( bsharkjjs ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Fire") PORT_PLAYER(1) /* "Fire" */ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Warp") PORT_PLAYER(1) /* Same as Fire, but called "Warp" in Service Mode */ INPUT_PORTS_END diff --git a/src/mame/taito/taitotz.cpp b/src/mame/taito/taitotz.cpp index c3ddcb03cd1..4cec9e9b8bc 100644 --- a/src/mame/taito/taitotz.cpp +++ b/src/mame/taito/taitotz.cpp @@ -180,10 +180,25 @@ Notes: #include "video/poly.h" #include "screen.h" -#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) -#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) +#define LOG_PPC_TO_TLCS_COMMANDS (1U << 1) +#define LOG_TLCS_TO_PPC_COMMANDS (1U << 2) +#define LOG_VIDEO_REG_1_RD (1U << 3) +#define LOG_VIDEO_REG_2_RD (1U << 4) +#define LOG_VIDEO_REG_UNK_RD (1U << 5) +#define LOG_VIDEO_REG_1_WR (1U << 6) +#define LOG_VIDEO_REG_2_WR (1U << 7) +#define LOG_VIDEO_REG_UNK_WR (1U << 8) +#define LOG_VIDEO_CHIP_UNK_RD (1U << 9) +#define LOG_VIDEO_CHIP_UNK_WR (1U << 10) +#define LOG_DIRECT_FIFO (1U << 11) +#define LOG_TNL_FIFO (1U << 12) +#define LOG_RTC_UNK_RD (1U << 13) +#define LOG_RTC_UNK_WR (1U << 14) +#define LOG_VIDEO_MEM_UNK_RD (1U << 15) +#define LOG_VIDEO_MEM_UNK_WR (1U << 16) + +#define VERBOSE (0) -#define VERBOSE (LOG_PPC_TO_TLCS_COMMANDS | LOG_TLCS_TO_PPC_COMMANDS) #include "logmacro.h" @@ -366,40 +381,40 @@ Notes: Display list format ------------------- - 0xffff0010: ? + 0xffff0010: ? - 0xffff0011: Draw Polygon Object - 0 = Polygon data address (21 bits) in screen RAM (in dwords). If 0x400000 set, no matrix. - 1 = Object scale (float), if <1.0f multiply scale by 2.0f - 2 = 0x80 = object alpha enable, 0x1f = object alpha (0x1f = opaque) - 3 = ? - 4...15 = 4x3 matrix + 0xffff0011: Draw Polygon Object + Word 0: Polygon data address (21 bits) in screen RAM (in dwords). If 0x400000 set, no matrix. + Word 1: Object scale (float), if <1.0f multiply scale by 2.0f + Word 2: 0x80 = object alpha enable, 0x1f = object alpha (0x1f = opaque) + Word 3: ? + Words 4...15: 4x3 matrix - 0xffff0020: ? (no parameters) + 0xffff0020: ? (no parameters) - 0xffff0021: Draw Pretransformed Polygon (used for drawing the background images) - 0 = address? (if 0x400 set, 24 words) - 1 = Texture number (* 0x4000 to address the texture) - 2 = ? - 3 = ? (usually 0) + 0xffff0021: Draw Pretransformed Polygon (used for drawing the background images) + Word 0: Address? (if 0x400 set, 24 words) + Word 1: Texture number (* 0x4000 to address the texture) + Word 2: ? + Word 3: ? (usually 0) - Vertex data: 4x or 5x 4 words - 0 = XY coordinates. X = high 16 bits, Y = low 16 bits - 1 = Z value? - 2 = UV coordinates. U = high 16 bits, V = low 16 bits (possibly shifted left by 4?) - 3 = ? (usually 0) + Vertex data: 4 or 5 groups of 4 words + Word 0: XY coordinates. X in high 16 bits, Y in low 16 bits. + Word 1: Z value? + Word 2: UV coordinates. U in high 16 bits, V in low 16 bits (possibly shifted left by 4?) + Word 3: ? (usually 0) - 0xffff0022: ? (1 word) - 0 = ? (Set to 0x00000001 before drawing the background. Z-buffer read disable?) + 0xffff0022: ? (1 word) + Word 0: ? (Set to 0x00000001 before drawing the background. Z-buffer read disable?) - 0xffff0030: ? (2 + n words) FIFO write? - 0 = ? - 1 = num of words - n words = ? + 0xffff0030: ? (2 + n words) FIFO write? + Word 0: ? + Word 1: Word count + Words 2...n: ? - 0xffff0080: Display List Call? + 0xffff0080: Display List Call? - 0xffff00ff: End of List? + 0xffff00ff: End of List? Polygon data format ------------------- @@ -447,22 +462,11 @@ Notes: e1000185 0cee7d03 0c000000 00000000 Trackpiece f1000068 0c007f00 0c7e0000 0400007f Car shadow (BG2 0x1f160) - - - - - - - - - - - Vertex data: 3x (triangle) or 4x (quad) 4 words Word 0: -------- -------- -------- xxxxxxxx Texture V coordinate (0..63 with max 4x repeat) -------- -------- xxxxxxxx -------- Texture U coordinate (0..63 with max 4x repeat) - -------- xxxxxxxx -------- -------- Usually 0x40. HUD elements set 0xff. Self-illumination? + -------- xxxxxxxx -------- -------- Usually 0x40. HUD elements set 0xff. Emissive? xxxxxxxx -------- -------- -------- ? (seen 0x00, 0x83, 0x40) Word 1: @@ -518,8 +522,6 @@ Notes: namespace { -#define ENABLE_LIGHTING 1 - #define PPC_TLCS_COMM_TRIGGER 12345 #define TLCS_PPC_COMM_TRIGGER 12346 @@ -532,9 +534,9 @@ typedef float VECTOR3[3]; struct taitotz_polydata { - uint32_t texture; - uint32_t alpha; - uint32_t flags; + u32 texture; + u32 alpha; + u32 flags; int diffuse_r, diffuse_g, diffuse_b; int ambient_r, ambient_g, ambient_b; int specular_r, specular_g, specular_b; @@ -581,71 +583,73 @@ protected: virtual void video_start() override ATTR_COLD; private: - required_device<ppc_device> m_maincpu; - required_device<tmp95c063_device> m_iocpu; - required_shared_ptr<uint64_t> m_work_ram; - required_shared_ptr<uint16_t> m_mbox_ram; - required_device<ata_interface_device> m_ata; + static constexpr bool ENABLE_DEBUG_PRINTS = false; + static constexpr bool ENABLE_DEBUG_RAM = false; - uint64_t ppc_common_r(offs_t offset, uint64_t mem_mask = ~0); - void ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t ieee1394_r(offs_t offset, uint64_t mem_mask = ~0); - void ieee1394_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t video_chip_r(offs_t offset, uint64_t mem_mask = ~0); - void video_chip_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); - uint64_t video_fifo_r(offs_t offset, uint64_t mem_mask = ~0); - void video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask = ~0); + void landhigh_tlcs900h_mem(address_map &map) ATTR_COLD; + void ppc603e_mem(address_map &map) ATTR_COLD; + void tlcs900h_mem(address_map &map) ATTR_COLD; - std::unique_ptr<uint32_t[]> m_screen_ram; - std::unique_ptr<uint32_t[]> m_frame_ram; - std::unique_ptr<uint32_t[]> m_texture_ram; - uint32_t m_video_unk_reg[0x10]{}; + u64 ppc_common_r(offs_t offset, u64 mem_mask = ~0); + void ppc_common_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u64 ieee1394_r(offs_t offset, u64 mem_mask = ~0); + void ieee1394_w(offs_t offset, u64 data, u64 mem_mask = ~0); + + void dump_video_ram(); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void draw_tile(u32 pos, u32 tile); + void vblank(int state); + u64 video_chip_r(offs_t offset, u64 mem_mask = ~0); + void video_chip_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u64 video_fifo_r(offs_t offset, u64 mem_mask = ~0); + void video_fifo_w(offs_t offset, u64 data, u64 mem_mask = ~0); + u32 video_mem_r(u32 address); + void video_mem_w(u32 address, u32 data); + u32 video_reg_r(u32 reg); + void video_reg_w(u32 reg, u32 data); + + u16 tlcs_ide0_r(offs_t offset, u16 mem_mask = ~0); + u16 tlcs_ide1_r(offs_t offset, u16 mem_mask = ~0); + u8 tlcs_common_r(offs_t offset); + void tlcs_common_w(offs_t offset, u8 data); + u8 tlcs_rtc_r(offs_t offset); + void tlcs_rtc_w(offs_t offset, u8 data); + void ide_interrupt(int state); - uint32_t m_video_fifo_ptr = 0; - uint32_t m_video_ram_ptr = 0; - uint32_t m_video_reg = 0; - uint32_t m_scr_base = 0; + void init_taitotz_152(); + void init_taitotz_111a(); - //uint64_t m_video_fifo_mem[4]{}; + required_device<ppc_device> m_maincpu; + required_device<tmp95c063_device> m_iocpu; + required_shared_ptr<u64> m_work_ram; + required_shared_ptr<u16> m_mbox_ram; + required_device<ata_interface_device> m_ata; - uint16_t m_io_share_ram[0x2000]{}; + std::unique_ptr<u32[]> m_screen_ram; + std::unique_ptr<u32[]> m_frame_ram; + std::unique_ptr<u32[]> m_texture_ram; + u32 m_video_unk_reg[0x10]{}; - const char *m_hdd_serial_number = nullptr; + u32 m_video_fifo_ptr = 0; + u32 m_video_ram_ptr = 0; + u32 m_video_reg = 0; + u32 m_scr_base = 0; - uint8_t tlcs_common_r(offs_t offset); - void tlcs_common_w(offs_t offset, uint8_t data); - uint8_t tlcs_rtc_r(offs_t offset); - void tlcs_rtc_w(offs_t offset, uint8_t data); + u16 m_io_share_ram[0x2000]{}; - uint8_t m_rtcdata[8]{}; + const char *m_hdd_serial_number = nullptr; + u8 m_rtcdata[8]{}; - uint32_t m_reg105 = 0; + u32 m_reg105 = 0; std::unique_ptr<taitotz_renderer> m_renderer; - - uint32_t screen_update_taitotz(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(taitotz_vbi); - uint16_t tlcs_ide0_r(offs_t offset, uint16_t mem_mask = ~0); - uint16_t tlcs_ide1_r(offs_t offset, uint16_t mem_mask = ~0); - void ide_interrupt(int state); - void draw_tile(uint32_t pos, uint32_t tile); - uint32_t video_mem_r(uint32_t address); - void video_mem_w(uint32_t address, uint32_t data); - uint32_t video_reg_r(uint32_t reg); - void video_reg_w(uint32_t reg, uint32_t data); - void init_taitotz_152(); - void init_taitotz_111a(); - - void landhigh_tlcs900h_mem(address_map &map) ATTR_COLD; - void ppc603e_mem(address_map &map) ATTR_COLD; - void tlcs900h_mem(address_map &map) ATTR_COLD; }; class taitotz_renderer : public poly_manager<float, taitotz_polydata, 6> { public: - taitotz_renderer(taitotz_state &state, int width, int height, uint32_t *scrram, uint32_t *texram) + taitotz_renderer(taitotz_state &state, int width, int height, u32 *scrram, u32 *texram) : poly_manager<float, taitotz_polydata, 6>(state.machine()), m_state(state) { @@ -665,19 +669,24 @@ public: } void render_displaylist(const rectangle &cliprect); - void draw_object(uint32_t address, float scale, uint8_t alpha); + void draw_object(u32 address, float scale, u8 alpha); float line_plane_intersection(const vertex_t *v1, const vertex_t *v2, PLANE cp); int clip_polygon(const vertex_t *v, int num_vertices, PLANE cp, vertex_t *vout); void setup_viewport(int x, int y, int width, int height, int center_x, int center_y); - void draw_scanline_noz(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); - void draw_scanline(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); + void draw_scanline_noz(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); + void draw_scanline(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid); - void push_tnl_fifo(uint32_t data); - void push_direct_poly_fifo(uint32_t data); + void push_tnl_fifo(u32 data); + void push_direct_poly_fifo(u32 data); - void render_tnl_object(uint32_t address, float scale, uint8_t alpha); + void render_tnl_object(u32 address, float scale, u8 alpha); void draw(bitmap_rgb32 &bitmap, const rectangle &cliprect); + int direct_fifo_ptr() const { return m_direct_fifo_ptr; } + + static float dot_product_vec3(VECTOR3 a, const VECTOR3 b); + static float clamp_pos(float v); + static u32 generate_texel_address(int iu, int iv); private: enum @@ -690,13 +699,13 @@ private: POLY_NZ = 5 }; - //static const float ZBUFFER_MAX = 10000000000.0f; + static constexpr bool ENABLE_LIGHTING = true; taitotz_state &m_state; std::unique_ptr<bitmap_rgb32> m_fb; std::unique_ptr<bitmap_ind32> m_zbuffer; - uint32_t *m_texture = nullptr; - uint32_t *m_screen_ram = nullptr; + u32 *m_texture = nullptr; + u32 *m_screen_ram = nullptr; rectangle m_cliprect; @@ -725,119 +734,87 @@ private: float m_vp_y = 0; float m_vp_mul = 0; - uint32_t m_reg_100 = 0; - uint32_t m_reg_101 = 0; - uint32_t m_reg_102 = 0; + u32 m_reg_100 = 0; + u32 m_reg_101 = 0; + u32 m_reg_102 = 0; - uint32_t m_reg_10000100 = 0; - uint32_t m_reg_10000101 = 0; + u32 m_reg_10000100 = 0; + u32 m_reg_10000101 = 0; - uint32_t m_tnl_fifo[64]{}; - uint32_t m_direct_fifo[64]{}; + u32 m_tnl_fifo[64]{}; + u32 m_direct_fifo[64]{}; int m_tnl_fifo_ptr = 0; int m_direct_fifo_ptr = 0; -}; - + static const float DOT3_TEX_TABLE[32]; +}; -/* -void taitotz_state::taitotz_exit() +void taitotz_state::dump_video_ram() { + FILE *file = fopen("screen_ram.bin","wb"); + for (int i = 0; i < 0x200000; i++) + { + fputc((u8)(m_screen_ram[i] >> 24), file); + fputc((u8)(m_screen_ram[i] >> 16), file); + fputc((u8)(m_screen_ram[i] >> 8), file); + fputc((u8)(m_screen_ram[i] >> 0), file); + } + fclose(file); + file = fopen("frame_ram.bin","wb"); + for (int i = 0; i < 0x80000; i++) + { + fputc((u8)(m_frame_ram[i] >> 24), file); + fputc((u8)(m_frame_ram[i] >> 16), file); + fputc((u8)(m_frame_ram[i] >> 8), file); + fputc((u8)(m_frame_ram[i] >> 0), file); + } + fclose(file); - FILE *file; - int i; - - file = fopen("screen_ram.bin","wb"); - for (i=0; i < 0x200000; i++) - { - fputc((uint8_t)(m_screen_ram[i] >> 24), file); - fputc((uint8_t)(m_screen_ram[i] >> 16), file); - fputc((uint8_t)(m_screen_ram[i] >> 8), file); - fputc((uint8_t)(m_screen_ram[i] >> 0), file); - } - fclose(file); - - file = fopen("frame_ram.bin","wb"); - for (i=0; i < 0x80000; i++) - { - fputc((uint8_t)(m_frame_ram[i] >> 24), file); - fputc((uint8_t)(m_frame_ram[i] >> 16), file); - fputc((uint8_t)(m_frame_ram[i] >> 8), file); - fputc((uint8_t)(m_frame_ram[i] >> 0), file); - } - fclose(file); - - file = fopen("texture_ram.bin","wb"); - for (i=0; i < 0x800000; i++) - { - fputc((uint8_t)(m_texture_ram[i] >> 24), file); - fputc((uint8_t)(m_texture_ram[i] >> 16), file); - fputc((uint8_t)(m_texture_ram[i] >> 8), file); - fputc((uint8_t)(m_texture_ram[i] >> 0), file); - } - fclose(file); - + file = fopen("texture_ram.bin","wb"); + for (int i = 0; i < 0x800000; i++) + { + fputc((u8)(m_texture_ram[i] >> 24), file); + fputc((u8)(m_texture_ram[i] >> 16), file); + fputc((u8)(m_texture_ram[i] >> 8), file); + fputc((u8)(m_texture_ram[i] >> 0), file); + } + fclose(file); } -*/ + void taitotz_state::video_start() { int width = m_screen->width(); int height = m_screen->height(); - m_screen_ram = std::make_unique<uint32_t[]>(0x200000); - m_frame_ram = std::make_unique<uint32_t[]>(0x80000); - m_texture_ram = std::make_unique<uint32_t[]>(0x800000); + m_screen_ram = std::make_unique<u32[]>(0x200000); + m_frame_ram = std::make_unique<u32[]>(0x80000); + m_texture_ram = std::make_unique<u32[]>(0x800000); - /* create renderer */ m_renderer = std::make_unique<taitotz_renderer>(*this, width, height, m_screen_ram.get(), m_texture_ram.get()); - //machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&taitotz_exit, &machine())); + if (ENABLE_DEBUG_RAM) + { + machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(&taitotz_state::dump_video_ram, this)); + } m_video_reg = 0; } -static const float dot3_tex_table[32] = +const float taitotz_renderer::DOT3_TEX_TABLE[32] = { -0.500000f, -0.466666f, -0.433333f, -0.400000f, -0.366666f, -0.333333f, -0.300000f, -0.266666f, -0.233333f, -0.200000f, -0.166666f, -0.133333f, -0.100000f, -0.066666f, -0.033333f, -0.000000f, - 0.000000f, 0.033333f, 0.066666f, 0.100000f, 0.133333f, 0.166666f, 0.200000f, 0.233333f, - 0.266666f, 0.300000f, 0.333333f, 0.366666f, 0.400000f, 0.433333f, 0.466666f, 0.500000f, + 0.000000f, 0.033333f, 0.066666f, 0.100000f, 0.133333f, 0.166666f, 0.200000f, 0.233333f, + 0.266666f, 0.300000f, 0.333333f, 0.366666f, 0.400000f, 0.433333f, 0.466666f, 0.500000f, }; -static inline float dot_product_vec3(VECTOR3 a, VECTOR3 b) +float taitotz_renderer::dot_product_vec3(VECTOR3 a, const VECTOR3 b) { return (a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]); } -// Fast inverse square-root -// Adapted from http://en.wikipedia.org/wiki/Fast_inverse_square_root -static inline float finvsqrt(float number) -{ - uint32_t i; - float x2, y; - const float threehalfs = 1.5f; - - x2 = number * 0.5f; - y = number; - i = *(uint32_t*)&y; - i = 0x5f3759df - ( i >> 1 ); - y = *(float*)&i; - y = y * ( threehalfs - ( x2 * y * y ) ); - return y; -} - -#if 0 -static inline void normalize_vec3(VECTOR3 *v) -{ - float l = finvsqrt(*v[0] * *v[0] + *v[1] * *v[1] + *v[2] * *v[2]); - *v[0] *= l; - *v[1] *= l; - *v[2] *= l; -} -#endif - -static inline float clamp_pos(float v) +float taitotz_renderer::clamp_pos(float v) { if (v < 0.0f) return 0.0f; @@ -845,10 +822,10 @@ static inline float clamp_pos(float v) return v; } -static inline uint32_t generate_texel_address(int iu, int iv) +u32 taitotz_renderer::generate_texel_address(int iu, int iv) { // generate texel address from U and V - uint32_t addr = 0; + u32 addr = 0; addr += (iu & 0x01) ? 1 : 0; addr += (iu >> 1) * 4; addr += (iv & 0x01) ? 2 : 0; @@ -857,16 +834,16 @@ static inline uint32_t generate_texel_address(int iu, int iv) return addr; } -void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) +void taitotz_renderer::draw_scanline_noz(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) { - uint32_t *const fb = &m_fb->pix(scanline); + u32 *const fb = &m_fb->pix(scanline); float u = extent.param[POLY_U].start; float v = extent.param[POLY_V].start; float const du = extent.param[POLY_U].dpdx; float const dv = extent.param[POLY_V].dpdx; - uint32_t *texram = &m_texture[extradata.texture * 0x1000]; + u32 *texram = &m_texture[extradata.texture * 0x1000]; int shift = 16; // TODO: subtexture @@ -875,9 +852,9 @@ void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &exten int iu = (int)(u) & 0x3f; int iv = (int)(v) & 0x3f; - uint32_t addr = generate_texel_address(iu, iv); + u32 addr = generate_texel_address(iu, iv); - uint32_t texel = (texram[addr] >> shift) & 0xffff; + u32 texel = (texram[addr] >> shift) & 0xffff; if (!(texel & 0x8000)) { int r = (texel & 0x7c00) << 9; @@ -891,9 +868,9 @@ void taitotz_renderer::draw_scanline_noz(int32_t scanline, const extent_t &exten } } -void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) +void taitotz_renderer::draw_scanline(s32 scanline, const extent_t &extent, const taitotz_polydata &extradata, int threadid) { - uint32_t *const fb = &m_fb->pix(scanline); + u32 *const fb = &m_fb->pix(scanline); float *const zb = (float*)&m_zbuffer->pix(scanline); float ooz = extent.param[POLY_Z].start; @@ -903,48 +880,24 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c const float duoz = extent.param[POLY_U].dpdx; const float dvoz = extent.param[POLY_V].dpdx; - float nx= extent.param[POLY_NX].start; - float dnx = extent.param[POLY_NX].dpdx; + float nx = extent.param[POLY_NX].start; float ny = extent.param[POLY_NY].start; - const float dny = extent.param[POLY_NY].dpdx; float nz = extent.param[POLY_NZ].start; + const float dnx = extent.param[POLY_NX].dpdx; + const float dny = extent.param[POLY_NY].dpdx; const float dnz = extent.param[POLY_NZ].dpdx; - uint32_t *const texram = &m_texture[extradata.texture * 0x1000]; - uint32_t alpha = extradata.alpha & 0x1f; - uint32_t alpha_enable = extradata.alpha & 0x80; - - int texmode = extradata.flags & 0x3; - -#if ENABLE_LIGHTING - int diff_r = extradata.diffuse_r; - int diff_g = extradata.diffuse_g; - int diff_b = extradata.diffuse_b; - int amb_r = extradata.ambient_r; - int amb_g = extradata.ambient_g; - int amb_b = extradata.ambient_b; - int spec_r = extradata.specular_r; - int spec_g = extradata.specular_g; - int spec_b = extradata.specular_b; + u32 *const texram = &m_texture[extradata.texture * 0x1000]; + u32 alpha = extradata.alpha & 0x1f; + u32 alpha_enable = extradata.alpha & 0x80; VECTOR3 view = { -0.0f, -0.0f, -1.0f }; - VECTOR3 light_vector; - light_vector[0] = extradata.light[0]; - light_vector[1] = extradata.light[1]; - light_vector[2] = extradata.light[2]; -#endif - // TODO: these might get swapped around, the color texture doesn't always seem to be tex0 - //int tex0_shift = (extradata.flags & 1) ? 16 : 0; - int tex0_shift, tex1_shift; - switch (texmode) - { - case 0: tex0_shift = 16; tex1_shift = 0; break; - case 1: tex0_shift = 16; tex1_shift = 0; break; - case 2: tex0_shift = 16; tex1_shift = 0; break; - default: tex0_shift = 0; tex1_shift = 16; break; - } + static constexpr int TEX_SHIFTS[4][2] = { { 16, 0 }, { 16, 0 }, { 16, 0 }, { 0, 16 } }; + int texmode = extradata.flags & 3; + int tex0_shift = TEX_SHIFTS[texmode][0]; + int tex1_shift = TEX_SHIFTS[texmode][1]; for (int x = extent.startx; x < extent.stopx; x++) { @@ -956,10 +909,10 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int iu = (int)(u) & 0x3f; int iv = (int)(v) & 0x3f; - uint32_t addr = generate_texel_address(iu, iv); + u32 addr = generate_texel_address(iu, iv); - uint32_t texel = texram[addr]; - uint32_t texel0 = (texel >> tex0_shift) & 0xffff; + u32 texel = texram[addr]; + u32 texel0 = (texel >> tex0_shift) & 0xffff; if (!(texel0 & 0x8000)) { // extract texel0 RGB @@ -967,58 +920,53 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int g0 = (texel0 & 0x03e0) >> 2; int b0 = (texel0 & 0x001f) << 3; -#if ENABLE_LIGHTING - // fetch texture1 and apply normal map - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; - - VECTOR3 normal; - VECTOR3 half; - - float bumpx = dot3_tex_table[(texel1 & 0x7c00) >> 10]; - float bumpy = dot3_tex_table[(texel1 & 0x03e0) >> 5]; - float bumpz = dot3_tex_table[(texel1 & 0x001f)]; - - // FIXME!!! the normal needs to be in tangent-space so the bump normal can be applied!!! - normal[0] = nx + bumpx; - normal[1] = ny + bumpy; - normal[2] = nz + bumpz; - - // normalize - float l = finvsqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]); - normal[0] *= l; - normal[1] *= l; - normal[2] *= l; - - // calculate per-pixel lighting - float dot = dot_product_vec3(normal, light_vector); - - - // calculate half-angle vector for specular - half[0] = light_vector[0] + view[0]; - half[1] = light_vector[1] + view[1]; - half[2] = light_vector[2] + view[2]; - // normalize it - l = finvsqrt(half[0] * half[0] + half[1] * half[1] + half[2] * half[2]); - half[0] *= l; - half[1] *= l; - half[2] *= l; - - // calculate specularity - int specular = (int)(pow(clamp_pos(dot_product_vec3(normal, half)), m_specular_power) * m_specular_intensity); - int intensity = (int)(dot * m_diffuse_intensity); - - // apply lighting - r0 = ((r0 * intensity * diff_r) >> 16) + ((r0 * amb_r) >> 8) + ((specular * spec_r) >> 8); - g0 = ((g0 * intensity * diff_g) >> 16) + ((g0 * amb_g) >> 8) + ((specular * spec_g) >> 8); - b0 = ((b0 * intensity * diff_b) >> 16) + ((b0 * amb_b) >> 8) + ((specular * spec_b) >> 8); - - if (r0 > 255) r0 = 255; - if (g0 > 255) g0 = 255; - if (b0 > 255) b0 = 255; - if (r0 < 0) r0 = 0; - if (g0 < 0) g0 = 0; - if (b0 < 0) b0 = 0; -#endif + if (ENABLE_LIGHTING) + { + // fetch texture1 and apply normal map + u32 texel1 = (texel >> tex1_shift) & 0xffff; + + const float bumpx = DOT3_TEX_TABLE[(texel1 & 0x7c00) >> 10]; + const float bumpy = DOT3_TEX_TABLE[(texel1 & 0x03e0) >> 5]; + const float bumpz = DOT3_TEX_TABLE[(texel1 & 0x001f)]; + + // FIXME!!! the normal needs to be in tangent-space so the bump normal can be applied!!! + VECTOR3 normal; + normal[0] = nx + bumpx; + normal[1] = ny + bumpy; + normal[2] = nz + bumpz; + + // normalize + float l = 1.0f / sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]); + normal[0] *= l; + normal[1] *= l; + normal[2] *= l; + + // calculate per-pixel lighting + float dot = dot_product_vec3(normal, extradata.light); + + // calculate half-angle vector for specular + VECTOR3 half; + half[0] = extradata.light[0] + view[0]; + half[1] = extradata.light[1] + view[1]; + half[2] = extradata.light[2] + view[2]; + // normalize it + l = 1.0f / sqrtf(half[0] * half[0] + half[1] * half[1] + half[2] * half[2]); + half[0] *= l; + half[1] *= l; + half[2] *= l; + + // calculate specularity + const int specular = (int)(pow(clamp_pos(dot_product_vec3(normal, half)), m_specular_power) * m_specular_intensity); + const int intensity = (int)(dot * m_diffuse_intensity); + + // apply lighting + r0 = ((r0 * intensity * extradata.diffuse_r) >> 16) + ((r0 * extradata.ambient_r) >> 8) + ((specular * extradata.specular_r) >> 8); + g0 = ((g0 * intensity * extradata.diffuse_g) >> 16) + ((g0 * extradata.ambient_g) >> 8) + ((specular * extradata.specular_g) >> 8); + b0 = ((b0 * intensity * extradata.diffuse_b) >> 16) + ((b0 * extradata.ambient_b) >> 8) + ((specular * extradata.specular_b) >> 8); + r0 = std::clamp(r0, 0, 255); + g0 = std::clamp(g0, 0, 255); + b0 = std::clamp(b0, 0, 255); + } // texture alpha mask if (texmode == 2) @@ -1029,7 +977,7 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int b0 = (texel0 & 0x001f) << 3; // fetch texture1 - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; + u32 texel1 = (texel >> tex1_shift) & 0xffff; if (!(texel1 & 0x8000)) { @@ -1059,7 +1007,7 @@ void taitotz_renderer::draw_scanline(int32_t scanline, const extent_t &extent, c int b0 = texel0 & 0x1f; // fetch texture1 - uint32_t texel1 = (texel >> tex1_shift) & 0xffff; + u32 texel1 = (texel >> tex1_shift) & 0xffff; int r1 = (texel1 & 0x7c00) >> 7; int g1 = (texel1 & 0x03e0) >> 2; @@ -1141,25 +1089,21 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp { vertex_t clipv[10]; int clip_verts = 0; - float t; - int i; - int previ = num_vertices - 1; - - for (i=0; i < num_vertices; i++) + for (int i = 0; i < num_vertices; i++) { int v1_in = is_point_inside(v[i].x, v[i].y, v[i].p[POLY_Z], cp); int v2_in = is_point_inside(v[previ].x, v[previ].y, v[previ].p[POLY_Z], cp); - if (v1_in && v2_in) /* edge is completely inside the volume */ + if (v1_in && v2_in) // edge is completely inside the volume { clipv[clip_verts] = v[i]; ++clip_verts; } - else if (!v1_in && v2_in) /* edge is entering the volume */ + else if (!v1_in && v2_in) // edge is entering the volume { - /* insert vertex at intersection point */ - t = line_plane_intersection(&v[i], &v[previ], cp); + // insert vertex at intersection point + float t = line_plane_intersection(&v[i], &v[previ], cp); clipv[clip_verts].x = v[i].x + ((v[previ].x - v[i].x) * t); clipv[clip_verts].y = v[i].y + ((v[previ].y - v[i].y) * t); clipv[clip_verts].p[POLY_Z] = v[i].p[POLY_Z] + ((v[previ].p[POLY_Z] - v[i].p[POLY_Z]) * t); @@ -1172,10 +1116,10 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp ++clip_verts; } - else if (v1_in && !v2_in) /* edge is leaving the volume */ + else if (v1_in && !v2_in) // edge is leaving the volume { - /* insert vertex at intersection point */ - t = line_plane_intersection(&v[i], &v[previ], cp); + // insert vertex at intersection point + float t = line_plane_intersection(&v[i], &v[previ], cp); clipv[clip_verts].x = v[i].x + ((v[previ].x - v[i].x) * t); clipv[clip_verts].y = v[i].y + ((v[previ].y - v[i].y) * t); clipv[clip_verts].p[POLY_Z] = v[i].p[POLY_Z] + ((v[previ].p[POLY_Z] - v[i].p[POLY_Z]) * t); @@ -1188,7 +1132,7 @@ int taitotz_renderer::clip_polygon(const vertex_t *v, int num_vertices, PLANE cp ++clip_verts; - /* insert the existing vertex */ + // insert the existing vertex clipv[clip_verts] = v[i]; ++clip_verts; } @@ -1209,9 +1153,6 @@ void taitotz_renderer::setup_viewport(int x, int y, int width, int height, int c m_vp_y = y; // set up clip planes - //float angleh = atan2(512/2, 512.0f) - 0.0001; - //float anglev = atan2(384/2, 512.0f) - 0.0001; - float angleh = atan2(width, m_vp_focus) - 0.0001; float anglev = atan2(height, m_vp_focus) - 0.0001; float sh = sin(angleh); @@ -1250,9 +1191,9 @@ void taitotz_renderer::setup_viewport(int x, int y, int width, int height, int c m_clip_plane[4].d = 0.1f; } -void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t alpha) +void taitotz_renderer::render_tnl_object(u32 address, float scale, u8 alpha) { - uint32_t *src = &m_screen_ram[address]; + u32 *src = &m_screen_ram[address]; vertex_t v[10]; bool end = false; @@ -1279,26 +1220,26 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t for (int i=0; i < num_verts; i++) { // texture coords - uint8_t tu = src[index] >> 8; - uint8_t tv = src[index] & 0xff; + u8 tu = src[index] >> 8; + u8 tv = src[index] & 0xff; v[i].p[POLY_U] = (float)(tu); v[i].p[POLY_V] = (float)(tv); // coords - int16_t x = src[index + 1] & 0xffff; - int16_t y = src[index + 2] & 0xffff; - int16_t z = src[index + 3] & 0xffff; - float px = ((float)(x) / 256.0f) * scale; - float py = ((float)(y) / 256.0f) * scale; - float pz = ((float)(z) / 256.0f) * scale; + s16 x = src[index + 1] & 0xffff; + s16 y = src[index + 2] & 0xffff; + s16 z = src[index + 3] & 0xffff; + float px = (x * scale) / 256.0f; + float py = (y * scale) / 256.0f; + float pz = (z * scale) / 256.0f; // normals - int8_t inx = (src[index + 1] >> 16) & 0xff; - int8_t iny = (src[index + 2] >> 16) & 0xff; - int8_t inz = (src[index + 3] >> 16) & 0xff; - float nx = (float)(inx) / 128.0f; - float ny = (float)(iny) / 128.0f; - float nz = (float)(inz) / 128.0f; + s8 inx = (src[index + 1] >> 16) & 0xff; + s8 iny = (src[index + 2] >> 16) & 0xff; + s8 inz = (src[index + 3] >> 16) & 0xff; + float nx = inx / 128.0f; + float ny = iny / 128.0f; + float nz = inz / 128.0f; // transform v[i].x = (px * m_matrix[0][0]) + (py * m_matrix[1][0]) + (pz * m_matrix[2][0]) + m_matrix[3][0]; @@ -1346,16 +1287,14 @@ void taitotz_renderer::render_tnl_object(uint32_t address, float scale, uint8_t extra.light[1] = 0.0f; extra.light[2] = -1.0f; - for (int i=2; i < num_verts; i++) + for (int i = 2; i < num_verts; i++) { - render_triangle<6>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), v[0], v[i-1], v[i]); + render_triangle<6>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline, this), v[0], v[i - 1], v[i]); } } while (!end); } - - void taitotz_renderer::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) { wait(); @@ -1365,7 +1304,7 @@ void taitotz_renderer::draw(bitmap_rgb32 &bitmap, const rectangle &cliprect) m_zbuffer->fill(*(int*)&zvalue, cliprect); } -void taitotz_renderer::push_tnl_fifo(uint32_t data) +void taitotz_renderer::push_tnl_fifo(u32 data) { m_tnl_fifo[m_tnl_fifo_ptr] = data; m_tnl_fifo_ptr++; @@ -1391,7 +1330,7 @@ void taitotz_renderer::push_tnl_fifo(uint32_t data) if (scale < 1.0f) scale *= 2.0f; - uint32_t alpha = m_tnl_fifo[2]; + u32 alpha = m_tnl_fifo[2]; render_tnl_object(m_tnl_fifo[0] & 0x1fffff, scale, alpha); // printf("TNL FIFO: %08X, %f, %08X, %08X\n", m_tnl_fifo[0], u2f(m_tnl_fifo[1]), m_tnl_fifo[2], m_tnl_fifo[3]); @@ -1399,44 +1338,33 @@ void taitotz_renderer::push_tnl_fifo(uint32_t data) } } -void taitotz_renderer::push_direct_poly_fifo(uint32_t data) +void taitotz_renderer::push_direct_poly_fifo(u32 data) { m_direct_fifo[m_direct_fifo_ptr] = data; m_direct_fifo_ptr++; - int num_verts = ((m_direct_fifo[0] >> 8) & 0x7) + 1; - int expected_size; - switch ((m_direct_fifo[0] >> 8) & 0x7) - { - case 0: expected_size = 24; break; - case 2: expected_size = 16; break; - case 3: expected_size = 24; break; - case 4: expected_size = 24; break; - case 5: expected_size = 32; break; - case 6: expected_size = 32; break; - default: fatalerror("push_direct_poly_fifo: %08X, num_verts = %d\n", m_direct_fifo[0], num_verts); break; - } - + int num_verts = ((m_direct_fifo[0] >> 8) & 7) + 1; + int expected_size = 4 + num_verts * 4; if (m_direct_fifo_ptr >= expected_size) { vertex_t v[8]; taitotz_polydata &extra = object_data().next(); int index = 4; - for (int i=0; i < num_verts; i++) + for (int i = 0; i < num_verts; i++) { - v[i].x = (m_direct_fifo[index+0] >> 16) & 0xffff; - v[i].y = m_direct_fifo[index+0] & 0xffff; - v[i].p[POLY_U] = (m_direct_fifo[index+2] >> 20) & 0xfff; - v[i].p[POLY_V] = (m_direct_fifo[index+2] >> 4) & 0xfff; - //uint16_t z = m_direct_fifo[index+1] & 0xffff; + v[i].x = (m_direct_fifo[index + 0] >> 16) & 0xffff; + v[i].y = m_direct_fifo[index + 0] & 0xffff; + v[i].p[POLY_U] = (m_direct_fifo[index + 2] >> 20) & 0xfff; + v[i].p[POLY_V] = (m_direct_fifo[index + 2] >> 4) & 0xfff; + //u16 z = m_direct_fifo[index+1] & 0xffff; index += 4; } extra.texture = m_direct_fifo[1] & 0x7ff; - for (int i=2; i < num_verts; i++) + for (int i = 2; i < num_verts; i++) { render_triangle<3>(m_cliprect, render_delegate(&taitotz_renderer::draw_scanline_noz, this), v[0], v[i-1], v[i]); } @@ -1445,24 +1373,24 @@ void taitotz_renderer::push_direct_poly_fifo(uint32_t data) } } -uint32_t taitotz_state::screen_update_taitotz(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 taitotz_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { m_renderer->draw(bitmap, cliprect); - uint16_t const *screen_src = (uint16_t*)&m_screen_ram[m_scr_base]; + u16 const *screen_src = (u16*)&m_screen_ram[m_scr_base]; - for (int j=0; j < 384; j++) + for (int j = 0; j < 384; j++) { - uint32_t *const fb = &bitmap.pix(j); - for (int i=0; i < 512; i++) + u32 *const fb = &bitmap.pix(j); + for (int i = 0; i < 512; i++) { - uint16_t p = *screen_src++; + u16 p = *screen_src++; if (p & 0x8000) // draw 2D framebuffer if there's an opaque pixel { - int r = ((p >> 10) & 0x1f) << (3+16); - int g = ((p >> 5) & 0x1f) << (3+8); + int r = ((p >> 10) & 0x1f) << (3 + 16); + int g = ((p >> 5) & 0x1f) << (3 + 8); int b = (p & 0x1f) << 3; - fb[i^1] = 0xff000000 | r | g | b; + fb[i ^ 1] = 0xff000000 | r | g | b; } } } @@ -1470,49 +1398,43 @@ uint32_t taitotz_state::screen_update_taitotz(screen_device &screen, bitmap_rgb3 return 0; } -void taitotz_state::draw_tile(uint32_t pos, uint32_t tile) +void taitotz_state::draw_tile(u32 pos, u32 tile) { - int tileu = (tile & 0x1f) * 16; - int tilev = ((tile >> 5)) * 16; + int tileu = (tile & 0x1f) << 4; + int tilev = ((tile >> 5)) << 4; - int tilex = (pos & 0x1f) * 16; - int tiley = ((pos >> 5) & 0x1f) * 16; + int tilex = (pos & 0x1f) << 4; + int tiley = ((pos >> 5) & 0x1f) << 4; - uint16_t *src_tile = (uint16_t*)&m_screen_ram[0x180000]; - uint16_t *dst = (uint16_t*)&m_screen_ram[m_scr_base]; + u16 *src_tile = (u16*)&m_screen_ram[0x180000]; + u16 *dst = (u16*)&m_screen_ram[m_scr_base]; int v = tilev; - - for (int j=tiley; j < (tiley+16); j++) + for (int j = tiley; j < tiley + 16; j++, v++) { int u = tileu; - for (int i=tilex; i < (tilex+16); i++) + for (int i = tilex; i < tilex + 16; i++, u++) { - uint16_t p = src_tile[((v*512) + u)]; - dst[(j*512) + i] = p; - u++; + u16 p = src_tile[v * 512 + u]; + dst[j * 512 + i] = p; } - v++; } } /* Video chip memory map - 0x800000...0x9fffff Screen RAM - 0x980000...7fff Char RAM - 0x9c0000...fffff Tile RAM? - + 0x0800000...0x9fffff Screen RAM + 0x980000...987fff Char RAM + 0x9c0000...9fffff Tile RAM? 0x1000000...0x17fffff Texture RAM - 0x1800000...0x187ffff Frame RAM - landhigh puts fullscreen images into 0x9c0000 batlgr2 into 0x9e0000 */ -uint32_t taitotz_state::video_mem_r(uint32_t address) +u32 taitotz_state::video_mem_r(u32 address) { if (address >= 0x800000 && address < 0x1000000) { @@ -1528,12 +1450,12 @@ uint32_t taitotz_state::video_mem_r(uint32_t address) } else { - printf("video_mem_r: %08X\n", address); + LOGMASKED(LOG_VIDEO_MEM_UNK_RD, "%s: video_mem_r: unknown address %08x\n", address); return 0; } } -void taitotz_state::video_mem_w(uint32_t address, uint32_t data) +void taitotz_state::video_mem_w(u32 address, u32 data) { if (address >= 0x800000 && address < 0x1000000) { @@ -1549,50 +1471,49 @@ void taitotz_state::video_mem_w(uint32_t address, uint32_t data) } else { - printf("video_mem_w: %08X, %08X\n", address, data); + LOGMASKED(LOG_VIDEO_MEM_UNK_WR, "%s: video_mem_w: unknown address %08x = %08x\n", address, data); } } -uint32_t taitotz_state::video_reg_r(uint32_t reg) +u32 taitotz_state::video_reg_r(u32 reg) { + u32 data = 0; switch ((reg >> 28) & 0xf) { - case 0x1: + case 0x1: + if (reg == 0x10000105) // Gets spammed a lot. Probably a status register. { - if (reg == 0x10000105) // Gets spammed a lot. Probably a status register. - { - m_reg105 ^= 0xffffffff; - return m_reg105; - } - - logerror("video_reg_r: reg: %08X\n", reg); - return 0xffffffff; + m_reg105 ^= 0xffffffff; + return m_reg105; } - case 0x2: - { - int subreg = reg & 0xfffffff; - if (reg != 0x20000008) - logerror("video_reg_r: reg: %08X\n", reg); + data = 0xffffffff; + LOGMASKED(LOG_VIDEO_REG_1_RD, "%s: video_reg_r: reg %08x: %08x\n", machine().describe_context(), reg, data); + return data; - if (subreg < 0x10) - { - return m_video_unk_reg[subreg]; - } - break; - } - case 0xb: + case 0x2: + { + int subreg = reg & 0xfffffff; + if (subreg < 0x10) { - return video_mem_r(reg & 0xfffffff); + data = m_video_unk_reg[subreg]; + LOGMASKED(LOG_VIDEO_REG_2_RD, "%s: video_reg_r: reg %08x: %08x\n", machine().describe_context(), reg, data); } - default: + else { - logerror("video_reg_r: reg: %08X\n", reg); - break; + LOGMASKED(LOG_VIDEO_REG_2_RD, "%s: video_reg_r: unhandled reg %08x: %08x\n", machine().describe_context(), reg, data); } + return data; } + case 0xb: + return video_mem_r(reg & 0xfffffff); - return 0; + default: + LOGMASKED(LOG_VIDEO_REG_UNK_RD, "%s: video_reg_r: unknown reg %08x: %08x\n", machine().describe_context(), reg, data); + break; + } + + return data; } /* @@ -1616,57 +1537,52 @@ video_reg_w: r: 20000003 d: 019501AA video_reg_w: r: 20000004 d: 00000000 */ -void taitotz_state::video_reg_w(uint32_t reg, uint32_t data) +void taitotz_state::video_reg_w(u32 reg, u32 data) { switch ((reg >> 28) & 0xf) { case 0x1: // Register write? + if (reg == 0x10000105) { - if (reg == 0x10000105) - { - // This register gets spammed a lot. VB IRQ ack or buffer swap? - } - else - { - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - } - break; + // This register gets spammed a lot. VB IRQ ack or buffer swap? } - case 0x2: // ??? + else { - int subreg = reg & 0xfffffff; - if (subreg < 0x10) - { - m_video_unk_reg[subreg] = data; - } - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - break; + LOGMASKED(LOG_VIDEO_REG_1_WR, "%s: video_reg_w: reg %08x = %08x\n", machine().describe_context(), reg, data); } - case 0x3: // Draw 16x16 tile + break; + + case 0x2: // ??? + { + int subreg = reg & 0xfffffff; + if (subreg < 0x10) { - uint32_t pos = (data >> 12) & 0xfff; - uint32_t tile = data & 0xfff; - draw_tile(pos, tile); - break; + m_video_unk_reg[subreg] = data; + LOGMASKED(LOG_VIDEO_REG_2_WR, "%s: video_reg_w: reg %08x = %08x\n", machine().describe_context(), reg, data); } - case 0xb: // RAM write? + else { - video_mem_w(m_video_ram_ptr, data); - m_video_ram_ptr++; - break; + LOGMASKED(LOG_VIDEO_REG_2_WR, "%s: video_reg_w: unhandled reg %08x = %08x\n", machine().describe_context(), reg, data); } + break; + } + case 0x3: // Draw 16x16 tile + draw_tile((data >> 12) & 0xfff, data & 0xfff); + break; + case 0xb: // RAM write? + video_mem_w(m_video_ram_ptr, data); + m_video_ram_ptr++; + break; default: - { - logerror("video_reg_w: reg: %08X data: %08X\n", reg, data); - break; - } + LOGMASKED(LOG_VIDEO_REG_UNK_WR, "%s: video_reg_w: unknown reg %08x = %08x\n", machine().describe_context(), reg, data); + break; } } -uint64_t taitotz_state::video_chip_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::video_chip_r(offs_t offset, u64 mem_mask) { - uint64_t r = 0; - uint32_t reg = offset * 8; + u64 r = 0; + u32 reg = offset * 8; if (ACCESSING_BITS_0_31) { @@ -1674,148 +1590,120 @@ uint64_t taitotz_state::video_chip_r(offs_t offset, uint64_t mem_mask) switch (reg) { - case 0x14: - { - r |= 0xff; // more busy flags? (value & 0x11ff == 0xff expected) - break; - } + case 0x14: + r |= 0xff; // more busy flags? (value & 0x11ff == 0xff expected) + break; - default: - printf("video_chip_r: %04X\n", reg); - break; + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_RD, "%s: video_chip_r: unknown reg %08x & %08x%08x\n", machine().describe_context(), reg, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } + if (ACCESSING_BITS_32_63) { switch (reg) { - case 0x0: - { - r |= (uint64_t)(video_reg_r(m_video_reg)) << 32; - break; - } + case 0x0: + r |= (u64)video_reg_r(m_video_reg) << 32; + break; - case 0x10: - { - r |= (uint64_t)(0xff) << 32; // busy flags? landhigh expects this - break; - } + case 0x10: + r |= 0x000000ff00000000ULL; // busy flags? landhigh expects this + break; - default: - { - printf("video_chip_r: %04X\n", reg); - break; - } + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_RD, "%s: video_chip_r: unknown reg %08x & %08x%08x\n", machine().describe_context(), reg, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } return r; } -void taitotz_state::video_chip_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::video_chip_w(offs_t offset, u64 data, u64 mem_mask) { - uint32_t reg = offset * 8; - uint32_t regdata; + u32 reg = offset * 8; + u32 regdata; if (ACCESSING_BITS_0_31) { reg += 4; - regdata = (uint32_t)(data); + regdata = (u32)data; switch (reg) { default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: unknown port %02x = %08x%08x & %08x%08x\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); break; - } } } + if (ACCESSING_BITS_32_63) { - regdata = (uint32_t)(data >> 32); + regdata = (u32)(data >> 32); switch (reg) { - case 0: + case 0: + video_reg_w(m_video_reg, regdata); + break; + case 0x8: + m_video_reg = regdata; + m_video_fifo_ptr = 0; + + switch ((m_video_reg >> 28) & 0xf) { - video_reg_w(m_video_reg, regdata); + case 0xb: + m_video_ram_ptr = m_video_reg & 0xfffffff; break; - } - case 0x8: - { - m_video_reg = regdata; - m_video_fifo_ptr = 0; - - switch ((m_video_reg >> 28) & 0xf) - { - case 0xb: - { - m_video_ram_ptr = m_video_reg & 0xfffffff; - //logerror("video_chip_ram sel %08X at %08X\n", m_video_reg & 0x0fffffff, m_maincpu->pc()); - break; - } - case 0x0: - { - break; - } - case 0x1: - { - break; - } - case 0x2: - { - break; - } - case 0x3: - { - // video_chip_w: port 0x08: 30000001 gets spammed a lot - break; - } - default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); - break; - } - } + case 0x0: + break; + case 0x1: + break; + case 0x2: + break; + case 0x3: + // video_chip_w: port 0x08: 30000001 gets spammed a lot break; - } default: - { - logerror("video_chip_w: port 0x%02X: %08X\n", reg, regdata); + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: port %02x = %08x%08x & %08x%08x (reg 8)\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); break; } + break; + default: + LOGMASKED(LOG_VIDEO_CHIP_UNK_WR, "%s: video_chip_w: unknown port %02x = %08x%08x & %08x%08x\n", machine().describe_context(), reg, (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); + break; } } } -uint64_t taitotz_state::video_fifo_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::video_fifo_r(offs_t offset, u64 mem_mask) { - uint64_t r = 0; + u64 r = 0; if (ACCESSING_BITS_32_63) { - r |= (uint64_t)(video_mem_r(m_video_ram_ptr)) << 32; + r |= (u64)video_mem_r(m_video_ram_ptr) << 32; m_video_ram_ptr++; } if (ACCESSING_BITS_0_31) { - r |= (uint64_t)(video_mem_r(m_video_ram_ptr)); + r |= (u64)video_mem_r(m_video_ram_ptr); m_video_ram_ptr++; } return r; } -void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::video_fifo_w(offs_t offset, u64 data, u64 mem_mask) { int command = (m_video_reg >> 28) & 0xf; if (command == 0xb) { // FIFO mem access - if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - video_mem_w(m_video_ram_ptr, (uint32_t)(data >> 32)); + video_mem_w(m_video_ram_ptr, (u32)(data >> 32)); m_video_ram_ptr++; } m_video_fifo_ptr++; @@ -1824,7 +1712,7 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - video_mem_w(m_video_ram_ptr, (uint32_t)(data)); + video_mem_w(m_video_ram_ptr, (u32)data); m_video_ram_ptr++; } m_video_fifo_ptr++; @@ -1833,13 +1721,13 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask else if (command == 0x1) { // Direct Polygon FIFO - + LOGMASKED(LOG_DIRECT_FIFO, "%s: Direct polygon FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - m_renderer->push_direct_poly_fifo((uint32_t)(data >> 32)); - //logerror("FIFO packet w: %08X at %08X\n", (uint32_t)(data >> 32), m_maincpu->pc()); + m_renderer->push_direct_poly_fifo((u32)(data >> 32)); + LOGMASKED(LOG_DIRECT_FIFO, "%s: push_direct_poly_fifo: %08x [%d]\n", machine().describe_context(), (u32)(data >> 32), m_renderer->direct_fifo_ptr()); } m_video_fifo_ptr++; } @@ -1847,8 +1735,8 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - m_renderer->push_direct_poly_fifo((uint32_t)(data)); - //logerror("FIFO packet w: %08X at %08X\n", (uint32_t)(data), m_maincpu->pc()); + m_renderer->push_direct_poly_fifo((u32)data); + LOGMASKED(LOG_DIRECT_FIFO, "%s: push_direct_poly_fifo: %08x [%d]\n", machine().describe_context(), (u32)data, m_renderer->direct_fifo_ptr()); } m_video_fifo_ptr++; } @@ -1856,12 +1744,13 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask else if (command == 0x0) { // T&L FIFO - + LOGMASKED(LOG_TNL_FIFO, "%s: T&L FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - m_renderer->push_tnl_fifo((uint32_t)(data >> 32)); + m_renderer->push_tnl_fifo((u32)(data >> 32)); + LOGMASKED(LOG_TNL_FIFO, "%s: push_tnl_fifo: %08x\n", machine().describe_context(), (u32)(data >> 32)); } m_video_fifo_ptr++; } @@ -1869,18 +1758,20 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - m_renderer->push_tnl_fifo((uint32_t)(data)); + m_renderer->push_tnl_fifo((u32)data); + LOGMASKED(LOG_TNL_FIFO, "%s: push_tnl_fifo: %08x\n", machine().describe_context(), (u32)data); } m_video_fifo_ptr++; } } else { + LOGMASKED(LOG_DIRECT_FIFO, "%s: Unknown FIFO write: %08x%08x & %08x%08x\n", machine().describe_context(), (u32)(data >> 32), (u32)data, (u32)(mem_mask >> 32), (u32)mem_mask); if (ACCESSING_BITS_32_63) { if (m_video_fifo_ptr >= 8) { - printf("FIFO write with cmd %02X: %08X\n", command, (uint32_t)(data >> 32)); + printf("FIFO write with cmd %02X: %08X\n", command, (u32)(data >> 32)); } m_video_fifo_ptr++; } @@ -1888,128 +1779,88 @@ void taitotz_state::video_fifo_w(offs_t offset, uint64_t data, uint64_t mem_mask { if (m_video_fifo_ptr >= 8) { - printf("FIFO write with cmd %02X: %08X\n", command, (uint32_t)(data)); + printf("FIFO write with cmd %02X: %08X\n", command, (u32)data); } m_video_fifo_ptr++; } } - - //COMBINE_DATA(m_video_fifo_mem + offset); } -uint64_t taitotz_state::ieee1394_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::ieee1394_r(offs_t offset, u64 mem_mask) { if (offset == 4) { - return 0xffffffffffffffffU; + return ~0ULL; } - //logerror("ieee1394_r: %08X, %08X%08X\n", offset, (uint32_t)(mem_mask >> 32), (uint32_t)(mem_mask)); return 0; } -void taitotz_state::ieee1394_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::ieee1394_w(offs_t offset, u64 data, u64 mem_mask) { - //logerror("ieee1394_w: %08X, %08X%08X, %08X%08X\n", offset, (uint32_t)(data >> 32), (uint32_t)(data), (uint32_t)(mem_mask >> 32), (uint32_t)(mem_mask)); - if (ACCESSING_BITS_32_63) - { - } - if (ACCESSING_BITS_0_31) - { - } } -uint64_t taitotz_state::ppc_common_r(offs_t offset, uint64_t mem_mask) +u64 taitotz_state::ppc_common_r(offs_t offset, u64 mem_mask) { - uint64_t res = 0; + u64 res = 0; if (ACCESSING_BITS_0_15) { - res |= m_io_share_ram[(offset * 2) + 1]; + res |= m_io_share_ram[offset * 2 + 1]; } if (ACCESSING_BITS_32_47) { - res |= (uint64_t)(m_io_share_ram[(offset * 2) + 0]) << 32; + res |= (u64)m_io_share_ram[offset * 2] << 32; } return res; } -void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask) +void taitotz_state::ppc_common_w(offs_t offset, u64 data, u64 mem_mask) { if (ACCESSING_BITS_0_15) { - m_io_share_ram[(offset * 2) + 1] = (uint16_t)(data); + m_io_share_ram[offset * 2 + 1] = (u16)data; } if (ACCESSING_BITS_32_47) { - m_io_share_ram[(offset * 2) + 0] = (uint16_t)(data >> 32); + m_io_share_ram[offset * 2] = (u16)(data >> 32); } if (offset == 0x7ff) { - if (m_io_share_ram[0xfff] != 0x0000 && - m_io_share_ram[0xfff] != 0x1010 && - m_io_share_ram[0xfff] != 0x1020 && - m_io_share_ram[0xfff] != 0x6000 && - m_io_share_ram[0xfff] != 0x6010 && - m_io_share_ram[0xfff] != 0x7004 && - m_io_share_ram[0xfff] != 0x4001 && - m_io_share_ram[0xfff] != 0x4002 && - m_io_share_ram[0xfff] != 0x4003) - { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd %04X\n", m_io_share_ram[0xfff]); - } - - if (m_io_share_ram[0xfff] == 0x4000) + const u16 tlcs_cmd = m_io_share_ram[0xfff]; + if (tlcs_cmd != 0x0000 && tlcs_cmd != 0x1010 && tlcs_cmd != 0x1020 && tlcs_cmd != 0x6000 && tlcs_cmd != 0x6010 && + tlcs_cmd != 0x7004 && tlcs_cmd != 0x4001 && tlcs_cmd != 0x4002 && tlcs_cmd != 0x4003) { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04X %04X %04X %04X %04X %04X %04X %04X %04X %04X\n", - m_io_share_ram[0x1c34/2], - m_io_share_ram[0x1c36/2], - m_io_share_ram[0x1c38/2], - m_io_share_ram[0x1c3a/2], - m_io_share_ram[0x1c2c/2], - m_io_share_ram[0x1c2e/2], - m_io_share_ram[0x1c30/2], - m_io_share_ram[0x1c32/2], - m_io_share_ram[0x1c24/2], - m_io_share_ram[0x1c26/2] - ); - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04X %04X %04X %04X %04X %04X %04X %04X %04X %04X\n", - m_io_share_ram[0x1c28/2], - m_io_share_ram[0x1c2a/2], - m_io_share_ram[0x1c1c/2], - m_io_share_ram[0x1c1e/2], - m_io_share_ram[0x1c20/2], - m_io_share_ram[0x1c22/2], - m_io_share_ram[0x1c14/2], - m_io_share_ram[0x1c16/2], - m_io_share_ram[0x1c18/2], - m_io_share_ram[0x1c1a/2] - ); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd %04x\n", tlcs_cmd); } - /* - if (m_io_share_ram[0xfff] == 0x1010) + if (tlcs_cmd == 0x4000) { - LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, "PPC -> TLCS cmd 1010: %04X %04X %04X %04X\n", m_io_share_ram[0x1a02/2], m_io_share_ram[0x1a04/2], m_io_share_ram[0x1a06/2], m_io_share_ram[0x1a08/2]); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + m_io_share_ram[0x1c34 / 2], m_io_share_ram[0x1c36 / 2], m_io_share_ram[0x1c38 / 2], m_io_share_ram[0x1c3a / 2], + m_io_share_ram[0x1c2c / 2], m_io_share_ram[0x1c2e / 2], m_io_share_ram[0x1c30 / 2], m_io_share_ram[0x1c32 / 2], + m_io_share_ram[0x1c24 / 2], m_io_share_ram[0x1c26 / 2]); + LOGMASKED(LOG_PPC_TO_TLCS_COMMANDS, " %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n", + m_io_share_ram[0x1c28 / 2], m_io_share_ram[0x1c2a / 2], m_io_share_ram[0x1c1c / 2], m_io_share_ram[0x1c1e / 2], + m_io_share_ram[0x1c20 / 2], m_io_share_ram[0x1c22 / 2], m_io_share_ram[0x1c14 / 2], m_io_share_ram[0x1c16 / 2], + m_io_share_ram[0x1c18 / 2], m_io_share_ram[0x1c1a / 2]); } - */ - // hacky way to handle some commands for now - if (m_io_share_ram[0xfff] == 0x4001) + if (tlcs_cmd == 0x4001) { m_io_share_ram[0xfff] = 0x0000; m_io_share_ram[0xe00] = 0xffff; m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - else if (m_io_share_ram[0xfff] == 0x4004 || m_io_share_ram[0xfff] == 0x4000) + else if (tlcs_cmd == 0x4004 || tlcs_cmd == 0x4000) { m_io_share_ram[0xfff] = 0x0000; m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); } - else if (m_io_share_ram[0xfff] == 0x7004) + else if (tlcs_cmd == 0x7004) { // this command seems to turn off interrupts on TLCS... m_io_share_ram[0xfff] = 0x0000; @@ -2023,15 +1874,15 @@ void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask // The PPC always goes to busy loop waiting for TLCS here, so we can free up the timeslice. // Only do it for HDD access and backup RAM for now... - if (m_io_share_ram[0xfff] == 0x1010 || m_io_share_ram[0xfff] == 0x1020 || - m_io_share_ram[0xfff] == 0x6000 || m_io_share_ram[0xfff] == 0x6010) + if (tlcs_cmd == 0x1010 || tlcs_cmd == 0x1020 || + tlcs_cmd == 0x6000 || tlcs_cmd == 0x6010) { //m_maincpu->spin_until_trigger(PPC_TLCS_COMM_TRIGGER); //m_maincpu->spin_until_interrupt(); } // pwrshovl sometimes writes commands during command handling... make sure that doesn't happen - if (m_io_share_ram[0xfff] == 0x0000) + if (tlcs_cmd == 0x0000) { m_maincpu->spin_until_time(attotime::from_usec(100)); } @@ -2040,29 +1891,30 @@ void taitotz_state::ppc_common_w(offs_t offset, uint64_t data, uint64_t mem_mask } } -#if 0 - // debug hookup - if ((m_io_share_ram[0xd82] & 0xff) == 0xff) + if (ENABLE_DEBUG_PRINTS) { - for (int i=0; i < 0x80; i++) + // debug hookup + if ((u8)m_io_share_ram[0xd82] == 0xff) { - uint16_t w = m_io_share_ram[0x900+i]; - printf("%c%c", w & 0xff, (w >> 8) & 0xff); + for (int i = 0; i < 0x80; i++) + { + u16 w = m_io_share_ram[0x900 + i]; + printf("%c%c", (s8)w, (s8)(w >> 8)); + } + printf("\n"); + m_io_share_ram[0xd82] = 0; } - printf("\n"); - m_io_share_ram[0xd82] = 0; - } - if ((m_io_share_ram[0xd8a] & 0xff) == 0xff) - { - for (int i=0; i < 0x80; i++) + if ((u8)m_io_share_ram[0xd8a] == 0xff) { - uint16_t w = m_io_share_ram[0xb00+i]; - printf("%c%c", w & 0xff, (w >> 8) & 0xff); + for (int i = 0; i < 0x80; i++) + { + u16 w = m_io_share_ram[0xb00 + i]; + printf("%c%c", (s8)w, (s8)(w >> 8)); + } + printf("\n"); + m_io_share_ram[0xd8a] = 0; } - printf("\n"); - m_io_share_ram[0xd8a] = 0; } -#endif } // BAT Config: @@ -2090,26 +1942,24 @@ void taitotz_state::ppc603e_mem(address_map &map) map(0xfff00000, 0xffffffff).rom().region("user1", 0); } - - -uint8_t taitotz_state::tlcs_common_r(offs_t offset) +u8 taitotz_state::tlcs_common_r(offs_t offset) { if (offset & 1) { - return (uint8_t)(m_io_share_ram[offset / 2] >> 8); + return (u8)(m_io_share_ram[offset / 2] >> 8); } else { - return (uint8_t)(m_io_share_ram[offset / 2]); + return (u8)(m_io_share_ram[offset / 2]); } } -void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) +void taitotz_state::tlcs_common_w(offs_t offset, u8 data) { if (offset & 1) { m_io_share_ram[offset / 2] &= 0x00ff; - m_io_share_ram[offset / 2] |= (uint16_t)(data) << 8; + m_io_share_ram[offset / 2] |= (u16)data << 8; } else { @@ -2125,7 +1975,6 @@ void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) m_io_share_ram[0xffe] != 0x1022) { LOGMASKED(LOG_TLCS_TO_PPC_COMMANDS, "TLCS -> PPC cmd %04X\n", m_io_share_ram[0xffe]); - //LOGMASKED(LOG_TLCS_TO_PPC_COMMANDS, "0x40080104 = %08X\n", (uint32_t)(m_work_ram[0x80104/8])); } m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); @@ -2150,7 +1999,7 @@ void taitotz_state::tlcs_common_w(offs_t offset, uint8_t data) } // RTC could be Epson RTC-64613, same as taitopjc.cpp -uint8_t taitotz_state::tlcs_rtc_r(offs_t offset) +u8 taitotz_state::tlcs_rtc_r(offs_t offset) { switch (offset) { @@ -2167,14 +2016,14 @@ uint8_t taitotz_state::tlcs_rtc_r(offs_t offset) case 0x0e: return 0; default: - printf("tlcs_rtc_r: %02X\n", offset); + LOGMASKED(LOG_RTC_UNK_RD, "%s: tlcs_rtc_r: unknown reg %02x\n", offset); break; } return 0; } -void taitotz_state::tlcs_rtc_w(offs_t offset, uint8_t data) +void taitotz_state::tlcs_rtc_w(offs_t offset, u8 data) { switch (offset) { @@ -2190,26 +2039,32 @@ void taitotz_state::tlcs_rtc_w(offs_t offset, uint8_t data) break; default: - //printf("tlcs_rtc_w: %02X, %02X\n", offset, data); + LOGMASKED(LOG_RTC_UNK_WR, "%s: tlcs_rtc_w: unknown reg %02x = %02x\n", offset, data); break; } } -uint16_t taitotz_state::tlcs_ide0_r(offs_t offset, uint16_t mem_mask) +u16 taitotz_state::tlcs_ide0_r(offs_t offset, u16 mem_mask) { - uint16_t d = m_ata->cs0_r(offset, mem_mask); + u16 d = m_ata->cs0_r(offset, mem_mask); if (offset == 7) - d &= ~0x2; // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up... - // The status check explicitly checks for 0x50 (drive ready, seek complete). + { + // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up. + // The status check explicitly checks for 0x50 (drive ready, seek complete). + d &= ~0x2; + } return d; } -uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) +u16 taitotz_state::tlcs_ide1_r(offs_t offset, u16 mem_mask) { - uint16_t d = m_ata->cs1_r(offset, mem_mask); + u16 d = m_ata->cs1_r(offset, mem_mask); if (offset == 6) - d &= ~0x2; // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up... - // The status check explicitly checks for 0x50 (drive ready, seek complete). + { + // Type Zero doesn't like the index bit. It's defined as vendor-specific, so it probably shouldn't be up. + // The status check explicitly checks for 0x50 (drive ready, seek complete). + d &= ~0x2; + } return d; } @@ -2226,7 +2081,7 @@ uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) // 0xfc0147: INT5 - // 0xfc0148: INT6 - // 0xfc0149: INT7 - -// 0xfc014a: int8_t Sound chip interrupt? +// 0xfc014a: INT8 Sound chip interrupt? // 0xfc0120: INTAD - // 0xfc0120: INTTR8-A - // 0xfc0120: INTT0 - @@ -2240,7 +2095,7 @@ uint16_t taitotz_state::tlcs_ide1_r(offs_t offset, uint16_t mem_mask) void taitotz_state::tlcs900h_mem(address_map &map) { - map(0x010000, 0x02ffff).ram(); // Work RAM + map(0x010000, 0x02ffff).ram(); // Work RAM map(0x040000, 0x041fff).ram().share("nvram"); // Backup RAM map(0x044000, 0x04400f).rw(FUNC(taitotz_state::tlcs_rtc_r), FUNC(taitotz_state::tlcs_rtc_w)); map(0x060000, 0x061fff).rw(FUNC(taitotz_state::tlcs_common_r), FUNC(taitotz_state::tlcs_common_w)); @@ -2252,7 +2107,7 @@ void taitotz_state::tlcs900h_mem(address_map &map) void taitotz_state::landhigh_tlcs900h_mem(address_map &map) { - map(0x200000, 0x21ffff).ram(); // Work RAM + map(0x200000, 0x21ffff).ram(); // Work RAM map(0x400000, 0x401fff).ram().share("nvram"); // Backup RAM map(0x404000, 0x40400f).rw(FUNC(taitotz_state::tlcs_rtc_r), FUNC(taitotz_state::tlcs_rtc_w)); map(0x900000, 0x901fff).rw(FUNC(taitotz_state::tlcs_common_r), FUNC(taitotz_state::tlcs_common_w)); @@ -2262,12 +2117,10 @@ void taitotz_state::landhigh_tlcs900h_mem(address_map &map) map(0xfc0000, 0xffffff).rom().region("io_cpu", 0); } - - static INPUT_PORTS_START( taitotz ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2316,7 +2169,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( landhigh ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2375,7 +2228,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( batlgr2 ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2430,7 +2283,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( pwrshovl ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2494,7 +2347,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( styphp ) PORT_START("INPUTS1") PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE( 0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -2549,7 +2402,7 @@ INPUT_PORTS_END static INPUT_PORTS_START(dendego3) PORT_START("INPUTS1") PORT_BIT(0x00000001, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_SERVICE_NO_TOGGLE(0x00000002, IP_ACTIVE_LOW) /* Test Button */ + PORT_SERVICE_NO_TOGGLE(0x00000002, IP_ACTIVE_LOW) // Test Button PORT_BIT(0x00000004, IP_ACTIVE_LOW, IPT_UNUSED) PORT_BIT(0x00000008, IP_ACTIVE_LOW, IPT_SERVICE) PORT_NAME("Service") PORT_CODE(KEYCODE_7) PORT_BIT(0x00000010, IP_ACTIVE_LOW, IPT_UNUSED) @@ -2601,28 +2454,30 @@ void taitotz_state::machine_reset() if (m_hdd_serial_number != nullptr) { ide_hdd_device *hdd = m_ata->subdevice<ata_slot_device>("0")->subdevice<ide_hdd_device>("hdd"); - uint16_t *identify_device = hdd->identify_device_buffer(); + u16 *identify_device = hdd->identify_device_buffer(); - for (int i=0; i < 10; i++) + for (int i = 0; i < 10; i++) { - identify_device[10+i] = (m_hdd_serial_number[i*2] << 8) | m_hdd_serial_number[i*2+1]; + identify_device[10 + i] = (m_hdd_serial_number[i * 2] << 8) | m_hdd_serial_number[i * 2 + 1]; } } } void taitotz_state::machine_start() { - /* set conservative DRC options */ + // set conservative DRC options m_maincpu->ppcdrc_set_options(PPCDRC_COMPATIBLE_OPTIONS); - /* configure fast RAM regions for DRC */ + // configure fast RAM regions for DRC m_maincpu->ppcdrc_add_fastram(0x40000000, 0x40ffffff, false, m_work_ram); } - -INTERRUPT_GEN_MEMBER(taitotz_state::taitotz_vbi) +void taitotz_state::vblank(int state) { - m_iocpu->set_input_line(TLCS900_INT3, ASSERT_LINE); + if (state) + { + m_iocpu->set_input_line(TLCS900_INT3, ASSERT_LINE); + } } void taitotz_state::ide_interrupt(int state) @@ -2632,12 +2487,12 @@ void taitotz_state::ide_interrupt(int state) void taitotz_state::taitotz(machine_config &config) { - /* IBM EMPPC603eBG-100 */ + // IBM EMPPC603eBG-100 PPC603E(config, m_maincpu, 100000000); - m_maincpu->set_bus_frequency(XTAL(66'666'700)); /* Multiplier 1.5, Bus = 66MHz, Core = 100MHz */ + m_maincpu->set_bus_frequency(XTAL(66'666'700)); // Multiplier 1.5, Bus = 66MHz, Core = 100MHz m_maincpu->set_addrmap(AS_PROGRAM, &taitotz_state::ppc603e_mem); - /* TMP95C063F I/O CPU */ + // TMP95C063F I/O CPU TMP95C063(config, m_iocpu, 25000000); m_iocpu->port9_read().set_ioport("INPUTS1"); m_iocpu->portb_read().set_ioport("INPUTS2"); @@ -2652,9 +2507,8 @@ void taitotz_state::taitotz(machine_config &config) m_iocpu->an_read<6>().set_ioport("ANALOG7"); m_iocpu->an_read<7>().set_ioport("ANALOG8"); m_iocpu->set_addrmap(AS_PROGRAM, &taitotz_state::tlcs900h_mem); - m_iocpu->set_vblank_int("screen", FUNC(taitotz_state::taitotz_vbi)); - /* MN1020819DA sound CPU */ + // MN1020819DA sound CPU (not yet dumped/implemented) config.set_maximum_quantum(attotime::from_hz(120)); @@ -2668,7 +2522,8 @@ void taitotz_state::taitotz(machine_config &config) m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); m_screen->set_size(512, 384); m_screen->set_visarea(0, 511, 0, 383); - m_screen->set_screen_update(FUNC(taitotz_state::screen_update_taitotz)); + m_screen->set_screen_update(FUNC(taitotz_state::screen_update)); + m_screen->screen_vblank().set(FUNC(taitotz_state::vblank)); } void taitotz_state::landhigh(machine_config &config) @@ -2681,21 +2536,22 @@ void taitotz_state::landhigh(machine_config &config) // Init for BIOS v1.52 void taitotz_state::init_taitotz_152() { - uint32_t *rom = (uint32_t*)memregion("user1")->base(); - rom[(0x2c87c^4)/4] = 0x38600000; // skip sound load timeout... -// rom[(0x2c620^4)/4] = 0x48000014; // ID check skip (not needed with correct serial number) - -#if 0 - rom[(0x2c164^4)/4] = 0x39600001; // enable game debug output - rom[(0x2c174^4)/4] = 0x39200001; // enable game debug output - rom[(0x2c978^4)/4] = 0x48000028; -#endif + u32 *rom = (u32*)memregion("user1")->base(); + rom[(0x2c87c ^ 4) / 4] = 0x38600000; // skip sound load timeout... +// rom[(0x2c620 ^ 4) / 4] = 0x48000014; // ID check skip (not needed with correct serial number) + + if (ENABLE_DEBUG_PRINTS) + { + rom[(0x2c164 ^ 4) / 4] = 0x39600001; // enable game debug output + rom[(0x2c174 ^ 4) / 4] = 0x39200001; + rom[(0x2c978 ^ 4) / 4] = 0x48000028; + } } // Init for BIOS 1.11a void taitotz_state::init_taitotz_111a() { - uint32_t *rom = (uint32_t*)memregion("user1")->base(); + u32 *rom = (u32*)memregion("user1")->base(); rom[(0x2b748^4)/4] = 0x480000b8; // skip sound load timeout } @@ -2829,7 +2685,7 @@ ROM_START( taitotz ) TAITOTZ_BIOS_V152 ROM_REGION16_LE( 0x40000, "io_cpu", ROMREGION_ERASE00 ) - ROM_REGION( 0x10000, "sound_cpu", ROMREGION_ERASE00 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", ROMREGION_ERASE00 ) // Undumped internal ROM ROM_REGION( 0x500, "plds", ROMREGION_ERASE00 ) DISK_REGION( "ata:0:hdd" ) ROM_END @@ -2860,7 +2716,7 @@ ROM_START( landhigh ) ROM_LOAD16_BYTE( "e82-03.ic14", 0x000000, 0x020000, CRC(0de65b4d) SHA1(932316f7435259b723a29843d58b2e3dca92e7b7) ) ROM_LOAD16_BYTE( "e82-04.ic15", 0x000001, 0x020000, CRC(b3cb0f3d) SHA1(80414f50a1593c6b849d9f37e94a32168699a5c1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION( 0x500, "plds", 0 ) @@ -2880,7 +2736,7 @@ ROM_START( landhigha ) ROM_LOAD16_BYTE( "e82-03.ic14", 0x000000, 0x020000, CRC(0de65b4d) SHA1(932316f7435259b723a29843d58b2e3dca92e7b7) ) ROM_LOAD16_BYTE( "e82-04.ic15", 0x000001, 0x020000, CRC(b3cb0f3d) SHA1(80414f50a1593c6b849d9f37e94a32168699a5c1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION( 0x500, "plds", 0 ) @@ -2900,7 +2756,7 @@ ROM_START( batlgear ) ROM_LOAD16_BYTE( "e68-07.ic14", 0x000000, 0x020000, CRC(554c6fd7) SHA1(9f203dead81c7ccf73d7fd462cab147cd17f890f) ) ROM_LOAD16_BYTE( "e68-08.ic15", 0x000001, 0x020000, CRC(f1932380) SHA1(64d12e858af15a9ba8254917da13863ac7c9c050) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -2915,7 +2771,7 @@ ROM_START( batlgr2 ) ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) ) ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) // BATTLE GEAR 2 M9005023A VER.2.04J @@ -2932,7 +2788,7 @@ ROM_START( batlgr2a ) ROM_LOAD16_BYTE( "e87-03.ic14", 0x000000, 0x020000, CRC(49ae7cd0) SHA1(15f07a6bb2044a85a2139481f1dc95a44520c929) ) ROM_LOAD16_BYTE( "e87-04.ic15", 0x000001, 0x020000, CRC(59f8f75f) SHA1(f5595751b10c0033f460114c43f5e2c192fe61f1) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -2947,7 +2803,7 @@ ROM_START( pwrshovl ) ROM_LOAD16_BYTE( "e74-04++.ic14", 0x000000, 0x020000, CRC(ef21a261) SHA1(7398826dbf48014b9c7e9454f978f3e419ebc64b) ) // actually labeled E74-04** ROM_LOAD16_BYTE( "e74-05++.ic15", 0x000001, 0x020000, CRC(2466217d) SHA1(dc814da3a1679cff001f179d3c1641af985a6490) ) // actually labeled E74-05** - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION16_LE( 0x20000, "io_cpu2", 0 ) // another TMP95C063F, not hooked up yet @@ -2971,7 +2827,7 @@ ROM_START( pwrshovla ) ROM_LOAD16_BYTE( "e74-04++.ic14", 0x000000, 0x020000, CRC(ef21a261) SHA1(7398826dbf48014b9c7e9454f978f3e419ebc64b) ) // actually labeled E74-04** ROM_LOAD16_BYTE( "e74-05++.ic15", 0x000001, 0x020000, CRC(2466217d) SHA1(dc814da3a1679cff001f179d3c1641af985a6490) ) // actually labeled E74-05** - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) ROM_REGION16_LE( 0x20000, "io_cpu2", 0 ) // another TMP95C063F, not hooked up yet @@ -2995,7 +2851,7 @@ ROM_START( raizpin ) ROM_LOAD16_BYTE( "f14-01.ic14", 0x000000, 0x020000, CRC(f86a184d) SHA1(46abd11430c08d4f384fb79a5a3a39e54f83b8d8) ) ROM_LOAD16_BYTE( "f14-02.ic15", 0x000001, 0x020000, CRC(bd2d0dee) SHA1(652f810702598184551de9fd69436862d48c1608) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3010,7 +2866,7 @@ ROM_START( raizpinj ) ROM_LOAD16_BYTE( "f14-01.ic14", 0x000000, 0x020000, CRC(f86a184d) SHA1(46abd11430c08d4f384fb79a5a3a39e54f83b8d8) ) ROM_LOAD16_BYTE( "f14-02.ic15", 0x000001, 0x020000, CRC(bd2d0dee) SHA1(652f810702598184551de9fd69436862d48c1608) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3025,7 +2881,7 @@ ROM_START( styphp ) ROM_LOAD16_BYTE( "e98-01.ic14", 0x000000, 0x020000, CRC(479b37ad) SHA1(a0e59d990665244a7919a104dc4b6869ccf90be1) ) ROM_LOAD16_BYTE( "e98-02.ic15", 0x000001, 0x020000, CRC(d8da590f) SHA1(b33a67d81e388d7863adaf03041911c7f84d193b) ) - ROM_REGION( 0x10000, "sound_cpu", 0 ) /* Internal ROM :( */ + ROM_REGION( 0x10000, "sound_cpu", 0 ) // Undumped internal ROM ROM_LOAD( "e68-01.ic7", 0x000000, 0x010000, NO_DUMP ) DISK_REGION( "ata:0:hdd" ) @@ -3056,7 +2912,7 @@ ROM_END } // anonymous namespace -GAME( 1999, taitotz, 0, taitotz, taitotz, taitotz_state, empty_init, ROT0, "Taito", "Type Zero BIOS", MACHINE_NO_SOUND|MACHINE_NOT_WORKING|MACHINE_IS_BIOS_ROOT ) +GAME( 1999, taitotz, 0, taitotz, taitotz, taitotz_state, empty_init, ROT0, "Taito", "Type Zero BIOS", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_IS_BIOS_ROOT ) GAME( 1998, batlgear, taitotz, taitotz, batlgr2, taitotz_state, init_batlgear, ROT0, "Taito", "Battle Gear (Ver 2.40 A)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND | MACHINE_NODEVICE_LAN ) GAME( 1999, landhigh, taitotz, landhigh, landhigh, taitotz_state, init_landhigh, ROT0, "Taito", "Landing High Japan (Ver 2.01 OK)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) GAME( 1999, landhigha, landhigh, landhigh, landhigh, taitotz_state, init_landhigha,ROT0, "Taito", "Landing High Japan (Ver 2.02 O)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) diff --git a/src/mame/toaplan/slapfght.cpp b/src/mame/toaplan/slapfght.cpp index 2f18232fa3c..2d489d97dea 100644 --- a/src/mame/toaplan/slapfght.cpp +++ b/src/mame/toaplan/slapfght.cpp @@ -910,7 +910,7 @@ void slapfght_state::perfrman(machine_config &config) m_audiocpu->set_addrmap(AS_PROGRAM, &slapfght_state::perfrman_sound_map); m_audiocpu->set_periodic_int(FUNC(slapfght_state::sound_nmi), attotime::from_hz(240)); // music speed, verified - config.set_perfect_quantum(m_maincpu); + config.set_maximum_quantum(attotime::from_hz(m_maincpu->clock() / 4)); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -960,7 +960,7 @@ void slapfght_state::tigerh(machine_config &config) TAITO68705_MCU_TIGER(config, m_bmcu, 36_MHz_XTAL/12); // 3MHz - config.set_perfect_quantum(m_maincpu); + config.set_maximum_quantum(attotime::from_hz(m_maincpu->clock() / 4)); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -1043,7 +1043,7 @@ void slapfght_state::slapfigh(machine_config &config) m_bmcu->aux_out_cb<5>().set(FUNC(slapfght_state::flipscreen_w)); m_bmcu->aux_strobe_cb().set(FUNC(slapfght_state::scroll_from_mcu_w)); - config.set_perfect_quantum(m_maincpu); + config.set_maximum_quantum(attotime::from_hz(m_maincpu->clock() / 4)); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); diff --git a/src/mame/toaplan/sunwise.cpp b/src/mame/toaplan/sunwise.cpp index 9bc18ebc81b..7db45f2c61c 100644 --- a/src/mame/toaplan/sunwise.cpp +++ b/src/mame/toaplan/sunwise.cpp @@ -22,8 +22,9 @@ Name Board No Maker Game name ---------------------------------------------------------------------------- -pwrkick SW931201 Sunwise Power Kick -burgkids SW931201 Sunwise Burger Kids +pwrkick SW931201-1 Sunwise Power Kick +burgkids SW931201-1 Sunwise Burger Kids +pyutakun SW931201-1 Sunwise Pyuuta-kun othldrby S951060-VGP Sunwise Othello Derby @@ -283,6 +284,15 @@ static INPUT_PORTS_START( burgkids ) INPUT_PORTS_END +static INPUT_PORTS_START( pyutakun ) + PORT_INCLUDE( burgkids ) + + PORT_MODIFY("IN1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) +INPUT_PORTS_END + static INPUT_PORTS_START( 2b ) PORT_START("IN1") TOAPLAN_JOY_UDLR_2_BUTTONS( 1 ) @@ -557,7 +567,7 @@ NOTE: This PCB uses an 8-Liner style edge connector MB3771 Voltage monitor BT1 - CR2550 3Volt battery -NOTE: Sunwise's S951060-VGP PCB uses identical componenets to the SW931201 but has a standard JAMMA connector +NOTE: Sunwise's S951060-VGP PCB uses identical components to the SW931201 but has a standard JAMMA connector */ ROM_START( burgkids ) // Sunwise SW931201-1 PCB - 8-liner connections @@ -572,6 +582,18 @@ ROM_START( burgkids ) // Sunwise SW931201-1 PCB - 8-liner connections ROM_LOAD( "ffk4.u33", 0x000000, 0x080000, CRC(3b032d4f) SHA1(69056bf205aadf6c9fee56ce396b11a5187caa03) ) ROM_END +ROM_START( pyutakun ) // Sunwise SW931201-1 PCB - 8-liner connections + ROM_REGION( 0x80000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP( "sunwise_p1.u61", 0x00000, 0x80000, CRC(00907713) SHA1(0822044bcf476b3e8aaba752e503ee79459b34ed) ) + + ROM_REGION( 0x100000, "gp9001", 0 ) + ROM_LOAD( "sunwise_p2.u26", 0x00000, 0x80000, CRC(180b8b13) SHA1(4a317bd0825f4e4383293220e775c0f807cdd80f) ) + ROM_LOAD( "sunwise_p3.u27", 0x80000, 0x80000, CRC(a23ccb8e) SHA1(5f2f23fa86817ff491058123d775ffebd7e98dee) ) + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "sunwise_p4.u33", 0x00000, 0x40000, CRC(b1c5a8bc) SHA1(aa18165a9214f9ed0969da073e4b6092be3c5c1a) ) +ROM_END + ROM_START( othldrby ) // Sunwise S951060-VGP PCB - JAMMA compliant (components identical to Sunwise SW931201-1 PCB) ROM_REGION( 0x080000, "maincpu", 0 ) ROM_LOAD16_WORD_SWAP( "sunwise_db0_1.u61", 0x00000, 0x80000, CRC(6b4008d3) SHA1(4cf838c47563ba482be8364b2e115569a4a06c83) ) @@ -588,4 +610,5 @@ ROM_END GAME( 1994, pwrkick, 0, pwrkick, pwrkick, sunwise_state, empty_init, ROT0, "Sunwise", "Power Kick (Japan)", 0 ) GAME( 1995, burgkids, 0, pwrkick, burgkids, sunwise_state, empty_init, ROT0, "Sunwise", "Burger Kids (Japan)", 0 ) +GAME( 1995, pyutakun, 0, pwrkick, pyutakun, sunwise_state, empty_init, ROT0, "Sunwise", "Pyuuta-kun (Japan)", 0 ) GAME( 1995, othldrby, 0, othldrby, othldrby, sunwise_state, empty_init, ROT0, "Sunwise", "Othello Derby (Japan)", 0 ) diff --git a/src/mame/trs/gime.cpp b/src/mame/trs/gime.cpp index a9b99298da6..18fc5501189 100644 --- a/src/mame/trs/gime.cpp +++ b/src/mame/trs/gime.cpp @@ -255,7 +255,8 @@ void gime_device::update_composite_palette() inline gime_device::pixel_t gime_device::get_composite_color(int color) { - static pixel_t composite_palette[64] = { + static const pixel_t composite_palette[64] = + { 0x000000, 0x004c00, 0x004300, 0x0a3100, 0x2f1b00, 0x550100, 0x6c0000, 0x770006, 0x71004b, 0x5c008b, 0x3b00b8, 0x1100ca, 0x001499, 0x002c62, 0x004011, 0x004b00, 0x2d2d2d, 0x069800, 0x288f00, 0x537d00, 0x786700, 0xa04c00, 0xb63402, 0xc3224c, @@ -267,7 +268,8 @@ inline gime_device::pixel_t gime_device::get_composite_color(int color) }; // composite output with phase inverted - static pixel_t composite_palette_180[64] = { + static const pixel_t composite_palette_180[64] = + { 0x000000, 0x5a0e5a, 0x4f0c4f, 0x360f40, 0x0d213c, 0x003334, 0x004141, 0x004943, 0x005409, 0x005600, 0x114c00, 0x263700, 0x392500, 0x491d00, 0x4f0f3e, 0x590e59, 0x2d2d2d, 0xb11fb7, 0x9932c1, 0x7248c5, 0x4a5bc2, 0x1a6eba, 0x0077a9, 0x008c62, @@ -1331,7 +1333,7 @@ inline uint16_t gime_device::get_lines_per_row() { if (m_ff22_value & MODE_AG) { - static int gime_legacy_lines_per_row_graphic[8] = + static const int gime_legacy_lines_per_row_graphic[8] = { 3, 3, 3, 2, 2, 1, 1, 1 }; @@ -1342,7 +1344,7 @@ inline uint16_t gime_device::get_lines_per_row() else { // http://cocogamedev.mxf.yuku.com/topic/4299238#.VyC6ozArI-U - static int ff9c_lines_per_row_alpha[16] = + static const int ff9c_lines_per_row_alpha[16] = { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 4, 3, 2, 1, 12 }; diff --git a/src/mame/tvgames/spg2xx.cpp b/src/mame/tvgames/spg2xx.cpp index 06d10005e8d..57ef4f7c64e 100644 --- a/src/mame/tvgames/spg2xx.cpp +++ b/src/mame/tvgames/spg2xx.cpp @@ -2537,7 +2537,7 @@ CONS( 2006, pballpup, 0, 0, pballpup, pballpup, spg2xx_game_pballpup_ CONS( 2007, dreamlss, 0, 0, dreamlss, dreamlss, spg2xx_game_dreamlss_state, empty_init, "Hasbro / Tiger Electronics", "Dream Life Superstar (Version 0.3, Mar 16 2007)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Needs a hack to not show garbage sprite on startup -CONS( 2008, swclone, 0, 0, swclone, swclone, spg2xx_game_swclone_state, init_swclone, "Hasbro / Tiger Electronics", "Star Wars - The Clone Wars", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 2008, swclone, 0, 0, swclone, swclone, spg2xx_game_swclone_state, init_swclone, "Hasbro / Tiger Electronics", "Star Wars: The Clone Wars - Clone Trooper Blaster Game", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Mattel games CONS( 2005, mattelcs, 0, 0, rad_skat, mattelcs, spg2xx_game_state, empty_init, "Mattel", "Mattel Classic Sports", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/spg2xx_dreamlife.cpp b/src/mame/tvgames/spg2xx_dreamlife.cpp index ae2ad432733..27eb958b889 100644 --- a/src/mame/tvgames/spg2xx_dreamlife.cpp +++ b/src/mame/tvgames/spg2xx_dreamlife.cpp @@ -1,5 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Ryan Holtz, David Haywood +/* + TODO: + Service mode inputs for Giga Pets Explorer + Dump and emulate Giga Pets handheld game units +*/ #include "emu.h" #include "spg2xx.h" @@ -79,6 +84,26 @@ static INPUT_PORTS_START( dsgnwrld ) PORT_BIT( 0xf000, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END +static INPUT_PORTS_START( gigapets ) + PORT_START("P1") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Select") + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Back") // PCB marking is "Cancel" + PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Menu") + PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) + // TODO: Likely handheld game unit inputs + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON4 ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) + PORT_BIT( 0xc000, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + void dreamlif_state::dreamlif(machine_config &config) { SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen); @@ -104,9 +129,17 @@ ROM_START( dsgnwrld ) ROM_LOAD16_WORD_SWAP( "designersworld.bin", 0x000000, 0x800000, CRC(b3987161) SHA1(f7d03b172fd0accc6370d9ccc340b3aa6317426f) ) ROM_END +// PCB Markings: 3059L-R3 0626 / 3059TV-R3B / 3059R-R1 0626 +// Dumped as K8D6X16UTM +ROM_START( gigapets ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "rom.u7", 0x000000, 0x800000, CRC(beacc99c) SHA1(d6e3ed69e297282b9d85661a7468e0c0a6815d31) ) +ROM_END + } // anonymous namespace // Hasbro games CONS( 2005, dreamlif, 0, 0, dreamlif, dreamlif, dreamlif_state, empty_init, "Hasbro", "Dream Life (Version 1.0, Feb 07 2005)", MACHINE_IMPERFECT_SOUND ) CONS( 2005, dsgnwrld, 0, 0, dreamlif, dsgnwrld, dreamlif_state, empty_init, "Hasbro", "Designer's World (Version 1.0, Dec 20 2005)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, gigapets, 0, 0, dreamlif, gigapets, dreamlif_state, empty_init, "Hasbro", "Giga Pets Explorer (Version 1.34.1, Mar 17 2006)", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/spg2xx_jakks.cpp b/src/mame/tvgames/spg2xx_jakks.cpp index fbf01db9f5b..8ec8f58ebb9 100644 --- a/src/mame/tvgames/spg2xx_jakks.cpp +++ b/src/mame/tvgames/spg2xx_jakks.cpp @@ -77,6 +77,33 @@ static INPUT_PORTS_START( spg2xx_jakks ) PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END +static INPUT_PORTS_START( jak_spd3 ) + PORT_INCLUDE( spg2xx_jakks ) + + PORT_MODIFY("P1") + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("C Button") + PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("Menu / Pause") +INPUT_PORTS_END + +static INPUT_PORTS_START( jak_supm ) + PORT_START("P1") + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("Joypad Up") + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("Joypad Down") + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("Joypad Left") + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("Joypad Right") + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("A Button") + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("Menu / Pause") + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("B Button") + PORT_BIT( 0x01ff, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("P3") + PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", FUNC(i2cmem_device::read_sda)) + PORT_BIT( 0x0006, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // PAL/NTSC flag + PORT_BIT( 0xfff0, IP_ACTIVE_HIGH, IPT_UNUSED ) +INPUT_PORTS_END + + static INPUT_PORTS_START( mk ) PORT_START("P1") PORT_BIT( 0x001f, IP_ACTIVE_HIGH, IPT_UNKNOWN ) @@ -185,6 +212,16 @@ ROM_START( jak_wall ) //ROM_LOAD16_WORD_SWAP( "walle.bin", 0x000000, 0x400000, BAD_DUMP CRC(6bc90b16) SHA1(184d72de059057aae7800da510fcf05ed1da9ec9)) ROM_END +ROM_START( jak_potc ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "pirates.u5", 0x000000, 0x400000, CRC(935fe66c) SHA1(8b5b11c61b7f32c313aa46e33a1c918ed82f7916) ) +ROM_END + +ROM_START( jak_supm ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "superman.u3", 0x000000, 0x400000, CRC(626bdd85) SHA1(605b3193c17f606d2de5689f045b50ac0b7ff024) ) +ROM_END + ROM_START( jak_sbjd ) ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "spongebobjelly.bin", 0x000000, 0x400000, CRC(804fbd87) SHA1(519aa7fada993837cb57fce26a1d721547af1861) ) @@ -202,6 +239,16 @@ ROM_START( jak_mpacw ) ROM_LOAD16_WORD_SWAP( "wirelessnamco.bin", 0x000000, 0x200000, CRC(78a318ca) SHA1(3c2601cbb023edb6a1f3d4bce686e0be1ef63eee) ) ROM_END +ROM_START( jak_spd3 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "spiderman3.u4", 0x000000, 0x200000, CRC(87019271) SHA1(80d126af970236a1cecf7ade49f916caf8f67ceb) ) +ROM_END + +ROM_START( jak_powr ) // shows Game-Key screen but was never produced with a GK slot + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "powerrangers.u2", 0x000000, 0x200000, CRC(859c6cff) SHA1(12bb08657e333c2644d707deead8cd3e34a140b2) ) +ROM_END + } // anonymous namespace @@ -213,7 +260,7 @@ CONS( 2004, jak_batm, 0, 0, spg2xx_jakks, batman, jakks_state, empty_ini CONS( 2004, jak_mk, 0, 0, mk, mk, jakks_state, empty_init, "JAKKS Pacific Inc / Digital Eclipse", "Mortal Kombat (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // this is an older unit than the jak_mpac Game Key Ready set and features no GameKey branding -CONS( 2004, jak_mpacw,0, 0, jakks_mpac, jak_mpac, jakks_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 7-in-1 (Wireless) (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy, New Rally X, Bosconian) (18 AUG 2004 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // uses NM (3 keys available [Dig Dug, New Rally-X], [Rally-X, Pac-Man, Bosconian], [Pac-Man, Bosconian]) +CONS( 2004, jak_mpacw,0, 0, jakks_mpac, jak_mpac, jakks_state, empty_init, "JAKKS Pacific Inc / Namco / HotGen Ltd", "Ms. Pac-Man 7-in-1 (Wireless) (Ms. Pac-Man, Pole Position, Galaga, Xevious, Mappy, New Rally X, Bosconian) (18 AUG 2004 A)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Post-GameKey units (all of these still have GameKey references in the code even if the physical connector was no longer present on the PCB) @@ -230,3 +277,11 @@ CONS( 2004, jak_mpacw,0, 0, jakks_mpac, jak_mpac, jakks_state, empty_init, "JA CONS( 2007, jak_sbjd, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "SpongeBob SquarePants Jellyfish Dodge (JAKKS Pacific TV Game) (Apr 5 2007)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) CONS( 2008, jak_wall, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Wall-E (JAKKS Pacific TV Game) (Dec 18 2007 11:34:25)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) + +CONS( 2007, jak_potc, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Pirates of the Caribbean - Islands of Fortune (JAKKS Pacific TV Game) (Jun 1 2007 12:34:28)", MACHINE_IMPERFECT_SOUND ) + +CONS( 2006, jak_supm, 0, 0, spg2xx_jakks, jak_supm, jakks_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "Superman in Super Villain Showdown (JAKKS Pacific TV Game) (26 Jan 2006 A)", MACHINE_IMPERFECT_SOUND ) // has AT24C04 + +CONS( 2007, jak_spd3, 0, 0, spg2xx_jakks, jak_spd3, jakks_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Spider-Man 3 (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND ) + +CONS( 2005, jak_powr, 0, 0, spg2xx_jakks, spg2xx_jakks, jakks_state, empty_init, "JAKKS Pacific Inc / Handheld Games", "Power Rangers S.P.D. (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix.cpp b/src/mame/tvgames/xavix.cpp index 544fea87417..6f5a5d19ad0 100644 --- a/src/mame/tvgames/xavix.cpp +++ b/src/mame/tvgames/xavix.cpp @@ -34,8 +34,6 @@ year name PCB ID ROM width TSOP pads ROM size SEEPROM die markings extra components / notes - 2011 anpan-man kazoku de ikunou mat DX /JoyPalette/Japan - - - - - - - - 2009 anpan-man pyon-pyon ikunou mat /JoyPalette/Japan - - - - - - - 2006 Hello Kitty カードでおままごと あいうおえ図鑑 / エポック社 / 日本 Hello Kitty Play House with Cards Aiuoe Illustrated Book / Epochsha / Japan ドラえもん 体感タケコプター! 空とぶ大冒険 / エポック社 / 日本 Doraemon Experience Takecopter! Great Flying Adventure / Epoch Publishing / Japan スーパーテレビパソコンLink / エポック社 / 日本 Super TV PC Link / Epoch / Japan @@ -43,9 +41,6 @@ Let's!TVプレイ 体感キャストオフ 仮面ライダーカブト クロックアップ&ライダーキック / バンダイ / 日本 Let's!TV Play Experience Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan Let's!TVプレイ なりきり体感 ボウケンジャー 走れ!撃て!ミッションスタート!! / バンダイ / 日本 Let's! TV Play Narikiri Experience Boukenger Run! Shoot! Mission starts! ! / Bandai / Japan Let's!TVプレイ なりきりファイト ウルトラマン 撃て!必殺光線!! / タカラトミー / 日本 Let's!TV Play Narikiri Fight Ultraman Shoot! Deadly ray! ! / Takara Tomy / Japan - 2005 どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ! / エポック社 / 日本 Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! / Epoch / Japan - Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう / バンダイ / 日本 Let's!TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart / Bandai / Japan - Let's!TVプレイ 魔法戦隊マジレンジャー マジマットでダンス&バトル / バンダイ / 日本 Let's!TV Play Mahou Sentai Magiranger Dance & Battle at Magimat / Bandai / Japan Jala Jaland /atlus/Japan (arcade version) - - - - - - - 2004 Printer for TV computer /EPOCH/Japan - - - - - - - Accessory memory mascot for TV mail Pc mail cot 2 characters (Putchi, Petchi) /EPOCH/Japan - - - - - - - @@ -67,12 +62,16 @@ not dumped: xavix2.cpp 2008 究極! 筋肉スタジアム! サスケ完全制覇 kyuukyoku! kinniku grand slam! SASUKE kanzen seiha /EPOCH/Japan - - - - - - - - 2006 Let's!TVプレイ ドラゴンボールZ バトル体感かめはめ波2~オッスおめぇ悟空 天下一武道会~ / バンダイ / 日本 Let's!TV Play Dragon Ball Z Battle Experience Kamehameha 2 ~Ossu Ome Goku Tenkaichi Budokai~ / Bandai / Japan 2006 SASUKE サスケ&筋肉バトル!!スポーツマンNO.1決定戦 / エポック社 / 日本 SASUKE Sasuke & Muscle Battle!! Sportsman No. 1 Decisive Battle / Epoch Publishing / Japan 2005 Let's!TVプレイ ドラゴンボ-ルZ バトル体感かめはめ波~ おめぇとフュージョン / バンダイ / 日本 Let's!TV Play Dragon Ball Z Battle Experience Kamehameha ~ Ometo Fusion / Bandai / Japan dumped: either here, xavix_2000.cpp, or xavix_2002.cpp - Excite Striker (UK) + Let's!TVプレイ 魔法戦隊マジレンジャー マジマットでダンス&バトル / バンダイ / 日本 Let's!TV Play Mahou Sentai Magiranger Dance & Battle at Magimat / Bandai / Japan + anpan-man pyon-pyon ikunou mat /JoyPalette/Japan - - - - - - - + どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ! / エポック社 / 日本 Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! / Epoch / Japan + Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう / バンダイ / 日本 Let's!TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart / Bandai / Japan + anpan-man kazoku de ikunou mat DX /JoyPalette/Japan - - - - - - - + Excite Striker (UK) connecTV OPUS /RADICA EU (different ROM to US?) Let's!TVプレイ 音撃バトル!仮面ライダー響鬼 決めろ!一気火勢の型 / バンダイ / 日本 (Let's! TV Play Ongeki Battle! Kamen Rider Hibiki Decide! Ichikkasei no Kata / Bandai / Japan) Let's construct the town! /TAKARA/Japan - - - - - - - @@ -200,6 +199,7 @@ dumped: see xavix2.cpp 2006 Let's!TVプレイ NARUTO-ナルト- 忍者体感~だってばよ~ / バンダイ / 日本 Let's!TV Play NARUTO Ninja Experience ~Dattebayo~ / Bandai / Japan 2006 テレビであそぼう!まなぼう!超能力あいうえお図鑑 / エポック社 / 日本 Let's play on TV! Learn! Superpower Aiueo Illustrated Book / Epochsha / Japan + 2006 Let's!TVプレイ ドラゴンボールZ バトル体感かめはめ波2~オッスおめぇ悟空 天下一武道会~ / バンダイ / 日本 Let's!TV Play Dragon Ball Z Battle Experience Kamehameha 2 ~Ossu Ome Goku Tenkaichi Budokai~ / Bandai / Japan @@ -283,12 +283,49 @@ void xavix_state::xavix_map(address_map &map) // this is used by data reads / writes after some processing in the core to decide if data reads can see lowbus, zeropage, stack, bank registers etc. and only falls through to here on a true external bus access void xavix_state::xavix_extbus_map(address_map &map) { - map(0x000000, 0xffffff).rw(FUNC(xavix_state::extbus_r), FUNC(xavix_state::extbus_w)); + map(0x000000, 0x7fffff).rom().region("bios", 0x00000); +} + +void xavix_cart_state::xavix_extbus_map(address_map &map) +{ + map(0x000000, 0x5fffff).rw(FUNC(xavix_cart_state::cart_r), FUNC(xavix_cart_state::cart_w)); + map(0x600000, 0x7fffff).rom().region("bios", 0x600000); +} + +void xavix_state::xavix_4mb_extbus_map(address_map &map) +{ + map(0x000000, 0x3fffff).mirror(0x400000).rom().region("bios", 0x00000); +} + +void xavix_state::xavix_2mb_extbus_map(address_map &map) +{ + map(0x000000, 0x1fffff).mirror(0x600000).rom().region("bios", 0x00000); +} + +void xavix_state::xavix_1mb_extbus_map(address_map &map) +{ + map(0x000000, 0x0fffff).mirror(0x700000).rom().region("bios", 0x00000); +} + +void xavix_state::mainram_w(offs_t offset, uint8_t data) +{ + m_mainram[offset] = data; +/* +// trying to debug anpanmdx title screen issue + if ((offset == 0x3d) && (data == 0x77)) + logerror("%s: writing 0x77 to 0x3d\n", machine().describe_context()); + if ((offset == 0x98) && (data == 0x77)) + logerror("%s: writing 0x77 to 0x98\n", machine().describe_context()); + if ((offset == 0x3f2) && (data == 0x77)) + logerror("%s: writing 0x77 to 0x3f2\n", machine().describe_context()); +// but the unwanted? value of 0x77 is explicitly set by the code at 1c61c +*/ } + void xavix_state::xavix_lowbus_map(address_map &map) { - map(0x0000, 0x3fff).ram().share("mainram"); + map(0x0000, 0x3fff).ram().w(FUNC(xavix_state::mainram_w)).share("mainram"); // Memory Emulator / Text Array map(0x4000, 0x4fff).rw(FUNC(xavix_state::xavix_memoryemu_txarray_r), FUNC(xavix_state::xavix_memoryemu_txarray_w)); @@ -415,32 +452,41 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x7fff, 0x7fff).rw(FUNC(xavix_state::irq_vector_hi_r),FUNC(xavix_state::irq_vector_hi_w)); } -void xavix_state::superxavix_lowbus_map(address_map &map) +void superxavix_state::superxavix_lowbus_map(address_map &map) { xavix_lowbus_map(map); // bitmap layer palette - map(0x6c00, 0x6cff).ram().w(FUNC(xavix_state::bmp_palram_sh_w)).share("bmp_palram_sh"); - map(0x6d00, 0x6dff).ram().w(FUNC(xavix_state::bmp_palram_l_w)).share("bmp_palram_l"); + map(0x6c00, 0x6cff).ram().w(FUNC(superxavix_state::bmp_palram_sh_w)).share("bmp_palram_sh"); + map(0x6d00, 0x6dff).ram().w(FUNC(superxavix_state::bmp_palram_l_w)).share("bmp_palram_l"); // map(0x6a40, 0x6a7f).ram().share("ext_segment_regs"); // 16x32 extended segment regs - map(0x6f78, 0x6f78).rw(FUNC(xavix_state::superxavix_chr_pal_index_r), FUNC(xavix_state::superxavix_chr_pal_index_w)); // SgdPalChrIdx - map(0x6f79, 0x6f79).rw(FUNC(xavix_state::superxavix_chr_pal_hue_r), FUNC(xavix_state::superxavix_chr_pal_hue_w)); // SgdPalChrHue - map(0x6f7a, 0x6f7a).rw(FUNC(xavix_state::superxavix_chr_pal_saturation_r), FUNC(xavix_state::superxavix_chr_pal_saturation_w)); // SgdPalChrSat - map(0x6f7b, 0x6f7b).rw(FUNC(xavix_state::superxavix_chr_pal_lightness_r), FUNC(xavix_state::superxavix_chr_pal_lightness_w)); // SgdPalChrLgt + // bitmap plotter(!) (with auto-inc?) - used by super pc tv units + map(0x6f60, 0x6f60).w(FUNC(superxavix_state::superxavix_plt_flush_w)); // writes here to flush plotter FIFO + map(0x6f62, 0x6f62).w(FUNC(superxavix_state::superxavix_plt_dat_w)); // writes plotter data here + map(0x6f63, 0x6f63).r(FUNC(superxavix_state::superxavix_plt_dat_r)); + map(0x6f64, 0x6f67).rw(FUNC(superxavix_state::superxavix_plt_loc_r), FUNC(superxavix_state::superxavix_plt_loc_w)).share("sx_plt_loc"); + + map(0x6f78, 0x6f78).rw(FUNC(superxavix_state::superxavix_chr_pal_index_r), FUNC(superxavix_state::superxavix_chr_pal_index_w)); // SgdPalChrIdx + map(0x6f79, 0x6f79).rw(FUNC(superxavix_state::superxavix_chr_pal_hue_r), FUNC(superxavix_state::superxavix_chr_pal_hue_w)); // SgdPalChrHue + map(0x6f7a, 0x6f7a).rw(FUNC(superxavix_state::superxavix_chr_pal_saturation_r), FUNC(superxavix_state::superxavix_chr_pal_saturation_w)); // SgdPalChrSat + map(0x6f7b, 0x6f7b).rw(FUNC(superxavix_state::superxavix_chr_pal_lightness_r), FUNC(superxavix_state::superxavix_chr_pal_lightness_w)); // SgdPalChrLgt + + map(0x6f7c, 0x6f7c).rw(FUNC(superxavix_state::superxavix_bitmap_pal_index_r), FUNC(superxavix_state::superxavix_bitmap_pal_index_w)); // SgdPalBmpAdr + map(0x6f7d, 0x6f7d).rw(FUNC(superxavix_state::superxavix_bitmap_pal_hue_r), FUNC(superxavix_state::superxavix_bitmap_pal_hue_w)); // SgdPalBmpHue + map(0x6f7e, 0x6f7e).rw(FUNC(superxavix_state::superxavix_bitmap_pal_saturation_r), FUNC(superxavix_state::superxavix_bitmap_pal_saturation_w)); // SgdPalBmpSat + map(0x6f7f, 0x6f7f).rw(FUNC(superxavix_state::superxavix_bitmap_pal_lightness_r), FUNC(superxavix_state::superxavix_bitmap_pal_lightness_w)); // SgdPalBmpLgt - map(0x6f7c, 0x6f7c).rw(FUNC(xavix_state::superxavix_bitmap_pal_index_r), FUNC(xavix_state::superxavix_bitmap_pal_index_w)); // SgdPalBmpAdr - map(0x6f7d, 0x6f7d).rw(FUNC(xavix_state::superxavix_bitmap_pal_hue_r), FUNC(xavix_state::superxavix_bitmap_pal_hue_w)); // SgdPalBmpHue - map(0x6f7e, 0x6f7e).rw(FUNC(xavix_state::superxavix_bitmap_pal_saturation_r), FUNC(xavix_state::superxavix_bitmap_pal_saturation_w)); // SgdPalBmpSat - map(0x6f7f, 0x6f7f).rw(FUNC(xavix_state::superxavix_bitmap_pal_lightness_r), FUNC(xavix_state::superxavix_bitmap_pal_lightness_w)); // SgdPalBmpLgt + map(0x6f80, 0x6f99).rw(FUNC(superxavix_state::superxavix_crtc_1_r), FUNC(superxavix_state::superxavix_crtc_1_w)).share("sx_crtc_1"); // Super XaviX CRTC? + map(0x6fa0, 0x6fa7).rw(FUNC(superxavix_state::superxavix_crtc_2_r), FUNC(superxavix_state::superxavix_crtc_2_w)).share("sx_crtc_2"); // maybe more CRTC regs? - map(0x6fb0, 0x6fc7).ram().share("bmp_base"); + map(0x6fb0, 0x6fc7).rw(FUNC(superxavix_state::bitmap_params_r), FUNC(superxavix_state::bitmap_params_w)).share("bmp_base"); // extended external bus stuff (possible banking control?) - map(0x7909, 0x7909).w(FUNC(xavix_state::extended_extbus_reg0_w)); - map(0x790b, 0x790b).w(FUNC(xavix_state::extended_extbus_reg1_w)); - map(0x790d, 0x790d).w(FUNC(xavix_state::extended_extbus_reg2_w)); + map(0x7909, 0x7909).w(FUNC(superxavix_state::extended_extbus_reg0_w)); + map(0x790b, 0x790b).w(FUNC(superxavix_state::extended_extbus_reg1_w)); + map(0x790d, 0x790d).w(FUNC(superxavix_state::extended_extbus_reg2_w)); map(0x7a10, 0x7a12).rw("xavix2002io", FUNC(xavix2002_io_device::pio_dir_r), FUNC(xavix2002_io_device::pio_dir_w)); map(0x7a20, 0x7a22).rw("xavix2002io", FUNC(xavix2002_io_device::pio_out_r), FUNC(xavix2002_io_device::pio_out_w)); @@ -745,13 +791,13 @@ static INPUT_PORTS_START( tom_tvho ) PORT_INCLUDE(xavix) PORT_MODIFY("MOUSE0X") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_REVERSE PORT_PLAYER(1) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_X ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_REVERSE PORT_PLAYER(1) PORT_MODIFY("MOUSE0Y") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_PLAYER(1) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_Y ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_PLAYER(1) PORT_MODIFY("MOUSE1X") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_REVERSE PORT_PLAYER(2) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_X ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_REVERSE PORT_PLAYER(2) PORT_MODIFY("MOUSE1Y") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_PLAYER(2) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_Y ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(7) PORT_KEYDELTA(35) PORT_PLAYER(2) PORT_MODIFY("IN0") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) @@ -1602,6 +1648,18 @@ static const gfx_layout char16layout = 16*16*4 }; + +static const gfx_layout char_16x16x2_layout = +{ + 16,16, + RGN_FRAC(1,1), + 2, + { 0,1 }, + { 6,4,2,0,14,12,10,8,22,20,18,16,30,28,26,24 }, + { STEP16(0,16*2) }, + 16*16*2 +}; + static const gfx_layout charlayout8bpp = { 8,8, @@ -1625,6 +1683,7 @@ static const gfx_layout char16layout8bpp = }; static GFXDECODE_START( gfx_xavix ) + GFXDECODE_ENTRY( "bios", 0, char_16x16x2_layout, 0, 64 ) GFXDECODE_ENTRY( "bios", 0, gfx_8x8x4_packed_lsb, 0, 16 ) GFXDECODE_ENTRY( "bios", 0, char16layout, 0, 16 ) GFXDECODE_ENTRY( "bios", 0, charlayout8bpp, 0, 1 ) @@ -1695,9 +1754,28 @@ void xavix_state::xavix(machine_config &config) m_sound->add_route(1, "rspeaker", 1.0); } +void xavix_state::xavix_4mb(machine_config &config) +{ + xavix(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_4mb_extbus_map); +} + +void xavix_state::xavix_2mb(machine_config &config) +{ + xavix(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_2mb_extbus_map); +} + +void xavix_state::xavix_1mb(machine_config &config) +{ + xavix(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_1mb_extbus_map); +} + + void xavix_guru_state::xavix_guru(machine_config &config) { - xavix_nv(config); + xavix_4mb_nv(config); m_anport->read_2_callback().set(FUNC(xavix_guru_state::guru_anport2_r)); } @@ -1710,9 +1788,21 @@ void xavix_i2c_state::xavix_i2c_24c02(machine_config &config) I2C_24C02(config, "i2cmem", 0); } -void xavix_i2c_state::xavix_i2c_24c02_43mhz(machine_config &config) +void xavix_i2c_state::xavix_i2c_24c02_4mb(machine_config &config) { xavix_i2c_24c02(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + +void xavix_i2c_state::xavix_i2c_24c02_2mb(machine_config &config) +{ + xavix_i2c_24c02(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_2mb_extbus_map); +} + +void xavix_i2c_state::xavix_i2c_24c02_43mhz(machine_config &config) +{ + xavix_i2c_24c02_4mb(config); // tomplc crashes when you start the game at regular clock speeds // this could indicate that it's actually one of the newer chips @@ -1722,7 +1812,7 @@ void xavix_i2c_state::xavix_i2c_24c02_43mhz(machine_config &config) void xavix_state::xavix_43mhz(machine_config &config) { - xavix(config); + xavix_4mb(config); // tomthr crashes when you start the game at regular clock speeds // this could indicate that it's actually one of the newer chips @@ -1739,9 +1829,28 @@ void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) I2C_24C04(config, "i2cmem", 0); // 24LC04 on Nostalgia games, 24C04 on others } -void xavix_i2c_ltv_tam_state::xavix_i2c_24lc04_tam(machine_config &config) +void xavix_i2c_state::xavix_i2c_24lc04_4mb(machine_config &config) { xavix_i2c_24lc04(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + +void xavix_i2c_state::xavix_i2c_24lc04_2mb(machine_config &config) +{ + xavix_i2c_24lc04(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_2mb_extbus_map); +} + +void xavix_i2c_state::xavix_i2c_24lc04_1mb(machine_config &config) +{ + xavix_i2c_24lc04(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_1mb_extbus_map); +} + + +void xavix_i2c_ltv_tam_state::xavix_i2c_24lc04_tam(machine_config &config) +{ + xavix_i2c_24lc04_4mb(config); m_anport->read_0_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport0_r)); m_anport->read_1_callback().set(FUNC(xavix_i2c_ltv_tam_state::tam_anport1_r)); @@ -1752,7 +1861,7 @@ void xavix_i2c_ltv_tam_state::xavix_i2c_24lc04_tam(machine_config &config) void xavix_tom_tvho_state::xavix_tom_tvho(machine_config &config) { - xavix(config); + xavix_2mb(config); m_anport->read_0_callback().set(FUNC(xavix_tom_tvho_state::tvho_anport0_r)); m_anport->read_1_callback().set(FUNC(xavix_tom_tvho_state::tvho_anport1_r)); @@ -1764,6 +1873,8 @@ void xavix_i2c_mj_state::xavix_i2c_24lc02_mj(machine_config &config) { xavix_i2c_24c02(config); + m_maincpu->set_addrmap(6, &xavix_i2c_mj_state::xavix_2mb_extbus_map); + m_anport->read_0_callback().set(FUNC(xavix_i2c_mj_state::mj_anport0_r)); } @@ -1774,6 +1885,12 @@ void xavix_i2c_state::xavix_i2c_24c08(machine_config &config) I2C_24C08(config, "i2cmem", 0); } +void xavix_i2c_state::xavix_i2c_24c08_4mb(machine_config &config) +{ + xavix_i2c_24c08(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + void xavix_i2c_state::xavix_i2c_24c16(machine_config& config) { xavix(config); @@ -1781,32 +1898,79 @@ void xavix_i2c_state::xavix_i2c_24c16(machine_config& config) I2C_24C16(config, "i2cmem", 0); } +void xavix_i2c_state::xavix_i2c_24c16_4mb(machine_config& config) +{ + xavix_i2c_24c16(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + void xavix_state::xavixp(machine_config &config) { // other clocks should change too! - xavix(config); m_screen->set_refresh_hz(50); } +void xavix_state::xavixp_4mb(machine_config &config) +{ + xavixp(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_4mb_extbus_map); +} + +void xavix_state::xavixp_2mb(machine_config &config) +{ + xavixp(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_2mb_extbus_map); +} + +void xavix_state::xavixp_1mb(machine_config &config) +{ + xavixp(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_1mb_extbus_map); +} + void xavix_state::xavix_nv(machine_config &config) { xavix(config); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); } +void xavix_state::xavix_1mb_nv(machine_config &config) +{ + xavix_nv(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_1mb_extbus_map); +} + +void xavix_state::xavix_2mb_nv(machine_config &config) +{ + xavix_nv(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_2mb_extbus_map); +} + +void xavix_state::xavix_4mb_nv(machine_config &config) +{ + xavix_nv(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_4mb_extbus_map); +} + void xavix_state::xavixp_nv(machine_config &config) { xavixp(config); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); } +void xavix_state::xavixp_1mb_nv(machine_config &config) +{ + xavixp_nv(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_1mb_extbus_map); +} + void xavix_mtrk_state::xavix_mtrk(machine_config &config) { - xavix(config); + xavix_4mb(config); XAVIX_MTRK_WHEEL(config, m_wheel, 0); m_wheel->event_out_cb().set(FUNC(xavix_state::ioevent_trg08)); @@ -1821,7 +1985,7 @@ void xavix_mtrk_state::xavix_mtrkp(machine_config &config) void xavix_madfb_state::xavix_madfb(machine_config &config) { - xavix(config); + xavix_4mb(config); XAVIX_MADFB_BALL(config, m_ball, 0); m_ball->event_out_cb().set(FUNC(xavix_state::ioevent_trg01)); @@ -1871,6 +2035,11 @@ void xavix_cart_state::xavix_cart_daig(machine_config &config) SOFTWARE_LIST(config, "cart_list_daig").set_original("takara_daigunder_dx_cart"); } +void xavix_cart_gcslottv_state::xavix_extbus_map(address_map &map) +{ + map(0x000000, 0x7fffff).rw(FUNC(xavix_cart_gcslottv_state::cart_r), FUNC(xavix_cart_gcslottv_state::cart_w)); +} + void xavix_cart_gcslottv_state::xavix_cart_gcslottv(machine_config &config) { xavix_cart(config); @@ -2034,58 +2203,58 @@ ROM_START( namcons2 ) ROM_END ROM_START( rad_box ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("boxing.bin", 0x000000, 0x200000, CRC(5cd40714) SHA1(165260228c029a9502ca0598c84c24fd9bdeaebe) ) ROM_END ROM_START( rad_boxp ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("boxing.bin", 0x000000, 0x200000, CRC(5cd40714) SHA1(165260228c029a9502ca0598c84c24fd9bdeaebe) ) ROM_END ROM_START( rad_bass ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("bassfishin.bin", 0x000000, 0x100000, CRC(b54eb1c5) SHA1(084faa9349369f2b8846950765f9c8f758db3e9e) ) ROM_END ROM_START( rad_bassp ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("bassfishin.bin", 0x000000, 0x100000, CRC(b54eb1c5) SHA1(084faa9349369f2b8846950765f9c8f758db3e9e) ) ROM_END ROM_START( rad_opus ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("opus.bin", 0x000000, 0x100000, CRC(f84c11c5) SHA1(6e34129d0ca9c52b7c342fc94860629d81705523) ) ROM_END ROM_START( rad_opusp ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("opus.bin", 0x000000, 0x100000, CRC(f84c11c5) SHA1(6e34129d0ca9c52b7c342fc94860629d81705523) ) ROM_END ROM_START( rad_opusa ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("opus_alt.bin", 0x000000, 0x100000, CRC(509df402) SHA1(c5b863670eac8498ddda9dfde91387634cf7aa9f) ) ROM_END ROM_START( rad_hnt ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("huntin1.bin", 0x000000, 0x100000, CRC(e51e250f) SHA1(d72199096d466cd344bb243ef1228e0df9501d00) ) ROM_END ROM_START( rad_hnt2 ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("huntin2.bin", 0x000000, 0x200000, CRC(fb6846df) SHA1(267632790ed42eba7ef1517b86b024799a78839d) ) ROM_END ROM_START( rad_snow ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("snoblu.bin", 0x000000, 0x100000, CRC(593e40b3) SHA1(03483ac39eddd7746470fb60018e704382b0da59) ) ROM_END ROM_START( rad_snowp ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("snoblu.bin", 0x000000, 0x100000, CRC(593e40b3) SHA1(03483ac39eddd7746470fb60018e704382b0da59) ) ROM_END @@ -2131,87 +2300,87 @@ ROM_START( rad_mtrkp ) // rom was dumped from NTSC unit, assuming to be the same ROM_END ROM_START( rad_ssx ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) ) ROM_END ROM_START( rad_ssxp ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("snowssx.bin", 0x000000, 0x400000, CRC(108e19a6) SHA1(3dfb18efb6331b96a53138a5ba29dae9cd966e90) ) ROM_END ROM_START( rad_sbw ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("snowbwhite.bin", 0x000000, 0x400000, CRC(640c1473) SHA1(d37d1484a5b14735b35afbca305dad7d178b08a2) ) ROM_END ROM_START( rad_bdp ) - ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) + ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("barbiepad.bin", 0x000000, 0x200000, CRC(48731512) SHA1(377d4e1c98cafcd9d5e1ee27943289d250a6e7a9) ) ROM_END ROM_START( rad_madf ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("madden.bin", 0x000000, 0x400000, CRC(e972fdcf) SHA1(52001316254880755da959c3441d232fd2c72c7a) ) ROM_END ROM_START( rad_fb ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("rfootball.bin", 0x000000, 0x400000, CRC(025e0cb4) SHA1(60ce363de236d5119d078e346ad5d2ae50dbc7e1) ) ROM_END ROM_START( epo_fish ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("fish.bin", 0x000000, 0x200000, CRC(72392caf) SHA1(16a65c79ff7e3b5f5f514a024bd652412ed38b74) ) ROM_END ROM_START( epo_efdx ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitefishing.bin", 0x000000, 0x400000, CRC(9c85b261) SHA1(6a363faed2ec89c5176e46554a98ca1e20132579) ) ROM_END ROM_START( epo_esdx ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("baseballdx.bin", 0x000000, 0x400000, CRC(fe2e832e) SHA1(e6343f5e5f52316538d918d0d67c15764aa40f65) ) ROM_END ROM_START( epo_stad ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitestadium.bin", 0x000000, 0x200000, CRC(b58035b9) SHA1(1382a9e42ff932e7ec2186b210917bcf5c571b86) ) ROM_END ROM_START( epo_esht ) // ESTJ-MAIN REV:0 PCB - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("tigers.u3", 0x000000, 0x400000, CRC(51a17ef3) SHA1(864190e91775716218be3ac0699570844d67d3e7) ) ROM_END ROM_START( epo_epp ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitepingpong.bin", 0x000000, 0x100000, CRC(1fdb9cbd) SHA1(8ed0c1f6d2708ab6e79f0b9553e587c6446e8338) ) ROM_END ROM_START( epo_epps ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitepingpong_special.bin", 0x000000, 0x100000, CRC(d59c4b44) SHA1(5a48b9046a1d1beb10972fc1d41d6d63fe829465) ) ROM_END ROM_START( epo_eppk ) - ROM_REGION(0x100000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x100000, "bios", ROMREGION_ERASE00) ROM_LOAD("sonokongpingpong.bin", 0x000000, 0x100000, CRC(ea81ced6) SHA1(ef8961d3670148501a478c17cd09f5088e32ad41) ) ROM_END ROM_START( epo_epp2 ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitepingpong2.u3", 0x000000, 0x200000, CRC(4b70012a) SHA1(4dd80472067027be5a416ec953f4ed6e7df5fc25) ) ROM_END ROM_START( epo_epp3 ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("excitepingpong3.bin", 0x000000, 0x200000, CRC(a2ee8bff) SHA1(6e16dbaac9680e1f311c08e3f573d0cf8708b446)) ROM_END ROM_START( epo_mj ) // MARJ MAIN-11A - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("marj.u4", 0x000000, 0x200000, CRC(4e496424) SHA1(9661130ad8315082bd211b3817e5830b576907a8) ) ROM_END @@ -2246,17 +2415,17 @@ ROM_START( tak_town ) ROM_END ROM_START( epo_guru ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("gururinworld.bin", 0x000000, 0x400000, CRC(e5ae4523) SHA1(0e39ef8f94203d34e49422081667805f50a339a1) ) ROM_END ROM_START( epo_dmon ) // Doraemon has a phototransistor, microphone and 24LC02, PCB says XaviX 2002 - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("doraemon.bin", 0x000000, 0x400000, CRC(d8f5412f) SHA1(11a4c017ed400f7aa585be744d9693efe734c192) ) ROM_END ROM_START( rad_rh ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("rescueheroes.bin", 0x000000, 0x200000, CRC(38c391a7) SHA1(120334d4ce89d98438c2a35bf7e53af5096cc878) ) ROM_END @@ -2296,52 +2465,52 @@ ROM_START( ban_krrj ) // KRRJ MAIN PCB 01 ROM_END ROM_START( tak_geig ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("geigeki.bin", 0x000000, 0x400000, CRC(bd0c3576) SHA1(06f614dbec0225ce4ed866b98450912986d72faf) ) ROM_END ROM_START( tom_tvho ) // ET105 REV 0.0 - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("tvhockey.u4", 0x000000, 0x200000, CRC(9cd72ae2) SHA1(0530851123b607ddb85f9513405ce97c493f5fd6) ) ROM_END ROM_START( tak_comt ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("comet.u3", 0x000000, 0x200000, CRC(407c5566) SHA1(41d73c34af8cc3d07a34fcac0bc1856442c94200) ) ROM_END ROM_START( jarajal ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("takaraslots.bin", 0x000000, 0x200000, CRC(afae0b72) SHA1(b1c5d80a8dc8466982efd79d54cd82a58f0ff997) ) ROM_END ROM_START( tomshoot ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("airgun.u4", 0x000000, 0x200000, CRC(3e4f7b65) SHA1(4e1660d4952c498e250526c2c3f027253e1fcbe1) ) ROM_END ROM_START( tcarnavi ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("navi.bin", 0x000000, 0x400000, CRC(f4e693fb) SHA1(be37b35f1e1e661e10187253c2c3aa9858a90812) ) ROM_END ROM_START( tomcpin ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("championpinball.bin", 0x000000, 0x400000, CRC(24f6d753) SHA1(3d3b39692bef8156da9e350b456c4e2f0af74484) ) ROM_END ROM_START( tomplc ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("imaplayrailconductor.bin", 0x000000, 0x400000, CRC(b775d0ed) SHA1(33142509b11bbe45b0b9222232033dd64ef01ff2) ) ROM_END ROM_START( tomthr ) // THRJ MAIN PCB REV 0.6 - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("thrj.u4", 0x000000, 0x400000, CRC(a7e8dc74) SHA1(676b2a905b757356c6c1dfe3f10148484caa44c5) ) ROM_END ROM_START( gungunad ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) // some lines were swapped going into the die, but it is unclear if they're swapped back inside it ROM_LOAD("gga.bin", 0x000000, 0x40000, CRC(5252b6bb) SHA1(8a9f920e4bccabbd337f37a838af574e2b16746f) ) ROM_CONTINUE(0x080000,0x040000) @@ -2356,12 +2525,12 @@ ROM_END ROM_START( gungunrv ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("gungunrevolution.u1", 0x000000, 0x400000, CRC(4e34f624) SHA1(7acdd0991df78ecffd156381817ed4f85f6aef09) ) ROM_END ROM_START( bistro ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00) ROM_LOAD("bistro.u2", 0x000000, 0x200000, CRC(40865e05) SHA1(597a615c61f29c6f6e7ce997a229175cb151242f) ) ROM_END @@ -2476,7 +2645,7 @@ ROM_END // ASKJ MAIN-09 PCB ROM_START( epo_quiz ) - ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "quizmaster.u1", 0x000000, 0x400000, CRC(e91868b8) SHA1(0128603d755731dafe328b142292dc6e5fe00d78) ) ROM_END @@ -2515,32 +2684,32 @@ ROM_START( epo_hamd ) ROM_END ROM_START( tvpc_tom ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "tvpc_thomas.u1", 0x000000, 0x400000, CRC(507f334e) SHA1(d66efd13f166fcd2a66133dc981c8a67b2a26d5f) ) ROM_END ROM_START( tvpc_dor ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "tvpc_doreamon.u3", 0x000000, 0x400000, CRC(6f2edbb2) SHA1(98fa86f85e00aa40e7a585ff0bc930cb5ca88362) ) ROM_END ROM_START( tvpc_ham ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "hpcj.u3", 0x000000, 0x400000, CRC(76e8c854) SHA1(5998c03292a16107d0d7ae00f77677582680f323) ) ROM_END ROM_START( tak_gin ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "snowboard.bin", 0x000000, 0x200000, CRC(79fdeae3) SHA1(ab08790e95cdccf3541ecbddb87ebf0dedb3718b) ) ROM_END ROM_START( tak_hamr ) // HAMJ MAIN on PCB - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "hamj.u4", 0x000000, 0x400000, CRC(2f4f5270) SHA1(dfb75f0d20247cf1c886840149c7cf91780ae1b9) ) ROM_END ROM_START( tak_beyb ) - ROM_REGION(0x200000, "bios", ROMREGION_ERASE00 ) + ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "beyblade.u2", 0x000000, 0x200000, CRC(bcf6b3a7) SHA1(1c80f1241138b9d7816f1e5285ff8f3c61739c95) ) ROM_END @@ -2558,63 +2727,63 @@ ROM_END */ // Let's!TVプレイCLASSIC タイトーノスタルジア1 -CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04_2mb, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイCLASSIC タイトーノスタルジア2 -CONS( 2006, taitons2, 0, 0, xavix_i2c_24lc04, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2 (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, taitons2, 0, 0, xavix_i2c_24lc04_2mb, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2 (Japan)", MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイCLASSIC ナムコノスタルジア1 -CONS( 2006, namcons1, 0, 0, xavix_i2c_24lc04, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, namcons1, 0, 0, xavix_i2c_24lc04_1mb, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイCLASSIC ナムコノスタルジア2 -CONS( 2006, namcons2, 0, 0, xavix_i2c_24lc04, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2 (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, namcons2, 0, 0, xavix_i2c_24lc04_1mb, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2 (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2000, rad_ping, 0, 0, xavix, rad_ping, xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd" -CONS( 2000, rad_pingp, rad_ping, 0, xavixp, rad_pingp,xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "ConnecTV Table Tennis (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, rad_ping, 0, 0, xavix_1mb, rad_ping, xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd" +CONS( 2000, rad_pingp, rad_ping, 0, xavixp_1mb, rad_pingp,xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "ConnecTV Table Tennis (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // this set reads the region byte and will show either 'RADICA: Play TV Opus' or 'RADICA: ConnecTV Opus' as the title -CONS( 2000, rad_opus, 0, 0, xavix_nv, rad_opus, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Opus (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // there is a missing 'TV Static' noise effect when menus appear (box shows 'Play TV' ingame just shows 'Radica:Plug & Play') -CONS( 2000, rad_opusp, rad_opus, 0, xavixp_nv, rad_opusp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Opus (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, rad_opus, 0, 0, xavix_1mb_nv, rad_opus, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Opus (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // there is a missing 'TV Static' noise effect when menus appear (box shows 'Play TV' ingame just shows 'Radica:Plug & Play') +CONS( 2000, rad_opusp, rad_opus, 0, xavixp_1mb_nv, rad_opusp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Opus (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // the set below does NOT read the PAL/NTSC flag, and will only display 'RADICA: Plug & Play Opus' as the title // older release, or region where the Play TV / ConnecTV trademarks weren't used? -CONS( 2000, rad_opusa, rad_opus, 0, xavixp_nv, rad_opus, xavix_state, init_xavix, "Radica / SSD Company LTD", "Plug & Play Opus (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, rad_opusa, rad_opus, 0, xavixp_1mb_nv, rad_opus, xavix_state, init_xavix, "Radica / SSD Company LTD", "Plug & Play Opus (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2000, rad_hnt, 0, 0, xavix_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun (box shows 'Play TV' ingame just shows 'Plug & Play') +CONS( 2000, rad_hnt, 0, 0, xavix_1mb_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun (box shows 'Play TV' ingame just shows 'Plug & Play') -CONS( 2003, rad_hnt2, 0, 0, xavix_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun, crashes on pause +CONS( 2003, rad_hnt2, 0, 0, xavix_2mb_nv, rad_hnt, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Buckmasters Huntin' 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // need to map gun, crashes on pause CONS( 2003, rad_mtrk, 0, 0, xavix_mtrk, rad_mtrk, xavix_mtrk_state, init_xavix, "Radica / SSD Company LTD", "Play TV Monster Truck (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) CONS( 2003, rad_mtrkp, rad_mtrk, 0, xavix_mtrkp, rad_mtrkp,xavix_mtrk_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Monster Truck (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 200?, rad_box, 0, 0, xavix, rad_box, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Boxin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 200?, rad_boxp, rad_box, 0, xavixp, rad_boxp, xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Boxin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, rad_box, 0, 0, xavix_2mb, rad_box, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Boxin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, rad_boxp, rad_box, 0, xavixp_2mb, rad_boxp, xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Boxin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 200?, rad_crdn, 0, 0, xavix, rad_crdn, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp, rad_crdnp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, rad_crdn, 0, 0, xavix_1mb, rad_crdn, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Card Night (NTSC)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, rad_crdnp, rad_crdn, 0, xavixp_1mb, rad_crdnp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Card Night (PAL)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2000, rad_bb, 0, 0, xavix, rad_bb, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Play TV branding used on box, not ingame +CONS( 2000, rad_bb, 0, 0, xavix_1mb, rad_bb, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Play TV branding used on box, not ingame -CONS( 2001, rad_bass, 0, 0, xavix, rad_bass, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Bass Fishin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2001, rad_bassp, rad_bass, 0, xavixp, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, rad_bass, 0, 0, xavix_1mb, rad_bass, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Bass Fishin' (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, rad_bassp, rad_bass, 0, xavixp_1mb, rad_bassp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Bass Fishin' (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // there is another 'Snowboarder' with a white coloured board, it appears to be a newer game closer to 'SSX Snowboarder' but without the SSX license. -CONS( 2001, rad_snow, 0, 0, xavix_nv, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_IMPERFECT_SOUND ) -CONS( 2001, rad_snowp, rad_snow, 0, xavixp_nv, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_IMPERFECT_SOUND ) +CONS( 2001, rad_snow, 0, 0, xavix_1mb_nv, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (Blue) (NTSC)", MACHINE_IMPERFECT_SOUND ) +CONS( 2001, rad_snowp, rad_snow, 0, xavixp_1mb_nv, rad_snowp,xavix_state, init_xavix, "Radica / SSD Company LTD", "ConnecTV Snowboarder (Blue) (PAL)", MACHINE_IMPERFECT_SOUND ) CONS( 2003, rad_madf, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / Electronic Arts / SSD Company LTD", "EA Sports Madden Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // no Play TV branding, USA only release? CONS( 200?, rad_fb, 0, 0, xavix_madfb, rad_fb, xavix_madfb_state, init_xavix, "Radica / SSD Company LTD", "Play TV Football (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // USA only release? doesn't change logo for PAL. -CONS( 200?, rad_rh, 0, 0, xavix, rad_rh, xavix_state, init_xavix, "Radica / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, rad_rh, 0, 0, xavix_2mb, rad_rh, xavix_state, init_xavix, "Radica / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, rad_ssx, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / Electronic Arts / SSD Company LTD", "Play TV SSX Snowboarder (NTSC)", MACHINE_IMPERFECT_SOUND ) -CONS( 2004, rad_ssxp, rad_ssx, 0, xavixp, rad_snowp,xavix_state, init_xavix, "Radica / Electronic Arts / SSD Company LTD", "ConnecTV SSX Snowboarder (PAL)", MACHINE_IMPERFECT_SOUND ) +CONS( 2004, rad_ssx, 0, 0, xavix_4mb, rad_snow, xavix_state, init_xavix, "Radica / Electronic Arts / SSD Company LTD", "Play TV SSX Snowboarder (NTSC)", MACHINE_IMPERFECT_SOUND ) +CONS( 2004, rad_ssxp, rad_ssx, 0, xavixp_4mb, rad_snowp,xavix_state, init_xavix, "Radica / Electronic Arts / SSD Company LTD", "ConnecTV SSX Snowboarder (PAL)", MACHINE_IMPERFECT_SOUND ) // basically a reissue of SSX but without the license -CONS( 2006, rad_sbw, 0, 0, xavix, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (White) (NTSC)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, rad_sbw, 0, 0, xavix_4mb, rad_snow, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Snowboarder (White) (NTSC)", MACHINE_IMPERFECT_SOUND ) // doesn't exist with ConnecTV branding? -CONS( 2002, rad_bdp, 0, 0, xavix, rad_bdp, xavix_state, init_xavix, "Radica / Mattel / SSD Company LTD", "Barbie Dance Party", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, rad_bdp, 0, 0, xavix_2mb, rad_bdp, xavix_state, init_xavix, "Radica / Mattel / SSD Company LTD", "Barbie Dance Party", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // ゴール決めるぜ! エキサイトストライカー CONS( 2001, epo_strk, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Goal Kimeruze! Excite Striker (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) @@ -2627,15 +2796,15 @@ CONS( 2001, tak_town, 0, 0, xavix, rad_jcon, xavix_state, CONS( 2002, rad_jcon, tak_town, 0, xavix, rad_jcon, xavix_state, init_xavix, "Radica / Takara / SSD Company LTD", "Play TV Jr. Construction", MACHINE_IMPERFECT_SOUND ) // ホームラン打とうぜ! エキサイトスタジアム -CONS( 2000, epo_stad, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Home Run Datouze! Excite Stadium (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, epo_stad, 0, 0, xavix_2mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Home Run Datouze! Excite Stadium (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // this seems to be based off the epo_stad code, but heavily modified -CONS( 2002, rad_bb2, 0, 0, xavix, rad_bb2, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // contains string "Radica RBB2 V1.0" +CONS( 2002, rad_bb2, 0, 0, xavix_2mb, rad_bb2, xavix_state, init_xavix, "Radica / SSD Company LTD", "Play TV Baseball 2 (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // contains string "Radica RBB2 V1.0" // 勝負しようぜ! エキサイトスタジアムDX -CONS( 2002, epo_esdx, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Shoubu Shiyouze! Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, epo_esdx, 0, 0, xavix_4mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Shoubu Shiyouze! Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 阪神タイガース エキサイトスタジアムDX -CONS( 2003, epo_esht, 0, 0, xavix_nv, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Hanshin Tigers Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_esht, 0, 0, xavix_4mb_nv, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Hanshin Tigers Excite Stadium DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // interrupt issues after the title screen cause it to hang // エースきめるぜ!エキサイトテニス @@ -2645,85 +2814,86 @@ CONS( 2002, epo_tenn, 0, 0, xavix, epo_epp, xavix_state, CONS( 2001, epo_hamd, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Ham-chans Dai Shuugou Dance Surunoda! Hashirunoda! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 卓球やろうぜ! エキサイトピンポン -CONS( 2000, epo_epp, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Takkyuu Yarouze! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2000, epo_eppk, epo_epp, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD / Sonokong", "Real Ping Pong (Korea)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, epo_epp, 0, 0, xavix_1mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Takkyuu Yarouze! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2000, epo_eppk, epo_epp, 0, xavix_1mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD / Sonokong", "Real Ping Pong (Korea)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // しゃもじdeピンポン // This special version of Excite Ping Pong was a competition prize, not a retail product. The competition was sponsored by ミツカン (Mizkan) -CONS( 2001, epo_epps, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / Mizkan / SSD Company LTD", "Shamoji de Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, epo_epps, 0, 0, xavix_1mb, epo_epp, xavix_state, init_xavix, "Epoch / Mizkan / SSD Company LTD", "Shamoji de Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 卓球やろうぜ! エキサイトピンポン2 -CONS( 2003, epo_epp2, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Takkyuu Yarouze! Excite Ping Pong 2 (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_epp2, 0, 0, xavix_2mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Takkyuu Yarouze! Excite Ping Pong 2 (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 愛ちゃんに挑戦!エキサイトピンポン -CONS( 2006, epo_epp3, 0, 0, xavix, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Ai-chan ni Chousen! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2006, epo_epp3, 0, 0, xavix_2mb, epo_epp, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Ai-chan ni Chousen! Excite Ping Pong (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // TV麻雀 昇段対局~4人打ち CONS( 2003, epo_mj, 0, 0, xavix_i2c_24lc02_mj, epo_mj, xavix_i2c_mj_state, init_xavix, "Epoch / SSD Company LTD", "TV Mahjong Shoudan Taikyoku - 4-nin Uchi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ブラックバス釣ろうぜ! エキサイトフィッシング -CONS( 2001, epo_fish, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Black Bass Tsurouze! Excite Fishing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, epo_fish, 0, 0, xavix_2mb, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Black Bass Tsurouze! Excite Fishing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 大モノ釣ろうぜ! エキサイトフィッシングDX -CONS( 2003, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Dai Mono Tsurouze! Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_efdx, 0, 0, xavix_i2c_24c08_4mb,epo_efdx, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Dai Mono Tsurouze! Excite Fishing DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ぐるりんワールド CONS( 2005, epo_guru, 0, 0, xavix_guru, epo_guru, xavix_guru_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // ドラえもん こえでドカン!わくわくくうきほう!! -CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Wakuwaku Kuukihou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? +CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02_4mb, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Wakuwaku Kuukihou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? // コロッケ!いただ禁貨!バンカーバトル!! -CONS( 2003, epo_crok, 0, 0, xavix_i2c_24lc04, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Croket! Itada Kinka! Banker Battle!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_crok, 0, 0, xavix_i2c_24lc04_4mb, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Croket! Itada Kinka! Banker Battle!! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ミニモニ。ステージ!ダンスだぴょん! -CONS( 2002, epo_mms, 0, 0, xavix_i2c_24c02, epo_mms, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "mini-moni Stage! Dance Dapyon! (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2002, epo_mms, 0, 0, xavix_i2c_24c02_4mb, epo_mms, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "mini-moni Stage! Dance Dapyon! (Japan)", MACHINE_IMPERFECT_SOUND ) // ズバズバブレード -CONS( 2002, tak_zuba, 0, 0, xavix_i2c_24c02, xavix_i2c,xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Zuba Zuba Blade (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, tak_zuba, 0, 0, xavix_i2c_24c02_4mb, xavix_i2c,xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Zuba Zuba Blade (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ミニモニ。ステージ!ダンスだぴょん!ぷらすっ -CONS( 2003, epo_mmsp, 0, 0, xavix_i2c_24c02, epo_mms, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "mini-moni Stage! Dance Dapyon! Plus (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_mmsp, 0, 0, xavix_i2c_24c02_4mb, epo_mms, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "mini-moni Stage! Dance Dapyon! Plus (Japan)", MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイ ケロロ軍曹 ケロロ小隊大パニック!ドタバタ大決戦であります -CONS( 2006, ban_krrj, 0, 0, xavix, ban_krrj, xavix_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Keroro Shoutai Dai Panic! Dotabata Daikessen de Arimasu (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2006, ban_krrj, 0, 0, xavix_4mb, ban_krrj, xavix_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Keroro Shoutai Dai Panic! Dotabata Daikessen de Arimasu (Japan)", MACHINE_IMPERFECT_SOUND ) // オールスター感謝祭 超豪華!クイズ決定版~赤坂5丁目体感スタジオ~ -CONS( 2004, epo_quiz, 0, 0, xavix, epo_quiz, xavix_state, init_xavix, "Epoch / SSD Company LTD", "All-Star Kansha-sai Chou Gouka! Quiz Kettieban: Akasaka 5-choume Taikan Studio (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2004, epo_quiz, 0, 0, xavix_4mb, epo_quiz, xavix_state, init_xavix, "Epoch / SSD Company LTD", "All-Star Kansha-sai Chou Gouka! Quiz Kettieban: Akasaka 5-choume Taikan Studio (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2005, has_wamg, 0, 0, xavix, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, has_wamg, 0, 0, xavix_4mb, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // GEIGEKI ゴーゴーシューティング -CONS( 2002, tak_geig, 0, 0, xavix_nv, tak_geig, xavix_state, init_xavix, "Takara / SSD Company LTD", "Geigeki Go Go Shooting (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2002, tak_geig, 0, 0, xavix_4mb_nv, tak_geig, xavix_state, init_xavix, "Takara / SSD Company LTD", "Geigeki Go Go Shooting (Japan)", MACHINE_IMPERFECT_SOUND ) // TVホッケー -// playable but could do with better deadzome handling on the controls at least, and for some reason auto-center heads to the bottom left corner in breakout mode? +// playable but could do with better deadzome handling on the controls at least +// the trackball functionality works well in the menus, but not the games CONS( 2001, tom_tvho, 0, 0, xavix_tom_tvho, tom_tvho, xavix_tom_tvho_state, init_xavix, "Tomy / SSD Company LTD", "TV Hockey (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // コメットさん☆ラブリンバトン -CONS( 2001, tak_comt, 0, 0, xavix_nv, tak_comt, xavix_state, init_xavix, "Takara / SSD Company LTD", "Comet-san Lovelin Baton (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, tak_comt, 0, 0, xavix_2mb_nv, tak_comt, xavix_state, init_xavix, "Takara / SSD Company LTD", "Comet-san Lovelin Baton (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 爆進スノボ ギンギンボーダーズ -CONS( 2001, tak_gin, 0, 0, xavix, tak_gin, xavix_state, init_xavix, "Takara / SSD Company LTD", "Bakushin Sno-Bo - Gingin Boarders (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS ) +CONS( 2001, tak_gin, 0, 0, xavix_2mb, tak_gin, xavix_state, init_xavix, "Takara / SSD Company LTD", "Bakushin Sno-Bo - Gingin Boarders (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS ) // ぽこぽこハンマーズ -CONS( 2002, tak_hamr, 0, 0, xavix_i2c_24c02, tak_hamr, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Poko Poko Hammers (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2002, tak_hamr, 0, 0, xavix_i2c_24c02_4mb, tak_hamr, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Poko Poko Hammers (Japan)", MACHINE_IMPERFECT_SOUND ) //ベイブレード アルティメットシューター -CONS( 2002, tak_beyb, 0, 0, xavix, xavix, xavix_state, init_xavix, "Takara / SSD Company LTD", "Beyblade Ultimate Shooter (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, tak_beyb, 0, 0, xavix_2mb, xavix, xavix_state, init_xavix, "Takara / SSD Company LTD", "Beyblade Ultimate Shooter (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // was also distributed by Atlus as an arcade cabinet in 2005, ROM almost certainly different (this one will auto-power off after inactivity, an arcade wouldn't do that) // ジャラジャランド -CONS( 2003, jarajal, 0, 0, xavix_nv, jarajal, xavix_state, init_xavix, "Takara / SSD Company LTD", "Jyarajyaland (Japan, PlugIt! version)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, jarajal, 0, 0, xavix_2mb_nv, jarajal, xavix_state, init_xavix, "Takara / SSD Company LTD", "Jyarajyaland (Japan, PlugIt! version)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // 近代撃ちまくりバラエティ 射的王(シャテキング) -CONS( 2002, tomshoot, 0, 0, xavix_i2c_24c02, tomshoot,xavix_i2c_tomshoot_state, init_xavix, "Tomy / SSD Company LTD", "Kindai Uchimakuri Variety Shateking (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, tomshoot, 0, 0, xavix_i2c_24c02_2mb, tomshoot,xavix_i2c_tomshoot_state, init_xavix, "Tomy / SSD Company LTD", "Kindai Uchimakuri Variety Shateking (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // トミカ カーナビドライブ / トミー -CONS( 2003, tcarnavi, 0, 0, xavix_nv, tcarnavi, xavix_state, init_xavix, "Tomy / SSD Company LTD", "Tomica Carnavi Drive (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2003, tcarnavi, 0, 0, xavix_4mb_nv, tcarnavi, xavix_state, init_xavix, "Tomy / SSD Company LTD", "Tomica Carnavi Drive (Japan)", MACHINE_IMPERFECT_SOUND ) // ちゃんぴよんピンボール -CONS( 2003, tomcpin, 0, 0, xavix_i2c_24c08, tomcpin, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Champiyon Pinball (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, tomcpin, 0, 0, xavix_i2c_24c08_4mb, tomcpin, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Champiyon Pinball (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // 日本一周 僕はプラレール運転士 CONS( 2004, tomplc, 0, 0, xavix_i2c_24c02_43mhz,tomplc,xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Nihon Isshuu - Boku wa Plarail Untenshi (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) @@ -2733,13 +2903,13 @@ CONS( 2004, tomplc, 0, 0, xavix_i2c_24c02_43mhz,tomplc,xavix_i2c_st CONS( 2006, tomthr, 0, 0, xavix_43mhz, tomthr, xavix_state, init_xavix, "Takara Tomy / SSD Company LTD", "Asobitai Hyper Rescue - Boku wa Kyuujotai! (Japan)", MACHINE_IMPERFECT_SOUND ) // ガンガンアドベンチャー -CONS( 2001, gungunad, 0, 0, xavix_nv, xavix, xavix_state, init_xavix, "Takara / SSD Company LTD", "Gun Gun Adventure (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, gungunad, 0, 0, xavix_2mb_nv, xavix, xavix_state, init_xavix, "Takara / SSD Company LTD", "Gun Gun Adventure (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ガンガンレボリューション -CONS( 2004, gungunrv, 0, 0, xavix_i2c_24lc04, gungunrv, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Gun Gun Revolution (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, gungunrv, 0, 0, xavix_i2c_24lc04_4mb, gungunrv, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Gun Gun Revolution (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ビストロキッズ ぼくもわたしもコックさん! -CONS( 2001, bistro, 0, 0, xavix, xavix, xavix_state, init_xavix, "Sega Toys / SSD Company LTD", "Bistro Kids: Boku mo Watashi mo Kok-san! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2001, bistro, 0, 0, xavix_2mb, xavix, xavix_state, init_xavix, "Sega Toys / SSD Company LTD", "Bistro Kids: Boku mo Watashi mo Kok-san! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* Music titles: Emulation note: @@ -2791,17 +2961,17 @@ CONS( 2006, ltv_tam, 0, 0, xavix_i2c_24lc04_tam, ltv_tam,xavix_i2c_ CONS( 2008, hikara, 0, 0, xavix_cart_hikara, hikara, xavix_hikara_state, init_xavix, "Takara Tomy / SSD Company LTD", "Hi-kara (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // 東京フレンドパーク2 -CONS( 2003, epo_tfp2, 0, 0, xavix_i2c_24c08, epo_tfp2, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park 2 (Japan)", MACHINE_IMPERFECT_SOUND) // uses in24lc08b +CONS( 2003, epo_tfp2, 0, 0, xavix_i2c_24c08_4mb, epo_tfp2, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park II (Japan)", MACHINE_IMPERFECT_SOUND) // uses in24lc08b // 東京フレンドパーク2スペシャル -CONS( 2005, epo_tp2s, 0, 0, xavix, epo_tp2p, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park II Special! (Japan)", MACHINE_IMPERFECT_SOUND) +CONS( 2005, epo_tp2s, 0, 0, xavix_4mb, epo_tp2p, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park II Special! (Japan)", MACHINE_IMPERFECT_SOUND) // 東京フレンドパークⅡ パーフェクト!めざせ!グランドスラム‼︎ CONS( 2007, epo_tp2p, 0, 0, xavix, epo_tp2p, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Tokyo Friend Park II Perfect! Mezase! Grand Slam!! (Japan)", MACHINE_IMPERFECT_SOUND) // きかんしゃトーマス テレビパソコン -CONS( 2005, tvpc_tom, 0, 0, xavix_i2c_24c16, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Thomas & Friends (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) +CONS( 2005, tvpc_tom, 0, 0, xavix_i2c_24c16_4mb, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Thomas & Friends (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // ドラえもん テレビパソコン -CONS( 2003, tvpc_dor, 0, 0, xavix_i2c_24c16, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Doraemon (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) +CONS( 2003, tvpc_dor, 0, 0, xavix_i2c_24c16_4mb, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Doraemon (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) // とっとこハム太郎 テレビパソコン -CONS( 2003, tvpc_ham, 0, 0, xavix_i2c_24c16, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Tottoko Hamutaro (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) +CONS( 2003, tvpc_ham, 0, 0, xavix_i2c_24c16_4mb, tvpc_tom, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "TV-PC Tottoko Hamutaro (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND) diff --git a/src/mame/tvgames/xavix.h b/src/mame/tvgames/xavix.h index 7c79ccb826f..bb0a74bd402 100644 --- a/src/mame/tvgames/xavix.h +++ b/src/mame/tvgames/xavix.h @@ -93,14 +93,11 @@ public: m_sprite_xhigh_ignore_hack(true), m_mainram(*this, "mainram"), m_fragment_sprite(*this, "fragment_sprite"), - m_rom_dma_src(*this,"rom_dma_src"), - m_rom_dma_dst(*this,"rom_dma_dst"), - m_rom_dma_len(*this,"rom_dma_len"), + m_rom_dma_src(*this, "rom_dma_src"), + m_rom_dma_dst(*this, "rom_dma_dst"), + m_rom_dma_len(*this, "rom_dma_len"), m_palram_sh(*this, "palram_sh"), m_palram_l(*this, "palram_l"), - m_bmp_palram_sh(*this, "bmp_palram_sh"), - m_bmp_palram_l(*this, "bmp_palram_l"), - m_bmp_base(*this, "bmp_base"), m_colmix_sh(*this, "colmix_sh"), m_colmix_l(*this, "colmix_l"), m_colmix_ctrl(*this, "colmix_ctrl"), @@ -113,20 +110,31 @@ public: m_sound(*this, "xavix_sound"), m_adc(*this, "adc"), m_anport(*this, "anport"), - m_math(*this, "math"), - m_xavix2002io(*this, "xavix2002io") - { } + m_math(*this, "math") + { + m_video_hres_multiplier = 1; + } void xavix(machine_config &config); void xavix_nv(machine_config &config); + void xavix_1mb_nv(machine_config &config); + void xavix_2mb_nv(machine_config &config); + void xavix_4mb_nv(machine_config &config); + void xavix_4mb(machine_config &config); + void xavix_2mb(machine_config &config); + void xavix_1mb(machine_config &config); void xavixp(machine_config &config); void xavixp_nv(machine_config &config); + void xavixp_1mb_nv(machine_config &config); + void xavixp_4mb(machine_config &config); + void xavixp_2mb(machine_config &config); + void xavixp_1mb(machine_config &config); void xavix2000(machine_config &config); + void xavix2000_4mb(machine_config &config); void xavix2000_nv(machine_config &config); - - void xavix2002(machine_config &config); + void xavix2000_4mb_nv(machine_config &config); void xavix_43mhz(machine_config &config); @@ -216,16 +224,18 @@ protected: bool m_disable_timer_irq_hack = false; // hack for epo_mini which floods timer IRQs to the point it won't do anything else -private: + virtual void xavix_extbus_map(address_map &map) ATTR_COLD; + + void xavix_4mb_extbus_map(address_map &map) ATTR_COLD; + void xavix_2mb_extbus_map(address_map &map) ATTR_COLD; + void xavix_1mb_extbus_map(address_map &map) ATTR_COLD; // screen updates - uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void xavix_map(address_map &map) ATTR_COLD; void xavix_lowbus_map(address_map &map) ATTR_COLD; - void xavix_extbus_map(address_map &map) ATTR_COLD; - void superxavix_lowbus_map(address_map &map) ATTR_COLD; INTERRUPT_GEN_MEMBER(interrupt); TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb); @@ -242,7 +252,14 @@ private: { if (offset & 0x8000) { - return m_rgn[(offset) & (m_rgnlen - 1)]; + if (m_disable_memory_bypass) + { + return m_maincpu->space(6).read_byte(offset & 0x7fffff); + } + else + { + return m_rgn[(offset) & (m_rgnlen - 1)]; + } } else { @@ -252,17 +269,17 @@ private: virtual uint8_t opcodes_800000_r(offs_t offset) { - // rad_fb, rad_madf confirm that for >0x800000 the CPU only sees ROM when executing opcodes - return m_rgn[(offset) & (m_rgnlen - 1)]; - } - - virtual uint8_t extbus_r(offs_t offset) { return m_rgn[(offset) & (m_rgnlen - 1)]; } - virtual void extbus_w(offs_t offset, uint8_t data) - { - logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data); + if (m_disable_memory_bypass) + { + return m_maincpu->space(6).read_byte(offset & 0x7fffff); + } + else + { + // rad_fb, rad_madf confirm that for >0x800000 the CPU only sees ROM when executing opcodes + return m_rgn[(offset) & (m_rgnlen - 1)]; + } } - uint8_t sample_read(offs_t offset) { return read_full_data_sp_bypass(offset); @@ -413,9 +430,8 @@ private: void palram_l_w(offs_t offset, uint8_t data); void colmix_sh_w(offs_t offset, uint8_t data); void colmix_l_w(offs_t offset, uint8_t data); - void bmp_palram_sh_w(offs_t offset, uint8_t data); - void bmp_palram_l_w(offs_t offset, uint8_t data); void spriteram_w(offs_t offset, uint8_t data); + void mainram_w(offs_t offset, uint8_t data); bool m_sprite_xhigh_ignore_hack; void tmap1_regs_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); @@ -425,29 +441,6 @@ private: void spriteregs_w(uint8_t data); - void superxavix_bitmap_pal_index_w(uint8_t data); - uint8_t superxavix_bitmap_pal_index_r(); - void superxavix_chr_pal_index_w(uint8_t data); - uint8_t superxavix_chr_pal_index_r(); - uint8_t superxavix_bitmap_pal_hue_r(); - uint8_t superxavix_bitmap_pal_saturation_r(); - uint8_t superxavix_bitmap_pal_lightness_r(); - uint8_t superxavix_chr_pal_hue_r(); - uint8_t superxavix_chr_pal_saturation_r(); - uint8_t superxavix_chr_pal_lightness_r(); - uint8_t superxavix_pal_hue_r(bool bitmap); - uint8_t superxavix_pal_saturation_r(bool bitmap); - uint8_t superxavix_pal_lightness_r(bool bitmap); - void superxavix_bitmap_pal_hue_w(uint8_t data); - void superxavix_bitmap_pal_saturation_w(uint8_t data); - void superxavix_bitmap_pal_lightness_w(uint8_t data); - void superxavix_chr_pal_hue_w(uint8_t data); - void superxavix_chr_pal_saturation_w(uint8_t data); - void superxavix_chr_pal_lightness_w(uint8_t data); - void superxavix_pal_hue_w(uint8_t data, bool bitmap); - void superxavix_pal_saturation_w(uint8_t data, bool bitmap); - void superxavix_pal_lightness_w(uint8_t data, bool bitmap); - uint8_t pal_ntsc_r(); virtual uint8_t lightgun_r(offs_t offset) { logerror("%s: unhandled lightgun_r %d\n", machine().describe_context(), offset); return 0xff; } @@ -539,9 +532,6 @@ private: uint8_t m_timer_baseval = 0; - uint8_t m_superxavix_pal_index = 0; - uint8_t m_superxavix_bitmap_pal_index = 0; - int16_t get_vectors(int which, int half); // raster IRQ @@ -559,10 +549,6 @@ private: required_shared_ptr<uint8_t> m_palram_sh; required_shared_ptr<uint8_t> m_palram_l; - optional_shared_ptr<uint8_t> m_bmp_palram_sh; - optional_shared_ptr<uint8_t> m_bmp_palram_l; - optional_shared_ptr<uint8_t> m_bmp_base; - required_shared_ptr<uint8_t> m_colmix_sh; required_shared_ptr<uint8_t> m_colmix_l; required_shared_ptr<uint8_t> m_colmix_ctrl; @@ -577,6 +563,10 @@ private: required_ioport m_region; required_device<gfxdecode_device> m_gfxdecode; + required_device<xavix_sound_device> m_sound; + required_device<xavix_adc_device> m_adc; + required_device<xavix_anport_device> m_anport; + required_device<xavix_math_device> m_math; uint8_t get_pen_lightness_from_dat(uint16_t dat); uint8_t get_pen_saturation_from_dat(uint16_t dat); @@ -585,11 +575,15 @@ private: uint16_t apply_pen_saturation_to_dat(uint16_t dat, uint16_t saturation); uint16_t apply_pen_hue_to_dat(uint16_t dat, uint16_t hue); + virtual void get_tile_pixel_dat(uint8_t& dat, int bpp); + + rectangle do_arena(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void update_pen(int pen, uint8_t shval, uint8_t lval); - void draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tile, int bpp, int xpos, int ypos, int drawheight, int drawwidth, int flipx, int flipy, int pal, int zval, int line); - void draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which); + void draw_regular_layers(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &clip); + virtual void draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tile, int bpp, int xpos, int ypos, int drawheight, int drawwidth, int flipx, int flipy, int pal, int zval, int line); + virtual void draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which); void draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which, int line); - void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + virtual void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int line); void decode_inline_header(int &flipx, int &flipy, int &test, int& pal, int debug_packets); @@ -608,28 +602,16 @@ private: int get_current_address_byte(); - required_device<xavix_sound_device> m_sound; - - uint8_t sound_regram_read_cb(offs_t offset); -protected: - required_device<xavix_adc_device> m_adc; - required_device<xavix_anport_device> m_anport; - required_device<xavix_math_device> m_math; - optional_device<xavix2002_io_device> m_xavix2002io; - uint8_t m_extbusctrl[3]{}; virtual uint8_t extintrf_790x_r(offs_t offset); virtual void extintrf_790x_w(offs_t offset, uint8_t data); - // additional SuperXaviX / XaviX2002 stuff - uint8_t m_sx_extended_extbus[3]{}; - - void extended_extbus_reg0_w(uint8_t data); - void extended_extbus_reg1_w(uint8_t data); - void extended_extbus_reg2_w(uint8_t data); + bool m_disable_memory_bypass = false; + bool m_disable_sprite_yflip = false; + int m_video_hres_multiplier; }; class xavix_guru_state : public xavix_state @@ -647,6 +629,135 @@ private: uint8_t guru_anport2_r() { uint8_t ret = m_mouse1x->read()-0x10; return ret; } }; +class superxavix_state : public xavix_state +{ +public: + superxavix_state(const machine_config &mconfig, device_type type, const char *tag) + : xavix_state(mconfig, type, tag) + , m_xavix2002io(*this, "xavix2002io") + , m_sx_crtc_1(*this, "sx_crtc_1") + , m_sx_crtc_2(*this, "sx_crtc_2") + , m_sx_plt_loc(*this, "sx_plt_loc") + , m_bmp_palram_sh(*this, "bmp_palram_sh") + , m_bmp_palram_l(*this, "bmp_palram_l") + , m_bmp_base(*this, "bmp_base") + , m_extra(*this, "extra") + { + m_video_hres_multiplier = 2; + } + + void xavix2002(machine_config &config); + void xavix2002_4mb(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + + virtual uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; + + void superxavix_lowbus_map(address_map &map) ATTR_COLD; + + required_device<xavix2002_io_device> m_xavix2002io; + + virtual void get_tile_pixel_dat(uint8_t &dat, int bpp) override; + +private: + void superxavix_plt_flush_w(uint8_t data); + uint8_t superxavix_plt_dat_r(); + void superxavix_plt_dat_w(uint8_t data); + void superxavix_plt_loc_w(offs_t offset, uint8_t data); + uint8_t superxavix_plt_loc_r(offs_t offset); + + void superxavix_bitmap_pal_index_w(uint8_t data); + uint8_t superxavix_bitmap_pal_index_r(); + void superxavix_chr_pal_index_w(uint8_t data); + uint8_t superxavix_chr_pal_index_r(); + uint8_t superxavix_bitmap_pal_hue_r(); + uint8_t superxavix_bitmap_pal_saturation_r(); + uint8_t superxavix_bitmap_pal_lightness_r(); + uint8_t superxavix_chr_pal_hue_r(); + uint8_t superxavix_chr_pal_saturation_r(); + uint8_t superxavix_chr_pal_lightness_r(); + uint8_t superxavix_pal_hue_r(bool bitmap); + uint8_t superxavix_pal_saturation_r(bool bitmap); + uint8_t superxavix_pal_lightness_r(bool bitmap); + void superxavix_bitmap_pal_hue_w(uint8_t data); + void superxavix_bitmap_pal_saturation_w(uint8_t data); + void superxavix_bitmap_pal_lightness_w(uint8_t data); + void superxavix_chr_pal_hue_w(uint8_t data); + void superxavix_chr_pal_saturation_w(uint8_t data); + void superxavix_chr_pal_lightness_w(uint8_t data); + void superxavix_pal_hue_w(uint8_t data, bool bitmap); + void superxavix_pal_saturation_w(uint8_t data, bool bitmap); + void superxavix_pal_lightness_w(uint8_t data, bool bitmap); + + uint8_t bitmap_params_r(offs_t offset); + void bitmap_params_w(offs_t offset, uint8_t data); + + void superxavix_crtc_1_w(offs_t offset, uint8_t data); + uint8_t superxavix_crtc_1_r(offs_t offset); + void superxavix_crtc_2_w(offs_t offset, uint8_t data); + uint8_t superxavix_crtc_2_r(offs_t offset); + + void bmp_palram_sh_w(offs_t offset, uint8_t data); + void bmp_palram_l_w(offs_t offset, uint8_t data); + + void extended_extbus_reg0_w(uint8_t data); + void extended_extbus_reg1_w(uint8_t data); + void extended_extbus_reg2_w(uint8_t data); + + void draw_bitmap_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + + uint8_t get_next_bit_sx(); + virtual void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override; + virtual void draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which) override; + + uint8_t m_superxavix_pal_index = 0; + uint8_t m_superxavix_bitmap_pal_index = 0; + uint32_t m_sx_plt_address = 0; + uint8_t m_sx_plt_mode = 0; + uint8_t m_plotter_has_byte = 0; + uint8_t m_plotter_current_byte = 0x00; + + uint8_t m_sx_extended_extbus[3]{}; + + required_shared_ptr<uint8_t> m_sx_crtc_1; + required_shared_ptr<uint8_t> m_sx_crtc_2; + required_shared_ptr<uint8_t> m_sx_plt_loc; + + required_shared_ptr<uint8_t> m_bmp_palram_sh; + required_shared_ptr<uint8_t> m_bmp_palram_l; + required_shared_ptr<uint8_t> m_bmp_base; + + optional_region_ptr<uint8_t> m_extra; + + bool m_use_superxavix_extra; // does not need saving +}; + + +class superxavix_i2c_state : public superxavix_state +{ +public: + superxavix_i2c_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_state(mconfig, type, tag), + m_i2cmem(*this, "i2cmem") + { } + + void superxavix_i2c_24c16(machine_config &config); + void superxavix_i2c_24c08(machine_config &config); + void superxavix_i2c_24c04(machine_config &config); + void superxavix_i2c_24c04_4mb(machine_config &config); + void superxavix_i2c_24c02(machine_config &config); + void superxavix_i2c_mrangbat(machine_config& config); + +protected: + virtual void write_io1(uint8_t data, uint8_t direction) override; + + required_device<i2cmem_device> m_i2cmem; +}; + + + class xavix_i2c_state : public xavix_state { public: @@ -656,20 +767,25 @@ public: { } void xavix_i2c_24lc04(machine_config &config); + void xavix_i2c_24lc04_4mb(machine_config &config); + void xavix_i2c_24lc04_2mb(machine_config &config); + void xavix_i2c_24lc04_1mb(machine_config &config); void xavix_i2c_24c02(machine_config &config); + void xavix_i2c_24c02_4mb(machine_config &config); + void xavix_i2c_24c02_2mb(machine_config &config); void xavix_i2c_24c02_43mhz(machine_config &config); void xavix_i2c_24c08(machine_config &config); + void xavix_i2c_24c08_4mb(machine_config &config); void xavix_i2c_24c16(machine_config &config); + void xavix_i2c_24c16_4mb(machine_config &config); void xavix2000_i2c_24c08(machine_config &config); + void xavix2000_i2c_24c08_4mb(machine_config &config); void xavix2000_i2c_24c04(machine_config &config); + void xavix2000_i2c_24c04_2mb(machine_config &config); + void xavix2000_i2c_24c04_4mb(machine_config &config); void xavix2000_i2c_24c02(machine_config &config); - void xavix2002_i2c_24c08(machine_config &config); - void xavix2002_i2c_24c04(machine_config &config); - void xavix2002_i2c_24c02(machine_config &config); - void xavix2002_i2c_mrangbat(machine_config& config); - protected: virtual void write_io1(uint8_t data, uint8_t direction) override; @@ -796,10 +912,10 @@ public: private: private: - uint8_t tvho_anport0_r() { return m_mouse0x->read()^0x7f; } - uint8_t tvho_anport1_r() { return m_mouse0y->read()^0x7f; } - uint8_t tvho_anport2_r() { return m_mouse1x->read()^0x7f; } - uint8_t tvho_anport3_r() { return m_mouse1y->read()^0x7f; } + uint8_t tvho_anport0_r() { return (m_mouse0x->read()^0x7f)+1; } + uint8_t tvho_anport1_r() { return (m_mouse0y->read()^0x7f)+1; } + uint8_t tvho_anport2_r() { return (m_mouse1x->read()^0x7f)+1; } + uint8_t tvho_anport3_r() { return (m_mouse1y->read()^0x7f)+1; } }; @@ -842,7 +958,9 @@ public: xavix_state(mconfig, type, tag), m_cartslot(*this, "cartslot") { - m_cartlimit = 0x400000; + // all signals 0x000000 - 0x5fffff go to the cart + // even if the largest cart is 0x400000 in size + m_cartlimit = 0x600000; } void xavix_cart(machine_config &config); @@ -854,25 +972,51 @@ public: protected: + virtual void xavix_extbus_map(address_map &map) override ATTR_COLD; + + u8 cart_r(offs_t offset) + { + if (m_cartslot->has_cart()) + { + return m_cartslot->read_cart(offset); + } + else + { + return m_rgn[(offset) & (m_rgnlen - 1)]; + } + } + + void cart_w(offs_t offset, uint8_t data) + { + if (m_cartslot->has_cart()) + { + m_cartslot->write_cart(offset, data); + } + else + { + logerror("%s: unhandled write access to cart area with no cart installed %08x %02x\n", machine().describe_context(), offset, data); + } + } + // for Cart cases this memory bypass becomes more complex virtual uint8_t opcodes_000000_r(offs_t offset) override { if (offset & 0x8000) { - if ((offset & 0x7fffff) >= m_cartlimit) + if (m_disable_memory_bypass) { - return m_rgn[(offset) & (m_rgnlen - 1)]; + return m_maincpu->space(6).read_byte(offset & 0x7fffff); } else { - if (m_cartslot->has_cart()) + if ((offset & 0x7fffff) >= m_cartlimit) { - return m_cartslot->read_cart(offset); + return m_rgn[(offset) & (m_rgnlen - 1)]; } else { - return m_rgn[(offset) & (m_rgnlen - 1)]; + return cart_r(offset); } } } @@ -884,19 +1028,19 @@ protected: virtual uint8_t opcodes_800000_r(offs_t offset) override { - if ((offset & 0x7fffff) >= m_cartlimit) + if (m_disable_memory_bypass) { - return m_rgn[(offset) & (m_rgnlen - 1)]; + return m_maincpu->space(6).read_byte(offset & 0x7fffff); } else { - if (m_cartslot->has_cart()) + if ((offset & 0x7fffff) >= m_cartlimit) { - return m_cartslot->read_cart(offset); + return m_rgn[(offset) & (m_rgnlen - 1)]; } else { - return m_rgn[(offset) & (m_rgnlen - 1)]; + return cart_r(offset); } } } @@ -918,51 +1062,6 @@ protected: } }; - virtual uint8_t extbus_r(offs_t offset) override - { - if (m_cartslot->has_cart() && m_cartslot->is_read_access_not_rom()) - { - logerror("%s: read from external bus %06x (SEEPROM READ?)\n", machine().describe_context(), offset); - return m_cartslot->read_extra(offset); - } - else - { - if ((offset & 0x7fffff) >= m_cartlimit) - { - return m_rgn[(offset) & (m_rgnlen - 1)]; - } - else - { - if (m_cartslot->has_cart()) - { - return m_cartslot->read_cart(offset); - } - else - { - return m_rgn[(offset) & (m_rgnlen - 1)]; - } - } - } - } - virtual void extbus_w(offs_t offset, uint8_t data) override - { - if (m_cartslot->has_cart() && m_cartslot->is_write_access_not_rom()) - { - logerror("%s: write to external bus %06x %02x (SEEPROM WRITE?)\n", machine().describe_context(), offset, data); - return m_cartslot->write_extra(offset, data); - } - else - { - if (m_cartslot->has_cart()) - { - return m_cartslot->write_cart(offset, data); - } - else - { - logerror("%s: write to external bus %06x %02x\n", machine().describe_context(), offset, data); - } - } - } virtual inline uint8_t read_full_data_sp_bypass(uint32_t offset) override { @@ -976,14 +1075,7 @@ protected: } else { - if (m_cartslot->has_cart()) - { - return m_cartslot->read_cart(offset); - } - else - { - return m_rgn[(offset) & (m_rgnlen - 1)]; - } + return cart_r(offset); } } else @@ -996,14 +1088,7 @@ protected: } else { - if (m_cartslot->has_cart()) - { - return m_cartslot->read_cart(offset); - } - else - { - return m_rgn[(offset) & (m_rgnlen - 1)]; - } + return cart_r(offset); } } else @@ -1030,6 +1115,7 @@ public: void xavix_cart_gcslottv(machine_config &config); protected: + virtual void xavix_extbus_map(address_map &map) override ATTR_COLD; }; class xavix_i2c_cart_state : public xavix_cart_state diff --git a/src/mame/tvgames/xavix2.cpp b/src/mame/tvgames/xavix2.cpp index d27134397a1..bf43fe20f52 100644 --- a/src/mame/tvgames/xavix2.cpp +++ b/src/mame/tvgames/xavix2.cpp @@ -755,6 +755,13 @@ ROM_START( ltv_naru ) ROM_LOAD( "naruto.bin", 0x000000, 0x800000, CRC(e3465ad2) SHA1(13e3d2de5d5a084635cab158f3639a1ea73265dc) ) ROM_END +ROM_START( ban_db2j ) + ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "db2j.u3", 0x000000, 0x800000, CRC(7362ac0d) SHA1(f1880470f0db56135d9bc88d7193d037ac49b996) ) + + // also has a AT24C08 +ROM_END + ROM_START( epo_dabj ) ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "dabj.u3", 0x000000, 0x800000, CRC(9ebc1384) SHA1(38abaebd05bc9ab300ee5fbf37bd88ce9cbd20e1) ) @@ -775,6 +782,9 @@ ROM_END // Let's!TVプレイ NARUTO-ナルト- 忍者体感~だってばよ~ / バンダイ / 日本 CONS( 2006, ltv_naru, 0, 0, config, naruto, naruto_state, empty_init, "Bandai / SSD Company LTD", "Let's TV Play Naruto (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// Let's!TVプレイ ドラゴンボールZ バトル体感かめはめ波2~オッスおめぇ悟空 天下一武道会~ +CONS( 2006, ban_db2j, 0, 0, config, naruto, naruto_state, empty_init, "Bandai / SSD Company LTD", "Let's TV Play Dragon Ball Z Battle Experience Kamehameha 2 ~Ossu Ome Goku Tenkaichi Budokai~ (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + // テレビであそぼう!まなぼう! 超脳力あいうえお図鑑 CONS( 2006, epo_dabj, 0, 0, config, dabj, xavix2_state, empty_init, "Epoch / SSD Company LTD", "TV de Asobou! Manabou! Chou Nouryoku AIUEO Zukan (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix2002_io.cpp b/src/mame/tvgames/xavix2002_io.cpp index c3dd0f5b038..fc93eba2854 100644 --- a/src/mame/tvgames/xavix2002_io.cpp +++ b/src/mame/tvgames/xavix2002_io.cpp @@ -44,8 +44,8 @@ void xavix2002_io_device::pio_dir_w(offs_t offset, uint8_t data) if (offset < 3) { m_sx_pio_dir[offset] = data; + // update output port after direction change? pio_out_w(offset, m_sx_pio_out[offset]); - // update port? } } @@ -70,15 +70,11 @@ void xavix2002_io_device::pio_out_w(offs_t offset, uint8_t data) { m_sx_pio_out[offset] = data; - // TODO: look at direction register - - uint8_t outdata = m_sx_pio_out[offset] & m_sx_pio_dir[offset]; - switch (offset) { - case 0: m_out0_cb(outdata); break; - case 1: m_out1_cb(outdata); break; - case 2: m_out2_cb(outdata); break; + case 0: m_out0_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break; + case 1: m_out1_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break; + case 2: m_out2_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break; default: break; } } @@ -107,13 +103,14 @@ uint8_t xavix2002_io_device::pio_in_r(offs_t offset) switch (offset) { - case 0: ret = m_in0_cb(); break; - case 1: ret = m_in1_cb(); break; - case 2: ret = m_in2_cb(); break; + case 0: ret = m_in0_cb(0, m_sx_pio_dir[offset]); break; + case 1: ret = m_in1_cb(0, m_sx_pio_dir[offset]); break; + case 2: ret = m_in2_cb(0, m_sx_pio_dir[offset]); break; default: ret = 0x00; break; } - // mask with direction register before returning + ret &= ~m_sx_pio_dir[offset]; + ret |= m_sx_pio_out[offset] & m_sx_pio_dir[offset]; return ret; } diff --git a/src/mame/tvgames/xavix_2000.cpp b/src/mame/tvgames/xavix_2000.cpp index 8ba06048f19..40fc13506bf 100644 --- a/src/mame/tvgames/xavix_2000.cpp +++ b/src/mame/tvgames/xavix_2000.cpp @@ -162,13 +162,13 @@ static INPUT_PORTS_START( epo_sdb ) PORT_INCLUDE(xavix) PORT_MODIFY("MOUSE0X") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_X ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1) PORT_MODIFY("MOUSE0Y") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_Y ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1) PORT_MODIFY("MOUSE1X") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_X ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(2) PORT_MODIFY("MOUSE1Y") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2) + PORT_BIT( 0xff, 0x01, IPT_AD_STICK_Y ) PORT_MINMAX(0x01, 0xfe) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(2) PORT_MODIFY("IN0") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) @@ -220,16 +220,28 @@ void xavix_state::xavix2000(machine_config &config) m_palette->set_entries(512); } -void xavix_state::xavix2000_nv(machine_config &config) +void xavix_state::xavix2000_4mb(machine_config &config) { xavix2000(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_4mb_extbus_map); +} +void xavix_state::xavix2000_nv(machine_config &config) +{ + xavix2000(config); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); } -void xavix_2000_nv_sdb_state::xavix2000_nv_sdb(machine_config &config) +void xavix_state::xavix2000_4mb_nv(machine_config &config) { xavix2000_nv(config); + m_maincpu->set_addrmap(6, &xavix_state::xavix_4mb_extbus_map); +} + + +void xavix_2000_nv_sdb_state::xavix2000_nv_sdb(machine_config &config) +{ + xavix2000_4mb_nv(config); m_anport->read_0_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport0_r)); m_anport->read_1_callback().set(FUNC(xavix_2000_nv_sdb_state::sdb_anport1_r)); @@ -240,10 +252,16 @@ void xavix_2000_nv_sdb_state::xavix2000_nv_sdb(machine_config &config) void xavix_i2c_state::xavix2000_i2c_24c08(machine_config &config) { xavix2000(config); - I2C_24C08(config, "i2cmem", 0); } +void xavix_i2c_state::xavix2000_i2c_24c08_4mb(machine_config &config) +{ + xavix2000_i2c_24c08(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + + void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config) { xavix2000(config); @@ -251,6 +269,19 @@ void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config) I2C_24C04(config, "i2cmem", 0); } +void xavix_i2c_state::xavix2000_i2c_24c04_2mb(machine_config &config) +{ + xavix2000_i2c_24c04(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_2mb_extbus_map); +} + +void xavix_i2c_state::xavix2000_i2c_24c04_4mb(machine_config &config) +{ + xavix2000_i2c_24c04(config); + m_maincpu->set_addrmap(6, &xavix_i2c_state::xavix_4mb_extbus_map); +} + + void xavix_i2c_state::xavix2000_i2c_24c02(machine_config &config) { xavix2000(config); @@ -287,7 +318,7 @@ ROM_START( epo_hamc ) // ET158 MB REV.0 ROM_END ROM_START( ban_omt ) // OMTJ MAIN-07 - ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) + ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("otmj.bin", 0x000000, 0x400000, CRC(1c1dc6fb) SHA1(d0cf1345b765d66ca9a0870ee6d0e3ccd84a8c0b) ) ROM_END @@ -362,32 +393,32 @@ void xavix_i2c_lotr_state::init_epo_mini() // doesn't use extra opcodes? // K.O.しようぜ!エキサイトボクシング -CONS( 2002, epo_ebox, 0, 0, xavix2000_nv, epo_ebox, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Boxing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // doesn't use XaviX2000 extra opcodes, but had that type of CPU +CONS( 2002, epo_ebox, 0, 0, xavix2000_4mb_nv, epo_ebox, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Boxing (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // doesn't use XaviX2000 extra opcodes, but had that type of CPU // die not confirmed, but uses extra opcodes. (hangs on title screen due to combination of freq_timer_done nested interrupts tripping, and waiting on bits in input ports to change // ストライクきめるぜ! エキサイトボウリング -CONS( 2002, epo_bowl, 0, 0, xavix2000_i2c_24c04, epo_bowl, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Bowling (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, epo_bowl, 0, 0, xavix2000_i2c_24c04_2mb, epo_bowl, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Bowling (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // スーパーショット! エキサイトゴルフ // needs timer irq hack to boot, fails to draw main menu properly (buggy xavix2000 opcodes?) (2002 date on PCB, 2003 ingame) -CONS( 2003, epo_golf, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Epoch / SSD Company LTD", "Super Shot! Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_golf, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Epoch / SSD Company LTD", "Super Shot! Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // とっとこハム太郎 ハムハム大サーカス! -CONS( 2002, epo_hamc, 0, 0, xavix2000, epo_hamc, xavix_epo_hamc_state, init_xavix, "Epoch / SSD Company LTD", "Tottoko Hamtaro - Ham Ham Dai Circus! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, epo_hamc, 0, 0, xavix2000_4mb, epo_hamc, xavix_epo_hamc_state, init_xavix, "Epoch / SSD Company LTD", "Tottoko Hamtaro - Ham Ham Dai Circus! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ミニモニ。パーティ!リズムでぴょん! // needs timer irq hack to boot -CONS( 2003, epo_mini, 0, 0, xavix2000_i2c_24c08, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Epoch / SSD Company LTD", "mini-moni Party! Rhythm de Pyon! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, epo_mini, 0, 0, xavix2000_i2c_24c08_4mb, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Epoch / SSD Company LTD", "mini-moni Party! Rhythm de Pyon! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // カードスキャン! エキサイトステージ サッカー日本代表チーム -CONS( 2006, epo_es2j, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Card Scan! Excite Stage Soccer Nippon Daihyou Team (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2006, epo_es2j, 0, 0, xavix2000_4mb, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Card Scan! Excite Stage Soccer Nippon Daihyou Team (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // takes a long time to boot to a card scanner error // This is a product in the Duel Masters line called Duel Station; the boot up screen calls it Duel Station, title logo is Duel Masters // It also has a cartridge slot in addition to the card scanner and at least 1 ROM cartridge was produced "デュエルマスターズ デュエルステーション専用カートリッジ Ver.1" // デュエルステーション -CONS( 2003, duelmast, 0, 0, xavix2000_i2c_24c04, duelmast, xavix_duelmast_state, init_xavix, "Takara / SSD Company LTD", "Duel Masters: Duel Station (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, duelmast, 0, 0, xavix2000_i2c_24c04_2mb, duelmast, xavix_duelmast_state, init_xavix, "Takara / SSD Company LTD", "Duel Masters: Duel Station (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // スーパーダッシュボール CONS( 2004, epo_sdb, 0, 0, xavix2000_nv_sdb, epo_sdb, xavix_2000_nv_sdb_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) @@ -404,8 +435,8 @@ CONS( 2005, tom_jump, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_sta CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c08, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // チョロQビュンビュンレーサー -// lots broken, including attempting bad sprite DMAs, probably buggy xavix2000 opcodes -CONS( 2003, tak_chq, 0, 0, xavix2000_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Choro-Q Byun Byun Racer (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +// crashes whenever a CPU car reaches a corner - see map +CONS( 2003, tak_chq, 0, 0, xavix2000_i2c_24c04_4mb, xavix_i2c, xavix_i2c_state, init_xavix, "Takara / SSD Company LTD", "Choro-Q Byun Byun Racer (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // hangs after starting a game, check why // Let’s!TV プレイ 体感格闘ワンピースパンチバトル ~海賊王にキミがなる!~ @@ -413,7 +444,7 @@ CONS( 2004, ban_onep, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_sta // Let’s!TV プレイ 闘印奥義 陰陽大戦記~目指せ最強闘神士~ // stalls unless timers are disabled like epo_mini / epo_golf, 2004 date on PCB, 2005 ingame -CONS( 2005, ban_omt, 0, 0, xavix2000_i2c_24c04, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Bandai / SSD Company LTD", "Let's! TV Play Touin Ougi Onmyou Taisenki: Mezase Saikyou Toushinshi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ban_omt, 0, 0, xavix2000_i2c_24c04_4mb, ttv_lotr, xavix_i2c_lotr_state, init_epo_mini, "Bandai / SSD Company LTD", "Let's! TV Play Touin Ougi Onmyou Taisenki: Mezase Saikyou Toushinshi (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // ディズニープリンセス キラキラ魔法のレッスン -CONS( 2004, tom_dpgm, 0, 0, xavix2000_i2c_24c08, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tomy / SSD Company LTD", "Disney Princess Kirakira Mahou no Lesson (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, tom_dpgm, 0, 0, xavix2000_i2c_24c08_4mb, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tomy / SSD Company LTD", "Disney Princess Kirakira Mahou no Lesson (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix_2000.h b/src/mame/tvgames/xavix_2000.h index 27492005a58..dbbda1803e2 100644 --- a/src/mame/tvgames/xavix_2000.h +++ b/src/mame/tvgames/xavix_2000.h @@ -18,10 +18,10 @@ public: protected: private: - uint8_t sdb_anport0_r() { return m_mouse0x->read()^0x7f; } - uint8_t sdb_anport1_r() { return m_mouse0y->read()^0x7f; } - uint8_t sdb_anport2_r() { return m_mouse1x->read()^0x7f; } - uint8_t sdb_anport3_r() { return m_mouse1y->read()^0x7f; } + uint8_t sdb_anport0_r() { return (m_mouse0x->read()^0x7f)+1; } + uint8_t sdb_anport1_r() { return (m_mouse0y->read()^0x7f)+1; } + uint8_t sdb_anport2_r() { return (m_mouse1x->read()^0x7f)+1; } + uint8_t sdb_anport3_r() { return (m_mouse1y->read()^0x7f)+1; } }; #endif // MAME_TVGAMES_XAVIX_2000_H diff --git a/src/mame/tvgames/xavix_2002.cpp b/src/mame/tvgames/xavix_2002.cpp index 42e292ea437..3fb8642373d 100644 --- a/src/mame/tvgames/xavix_2002.cpp +++ b/src/mame/tvgames/xavix_2002.cpp @@ -254,8 +254,8 @@ static INPUT_PORTS_START( xavix_bowl ) PORT_INCLUDE(xavix) PORT_MODIFY("IN1") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(xavix_i2c_bowl_state::camera_r)) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(xavix_i2c_bowl_state::camera_r)) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(superxavix_i2c_bowl_state::camera_r)) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(superxavix_i2c_bowl_state::camera_r)) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", FUNC(i2cmem_device::read_sda)) INPUT_PORTS_END @@ -275,44 +275,72 @@ static INPUT_PORTS_START( ban_ordj ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( anpanmdx ) + PORT_INCLUDE(xavix_i2c) + + PORT_MODIFY("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // Back + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) // Start ('Paper') + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) // Left in Menu ('Red Star') + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) // Right in Menu ('Blue Star') + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) +INPUT_PORTS_END + +static INPUT_PORTS_START( suprtvpc ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("MOUSE0X") + PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_REVERSE PORT_PLAYER(1) + PORT_MODIFY("MOUSE0Y") + PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(32) PORT_PLAYER(1) +INPUT_PORTS_END + /* SuperXavix IO port handliner (per game) */ -uint8_t xavix_i2c_jmat_state::read_extended_io0() +uint8_t superxavix_i2c_jmat_state::read_extended_io0(offs_t offset, uint8_t mem_mask) { LOG("%s: read_extended_io0\n", machine().describe_context()); return 0x00; } -uint8_t xavix_i2c_jmat_state::read_extended_io1() +uint8_t superxavix_i2c_jmat_state::read_extended_io1(offs_t offset, uint8_t mem_mask) { LOG("%s: read_extended_io1\n", machine().describe_context()); + uint8_t ret = 0x00; + // reads this by reading the byte, then shifting right 4 times to place value into carry flag - return m_i2cmem->read_sda() << 3; - //return 0x00; + if (!(mem_mask & 0x08)) + ret |= m_i2cmem->read_sda() << 3; + + return ret; } -uint8_t xavix_i2c_jmat_state::read_extended_io2() +uint8_t superxavix_i2c_jmat_state::read_extended_io2(offs_t offset, uint8_t mem_mask) { LOG("%s: read_extended_io2\n", machine().describe_context()); return 0x00; } -void xavix_i2c_jmat_state::write_extended_io0(uint8_t data) +void superxavix_i2c_jmat_state::write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask) { LOG("%s: io0_data_w %02x\n", machine().describe_context(), data); } -void xavix_i2c_jmat_state::write_extended_io1(uint8_t data) +void superxavix_i2c_jmat_state::write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask) { LOG("%s: io1_data_w %02x\n", machine().describe_context(), data); - m_i2cmem->write_sda((data & 0x08) >> 3); - m_i2cmem->write_scl((data & 0x10) >> 4); + if (mem_mask & 0x08) + m_i2cmem->write_sda((data & 0x08) >> 3); + + if (mem_mask & 0x10) + m_i2cmem->write_scl((data & 0x10) >> 4); } -void xavix_i2c_jmat_state::write_extended_io2(uint8_t data) +void superxavix_i2c_jmat_state::write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask) { LOG("%s: io2_data_w %02x\n", machine().describe_context(), data); } @@ -322,39 +350,52 @@ int xavix_i2c_lotr_state::camera_r() // seems to be some kind of camera status b return machine().rand(); } -int xavix_i2c_bowl_state::camera_r() // seems to be some kind of camera status bits +int superxavix_i2c_bowl_state::camera_r() // seems to be some kind of camera status bits { return machine().rand(); } -void xavix_state::xavix2002(machine_config &config) +void superxavix_i2c_state::write_io1(uint8_t data, uint8_t direction) +{ + m_i2cmem->write_sda(BIT(data | ~direction, 3)); + m_i2cmem->write_scl(BIT(data | ~direction, 4)); +} + +void superxavix_state::xavix2002(machine_config &config) { xavix(config); - XAVIX2002(config.replace(), m_maincpu, MAIN_CLOCK); + XAVIX2002(config.replace(), m_maincpu, MAIN_CLOCK * 2); set_xavix_cpumaps(config); - m_maincpu->set_addrmap(5, &xavix_state::superxavix_lowbus_map); // has extra video, io etc. + m_maincpu->set_addrmap(5, &superxavix_state::superxavix_lowbus_map); // has extra video, io etc. m_palette->set_entries(512); + m_screen->set_size(64*8, 32*8); + m_screen->set_visarea(0*8, 64*8-1, 2*8, 30*8-1); + XAVIX2002IO(config, m_xavix2002io, 0); } +void superxavix_state::xavix2002_4mb(machine_config &config) +{ + xavix2002(config); + m_maincpu->set_addrmap(6, &superxavix_state::xavix_4mb_extbus_map); +} - -void xavix_i2c_jmat_state::xavix2002_i2c_jmat(machine_config &config) +void superxavix_i2c_jmat_state::superxavix_i2c_jmat(machine_config &config) { - xavix2002_i2c_24c08(config); - - m_xavix2002io->read_0_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io0)); - m_xavix2002io->write_0_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io0)); - m_xavix2002io->read_1_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io1)); - m_xavix2002io->write_1_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io1)); - m_xavix2002io->read_2_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io2)); - m_xavix2002io->write_2_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io2)); + superxavix_i2c_24c08(config); + + m_xavix2002io->read_0_callback().set(FUNC(superxavix_i2c_jmat_state::read_extended_io0)); + m_xavix2002io->write_0_callback().set(FUNC(superxavix_i2c_jmat_state::write_extended_io0)); + m_xavix2002io->read_1_callback().set(FUNC(superxavix_i2c_jmat_state::read_extended_io1)); + m_xavix2002io->write_1_callback().set(FUNC(superxavix_i2c_jmat_state::write_extended_io1)); + m_xavix2002io->read_2_callback().set(FUNC(superxavix_i2c_jmat_state::read_extended_io2)); + m_xavix2002io->write_2_callback().set(FUNC(superxavix_i2c_jmat_state::write_extended_io2)); } -DEVICE_IMAGE_LOAD_MEMBER(xavix2002_super_tv_pc_state::cart_load) +DEVICE_IMAGE_LOAD_MEMBER(superxavix_super_tv_pc_state::cart_load) { u64 length; memory_region *cart_region = nullptr; @@ -396,37 +437,98 @@ DEVICE_IMAGE_LOAD_MEMBER(xavix2002_super_tv_pc_state::cart_load) return std::make_pair(std::error_condition(), std::string()); } -void xavix2002_super_tv_pc_state::xavix2002_super_tv_pc(machine_config& config) +void superxavix_super_tv_pc_state::xavix_extbus_map(address_map &map) +{ + map(0x000000, 0x7fffff).rom().region("bios", 0x000000); + map(0x500000, 0x5fffff).bankr("rombank"); // needed for suprtvpchk and suprtvpcdo to read bitmaps for loading screen and desktop + map(0x600000, 0x67ffff).ram().share("bitmap_buffer"); // reads/writes here +} + +void superxavix_super_tv_pc_state::machine_reset() +{ + superxavix_state::machine_reset(); + + m_rombank->configure_entry(0, memregion("bios")->base() + 0x500000); + m_rombank->configure_entry(1, memregion("bios")->base() + 0x700000); + m_rombank->set_entry(0); +} + + +void superxavix_super_tv_pc_state::superxavix_super_tv_pc(machine_config& config) { xavix2002(config); - m_xavix2002io->read_0_callback().set(FUNC(xavix2002_super_tv_pc_state::read_extended_io0)); - m_xavix2002io->read_1_callback().set(FUNC(xavix2002_super_tv_pc_state::read_extended_io1)); - m_xavix2002io->read_2_callback().set(FUNC(xavix2002_super_tv_pc_state::read_extended_io2)); + m_xavix2002io->read_0_callback().set(FUNC(superxavix_super_tv_pc_state::read_extended_io0)); + m_xavix2002io->write_0_callback().set(FUNC(superxavix_super_tv_pc_state::write_extended_io0)); + m_xavix2002io->read_1_callback().set(FUNC(superxavix_super_tv_pc_state::read_extended_io1)); + m_xavix2002io->write_1_callback().set(FUNC(superxavix_super_tv_pc_state::write_extended_io1)); + m_xavix2002io->read_2_callback().set(FUNC(superxavix_super_tv_pc_state::read_extended_io2)); + m_xavix2002io->write_2_callback().set(FUNC(superxavix_super_tv_pc_state::write_extended_io2)); + + m_anport->read_0_callback().set(FUNC(superxavix_super_tv_pc_state::stvpc_anport0_r)); + m_anport->read_1_callback().set(FUNC(superxavix_super_tv_pc_state::stvpc_anport1_r)); GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "super_tv_pc_cart"); m_cart->set_width(GENERIC_ROM8_WIDTH); - m_cart->set_device_load(FUNC(xavix2002_super_tv_pc_state::cart_load)); + m_cart->set_device_load(FUNC(superxavix_super_tv_pc_state::cart_load)); SOFTWARE_LIST(config, "cart_list").set_original("super_tv_pc_cart"); } +void superxavix_piano_pc_state::superxavix_piano_pc(machine_config &config) +{ + xavix2002(config); + + m_anport->read_0_callback().set(FUNC(superxavix_piano_pc_state::piano_pc_anport0_r)); + m_anport->read_1_callback().set(FUNC(superxavix_piano_pc_state::piano_pc_anport1_r)); -void xavix_i2c_state::xavix2002_i2c_24c08(machine_config &config) + m_xavix2002io->read_0_callback().set(FUNC(superxavix_piano_pc_state::read_extended_io0)); + m_xavix2002io->read_1_callback().set(FUNC(superxavix_piano_pc_state::read_extended_io1)); + m_xavix2002io->read_2_callback().set(FUNC(superxavix_piano_pc_state::read_extended_io2)); +} + + +void superxavix_doradraw_state::xavix_extbus_map(address_map &map) +{ + map(0x000000, 0x7fffff).rom().region("bios", 0x000000); + map(0x400000, 0x4fffff).ram().share("bitmap_buffer"); // reads/writes here + map(0x600000, 0x6fffff).ram().share("bitmap_buffer2"); // reads/writes here +} + + +void superxavix_doradraw_state::superxavix_doradraw(machine_config& config) +{ + xavix2002(config); +} + +void superxavix_i2c_state::superxavix_i2c_24c16(machine_config &config) +{ + xavix2002(config); + + I2C_24C16(config, "i2cmem", 0); +} + +void superxavix_i2c_state::superxavix_i2c_24c08(machine_config &config) { xavix2002(config); I2C_24C08(config, "i2cmem", 0); } -void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config) +void superxavix_i2c_state::superxavix_i2c_24c04(machine_config &config) { xavix2002(config); I2C_24C04(config, "i2cmem", 0); } -void xavix_i2c_state::xavix2002_i2c_24c02(machine_config &config) +void superxavix_i2c_state::superxavix_i2c_24c04_4mb(machine_config &config) +{ + superxavix_i2c_24c04(config); + m_maincpu->set_addrmap(6, &superxavix_i2c_state::xavix_4mb_extbus_map); +} + +void superxavix_i2c_state::superxavix_i2c_24c02(machine_config &config) { xavix2002(config); @@ -434,10 +536,12 @@ void xavix_i2c_state::xavix2002_i2c_24c02(machine_config &config) } -void xavix_i2c_state::xavix2002_i2c_mrangbat(machine_config &config) +void superxavix_i2c_state::superxavix_i2c_mrangbat(machine_config &config) { xavix2002(config); + m_maincpu->set_addrmap(6, &superxavix_i2c_state::xavix_4mb_extbus_map); + I2C_24C02(config, "i2cmem", 0); // 24C02? m_xavix2002io->read_0_callback().set_ioport("EX0"); @@ -485,7 +589,7 @@ ROM_START( xavjmat ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(1420640d) SHA1(dd714cd57cff885293688f74f69b5c1726e20ec0) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(52dc318c) SHA1(dc50e0747ba29cfb1048fd4a55d26870086c869b) ) ROM_END @@ -493,7 +597,7 @@ ROM_START( xavaero ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "aerostep.u2", 0x0000000, 0x0800000, CRC(7fce9cc1) SHA1(460bcef8a23d792941108e5da8c0d669a546b94c) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "aerostep.u3", 0x0000000, 0x0800000, CRC(ed9ca4ee) SHA1(4d90300880b02ac275e0cb502de16ae6f132aa2b) ) ROM_END @@ -507,7 +611,7 @@ ROM_START( xavmusic ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(e7c8ad59) SHA1(d47fac8b480de4db88a1b306ff8830a65d1738a3) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(977c956f) SHA1(debc086d0cf6c391002ad163e7bfaa2f010cc8f5) ) ROM_END @@ -517,7 +621,7 @@ ROM_START( domfitex ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(841fe3cd) SHA1(8678b8a0c5198b24169a84dbe3ae979bb0838f23) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(1dc844ea) SHA1(c23da9006227f7fe4982998c17759d403a47472a) ) ROM_END @@ -525,7 +629,7 @@ ROM_START( domfitch ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(0ff2a7a6) SHA1(9b924cc4330e3f8d9204390854048fe2325bfdf7) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(284583f6) SHA1(bd2d5304f1e01eed656b5de957ec0a0330a3d969) ) ROM_END @@ -533,7 +637,7 @@ ROM_START( domdance ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(74f9499d) SHA1(a64235075e32567cd6d2ab7b1284efcb8e7538e2) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(e437565c) SHA1(f6db219ea14404b698ca453f6e50c726b2e77abb) ) ROM_END @@ -541,10 +645,23 @@ ROM_START( domstepc ) ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "u2", 0x0000000, 0x0800000, CRC(cb37b5e9) SHA1(b742e3db98f36720adf5af9096c6bc235279de12) ) - ROM_REGION( 0x0800000, "biosu3", ROMREGION_ERASE00 ) + ROM_REGION( 0x0800000, "extra_u3", ROMREGION_ERASE00 ) ROM_LOAD( "u3", 0x0000000, 0x0800000, CRC(dadaa744) SHA1(fd7ca77232a8fe228fc93b0a8a47ba3260349d90) ) ROM_END +ROM_START( anpanmdx ) + ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "apmj.u3", 0x0000000, 0x0800000, CRC(41348086) SHA1(63bbf6128901c1518f537766a40e162b2616d00c) ) + + ROM_REGION( 0x0800000, "extra", ROMREGION_ERASE00 ) + ROM_LOAD( "am2j.u7", 0x0000000, 0x0800000, CRC(ff653a6b) SHA1(ece11198a06f9cddfae7f8c7e038675010869723) ) +ROM_END + +ROM_START( apmj2009 ) + ROM_REGION( 0x0800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "apmj.u3", 0x0000000, 0x0800000, CRC(5fab9492) SHA1(aa588e5333bdf81daf3b5868e00783d76a42e80e) ) +ROM_END + ROM_START( mrangbat ) ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("powerrangerspad.bin", 0x000000, 0x400000, CRC(d3a98775) SHA1(485c66242dd0ee436a278d23005aece48d606431) ) @@ -570,11 +687,29 @@ ROM_START( ban_ordj ) ROM_LOAD( "ordj.u2", 0x000000, 0x800000, CRC(78fbb00f) SHA1(797b5495e292c36c003300ed18547e5643056149) ) ROM_END +ROM_START( ban_dn1j ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "dn1j.u2", 0x000000, 0x800000, CRC(0a0cef0f) SHA1(c83a2635a969b3c686dbc599a37f8b7496b0c6a1) ) +ROM_END + + ROM_START( epo_tfit ) - ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) ROM_LOAD("tennisfitness.bin", 0x000000, 0x400000, CRC(cbf65bd2) SHA1(30b3da6f061b2dd91679db42a050f715901beb87) ) ROM_END +ROM_START( maxheart ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) + ROM_LOAD("mgrj.u2", 0x000000, 0x400000, CRC(447c25e6) SHA1(9cc65088512218f43d66b332de7a862d95c1c353) ) +ROM_END + +ROM_START( epo_doka ) + ROM_REGION( 0x400000, "bios", ROMREGION_ERASE00) + ROM_LOAD("doka.u1", 0x000000, 0x400000, CRC(853266d2) SHA1(d4121b89ee464088951898282404e5a2b788dd69) ) +ROM_END + + + ROM_START( udance ) ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) ROM_LOAD("udancerom0.bin", 0x000000, 0x800000, CRC(3066580a) SHA1(545257c75a892894faf386f4ab9a31967cdbe8ae) ) @@ -597,11 +732,6 @@ ROM_START( suprtvpchk ) ROM_CONTINUE(0x000000, 0x200000) ROM_CONTINUE(0x600000, 0x200000) ROM_CONTINUE(0x400000, 0x200000) - - // The area at 0x400000 in the ROM is 0xff filled, probably the system maps RAM, not ROM here as there are also writes. - // Replacing it with 0x00 as a hack allows the machine to get to the 'desktop' but in reality some of the memory bypass - // speedups will need removing and RAM mapping - ROM_FILL(0x600000, 0x80000,0x00) ROM_END ROM_START( suprtvpcdo ) @@ -610,23 +740,64 @@ ROM_START( suprtvpcdo ) ROM_CONTINUE(0x000000, 0x200000) ROM_CONTINUE(0x600000, 0x200000) ROM_CONTINUE(0x400000, 0x200000) +ROM_END + +ROM_START( epo_ntpj ) + ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) + ROM_LOAD("ntpj.u6", 0x000000, 0x800000, CRC(6ce02166) SHA1(21c2ed48014e66123bb9968648984f82de361e2a) ) + + // uses IS24C64 EEPROM - // see note in suprtvpchk set - ROM_FILL(0x600000, 0x80000,0x00) + // there is extra hardware for the Piano side of things which may or may not have ROM data in it ROM_END +ROM_START( doradraw ) + ROM_REGION(0x800000, "bios", ROMREGION_ERASE00) + ROM_LOAD("dmdj.u2", 0x000000, 0x800000, CRC(b3ca50ab) SHA1(9e6d28c1e170d3556e3c4ddcefb4cb51fd100df5) ) + + ROM_REGION(0x200000, "data", ROMREGION_ERASE00) // banked or extended video bus? + ROM_LOAD("dmdj.u7", 0x000000, 0x200000, CRC(0e6392f9) SHA1(30fa3d3451b37d663e124c7d1d52c7e30284d2fb) ) +ROM_END + + +void superxavix_super_tv_pc_state::init_stvpc() +{ + init_xavix(); + m_disable_memory_bypass = true; +} + +void superxavix_i2c_jmat_state::init_xavmusic() +{ + init_xavix(); + // is sprite yflip broken on (some?) revisions of SuperXaviX hardware, or is there a CPU bug causing this + m_disable_sprite_yflip = true; +} + +void superxavix_piano_pc_state::init_piano_pc() +{ + init_xavix(); + m_disable_memory_bypass = true; +} + + +void superxavix_doradraw_state::init_doradraw() +{ + init_xavix(); + m_disable_memory_bypass = true; +} + -CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c08, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix_bowl, xavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' -CONS( 2004, xavbox, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' +CONS( 2004, xavtenni, 0, 0, superxavix_i2c_24c04, xavix_i2c, superxavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbaseb, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbowl, 0, 0, superxavix_i2c_24c04, xavix_bowl, superxavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' +CONS( 2004, xavbox, 0, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' // Bass Fishing PCB is just like Tennis except with an RF daughterboard. -CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c08, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbassf, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! -CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, xavaero, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Aerostep (XaviXPORT, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2007, xavmusic, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Music & Circuit (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavjmat, 0, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavaero, 0, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "XaviX Aerostep (XaviXPORT, Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2007, xavmusic, 0, 0, superxavix_i2c_jmat, xavix, superxavix_i2c_jmat_state, init_xavmusic, "SSD Company LTD", "XaviX Music & Circuit (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // https://arnaudmeyer.wordpress.com/domyos-interactive-system/ // Domyos Fitness Adventure @@ -641,39 +812,54 @@ CONS( 2007, xavmusic, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_stat // Domyos Bike Concept (not listed on site above) // Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) (both Exercises and Challenge are identical PCBs) -CONS( 2008, domfitex, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2008, domfitch, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2007, domdance, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Dance (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2007, domstepc, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Step Concept (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitex, 0, 0, superxavix_i2c_jmat, xavixp, superxavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitch, 0, 0, superxavix_i2c_jmat, xavixp, superxavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2007, domdance, 0, 0, superxavix_i2c_jmat, xavixp, superxavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Dance (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2007, domstepc, 0, 0, superxavix_i2c_jmat, xavixp, superxavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Step Concept (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // some DIS games run on XaviX 2 instead, see xavix2.cpp for Domyos Fitness Adventure and Domyos Bike Concept // Let's!TVプレイ 魔法戦隊マジレンジャー マジマットでダンス&バトル -CONS( 2005, mrangbat, 0, 0, xavix2002_i2c_mrangbat, mrangbat, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Mahou Taiketsu Magiranger - Magimat de Dance & Battle (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, mrangbat, 0, 0, superxavix_i2c_mrangbat, mrangbat, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Mahou Taiketsu Magiranger - Magimat de Dance & Battle (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // エキサイトスポーツ テニス×フィットネス -CONS( 2004, epo_tfit, 0, 0, xavix2002_i2c_24c04, epo_tfit, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Sports Tennis x Fitness (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // Epoch Tennis and Fitness has 24LC04 +CONS( 2004, epo_tfit, 0, 0, superxavix_i2c_24c04_4mb, epo_tfit, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Excite Sports Tennis x Fitness (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + +// Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう +CONS( 2004, maxheart, 0, 0, superxavix_i2c_24c04_4mb, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Futari wa PreCure MaxHeart Dance on the mat Let's go to MaxHeart (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) + +// どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ! +CONS( 2004, epo_doka, 0, 0, xavix2002_4mb, xavix, superxavix_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon anywhere - Japan travel game DX experience! Where is the Dragon Grand Prix! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -// TODO: does it have an SEEPROM? why does it hang? full title? // それいけトーマス ソドー島のなかまたち -CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, tmy_thom, 0, 0, superxavix_i2c_24c04, xavix_i2c, superxavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Soreike Thomas - Sodor Tou no Nakamatachi / Thomas & Friends on the Island of Sodor (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Let’s! TVプレイ 体感体得 結界師 方囲!定礎!結!滅! -CONS( 2007, ban_kksj, 0, 0, xavix2002_i2c_24c02, xavix_i2c, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Taitoku Kekkaishi: Houi! Jouso! Ketsu! Metsu! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2007, ban_kksj, 0, 0, superxavix_i2c_24c02, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Taikan Taitoku Kekkaishi: Houi! Jouso! Ketsu! Metsu! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // 流星のロックマン 電波変換!オン・エア! -CONS( 2007, tmy_rkmj, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Takara Tomy / Capcom / SSD Company LTD", "Ryuusei no Rockman: Denpa Henkan! On Air! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2007, tmy_rkmj, 0, 0, superxavix_i2c_24c04, xavix_i2c, superxavix_i2c_state, init_xavix, "Takara Tomy / Capcom / SSD Company LTD", "Ryuusei no Rockman: Denpa Henkan! On Air! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Let's!TVプレイ 音撃バトル!仮面ライダー響鬼 決めろ!一気火勢の型 -CONS( 2005, ban_ordj, 0, 0, xavix2002_i2c_24c04, ban_ordj, xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Ongeki Battle! Kamen Rider Hibiki: Kimero! Ikki Kasei no Kata (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ban_ordj, 0, 0, superxavix_i2c_24c04, ban_ordj, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Ongeki Battle! Kamen Rider Hibiki: Kimero! Ikki Kasei no Kata (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + +// ディズニーキャラクターズ オト!イロ!トン・トン!ミラクルパレード +CONS( 2007, ban_dn1j, 0, 0, superxavix_i2c_24c04, ban_ordj, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Disney Characters Oto! Iro! Ton-Ton! Miracle Parade (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + +CONS( 2011, anpanmdx, 0, 0, superxavix_i2c_24c08, anpanmdx, superxavix_i2c_state, init_xavix, "JoyPalette / SSD Company LTD", "Anpanman Kazoku De Ikunou Mat DX (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + +CONS( 2009, apmj2009, 0, 0, superxavix_i2c_24c16, xavix_i2c, superxavix_i2c_state, init_xavix, "JoyPalette / SSD Company LTD", "Anpanman Pyon-Pyon Ikunou Mat (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has HT24LC16 -CONS( 2008, udance, 0, 0, xavix2002, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "U-Dance", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, udance, 0, 0, xavix2002, xavix, superxavix_state, init_xavix, "Tiger / SSD Company LTD", "U-Dance", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + +// these have RAM in the usual ROM space & also have an Atmel 24LC64, +CONS( 2004, suprtvpc, 0, 0, superxavix_super_tv_pc, suprtvpc, superxavix_super_tv_pc_state, init_stvpc, "Epoch / SSD Company LTD", "Super TV-PC (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2006, suprtvpchk, suprtvpc, 0, superxavix_super_tv_pc, suprtvpc, superxavix_super_tv_pc_state, init_stvpc, "Epoch / SSD Company LTD", "Super TV-PC - Hello Kitty (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2006, suprtvpcdo, suprtvpc, 0, superxavix_super_tv_pc, suprtvpc, superxavix_super_tv_pc_state, init_stvpc, "Epoch / SSD Company LTD", "Super TV-PC - Doraemon (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -// these have RAM in the usual ROM space (still needs handling) & also have an Atmel 24LC64, -// this one (pet themed) boots to the desktop (as do the 'hamtaro' 'eccjr' cartridges) -CONS( 2004, suprtvpc, 0, 0, xavix2002_super_tv_pc, xavix, xavix2002_super_tv_pc_state, init_xavix, "Epoch / SSD Company LTD", "Super TV-PC", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -// hangs after 'loading' sequence -CONS( 2006, suprtvpchk, suprtvpc, 0, xavix2002_super_tv_pc, xavix, xavix2002_super_tv_pc_state, init_xavix, "Epoch / SSD Company LTD", "Super TV-PC - Hello Kitty", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2006, suprtvpcdo, suprtvpc, 0, xavix2002_super_tv_pc, xavix, xavix2002_super_tv_pc_state, init_xavix, "Epoch / SSD Company LTD", "Super TV-PC - Doraemon", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// similar to Super TV-PC but with additional built in piano +CONS( 2008, epo_ntpj, 0, 0, superxavix_piano_pc, suprtvpc, superxavix_piano_pc_state, init_piano_pc, "Epoch / SSD Company LTD", "Hello Kitty Piano PC (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// ドラえもん うごく!おえかき エポック社 +CONS( 2007, doradraw, 0, 0, superxavix_doradraw, xavix, superxavix_doradraw_state, init_doradraw, "Epoch / SSD Company LTD", "Doraemon Moving! Oekaki (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/tvgames/xavix_2002.h b/src/mame/tvgames/xavix_2002.h index df4cdace86e..184553877da 100644 --- a/src/mame/tvgames/xavix_2002.h +++ b/src/mame/tvgames/xavix_2002.h @@ -10,52 +10,115 @@ #include "softlist_dev.h" -class xavix_i2c_jmat_state : public xavix_i2c_state +class superxavix_i2c_jmat_state : public superxavix_i2c_state { public: - xavix_i2c_jmat_state(const machine_config &mconfig, device_type type, const char *tag) - : xavix_i2c_state(mconfig, type, tag) + superxavix_i2c_jmat_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_i2c_state(mconfig, type, tag) { } - void xavix2002_i2c_jmat(machine_config &config); + void superxavix_i2c_jmat(machine_config &config); + + void init_xavmusic(); private: - uint8_t read_extended_io0(); - uint8_t read_extended_io1(); - uint8_t read_extended_io2(); - void write_extended_io0(uint8_t data); - void write_extended_io1(uint8_t data); - void write_extended_io2(uint8_t data); + uint8_t read_extended_io0(offs_t offset, uint8_t mem_mask); + uint8_t read_extended_io1(offs_t offset, uint8_t mem_mask); + uint8_t read_extended_io2(offs_t offset, uint8_t mem_mask); + void write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask); + void write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask); + void write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask); }; -class xavix2002_super_tv_pc_state : public xavix_state +class superxavix_super_tv_pc_state : public superxavix_state { public: - xavix2002_super_tv_pc_state(const machine_config &mconfig, device_type type, const char *tag) - : xavix_state(mconfig, type, tag) + superxavix_super_tv_pc_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_state(mconfig, type, tag) , m_cart(*this, "cartslot") + , m_rombank(*this, "rombank") { } - void xavix2002_super_tv_pc(machine_config &config); + void superxavix_super_tv_pc(machine_config &config); + + void init_stvpc(); private: - uint8_t read_extended_io0() { return 0x00; } - uint8_t read_extended_io1() { return 0x00; } - uint8_t read_extended_io2() { return 0x00; } - //void write_extended_io0(uint8_t data); - //void write_extended_io1(uint8_t data); - //void write_extended_io2(uint8_t data); + virtual void machine_reset() override; + + uint8_t stvpc_anport0_r() { return (m_mouse0x->read()^0x7f)+1; } + uint8_t stvpc_anport1_r() { return (m_mouse0y->read()^0x7f)+1; } + + uint8_t read_extended_io0(offs_t offset, uint8_t mem_mask) { return 0x00; } + uint8_t read_extended_io1(offs_t offset, uint8_t mem_mask) { return 0x00; } + uint8_t read_extended_io2(offs_t offset, uint8_t mem_mask) { return 0x00; } + void write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: extio0_w %02x\n", machine().describe_context(), data); } + void write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: extio1_w %02x\n", machine().describe_context(), data); } + void write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask) + { + logerror("%s: extio2_w %02x\n", machine().describe_context(), data); + { + if (mem_mask & 0x04) + { + if (data & 0x04) + m_rombank->set_entry(1); + else + m_rombank->set_entry(0); + } + } + } + + virtual void xavix_extbus_map(address_map &map) override; DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load); required_device<generic_slot_device> m_cart; + required_memory_bank m_rombank; +}; + + +class superxavix_piano_pc_state : public superxavix_state +{ +public: + superxavix_piano_pc_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_state(mconfig, type, tag) + { } + + void superxavix_piano_pc(machine_config &config); + + void init_piano_pc(); + +private: + uint8_t piano_pc_anport0_r() { return (m_mouse0x->read()^0x7f)+1; } + uint8_t piano_pc_anport1_r() { return (m_mouse0y->read()^0x7f)+1; } + + // needs 0x00 returning from one of these to boot past loading screen + uint8_t read_extended_io0(offs_t offset, uint8_t mem_mask) { return 0x00; } + uint8_t read_extended_io1(offs_t offset, uint8_t mem_mask) { return 0x00; } + uint8_t read_extended_io2(offs_t offset, uint8_t mem_mask) { return 0x00; } +}; + +class superxavix_doradraw_state : public superxavix_state +{ +public: + superxavix_doradraw_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_state(mconfig, type, tag) + { } + + void superxavix_doradraw(machine_config &config); + + void init_doradraw(); + +private: + + virtual void xavix_extbus_map(address_map &map) override; }; -class xavix_i2c_bowl_state : public xavix_i2c_state +class superxavix_i2c_bowl_state : public superxavix_i2c_state { public: - xavix_i2c_bowl_state(const machine_config &mconfig, device_type type, const char *tag) - : xavix_i2c_state(mconfig, type, tag) + superxavix_i2c_bowl_state(const machine_config &mconfig, device_type type, const char *tag) + : superxavix_i2c_state(mconfig, type, tag) { } int camera_r(); diff --git a/src/mame/tvgames/xavix_m.cpp b/src/mame/tvgames/xavix_m.cpp index bba9ee7a154..c32a60f94ef 100644 --- a/src/mame/tvgames/xavix_m.cpp +++ b/src/mame/tvgames/xavix_m.cpp @@ -284,6 +284,7 @@ void xavix_state::colmix_6ff2_w(uint8_t data) { LOG("%s: colmix_6ff2_w %02x\n", machine().describe_context(), data); m_colmix_ctrl[0] = data; + // bits 0xe0 seem to enable a TV static effect somehow, used by rad_opus } @@ -898,13 +899,23 @@ void xavix_state::machine_start() save_item(NAME(m_sndtimer)); save_item(NAME(m_timer_baseval)); save_item(NAME(m_spritereg)); +} + +void superxavix_state::machine_start() +{ + xavix_state::machine_start(); save_item(NAME(m_superxavix_pal_index)); save_item(NAME(m_superxavix_bitmap_pal_index)); + save_item(NAME(m_sx_plt_address)); + save_item(NAME(m_sx_plt_mode)); + save_item(NAME(m_plotter_has_byte)); + save_item(NAME(m_plotter_current_byte)); save_item(NAME(m_sx_extended_extbus)); } + void xavix_state::machine_reset() { m_rom_dma_src[0] = 0; @@ -966,7 +977,6 @@ void xavix_state::machine_reset() m_sound_regbase = 0x02; // rad_bb doesn't initialize this and expects it here. It is possible the default is 0x00, but since 0x00 and 0x01 are special (zero page and stack) those values would also use bank 0x02 - m_sprite_xhigh_ignore_hack = true; m_cpuspace = &m_maincpu->space(AS_PROGRAM); @@ -974,16 +984,20 @@ void xavix_state::machine_reset() m_extbusctrl[0] = 0x00; m_extbusctrl[1] = 0x00; m_extbusctrl[2] = 0x00; +} - - // SuperXaviX +void superxavix_state::machine_reset() +{ + xavix_state::machine_reset(); for (int i = 0; i < 3; i++) { m_sx_extended_extbus[i] = 0x00; } + } + typedef device_delegate<uint8_t(int which, int half)> xavix_interrupt_vector_delegate; int16_t xavix_state::get_vectors(int which, int half) @@ -1011,19 +1025,19 @@ int16_t xavix_state::get_vectors(int which, int half) // additional SuperXaviX / XaviX2002 stuff -void xavix_state::extended_extbus_reg0_w(uint8_t data) +void superxavix_state::extended_extbus_reg0_w(uint8_t data) { LOG("%s: extended_extbus_reg0_w %02x\n", machine().describe_context(), data); m_sx_extended_extbus[0] = data; } -void xavix_state::extended_extbus_reg1_w(uint8_t data) +void superxavix_state::extended_extbus_reg1_w(uint8_t data) { LOG("%s: extended_extbus_reg1_w %02x\n", machine().describe_context(), data); m_sx_extended_extbus[1] = data; } -void xavix_state::extended_extbus_reg2_w(uint8_t data) +void superxavix_state::extended_extbus_reg2_w(uint8_t data) { LOG("%s: extended_extbus_reg2_w %02x\n", machine().describe_context(), data); m_sx_extended_extbus[2] = data; diff --git a/src/mame/tvgames/xavix_math.cpp b/src/mame/tvgames/xavix_math.cpp index b41883a98c1..af499b956db 100644 --- a/src/mame/tvgames/xavix_math.cpp +++ b/src/mame/tvgames/xavix_math.cpp @@ -16,156 +16,165 @@ xavix_math_device::xavix_math_device(const machine_config &mconfig, const char * void xavix_math_device::device_start() { - save_item(NAME(m_barrel_params)); - save_item(NAME(m_multparams)); + save_item(NAME(m_mpr)); + save_item(NAME(m_mpd)); + save_item(NAME(m_mad)); + save_item(NAME(m_sgn_mpd)); + save_item(NAME(m_sgn_mpr)); save_item(NAME(m_multresults)); } void xavix_math_device::device_reset() { - m_barrel_params[0] = 0x00; - m_barrel_params[1] = 0x00; - - std::fill(std::begin(m_multparams), std::end(m_multparams), 0x00); + m_mpr = 0; + m_mpd = 0; + m_mad = 0; + m_sgn_mpd = 0; + m_sgn_mpr = 0; std::fill(std::begin(m_multresults), std::end(m_multresults), 0x00); } - // epo_guru uses this for ground movement in 3d stages (and other places) uint8_t xavix_math_device::barrel_r(offs_t offset) { + uint8_t ret = 0; if (offset == 0) { - // or upper bits of result? - LOG("%s: reading shift trigger?!\n", machine().describe_context()); - return 0x00; + ret = (m_sgn_mpd ? 0x80 : 0x00) | (m_mpr & 0x40) | (m_mpr & 0x07); } else { - uint8_t retdata = m_barrel_params[1]; - LOG("%s: reading shift results/data %02x\n", machine().describe_context(), retdata); - return retdata; + ret = (m_mpr & 0x40) ? + m_multresults[1] ^ m_multresults[0] : (m_mpr & 0x08) ? + m_multresults[1] : m_multresults[0]; } + + LOG("%s: reading shift results/data %d %02x\n", machine().describe_context(), offset, ret); + return ret; } // epo_guru 3d stages still flicker a lot with this, but it seems unrelated to the calculations here, possibly a raster timing issue -// the pickup animations however don't seem to play, which indicates this could still be wrong. void xavix_math_device::barrel_w(offs_t offset, uint8_t data) { - LOG("%s: barrel_w %02x\n", machine().describe_context(), data); - - m_barrel_params[offset] = data; + LOG("%s: barrel_w %d %02x\n", machine().describe_context(), offset, data); - // offset 0 = trigger if (offset == 0) { - int shift_data = m_barrel_params[1]; - int shift_amount = data & 0x0f; - int shift_param = (data & 0xf0) >> 4; - - if (shift_param == 0x00) // just a shift? (definitely right for 'hammer throw' - { - // used in epo_guru for 'hammer throw', 'pre-title screen', 'mini game select', '3d chase game (floor scroll, pickups, misc)', 'toilet roll mini game (when you make an error)' - - if (shift_amount & 0x08) - { - m_barrel_params[1] = (shift_data >> (shift_amount & 0x7)); - } - else - { - m_barrel_params[1] = (shift_data << (shift_amount & 0x7)); - } - } - else if (shift_param == 0x8) // rotate? (should it rotate through a carry bit of some kind?) - { - // used in epo_guru for '3d chase game' (unsure of actual purpose in it) - switch (shift_amount) - { - case 0x0: m_barrel_params[1] = shift_data; break; - case 0x1: m_barrel_params[1] = (shift_data << 1) | ((shift_data >> 7) & 0x01); break; - case 0x2: m_barrel_params[1] = (shift_data << 2) | ((shift_data >> 6) & 0x03); break; - case 0x3: m_barrel_params[1] = (shift_data << 3) | ((shift_data >> 5) & 0x07); break; - case 0x4: m_barrel_params[1] = (shift_data << 4) | ((shift_data >> 4) & 0x0f); break; - case 0x5: m_barrel_params[1] = (shift_data << 5) | ((shift_data >> 3) & 0x1f); break; - case 0x6: m_barrel_params[1] = (shift_data << 6) | ((shift_data >> 2) & 0x2f); break; - case 0x7: m_barrel_params[1] = (shift_data << 7) | ((shift_data >> 1) & 0x3f); break; - case 0x8: m_barrel_params[1] = shift_data; break; - case 0x9: m_barrel_params[1] = (shift_data >> 1) | ((shift_data & 0x01) << 7); break; - case 0xa: m_barrel_params[1] = (shift_data >> 2) | ((shift_data & 0x03) << 6); break; - case 0xb: m_barrel_params[1] = (shift_data >> 3) | ((shift_data & 0x07) << 5); break; - case 0xc: m_barrel_params[1] = (shift_data >> 4) | ((shift_data & 0x0f) << 4); break; - case 0xd: m_barrel_params[1] = (shift_data >> 5) | ((shift_data & 0x1f) << 3); break; - case 0xe: m_barrel_params[1] = (shift_data >> 6) | ((shift_data & 0x2f) << 2); break; - case 0xf: m_barrel_params[1] = (shift_data >> 7) | ((shift_data & 0x3f) << 1); break; - } - } + m_mad = 0; + m_sgn_mpd = data & 0x80; + m_sgn_mpr = 0; + m_mpr = data; + do_math(true); + } + else + { + m_mpd = data; } } - - uint8_t xavix_math_device::mult_r(offs_t offset) { - return m_multresults[offset]; + uint8_t ret = m_multresults[offset]; + LOG("%s: mult_r %d %02x (read result)\n", machine().describe_context(), offset, ret); + return ret; } void xavix_math_device::mult_w(offs_t offset, uint8_t data) { + LOG("%s: mult_w %d %02x (write result)\n", machine().describe_context(), offset, data); // rad_madf writes here to set the base value which the multiplication result gets added to m_multresults[offset] = data; } uint8_t xavix_math_device::mult_param_r(offs_t offset) { - return m_multparams[offset]; -} + uint8_t ret = 0; -void xavix_math_device::mult_param_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - COMBINE_DATA(&m_multparams[offset]); - // there are NOPs after one of the writes, so presumably the operation is write triggerd and not intstant - // see test code at 0184a4 in monster truck + if (offset == 0) + { + ret = m_mad | (m_sgn_mpd ? 0x02 : 0x00) | m_sgn_mpr; + } + else if (offset == 1) + { + ret = m_mpd; + } + else + { + ret = m_mpr; + } - // offset0 is control + LOG("%s: mult_param_r %d %02x (read parameters)\n", machine().describe_context(), offset, ret); + return ret; +} - // mm-- --Ss - // mm = mode, S = sign for param1, s = sign for param2 - // modes 00 = multiply (regular?) 11 = add to previous 01 / 10 unknown (maybe subtract?) +void xavix_math_device::do_math(bool mul_shf) +{ + uint16_t result = 0; + uint8_t mpd = m_mpd; + uint8_t mulinp; - if (offset == 2) + if (!mul_shf) { - // assume 0 is upper bits, might be 'mode' instead, check + mulinp = m_mpr; + } + else + { + mulinp = 1 << (m_mpr & 0x7); + } + if (m_sgn_mpd && (mpd & 0x80) && m_sgn_mpr && (mulinp & 0x80)) + { + result = mpd * mulinp - (mpd << 8) - (mulinp << 8); + } + else if (m_sgn_mpd && (mpd & 0x80)) + { + result = mpd * mulinp - (mulinp << 8); + } + else if (m_sgn_mpr && (mulinp & 0x80)) + { + result = mpd * mulinp - (mpd << 8); + } + else + { + result = mpd * mulinp; + } - int signmode = (m_multparams[0] & 0x3f); + if (m_mad) + { + uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0]; + result = oldresult + result; + } - uint16_t result = 0; + m_multresults[1] = (result >> 8) & 0xff; + m_multresults[0] = result & 0xff; +} - // rad_madf uses this mode (add to previous result) - if ((m_multparams[0] & 0xc0) == 0xc0) - { - const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1]; - const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2]; +void xavix_math_device::mult_param_w(offs_t offset, uint8_t data, uint8_t mem_mask) +{ + // there are NOPs after one of the writes, so presumably the operation is write triggerd and not intstant + // see test code at 0184a4 in monster truck - result = param1 * param2; + // offset0 is control - uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0]; - result = oldresult + result; - } - else if ((m_multparams[0] & 0xc0) == 0x00) - { - const int param1 = signmode & 0x2 ? (int8_t)m_multparams[1] : (uint8_t)m_multparams[1]; - const int param2 = signmode & 0x1 ? (int8_t)m_multparams[2] : (uint8_t)m_multparams[2]; + // m?-- --Ss + // m = mode, S = sign for param1, s = sign for param2 + LOG("%s: mult_param_w %d %02x (write param1 and trigger)\n", machine().describe_context(), offset, data); - result = param1 * param2; - } - else - { - popmessage("unknown multiplier mode %02x", m_multparams[0] & 0xc0); - } + if (offset == 0) + { + m_mad = data & 0x80; + // sometimes 0x40 is set along with 0x80, sometimes only 0x80, why? is it important? - m_multresults[1] = (result >> 8) & 0xff; - m_multresults[0] = result & 0xff; + m_sgn_mpd = data & 0x02; + m_sgn_mpr = data & 0x01; + } + else if (offset == 1) + { + m_mpd = data; + } + else if (offset == 2) + { + m_mpr = data; + do_math(false); } } - diff --git a/src/mame/tvgames/xavix_math.h b/src/mame/tvgames/xavix_math.h index abf2335360e..8d5a3df05ec 100644 --- a/src/mame/tvgames/xavix_math.h +++ b/src/mame/tvgames/xavix_math.h @@ -23,10 +23,16 @@ protected: virtual void device_reset() override ATTR_COLD; private: + void do_math(bool mul_shf); + + uint8_t m_mpr; + uint8_t m_mpd; - uint8_t m_barrel_params[2]; - uint8_t m_multparams[3]; uint8_t m_multresults[2]; + + uint8_t m_mad; + uint8_t m_sgn_mpd; + uint8_t m_sgn_mpr; }; DECLARE_DEVICE_TYPE(XAVIX_MATH, xavix_math_device) diff --git a/src/mame/tvgames/xavix_v.cpp b/src/mame/tvgames/xavix_v.cpp index cbd9fec88b8..a8f3e0bed42 100644 --- a/src/mame/tvgames/xavix_v.cpp +++ b/src/mame/tvgames/xavix_v.cpp @@ -21,8 +21,10 @@ inline uint8_t xavix_state::get_next_bit() // going through memory is slow, try not to do it too often! if (m_tmp_databit == 0) { - //m_bit = m_maincpu->read_full_data_sp(m_tmp_dataaddress); - m_bit = read_full_data_sp_bypass(m_tmp_dataaddress); + if (m_disable_memory_bypass) + m_bit = m_maincpu->space(AS_PROGRAM).read_byte(m_tmp_dataaddress); + else + m_bit = read_full_data_sp_bypass(m_tmp_dataaddress); } uint8_t ret = m_bit >> m_tmp_databit; @@ -39,6 +41,28 @@ inline uint8_t xavix_state::get_next_bit() return ret; } +inline uint8_t superxavix_state::get_next_bit_sx() +{ + if (m_tmp_databit == 0) + { + m_bit = m_extra[m_tmp_dataaddress&0x7fffff]; + } + + uint8_t ret = m_bit >> m_tmp_databit; + ret &= 1; + + m_tmp_databit++; + + if (m_tmp_databit == 8) + { + m_tmp_databit = 0; + m_tmp_dataaddress++; + } + + return ret; +} + + inline uint8_t xavix_state::get_next_byte() { uint8_t dat = 0; @@ -73,13 +97,13 @@ void xavix_state::palram_l_w(offs_t offset, uint8_t data) update_pen(offset, m_palram_sh[offset], m_palram_l[offset]); } -void xavix_state::bmp_palram_sh_w(offs_t offset, uint8_t data) +void superxavix_state::bmp_palram_sh_w(offs_t offset, uint8_t data) { m_bmp_palram_sh[offset] = data; update_pen(offset+256, m_bmp_palram_sh[offset], m_bmp_palram_l[offset]); } -void xavix_state::bmp_palram_l_w(offs_t offset, uint8_t data) +void superxavix_state::bmp_palram_l_w(offs_t offset, uint8_t data) { m_bmp_palram_l[offset] = data; update_pen(offset+256, m_bmp_palram_sh[offset], m_bmp_palram_l[offset]); @@ -109,38 +133,141 @@ void xavix_state::spriteram_w(offs_t offset, uint8_t data) } } -void xavix_state::superxavix_bitmap_pal_index_w(uint8_t data) +void superxavix_state::superxavix_crtc_1_w(offs_t offset, uint8_t data) +{ + logerror("%s superxavix_crtc_1_w %02x %02x\n", machine().describe_context(), offset, data); + m_sx_crtc_1[offset] = data; +} + +uint8_t superxavix_state::superxavix_crtc_1_r(offs_t offset) +{ + return m_sx_crtc_1[offset]; +} + +void superxavix_state::bitmap_params_w(offs_t offset, uint8_t data) +{ + logerror("%s bitmap_params_w %02x %02x\n", machine().describe_context(), offset, data); + m_bmp_base[offset] = data; + // if anything changes these mid-screen we may need to trigger a partial update here +} + +uint8_t superxavix_state::bitmap_params_r(offs_t offset) +{ + return m_bmp_base[offset]; +} + +void superxavix_state::superxavix_crtc_2_w(offs_t offset, uint8_t data) +{ + logerror("%s superxavix_crtc_2_w %02x %02x\n", machine().describe_context(), offset, data); + m_sx_crtc_2[offset] = data; +} + +uint8_t superxavix_state::superxavix_crtc_2_r(offs_t offset) +{ + return m_sx_crtc_2[offset]; +} + +void superxavix_state::superxavix_plt_flush_w(uint8_t data) +{ + // flush current write buffer (as we might not have filled a byte when plotting) + // and set write mode? + // do we need to cache the previous write address for the flush? (probably not, this seems to be explicitly + // written both after every transfer, and before the next one. + if (m_plotter_has_byte) + { + m_maincpu->space(6).write_byte((m_sx_plt_address >> 3) & 0x7fffff, m_plotter_current_byte); + } + + m_plotter_has_byte = 0; + m_plotter_current_byte = 0x00; + //printf("%s: superxavix_plt_flush_w %02x\n", machine().describe_context().c_str(), data); + m_sx_plt_mode = data; +} + +uint8_t superxavix_state::superxavix_plt_dat_r() +{ + return machine().rand(); +} + +void superxavix_state::superxavix_plt_dat_w(uint8_t data) +{ + uint8_t pixels = m_sx_plt_mode + 1; + + while (pixels) + { + if (!m_plotter_has_byte) + { + m_plotter_current_byte = m_maincpu->space(6).read_byte((m_sx_plt_address>>3) & 0x7fffff); + m_plotter_has_byte = 1; + } + + uint8_t bit_to_write = data & 1; + data >>= 1; + + uint8_t destbit = m_sx_plt_address & 0x7; + m_plotter_current_byte &= ~(1 << destbit); + m_plotter_current_byte |= (bit_to_write << destbit); + + m_sx_plt_address++; + if (!(m_sx_plt_address & 0x7)) + { + m_maincpu->space(6).write_byte(((m_sx_plt_address-1)>>3) & 0x7fffff, m_plotter_current_byte); + m_plotter_has_byte = 0; + } + + pixels--; + } +} + +void superxavix_state::superxavix_plt_loc_w(offs_t offset, uint8_t data) +{ + logerror("%s superxavix_plt_loc_w %02x %02x\n", machine().describe_context(), offset, data); + + m_sx_plt_loc[offset] = data; + if (offset == 3) + { + m_sx_plt_address = (m_sx_plt_loc[3] << 24) | (m_sx_plt_loc[2] << 16) | (m_sx_plt_loc[1] << 8) | (m_sx_plt_loc[0] << 0); + logerror("%s SuperXavix Bitmap Plotter set to address %08x\n", machine().describe_context(), m_sx_plt_address); + } +} + +uint8_t superxavix_state::superxavix_plt_loc_r(offs_t offset) +{ + return m_sx_plt_loc[offset]; +} + +void superxavix_state::superxavix_bitmap_pal_index_w(uint8_t data) { m_superxavix_bitmap_pal_index = data; } -uint8_t xavix_state::superxavix_bitmap_pal_index_r() +uint8_t superxavix_state::superxavix_bitmap_pal_index_r() { return m_superxavix_bitmap_pal_index; } -void xavix_state::superxavix_chr_pal_index_w(uint8_t data) +void superxavix_state::superxavix_chr_pal_index_w(uint8_t data) { m_superxavix_pal_index = data; } -uint8_t xavix_state::superxavix_chr_pal_index_r() +uint8_t superxavix_state::superxavix_chr_pal_index_r() { return m_superxavix_pal_index; } -uint8_t xavix_state::superxavix_bitmap_pal_hue_r() +uint8_t superxavix_state::superxavix_bitmap_pal_hue_r() { return superxavix_pal_hue_r(true); } -uint8_t xavix_state::superxavix_chr_pal_hue_r() +uint8_t superxavix_state::superxavix_chr_pal_hue_r() { return superxavix_pal_hue_r(false); } -uint8_t xavix_state::superxavix_pal_hue_r(bool bitmap) +uint8_t superxavix_state::superxavix_pal_hue_r(bool bitmap) { u8 *sh, *sl; u8 ind; @@ -163,17 +290,17 @@ uint8_t xavix_state::superxavix_pal_hue_r(bool bitmap) return val << 2; } -uint8_t xavix_state::superxavix_bitmap_pal_saturation_r() +uint8_t superxavix_state::superxavix_bitmap_pal_saturation_r() { return superxavix_pal_saturation_r(true); } -uint8_t xavix_state::superxavix_chr_pal_saturation_r() +uint8_t superxavix_state::superxavix_chr_pal_saturation_r() { return superxavix_pal_saturation_r(false); } -uint8_t xavix_state::superxavix_pal_saturation_r(bool bitmap) +uint8_t superxavix_state::superxavix_pal_saturation_r(bool bitmap) { u8 *sh, *sl; u8 ind; @@ -196,17 +323,17 @@ uint8_t xavix_state::superxavix_pal_saturation_r(bool bitmap) return val << 4; } -uint8_t xavix_state::superxavix_bitmap_pal_lightness_r() +uint8_t superxavix_state::superxavix_bitmap_pal_lightness_r() { return superxavix_pal_lightness_r(true); } -uint8_t xavix_state::superxavix_chr_pal_lightness_r() +uint8_t superxavix_state::superxavix_chr_pal_lightness_r() { return superxavix_pal_lightness_r(false); } -uint8_t xavix_state::superxavix_pal_lightness_r(bool bitmap) +uint8_t superxavix_state::superxavix_pal_lightness_r(bool bitmap) { u8 *sh, *sl; u8 ind; @@ -229,17 +356,17 @@ uint8_t xavix_state::superxavix_pal_lightness_r(bool bitmap) return val << 2; } -void xavix_state::superxavix_bitmap_pal_hue_w(uint8_t data) +void superxavix_state::superxavix_bitmap_pal_hue_w(uint8_t data) { superxavix_pal_hue_w(data, true); } -void xavix_state::superxavix_chr_pal_hue_w(uint8_t data) +void superxavix_state::superxavix_chr_pal_hue_w(uint8_t data) { superxavix_pal_hue_w(data, false); } -void xavix_state::superxavix_pal_hue_w(uint8_t data, bool bitmap) +void superxavix_state::superxavix_pal_hue_w(uint8_t data, bool bitmap) { u8 *sh, *sl; u8 ind; @@ -267,17 +394,17 @@ void xavix_state::superxavix_pal_hue_w(uint8_t data, bool bitmap) update_pen(ind+offset, sh[ind], sl[ind]); } -void xavix_state::superxavix_bitmap_pal_saturation_w(uint8_t data) +void superxavix_state::superxavix_bitmap_pal_saturation_w(uint8_t data) { superxavix_pal_saturation_w(data, true); } -void xavix_state::superxavix_chr_pal_saturation_w(uint8_t data) +void superxavix_state::superxavix_chr_pal_saturation_w(uint8_t data) { superxavix_pal_saturation_w(data, false); } -void xavix_state::superxavix_pal_saturation_w(uint8_t data, bool bitmap) +void superxavix_state::superxavix_pal_saturation_w(uint8_t data, bool bitmap) { u8 *sh, *sl; u8 ind; @@ -305,17 +432,17 @@ void xavix_state::superxavix_pal_saturation_w(uint8_t data, bool bitmap) update_pen(ind+offset, sh[ind], sl[ind]); } -void xavix_state::superxavix_bitmap_pal_lightness_w(uint8_t data) +void superxavix_state::superxavix_bitmap_pal_lightness_w(uint8_t data) { superxavix_pal_lightness_w(data, true); } -void xavix_state::superxavix_chr_pal_lightness_w(uint8_t data) +void superxavix_state::superxavix_chr_pal_lightness_w(uint8_t data) { superxavix_pal_lightness_w(data, false); } -void xavix_state::superxavix_pal_lightness_w(uint8_t data, bool bitmap) +void superxavix_state::superxavix_pal_lightness_w(uint8_t data, bool bitmap) { u8 *sh, *sl; u8 ind; @@ -509,6 +636,12 @@ void xavix_state::draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, cons } } +void superxavix_state::draw_tilemap(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which) +{ + m_use_superxavix_extra = false; + xavix_state::draw_tilemap(screen, bitmap, cliprect, which); +} + void xavix_state::decode_inline_header(int &flipx, int &flipy, int &test, int &pal, int debug_packets) { uint8_t byte1 = 0; @@ -677,22 +810,31 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, // the register being 0 probably isn't the condition here if (tileregs[0x0] != 0x00) { - //tile |= m_maincpu->read_full_data_sp((tileregs[0x0] << 8) + count); - tile |= read_full_data_sp_bypass((tileregs[0x0] << 8) + count); + const offs_t realaddress = (tileregs[0x0] << 8) + count; + if (m_disable_memory_bypass) + tile |= m_maincpu->space(AS_PROGRAM).read_byte(realaddress); + else + tile |= read_full_data_sp_bypass(realaddress); } // only read the next byte if we're not in an 8-bit mode if (((tileregs[0x7] & 0x7f) != 0x00) && ((tileregs[0x7] & 0x7f) != 0x08)) { - //tile |= m_maincpu->read_full_data_sp((tileregs[0x1] << 8) + count) << 8; - tile |= read_full_data_sp_bypass((tileregs[0x1] << 8) + count) << 8; + const offs_t realaddress = (tileregs[0x1] << 8) + count; + if (m_disable_memory_bypass) + tile |= m_maincpu->space(AS_PROGRAM).read_byte(realaddress) << 8; + else + tile |= read_full_data_sp_bypass(realaddress) << 8; } // 24 bit modes can use reg 0x2, otherwise it gets used as extra attribute in other modes if (alt_tileaddressing2 == 2) { - //tile |= m_maincpu->read_full_data_sp((tileregs[0x2] << 8) + count) << 16; - tile |= read_full_data_sp_bypass((tileregs[0x2] << 8) + count) << 16; + const offs_t realaddress = (tileregs[0x2] << 8) + count; + if (m_disable_memory_bypass) + tile |= m_maincpu->space(AS_PROGRAM).read_byte(realaddress) << 16; + else + tile |= read_full_data_sp_bypass(realaddress) << 16; } @@ -736,19 +878,35 @@ void xavix_state::draw_tilemap_line(screen_device &screen, bitmap_rgb32 &bitmap, } else if (alt_tileaddressing2 == 1) { - // 8-byte alignment Addressing Mode uses a fixed offset? (like sprites) - tile = tile * 8; - basereg = (tile & 0x70000) >> 16; - tile &= 0xffff; - gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); - tile += gfxbase; + if (tileregs[0x7] & 0x01) + { + // only epo_stad has been seen using this mode (box behind dialog after you allow multiple strikes against you) + basereg = (tile & 0xf000) >> 12; + tile = tile & 0x0fff; + gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); + tile += gfxbase; + } + else + { + // 8-byte alignment Addressing Mode uses a fixed offset? (like sprites) + basereg = (tile & 0xe000) >> 13; + tile &= 0x1fff; + tile = tile * 8; + gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); + tile += gfxbase; + } } // Tilemap specific mode extension with an 8-bit per tile attribute, works in all modes except 24-bit (no room for attribute) and header (not needed?) if (tileregs[0x7] & 0x08) { - //uint8_t extraattr = m_maincpu->read_full_data_sp((tileregs[0x2] << 8) + count); - uint8_t extraattr = read_full_data_sp_bypass((tileregs[0x2] << 8) + count); + const offs_t realaddress = (tileregs[0x2] << 8) + count; + uint8_t extraattr; + + if (m_disable_memory_bypass) + extraattr = m_maincpu->space(AS_PROGRAM).read_byte(realaddress); + else + extraattr = read_full_data_sp_bypass(realaddress); // make use of the extraattr stuff? pal = (extraattr & 0xf0) >> 4; @@ -791,6 +949,16 @@ void xavix_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, cons } } +void superxavix_state::draw_sprites(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) +{ + if (m_extra) + m_use_superxavix_extra = true; + + xavix_state::draw_sprites(screen, bitmap, cliprect); + m_use_superxavix_extra = false; +} + + void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int line) { int alt_addressing = 0; @@ -814,6 +982,11 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, // 24-bit addressing (Addressing Mode 2) alt_addressing = 0; } + else if (m_spritereg == 0x07) + { + // used by anpanmdx - is this a specific 24-bit mode to enable SuperXaviX extra ROM access? + alt_addressing = 3; + } else { popmessage("unknown sprite reg %02x", m_spritereg); @@ -847,8 +1020,8 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, int xpos = spr_xpos[i]; int tile = 0; - // high 8-bits only used in 24-bit mode - if (((m_spritereg & 0x7f) == 0x04) || ((m_spritereg & 0x7f) == 0x15)) + // high 8-bits only used in 24-bit modes + if (((m_spritereg & 0x7f) == 0x04) || ((m_spritereg & 0x7f) == 0x07) || ((m_spritereg & 0x7f) == 0x15)) tile |= (spr_addr_hi[i] << 16); // mid 8-bits used in everything except 8-bit mode @@ -865,7 +1038,11 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, int zval = (attr1 & 0xf0) >> 4; int flipx = (attr1 & 0x01); - int flipy = (attr1 & 0x02); + int flipy = (attr1 & 0x02); + + // many elements, including the XaviX logo on xavmusic have yflip set, but don't want it, why? + if (m_disable_sprite_yflip) + flipy = 0; int drawheight = 16; int drawwidth = 16; @@ -937,6 +1114,7 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, xpos &= 0x7f; xpos = -0x80 + xpos; + // this also breaks the epoch logo on suprtvpc, although some ingame elements need it if (!m_sprite_xhigh_ignore_hack) if (!xposh) xpos -= 0x80; @@ -973,20 +1151,32 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, if (alt_addressing == 1) { tile = (tile * drawheight * drawwidth * bpp) / 8; - basereg = 0; // always uses segment register 0 in tile addressing mode? + int gfxbase = (m_segment_regs[1] << 16) | (m_segment_regs[0] << 8); // always use segment 0 + tile += gfxbase; + } - else + else if (alt_addressing == 2) + { + tile = tile * 8; + basereg = (tile & 0xf0000) >> 16; + tile &= 0xffff; + int gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); + tile += gfxbase; + } + else if (alt_addressing == 3) + { + // 24-bit, with multiplier, no segment use? + // seen in anpanmdx, might be superxavix specific to be able to access more memory? + tile = tile * 8; + } + else // currently unused case { - // 8-byte alignment Addressing Mode uses a fixed offset? - if (alt_addressing == 2) - tile = tile * 8; - basereg = (tile & 0xf0000) >> 16; tile &= 0xffff; + int gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); + tile += gfxbase; } - int gfxbase = (m_segment_regs[(basereg * 2) + 1] << 16) | (m_segment_regs[(basereg * 2)] << 8); - tile += gfxbase; } draw_tile_line(screen, bitmap, cliprect, tile, bpp, xpos , line, drawheight, drawwidth, flipx, flipy, pal, zval, drawline); @@ -1001,13 +1191,39 @@ void xavix_state::draw_sprites_line(screen_device &screen, bitmap_rgb32 &bitmap, } } +void xavix_state::get_tile_pixel_dat(uint8_t &dat, int bpp) +{ + for (int i = 0; i < bpp; i++) + { + dat |= (get_next_bit() << i); + } +} + +void superxavix_state::get_tile_pixel_dat(uint8_t &dat, int bpp) +{ + if (m_use_superxavix_extra) + { + for (int i = 0; i < bpp; i++) + { + dat |= (get_next_bit_sx() << i); + } + } + else + { + for (int i = 0; i < bpp; i++) + { + dat |= (get_next_bit() << i); + } + } +} + void xavix_state::draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int tile, int bpp, int xpos, int ypos, int drawheight, int drawwidth, int flipx, int flipy, int pal, int zval, int line) { const pen_t *paldata = m_palette->pens(); if (ypos > cliprect.max_y || ypos < cliprect.min_y) return; - if ((xpos > cliprect.max_x) || ((xpos + drawwidth) < cliprect.min_x)) + if (((xpos * m_video_hres_multiplier) > cliprect.max_x) || (((xpos * m_video_hres_multiplier) + drawwidth * m_video_hres_multiplier) < cliprect.min_x)) return; if ((ypos >= cliprect.min_y && ypos <= cliprect.max_y)) @@ -1043,10 +1259,9 @@ void xavix_state::draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, co uint8_t dat = 0; - for (int i = 0; i < bpp; i++) - { - dat |= (get_next_bit() << i); - } + get_tile_pixel_dat(dat, bpp); + + col = col * m_video_hres_multiplier; if ((col >= cliprect.min_x && col <= cliprect.max_x)) { @@ -1060,8 +1275,14 @@ void xavix_state::draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, co { uint32_t *const yposptr = &bitmap.pix(ypos); yposptr[col] = paldata[pen]; + if (m_video_hres_multiplier == 2) + yposptr[col+1] = paldata[pen]; zyposptr[col] = zval; + + if (m_video_hres_multiplier == 2) + zyposptr[col+1] = zval; + } } } @@ -1069,12 +1290,10 @@ void xavix_state::draw_tile_line(screen_device &screen, bitmap_rgb32 &bitmap, co } } -uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +rectangle xavix_state::do_arena(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { const pen_t *paldata = m_palette->pens(); - // not sure what you end up with if you fall through all layers as transparent, so far no issues noticed bitmap.fill(m_palette->black_pen(), cliprect); - m_zbuffer.fill(0, cliprect); rectangle clip = cliprect; @@ -1096,8 +1315,8 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, */ if (((m_arena_start != 0x00) && (m_arena_end != 0x00)) && ((m_arena_start != 0xff) && (m_arena_end != 0xff))) { - clip.max_x = m_arena_start - 3; // must be -3 to hide garbage on the right hand side of snowboarder - clip.min_x = m_arena_end - 2; // must be -2 to render a single pixel line of the left border on Mappy remix (verified to render), although this creates a single pixel gap on the left of snowboarder status bar (need to verify) + clip.max_x = (m_arena_start - 3) * m_video_hres_multiplier; // must be -3 to hide garbage on the right hand side of snowboarder + clip.min_x = (m_arena_end - 2) * m_video_hres_multiplier; // must be -2 to render a single pixel line of the left border on Mappy remix (verified to render), although this creates a single pixel gap on the left of snowboarder status bar (need to verify) if (clip.min_x < cliprect.min_x) clip.min_x = cliprect.min_x; @@ -1106,18 +1325,34 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, clip.max_x = cliprect.max_x; } } + bitmap.fill(paldata[0], clip); + m_zbuffer.fill(0, clip); + + return clip; +} - draw_tilemap(screen, bitmap, clip, 1); +void xavix_state::draw_regular_layers(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &clip) +{ draw_tilemap(screen, bitmap, clip, 0); + draw_tilemap(screen, bitmap, clip, 1); // epo_golf requires this layer in front when priorities are equal or menu doesn't show? draw_sprites(screen, bitmap, clip); +} - //popmessage("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", m_soundregs[0],m_soundregs[1],m_soundregs[2],m_soundregs[3],m_soundregs[4],m_soundregs[5],m_soundregs[6],m_soundregs[7],m_soundregs[8],m_soundregs[9],m_soundregs[10],m_soundregs[11],m_soundregs[12],m_soundregs[13],m_soundregs[14],m_soundregs[15]); +uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + rectangle clip = do_arena(screen, bitmap, cliprect); + draw_regular_layers(screen, bitmap, clip); + return 0; +} - // temp, needs priority, transparency etc. also it's far bigger than the screen, I guess it must get scaled?! +void superxavix_state::draw_bitmap_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + const pen_t *paldata = m_palette->pens(); + // incomplete! if (m_bmp_base) { - // looks like it can zoom the bitmap using these? + // screen position for the bitmap? uint16_t top = ((m_bmp_base[0x01] << 8) | m_bmp_base[0x00]); uint16_t bot = ((m_bmp_base[0x03] << 8) | m_bmp_base[0x02]); uint16_t lft = ((m_bmp_base[0x05] << 8) | m_bmp_base[0x04]); @@ -1130,7 +1365,7 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, uint16_t rgtadr = ((m_bmp_base[0x0f] << 8) | m_bmp_base[0x0e]); uint16_t start = ((m_bmp_base[0x11] << 8) | m_bmp_base[0x10]); - uint8_t end = m_bmp_base[0x12]; // ?? related to width? + uint8_t step = m_bmp_base[0x12]; // step value to next line base uint8_t size = m_bmp_base[0x13]; // some kind of additional scaling? uint8_t mode = m_bmp_base[0x14]; // enable,bpp, zval etc. @@ -1138,10 +1373,18 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, if (mode & 0x01) { - popmessage("bitmap t:%04x b:%04x l:%04x r:%04x -- -- ba:%04x la:%04x ra:%04x -- -- end:%02x - size:%02x unused:%08x", - top, bot, lft, rgt, - /*topadr*/ botadr, lftadr, rgtadr, - /*start*/ end, size, unused); + if (0) + { + popmessage("bitmap t:%04x b:%04x l:%04x r:%04x -- -- ta: %04x ba:%04x la:%04x ra:%04x -- -- start %04x (%08x) step:%02x - size:%02x unused:%08x\n", + top, bot, lft, rgt, + topadr, botadr, lftadr, rgtadr, + start, start * 0x800, step, size, unused); + } + + // anpanmdx title screen ends up with a seemingly incorrect value for start + // when it does the scroller. There is presumably an opcode or math bug causing this. + //if (start >= 0x7700) + /// start -= 0x3c00; int base = start * 0x800; int base2 = topadr * 0x8; @@ -1149,51 +1392,108 @@ uint32_t xavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, int bpp = ((mode & 0x0e) >> 1) + 1; int zval = ((mode & 0xf0) >> 4); - int width = (rgtadr * 8) / bpp; + int hposadjust, vpostadjust; + bool is_highres = true; + + // SuperXaviX seems to have CRTC registers (0x6f80 - 0x6faf area), so in reality this probably + // comes from there due to different overall screen positioning; might also depend on bitmap + // bpp mode (so this is probably not the correct way to detect this) + // there could also be XaviX2000+ opcode bugs causing wrong register values! + if ((size & 0x70) == 0x70) + is_highres = false; + + if (is_highres) + hposadjust = 0x90; // good for xavtenni, xavbowl, tmy_thom, tmy_rkmj, but not xavbaseb + else + hposadjust = 0x46; // good for udance, ban_ordj, not quite correct for ban_kksj in demo + + vpostadjust = 0x06; // probably can vary (see XaviX boot-up logos, logo vs text positions) - //int count = 0; + top += vpostadjust; + bot += vpostadjust; for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { int line = y - top; - if ((line > 0) && (y < bot)) + if ((line > 0) && (y < bot)) // should also clip if out of range for botadr { - set_data_address(base + base2 + ((line * width * bpp) / 8), 0); + set_data_address(base + base2 + ((line * (step * 64)) / 8), 0); - for (int x = 0; x < width; x++) + // also needs to take into account 'lftadr' address from the line base + // and clip against 'rgtadr' address if reads go beyond linebase + that for the line + for (int x = lft - hposadjust; x < rgt - hposadjust; x++) { - uint32_t *const yposptr = &bitmap.pix(y); - uint16_t *const zyposptr = &m_zbuffer.pix(y); + uint32_t* const yposptr = &bitmap.pix(y); + uint16_t* const zyposptr = &m_zbuffer.pix(y); uint8_t dat = 0; - for (int i = 0; i < bpp; i++) + + if (m_extra) + { + for (int i = 0; i < bpp; i++) + { + dat |= (get_next_bit_sx() << i); + } + } + else + { + for (int i = 0; i < bpp; i++) + { + dat |= (get_next_bit() << i); + } + } + + int realx; + realx = x; + + if (!is_highres) + realx *= 2; + + if (((realx <= cliprect.max_x) && (realx >= cliprect.min_x)) && ((y <= cliprect.max_y) && (y >= cliprect.min_y))) { - dat |= (get_next_bit() << i); + if ((m_bmp_palram_sh[dat] & 0x1f) < 24) // same transparency logic as everything else? (baseball title) + { + if (zval >= zyposptr[realx]) + { + yposptr[realx] = paldata[dat + 0x100]; + zyposptr[realx] = zval; + } + } } - if (((x <= cliprect.max_x) && (x >= cliprect.min_x)) && ((y <= cliprect.max_y) && (y >= cliprect.min_y))) + // draw doubled pixel for low-res bitmap + if (!is_highres) + realx += 1; + + if (((realx <= cliprect.max_x) && (realx >= cliprect.min_x)) && ((y <= cliprect.max_y) && (y >= cliprect.min_y))) { if ((m_bmp_palram_sh[dat] & 0x1f) < 24) // same transparency logic as everything else? (baseball title) { - if (zval >= zyposptr[x]) + if (zval >= zyposptr[realx]) { - yposptr[x] = paldata[dat + 0x100]; - zyposptr[x] = zval; + yposptr[realx] = paldata[dat + 0x100]; + zyposptr[realx] = zval; } } } + } } } } } +} +uint32_t superxavix_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + rectangle clip = do_arena(screen, bitmap, cliprect); + draw_bitmap_layer(screen, bitmap, clip); // maxheart suggests bitmap is drawn first or you get a black box over the display + draw_regular_layers(screen, bitmap, clip); return 0; } - void xavix_state::spritefragment_dma_params_1_w(offs_t offset, uint8_t data) { m_spritefragment_dmaparam1[offset] = data; @@ -1210,15 +1510,11 @@ void xavix_state::spritefragment_dma_trg_w(uint8_t data) uint16_t src = (m_spritefragment_dmaparam1[1] << 8) | m_spritefragment_dmaparam1[0]; uint16_t dst = (m_spritefragment_dmaparam2[0] << 8); - uint8_t unk = m_spritefragment_dmaparam2[1]; + uint8_t src_block_size = m_spritefragment_dmaparam2[1]; - LOG("%s: spritefragment_dma_trg_w with trg %02x size %04x src %04x dest %04x unk (%02x)\n", machine().describe_context(), data & 0xf8, len, src, dst, unk); + LOG("%s: spritefragment_dma_trg_w with trg %02x size %04x src %04x dest %04x unk (%02x)\n", machine().describe_context(), data & 0xf8, len, src, dst, src_block_size); - if (unk) - { - // tak_chq triggers this, but probably due to bad xavix2000 opcodes, as many things look invalid - logerror("m_spritefragment_dmaparam2[1] != 0x00 (is %02x)\n", m_spritefragment_dmaparam2[1]); - } + src_block_size--; // 0x00 is maximum if (len == 0x00) { @@ -1230,12 +1526,30 @@ void xavix_state::spritefragment_dma_trg_w(uint8_t data) if (data & 0x40) { + int readaddress = 0; + for (int i = 0; i < len; i++) { - //uint8_t dat = m_maincpu->read_full_data_sp(src + i); - uint8_t dat = read_full_data_sp_bypass(src + i); - //m_fragment_sprite[(dst + i) & 0x7ff] = dat; - spriteram_w((dst + i) & 0x7ff, dat); + // tak_chq explicitly sets unk & 0x80 + // and the source data is in 0x80 byte blocks, not 0x100 + // epo_doka uses 0xb4, which seems to confirm this + if ((i & 0xff) > src_block_size) + { + // do nothing, maybe unk is the length of each section to copy? + } + else + { + //uint8_t dat = m_maincpu->read_full_data_sp(src + i); + const offs_t realaddress = src + readaddress; + uint8_t dat; + if (m_disable_memory_bypass) + dat = m_maincpu->space(AS_PROGRAM).read_byte(realaddress); + else + dat = read_full_data_sp_bypass(realaddress); + //m_fragment_sprite[(dst + i) & 0x7ff] = dat; + spriteram_w((dst + i) & 0x7ff, dat); + readaddress++; + } } } } diff --git a/src/mame/ussr/pk32.cpp b/src/mame/ussr/pk32.cpp index 2471628e880..690e85c743f 100644 --- a/src/mame/ussr/pk32.cpp +++ b/src/mame/ussr/pk32.cpp @@ -2,6 +2,57 @@ // copyright-holders:Andrei I. Holub /********************************************************************** Elektronika PK-32 + +* Terminal Commands: +E <memoryType> <address> (E)xamine + <memoryType>: /G - General purpose reg, /S - System mem, /I - Internal reg, /P - Phisical mem, /V - Virtual mem + Example: E /S 0 +D <memoryType> <address> <value> (D)eposit + <memoryType>: see E + Example: D /S 0 44332211 +C (C)ontinue user programm +B (B)oot +T [<num>] (T)est All or <num>=1-6 +I (I)nit + + +* Sample User Program: +2000: MOVB #20,R0 | 908f2050 +2004: MOVL #23,R6 | d08f2300000056 +200B: MOVL #22,R7 | d08f2200000057 +2012: MFPR R7,R8 | db5758 +2015: BITB #80,R8 | 938f8058 +2019: BEQL 2012 | 13f7 +201B: NOP | 01 +201C: NOP | 01 +201D: NOP | 01 +201E: MTPR R0,R6 | da5056 +2021: INCB R0 | 9650 +2023: BICB2 #C0,R0 | 8a8fc050 +2027: BISB2 #30,R0 | 888f3050 +202B: BRB 2012 | 11e5 + +** Use terminal: +D 2000 50208F90 +D 2004 00238FD0 +D 2008 D0560000 +D 200C 0000228F +D 2010 57DB5700 +D 2014 808F9358 +D 2018 01f71358 +D 201C 50DA0101 +D 2020 8A509656 +D 2024 8850C08f +D 2028 1150308f +D 202C 010101E5 +D /G F 2000 +C + +** Or MAME debugger: +d@2000=50208F90 +... +pc=2000 + **********************************************************************/ #include "emu.h" @@ -48,6 +99,7 @@ private: void pk32_map_ram(address_map &map) ATTR_COLD; void pk32_map_io(address_map &map) ATTR_COLD; + memory_access<24, 0, 0, ENDIANNESS_LITTLE>::specific m_program; required_device<kl1839vm1_device> m_maincpu; required_device<ram_device> m_ram; required_device<generic_terminal_device> m_terminal; @@ -64,6 +116,7 @@ private: u8 m_term_data = 0; u16 m_term_status = 0; + }; @@ -104,6 +157,13 @@ void pk32_state::term_tx_cs_w(u32 data) LOGTERM("TX CS <- %X\n", data); } +void pk32_state::kbd_put(u8 data) +{ + m_term_data = data; + m_term_status = 0xff; +} + + void pk32_state::pk32_map_microcode(address_map &map) { map(0x0000, 0x3fff).rom().region("microcode", 0); @@ -145,15 +205,11 @@ static INPUT_PORTS_START( pk32 ) PORT_CONFSETTING(0x80, "Accelerator ON") INPUT_PORTS_END -void pk32_state::kbd_put(u8 data) -{ - m_term_data = data; - m_term_status = 0xff; -} - void pk32_state::machine_start() { + m_maincpu->space(AS_PROGRAM).specific(m_program); + save_item(NAME(m_term_data)); save_item(NAME(m_term_status)); } @@ -182,14 +238,14 @@ ROM_START(pk32) ROM_REGION32_BE(0x10000, "microcode", ROMREGION_ERASE00) ROM_DEFAULT_BIOS("v1") - ROM_SYSTEM_BIOS(0, "v1", "1839src)") - ROMX_LOAD("fw-1839-src.bin", 0x0000, 0x10000, CRC(78c4d298) SHA1(eb3828718991968b4121e6819ae4c6859a8a3a5a), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(0, "v1", "1839src") + ROMX_LOAD("fw-1839-src.bin", 0x00000, 0x10000, CRC(78c4d298) SHA1(eb3828718991968b4121e6819ae4c6859a8a3a5a), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "v2", "1839isa") - ROMX_LOAD("fw-1839-isa.bin", 0x0000, 0x10000, CRC(180930a7) SHA1(dbcc7d665d28011b9c2beba3cc0e4073f34d7fc6), ROM_BIOS(1)) + ROMX_LOAD("fw-1839-isa.bin", 0x00000, 0x10000, CRC(180930a7) SHA1(dbcc7d665d28011b9c2beba3cc0e4073f34d7fc6), ROM_BIOS(1)) ROM_SYSTEM_BIOS(2, "v3", "1839pe1") - ROMX_LOAD("fw-1839pe1-006.bin", 0x0000, 0x10000, CRC(e6bb7639) SHA1(759993afc9b61d9cf83acf3e361dcec571beccf1), ROM_BIOS(2)) + ROMX_LOAD("fw-1839pe1-006.bin", 0x00000, 0x10000, CRC(e6bb7639) SHA1(759993afc9b61d9cf83acf3e361dcec571beccf1), ROM_BIOS(2)) ROM_END diff --git a/src/mame/vsystem/gstriker.cpp b/src/mame/vsystem/gstriker.cpp index 79220645abd..be9751a8cc8 100644 --- a/src/mame/vsystem/gstriker.cpp +++ b/src/mame/vsystem/gstriker.cpp @@ -184,6 +184,7 @@ Frequencies: 68k is XTAL_32MHZ/2 #include "cpu/m68000/m68000.h" #include "cpu/z80/z80.h" #include "machine/6850acia.h" +#include "machine/clock.h" #include "machine/gen_latch.h" #include "machine/mb3773.h" #include "sound/ymopn.h" @@ -691,8 +692,14 @@ void gstriker_state::gstriker(machine_config &config) ACIA6850(config, m_acia, 0); m_acia->irq_handler().set_inputline(m_maincpu, M68K_IRQ_2); - //m_acia->txd_handler().set("link", FUNC(rs232_port_device::write_txd)); - //m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts)); + m_acia->txd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); // loopback for now + + // DE-9 port + // slave sends 0xca, master receives it and sends a 0x0d ACK back. + // writing latter to $200063 while in slave mode will pass the serial check + clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 64)); // assume ~19200 baud + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); } void gstriker_state::twc94(machine_config &config) |