summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--hash/megadriv.xml187
-rw-r--r--hash/pc98_cd.xml883
-rw-r--r--scripts/src/video.lua12
-rw-r--r--scripts/target/mame/arcade.lua1
-rw-r--r--src/devices/bus/megadrive/md_carts.cpp1
-rw-r--r--src/devices/bus/megadrive/md_slot.cpp1
-rw-r--r--src/devices/bus/megadrive/md_slot.h1
-rw-r--r--src/devices/bus/megadrive/rom.cpp23
-rw-r--r--src/devices/bus/megadrive/rom.h13
-rw-r--r--src/devices/cpu/adsp2100/2100ops.hxx8
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp4
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.h5
-rw-r--r--src/devices/cpu/sparc/mb86901.cpp216
-rw-r--r--src/devices/cpu/sparc/sparc.h36
-rw-r--r--src/devices/cpu/sparc/sparcdefs.h34
-rw-r--r--src/devices/machine/8530scc.cpp162
-rw-r--r--src/devices/machine/8530scc.h3
-rw-r--r--src/devices/video/zeus2.cpp1311
-rw-r--r--src/devices/video/zeus2.h286
-rw-r--r--src/mame/audio/dcs.cpp59
-rw-r--r--src/mame/audio/dcs.h4
-rw-r--r--src/mame/drivers/atlantis.cpp358
-rw-r--r--src/mame/drivers/midzeus.cpp14
-rw-r--r--src/mame/drivers/pc9801.cpp2
-rw-r--r--src/mame/drivers/poker72.cpp113
-rw-r--r--src/mame/drivers/sun4.cpp334
-rw-r--r--src/mame/includes/midzeus.h2
-rw-r--r--src/mame/includes/midzeus2.h5
-rw-r--r--src/mame/layout/dlair.lay102
29 files changed, 3565 insertions, 615 deletions
diff --git a/hash/megadriv.xml b/hash/megadriv.xml
index 95e4295fac9..aa1fb105e2d 100644
--- a/hash/megadriv.xml
+++ b/hash/megadriv.xml
@@ -57,7 +57,7 @@ Known undumped protos
Known undumped pirates
* Tec Toy Mega Drive 3 (with 86 built in games)
- * Chinese Checkers (by RealTec)
+ * Chinese Checkers (by RealTec) - 中國象棋 ?
* Shizen Mahjong / Competition Mahjong (by Sachen, apparently dumped but hoarded)
* Magic 7 Block - 百変七巧板
* Chinese Battle Chess (?) - 戦 棊
@@ -9717,10 +9717,10 @@ but dumps still have to be confirmed.
-->
<software name="13mahjan">
- <description>13 Ma Jiang - 98 Mei Shao Nu Pian (Chi)</description>
+ <description>13 Ma Jiang - 98 Mei Shao Nu (Chi)</description>
<year>1998</year>
<publisher>BBD</publisher>
- <info name="alt_title" value="十三張麻將 98'美少女篇"/>
+ <info name="alt_title" value="十三張麻將 98'美少女"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="655360">
<rom name="13 mahjong 98 (unl).bin" size="655360" crc="68b372f6" sha1="af19eb952bff78178ae3d31ed48b3fc5c7010dea" offset="0x000000"/>
@@ -9750,16 +9750,31 @@ but dumps still have to be confirmed.
</part>
</software>
- <software name="16zhan">
- <description>16 Zhang Ma Jiang (Chi)</description>
+ <software name="16mj">
+ <description>Shi Liu Zhang Ma Jiang (Chi)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>City Man</publisher>
+ <info name="alt_title" value="十六張麻將"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="16 zhang ma jiang (chi) (unl).bin" size="1048576" crc="36407c82" sha1="7857c797245b52641a3d1d4512089bccb0ed5359" offset="0x000000"/>
</dataarea>
</part>
</software>
+
+ <software name="16mj2">
+ <description>Shi Liu Zhang Ma Jiang II</description>
+ <year>199?</year>
+ <publisher>City Man</publisher>
+ <info name="serial" value="GM-95003"/>
+ <info name="alt_title" value="十六張麻將II"/>
+ <part name="cart" interface="megadriv_cart">
+ <feature name="slot" value="rom_16mj2"/>
+ <dataarea name="rom" width="16" endianness="big" size="1048576">
+ <rom name="16 tiles mahjong ii (unl).bin" size="1048576" crc="b4f4249f" sha1="c5278d513ac7b627319bdcb840af216d0fc60f4c" offset="0x000000"/>
+ </dataarea>
+ </part>
+ </software>
<software name="3ninja">
<description>3 Ninjas Kick Back (USA)</description>
@@ -10095,9 +10110,10 @@ but dumps still have to be confirmed.
</software>
<software name="adveboy">
- <description>Adventurous Boy - Mao Xian Xiao Zi (Chi)</description>
+ <description>Adventurous Boy - Mao Xian Xiao Zi (Tw)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Gamtec</publisher>
+ <info name="alt_title" value="冒險小子"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="adventurous boy - mao xian xiao zi (chi) (unl).bin" size="524288" crc="d4403913" sha1="f6e5bba7254f7f73a007f234f1001ddcb0b62484" offset="0x000000"/>
@@ -10449,10 +10465,11 @@ but dumps still have to be confirmed.
</part>
</software>
- <software name="aqrenk">
- <description>Aq Renkan Awa (Chi)</description>
+ <software name="aqlian">
+ <description>A Q Lian Huan Pao (Tw)</description>
<year>1995</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="阿Q連環泡"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="aq renkan awa (chi) (unl).bin" size="1048576" crc="2c6cbd77" sha1="fcd1c7fcfb9027ae7baad9c67847ef5f1090991a" offset="0x000000"/>
@@ -11076,9 +11093,10 @@ but dumps still have to be confirmed.
</software>
<software name="barver">
- <description>Barver Battle Saga - Tai Kong Zhan Shi (Chi)</description>
+ <description>Barver Battle Saga - Tai Kong Zhan Shi - Mo Fa Zhan Shi (Chi)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="太空戰士 魔法戰士"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="2097152">
@@ -11616,7 +11634,7 @@ but dumps still have to be confirmed.
</software>
<software name="btomato">
- <description>Bill's Tomato Adventure (Prototype)</description>
+ <description>Bill's Tomato Game (Prototype)</description>
<year>199?</year>
<publisher>Psygnosis</publisher>
<part name="cart" interface="megadriv_cart">
@@ -12284,6 +12302,7 @@ but dumps still have to be confirmed.
<description>Chao Ji Da Fu Weng (Chi)</description>
<year>199?</year>
<publisher>Gametec?</publisher>
+ <info name="alt_title" value="超級大富翁"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -12430,9 +12449,10 @@ but dumps still have to be confirmed.
</software>
<software name="chinesec">
- <description>Chinese Chess</description>
+ <description>Zhong Guo Xiang Qi - Chinese Chess (Tw)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="中國象棋"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="chinese chess (unl).bin" size="524288" crc="475215a0" sha1="3907bf058493e7b9db9720493030f0284797908c" offset="0x000000"/>
@@ -13947,10 +13967,11 @@ but dumps still have to be confirmed.
</part>
</software>
- <software name="dialqo">
- <description>Dial Q o Mawase! (Jpn)</description>
+ <software name="dialq">
+ <description>Dial Q Mahjang Club (Jpn)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="ダイヤルQをまわせ ~ Dial Q o Mawase! / 究極麻雀 ~ Jiuji Maque (Box?)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="dial q o mawase! (jpn) (unl).bin" size="1048576" crc="c632e5af" sha1="08967e04d992264f193ecdfd0e0457baaf25f4f2" offset="0x000000"/>
@@ -15400,7 +15421,8 @@ but dumps still have to be confirmed.
<software name="fengkuan">
<description>Feng Kuang Tao Hua Yuan (Chi)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Creaton</publisher>
+ <info name="alt_title" value="瘋狂桃花源"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_mjlov"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -15412,7 +15434,8 @@ but dumps still have to be confirmed.
<software name="fengkuan1" cloneof="fengkuan">
<description>Feng Kuang Tao Hua Yuan (Chi, Unprotected)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Creaton</publisher>
+ <info name="alt_title" value="瘋狂桃花源"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="feng kuang tao hua yuan (chi) (unl).bin" size="1048576" crc="8d40d64f" sha1="0330611a5fcb1f3ca173fcb3387fd35b865f1131" offset="0x000000"/>
@@ -15424,6 +15447,7 @@ but dumps still have to be confirmed.
<description>Feng Shen Ying Jie Chuan (Chi)</description>
<year>1996</year>
<publisher>Chuanpu Technologies</publisher>
+ <info name="alt_title" value="封神英傑傳"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="feng shen ying jie chuan (chi) (unl).bin" size="2097152" crc="6a382b60" sha1="7a6e06846a94df2df2417d6509e398c29354dc68" offset="0x000000"/>
@@ -15435,6 +15459,7 @@ but dumps still have to be confirmed.
<description>Feng Shen Ying Jie Zhuan (Chi, Alt?)</description>
<year>1996</year>
<publisher>Chuanpu Technologies</publisher>
+ <info name="alt_title" value="封神英傑傳"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="2097152">
@@ -16507,10 +16532,12 @@ but dumps still have to be confirmed.
</part>
</software>
- <software name="heitao">
- <description>Hei Tao 2 - Super Big 2 (Chi)</description>
+ <software name="heitao2">
+ <description>Hei Tao 2 - Super Big 2 (Tw)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>King Tec</publisher>
+ <info name="serial" value="GM-95301"/>
+ <info name="alt_title" value="黑桃2 大老二 ~ Hei Tao 2 - Da Lao Er (Box)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="hei tao 2 - super big 2 (chi) (unl).bin" size="1048576" crc="31449113" sha1="e1e4c439c5c22fa5cfcecaab421c55bf1746b5de" offset="0x000000"/>
@@ -18167,6 +18194,7 @@ but dumps still have to be confirmed.
<description>Ma Qiao E Mo Ta - Devilish Mahjong Tower (Chi)</description>
<year>1994</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="麻雀惡魔塔"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="ma qiao e mo ta - devilish mahjong tower (chi) (unl).bin" size="1048576" crc="12e35994" sha1="84e8bf546283c73396e40c4cfa05986ebeb123bb" offset="0x000000"/>
@@ -18816,7 +18844,9 @@ but dumps still have to be confirmed.
<software name="menghu">
<description>Meng Huan Shui Guo Pan - 777 Casino (Chi)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>City Man</publisher>
+ <info name="serial" value="GM-95002"/>
+ <info name="alt_title" value="夢幻水果盤"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="meng huan shui guo pan - 777 casino (chi) (unl).bin" size="1048576" crc="42dc03e4" sha1="df20a28d03a2cd481af134ef7602062636c3cc79" offset="0x000000"/>
@@ -22595,6 +22625,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Queen of Poker Club (Tw)</description>
<year>199?</year>
<publisher>Sachen</publisher>
+ <info name="alt_title" value="撲克俱樂部 Poker 6 in 1 ~ Poker Club Poker 6 in 1 (Box)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="poker club (sachen).bin" size="1048576" crc="ae28d9eb" sha1="600c9b234f2559b6d101a111f7033088bd701a5d" offset="0x000000"/>
@@ -23609,6 +23640,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>San Guo Zhi V (Chi)</description>
<year>199?</year>
<publisher>SKOB</publisher>
+ <info name="alt_title" value="三國志V"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="san guo zhi v (chi) (unl).bin" size="2097152" crc="cd7e53d0" sha1="1a3333983f40dd242ad86187e50d1abed68d5ae9" offset="0x000000"/>
@@ -23895,9 +23927,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="shijie">
- <description>Shi Jie Zhi Bang Zheng Ba Zhan - World Pro Baseball 94 (Chi)</description>
+ <description>Jin Guan Jun Xiong Di Xiang - Shi Jie Zhi Bang Zheng Ba Zhan (Chi)</description>
<year>1994</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="金冠軍兄弟象 世界职棒争霸战"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="shi jie zhi bang zheng ba zhan - world pro baseball 94 (chi) (unl).bin" size="2097152" crc="72dd884f" sha1="d05c770312feec38c45b910ad09204b87961c01a" offset="0x000000"/>
@@ -24190,6 +24223,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Shui Hu - Feng Yun Zhuan (Chi)</description>
<year>1999</year>
<publisher>Never Ending Soft Team</publisher>
+ <info name="alt_title" value="水滸 風雲傳"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="shui hu - feng yun zhuan (chi) (unl).bin" size="2097152" crc="3e9e010c" sha1="7ac1b7a9e36dde9a03b3d0861b473ac9e1324175" offset="0x000000"/>
@@ -24201,6 +24235,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Shui Hu Zhuan (Chi)</description>
<year>1996</year>
<publisher>Chuanpu Technologies</publisher>
+ <info name="alt_title" value="水滸傳"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="shui hu zhuan (chi) (unl).bin" size="2097152" crc="61e458c3" sha1="f58c522bd0629833d3943ef4091c3c349c134879" offset="0x000000"/>
@@ -26723,6 +26758,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Taiwan Daheng (Chi)</description>
<year>1994</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="台灣大亨"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="1048576">
<rom name="taiwan daheng (chi) (unl).bin" size="1048576" crc="baf20f81" sha1="88726c11e5ed7927830bf5ae0b83d85dfff4a2a4" offset="0x000000"/>
@@ -27828,9 +27864,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="tunshi">
- <description>Tun Shi Tian Di III (China, Simple Chinese)</description>
+ <description>Tun Shi Tian Di III (Chi, Simple Chinese)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="吞食天地III"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="tun shi tian di iii (chi) (simple chinese) (unl).bin" size="2097152" crc="ea57b668" sha1="7040e96c053f29c75cf0524ddb168a83d0fb526f" offset="0x000000"/>
@@ -27842,6 +27879,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Tun Shi Tian Di III (Chi)</description>
<year>199?</year>
<publisher>SKOB</publisher>
+ <info name="alt_title" value="吞食天地III"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="tun shi tian di iii (chi) (unl).bin" size="2097152" crc="b23c4166" sha1="534bf8f951ee30d47df18202246245b998c0eced" offset="0x000000"/>
@@ -29980,6 +30018,8 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Wu Kong Wai Zhuan (Chi)</description>
<year>1996</year>
<publisher>Ming</publisher>
+ <info name="serial" value="GM-95701"/>
+ <info name="alt_title" value="悟空外傳"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_yasech"/>
<dataarea name="rom" width="16" endianness="big" size="2097152">
@@ -29994,6 +30034,8 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Wu Kong Wai Zhuan (Chi, Unprotected)</description>
<year>1996</year>
<publisher>Ming</publisher>
+ <info name="serial" value="GM-95701"/>
+ <info name="alt_title" value="悟空外傳"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_sram"/>
<dataarea name="rom" width="16" endianness="big" size="2097152">
@@ -30301,9 +30343,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="xiaomo">
- <description>Xiao Monv - Magic Girl (Chi)</description>
+ <description>Xiao Monv - Magic Girl (Tw)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Gamtec</publisher>
+ <info name="alt_title" value="小魔女"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="xiao monv - magic girl (chi) (unl).bin" size="524288" crc="8e49a92e" sha1="22a48404e77cab473ee65e5d5167d17c28884a7a" offset="0x000000"/>
@@ -30323,26 +30366,28 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="xinqig1" cloneof="beggarp">
- <description>Xin Qi Gai Wang Zi (Chi, Alt)</description>
+ <software name="xinqig" cloneof="beggarp">
+ <description>Xin Qi Gai Wang Zi (Chi)</description>
<year>1996</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="新乞丐王子"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_xinqig"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="xin qi gai wang zi (chi) (alt) (unl).bin" size="4194304" crc="da5a4bfe" sha1="75f8003a6388814c1880347882b244549da62158" offset="0x000000"/>
+ <rom name="xin qi gai wang zi (chi) (unl).bin" size="4194304" crc="dd2f38b5" sha1="4a7494d8601149f43ba7e3595a0b2340cde2e9ba" offset="0x000000"/>
</dataarea>
</part>
</software>
-
- <software name="xinqig" cloneof="beggarp">
- <description>Xin Qi Gai Wang Zi (Chi)</description>
+
+ <software name="xinqig1" cloneof="beggarp">
+ <description>Xin Qi Gai Wang Zi (Chi, Alt)</description>
<year>1996</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="新乞丐王子"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_xinqig"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="xin qi gai wang zi (chi) (unl).bin" size="4194304" crc="dd2f38b5" sha1="4a7494d8601149f43ba7e3595a0b2340cde2e9ba" offset="0x000000"/>
+ <rom name="xin qi gai wang zi (chi) (alt) (unl).bin" size="4194304" crc="da5a4bfe" sha1="75f8003a6388814c1880347882b244549da62158" offset="0x000000"/>
</dataarea>
</part>
</software>
@@ -30350,8 +30395,9 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<software name="yasech">
<description>Ya Se Chuan Shuo (Chi)</description>
<year>1995</year>
- <publisher>Chuanpu Technologies</publisher>
- <info name="alt_title" value="亚瑟传说"/>
+ <publisher>Ming</publisher>
+ <info name="serial" value="GM-95403"/>
+ <info name="alt_title" value="亚瑟传说 / 帝國王朝 (亞瑟傳說篇) ~ Di Guo Wang Chao (Ya Se Chuan Shuo Pian) [Box]"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_yasech"/>
<dataarea name="rom" width="16" endianness="big" size="2097152">
@@ -30364,6 +30410,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Yang Jia Jiang - Yang Warrior Family (Chi)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="楊家將"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="yang jia jiang - yang warrior family (chi) (unl).bin" size="2097152" crc="6604a79e" sha1="6fcc3102fc22b42049e6eae9a1c30c8a7f022d14" offset="0x000000"/>
@@ -30523,7 +30570,8 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<software name="zhuogu">
<description>Zhuo Gui Da Shi - Ghost Hunter (Chi)</description>
<year>1994</year>
- <publisher>Shenchi Technology</publisher>
+ <publisher>Senchi Technology</publisher>
+ <info name="alt_title" value="Zool - Ninja of the &quot;Nth&quot; Dimension (Box)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="zhuo gui da shi - ghost hunter (chi) (unl).bin" size="524288" crc="76c62a8b" sha1="3424892e913c20754d2e340c6e79476a9eb6761b" offset="0x000000"/>
@@ -30728,18 +30776,6 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="16mj2">
- <description>16 Tiles Mahjong II</description>
- <year>199?</year>
- <publisher>Gamtec</publisher>
- <part name="cart" interface="megadriv_cart">
- <feature name="slot" value="rom_16mj2"/>
- <dataarea name="rom" width="16" endianness="big" size="1048576">
- <rom name="16 tiles mahjong ii (unl).bin" size="1048576" crc="b4f4249f" sha1="c5278d513ac7b627319bdcb840af216d0fc60f4c" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
<software name="bugslife">
<description>A Bug's Life</description>
<year>199?</year>
@@ -30827,7 +30863,9 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<software name="huanle">
<description>Huan Le Tao Qi Shu - Smart Mouse (Chi)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Ming</publisher>
+ <info name="serial" value="GM-95401"/>
+ <info name="alt_title" value="歡樂淘氣鼠"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_smouse"/>
<dataarea name="rom" width="16" endianness="big" size="524288">
@@ -30874,9 +30912,11 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="supmagic">
- <description>Linghuan Daoshi Super Magician (Chi)</description>
+ <description>Ling Huan Dao Shi - Super Magician (Chi)</description>
<year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <publisher>Ming</publisher>
+ <info name="serial" value="GM-95402"/>
+ <info name="alt_title" value="靈幻道士"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_elfwor"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -30911,10 +30951,11 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="majian">
- <description>Ma Jiang Qing Ren - Ji Ma Jiang Zhi (Chi)</description>
+ <software name="majianqr">
+ <description>Ji Ma Jiang Zhi - Ma Jiang Qing Ren (Chi)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="姬麻將之 麻將情人"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_mjlov"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -30923,10 +30964,11 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="majiana" cloneof="majian">
+ <software name="majianqra" cloneof="majianqr">
<description>Ma Jiang Qing Ren - Ji Ma Jiang Zhi (Chi, Alt)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="姬麻將之 麻將情人"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_mjlov"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -31056,10 +31098,11 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="mjclub">
- <description>Super Mahjong Club</description>
- <year>199?</year>
- <publisher>&lt;unlicensed&gt;</publisher>
+ <software name="mhpoker">
+ <description>Du Shen Zhi Meng Huan Puke</description>
+ <year>1995</year>
+ <publisher>Creaton</publisher>
+ <info name="alt_title" value="赌神之梦幻扑克"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_mjlov"/>
<dataarea name="rom" width="16" endianness="big" size="1048576">
@@ -31105,9 +31148,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="redcliff">
- <description>The Battle of Red Cliffs - Romance of the Three Kingdoms</description>
+ <description>San Guo Yan Yi - Huo Shao Chi Bi (Tw)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="三國演義 火燒赤壁"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_redcl"/>
<dataarea name="rom" width="16" endianness="big" size="2097158">
@@ -31117,9 +31161,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="redcliffa" cloneof="redcliff">
- <description>The Battle of Red Cliffs - Romance of the Three Kingdoms (Hacked out Protection?)</description>
+ <description>San Guo Yan Yi - Huo Shao Chi Bi (Tw, Hacked out Protection?)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
+ <info name="alt_title" value="三國演義 火燒赤壁"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="2097152">
<rom name="the battle of red cliffs (unl).bin" size="2097152" crc="63eca090" sha1="648c04365610084d76c9a2b1b0b07031ca84897d" offset="00000"/>
@@ -31143,10 +31188,11 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<!-- Dump with CRC a2ef16de is hacked to bypass protection. If you found it on a real cart, please let us know. -->
<software name="tbolt2">
- <description>Thunderbolt II (Unl)</description>
+ <description>Lei Dian II - Thunderbolt II (Unl)</description>
<year>199?</year>
<publisher>Sun Green</publisher>
- <info name="alt_title" value="雷電伝説II"/>
+ <info name="serial" value="GM-95201"/>
+ <info name="alt_title" value="雷電伝説II ~ Lei Dian Chuan Shuo II (Box) / 雷電II"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_smouse"/>
<dataarea name="rom" width="16" endianness="big" size="524288">
@@ -31227,10 +31273,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</software>
<software name="suppoker">
- <description>Super Poker (Chi)</description>
+ <description>Chaoji Puke (Tw)</description>
<year>199?</year>
<publisher>&lt;unlicensed&gt;</publisher>
- <info name="alt_title" value="Cha Oji Pu Ke"/>
+ <info name="alt_title" value="超級撲克 ~ Super Poker"/>
<part name="cart" interface="megadriv_cart">
<feature name="slot" value="rom_smouse"/>
<dataarea name="rom" width="16" endianness="big" size="4194304">
@@ -31299,6 +31345,19 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</dataarea>
</part>
</software>
+
+ <software name="jujimj2">
+ <description>Ju Ji Ma Jiang II</description>
+ <year>199?</year>
+ <publisher>Sun Green</publisher>
+ <info name="serial" value="GM-95001"/>
+ <info name="alt_title" value="究極麻將II"/>
+ <part name="cart" interface="megadriv_cart">
+ <dataarea name="rom" width="16" endianness="big" size="1048576">
+ <rom name="pretty girl mahjongg (Ch).bin" size="1048576" crc="69f24500" sha1="0b4f63b8de2dcc4359a26c3ff21f910f206b6110" offset="0x000000"/>
+ </dataarea>
+ </part>
+ </software>
<software name="truco96">
<description>Truco '96 (Arg)</description>
@@ -31374,6 +31433,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Magic Bubble</description>
<year>1993</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="魔法氣泡 ~ Mo Fa Qi Pao (Cart)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="magic_bubble.bin" size="524288" crc="3ec61dc1" sha1="134086c458e20eee1ab614e2df64083942311e8c" offset="0x000000"/>
@@ -31385,6 +31445,7 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<description>Magic Bubble (Alt)</description>
<year>1993</year>
<publisher>C&amp;E</publisher>
+ <info name="alt_title" value="魔法氣泡 ~ Mo Fa Qi Pao (Cart)"/>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="524288">
<rom name="magic bubble [a1].bin" size="524288" crc="503e0718" sha1="de8037a8cea321ca3f0c03b7a4c36b9fa3b67be2" offset="0x000000"/>
diff --git a/hash/pc98_cd.xml b/hash/pc98_cd.xml
new file mode 100644
index 00000000000..4ed77ab3d70
--- /dev/null
+++ b/hash/pc98_cd.xml
@@ -0,0 +1,883 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+<softwarelist name="pc98_cd" description="NEC PC-9801 CD-ROMs">
+
+ <!--
+
+ Partial list of PC-9801/PC-9821 CD-ROMs.
+
+ Floppy disks are also included where needed. They are attached to the floppy_5_25 interface
+ for convenience, as the PC-98x1 driver always emulates 5.25" drives. This isn't realistic,
+ though, as CD-ROM software was generally released very late in the life of the plaform,
+ when 3.5" floppies were much more common.
+
+ -->
+
+ <software name="aitd2">
+ <!--
+ Origin: redump.org
+ <rom name="Alone in the Dark 2 (Japan) (Track 01).bin" size="19051200" crc="4fe30d1a" sha1="589986149c46c783e3259e242e3ff48d8eef4d65"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 02).bin" size="11917584" crc="e7097db2" sha1="db3bfa5ad614371fce41daa8c3c35179ca35c27c"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 03).bin" size="20276592" crc="c9766b0f" sha1="494eba2b4cffeb1ca74d845ba9be4c890416aaf6"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 04).bin" size="18423216" crc="53c24ed1" sha1="e722b8d1f276fb9b46376310a28488dcfdb61119"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 05).bin" size="17611776" crc="9e5ae663" sha1="186599ed278d3d0c720b36a43e6f0ffa67f5a4b9"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 06).bin" size="13446384" crc="befdeed5" sha1="d4a3f4b3e58bbd69c9e9a6695103fc73cd4bbbad"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 07).bin" size="12432672" crc="017d7845" sha1="2403f33732a793f0a7859c0d42331899f74f8b07"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 08).bin" size="15469104" crc="5af4755a" sha1="0c741cde9b4fc307fe244325340102afe113ae41"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 09).bin" size="21153888" crc="6b82aa33" sha1="a097f62b34899916f1c582b7cde6da24bf9738eb"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 10).bin" size="5597760" crc="824cfb0d" sha1="0d42c77be1c5c6f007b0021e7ff761b64787fd6e"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 11).bin" size="3099936" crc="8fd76886" sha1="0db75ee4ff5321ca97d006052e38c03294bd33dd"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 12).bin" size="3986640" crc="16fbe588" sha1="3a8ae4244d44550b1693f0be22f23484b8871b20"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 13).bin" size="18627840" crc="e4afc9ae" sha1="038f5e12fb4e3ce213fb5da85edf1fa0f0b90948"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 14).bin" size="7013664" crc="81725b80" sha1="ef0852222edca7923a57b58d0d98649f645be092"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 15).bin" size="4043088" crc="f23fc01e" sha1="ffdb6a53ffceccfc0fec0c58bf2608bc6f89e247"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 16).bin" size="13719216" crc="cdc0bd82" sha1="93128d80b254ffa587e40d147e4c6fa055f7575c"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 17).bin" size="18830112" crc="2be9ea3b" sha1="cec550c9f29b5b72c1073149f1ab3f4c930be456"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 18).bin" size="18966528" crc="d7f4e04a" sha1="eb9ebd787537bb08dbb831b30607faa8476222fe"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 19).bin" size="14083776" crc="b00c8a3d" sha1="f7714ef41f102495d3a8b79120dfa86e2123ff96"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 20).bin" size="14151984" crc="50ffef97" sha1="446053407a31f3ed16679129097181d9c91fada1"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 21).bin" size="18601968" crc="9e6d3bff" sha1="76a33aa494c9271bb31ecaea7cb2d863870995e6"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 22).bin" size="31592064" crc="26209034" sha1="3076d6349f2939c56a513786b2b0aa5eb801224a"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 23).bin" size="4823952" crc="774f1553" sha1="2e7b4a0ec70c8e9e7c46c1d9da92c8c9fe10a814"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 24).bin" size="4217136" crc="da6604d2" sha1="037971b04e7fd8cfaa8e23e6a8e17be434e3ec1a"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 25).bin" size="5564832" crc="e1db16ca" sha1="191b82193d11433f0cf58ad3760f7cbfb66ce695"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 26).bin" size="3920784" crc="7ca387e0" sha1="72dca429d64f7ea9b896148457fc73d263e79a8b"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 27).bin" size="802032" crc="c0921a26" sha1="d3a85a31ab1427a2894911f4462ac0922af5d15e"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 28).bin" size="3798480" crc="a4bac07d" sha1="c80489c8408dfd94bb1269742e4f3d14b2ecb015"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 29).bin" size="3600912" crc="59a2bf73" sha1="ff5f9691c6850fd82d88facc1675614ca21a4fd7"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 30).bin" size="4033680" crc="9c968283" sha1="a740bce21c1111ca431538355baba76a92bd5171"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 31).bin" size="3553872" crc="6c76741e" sha1="02ab995cf119fd849ec07d2433bb1a16728fb929"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 32).bin" size="3149328" crc="c1fbadcc" sha1="42d37ae4a4a354ad8baca48931bc7230b90b3bc6"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 33).bin" size="3161088" crc="de41b290" sha1="1edec6a6eb372f8cb33cebee00dfd78daab5818e"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 34).bin" size="4125408" crc="909e6357" sha1="9eb94041c555862ec2874dabc7eb879bc4975969"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 35).bin" size="2681280" crc="faad0ff0" sha1="38e5f1228952f2b64977e472b9260a7c4c6ec7d3"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 36).bin" size="936096" crc="226d0666" sha1="0dbaee8d971ced2916ec60524ff38fc6114a2a37"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 37).bin" size="5588352" crc="0dd900d2" sha1="9bc29a686fc0d3e0929d10b4ba9007210a421ffc"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 38).bin" size="4718112" crc="61177ee7" sha1="ff430611656f722ccb333717d531750b246d373e"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 39).bin" size="4405296" crc="9ba82903" sha1="9bec630cdfb213c10e729de6d68074daa3dca57f"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 40).bin" size="3685584" crc="9eadb5de" sha1="11f33535ada08a52391c59cd1715714068c274d0"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 41).bin" size="1629936" crc="e0e1be53" sha1="5f14174595868a7bd6338f5c57cf784cd4cdb3fd"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 42).bin" size="4252416" crc="b1ed08a1" sha1="85191a0a16aad6aae7f82ef4b20347fcca3e77d1"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 43).bin" size="4097184" crc="11bcd694" sha1="7f40411a8e93473e61bbd36c637ce9938faa2477"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 44).bin" size="3845520" crc="ee808569" sha1="452bb58351ce78e3135fbc4c201e08b8b2a8e3af"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 45).bin" size="1867488" crc="459033ff" sha1="48fc1fbf3848555d7230ce7c59064a32fe00ad9c"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 46).bin" size="2326128" crc="b04530b3" sha1="81929deeca7a0cec06fb04ccf5526d59fe49c156"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 47).bin" size="5618928" crc="46a4d3f1" sha1="62e79f7f877b4d08b7c114390429dc19f900a15a"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 48).bin" size="4391184" crc="2a2f16f5" sha1="5acf2ae9e9fe1984b1d865ae5276afea71a717ad"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 49).bin" size="2222640" crc="115e7d3e" sha1="a342da289d70f7b650f07858ff292c7268019cb0"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 50).bin" size="5934096" crc="d3db95ba" sha1="7c41a51d7bd564d0e17d63870b823abdc2e6947f"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 51).bin" size="1836912" crc="957ae0e5" sha1="c55acebfc12d3503f991c00510cfde2b99032753"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 52).bin" size="4772208" crc="eb5b144b" sha1="4d867a153bd57bb09be29c9f131c6897b0cfc750"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 53).bin" size="3739680" crc="14fd2387" sha1="b6f685d4d43b1021d5389c7191b72ffa1f0ea362"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 54).bin" size="5760048" crc="4b8e77bf" sha1="0eea09b164872e82e05c08f8c8283d10900a4797"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 55).bin" size="5593056" crc="3e1db633" sha1="c4e687447cf9fa3115d4e6876ce19f7958bc7b98"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 56).bin" size="4358256" crc="0e2db174" sha1="60ec3bce87165baa038b7f50919d6285468f75f8"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 57).bin" size="2333184" crc="5d35556b" sha1="64b7b10553604a5fd1580dc0e0a52d2cb40e9d9a"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 58).bin" size="5056800" crc="db9e06de" sha1="975d7fd091c19eee91633f6f190c07bd00d60ca6"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 59).bin" size="5244960" crc="ed79c0f2" sha1="c26233b72cb18c791bb488dbb52e922b65b0fcf8"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 60).bin" size="5722416" crc="64e1e119" sha1="f4bef4098e009d077283ff29d7cb76c79d64502a"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 61).bin" size="5868240" crc="df35c435" sha1="f5de6ffcd760e76a303b24f76f84b3eb864eed09"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 62).bin" size="2944704" crc="503fc1c8" sha1="83e2b7b683939acfc577246599638c9ad4d845a7"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 63).bin" size="5837664" crc="e286ff32" sha1="c594de88434f2ffa9e903492802d1015f8a92d2b"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 64).bin" size="5327280" crc="8d40ba19" sha1="6166159f93885095d23f0ac76b8124f50ce9ecfd"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 65).bin" size="1018416" crc="ffbdd671" sha1="80eeefa5a9579747b0fdf74413bf3097e1bd96ab"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 66).bin" size="5087376" crc="4d0d3fa5" sha1="f42d179f666d3ae67b3e2b541be38baf108ba85c"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 67).bin" size="6305712" crc="5536d07d" sha1="523bfc5f9c7ce7288c2be4f08c717a05994219ef"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 68).bin" size="5101488" crc="b5df861f" sha1="3ba0ec8089e0af29bdd0ef9a6ae92e5aa810d91d"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 69).bin" size="5282592" crc="a80b91ba" sha1="f009d475fa3fbd2b6f2056986add49604bb99c8d"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 70).bin" size="2427264" crc="c718c330" sha1="8a6680f76c60207af2959dbdf7d906c0d6e88fdd"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 71).bin" size="4386480" crc="5c362c68" sha1="b18b42da2a9f17173d444e1f725d10ab045eb375"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 72).bin" size="6437424" crc="79f1f26f" sha1="19fb96a11f25c2d99c90c71c1429f892cbd764ca"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 73).bin" size="3351600" crc="a31d63a0" sha1="1ed79051a4067e877fc7e80b4b874d8a129fd32f"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 74).bin" size="2497824" crc="797d691b" sha1="38f4bc609383a1bf9329efa3e474ba9d3e354113"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 75).bin" size="4210080" crc="b4ce033d" sha1="bf0c3f31e34311bb92b346d1d774ab72356febb0"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 76).bin" size="5287296" crc="bc30c2b5" sha1="76ad034727eb596e5dec9c6db10152cb80389bc2"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 77).bin" size="2504880" crc="f9e0fb3e" sha1="9ef6c0999eb0c6ac9d18c35e56261263c06a0863"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 78).bin" size="1564080" crc="c8202f34" sha1="d07ce509b2302e604a71114ad4c5ae727151df3b"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 79).bin" size="5628336" crc="2e7773ed" sha1="8005605e1b8f22985e6e5f9673f9bca3ba8f03da"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 80).bin" size="5103840" crc="1e891b22" sha1="d09ac8885d8689611169111cb9228dc46b23f5c4"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 81).bin" size="5967024" crc="3d3da9ea" sha1="d3891c0a512bd600880363608417758526def089"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 82).bin" size="5456640" crc="be966cb7" sha1="d5f47bf10eb6e471aea7599bc0eea2a04e0f2492"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 83).bin" size="2972928" crc="ddce7d9b" sha1="3ff26df100f9542c3c6a45d4d5309099b00a1900"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 84).bin" size="3906672" crc="c3613ecd" sha1="d2df3a970f216d71c56546d941022f4ef7048061"/>
+ <rom name="Alone in the Dark 2 (Japan) (Track 85).bin" size="1851024" crc="04bbabd6" sha1="8735c94921c2fe15c5ba2f36dc06a39af9b03a06"/>
+ <rom name="Alone in the Dark 2 (Japan).cue" size="8443" crc="89ba036c" sha1="a7af63fd78be075bc03bc231882dd227bfb3ef13"/>
+ -->
+ <description>Alone in the Dark 2</description>
+ <year>1994</year>
+ <publisher>アローマイクロテックス (Arrow Micro-Techs)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="alone in the dark 2 (japan)" sha1="cbbb766102038d808172bfd5675838fa57fde6b2" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="branmar2">
+ <!--
+ Origin: Unknown
+ <rom name="GAME.BIN" size="479222352" crc="b96fad3a" sha1="76d673cd9fdcf7479f484e2e5b92fcde3d6c6e41"/>
+ <rom name="GAME.CUE" size="173" crc="75049f00" sha1="008c1c2053e71aa20f6818fbe4f9eeb6705ef7a6"/>
+ -->
+ <description>Branmarker 2</description>
+ <year>1995</year>
+ <publisher>ディー・オー (D.O.)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="branmarker 2" sha1="15f0320726f83a341a7f01e3268945b143c66873" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="brandnew">
+ <!--
+ Origin: redump.org
+ <rom name="Brandish (Japan) (Renewal) (Track 01).bin" size="11936400" crc="07953f04" sha1="e3aba6d10495617412095fb47ae40c59c63b2237"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 02).bin" size="27048000" crc="eb5d87f7" sha1="9cd9110b02652e6f95b48e49fc20f000aeab5143"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 03).bin" size="19227600" crc="48884cca" sha1="6415021ba125e5836716cb87f5d38d17b4ac3375"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 04).bin" size="20109600" crc="02627708" sha1="1c5c62a297761eff3f5a873f75f7aed7011b9ce2"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 05).bin" size="64033200" crc="d4ee67ed" sha1="e873447e7e831831c268f419cebf77350c46000e"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 06).bin" size="23284800" crc="0ef5c8cd" sha1="dc55d1067bcbe1bfe44f7aec37832ba9bd036703"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 07).bin" size="17463600" crc="0719383a" sha1="1c31f060b6216bf1c97b6f308899967522895a0b"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 08).bin" size="19051200" crc="e9a7d73b" sha1="848780a529e56e8c9b2992425d183192b1e53824"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 09).bin" size="41101200" crc="40d73bba" sha1="8756fbc4c60e2be35800a69cd3fa114ba389d5c5"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 10).bin" size="22402800" crc="280e72de" sha1="487d4677276bdec0cbc7b1c3e3e27c8688ac6809"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 11).bin" size="43394400" crc="d4ca4035" sha1="c51a0dd575e606b5d02d35556428f75ece212fd6"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 12).bin" size="51332400" crc="988808a6" sha1="4b785f2e06ea612a7d9eaf809a4f0364aa341fca"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 13).bin" size="21168000" crc="e22d6a3e" sha1="d557ff1505c892ef374daf119f5f83e0e311463d"/>
+ <rom name="Brandish (Japan) (Renewal) (Track 14).bin" size="28576800" crc="95195948" sha1="6f03e8f8372ae32a4c6339b4ee48dac172e3ed5a"/>
+ <rom name="Brandish (Japan) (Renewal).cue" size="1699" crc="d0d03a06" sha1="dc56f56978146574591ad5e7201ee047e8a33651"/>
+ -->
+ <description>Brandish Renewal</description>
+ <year>1995</year>
+ <publisher>日本ファルコム (Nihon Falcom)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="brandish (japan) (renewal)" sha1="d804bc3ddb997443b0ba856bac3eb2d8d333a8a7" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="brandvt">
+ <!--
+ Origin: redump.org
+ <rom name="Brandish VT (Japan).cue" size="85" crc="b7368f87" sha1="4d5c5eba2fc88cf8c3cec9d3c8d9392f04058ef3"/>
+ <rom name="Brandish VT (Japan).bin" size="10673376" crc="f0ef8291" sha1="4bec0d6244ec0cfc318d24968640542f1f5b3828"/>
+ -->
+ <description>Brandish VT</description>
+ <year>1996</year>
+ <publisher>日本ファルコム (Nihon Falcom)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="brandish vt (japan)" sha1="0aa4a61ad74f93d78fc331ddefb91e67c79e9bc8" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="crysweep">
+ <!--
+ Origin: Unknown
+ <rom name="CS.cue" size="171" crc="1277a748" sha1="6bb3d04a127c225b3a69a49537f243d8eda3b48d"/>
+ <rom name="CS.bin" size="571625376" crc="31a296fc" sha1="059fa04b0d515092b9312364504551959f1729e7"/>
+ -->
+ <description>Cry Sweeper</description>
+ <year>1996</year>
+ <publisher>ディー・オー (D.O.)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="cry sweeper" sha1="8b7000406f871d338b23fbc0275f6b71eabe1b8c" />
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- Hybrid disc, also included in fmtowns_cd.xml -->
+ <software name="dangel">
+ <!--
+ Origin: redump.org
+ <rom name="Dangel (Japan).cue" size="80" crc="afbb2b04" md5="09b954697d11ce8413adae4c80715f65" sha1="c18f1bd180c4b87a3f7167cab436a31d4dd36f55"/>
+ <rom name="Dangel (Japan).bin" size="298943904" crc="58c44148" md5="014e3adff972065a032b22771f9860ea" sha1="803cdfeaf8662b3a9d1e6cc3a378bf63a7fece5b"/>
+ -->
+ <description>Dangel</description>
+ <year>1996</year>
+ <publisher>ミンク (Mink)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="dangel (japan)" sha1="5b748eb84966710bf125a84dac3e878f62872ba6" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="dstat_09">
+ <!--
+ Origin: redump.org
+ <rom name="Disc Station Vol. 9 (Japan).cue" size="93" crc="5705eaf1" md5="a5d71c4f37e88b5c25900f6ed21ad463" sha1="662eda1ea95d7d582d7704acf3ba073a268178d6"/>
+ <rom name="Disc Station Vol. 9 (Japan).bin" size="46901232" crc="290ed47c" md5="cd281ceb615104feb4e8fdb8965fc267" sha1="97d1cb149b6d8bef08ebb050595d254a35cc1dd4"/>
+ -->
+ <description>Disc Station Vol. 09</description>
+ <year>1995</year>
+ <publisher>コンパイル (Compile)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="disc station vol. 9 (japan)" sha1="664455bba9d9830783a76b41f816ffe27c537835" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="dstat_10">
+ <!--
+ Origin: redump.org
+ <rom name="Disc Station Vol. 10 (Japan).cue" size="94" crc="4f4df880" md5="03f3d701a75ccdb14851d2e600917877" sha1="31b417003eb2ef34243622a3449839d734b76310"/>
+ <rom name="Disc Station Vol. 10 (Japan).bin" size="150142272" crc="58db2b79" md5="315e6f62277f514f60be737af7ef9b05" sha1="03424e364744f09906e4f0aa456d6a1a5c887767"/>
+ -->
+ <description>Disc Station Vol. 10</description>
+ <year>1996</year>
+ <publisher>コンパイル (Compile)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="disc station vol. 10 (japan)" sha1="2b998518d8f2eddfd65b7871ae5a94e11d7b6b11" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="dstat_11">
+ <!--
+ Origin: redump.org
+ <rom name="Disc Station Vol. 11 (Japan).cue" size="94" crc="9a4884fc" md5="01e1d313098b2be939b6b1603a869bd2" sha1="753f2b98d8a0495c96b5d40d4faa7b9c8bcbda32"/>
+ <rom name="Disc Station Vol. 11 (Japan).bin" size="158197872" crc="3ffba967" md5="e708233599fa3a48b85731b516bf725d" sha1="5434c2a3ac045e7de1d618ecb477404ac3b86a92"/>
+ -->
+ <description>Disc Station Vol. 11</description>
+ <year>1996</year>
+ <publisher>コンパイル (Compile)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="disc station vol. 11 (japan)" sha1="a8aff0cb5c0bf8244939a91b3fb3fe3cd07bdb36" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="doom">
+ <!--
+ Origin: redump.org
+ <rom name="Doom (Japan).cue" size="78" crc="1fc40160" md5="f2dca5634ac58c4e417742568dac52cf" sha1="417aa17487286fd2a30620b64b5f2f4a972bb738"/>
+ <rom name="Doom (Japan).bin" size="17578848" crc="0a683d88" md5="6be92ade4cb0a74fe0b04fb33085f1ba" sha1="c708e01f6256b07dbd5e8b1c72a0076fe153e30c"/>
+ -->
+ <description>Doom</description>
+ <year>1995</year>
+ <publisher>イマジニア (Imagineer)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="doom (japan)" sha1="d8df34ba9caaec7f07841e375b4dff85549065ff" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="doom2">
+ <!--
+ Origin: redump.org
+ <rom name="Doom II (Japan).cue" size="81" crc="bf7ae499" md5="0daf5db6cb9f2e9683cf4378560fd442" sha1="270f31750fa528000bcf4752c19aaa40f0717585"/>
+ <rom name="Doom II (Japan).bin" size="18860688" crc="e56f5c3d" md5="cf61309baee3a54c0a469cd06d571957" sha1="b76609d9e9da4f6c48c62e354620a76ba46129f5"/>
+ -->
+ <description>Doom II</description>
+ <year>1995</year>
+ <publisher>イマジニア (Imagineer)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="doom ii (japan)" sha1="d6e6ac62129f441e1e4ca0c551923e5f49cc2b68" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="fh2tag">
+ <!--
+ Origin: redump.org
+ <rom name="Finish Hold 2 - Tag (Japan).cue" size="93" crc="7cf64221" md5="a2dc55a24539aab103701e08562253fe" sha1="8a49ecb6010ea76deb1bcc3c84a0cfc437de46e3"/>
+ <rom name="Finish Hold 2 - Tag (Japan).bin" size="139555920" crc="1ebec24d" md5="7c2fa0f55e3a37eb3acef427051298d5" sha1="87c0051de042876f7fed2008bbd7b4316800532f"/>
+ -->
+ <description>Finish Hold 2 - Tag</description>
+ <year>1996</year>
+ <publisher>システムソフト (SystemSoft)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="finish hold 2 - tag (japan)" sha1="a553455dae0a6efa8b2b424d24c1e611bd03a10e" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="galpani">
+ <!--
+ Origin: Unknown
+ <rom name="galpani (1995)(kaneko - creo i).ccd" size="3120" crc="788eda2a" sha1="12dd368e864857dc3d206dae6890621536d322da"/>
+ <rom name="galpani (1995)(kaneko - creo i).img" size="497229264" crc="8b3ce23e" sha1="9bd91b2e62d5847cc65bd363e7a59bd7bda15613"/>
+ <rom name="galpani (1995)(kaneko - creo i).sub" size="20295072" crc="c2670009" sha1="c0cf2725384ef328682d5c28f017f9dddbc6f28b"/>
+
+ After conversion with IsoBuster + EAC:
+ <rom name="galpani.cue" size="1725" crc="17aa363e" sha1="4cb40d4ec35eff243114029f3ddc90d81eb646d3"/>
+ <rom name="track01.bin" size="103473888" crc="18ce00b3" sha1="3d6ed2ff296d77ad8df3e76c2765f1cc5ca69115"/>
+ <rom name="track02.bin" size="23684640" crc="0e541aa6" sha1="2f2ee36f184fd3a6cb211760cb7eed053c91afab"/>
+ <rom name="track03.bin" size="27304368" crc="1c9a120a" sha1="7f84c793d7bea440ab16a06f6ea032e5a12b9bc7"/>
+ <rom name="track04.bin" size="29202432" crc="d400d2af" sha1="6491cb6ea0a25daa41264cd52795b932cc1b8018"/>
+ <rom name="track05.bin" size="38822112" crc="6abc013c" sha1="e328c9c82ece454d4c5a381b66230386f5b1e294"/>
+ <rom name="track06.bin" size="34978944" crc="dd0ec099" sha1="5ff34042f7d2b06704a4a1fdcd4a603200a87737"/>
+ <rom name="track07.bin" size="35089488" crc="1f0809b7" sha1="c5e1089cc0dac148f015186c23b4c0ec20c3b4ad"/>
+ <rom name="track08.bin" size="41491632" crc="b65e9a96" sha1="929ad7fd64e842140a1d1ac2a168b713351de69e"/>
+ <rom name="track09.bin" size="22035888" crc="c33340fe" sha1="108c959676745deb315e8e61cc3d1d45046b85ea"/>
+ <rom name="track10.bin" size="41832672" crc="411f1aa9" sha1="e4a77beb71c34fa8a6a67b9ff50fb339404651a6"/>
+ <rom name="track11.bin" size="32422320" crc="08d46196" sha1="4cdab646ba794d99c33f5d73ac7844c4a103b66a"/>
+ <rom name="track12.bin" size="38403456" crc="80f16812" sha1="9efa2a2871895a4a2803867d01ca0cc333584c8d"/>
+ <rom name="track13.bin" size="28487424" crc="cdb49e40" sha1="2a5dbc79d3c869f249a37495d655857f6ccbc5c9"/>
+ -->
+ <description>Galpani</description>
+ <year>1995</year>
+ <publisher>Creo I</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="galpani" sha1="a6ef11bd97ac8917eee3ef7af50b516d7d538e17" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="gitenmt">
+ <!--
+ Origin: redump.org
+ <rom name="Giten Megami Tensei - Tokyo Mokushiroku (Japan).cue" size="113" crc="40db8275" md5="01a1d9aa8310a5bab608f63c770d8bff" sha1="3854f7e6148c4be07afc0693d5f28142e09ba4f8"/>
+ <rom name="Giten Megami Tensei - Tokyo Mokushiroku (Japan).bin" size="23630544" crc="25f30ab9" md5="51d9d52725daec92f72dbde0e932529f" sha1="3c0d28d697870a24e9f373bb4e0446e2f5d88c62"/>
+ -->
+ <description>Giten Megami Tensei - Tokyo Mokushiroku</description>
+ <year>1997</year>
+ <publisher>アスキー (ASCII)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="giten megami tensei - tokyo mokushiroku (japan)" sha1="5ec487543a5e2b6dbf0d8e2b78c7d36307d60599" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="guynarck">
+ <!--
+ Origin: Unknown
+ <rom name="guynarock r.cue" size="633" crc="5d46bde5" sha1="798fdf61ea95d66b4dc74fb5a8c8494a1084fb44"/>
+ <rom name="guynarock r.img" size="533257200" crc="08f4f81c" sha1="aebb53e1a8632f1e179a8bc0cfe0aab27cb27cef"/>
+ -->
+ <description>GuynaRock R</description>
+ <year>1997</year>
+ <publisher>ソニア (Sogna)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="guynarock r" sha1="6c2c417960ce6df8b88ae2f69b77f4ab1bf922a3" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="letspir">
+ <!--
+ Origin: Unknown
+ <rom name="lptv.bin" size="629345808" crc="c255cd67" sha1="88870768ff5291369264043e4179d8add509cfe6"/>
+ <rom name="lptv.cue" size="173" crc="e9325e8e" sha1="df5078e1cc21a684e0e4f34b455e5bb9d11621aa"/>
+ -->
+ <description>Let's! Pirates</description>
+ <year>1997</year>
+ <publisher>ジックス (ZyX)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="lptv" sha1="a866ed50254551455d5a646e87c5d10eeeea0329" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="links386">
+ <!--
+ Origin: redump.org
+ <rom name="Golf Links 386 Pro (Japan).cue" size="92" crc="2f39ce25" md5="7b971ef29af37dc896f91b76398a26b0" sha1="81a07ca4334675f87ea175f0103dc2b14a3988a2"/>
+ <rom name="Golf Links 386 Pro (Japan).bin" size="20815200" crc="99a1878d" md5="164db67263c00939fc9ceb8f3d1a96cb" sha1="bc5a1e3c0773dcba00720728351661da6fd8a75c"/>
+ -->
+ <description>Golf Links 386 Pro</description>
+ <year>1995</year>
+ <publisher>サイベル (Cybelle)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="golf links 386 pro (japan)" sha1="c0eb847d7168e6209482b19a270bd81d40383137" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="loh4">
+ <!--
+ Origin: redump.org
+ <rom name="Akai Shizuku - The Legend of Heroes IV (Japan).cue" size="112" crc="51672b80" md5="31535feeaec7c80f11da3556e4366922" sha1="c0eaf4181b26932759cc78679c83c6bf52725862"/>
+ <rom name="Akai Shizuku - The Legend of Heroes IV (Japan).bin" size="8772960" crc="5427ac70" md5="6bd6a1dc1a79d58abd14266516218358" sha1="3c603b5cd6000a0f7d365da32ad6d7dfb5bc1965"/>
+ -->
+ <description>Akai Shizuku - The Legend of Heroes IV</description>
+ <year>1996</year>
+ <publisher>日本ファルコム (Nihon Falcom)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="akai shizuku - the legend of heroes iv (japan)" sha1="3524c9b012c4b96bbae03220088bbadbfed28898" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="macrslcp">
+ <!--
+ Origin: redump.org
+ <rom name="Chou Jikuu Yousai Macross - SkullLeader Complete Pack (Japan).cue" size="447" crc="c16d423e" md5="be2a0ed6b66d7af5465defeaa5e6fc9f" sha1="1cc4e97dd3496cc91ce1fe9d6d899d7d874cc0c9"/>
+ <rom name="Chou Jikuu Yousai Macross - SkullLeader Complete Pack (Japan) (Track 1).bin" size="11832912" crc="12341454" md5="2931a48797a2d353f095639ec5391310" sha1="3fa7099b3dcc2d794659d0ca7fc89abfef790880"/>
+ <rom name="Chou Jikuu Yousai Macross - SkullLeader Complete Pack (Japan) (Track 2).bin" size="21518448" crc="d8642621" md5="9e36b834adb077051b96c02120b12e41" sha1="345be6b9afa27a2381f25236a347de7e31f16af4"/>
+ <rom name="Chou Jikuu Yousai Macross - SkullLeader Complete Pack (Japan) (Track 3).bin" size="35985600" crc="ba94c502" md5="654be3fc65aa773df951856003f3e3b2" sha1="bee8a5ab076d10c9d6d85803316ba32d9bc30b5a"/>
+ -->
+ <description>Chou Jikuu Yousai Macross - SkullLeader Complete Pack</description>
+ <year>1995</year>
+ <publisher>ファミリーソフト (Family Soft)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="chou jikuu yousai macross - skullleader complete pack" sha1="a3c9c3e798c84ca64fc5dfbc86c39eef427bc6ad" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="mmagic4">
+ <!--
+ Origin: redump.org
+ <rom name="Might and Magic - Clouds of Xeen (Japan).cue" size="2007" crc="77861ae9" md5="658d8729451fd58a51109ff96cdd39e0" sha1="f2b0f966a3d55950a3dc7d93176d165c68a8a6f3"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 01).bin" size="14283696" crc="6c5f9e30" md5="c68a661ad754c242141aa9534e365f75" sha1="e8b5640ee98997402763d143405783d8e4b3f9cb"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 02).bin" size="16750944" crc="1af9ae1a" md5="9e5804bcb534005f3dc0e614c717c3ef" sha1="c22cac53b725d011d4d2b8195d5ad0aed61072ff"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 03).bin" size="9029328" crc="3dfe9bc4" md5="a0c719f427776690c3fa21abf2eb2b04" sha1="a9daf766298d82f7fea1358144c57824e0431028"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 04).bin" size="27511344" crc="53e93127" md5="ab3e8ae7f1206ff26d296b600de1c8ec" sha1="40f5ed9ba071165eb1fa424d2f099261f750fbc2"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 05).bin" size="7100688" crc="de731102" md5="04242bb7ca08092731a535590d80d42b" sha1="ac4510811513ee0c5059399ba94bbad7ca84c0b8"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 06).bin" size="8274336" crc="198e6c9a" md5="0b97a17d0dbfce1f07382a5c45895271" sha1="9aa4d2722eab3ed7e73b33bc1977d2332befb952"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 07).bin" size="11769408" crc="5a544cf0" md5="3f7b9f339d76bf34fad1759101acb5d9" sha1="b94da1650b7693397efbe7728913e7e02192d52a"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 08).bin" size="5341392" crc="0ac523f4" md5="13845958c739d62d45cae57b98b706d1" sha1="d903a4a66e3be9ada62994402a0b19911c765003"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 09).bin" size="5221440" crc="15a05f24" md5="fc3ddff0569c5d06b9579b98c83f4e76" sha1="aece1f0b861c014b10c066704f22a0d93440f563"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 10).bin" size="8589504" crc="f0767dcf" md5="0a11c643587ccdd10bec2fe8029836c0" sha1="a859c02a65c8be6b889fecc13dccd4b2eb779485"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 11).bin" size="27596016" crc="6e961c0d" md5="7f74cab30ce5b29c09ef7a9e75418c17" sha1="69b929dc1cdd6791df9edc192bd1586b26b56c09"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 12).bin" size="37587312" crc="f6002ac7" md5="ffeaf5ba9f00ff791f92c0ba6058be86" sha1="0ccd291cf0f5792269c20dd2010b10dc82efcc75"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 13).bin" size="32808048" crc="60c7b3fe" md5="730c4b98a2a09237bcebc6102627e14b" sha1="c7da83f76082720708d8ce0d8152e89adfd3ffe7"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 14).bin" size="24423168" crc="3f42b4f7" md5="a992cbceac28c97fe0b5caf801fcde4d" sha1="d86e8584a43d23e56d328bf6d2d329297fb4bab9"/>
+ <rom name="Might and Magic - Clouds of Xeen (Japan) (Track 15).bin" size="29275344" crc="ebfaec74" md5="1dfe948aed3f20a500a806973a9c1f7c" sha1="c3b5621d5b617973ef33238634d735de48ef5041"/>
+ -->
+ <description>Might and Magic - Clouds of Xeen</description>
+ <year>1993</year>
+ <publisher>スタークラフト (Starcraft)</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="1261568">
+ <rom name="might and magic - clouds of xeen (japan).hdm" size="1261568" crc="e7738b2e" sha1="1c58c1ee565f777e931bd301cc535eb27a4b70e6" offset="000000" />
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="might and magic - clouds of xeen (japan)" sha1="c8e213e391ecc1d0bd416450f48bf9fd8dfe4966" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="panzerg">
+ <!--
+ Origin: redump.org
+ <rom name="pg.bin" size="203549136" crc="6542ab9b" sha1="11f0723f6fd309124b43f94ed2f9de9fd5c28ca5"/>
+ <rom name="pg.cue" size="68" crc="a0dc8d13" sha1="68cc23cb28da99ba1d7c4e3af85acb57b959274d"/>
+ -->
+ <description>Panzer General</description>
+ <year>1995</year>
+ <publisher>AMT Savan</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="panzer general" sha1="51ba8a8c5e443271d745b98a80325e819e04a3d8" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="photogen">
+ <!--
+ Origin: redump.org
+ <rom name="Photo Genic (Japan).cue" size="85" crc="97ca0b88" md5="4e1575abab8940c80b41e003928d0c9d" sha1="917369cda659f3bd55ab4c5ceb46c6bd74f3a0b0"/>
+ <rom name="Photo Genic (Japan).bin" size="24641904" crc="52dcb64b" md5="53f1a1dc0f0663a547a5515738040bf6" sha1="a9e813960d37ec48e0544b4d8383f027060a4ca4"/>
+ -->
+ <description>Photo Genic</description>
+ <year>1997</year>
+ <publisher>サンソフト (Sunsoft)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="photo genic (japan)" sha1="407a1029503fc66d6207e436000c47b1626e01a0" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="pnauts">
+ <!--
+ Origin: redump.org
+ <rom name="Policenauts (Japan).cue" size="591" crc="33715417" md5="ae17a348af34b2f7bddd0695d976f61c" sha1="2e41266a1a1e82eaa6a2b85858aec7af8ad93e33"/>
+ <rom name="Policenauts (Japan) (Track 1).bin" size="438123504" crc="2b3e3183" md5="c397bfaeb01f420d68bdc025035e9790" sha1="55f73b092e899fed724b0f77936fd27481c7796f"/>
+ <rom name="Policenauts (Japan) (Track 2).bin" size="1270080" crc="f67682bf" md5="9d65bf3162a18aac88c5d0428e3f529e" sha1="08a2573b9f1bc9fe41df1c9496cf51f8d586fbbc"/>
+ <rom name="Policenauts (Japan) (Track 3).bin" size="16659216" crc="359cad9c" md5="03c335a645b72c0f4ff84262a9f4e657" sha1="3dd20bc84242fe359c817a5a8c9343f7967c2833"/>
+ <rom name="Policenauts (Japan) (Track 4).bin" size="40581408" crc="9f11a2ed" md5="b828594ed9f3ebfacb62be844f0365be" sha1="f7843607689b0ef8b0dff29af863fbeb11061e50"/>
+ <rom name="Policenauts (Japan) (Track 5).bin" size="55366080" crc="7d2995bd" md5="afeb83ea9683fe45bd7468072e1002f0" sha1="0e44e6269eabdada9db6ac9348c80e102ec39a17"/>
+ <rom name="Policenauts (Japan) (Track 6).bin" size="77420784" crc="64a52f0a" md5="f785c2207b16c0db1c77dbf2816c463f" sha1="6e413cc80079a8207e60f3dbf72463424817f476"/>
+ -->
+ <description>Policenauts</description>
+ <year>1994</year>
+ <publisher>コナミ (Konami)</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="1265664">
+ <rom name="policenauts (japan) (system disk).fdi" size="1265664" crc="ef3e4428" sha1="246b674a48903ff7e3fe90292b1236d75a8d6c23" offset="000000" />
+ </dataarea>
+ </part>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="policenauts (japan)" sha1="b753663d060934d3566f909e837419736f0efd0a" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="puyopuy2">
+ <!--
+ Origin: redump.org
+ <rom name="Puyo Puyo Tsuu (Japan).cue" size="353" crc="9c2cb334" md5="85cefa326719e3a81894d3e0515edd26" sha1="0ed2b72c7eda806e17df8e22e6bd3686ee92df2b"/>
+ <rom name="Puyo Puyo Tsuu (Japan) (Track 1).bin" size="270574080" crc="eeb69995" md5="0a0cb1b7ebedb8ccf4ede5316f11c17a" sha1="edc42a08a2792807d6daae696b990ee3f6c3cb38"/>
+ <rom name="Puyo Puyo Tsuu (Japan) (Track 2).bin" size="48455904" crc="d8c36ca8" md5="3c753999f1135f281c1e3e119fcc363d" sha1="1a52ffa8b8272ad95eec2b475c977151e98f57c6"/>
+ <rom name="Puyo Puyo Tsuu (Japan) (Track 3).bin" size="48599376" crc="48830830" md5="5580f8cd4a79599aeafb7650860c5998" sha1="d99b57af923b60e5d55981a96abf8b0bf91171b9"/>
+ -->
+ <description>Puyo Puyo Tsuu</description>
+ <year>1995</year>
+ <publisher>コンパイル (Compile)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="puyo puyo tsuu (japan)" sha1="1c4ef6ec62de5b092363538fcb66e4c54e3988a5" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="rpgtd982">
+ <!--
+ Origin: redump.org
+ <rom name="RPG Tkool Dante98 II (Japan).cue" size="94" crc="c4bb7dbc" md5="21e91169b17ab3a3fa06c986b936b7b6" sha1="980a4a0a76a5e0e6519b96f3973b5e5ce43a380b"/>
+ <rom name="RPG Tkool Dante98 II (Japan).bin" size="32109504" crc="82d12cd8" md5="536c6452e26431a33cb4bf2fd5a04160" sha1="4f81df2baa23ea9b18e531182c1beb22a7eee608"/>
+ -->
+ <description>RPG Tkool Dante98 II</description>
+ <year>1996</year>
+ <publisher>アスキー (ASCII)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="rpg tkool dante98 ii (japan)" sha1="23d11194a580ff8cb12fb7a9cff9d550362665f1" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="samyzen">
+ <!--
+ Origin: redump.org
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan).cue" size="5830" crc="f767e079" md5="7bf31e023a4b1cab0f535040720248a5" sha1="23afeb3660d51cb920679c5bbbbf1508619fce09"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 01).bin" size="27311424" crc="cccf2ab3" md5="d7b1aa5296fd024f12d9f57118df4a51" sha1="d135665e050b4f22955d6e52e928128e35c8fe98"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 02).bin" size="23465904" crc="b5a157cc" md5="2f567010bd8e74259014d3314b6bbdf4" sha1="b5c25f45ff1b57fe1a8aa036eadc574b8f454a08"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 03).bin" size="22059408" crc="6bdace3d" md5="81391c4db4ea53cc8855e16d9141ee0f" sha1="a760228c628f6cde0ad7ff363d887ad9b56701b9"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 04).bin" size="39010272" crc="8282acf8" md5="8355de6af15017b25d4384f5fead5332" sha1="95f97b27a82b0b09bd13103c102eee481304efb2"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 05).bin" size="31328640" crc="72daa2de" md5="6fe463c52d69a400861931b2323b1540" sha1="9b1220435bf9ac2c047ff1c699653b807ce75e97"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 06).bin" size="13401696" crc="8f5b0b54" md5="7c91d8ff4ee7aaa7d05c9c8b3da09663" sha1="a2e8b103ef158251515d4cc17d70a2401b94d3e2"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 07).bin" size="15847776" crc="53547344" md5="4a3cff1965eabb2f1bf4553460c97959" sha1="e134ea0af484e5bf1ea74636ae613ed6bca41f66"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 08).bin" size="7808640" crc="d0e44193" md5="798b10e1c80220fc93642b10452e7d8e" sha1="17c3439518e62ae13c05d6f6c66a977c1e971aef"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 09).bin" size="22108800" crc="299ea911" md5="8e993bf45936482debbeaa4ba06ca98d" sha1="39ac2fa3599bf53bc7a5705992526f38b041f8e5"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 10).bin" size="22976688" crc="cd6d540a" md5="3f260f823d3a559580784ce7681f43f5" sha1="2bb12e18d3e0613943dd5ba55e238901aa0a1cb5"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 11).bin" size="20029632" crc="a64de910" md5="46a27f3a06fa02bfa068ebd40dfe25ff" sha1="8134e0dd861641584ef3c7becf345a94a056e6f4"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 12).bin" size="2958816" crc="6e3fd2f9" md5="218309dd66f7206c417bf24ed851fecc" sha1="57435e72299e861f2079ee6c2ca05873e4c6a4fa"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 13).bin" size="1980384" crc="31038995" md5="361449b9a3484bc8072a4b9577147fbe" sha1="1e341aa4c275b4a5656ccbe8056ac728e3373896"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 14).bin" size="2347296" crc="24b411c8" md5="81bb40a26eda1877bdee153dcf54ac00" sha1="5524b0c5ad1dfcbe7fc08ed96bd1c1d9e20a222c"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 15).bin" size="1467648" crc="d8d7fe4e" md5="026eae5b64ad09acf492318b7583a69e" sha1="436dd58ebc7863be7d8bfdff51615b766fb65376"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 16).bin" size="12223344" crc="1dc765da" md5="0d80654379c6d83ea7d34b19b4a4b18e" sha1="10664f4cac60cd425b9504b41e9f341db8de4907"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 17).bin" size="9777264" crc="883371f1" md5="05f2975e446d2947d7d1910b320fc2d3" sha1="5ef49e95c106f36254dc30650a909a023016168d"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 18).bin" size="10466400" crc="b37d45b4" md5="10d0a4c0ddaf7a71615bf00dc4ee338a" sha1="02ea9cabc226ce0d5bbcbb11e7195651fdf6abc7"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 19).bin" size="1470000" crc="eb90e050" md5="7c44649c6bd253adb4d222d80daf4e58" sha1="ccfd5c4646986b7e18758533f377f888005dee25"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 20).bin" size="1535856" crc="34659f3b" md5="f88dd37c131c63e1de806cd2053404c1" sha1="cd56591d7a7895432ad655b7c3b88c517f2d5ab3"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 21).bin" size="3563280" crc="88e96ff3" md5="d8218978cf93f17c6fcb70c0f616e27b" sha1="e684074d1a1e400ed7a209451d71682cbd390ec0"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 22).bin" size="3718512" crc="5095489a" md5="bab73b0b1101504bdf4b5dd1ee8811fb" sha1="57bc4f82e997f4a7b2ec3cbf7f7e58ee7b9523da"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 23).bin" size="72432192" crc="35d4248d" md5="46db0b9018e11c98c80c20087d55caf0" sha1="b773bc12992731367bc78c8d93d302d2b466d0d8"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 24).bin" size="13782720" crc="168bf73e" md5="ec10e035e9219d05b96a7273910f337d" sha1="72354fdbd5b6da36a13b198d68f4a8fd1cea0886"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 25).bin" size="6620880" crc="faa8e106" md5="d75ad82d1938ac7d4d2c5fb741d1d118" sha1="599172abb3851d5deb2ad219362c42a57f2ff313"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 26).bin" size="15666672" crc="8c8372e5" md5="12bda865f17ee4ff9622abe40af08c69" sha1="204f87cad149479c324e0ea9b8905136e305589f"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 27).bin" size="7331184" crc="0c220e97" md5="8d0463cd8207299e55217a9419398ab6" sha1="37f40c31aa6bc3016994ed0e1310e9d975d3e5c4"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 28).bin" size="2319072" crc="6f5ab84a" md5="27df1ee14813ec958a6d1146a94a5e4a" sha1="68abf293fd2a7898922f56b86b9d6c7addae506b"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 29).bin" size="18658416" crc="fee7a9dc" md5="bdb735644f74cc6b48eeb61aeabd4de4" sha1="de6f6e45d4b731f39cda52ddb57a7c41108c1352"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 30).bin" size="4231248" crc="e68652ce" md5="2b0cc918a52b7621fd7ea1c965bb47c7" sha1="18b02331a6826c6ec03782924db446c1e4249a7a"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 31).bin" size="4134816" crc="a1a5eb4f" md5="f6b30096b13032712afeeb56d6b3e104" sha1="870bbf61e1fabf3e87a55e53d7af9ac5cd74e7fa"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 32).bin" size="2300256" crc="d9e1d0fd" md5="d5c3c3402d06ce13fa2676741cd7dc99" sha1="e5ac296cb7cf866b93d411032a8b3e371a0580c6"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 33).bin" size="1058400" crc="59078781" md5="457bb5a53fba44c64ccc2dab8f618ee4" sha1="3037f0cf887d55fd1a9bc762af1393945b790ecd"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 34).bin" size="1646400" crc="99622a6b" md5="6fa71a8166882dedae4a346cbf8b7d5e" sha1="3551517ef0fefa2f9ccc82c66fc7cc2211f7ae70"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 35).bin" size="75637968" crc="e05c1d69" md5="27198d3a031e699d0cf11cce1d1fe8db" sha1="04525525f5024e662ee8e93a978b9d3c6427b651"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 36).bin" size="64188432" crc="083cfa06" md5="f307703067303504ff1845e23fdaec85" sha1="b0d3342e51069cc59764f6231c10db922e32fe26"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 37).bin" size="27200880" crc="73726e84" md5="8088ce3a3ed53c7fd160fc49af808284" sha1="dd23030caa2ee7fd339e9828c41cbafa02ecb2ab"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 38).bin" size="31458000" crc="11e2090b" md5="312464739b881316c4179a51b4c9d624" sha1="662972cbe9caaa876beae8df79ac11e0832837d5"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 39).bin" size="2173248" crc="e291030e" md5="83b7dd910b05ddaad465629936614bbd" sha1="004aeea4e18765fb447adc23e073000f5ce27824"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 40).bin" size="22339296" crc="275aec8c" md5="8978127fc90335344f0bf3499f3ae8a4" sha1="4053b7b7612768e76ce9655329a2d56b99226f02"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 41).bin" size="7594608" crc="78cfd895" md5="5a412e72f62ea915505deb260f990bf5" sha1="6980f4e89fb5485ac1eccb13d421ddc0c605ca3e"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 42).bin" size="1554672" crc="f2a553ab" md5="862ffc1d9b77cbfada125c0601591c82" sha1="4d61cdaa9dd877a5ce52f37125de5736fa0d33aa"/>
+ <rom name="Mahou Shoujo Pretty Samy - Zenpen (Japan) (Track 43).bin" size="1493520" crc="72c39f65" md5="f5928ca66bc5eeb294ea391e096a2bac" sha1="f93a37b56c07591fcf496df04755fea9340b037a"/>
+ -->
+ <description>Mahou Shoujo Pretty Samy - Zenpen</description>
+ <year>1995</year>
+ <publisher>AIC</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="mahou shoujo pretty samy - zenpen (japan)" sha1="046b59ec30eed04c9371b85a95310d66ca225062" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="strikpls">
+ <!--
+ Origin: Unknown
+ <rom name="strike commander plus.iso" size="86388960" crc="d8953dae" sha1="80f27e2682f41ee5d82a3c8cad59bb5aeb7e9817"/>
+
+ CUE file used for conversion:
+ <rom name="strike commander plus.cue" size="82" crc="0f9a2f59" sha1="90970d4595d29c7efd90f39e07dea9e46b5e297f"/>
+ -->
+ <description>Strike Commander Plus</description>
+ <year>1995</year>
+ <publisher>エレクトロニック・アーツ・ビクター (Electronic Arts Victor)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="strike commander plus" sha1="a70044bd61fad32b8a13462f8f3fda100caff265" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="tfx">
+ <!--
+ Origin: redump.org
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan).cue" size="2703" crc="e1b7d0e9" md5="c2bee0d3b8937d67c37aec680d0b09ae" sha1="8c2c9d6aff002b2c42580364d6ab2b0638cd103f"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 01).bin" size="15269184" crc="e4514058" md5="4a9dbb28eacc1ba6ee07173ccedf3127" sha1="0c4e45ad478579089a136bdb9d2e0cce40945d9c"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 02).bin" size="49474320" crc="8347ce15" md5="c069755d23db2ac3ba8bea0edba130a4" sha1="f9eded08ceda10ef0d9397af209f17919bde49cf"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 03).bin" size="49514304" crc="4b01ce38" md5="a12f0572e612590b9c97831a0ec4bb68" sha1="36c457ad40ca1e8b2cacf0b98f2e5f630b807ead"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 04).bin" size="55410768" crc="e47ed054" md5="2820b38dfbc2cbd15f687bd1aac21547" sha1="2a7e1ccc6df5e40ec0183ef2d37a957f1bac8fad"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 05).bin" size="47503344" crc="190bafcb" md5="2e69cf8dc3a7c9a8e4d39ce87fc79237" sha1="5d759f4fc162fa6604e266676a5843bacc96e320"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 06).bin" size="50838480" crc="891f2dc6" md5="537f3b716b695080ce073fc71789e6f4" sha1="2a2723b526a22cc4aa4f691e55c263c3f4ee275d"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 07).bin" size="51308880" crc="23b69fae" md5="64c0dec94127427a83e5736ad62688b8" sha1="19eece7fb379dfff84269a8088276f323b5334df"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 08).bin" size="54380592" crc="b847dcdf" md5="4d27573cd2ae9b45c6fdac3f297186d3" sha1="21c28d8f9817c5d341c96b0348eaef5328ba78be"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 09).bin" size="50198736" crc="883729cb" md5="9cafd8e36c2b267b83b201a90235b4b4" sha1="c4152634934efeb52c0d1a8b5e2cf62d5d431d25"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 10).bin" size="20643504" crc="bf72d512" md5="34533c32d93b0e62b92a23fa2864b3ed" sha1="98c329d6194008220de1665a39bc29da98781706"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 11).bin" size="19907328" crc="14c2cbbd" md5="06aab3f45984c26aeb6e53dc603d8f7f" sha1="67bcf0633655e283ffe31f90052bfde31b48219f"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 12).bin" size="18260928" crc="175a1d6c" md5="4bcc53ff504a0f67466624e30c11d23d" sha1="f4ff86476caf1641b4bc15e1cc53010ec38985d8"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 13).bin" size="18223296" crc="e96eee8f" md5="8c3cb1cb47e8a5eaa9ef8c7cb68f2abc" sha1="14c5e512fbdb900a7475e621d73d5b4de8a9ceb0"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 14).bin" size="18585504" crc="bfe701eb" md5="a4b57467aa0bdc4416c2c2c435af42e9" sha1="50ce2f8e2eccb69e3f92d669ebe31c1009762c18"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 15).bin" size="23639952" crc="3170c06e" md5="687a96db2a5e7589d90a821414d574d3" sha1="e5320a6c23dea3151a2106ee08509a98f90915cc"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 16).bin" size="15739584" crc="713741f1" md5="dcc503b9e3b7c84d8e4256854057485c" sha1="246268bb04c0759321b2e8022ed4e852f4eb0690"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 17).bin" size="19145280" crc="db471d56" md5="56981088778d34e3f9cddc5119ad45fc" sha1="493e08cdd9719011a570a659d56c56dbd3161180"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 18).bin" size="32462304" crc="b6f4dd8a" md5="c0cd9374feb7336b7b4898c413566142" sha1="95a8e5ddf059f0ed7e18479e8db5c0263cf9d7ef"/>
+ <rom name="TFX - The Cutting Edge of Aerial Combat (Japan) (Track 19).bin" size="1467648" crc="6257e903" md5="2105c070b33a3ef9049878f5c7b1c884" sha1="bc7608fb11113cb2afc66272450ee4529b7b933e"/>
+ -->
+ <description>TFX - The Cutting Edge of Aerial Combat (Japan)</description>
+ <year>1996</year>
+ <publisher>イマジニア (Imagineer)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="tfx - the cutting edge of aerial combat" sha1="6eb1ea4cf8db8c1ebf3ef6824ac393f6a92dc27a" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="tokio2">
+ <!--
+ Origin: redump.org
+ <rom name="Tokyo 2 - Kaitaku Imin Boshuuchuu! (Japan).cue" size="108" crc="b3dba3b3" md5="48e1d8bc56e4bd72a3481132f8a6b116" sha1="4e8256c1b11b23da5796e2415d436a9fada6399b"/>
+ <rom name="Tokyo 2 - Kaitaku Imin Boshuuchuu! (Japan).bin" size="11553024" crc="4b90e99c" md5="be5a40bcc8e0b573a79c7c182de6d8aa" sha1="63af46c05b95ba9e6a66758ef5029b231cc4652b"/>
+ -->
+ <description>Tokio 2 - Kaitaku Imin Boshuuchuu!</description>
+ <year>1995</year>
+ <publisher>アートディンク (Artdink)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="tokyo 2 - kaitaku imin boshuuchuu! (japan)" sha1="009ad8945385a51fd2e0bd1960a872297052396b" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="thehorde">
+ <!--
+ Origin: redump.org
+ <rom name="Horde, The (Japan).cue" size="1451" crc="89c39237" md5="43a9b4b3c10af301fe8c6e8e842b930c" sha1="afae4fee774ec36ec6bb01099e7346f0bcbdb0fb"/>
+ <rom name="Horde, The (Japan) (Track 01).bin" size="281717856" crc="73721dfb" md5="809430b8fae12da96ca62cb7df374783" sha1="0b753964b7283a092928f8d5700a32a9729cedca"/>
+ <rom name="Horde, The (Japan) (Track 02).bin" size="34574400" crc="e0f167a9" md5="aba053012cac233baca7aff29d7218ec" sha1="4c9066f9bb72da1552638526d4cf8f801b601670"/>
+ <rom name="Horde, The (Japan) (Track 03).bin" size="22226400" crc="a792a8f0" md5="3d37c4980e47758fddec5cc884d125d2" sha1="b145cbeb83e981b724ef5c2aa02d33f67b520552"/>
+ <rom name="Horde, The (Japan) (Track 04).bin" size="33163200" crc="daec7246" md5="e1197932468b157f1f89a15500e91dcd" sha1="216dc4558cfd1f09d08d02f8328407c0c1cb3166"/>
+ <rom name="Horde, The (Japan) (Track 05).bin" size="22402800" crc="ddb0edac" md5="20c9c490ac52f90659908b39e7af03f5" sha1="4f85104654bb55e42359e8270f105dbd97917bc2"/>
+ <rom name="Horde, The (Japan) (Track 06).bin" size="32457600" crc="a5441176" md5="32ec3214802d4ed2247792ae734523cd" sha1="c8488464d17fcef8ba3f6ce375a0aacfa03e1081"/>
+ <rom name="Horde, The (Japan) (Track 07).bin" size="13935600" crc="e5951b8b" md5="f0f0bc7c659ef37bd1aa7720d5c39c5a" sha1="29d52bca0c86bf6fab3beedb2e63f01710d1d31a"/>
+ <rom name="Horde, The (Japan) (Track 08).bin" size="21873600" crc="8ca59661" md5="b96bc333b60b6ca759a9bf466d82e09b" sha1="912b000348d8dc09cc95320313503dea254d10f6"/>
+ <rom name="Horde, The (Japan) (Track 09).bin" size="22755600" crc="02ba42bf" md5="f13a257a66a00680c72720287f40fff4" sha1="d719799a7335025e8545b06a5429be35706b8541"/>
+ <rom name="Horde, The (Japan) (Track 10).bin" size="34574400" crc="0480e090" md5="3eba782fc0fdcbdfc3704c38d2d924e4" sha1="57eec18e628d7831978f7c03fb628a6207316f41"/>
+ <rom name="Horde, The (Japan) (Track 11).bin" size="24696000" crc="f5099eb8" md5="bc9ee6327b560b849e724868d983f060" sha1="85be72692bcb87ae1cb894ff951a3df765a1e355"/>
+ <rom name="Horde, The (Japan) (Track 12).bin" size="25048800" crc="b933af1c" md5="cb7a1c5ebed9873f582db69b68cbb2cb" sha1="0bc9e73054f1182e23735ad35a60b618276b3786"/>
+ <rom name="Horde, The (Japan) (Track 13).bin" size="25048800" crc="73b1c9f4" md5="bb7022ce51ff47046daec24b89e43108" sha1="6b9a293824d3fa9fe62de6c681dc3850c0d9e6c5"/>
+ -->
+ <description>The Horde</description>
+ <year>1995</year>
+ <publisher>アローマイクロテックス (Arrow Micro-Techs)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="horde, the (japan)" sha1="92bee5ef1eb88ef43a47375771a6930db964d5c0" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="themeprk">
+ <!--
+ Origin: redump.org
+ <rom name="Theme Park (Japan).cue" size="84" crc="4d74c64d" md5="15a908ecd413a3083ce2dce4cc61417a" sha1="1be7ed6e440077887a8a023a818c715bbaa2a064"/>
+ <rom name="Theme Park (Japan).bin" size="190041600" crc="04b932d0" md5="c3eba2da6227b98afde0a7bca805dc4f" sha1="28e0308f70459436bf09701f96a98d38be699944"/>
+ -->
+ <description>Theme Park</description>
+ <year>1995</year>
+ <publisher>エレクトロニック・アーツ・ビクター (Electronic Arts Victor)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="theme park (japan)" sha1="c5c1380be290b7e42c8d843dbe404626d4c5cacd" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="viperf40">
+ <!--
+ Origin: Unknown
+ <rom name="viper-f40.cue" size="1000" crc="da58d814" sha1="16890718aaf5584716528e01c88060e6112f385a"/>
+ <rom name="viper-f40.img" size="713062896" crc="199b891e" sha1="c5f881cd131fc0e52771802ea522d55d63d1d18a"/>
+ -->
+ <description>Viper F40</description>
+ <year>1997</year>
+ <publisher>ソニア (Sogna)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="viper-f40" sha1="674b7facd61b11a415d7474d53fd0014d8383ac6" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="win2kpc">
+ <!--
+ Origin: Unknown
+ <rom name="Windows 2000 Professional (PC-9821) - W2PCCP_JA.iso" size="410273792" crc="ffffffff" sha1="00c6238bced18a108ab062b50bd6ea2be34d0cb7"/>
+
+ CUE file used for conversion:
+ <rom name="Windows 2000 Professional (PC-9821) - W2PCCP_JA.cue" size="108" crc="5e4281a4" sha1="60b45b2155b2bce7d550f7ed99d4b95247e2c786"/>
+ -->
+ <description>Windows 2000 Professional (W2PCCP)</description>
+ <year>2000</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="windows 2000 professional (pc-9821) - w2pccp_ja" sha1="2d30b7ff6504d0faa9896573cdb2d34df2bd2789" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="win2kpf">
+ <!--
+ Origin: Unknown
+ <rom name="Windows 2000 Professional (PC-9821) - W2PFPP_JA.iso" size="409946112" crc="ffffffff" sha1="ef5035b8c6b566552eba9f16e085272632e259b4"/>
+
+ CUE file used for conversion:
+ <rom name="Windows 2000 Professional (PC-9821) - W2PFPP_JA.cue" size="108" crc="90edbbcd" sha1="a2b214d641906d27172e10d35094e652647d4194"/>
+ -->
+ <description>Windows 2000 Professional (W2PFPP)</description>
+ <year>2000</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="windows 2000 professional (pc-9821) - w2pfpp_ja" sha1="4487e2ffec2f0e931262d90111f5f7ce7ab2c968" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="win2ksrv">
+ <!--
+ Origin: Unknown
+ <rom name="Windows 2000 Server (PC-9821) - W2SSEL_JA.iso" size="479168512" crc="ffffffff" sha1="325e1f718981603fc21b88f34643efb71e0ee7e1"/>
+
+ CUE file used for conversion:
+ <rom name="Windows 2000 Server (PC-9821) - W2SSEL_JA.cue" size="102" crc="aec3800b" sha1="6a64d6297d6906ce672ce77967d3bde940202eac"/>
+ -->
+ <description>Windows 2000 Server (W2SSEL)</description>
+ <year>2000</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="windows 2000 server (pc-9821) - w2ssel_ja" sha1="2d8f13038acc25d1f16e88c486895b299ae47731" />
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- Supports IBM PC-AT, PC-98, Alpha, MIPS and PowerPC -->
+ <software name="winnt40w">
+ <!--
+ Origin: Unknown
+ <rom name="disc2.ISO" size="434356224" crc="b30d864c" sha1="99310256b48d9b467a0af7101b1f5c84777853c1"/>
+ <rom name="image.ISO" size="531824640" crc="6a13d50c" sha1="3c6c54450583e12401daf1bcc0457fc41f60736d"/>
+
+ CUE files used for conversion:
+ <rom name="disc2.cue" size="66" crc="2cabba7b" sha1="38cfe76167cf3065478036c386c69693fa0bf5f3"/>
+ <rom name="image.cue" size="66" crc="3f846e22" sha1="d3d798255e5d26cd8485a5c5f7aa086a51368ebe"/>
+ -->
+ <description>Windows NT 4.0 Workstation</description>
+ <year>1996</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom1" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="windows nt 4.0 workstation (disc 1)" sha1="b1786c6ee6486f2f37191481e252cf67cc0f0dae" />
+ </diskarea>
+ </part>
+ <part name="cdrom2" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="windows nt 4.0 workstation (disc 2)" sha1="994b952e9065abb2c831f601df76f11c1961392b" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="win95">
+ <!--
+ Origin: Unknown
+ <rom name="Microsoft Windows 95 PC-98 (JPN).iso" size="81395712" crc="d402c155" sha1="14d10f62db11397ea46bdf02d1619f1b8e1ff345"/>
+
+ CUE file used for conversion:
+ <rom name="Microsoft Windows 95 PC-98 (JPN).cue" size="93" crc="c4113669" sha1="3ee6d0113b8efe9cf0ee19fe6054165233fa9906"/>
+ -->
+ <description>Windows 95</description>
+ <year>1995</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="microsoft windows 95 pc-98 (jpn)" sha1="bbec0977ae382c100bfd4d94bcabf4a8f45bb5a7" />
+ </diskarea>
+ </part>
+ </software>
+
+ <!-- Supports IBM PC-AT and PC-98 architectures -->
+ <software name="win98">
+ <!--
+ Origin: Unknown
+ <rom name="Microsoft Windows 98 x86 &amp; PC-98 (JPN).iso" size="508647424" crc="f82c51a9" sha1="3607d2cc8fea57ca915954e9ff2e2cbc82a02fff"/>
+
+ CUE file used for conversion:
+ <rom name="Microsoft Windows 98 x86 &amp; PC-98 (JPN).cue" size="99" crc="1229745f" sha1="5181dc844bf7f7d5acd3e2fad4ad2e2c8af70297"/>
+ -->
+ <description>Windows 98</description>
+ <year>1998</year>
+ <publisher>Microsoft</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="microsoft windows 98 x86 &amp; pc-98 (jpn)" sha1="3be220cca006d5d012db9a29599bbad15c2627a4" />
+ </diskarea>
+ </part>
+ </software>
+
+ <software name="yuno">
+ <!--
+ Origin: Unknown
+ <rom name="yu_no.bin" size="315581440" crc="c6f2d29b" sha1="a245fec6fb7dd0d82eec14dd9625d88e2a30d103"/>
+ <rom name="yu_no.cue" size="645" crc="d375372b" sha1="0bbe382a4e1eebd5a513c84014c414b37354c4be"/>
+ -->
+ <description>Kono Yo no Hate de Koi wo Utau Shoujo YU-NO</description>
+ <year>1996</year>
+ <publisher>エルフ (Elf)</publisher>
+ <part name="cdrom" interface="cdrom">
+ <diskarea name="cdrom">
+ <disk name="yu_no" sha1="3c68242c9eb1ae0d1e79549391afbc988d0ae94f" />
+ </diskarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/scripts/src/video.lua b/scripts/src/video.lua
index 2220e65fff9..95cccd99bfe 100644
--- a/scripts/src/video.lua
+++ b/scripts/src/video.lua
@@ -806,6 +806,18 @@ end
--------------------------------------------------
--
+--@src/devices/video/zeus2.h,VIDEOS["ZEUS2"] = true
+--------------------------------------------------
+
+if (VIDEOS["ZEUS2"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/zeus2.cpp",
+ MAME_DIR .. "src/devices/video/zeus2.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/devices/video/voodoo.h,VIDEOS["VOODOO"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 8496640ed76..d660e649a5c 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -332,6 +332,7 @@ VIDEOS["V9938"] = true
--VIDEOS["VIC4567"] = true
VIDEOS["VOODOO"] = true
VIDEOS["VOODOO_PCI"] = true
+VIDEOS["ZEUS2"] = true
--------------------------------------------------
-- specify available machine cores
diff --git a/src/devices/bus/megadrive/md_carts.cpp b/src/devices/bus/megadrive/md_carts.cpp
index 4c9f1b9b2e0..5a8e1902d09 100644
--- a/src/devices/bus/megadrive/md_carts.cpp
+++ b/src/devices/bus/megadrive/md_carts.cpp
@@ -55,6 +55,7 @@ SLOT_INTERFACE_START(md_cart)
SLOT_INTERFACE_INTERNAL("rom_lion3", MD_ROM_LION3)
SLOT_INTERFACE_INTERNAL("rom_mcpir", MD_ROM_MCPIR)
SLOT_INTERFACE_INTERNAL("rom_mjlov", MD_ROM_MJLOV)
+ SLOT_INTERFACE_INTERNAL("rom_cjmjclub", MD_ROM_CJMJCLUB)
SLOT_INTERFACE_INTERNAL("rom_pokea", MD_ROM_POKEA)
SLOT_INTERFACE_INTERNAL("rom_pokestad", MD_ROM_POKESTAD)
SLOT_INTERFACE_INTERNAL("rom_realtec", MD_ROM_REALTEC)
diff --git a/src/devices/bus/megadrive/md_slot.cpp b/src/devices/bus/megadrive/md_slot.cpp
index 61e847eb6e9..55d80f8b64d 100644
--- a/src/devices/bus/megadrive/md_slot.cpp
+++ b/src/devices/bus/megadrive/md_slot.cpp
@@ -270,6 +270,7 @@ static const md_slot slot_list[] =
{ LIONK3, "rom_lion3" },
{ MC_PIRATE, "rom_mcpir" },
{ MJLOVER, "rom_mjlov" },
+ { CJMJCLUB, "rom_cjmjclub" },
{ POKEMONA, "rom_pokea" },
{ REALTEC, "rom_realtec" },
{ REDCL_EN, "rom_redcl" },
diff --git a/src/devices/bus/megadrive/md_slot.h b/src/devices/bus/megadrive/md_slot.h
index a033daec607..b6cb59147d5 100644
--- a/src/devices/bus/megadrive/md_slot.h
+++ b/src/devices/bus/megadrive/md_slot.h
@@ -61,6 +61,7 @@ enum
LIONK3, /* Lion King 3, Super Donkey Kong 99, Super King Kong 99 */
MC_PIRATE, /* Super 19 in 1, Super 15 in 1, 12 in 1 and a few more multicarts */
MJLOVER, /* Mahjong Lover */
+ CJMJCLUB, /* Super Mahjong Club */
POKEMONA, /* Pocket Monster Alt Protection */
REALTEC, /* Whac a Critter/Mallet legend, Defend the Earth, Funnyworld/Ballonboy */
REDCLIFF, /* Romance of the Three Kingdoms - Battle of Red Cliffs, already decoded from .mdx format */
diff --git a/src/devices/bus/megadrive/rom.cpp b/src/devices/bus/megadrive/rom.cpp
index 16b12561c8a..ed17cfff044 100644
--- a/src/devices/bus/megadrive/rom.cpp
+++ b/src/devices/bus/megadrive/rom.cpp
@@ -41,6 +41,7 @@ const device_type MD_ROM_SMB2 = &device_creator<md_rom_smb2_device>;
const device_type MD_ROM_SBUBL = &device_creator<md_rom_sbubl_device>;
const device_type MD_ROM_RX3 = &device_creator<md_rom_rx3_device>;
const device_type MD_ROM_MJLOV = &device_creator<md_rom_mjlov_device>;
+const device_type MD_ROM_CJMJCLUB = &device_creator<md_rom_cjmjclub_device>;
const device_type MD_ROM_KOF98 = &device_creator<md_rom_kof98_device>;
const device_type MD_ROM_KOF99 = &device_creator<md_rom_kof99_device>;
const device_type MD_ROM_SOULB = &device_creator<md_rom_soulb_device>;
@@ -141,6 +142,11 @@ md_rom_mjlov_device::md_rom_mjlov_device(const machine_config &mconfig, const ch
{
}
+md_rom_cjmjclub_device::md_rom_cjmjclub_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : md_std_rom_device(mconfig, MD_ROM_CJMJCLUB, "MD Chaoji Majiang Club / Super Mahjong Club", tag, owner, clock, "md_rom_cjmjclub", __FILE__)
+{
+}
+
md_rom_kof98_device::md_rom_kof98_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: md_std_rom_device(mconfig, MD_ROM_KOF98, "MD KOF 98", tag, owner, clock, "md_rom_kof98", __FILE__)
{
@@ -917,6 +923,23 @@ READ16_MEMBER(md_rom_mjlov_device::read)
/*-------------------------------------------------
+ CHAOJI MAJIANG CLUB
+ -------------------------------------------------*/
+
+READ16_MEMBER(md_rom_cjmjclub_device::read)
+{
+ if (offset == 0x400000/2) return 0x9000;
+ if (offset == 0x400002/2) return 0xd300;
+
+ // non-protection accesses
+ if (offset < 0x400000/2)
+ return m_rom[MD_ADDR(offset)];
+ else
+ return 0xffff;
+}
+
+
+/*-------------------------------------------------
SUPER BUBBLE BOBBLE MD
-------------------------------------------------*/
diff --git a/src/devices/bus/megadrive/rom.h b/src/devices/bus/megadrive/rom.h
index dcb1536f974..3bafead4346 100644
--- a/src/devices/bus/megadrive/rom.h
+++ b/src/devices/bus/megadrive/rom.h
@@ -263,6 +263,18 @@ public:
virtual DECLARE_READ16_MEMBER(read) override;
};
+// ======================> md_rom_cjmjclub_device
+
+class md_rom_cjmjclub_device : public md_std_rom_device
+{
+public:
+ // construction/destruction
+ md_rom_cjmjclub_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // reading and writing
+ virtual DECLARE_READ16_MEMBER(read) override;
+};
+
// ======================> md_rom_pokea_device
class md_rom_pokea_device : public md_std_rom_device
@@ -585,6 +597,7 @@ extern const device_type MD_ROM_LION2;
extern const device_type MD_ROM_LION3;
extern const device_type MD_ROM_MCPIR;
extern const device_type MD_ROM_MJLOV;
+extern const device_type MD_ROM_CJMJCLUB;
extern const device_type MD_ROM_POKEA;
extern const device_type MD_ROM_POKESTAD;
extern const device_type MD_ROM_REALTEC;
diff --git a/src/devices/cpu/adsp2100/2100ops.hxx b/src/devices/cpu/adsp2100/2100ops.hxx
index 31cae1ae59b..c52767bd9cf 100644
--- a/src/devices/cpu/adsp2100/2100ops.hxx
+++ b/src/devices/cpu/adsp2100/2100ops.hxx
@@ -380,7 +380,11 @@ void adsp21xx_device::write_reg1(int regnum, INT32 val)
break;
case 3:
- logerror("ADSP %04x: Writing to an invalid register!\n", m_ppc);
+ // Check for DMOVLAY instruction callback
+ if (regnum == 0xf && !m_dmovlay_cb.isnull())
+ m_dmovlay_cb(val & 0x3fff);
+ else
+ logerror("ADSP %04x: Writing to an invalid register! RGP=01 RegCode=%1X Val=%04X\n", m_ppc, regnum, val);
break;
}
}
@@ -505,7 +509,7 @@ INT32 adsp21xx_device::read_reg3(int regnum)
case 0x08: if (!m_sport_rx_cb.isnull()) return m_sport_rx_cb(0); else return 0;
case 0x0a: if (!m_sport_rx_cb.isnull()) return m_sport_rx_cb(1); else return 0;
case 0x0f: return pc_stack_pop_val();
- default: logerror("ADSP %04x: Reading from an invalid register!\n", m_ppc); return 0;
+ default: logerror("ADSP %04x: Reading from an invalid register! RGP=b11 RegCode=%1X\n", m_ppc, regnum); return 0;
}
}
diff --git a/src/devices/cpu/adsp2100/adsp2100.cpp b/src/devices/cpu/adsp2100/adsp2100.cpp
index 868303fde40..dd9bdb4209d 100644
--- a/src/devices/cpu/adsp2100/adsp2100.cpp
+++ b/src/devices/cpu/adsp2100/adsp2100.cpp
@@ -157,7 +157,8 @@ adsp21xx_device::adsp21xx_device(const machine_config &mconfig, device_type type
(m_chip_type >= CHIP_TYPE_ADSP2101) ? 0x3f : 0x0f),
m_sport_rx_cb(*this),
m_sport_tx_cb(*this),
- m_timer_fired_cb(*this)
+ m_timer_fired_cb(*this),
+ m_dmovlay_cb(*this)
{
// initialize remaining state
memset(&m_core, 0, sizeof(m_core));
@@ -405,6 +406,7 @@ void adsp21xx_device::device_start()
m_sport_rx_cb.resolve();
m_sport_tx_cb.resolve();
m_timer_fired_cb.resolve();
+ m_dmovlay_cb.resolve();
// get our address spaces
m_program = &space(AS_PROGRAM);
diff --git a/src/devices/cpu/adsp2100/adsp2100.h b/src/devices/cpu/adsp2100/adsp2100.h
index f2393f986d2..282a340e040 100644
--- a/src/devices/cpu/adsp2100/adsp2100.h
+++ b/src/devices/cpu/adsp2100/adsp2100.h
@@ -192,6 +192,9 @@ enum
#define MCFG_ADSP21XX_TIMER_FIRED_CB(_devcb) \
devcb = &adsp21xx_device::set_timer_fired_callback(*device, DEVCB_##_devcb);
+#define MCFG_ADSP21XX_DMOVLAY_CB(_devcb) \
+ devcb = &adsp21xx_device::set_dmovlay_callback(*device, DEVCB_##_devcb);
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -220,6 +223,7 @@ public:
template<class _Object> static devcb_base &set_sport_rx_callback(device_t &device, _Object object) { return downcast<adsp21xx_device &>(device).m_sport_rx_cb.set_callback(object); }
template<class _Object> static devcb_base &set_sport_tx_callback(device_t &device, _Object object) { return downcast<adsp21xx_device &>(device).m_sport_tx_cb.set_callback(object); }
template<class _Object> static devcb_base &set_timer_fired_callback(device_t &device, _Object object) { return downcast<adsp21xx_device &>(device).m_timer_fired_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_dmovlay_callback(device_t &device, _Object object) { return downcast<adsp21xx_device &>(device).m_dmovlay_cb.set_callback(object); }
// public interfaces
void load_boot_data(UINT8 *srcdata, UINT32 *dstdata);
@@ -459,6 +463,7 @@ protected:
devcb_read32 m_sport_rx_cb; // callback for serial receive
devcb_write32 m_sport_tx_cb; // callback for serial transmit
devcb_write_line m_timer_fired_cb; // callback for timer fired
+ devcb_write_line m_dmovlay_cb; // callback for DMOVLAY instruction
// debugging
#if ADSP_TRACK_HOTSPOTS
diff --git a/src/devices/cpu/sparc/mb86901.cpp b/src/devices/cpu/sparc/mb86901.cpp
index 82bde76b7c2..382aa865522 100644
--- a/src/devices/cpu/sparc/mb86901.cpp
+++ b/src/devices/cpu/sparc/mb86901.cpp
@@ -165,6 +165,12 @@ void mb86901_device::device_stop()
void mb86901_device::device_reset()
{
+ m_queued_tt = 0;
+ m_queued_priority = 0;
+ m_asi = 0;
+ MAE = false;
+ HOLD_BUS = false;
+
PC = 0;
nPC = 4;
memset(m_r, 0, sizeof(UINT32) * 120);
@@ -699,7 +705,7 @@ bool mb86901_device::execute_group2(UINT32 op)
bool v = ((arg1 & 0x80000000) == (arg2 & 0x80000000) && (arg2 & 0x80000000) != (result & 0x80000000)) || ((arg1 & 3) != 0) || ((arg2 & 3) != 0);
if (v)
{
- queue_trap(sparc_tag_overflow);
+ trap(SPARC_TAG_OVERFLOW);
}
else
{
@@ -716,7 +722,7 @@ bool mb86901_device::execute_group2(UINT32 op)
bool v = ((arg1 & 0x80000000) == (arg2 & 0x80000000) && (arg2 & 0x80000000) != (result & 0x80000000)) || ((arg1 & 3) != 0) || ((arg2 & 3) != 0);
if (v)
{
- queue_trap(sparc_tag_overflow);
+ trap(SPARC_TAG_OVERFLOW);
}
else
{
@@ -795,7 +801,7 @@ bool mb86901_device::execute_group2(UINT32 op)
case 41: // rd psr
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
@@ -805,7 +811,7 @@ bool mb86901_device::execute_group2(UINT32 op)
case 42: // rd wim
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
@@ -815,7 +821,7 @@ bool mb86901_device::execute_group2(UINT32 op)
case 43: // rd tbr
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
@@ -837,14 +843,14 @@ bool mb86901_device::execute_group2(UINT32 op)
case 49: // wr psr
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
UINT32 new_psr = (arg1 ^ arg2) & ~PSR_ZERO_MASK;
if ((new_psr & PSR_CWP_MASK) >= WINDOW_COUNT)
{
- queue_trap(sparc_illegal_instruction);
+ trap(SPARC_ILLEGAL_INSTRUCTION);
}
else
{
@@ -856,7 +862,7 @@ bool mb86901_device::execute_group2(UINT32 op)
case 50: // wr wim
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
@@ -866,7 +872,7 @@ bool mb86901_device::execute_group2(UINT32 op)
case 51: // wr tbr
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
@@ -876,13 +882,13 @@ bool mb86901_device::execute_group2(UINT32 op)
case 52: // FPop1
if (FPU_DISABLED)
{
- queue_trap(sparc_floating_point_disabled);
+ trap(SPARC_FLOATING_POINT_DISABLED);
}
break;
case 53: // FPop2
if (FPU_DISABLED)
{
- queue_trap(sparc_floating_point_disabled);
+ trap(SPARC_FLOATING_POINT_DISABLED);
}
break;
case 56: // jmpl
@@ -891,7 +897,7 @@ bool mb86901_device::execute_group2(UINT32 op)
m_icount--;
if (addr & 3)
{
- queue_trap(sparc_mem_address_not_aligned);
+ trap(SPARC_MEM_ADDRESS_NOT_ALIGNED);
}
else
{
@@ -909,11 +915,11 @@ bool mb86901_device::execute_group2(UINT32 op)
{
if (IS_USER)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
}
else
{
- queue_trap(sparc_illegal_instruction);
+ trap(SPARC_ILLEGAL_INSTRUCTION);
}
break;
}
@@ -921,17 +927,17 @@ bool mb86901_device::execute_group2(UINT32 op)
{
if (IS_USER)
{
- queue_trap(sparc_reset, sparc_privileged_instruction);
+ trap(SPARC_RESET, SPARC_PRIVILEGED_INSTRUCTION);
break;
}
else if (m_wim & (1 << new_cwp))
{
- queue_trap(sparc_reset, sparc_window_underflow);
+ trap(SPARC_RESET, SPARC_WINDOW_UNDERFLOW);
break;
}
else if (ADDRESS & 3)
{
- queue_trap(sparc_reset, sparc_mem_address_not_aligned);
+ trap(SPARC_RESET, SPARC_MEM_ADDRESS_NOT_ALIGNED);
break;
}
}
@@ -963,7 +969,7 @@ bool mb86901_device::execute_group2(UINT32 op)
UINT8 new_cwp = ((m_cwp + WINDOW_COUNT) - 1) % WINDOW_COUNT;
if (m_wim & (1 << new_cwp))
{
- queue_trap(sparc_window_overflow);
+ trap(SPARC_WINDOW_OVERFLOW);
}
else
{
@@ -976,7 +982,7 @@ bool mb86901_device::execute_group2(UINT32 op)
UINT8 new_cwp = (m_cwp + 1) % WINDOW_COUNT;
if (m_wim & (1 << new_cwp))
{
- queue_trap(sparc_window_overflow);
+ trap(SPARC_WINDOW_UNDERFLOW);
}
else
{
@@ -985,7 +991,7 @@ bool mb86901_device::execute_group2(UINT32 op)
break;
}
default:
- queue_trap(sparc_illegal_instruction);
+ trap(SPARC_ILLEGAL_INSTRUCTION);
break;
}
@@ -1014,17 +1020,17 @@ bool mb86901_device::check_main_traps(UINT32 op, bool privileged, UINT32 alignme
bool trap_queued = false;
if (privileged && !m_s)
{
- queue_trap(sparc_privileged_instruction);
+ trap(SPARC_PRIVILEGED_INSTRUCTION);
trap_queued = true;
}
if (alignment & ADDRESS)
{
- queue_trap(sparc_mem_address_not_aligned);
+ trap(SPARC_MEM_ADDRESS_NOT_ALIGNED);
trap_queued = true;
}
if ((registeralign & RD) || (noimmediate && USEIMM))
{
- queue_trap(sparc_illegal_instruction);
+ trap(SPARC_ILLEGAL_INSTRUCTION);
trap_queued = true;
}
return trap_queued;
@@ -1051,21 +1057,44 @@ void mb86901_device::execute_group3(UINT32 op)
switch (OP3)
{
case 0: // ld
+ {
check_main_traps(op, false, 3, 0, false);
- SET_RDREG(read_word(m_data_asi, ADDRESS));
+ UINT32 result = read_word(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 1: // ldub
- SET_RDREG(read_byte(m_data_asi, ADDRESS));
+ {
+ UINT32 result = read_byte(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 2: // lduh
+ {
check_main_traps(op, false, 1, 0, false);
- SET_RDREG(read_half(m_data_asi, ADDRESS));
+ UINT32 result = read_half(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 3: // ldd
+ {
check_main_traps(op, false, 7, 1, false);
- SET_RDREG(read_word(m_data_asi, ADDRESS));
- REG(RD+1) = read_word(m_data_asi, ADDRESS+4);
+ UINT32 result = read_word(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
+ result = read_word(m_data_asi, ADDRESS+4);
+ if (MAE || HOLD_BUS)
+ break;
+ REG(RD+1) = result;
break;
+ }
case 4: // st
check_main_traps(op, false, 3, 0, false);
write_word(m_data_asi, ADDRESS, RDREG);
@@ -1080,38 +1109,78 @@ void mb86901_device::execute_group3(UINT32 op)
case 7: // std
check_main_traps(op, false, 7, 1, false);
write_word(m_data_asi, ADDRESS, RDREG);
+ if (MAE || HOLD_BUS)
+ break;
write_word(m_data_asi, ADDRESS, REG(RD+1));
break;
case 9: // ldsb
- SET_RDREG(read_signed_byte(m_data_asi, ADDRESS));
+ {
+ UINT32 result = read_signed_byte(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 10: // lsdh
+ {
check_main_traps(op, false, 1, 0, false);
- SET_RDREG(read_signed_half(m_data_asi, ADDRESS));
+ UINT32 result = read_signed_half(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 13: // ldstub
- SET_RDREG(read_byte(m_data_asi, ADDRESS));
+ {
+ UINT32 result = read_byte(m_data_asi, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
write_byte(m_data_asi, ADDRESS, 0xff);
break;
+ }
case 15: // swap, SPARCv8
break;
case 16: // lda
+ {
check_main_traps(op, true, 3, 0, true);
- SET_RDREG(read_word(ASI, ADDRESS));
+ UINT32 result = read_word(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 17: // lduba
+ {
check_main_traps(op, true, 0, 0, true);
- SET_RDREG(read_byte(ASI, ADDRESS));
+ UINT32 result = read_byte(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 18: // lduha
+ {
check_main_traps(op, true, 1, 0, true);
- SET_RDREG(read_half(ASI, ADDRESS));
+ UINT32 result = read_half(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 19: // ldda
+ {
check_main_traps(op, true, 7, 1, true);
- SET_RDREG(read_word(ASI, ADDRESS));
- REG(RD+1) = read_word(ASI, ADDRESS+4);
+ UINT32 result = read_word(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
+ result = read_word(ASI, ADDRESS+4);
+ if (MAE || HOLD_BUS)
+ break;
+ REG(RD+1) = result;
break;
+ }
case 20: // sta
check_main_traps(op, true, 3, 0, true);
write_word(ASI, ADDRESS, RDREG);
@@ -1127,36 +1196,67 @@ void mb86901_device::execute_group3(UINT32 op)
case 23: // stda
check_main_traps(op, true, 7, 1, true);
write_word(ASI, ADDRESS, RDREG);
+ if (MAE || HOLD_BUS)
+ break;
write_word(ASI, ADDRESS+4, REG(RD+1));
break;
case 25: // ldsba
+ {
check_main_traps(op, true, 0, 0, true);
- SET_RDREG(read_signed_byte(ASI, ADDRESS));
+ UINT32 result = read_signed_byte(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 26: // ldsha
+ {
check_main_traps(op, true, 1, 0, true);
- SET_RDREG(read_signed_half(ASI, ADDRESS));
+ UINT32 result = read_signed_half(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
break;
+ }
case 29: // ldstuba
+ {
check_main_traps(op, true, 0, 0, true);
- SET_RDREG(read_byte(ASI, ADDRESS));
+ UINT32 result = read_byte(ASI, ADDRESS);
+ if (MAE || HOLD_BUS)
+ break;
+ SET_RDREG(result);
write_byte(ASI, ADDRESS, 0xff);
break;
+ }
case 31: // swapa, SPARCv8
break;
case 32: // ld fpr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 33: // ld fsr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 35: // ldd fpr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 36: // st fpr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 37: // st fsr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 38: // std fq, SPARCv8
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 39: // std fpr
+ if (FPU_DISABLED)
+ trap(SPARC_FLOATING_POINT_DISABLED);
break;
case 40: // ld cpr, SPARCv8
break;
@@ -1174,7 +1274,10 @@ void mb86901_device::execute_group3(UINT32 op)
break;
}
- m_icount -= ldst_cycles[OP3];
+ if (MAE || HOLD_BUS)
+ m_icount--;
+ else
+ m_icount -= ldst_cycles[OP3];
}
@@ -1253,7 +1356,7 @@ bool mb86901_device::execute_ticc(UINT32 op)
{
UINT32 arg2 = USEIMM ? SIMM7 : RS2REG;
UINT8 tt = 128 + ((RS1REG + arg2) & 0x7f);
- queue_trap(sparc_trap_instruction, tt);
+ trap(SPARC_TRAP_INSTRUCTION, tt);
m_icount -= 3;
return false;
}
@@ -1263,24 +1366,32 @@ bool mb86901_device::execute_ticc(UINT32 op)
//-------------------------------------------------
-// queue_trap - flag an incoming trap of a given
+// trap - flag an incoming trap of a given
// type
//-------------------------------------------------
-void mb86901_device::queue_trap(UINT8 type, UINT8 tt_override)
+void mb86901_device::trap(UINT8 type, UINT8 tt_override)
{
- if (type == sparc_reset)
+ if (type == SPARC_RESET)
{
m_queued_priority = m_trap_priorities[0];
m_queued_tt = tt_override;
}
else
{
- if (type == sparc_trap_instruction)
+ if (type == SPARC_TRAP_INSTRUCTION)
{
type = tt_override;
}
+ if (type >= SPARC_INT1 && type <= SPARC_INT14)
+ {
+ if (!ET)
+ return;
+ int irl = (type - SPARC_INT1) + 1;
+ if (irl <= PIL)
+ return;
+ }
if (m_trap_priorities[type] < m_queued_priority)
{
m_queued_priority = m_trap_priorities[type];
@@ -1302,6 +1413,7 @@ bool mb86901_device::invoke_queued_traps()
if (m_queued_priority > 0)
{
m_queued_priority = 0;
+ m_queued_tt = 0;
m_et = false;
m_ps = m_s;
@@ -1336,8 +1448,20 @@ void mb86901_device::execute_run()
while (m_icount > 0)
{
+ bool trap_was_queued = invoke_queued_traps();
+ if (trap_was_queued)
+ {
+ m_icount -= 4;
+ continue;
+ }
+
debugger_instruction_hook(this, m_pc);
+ if (HOLD_BUS)
+ {
+ m_icount--;
+ continue;
+ }
UINT32 op = GET_OPCODE;
bool update_npc = true;
@@ -1390,7 +1514,7 @@ void mb86901_device::execute_run()
REG(0) = 0;
bool trap_taken = invoke_queued_traps();
- if (!trap_taken && update_npc)
+ if (!trap_taken && update_npc && !HOLD_BUS)
{
PC = nPC;
nPC = PC + 4;
diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h
index 0c23bdbe29c..324d46137a9 100644
--- a/src/devices/cpu/sparc/sparc.h
+++ b/src/devices/cpu/sparc/sparc.h
@@ -9,6 +9,34 @@
#ifndef __SPARC_H__
#define __SPARC_H__
+#define SPARC_RESET 0
+#define SPARC_INSTRUCTION_ACCESS_EXCEPTION 1
+#define SPARC_ILLEGAL_INSTRUCTION 2
+#define SPARC_PRIVILEGED_INSTRUCTION 3
+#define SPARC_FLOATING_POINT_DISABLED 4
+#define SPARC_WINDOW_OVERFLOW 5
+#define SPARC_WINDOW_UNDERFLOW 6
+#define SPARC_MEM_ADDRESS_NOT_ALIGNED 7
+#define SPARC_FLOATING_POINT_EXCEPTION 8
+#define SPARC_DATA_ACCESS_EXCEPTION 9
+#define SPARC_TAG_OVERFLOW 10
+#define SPARC_INT1 17
+#define SPARC_INT2 18
+#define SPARC_INT3 19
+#define SPARC_INT4 20
+#define SPARC_INT5 21
+#define SPARC_INT6 22
+#define SPARC_INT7 23
+#define SPARC_INT8 24
+#define SPARC_INT9 25
+#define SPARC_INT10 26
+#define SPARC_INT11 27
+#define SPARC_INT12 28
+#define SPARC_INT13 29
+#define SPARC_INT14 30
+#define SPARC_INT15 31
+#define SPARC_TRAP_INSTRUCTION 128
+
class mb86901_device : public cpu_device
{
public:
@@ -40,8 +68,12 @@ public:
UINT8 get_asi() { return m_asi; }
UINT32 pc() { return m_pc; }
+ void trap(UINT8 type, UINT8 tt_override = 0);
+ void set_mae() { m_mae = true; }
+ void hold_bus() { m_hold_bus = true; }
+ void release_bus() { m_hold_bus = false; }
+
protected:
- void queue_trap(UINT8 type, UINT8 tt_override = 0);
bool invoke_queued_traps();
bool check_main_traps(UINT32 op, bool privileged, UINT32 alignment, UINT8 registeralign, bool noimmediate);
@@ -103,6 +135,8 @@ protected:
UINT8 m_trap_priorities[256];
UINT8 m_queued_tt;
UINT8 m_queued_priority;
+ bool m_mae;
+ bool m_hold_bus;
int m_icount;
// debugger helpers
diff --git a/src/devices/cpu/sparc/sparcdefs.h b/src/devices/cpu/sparc/sparcdefs.h
index dbc50fd4e00..185845c1d4f 100644
--- a/src/devices/cpu/sparc/sparcdefs.h
+++ b/src/devices/cpu/sparc/sparcdefs.h
@@ -114,35 +114,9 @@
#define Y m_y
-enum sparc_trap_type
-{
- sparc_reset = 0,
- sparc_instruction_access_exception = 1,
- sparc_illegal_instruction = 2,
- sparc_privileged_instruction = 3,
- sparc_floating_point_disabled = 4,
- sparc_window_overflow = 5,
- sparc_window_underflow = 6,
- sparc_mem_address_not_aligned = 7,
- sparc_floating_point_exception = 8,
- sparc_data_access_exception = 9,
- sparc_tag_overflow = 10,
- sparc_int1 = 17,
- sparc_int2 = 18,
- sparc_int3 = 19,
- sparc_int4 = 20,
- sparc_int5 = 21,
- sparc_int6 = 22,
- sparc_int7 = 23,
- sparc_int8 = 24,
- sparc_int9 = 25,
- sparc_int10 = 26,
- sparc_int11 = 27,
- sparc_int12 = 28,
- sparc_int13 = 29,
- sparc_int14 = 30,
- sparc_int15 = 31,
- sparc_trap_instruction = 128
-};
+#define ET m_et
+#define PIL m_pil
+#define MAE m_mae
+#define HOLD_BUS m_hold_bus
#endif // __MB86901_DEFS_H__ \ No newline at end of file
diff --git a/src/devices/machine/8530scc.cpp b/src/devices/machine/8530scc.cpp
index c618fd57004..25484798b36 100644
--- a/src/devices/machine/8530scc.cpp
+++ b/src/devices/machine/8530scc.cpp
@@ -447,7 +447,7 @@ void scc8530_t::set_reg_a(int reg, UINT8 data)
/*-------------------------------------------------
- scc8530_set_reg_a
+ scc8530_set_reg_b
-------------------------------------------------*/
void scc8530_t::set_reg_b(int reg, UINT8 data)
@@ -457,46 +457,41 @@ void scc8530_t::set_reg_b(int reg, UINT8 data)
-/*-------------------------------------------------
- scc8530_r
--------------------------------------------------*/
+//-------------------------------------------------
+// reg_r - read handler, trampolines into normal
+// getter
+//-------------------------------------------------
-READ8_MEMBER( scc8530_t::reg_r)
+READ8_MEMBER(scc8530_t::reg_r)
{
- UINT8 result = 0;
+ return read_reg(offset & 3);
+}
- offset %= 4;
+
+//-------------------------------------------------
+// read_reg - reads either the control or data
+// port for either SCC channel.
+//-------------------------------------------------
+
+UINT8 scc8530_t::read_reg(int offset)
+{
switch(offset)
{
- case 0:
- /* Channel B (Printer Port) Control */
- if (mode == 1)
- mode = 0;
- else
- reg = 0;
-
- result = getbreg();
- break;
+ case 0: /* Channel B (Printer Port) Control */
+ case 1: /* Channel A (Modem Port) Control */
- case 1:
- /* Channel A (Modem Port) Control */
if (mode == 1)
mode = 0;
else
reg = 0;
- result = getareg();
- break;
-
- case 2:
- /* Channel B (Printer Port) Data */
- result = channel[1].rxData;
+ result = (offset == 0) ? getbreg(); : getareg()
break;
- case 3:
- /* Channel A (Modem Port) Data */
- result = channel[0].rxData;
+ case 2: /* Channel B (Printer Port) Data */
+ case 3:/* Channel A (Modem Port) Data */
+ result = channel[offset == 2 ? 1 : 0].rxData;
break;
}
return result;
@@ -504,116 +499,85 @@ READ8_MEMBER( scc8530_t::reg_r)
-/*-------------------------------------------------
- scc8530_w
--------------------------------------------------*/
+//-------------------------------------------------
+// reg_w - write handler, trampolines into normal
+// setter
+//-------------------------------------------------
WRITE8_MEMBER( scc8530_t::reg_w )
{
- Chan *pChan;
+ write_reg(offset & 3, data);
+}
+
- offset &= 3;
+
+//-------------------------------------------------
+// write_reg - writes either the control or data
+// port for either SCC channel.
+//-------------------------------------------------
+
+void scc8530_t::write_reg(int offset, UINT8 data)
+{
+ offset & 3;
// printf(" mode %d data %x offset %d \n", mode, data, offset);
+ Chan *pChan;
switch(offset)
{
- case 0:
- /* Channel B (Printer Port) Control */
- if (mode == 0)
- {
- if((data & 0xf0) == 0) // not a reset command
- {
- mode = 1;
- reg = data & 0x0f;
-// putbreg(data & 0xf0);
- }
- else if (data == 0x10)
- {
- pChan = &channel[1];
- // clear ext. interrupts
- pChan->extIRQPending = 0;
- pChan->baudIRQPending = 0;
- updateirqs();
- }
- }
- else
- {
- mode = 0;
- putreg(1, data);
- }
- break;
-
- case 1:
- /* Channel A (Modem Port) Control */
+ case 0: /* Channel B (Printer Port) Control */
+ case 1: /* Channel A (Modem Port) Control */
+ {
+ int chan = ((offset == 2) ? 1 : 0);
if (mode == 0)
{
if((data & 0xf0) == 0) // not a reset command
{
mode = 1;
reg = data & 0x0f;
-// putareg(data & 0xf0);
+// putbreg(data & 0xf0);
}
else if (data == 0x10)
{
- pChan = &channel[0];
// clear ext. interrupts
- pChan->extIRQPending = 0;
- pChan->baudIRQPending = 0;
+ channel[chan].extIRQPending = 0;
+ channel[chan].baudIRQPending = 0;
updateirqs();
}
}
else
{
mode = 0;
- putreg(0, data);
+ putreg(chan, data);
}
break;
+ }
- case 2:
- /* Channel B (Printer Port) Data */
- pChan = &channel[1];
-
- if (pChan->txEnable)
- {
- pChan->txData = data;
- // local loopback?
- if (pChan->reg_val[14] & 0x10)
- {
- pChan->rxData = data;
- pChan->reg_val[0] |= 0x01; // Rx character available
- }
- pChan->reg_val[1] |= 0x01; // All sent
- pChan->reg_val[0] |= 0x04; // Tx empty
- pChan->txUnderrun = 1;
- pChan->txIRQPending = 1;
- updateirqs();
- }
- break;
-
- case 3:
- /* Channel A (Modem Port) Data */
- pChan = &channel[0];
-
- if (pChan->txEnable)
+ case 2: /* Channel B (Printer Port) Data */
+ case 3: /* Channel A (Modem Port) Data */
+ {
+ int chan = ((offset == 2) ? 1 : 0);
+ if (channel[chan].txEnable)
{
- pChan->txData = data;
+ channel[chan].txData = data;
// local loopback?
- if (pChan->reg_val[14] & 0x10)
+ if (channel[chan].reg_val[14] & 0x10)
{
- pChan->rxData = data;
- pChan->reg_val[0] |= 0x01; // Rx character available
+ channel[chan].rxData = data;
+ channel[chan].reg_val[0] |= 0x01; // Rx character available
}
- pChan->reg_val[1] |= 0x01; // All sent
- pChan->reg_val[0] |= 0x04; // Tx empty
- pChan->txUnderrun = 1;
- pChan->txIRQPending = 1;
+ channel[chan].reg_val[1] |= 0x01; // All sent
+ channel[chan].reg_val[0] |= 0x04; // Tx empty
+ channel[chan].txUnderrun = 1;
+ channel[chan].txIRQPending = 1;
updateirqs();
}
break;
+ }
}
}
+
/*
AppleTalk check:
diff --git a/src/devices/machine/8530scc.h b/src/devices/machine/8530scc.h
index 2e6e703ceb8..b711f7cdabe 100644
--- a/src/devices/machine/8530scc.h
+++ b/src/devices/machine/8530scc.h
@@ -43,6 +43,9 @@ public:
DECLARE_READ8_MEMBER(reg_r);
DECLARE_WRITE8_MEMBER(reg_w);
+ void write_reg(int offset, UINT8 data);
+ UINT8 read_reg(int offset);
+
protected:
virtual void device_start() override;
virtual void device_reset() override;
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
new file mode 100644
index 00000000000..02e9b9d9e52
--- /dev/null
+++ b/src/devices/video/zeus2.cpp
@@ -0,0 +1,1311 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/*************************************************************************
+
+ Midway Zeus2 Video
+
+**************************************************************************/
+#include "zeus2.h"
+
+#define LOG_REGS 0
+
+/*************************************
+* Constructor
+*************************************/
+zeus2_renderer::zeus2_renderer(zeus2_device *state)
+ : poly_manager<float, zeus2_poly_extra_data, 4, 10000>(state->machine())
+ , m_state(state)
+{
+}
+
+const device_type ZEUS2 = &device_creator<zeus2_device>;
+
+zeus2_device::zeus2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ZEUS2, "Midway Zeus2", tag, owner, clock, "zeus2", __FILE__),
+ m_vblank(*this), m_irq(*this)
+{
+}
+
+/*************************************
+* Display interrupt generation
+*************************************/
+
+TIMER_CALLBACK_MEMBER(zeus2_device::display_irq_off)
+{
+ m_vblank(CLEAR_LINE);
+
+ //attotime vblank_period = m_screen->time_until_pos(m_zeusbase[0x37] & 0xffff);
+
+ ///* if zero, adjust to next frame, otherwise we may get stuck in an infinite loop */
+ //if (vblank_period == attotime::zero)
+ // vblank_period = m_screen->frame_period();
+ //vblank_timer->adjust(vblank_period);
+ vblank_timer->adjust(m_screen->time_until_vblank_start());
+ //machine().scheduler().timer_set(attotime::from_hz(30000000), timer_expired_delegate(FUNC(zeus2_device::display_irq), this));
+}
+
+TIMER_CALLBACK_MEMBER(zeus2_device::display_irq)
+{
+ m_vblank(ASSERT_LINE);
+ /* set a timer for the next off state */
+ //machine().scheduler().timer_set(m_screen->time_until_pos(0), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this), 0, this);
+ machine().scheduler().timer_set(m_screen->time_until_vblank_end(), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this), 0, this);
+ //machine().scheduler().timer_set(attotime::from_hz(30000000), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this));
+}
+
+TIMER_CALLBACK_MEMBER(zeus2_device::int_timer_callback)
+{
+ //m_maincpu->set_input_line(2, ASSERT_LINE);
+ m_irq(ASSERT_LINE);
+}
+
+/*************************************
+ * Video startup
+ *************************************/
+
+
+void zeus2_device::device_start()
+{
+
+ /* allocate memory for "wave" RAM */
+ waveram[0] = auto_alloc_array(machine(), UINT32, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
+ waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
+
+ /* initialize polygon engine */
+ poly = auto_alloc(machine(), zeus2_renderer(this));
+
+ //m_screen = machine().first_screen();
+ m_screen = downcast<screen_device *>(machine().device("screen"));
+ m_vblank.resolve_safe();
+ m_irq.resolve_safe();
+
+ /* we need to cleanup on exit */
+ //machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(zeus2_device::exit_handler2), this));
+
+ int_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(zeus2_device::int_timer_callback), this));
+ vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(zeus2_device::display_irq), this));
+
+ /* save states */
+ save_pointer(NAME(waveram[0]), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / sizeof(waveram[0][0]));
+ save_pointer(NAME(waveram[1]), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12 / sizeof(waveram[1][0]));
+ save_pointer(NAME(m_zeusbase), sizeof(m_zeusbase[0])*0x80);
+ save_item(NAME(zeus_fifo));
+ save_item(NAME(zeus_fifo_words));
+ save_item(NAME(zeus_cliprect.min_x));
+ save_item(NAME(zeus_cliprect.max_x));
+ save_item(NAME(zeus_cliprect.min_y));
+ save_item(NAME(zeus_cliprect.max_y));
+ save_item(NAME(zeus_matrix));
+ save_item(NAME(zeus_point));
+ save_item(NAME(zeus_texbase));
+ save_item(NAME(m_fill_color));
+ save_item(NAME(m_fill_depth));
+}
+
+void zeus2_device::device_reset()
+{
+ memset(m_zeusbase, 0, sizeof(m_zeusbase));
+ zbase = 2.0f;
+ m_yScale = 0;
+ yoffs = 0;
+ texel_width = 256;
+ zeus_renderbase = waveram[1];
+ zeus_fifo_words = 0;
+ m_fill_color = 0;
+ m_fill_depth = 0;
+}
+
+void zeus2_device::device_stop()
+{
+#if DUMP_WAVE_RAM
+ FILE *f = fopen("waveram.dmp", "w");
+ int i;
+
+ for (i = 0; i < WAVERAM0_WIDTH * WAVERAM0_HEIGHT; i++)
+ {
+ if (i % 4 == 0) fprintf(f, "%03X%03X: ", i / WAVERAM0_WIDTH, i % WAVERAM0_WIDTH);
+ fprintf(f, " %08X %08X ",
+ WAVERAM_READ32(waveram[0], i*2+0),
+ WAVERAM_READ32(waveram[0], i*2+1));
+ if (i % 4 == 3) fprintf(f, "\n");
+ }
+ fclose(f);
+#endif
+
+#if TRACK_REG_USAGE
+{
+ reg_info *info;
+ int regnum;
+
+ for (regnum = 0; regnum < 0x80; regnum++)
+ {
+ printf("Register %02X\n", regnum);
+ if (regread_count[regnum] == 0)
+ printf("\tNever read\n");
+ else
+ printf("\tRead %d times\n", regread_count[regnum]);
+
+ if (regwrite_count[regnum] == 0)
+ printf("\tNever written\n");
+ else
+ {
+ printf("\tWritten %d times\n", regwrite_count[regnum]);
+ for (info = regdata[regnum]; info != nullptr; info = info->next)
+ printf("\t%08X\n", info->value);
+ }
+ }
+
+ for (regnum = 0; regnum < 0x100; regnum++)
+ if (subregwrite_count[regnum] != 0)
+ {
+ printf("Sub-Register %02X (%d writes)\n", regnum, subregwrite_count[regnum]);
+ for (info = subregdata[regnum]; info != nullptr; info = info->next)
+ printf("\t%08X\n", info->value);
+ }
+}
+#endif
+
+}
+
+
+
+/*************************************
+ *
+ * Video update
+ *
+ *************************************/
+
+UINT32 zeus2_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ int x, y;
+
+ poly->wait();
+
+if (machine().input().code_pressed(KEYCODE_UP)) { zbase += 1.0f; popmessage("Zbase = %f", (double) zbase); }
+if (machine().input().code_pressed(KEYCODE_DOWN)) { zbase -= 1.0f; popmessage("Zbase = %f", (double) zbase); }
+
+ /* normal update case */
+ if (!machine().input().code_pressed(KEYCODE_W))
+ {
+ const void *base = waveram1_ptr_from_expanded_addr(m_zeusbase[0x38] >> m_yScale);
+ int xoffs = screen.visible_area().min_x;
+ for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ UINT32 *dest = &bitmap.pix32(y);
+ UINT32 bufY = y >> m_yScale;
+ UINT32 bufOffsX = (m_yScale && (y & 1)) ? 0x200 : 0;
+ for (x = cliprect.min_x; x <= cliprect.max_x; x++) {
+ UINT32 bufX = x - xoffs + bufOffsX;
+ dest[x] = WAVERAM_READPIX(base, bufY, bufX);
+ //dest[x] = WAVERAM_READPIX(base, y, x - xoffs);
+ }
+ }
+ }
+
+ /* waveram drawing case */
+ else
+ {
+ const UINT64 *base;
+
+ if (machine().input().code_pressed(KEYCODE_DOWN)) yoffs += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
+ if (machine().input().code_pressed(KEYCODE_UP)) yoffs -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1;
+ if (machine().input().code_pressed(KEYCODE_LEFT) && texel_width > 4) { texel_width >>= 1; while (machine().input().code_pressed(KEYCODE_LEFT)) ; }
+ if (machine().input().code_pressed(KEYCODE_RIGHT) && texel_width < 512) { texel_width <<= 1; while (machine().input().code_pressed(KEYCODE_RIGHT)) ; }
+
+ if (yoffs < 0) yoffs = 0;
+ if (0)
+ base = (const UINT64 *)waveram0_ptr_from_expanded_addr(yoffs << 16);
+ else
+ base = (const UINT64 *)waveram1_ptr_from_expanded_addr(yoffs << 16);
+
+ int xoffs = screen.visible_area().min_x;
+ for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ {
+ UINT32 *dest = &bitmap.pix32(y);
+ for (x = cliprect.min_x; x <= cliprect.max_x; x++)
+ {
+ if (0) {
+ UINT8 tex = get_texel_8bit(base, y, x, texel_width);
+ dest[x] = (tex << 16) | (tex << 8) | tex;
+ }
+ else {
+ dest[x] = WAVERAM_READPIX(base, y, x - xoffs);
+ }
+ }
+ }
+ popmessage("offs = %06X", yoffs);
+ }
+
+ return 0;
+}
+
+
+
+/*************************************
+ *
+ * Core read handler
+ *
+ *************************************/
+
+READ32_MEMBER( zeus2_device::zeus2_r )
+{
+ int logit = (offset != 0x00 && offset != 0x01 &&
+ offset != 0x48 && offset != 0x49 &&
+ offset != 0x54 && offset != 0x58 && offset != 0x59 && offset != 0x5a);
+ logit &= LOG_REGS;
+ UINT32 result = m_zeusbase[offset];
+#if TRACK_REG_USAGE
+ regread_count[offset]++;
+#endif
+
+ switch (offset)
+ {
+ case 0x00:
+ result = 0x20;
+ break;
+
+ case 0x01:
+ /* bit $000C0070 are tested in a loop until 0 */
+ /* bits $00080000 is tested in a loop until 0 */
+ /* bit $00000004 is tested for toggling; probably VBLANK */
+ result = 0x00;
+ if (m_screen->vblank())
+ result |= 0x04;
+ break;
+
+ case 0x07:
+ /* this is needed to pass the self-test in thegrid */
+ result = 0x10451998;
+ break;
+
+ case 0x54:
+ /* both upper 16 bits and lower 16 bits seem to be used as vertical counters */
+ result = (m_screen->vpos() << 16) | m_screen->vpos();
+ break;
+ }
+
+ if (logit)
+ logerror("%08X:zeus2_r(%02X) = %08X\n", machine().device("maincpu")->safe_pc(), offset, result);
+
+ return result;
+}
+
+
+
+/*************************************
+ *
+ * Core write handler
+ *
+ *************************************/
+
+WRITE32_MEMBER( zeus2_device::zeus2_w )
+{
+ int logit = (offset != 0x08 &&
+ (offset != 0x20 || data != 0) &&
+ offset != 0x40 && offset != 0x41 && offset != 0x48 && offset != 0x49 && offset != 0x4e &&
+ offset != 0x50 && offset != 0x51 && offset != 0x57 && offset != 0x58 && offset != 0x59 && offset != 0x5a && offset != 0x5e);
+ logit &= LOG_REGS;
+ if (logit)
+ logerror("%08X:zeus2_w", machine().device("maincpu")->safe_pc());
+ zeus2_register32_w(offset, data, logit);
+}
+
+
+
+/*************************************
+ *
+ * Handle register writes
+ *
+ *************************************/
+
+void zeus2_device::zeus2_register32_w(offs_t offset, UINT32 data, int logit)
+{
+ UINT32 oldval = m_zeusbase[offset];
+
+#if TRACK_REG_USAGE
+regwrite_count[offset]++;
+if (regdata_count[offset] < 256)
+{
+ reg_info **tailptr;
+
+ for (tailptr = &regdata[offset]; *tailptr != nullptr; tailptr = &(*tailptr)->next)
+ if ((*tailptr)->value == data)
+ break;
+ if (*tailptr == nullptr)
+ {
+ *tailptr = alloc_or_die(reg_info);
+ (*tailptr)->next = nullptr;
+ (*tailptr)->value = data;
+ regdata_count[offset]++;
+ }
+}
+#endif
+
+ /* writes to register $CC need to force a partial update */
+// if ((offset & ~1) == 0xcc)
+// m_screen->update_partial(m_screen->vpos());
+
+ /* always write to low word? */
+ m_zeusbase[offset] = data;
+
+ /* log appropriately */
+ if (logit)
+ logerror("(%02X) = %08X\n", offset, data);
+
+ /* handle the update */
+ zeus2_register_update(offset, oldval, logit);
+}
+
+
+
+/*************************************
+ *
+ * Update state after a register write
+ *
+ *************************************/
+
+void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit)
+{
+ /* handle the writes; only trigger on low accesses */
+ switch (offset)
+ {
+ case 0x08:
+ zeus_fifo[zeus_fifo_words++] = m_zeusbase[0x08];
+ if (zeus2_fifo_process(zeus_fifo, zeus_fifo_words))
+ zeus_fifo_words = 0;
+
+ /* set the interrupt signal to indicate we can handle more */
+ int_timer->adjust(attotime::from_nsec(500));
+ break;
+
+ case 0x20:
+ /* toggles between two values based on the page:
+
+ Page # m_zeusbase[0x20] m_zeusbase[0x38]
+ ------ -------------- --------------
+ 0 $04000190 $00000000
+ 1 $04000000 $01900000
+ */
+ zeus2_pointer_write(m_zeusbase[0x20] >> 24, m_zeusbase[0x20]);
+ break;
+
+ case 0x33:
+ case 0x34:
+ case 0x35:
+ case 0x36:
+ case 0x37:
+ m_screen->update_partial(m_screen->vpos());
+ {
+ // Just a guess. Atlantis startup has two scanlines per physical ram row
+ if ((m_zeusbase[0x30] & 0xfff) <= 0x100)
+ m_yScale = 1;
+ else
+ m_yScale = 0;
+ int vtotal = (m_zeusbase[0x37] & 0xffff) << m_yScale;
+ int htotal = (m_zeusbase[0x34] >> 16);
+
+ rectangle visarea((m_zeusbase[0x33] >> 16), htotal - 1, 0, (m_zeusbase[0x35] & 0xffff)<< m_yScale);
+ if (htotal > 0 && vtotal > 0 && visarea.min_x < visarea.max_x && visarea.max_y < vtotal)
+ {
+ m_screen->configure(htotal, vtotal, visarea, HZ_TO_ATTOSECONDS((double)ZEUS2_VIDEO_CLOCK / 4.0 / (htotal * vtotal)));
+ zeus_cliprect = visarea;
+ zeus_cliprect.max_x -= zeus_cliprect.min_x;
+ zeus_cliprect.min_x = 0;
+ // Startup vblank timer
+ vblank_timer->adjust(attotime::from_usec(100));
+ }
+ }
+ break;
+
+ case 0x38:
+ {
+ UINT32 temp = m_zeusbase[0x38];
+ m_zeusbase[0x38] = oldval;
+ m_screen->update_partial(m_screen->vpos());
+ log_fifo = machine().input().code_pressed(KEYCODE_L);
+ //log_fifo = 1;
+ m_zeusbase[0x38] = temp;
+ }
+ break;
+
+ case 0x40:
+ /* in direct mode it latches values */
+ if ((m_zeusbase[0x4e] & 0x20) && m_zeusbase[0x40] == 0x00820000)
+ {
+ const void *src = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ m_zeusbase[0x48] = WAVERAM_READ32(src, 0);
+ m_zeusbase[0x49] = WAVERAM_READ32(src, 1);
+
+ if (m_zeusbase[0x4e] & 0x40)
+ {
+ m_zeusbase[0x41]++;
+ m_zeusbase[0x41] += (m_zeusbase[0x41] & 0x400) << 6;
+ m_zeusbase[0x41] &= ~0xfc00;
+ }
+ }
+ break;
+ case 0x41:
+ /* this is the address, except in read mode, where it latches values */
+ if (m_zeusbase[0x4e] & 0x10)
+ {
+ const void *src = waveram0_ptr_from_expanded_addr(oldval);
+ m_zeusbase[0x41] = oldval;
+ m_zeusbase[0x48] = WAVERAM_READ32(src, 0);
+ m_zeusbase[0x49] = WAVERAM_READ32(src, 1);
+
+ if (m_zeusbase[0x4e] & 0x40)
+ {
+ m_zeusbase[0x41]++;
+ m_zeusbase[0x41] += (m_zeusbase[0x41] & 0x400) << 6;
+ m_zeusbase[0x41] &= ~0xfc00;
+ }
+ } else {
+ // mwskinsa (atlantis) writes 0xffffffff and expects 0x1fff03ff to be read back
+ m_zeusbase[0x41] &= 0x1fff03ff;
+ }
+ break;
+
+ case 0x48:
+ case 0x49:
+ /* if we're in write mode, process it */
+ if (m_zeusbase[0x40] == 0x00890000)
+ {
+ /*
+ m_zeusbase[0x4e]:
+ bit 0-1: which register triggers write through
+ bit 3: enable write through via these registers
+ bit 4: seems to be set during reads, when 0x41 is used for latching
+ bit 6: enable autoincrement on write through
+ */
+ if ((m_zeusbase[0x4e] & 0x08) && (offset & 3) == (m_zeusbase[0x4e] & 3))
+ {
+ void *dest = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ WAVERAM_WRITE32(dest, 0, m_zeusbase[0x48]);
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x49]);
+
+ if (m_zeusbase[0x4e] & 0x40)
+ {
+ m_zeusbase[0x41]++;
+ m_zeusbase[0x41] += (m_zeusbase[0x41] & 0x400) << 6;
+ m_zeusbase[0x41] &= ~0xfc00;
+ }
+ }
+ }
+
+ /* make sure we log anything else */
+ else if (logit)
+ logerror("\t[40]=%08X [4E]=%08X\n", m_zeusbase[0x40], m_zeusbase[0x4e]);
+ break;
+
+ case 0x50:
+ if (m_zeusbase[0x50] == 0x00510000) {
+ // SGRAM Special Mode Register Write
+ if (m_zeusbase[0x51] & 0x00400000) {
+ // SGRAM Mask Register
+ if ((m_zeusbase[0x58] & m_zeusbase[0x59] & m_zeusbase[0x5a]) != 0xffffffff)
+ logerror("zeus2_register_update: Warning! Mask Register not equal to 0xffffffff\n");
+ }
+ if (m_zeusbase[0x51] & 0x00200000) {
+ // SGRAM Color Register
+ m_fill_color = m_zeusbase[0x58];
+ m_fill_depth = m_zeusbase[0x5a] & 0xffff;
+ if (m_zeusbase[0x58] != m_zeusbase[0x59])
+ logerror("zeus2_register_update: Warning! Different fill colors are set.\n");
+ }
+ }
+ else if (1 && (m_zeusbase[0x50] & 0x00080000) && (m_zeusbase[0x50] & 0xffff)) {
+ // Fast fill
+ // Unknown what the exact bit fields are, this is a just a guess
+ // Atlantis: 0x00983FFF => clear entire frame buffer, 0x00981FFF => clear one frame
+ // crusnexo: 0x007831FF => clear one frame
+ // thegrid: 0x008831FF => clear one frame
+ //UINT32 lastRow = (((m_zeusbase[0x50] >> 8) & 0xff) << 3) | 0x7;
+ UINT32 lastRow = (((m_zeusbase[0x50] >> 8) & 0xff) << 3) | 0x3;
+ UINT32 lastCol = (((m_zeusbase[0x50] >> 0) & 0xff) << 2) | 0x3;
+ // Not sure how to select
+ //void *base = waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]);
+ void *base = (m_zeusbase[0x50] & 0x800000) ? waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]) : zeus_renderbase;
+ for (int y = 0; y <= lastRow; y++)
+ for (int x = 0; x <= lastCol; x++) {
+ WAVERAM_WRITEPIX(base, y, x, m_fill_color);
+ WAVERAM_WRITEDEPTH(base, y, x, m_fill_depth);
+ }
+ //waveram_plot_depth(y, x, m_fill_color, m_fill_depth);
+ }
+ else if ((m_zeusbase[0x5e] >> 16) != 0xF208) {
+ /* If 0x5e==0xf20a0000 (atlantis) or 0xf20d0000 (the grid) then process the read/write now */
+ /*
+ m_zeusbase[0x5e]:
+ bit 0-1: which register triggers write through
+ bit 3: enable write through via these registers
+ bit 4: seems to be set during reads, when 0x51 is used for latching
+ bit 5: unknown, currently used to specify ordering, but this is suspect
+ bit 6: enable autoincrement on write through
+ */
+ if (m_zeusbase[0x50] == 0x00890000)
+ {
+ void *dest = waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]);
+ WAVERAM_WRITE32(dest, 0, m_zeusbase[0x58]);
+ if (m_zeusbase[0x5e] & 0x20)
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x5a]);
+ else
+ {
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x59]);
+ WAVERAM_WRITE32(dest, 2, m_zeusbase[0x5a]);
+ }
+
+ if (m_zeusbase[0x5e] & 0x40)
+ {
+ m_zeusbase[0x51]++;
+ m_zeusbase[0x51] += (m_zeusbase[0x51] & 0x200) << 7;
+ m_zeusbase[0x51] &= ~0xfe00;
+ }
+ }
+ else if (m_zeusbase[0x50] == 0x00720000) {
+ /* Do the read */
+ const void *src = waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]);
+ m_zeusbase[0x58] = WAVERAM_READ32(src, 0);
+ m_zeusbase[0x59] = WAVERAM_READ32(src, 1);
+ m_zeusbase[0x5a] = WAVERAM_READ32(src, 2);
+
+ if (m_zeusbase[0x5e] & 0x40)
+ {
+ m_zeusbase[0x51]++;
+ m_zeusbase[0x51] += (m_zeusbase[0x51] & 0x200) << 7;
+ m_zeusbase[0x51] &= ~0xfe00;
+ }
+ }
+ }
+ break;
+ case 0x51:
+
+ /* in this mode, crusnexo expects the reads to immediately latch */
+ //if ((m_zeusbase[0x50] == 0x00a20000) || (m_zeusbase[0x50] == 0x00720000))
+ if (m_zeusbase[0x50] == 0x00a20000)
+ oldval = m_zeusbase[0x51];
+
+ /* this is the address, except in read mode, where it latches values */
+ if ((m_zeusbase[0x5e] & 0x10) || (m_zeusbase[0x50] == 0x00a20000))
+ {
+ const void *src = waveram1_ptr_from_expanded_addr(oldval);
+ m_zeusbase[0x51] = oldval;
+ m_zeusbase[0x58] = WAVERAM_READ32(src, 0);
+ m_zeusbase[0x59] = WAVERAM_READ32(src, 1);
+ m_zeusbase[0x5a] = WAVERAM_READ32(src, 2);
+
+ if (m_zeusbase[0x5e] & 0x40)
+ {
+ m_zeusbase[0x51]++;
+ m_zeusbase[0x51] += (m_zeusbase[0x51] & 0x200) << 7;
+ m_zeusbase[0x51] &= ~0xfe00;
+ }
+ }
+ break;
+
+ case 0x57:
+ /* thegrid uses this to write either left or right halves of pixels */
+ if (m_zeusbase[0x50] == 0x00e90000)
+ {
+ void *dest = waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]);
+ if (m_zeusbase[0x57] & 1)
+ WAVERAM_WRITE32(dest, 0, m_zeusbase[0x58]);
+ if (m_zeusbase[0x57] & 4)
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x59]);
+ }
+
+ /* make sure we log anything else */
+ else if (logit)
+ logerror("\t[50]=%08X [5E]=%08X\n", m_zeusbase[0x50], m_zeusbase[0x5e]);
+ break;
+
+ case 0x58:
+ case 0x59:
+ case 0x5a:
+ /* if we're in write mode, process it */
+ if (m_zeusbase[0x50] == 0x00890000)
+ {
+ /*
+ m_zeusbase[0x5e]:
+ bit 0-1: which register triggers write through
+ bit 3: enable write through via these registers
+ bit 4: seems to be set during reads, when 0x51 is used for latching
+ bit 5: unknown, currently used to specify ordering, but this is suspect
+ bit 6: enable autoincrement on write through
+ */
+ if ((m_zeusbase[0x5e] & 0x08) && (offset & 3) == (m_zeusbase[0x5e] & 3))
+ {
+ void *dest = waveram1_ptr_from_expanded_addr(m_zeusbase[0x51]);
+ WAVERAM_WRITE32(dest, 0, m_zeusbase[0x58]);
+ if (m_zeusbase[0x5e] & 0x20)
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x5a]);
+ else
+ {
+ WAVERAM_WRITE32(dest, 1, m_zeusbase[0x59]);
+ WAVERAM_WRITE32(dest, 2, m_zeusbase[0x5a]);
+ }
+
+ if (m_zeusbase[0x5e] & 0x40)
+ {
+ m_zeusbase[0x51]++;
+ m_zeusbase[0x51] += (m_zeusbase[0x51] & 0x200) << 7;
+ m_zeusbase[0x51] &= ~0xfe00;
+ }
+ }
+ }
+
+ /* make sure we log anything else */
+ else if (logit)
+ logerror("\t[50]=%08X [5E]=%08X\n", m_zeusbase[0x50], m_zeusbase[0x5e]);
+ break;
+ }
+}
+
+
+
+/*************************************
+ *
+ * Process the FIFO
+ *
+ *************************************/
+
+void zeus2_device::zeus2_pointer_write(UINT8 which, UINT32 value)
+{
+#if TRACK_REG_USAGE
+subregwrite_count[which]++;
+if (subregdata_count[which] < 256)
+{
+ reg_info **tailptr;
+
+ for (tailptr = &subregdata[which]; *tailptr != nullptr; tailptr = &(*tailptr)->next)
+ if ((*tailptr)->value == value)
+ break;
+ if (*tailptr == nullptr)
+ {
+ *tailptr = alloc_or_die(reg_info);
+ (*tailptr)->next = nullptr;
+ (*tailptr)->value = value;
+ subregdata_count[which]++;
+ }
+}
+#endif
+
+ switch (which)
+ {
+ case 0x04:
+ zeus_renderbase = waveram1_ptr_from_expanded_addr(value << 16);
+ break;
+
+ case 0x05:
+ zeus_texbase = value % (WAVERAM0_HEIGHT * WAVERAM0_WIDTH);
+ break;
+
+ case 0x40:
+ zeus_unknown_40 = value & 0xffffff;
+ zeus_quad_size = (zeus_unknown_40 == 0) ? 10 : 14;
+ break;
+
+#if 0
+ case 0x0c:
+ case 0x0d:
+ // These seem to have something to do with blending.
+ // There are fairly unique 0x0C,0x0D pairs for various things:
+ // Car reflection on initial screen: 0x40, 0x00
+ // Additively-blended "flares": 0xFA, 0xFF
+ // Car windshields (and drivers, apparently): 0x82, 0x7D
+ // Other minor things: 0xA4, 0x100
+ break;
+#endif
+ }
+}
+
+/*************************************
+ * Process the FIFO
+ *************************************/
+
+int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
+{
+ int dataoffs = 0;
+
+ /* handle logging */
+ switch (data[0] >> 24)
+ {
+ // 0x00: write 32-bit value to low registers
+ case 0x00:
+ // Ignore the all zeros commmand
+ if (((data[0] >> 16) & 0x7f) == 0x0)
+ return TRUE;
+ // Drop through to 0x05 command
+ /* 0x05: write 32-bit value to low registers */
+ case 0x05:
+ if (numwords < 2)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, " -- reg32");
+ if (((data[0] >> 16) & 0x7f) != 0x08)
+ zeus2_register32_w((data[0] >> 16) & 0x7f, data[1], log_fifo);
+ break;
+
+ /* 0x08: set matrix and point (thegrid) */
+ case 0x08:
+ if (numwords < 14)
+ return FALSE;
+ dataoffs = 1;
+
+ /* 0x07: set matrix and point (crusnexo) */
+ case 0x07:
+ if (numwords < 13)
+ return FALSE;
+
+ /* extract the matrix from the raw data */
+ zeus_matrix[0][0] = tms3203x_device::fp_to_float(data[dataoffs + 1]);
+ zeus_matrix[0][1] = tms3203x_device::fp_to_float(data[dataoffs + 2]);
+ zeus_matrix[0][2] = tms3203x_device::fp_to_float(data[dataoffs + 3]);
+ zeus_matrix[1][0] = tms3203x_device::fp_to_float(data[dataoffs + 4]);
+ zeus_matrix[1][1] = tms3203x_device::fp_to_float(data[dataoffs + 5]);
+ zeus_matrix[1][2] = tms3203x_device::fp_to_float(data[dataoffs + 6]);
+ zeus_matrix[2][0] = tms3203x_device::fp_to_float(data[dataoffs + 7]);
+ zeus_matrix[2][1] = tms3203x_device::fp_to_float(data[dataoffs + 8]);
+ zeus_matrix[2][2] = tms3203x_device::fp_to_float(data[dataoffs + 9]);
+
+ /* extract the translation point from the raw data */
+ zeus_point[0] = tms3203x_device::fp_to_float(data[dataoffs + 10]);
+ zeus_point[1] = tms3203x_device::fp_to_float(data[dataoffs + 11]);
+ zeus_point[2] = tms3203x_device::fp_to_float(data[dataoffs + 12]);
+
+ if (log_fifo)
+ {
+ log_fifo_command(data, numwords, "\n");
+ logerror("\t\tmatrix ( %8.2f %8.2f %8.2f ) ( %8.2f %8.2f %8.2f ) ( %8.2f %8.2f %8.2f )\n\t\tvector %8.2f %8.2f %8.5f\n",
+ (double) zeus_matrix[0][0], (double) zeus_matrix[0][1], (double) zeus_matrix[0][2],
+ (double) zeus_matrix[1][0], (double) zeus_matrix[1][1], (double) zeus_matrix[1][2],
+ (double) zeus_matrix[2][0], (double) zeus_matrix[2][1], (double) zeus_matrix[2][2],
+ (double) zeus_point[0],
+ (double) zeus_point[1],
+ (double) zeus_point[2]);
+ }
+ break;
+
+ // 0x14: ?? atlantis
+ /* 0x15: set point only (thegrid) */
+ /* 0x16: set point only (crusnexo) */
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ if (numwords < 4)
+ return FALSE;
+
+ /* extract the translation point from the raw data */
+ zeus_point[0] = tms3203x_device::fp_to_float(data[1]);
+ zeus_point[1] = tms3203x_device::fp_to_float(data[2]);
+ zeus_point[2] = tms3203x_device::fp_to_float(data[3]);
+
+ if (log_fifo)
+ {
+ log_fifo_command(data, numwords, "\n");
+ logerror("\t\tvector %8.2f %8.2f %8.5f\n",
+ (double) zeus_point[0],
+ (double) zeus_point[1],
+ (double) zeus_point[2]);
+ }
+ break;
+
+ /* 0x1c: */
+ case 0x1c:
+ if (numwords < 4)
+ return FALSE;
+ if (log_fifo)
+ {
+ log_fifo_command(data, numwords, " -- unknown control + hack clear screen\n");
+ logerror("\t\tvector %8.2f %8.2f %8.5f\n",
+ (double) tms3203x_device::fp_to_float(data[1]),
+ (double) tms3203x_device::fp_to_float(data[2]),
+ (double) tms3203x_device::fp_to_float(data[3]));
+
+ /* extract the translation point from the raw data */
+ zeus_point2[0] = tms3203x_device::fp_to_float(data[1]);
+ zeus_point2[1] = tms3203x_device::fp_to_float(data[2]);
+ zeus_point2[2] = tms3203x_device::fp_to_float(data[3]);
+ }
+ {
+ /* not right -- just a hack */
+ if (0) {
+ int x, y;
+ for (y = zeus_cliprect.min_y; y <= zeus_cliprect.max_y; y++)
+ for (x = zeus_cliprect.min_x; x <= zeus_cliprect.max_x; x++)
+ waveram_plot_depth(y, x, 0, 0x7fff);
+ }
+ }
+ break;
+
+ /* 0x23: render model in waveram (thegrid) */
+ /* 0x24: render model in waveram (crusnexo) */
+ // 0x17: ??? (atlantis)
+ case 0x17:
+ case 0x23:
+ case 0x24:
+ if (numwords < 2)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, "");
+ //zeus2_draw_model(data[1], data[0] & 0xffff, log_fifo);
+ zeus2_draw_model(data[1], data[0] & 0x3fff, log_fifo);
+ break;
+
+ // 0x2d; ??? (atlantis)
+ case 0x2d:
+ if (numwords < 2)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, "\n");
+ //zeus2_draw_model(data[1], data[0] & 0xff, log_fifo);
+ break;
+
+ /* 0x31: sync pipeline? (thegrid) */
+ /* 0x32: sync pipeline? (crusnexo) */
+ // 0x25 ?? (atlantis)
+ case 0x25:
+ case 0x31:
+ case 0x32:
+ if (log_fifo)
+ log_fifo_command(data, numwords, "\n");
+ zeus_quad_size = 10;
+ break;
+
+ /* 0x38: direct render quad (crusnexo) */
+ // 0x38: ?? (atlantis)
+ case 0x38:
+ if (numwords < 12)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, "\n");
+ break;
+
+ /* 0x40: ???? */
+ case 0x40:
+ if (log_fifo)
+ log_fifo_command(data, numwords, "\n");
+ break;
+
+ default:
+ if (data[0] != 0x2c0)
+ {
+ printf("Unknown command %08X\n", data[0]);
+ if (log_fifo)
+ log_fifo_command(data, numwords, "\n");
+ }
+ break;
+ }
+ return TRUE;
+}
+
+/*************************************
+ * Draw a model in waveram
+ *************************************/
+
+void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
+{
+ UINT32 databuffer[32];
+ int databufcount = 0;
+ int model_done = FALSE;
+ UINT32 texoffs = 0;
+ int quadsize = zeus_quad_size;
+
+ if (logit)
+ logerror(" -- model @ %08X, len %04X\n", baseaddr, count);
+
+ if (count > 0x1000)
+ fatalerror("Extreme count\n");
+
+ while (baseaddr != 0 && !model_done)
+ {
+ const void *base = waveram0_ptr_from_expanded_addr(baseaddr);
+ int curoffs;
+
+ /* reset the objdata address */
+ baseaddr = 0;
+
+ /* loop until we run out of data */
+ for (curoffs = 0; curoffs <= count; curoffs++)
+ {
+ int countneeded = 2;
+ UINT8 cmd;
+
+ /* accumulate 2 words of data */
+ databuffer[databufcount++] = WAVERAM_READ32(base, curoffs * 2 + 0);
+ databuffer[databufcount++] = WAVERAM_READ32(base, curoffs * 2 + 1);
+
+ /* if this is enough, process the command */
+ cmd = databuffer[0] >> 24;
+ if (cmd == 0x38)
+ countneeded = quadsize;
+ if (databufcount == countneeded)
+ {
+ /* handle logging of the command */
+ if (logit)
+ {
+ int offs;
+ logerror("\t");
+ for (offs = 0; offs < databufcount; offs++)
+ logerror("%08X ", databuffer[offs]);
+ logerror("-- ");
+ }
+
+ /* handle the command */
+ switch (cmd)
+ {
+ case 0x21: /* thegrid */
+ case 0x22: /* crusnexo */
+ if (((databuffer[0] >> 16) & 0xff) == 0x9b)
+ {
+ texoffs = databuffer[1];
+ if (logit)
+ logerror("texture offset\n");
+ }
+ else if (logit)
+ logerror("unknown offset\n");
+ break;
+
+ case 0x31: /* thegrid */
+ if (logit)
+ logerror("sync?\n");
+ break;
+
+ case 0x35: /* thegrid */
+ case 0x36: /* crusnexo */
+ if (logit)
+ logerror("reg32");
+ zeus2_register32_w((databuffer[0] >> 16) & 0x7f, databuffer[1], logit);
+ break;
+
+ case 0x38: /* crusnexo/thegrid */
+ poly->zeus2_draw_quad(databuffer, texoffs, logit);
+ break;
+
+ default:
+ if (quadsize == 10)
+ {
+ logerror("Correcting quad size\n");
+ quadsize = 14;
+ }
+ if (logit)
+ logerror("unknown model data\n");
+ break;
+ }
+
+ /* reset the count */
+ databufcount = 0;
+ }
+ }
+ }
+}
+
+/*************************************
+ * Draw a quad
+ *************************************/
+void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit)
+{
+ z2_poly_vertex clipvert[8];
+ z2_poly_vertex vert[4];
+ // float uscale, vscale;
+ float maxy, maxx;
+ // int val1, val2, texwshift;
+ int numverts;
+ int i;
+ // INT16 normal[3];
+ // INT32 rotnormal[3];
+ int texmode = texoffs & 0xffff;
+
+ if (logit)
+ m_state->logerror("quad\n");
+
+ if (machine().input().code_pressed(KEYCODE_Q) && (texoffs & 0xffff) == 0x119) return;
+ if (machine().input().code_pressed(KEYCODE_E) && (texoffs & 0xffff) == 0x01d) return;
+ if (machine().input().code_pressed(KEYCODE_R) && (texoffs & 0xffff) == 0x11d) return;
+ if (machine().input().code_pressed(KEYCODE_T) && (texoffs & 0xffff) == 0x05d) return;
+ if (machine().input().code_pressed(KEYCODE_Y) && (texoffs & 0xffff) == 0x0dd) return;
+ //if (machine().input().code_pressed(KEYCODE_U) && (texoffs & 0xffff) == 0x119) return;
+ //if (machine().input().code_pressed(KEYCODE_I) && (texoffs & 0xffff) == 0x119) return;
+ //if (machine().input().code_pressed(KEYCODE_O) && (texoffs & 0xffff) == 0x119) return;
+ //if (machine().input().code_pressed(KEYCODE_L) && (texoffs & 0x100)) return;
+
+ /*
+ 0 38800000
+ 1 x2 | x1
+ 2 v1 | u1
+ 3 y2 | y1
+ 4 v2 | u2
+ 5 z2 | z1
+ 6 v3 | u3
+ 7 v4 | u4
+ 8 ???
+ 9 x4 | x3
+ 10 y4 | y3
+ 11 z4 | z3
+
+ In memory:
+ +0 = ???
+ +1 = set via $05410000/value
+ +2 = x1
+ +3 = y1
+ +4 = z1
+ +5 = x2
+ +6 = y2
+ +7 = z2
+ +8 = x3
+ +9 = y3
+ +10= z3
+ +11= x4
+ +12= y4
+ +13= z4
+ +14= uv1
+ +15= uv2
+ +16= uv3
+ +17= uv4
+ +18= set via $05200000/$05000000 | (value << 10) (uvoffset?)
+ +19= ???
+
+
+ 38810000 00000000 00C7|FF38 FF5E|FF5E 15400154 11400114 00000000 00000000 FF38|00C7 00A3|00A3 -- quad
+ xxxx|xxxx yyyy|yyyy xxxx|xxxx yyyy|yyyy
+ */
+
+ /* extract raw x,y,z */
+ vert[0].x = (INT16)databuffer[2];
+ vert[0].y = (INT16)databuffer[3];
+ vert[0].p[0] = (INT16)databuffer[6];
+ vert[0].p[1] = (databuffer[1] >> 2) & 0xff;
+ vert[0].p[2] = (databuffer[1] >> 18) & 0xff;
+
+ vert[1].x = (INT16)(databuffer[2] >> 16);
+ vert[1].y = (INT16)(databuffer[3] >> 16);
+ vert[1].p[0] = (INT16)(databuffer[6] >> 16);
+ vert[1].p[1] = (databuffer[4] >> 2) & 0xff;
+ vert[1].p[2] = (databuffer[4] >> 12) & 0xff;
+
+ vert[2].x = (INT16)databuffer[8];
+ vert[2].y = (INT16)databuffer[9];
+ vert[2].p[0] = (INT16)databuffer[7];
+ vert[2].p[1] = (databuffer[4] >> 22) & 0xff;
+ vert[2].p[2] = (databuffer[5] >> 2) & 0xff;
+
+ vert[3].x = (INT16)(databuffer[8] >> 16);
+ vert[3].y = (INT16)(databuffer[9] >> 16);
+ vert[3].p[0] = (INT16)(databuffer[7] >> 16);
+ vert[3].p[1] = (databuffer[5] >> 12) & 0xff;
+ vert[3].p[2] = (databuffer[5] >> 22) & 0xff;
+
+ /*
+ vert[0].x = (INT16)databuffer[1];
+ vert[0].y = (INT16)databuffer[3];
+ vert[0].p[0] = (INT16)databuffer[5];
+ vert[0].p[1] = (UINT16)databuffer[2];
+ vert[0].p[2] = (UINT16)(databuffer[2] >> 16);
+
+ vert[1].x = (INT16)(databuffer[1] >> 16);
+ vert[1].y = (INT16)(databuffer[3] >> 16);
+ vert[1].p[0] = (INT16)(databuffer[5] >> 16);
+ vert[1].p[1] = (UINT16)databuffer[4];
+ vert[1].p[2] = (UINT16)(databuffer[4] >> 16);
+
+ vert[2].x = (INT16)databuffer[9];
+ vert[2].y = (INT16)databuffer[10];
+ vert[2].p[0] = (INT16)databuffer[11];
+ vert[2].p[1] = (UINT16)databuffer[6];
+ vert[2].p[2] = (UINT16)(databuffer[6] >> 16);
+
+ vert[3].x = (INT16)(databuffer[9] >> 16);
+ vert[3].y = (INT16)(databuffer[10] >> 16);
+ vert[3].p[0] = (INT16)(databuffer[11] >> 16);
+ vert[3].p[1] = (UINT16)databuffer[7];
+ vert[3].p[2] = (UINT16)(databuffer[7] >> 16);
+ */
+ for (i = 0; i < 4; i++)
+ {
+ float x = vert[i].x;
+ float y = vert[i].y;
+ float z = vert[i].p[0];
+
+ vert[i].x = x * m_state->zeus_matrix[0][0] + y * m_state->zeus_matrix[0][1] + z * m_state->zeus_matrix[0][2] + m_state->zeus_point[0];
+ vert[i].y = x * m_state->zeus_matrix[1][0] + y * m_state->zeus_matrix[1][1] + z * m_state->zeus_matrix[1][2] + m_state->zeus_point[1];
+ vert[i].p[0] = x * m_state->zeus_matrix[2][0] + y * m_state->zeus_matrix[2][1] + z * m_state->zeus_matrix[2][2] + m_state->zeus_point[2];
+ vert[i].p[0] += m_state->zbase;
+ vert[i].p[2] += texoffs >> 16;
+ vert[i].p[1] *= 256.0f;
+ vert[i].p[2] *= 256.0f;
+
+ if (logit)
+ {
+ m_state->logerror("\t\t(%f,%f,%f) (%02X,%02X)\n",
+ (double)vert[i].x, (double)vert[i].y, (double)vert[i].p[0],
+ (int)(vert[i].p[1] / 256.0f), (int)(vert[i].p[2] / 256.0f));
+ }
+ }
+
+ numverts = this->zclip_if_less(4, &vert[0], &clipvert[0], 4, 1.0f / 512.0f / 4.0f);
+ if (numverts < 3)
+ return;
+
+ maxx = maxy = -1000.0f;
+ for (i = 0; i < numverts; i++)
+ {
+ // 412.0f here works for crusnexo
+ float ooz = 512.0f / clipvert[i].p[0];
+
+ // ooz *= 1.0f / (512.0f * 512.0f);
+
+ clipvert[i].x *= ooz;
+ clipvert[i].y *= ooz;
+ clipvert[i].x += 256.5f;
+ clipvert[i].y += 200.5f;
+ clipvert[i].p[0] *= 65536.0f * 16.0f;
+
+ maxx = MAX(maxx, clipvert[i].x);
+ maxy = MAX(maxy, clipvert[i].y);
+ if (logit)
+ m_state->logerror("\t\t\tTranslated=(%f,%f)\n", (double)clipvert[i].x, (double)clipvert[i].y);
+ }
+ for (i = 0; i < numverts; i++)
+ {
+ if (clipvert[i].x == maxx)
+ clipvert[i].x += 0.0005f;
+ if (clipvert[i].y == maxy)
+ clipvert[i].y += 0.0005f;
+ }
+
+ zeus2_poly_extra_data& extra = this->object_data_alloc();
+ switch (texmode)
+ {
+ case 0x01d: /* crusnexo: RHS of score bar */
+ case 0x05d: /* crusnexo: background, road */
+ case 0x0dd: /* crusnexo: license plate letters */
+ case 0x11d: /* crusnexo: LHS of score bar */
+ case 0x15d: /* crusnexo */
+ case 0x85d: /* crusnexo */
+ case 0x95d: /* crusnexo */
+ case 0xc1d: /* crusnexo */
+ case 0xc5d: /* crusnexo */
+ extra.texwidth = 256;
+ break;
+
+ case 0x059: /* crusnexo */
+ case 0x0d9: /* crusnexo */
+ case 0x119: /* crusnexo: license plates */
+ case 0x159: /* crusnexo */
+ extra.texwidth = 128;
+ break;
+
+ case 0x055: /* crusnexo */
+ case 0x155: /* crusnexo */
+ extra.texwidth = 64;
+ break;
+
+ case 0x000: // thegrid guess
+ case 0x120: // thegrid guess
+ extra.texwidth = 32;
+ break;
+
+ default:
+ {
+ static UINT8 hits[0x10000];
+ if (!hits[(texoffs & 0xffff)])
+ {
+ hits[(texoffs & 0xffff)] = 1;
+ printf("format = %04X\n", (texoffs & 0xffff));
+ }
+ break;
+ }
+ }
+
+ extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
+ extra.zoffset = 0;//m_zeusbase[0x7e] >> 16;
+ extra.alpha = 0;//m_zeusbase[0x4e];
+ extra.transcolor = 0x100;//((databuffer[1] >> 16) & 1) ? 0 : 0x100;
+ extra.texbase = WAVERAM_BLOCK0_EXT(m_state->zeus_texbase);
+ extra.palbase = m_state->waveram0_ptr_from_expanded_addr(m_state->m_zeusbase[0x41]);
+
+ // Note: Before being converted to the "poly.h" interface, this used to call the polylgcy function
+ // poly_render_quad_fan. The behavior seems to be the same as it once was after a few short
+ // tests, but the (numverts == 5) statement below may actually be a quad fan instead of a 5-sided
+ // polygon.
+ if (numverts == 3)
+ render_triangle(m_state->zeus_cliprect, render_delegate(FUNC(zeus2_renderer::render_poly_8bit), this), 4, clipvert[0], clipvert[1], clipvert[2]);
+ else if (numverts == 4)
+ render_polygon<4>(m_state->zeus_cliprect, render_delegate(FUNC(zeus2_renderer::render_poly_8bit), this), 4, clipvert);
+ else if (numverts == 5)
+ render_polygon<5>(m_state->zeus_cliprect, render_delegate(FUNC(zeus2_renderer::render_poly_8bit), this), 4, clipvert);
+}
+
+
+
+/*************************************
+* Rasterizers
+*************************************/
+
+void zeus2_renderer::render_poly_8bit(INT32 scanline, const extent_t& extent, const zeus2_poly_extra_data& object, int threadid)
+{
+ INT32 curz = extent.param[0].start;
+ INT32 curu = extent.param[1].start;
+ INT32 curv = extent.param[2].start;
+ // INT32 curi = extent.param[3].start;
+ INT32 dzdx = extent.param[0].dpdx;
+ INT32 dudx = extent.param[1].dpdx;
+ INT32 dvdx = extent.param[2].dpdx;
+ // INT32 didx = extent.param[3].dpdx;
+ const void *texbase = object.texbase;
+ const void *palbase = object.palbase;
+ UINT16 transcolor = object.transcolor;
+ int texwidth = object.texwidth;
+ int x;
+
+ for (x = extent.startx; x < extent.stopx; x++)
+ {
+ UINT16 *depthptr = WAVERAM_PTRDEPTH(m_state->zeus_renderbase, scanline, x);
+ INT32 depth = (curz >> 16) + object.zoffset;
+ //if (depth > 0x7fff) depth = 0x7fff;
+ if (depth > 0xffff) depth = 0xffff;
+ if (depth >= 0 && depth <= *depthptr)
+ {
+ int u0 = (curu >> 8);// & (texwidth - 1);
+ int v0 = (curv >> 8);// & 255;
+ int u1 = (u0 + 1);
+ int v1 = (v0 + 1);
+ UINT8 texel0 = m_state->get_texel_8bit(texbase, v0, u0, texwidth);
+ UINT8 texel1 = m_state->get_texel_8bit(texbase, v0, u1, texwidth);
+ UINT8 texel2 = m_state->get_texel_8bit(texbase, v1, u0, texwidth);
+ UINT8 texel3 = m_state->get_texel_8bit(texbase, v1, u1, texwidth);
+ if (texel0 != transcolor)
+ {
+ UINT32 color0 = WAVERAM_READ16(palbase, texel0);
+ UINT32 color1 = WAVERAM_READ16(palbase, texel1);
+ UINT32 color2 = WAVERAM_READ16(palbase, texel2);
+ UINT32 color3 = WAVERAM_READ16(palbase, texel3);
+ color0 = ((color0 & 0x7c00) << 9) | ((color0 & 0x3e0) << 6) | ((color0 & 0x1f) << 3);
+ color1 = ((color1 & 0x7c00) << 9) | ((color1 & 0x3e0) << 6) | ((color1 & 0x1f) << 3);
+ color2 = ((color2 & 0x7c00) << 9) | ((color2 & 0x3e0) << 6) | ((color2 & 0x1f) << 3);
+ color3 = ((color3 & 0x7c00) << 9) | ((color3 & 0x3e0) << 6) | ((color3 & 0x1f) << 3);
+ rgb_t filtered = rgbaint_t::bilinear_filter(color0, color1, color2, color3, curu, curv);
+ WAVERAM_WRITEPIX(m_state->zeus_renderbase, scanline, x, filtered);
+ *depthptr = depth;
+ }
+ }
+
+ curz += dzdx;
+ curu += dudx;
+ curv += dvdx;
+ // curi += didx;
+ }
+}
+
+/*************************************
+ * Debugging tools
+ *************************************/
+
+void zeus2_device::log_fifo_command(const UINT32 *data, int numwords, const char *suffix)
+{
+ int wordnum;
+ std::string errorStr;
+ logerror("Zeus cmd %02X :", data[0] >> 24);
+ for (wordnum = 0; wordnum < numwords; wordnum++)
+ logerror(" %08X", data[wordnum]);
+ logerror("%s", suffix);
+}
diff --git a/src/devices/video/zeus2.h b/src/devices/video/zeus2.h
new file mode 100644
index 00000000000..cc147654e71
--- /dev/null
+++ b/src/devices/video/zeus2.h
@@ -0,0 +1,286 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/*************************************************************************
+
+ Midway Zeus2 Video
+
+**************************************************************************/
+#ifndef __ZEUS2_H__
+#define __ZEUS2_H__
+
+#include "emu.h"
+#include "video/poly.h"
+#include "video/rgbutil.h"
+#include "cpu/tms32031/tms32031.h"
+
+#pragma once
+
+/*************************************
+* Constants
+*************************************/
+#define ZEUS2_VIDEO_CLOCK XTAL_66_6667MHz
+
+#define DUMP_WAVE_RAM 0
+#define TRACK_REG_USAGE 0
+
+#define WAVERAM0_WIDTH 1024
+#define WAVERAM0_HEIGHT 2048
+
+#define WAVERAM1_WIDTH 512
+#define WAVERAM1_HEIGHT 1024
+
+/*************************************
+* Type definitions
+*************************************/
+
+struct zeus2_poly_extra_data
+{
+ const void * palbase;
+ const void * texbase;
+ UINT16 solidcolor;
+ INT16 zoffset;
+ UINT16 transcolor;
+ UINT16 texwidth;
+ UINT16 color;
+ UINT32 alpha;
+};
+
+/*************************************
+* Macros
+*************************************/
+
+#define WAVERAM_BLOCK0(blocknum) ((void *)((UINT8 *)waveram[0] + 8 * (blocknum)))
+#define WAVERAM_BLOCK1(blocknum) ((void *)((UINT8 *)waveram[1] + 12 * (blocknum)))
+#define WAVERAM_BLOCK0_EXT(blocknum) ((void *)((UINT8 *)m_state->waveram[0] + 8 * (blocknum)))
+#define WAVERAM_BLOCK1_EXT(blocknum) ((void *)((UINT8 *)m_state->waveram[1] + 12 * (blocknum)))
+
+#define WAVERAM_PTR8(base, bytenum) ((UINT8 *)(base) + BYTE4_XOR_LE(bytenum))
+#define WAVERAM_READ8(base, bytenum) (*WAVERAM_PTR8(base, bytenum))
+#define WAVERAM_WRITE8(base, bytenum, data) do { *WAVERAM_PTR8(base, bytenum) = (data); } while (0)
+
+#define WAVERAM_PTR16(base, wordnum) ((UINT16 *)(base) + BYTE_XOR_LE(wordnum))
+#define WAVERAM_READ16(base, wordnum) (*WAVERAM_PTR16(base, wordnum))
+#define WAVERAM_WRITE16(base, wordnum, data) do { *WAVERAM_PTR16(base, wordnum) = (data); } while (0)
+
+#define WAVERAM_PTR32(base, dwordnum) ((UINT32 *)(base) + (dwordnum))
+#define WAVERAM_READ32(base, dwordnum) (*WAVERAM_PTR32(base, dwordnum))
+#define WAVERAM_WRITE32(base, dwordnum, data) do { *WAVERAM_PTR32(base, dwordnum) = (data); } while (0)
+
+#define PIXYX_TO_DWORDNUM(y, x) (((((y) & 0x1ff) << 8) | (((x) & 0x1fe) >> 1)) * 3 + ((x) & 1))
+#define DEPTHYX_TO_DWORDNUM(y, x) (PIXYX_TO_DWORDNUM(y, (x) & ~1) + 2)
+
+#define WAVERAM_PTRPIX(base, y, x) WAVERAM_PTR32(base, PIXYX_TO_DWORDNUM(y, x))
+#define WAVERAM_READPIX(base, y, x) (*WAVERAM_PTRPIX(base, y, x))
+#define WAVERAM_WRITEPIX(base, y, x, color) do { *WAVERAM_PTRPIX(base, y, x) = (color); } while (0)
+
+#define WAVERAM_PTRDEPTH(base, y, x) WAVERAM_PTR16(base, DEPTHYX_TO_DWORDNUM(y, x) * 2 + (x & 1))
+#define WAVERAM_READDEPTH(base, y, x) (*WAVERAM_PTRDEPTH(base, y, x))
+#define WAVERAM_WRITEDEPTH(base, y, x, color) do { *WAVERAM_PTRDEPTH(base, y, x) = (color); } while (0)
+
+/*************************************
+* Polygon renderer
+*************************************/
+class zeus2_device;
+
+class zeus2_renderer : public poly_manager<float, zeus2_poly_extra_data, 4, 10000>
+{
+public:
+ zeus2_renderer(zeus2_device *state);
+
+ void render_poly_8bit(INT32 scanline, const extent_t& extent, const zeus2_poly_extra_data& object, int threadid);
+
+ void zeus2_draw_quad(const UINT32 *databuffer, UINT32 texoffs, int logit);
+
+private:
+ zeus2_device* m_state;
+};
+typedef zeus2_renderer::vertex_t z2_poly_vertex;
+typedef zeus2_renderer::extent_t z2_poly_extent;
+
+/*************************************
+* Zeus2 Video Device
+*************************************/
+#define MCFG_ZEUS2_VBLANK_CB(_devcb) \
+ devcb = &zeus2_device::set_vblank_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_ZEUS2_IRQ_CB(_devcb) \
+ devcb = &zeus2_device::set_irq_callback(*device, DEVCB_##_devcb);
+
+class zeus2_device : public device_t
+{
+public:
+ zeus2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ screen_device *m_screen; /* the screen we are acting on */
+
+ UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_READ32_MEMBER( zeus2_r );
+ DECLARE_WRITE32_MEMBER( zeus2_w );
+ TIMER_CALLBACK_MEMBER(display_irq_off);
+ TIMER_CALLBACK_MEMBER(display_irq);
+
+ template<class _Object> static devcb_base &set_vblank_callback(device_t &device, _Object object) { return downcast<zeus2_device &>(device).m_vblank.set_callback(object); }
+ template<class _Object> static devcb_base &set_irq_callback(device_t &device, _Object object) { return downcast<zeus2_device &>(device).m_irq.set_callback(object); }
+ devcb_write_line m_vblank;
+ devcb_write_line m_irq;
+
+ UINT32 m_zeusbase[0x80];
+
+ zeus2_renderer* poly;
+
+ void *zeus_renderbase;
+ rectangle zeus_cliprect;
+
+ float zeus_matrix[3][3];
+ float zeus_point[3];
+ float zeus_point2[3];
+ UINT32 zeus_texbase;
+ UINT32 zeus_unknown_40;
+ int zeus_quad_size;
+
+ UINT32 *waveram[2];
+ emu_timer *int_timer;
+ emu_timer *vblank_timer;
+ int m_yScale;
+ int yoffs;
+ int texel_width;
+ float zbase;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_stop() override;
+
+private:
+ TIMER_CALLBACK_MEMBER(int_timer_callback);
+ void zeus2_register32_w(offs_t offset, UINT32 data, int logit);
+ void zeus2_register_update(offs_t offset, UINT32 oldval, int logit);
+ int zeus2_fifo_process(const UINT32 *data, int numwords);
+ void zeus2_pointer_write(UINT8 which, UINT32 value);
+ void zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit);
+ void log_fifo_command(const UINT32 *data, int numwords, const char *suffix);
+
+ /*************************************
+ * Member variables
+ *************************************/
+
+
+ UINT8 log_fifo;
+
+ UINT32 zeus_fifo[20];
+ UINT8 zeus_fifo_words;
+
+ UINT32 m_fill_color;
+ UINT16 m_fill_depth;
+
+#if TRACK_REG_USAGE
+ struct reg_info
+ {
+ struct reg_info *next;
+ UINT32 value;
+ };
+
+ reg_info *regdata[0x80];
+ int regdata_count[0x80];
+ int regread_count[0x80];
+ int regwrite_count[0x80];
+ reg_info *subregdata[0x100];
+ int subregdata_count[0x80];
+ int subregwrite_count[0x100];
+#endif
+public:
+ /*************************************
+ * Inlines for block addressing
+ *************************************/
+
+ inline void *waveram0_ptr_from_expanded_addr(UINT32 addr)
+ {
+ UINT32 blocknum = (addr % WAVERAM0_WIDTH) + ((addr >> 16) % WAVERAM0_HEIGHT) * WAVERAM0_WIDTH;
+ return WAVERAM_BLOCK0(blocknum);
+ }
+
+ inline void *waveram1_ptr_from_expanded_addr(UINT32 addr)
+ {
+ UINT32 blocknum = (addr % WAVERAM1_WIDTH) + ((addr >> 16) % WAVERAM1_HEIGHT) * WAVERAM1_WIDTH;
+ return WAVERAM_BLOCK1(blocknum);
+ }
+
+#ifdef UNUSED_FUNCTION
+ inline void *waveram0_ptr_from_texture_addr(UINT32 addr, int width)
+ {
+ UINT32 blocknum = ((addr & ~1) * width) / 8;
+ return WAVERAM_BLOCK0(blocknum);
+ }
+#endif
+
+ /*************************************
+ * Inlines for rendering
+ *************************************/
+
+#ifdef UNUSED_FUNCTION
+ inline void WAVERAM_plot(int y, int x, UINT32 color)
+ {
+ if (zeus_cliprect.contains(x, y))
+ WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ }
+#endif
+
+ inline void waveram_plot_depth(int y, int x, UINT32 color, UINT16 depth)
+ {
+ if (zeus_cliprect.contains(x, y))
+ {
+ WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ WAVERAM_WRITEDEPTH(zeus_renderbase, y, x, depth);
+ }
+ }
+
+#ifdef UNUSED_FUNCTION
+ inline void waveram_plot_check_depth(int y, int x, UINT32 color, UINT16 depth)
+ {
+ if (zeus_cliprect.contains(x, y))
+ {
+ UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x);
+ if (depth <= *depthptr)
+ {
+ WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ *depthptr = depth;
+ }
+ }
+ }
+#endif
+
+#ifdef UNUSED_FUNCTION
+ inline void waveram_plot_check_depth_nowrite(int y, int x, UINT32 color, UINT16 depth)
+ {
+ if (zeus_cliprect.contains(x, y))
+ {
+ UINT16 *depthptr = WAVERAM_PTRDEPTH(zeus_renderbase, y, x);
+ if (depth <= *depthptr)
+ WAVERAM_WRITEPIX(zeus_renderbase, y, x, color);
+ }
+ }
+#endif
+ /*************************************
+ * Inlines for texel accesses
+ *************************************/
+ inline UINT8 get_texel_8bit(const void *base, int y, int x, int width)
+ {
+ UINT32 byteoffs = (y / 2) * (width * 2) + ((x / 4) << 3) + ((y & 1) << 2) + (x & 3);
+ return WAVERAM_READ8(base, byteoffs);
+ }
+
+#ifdef UNUSED_FUNCTION
+ inline UINT8 get_texel_4bit(const void *base, int y, int x, int width)
+ {
+ UINT32 byteoffs = (y / 2) * (width * 2) + ((x / 8) << 3) + ((y & 1) << 2) + ((x / 2) & 3);
+ return (WAVERAM_READ8(base, byteoffs) >> (4 * (x & 1))) & 0x0f;
+ }
+#endif
+
+};
+
+// device type definition
+extern const device_type ZEUS2;
+
+#endif
diff --git a/src/mame/audio/dcs.cpp b/src/mame/audio/dcs.cpp
index 75972ebf0cf..009722f77bb 100644
--- a/src/mame/audio/dcs.cpp
+++ b/src/mame/audio/dcs.cpp
@@ -557,6 +557,7 @@ MACHINE_CONFIG_FRAGMENT( dcs2_audio_denver )
MCFG_CPU_ADD("denver", ADSP2181, XTAL_33_333MHz)
MCFG_ADSP21XX_SPORT_TX_CB(WRITE32(dcs_audio_device, sound_tx_callback)) /* callback for serial transmit */
MCFG_ADSP21XX_TIMER_FIRED_CB(WRITELINE(dcs_audio_device,timer_enable_callback)) /* callback for timer fired */
+ MCFG_ADSP21XX_DMOVLAY_CB(WRITE32(dcs_audio_device, dmovlay_callback)) // callback for adsp 2181 dmovlay instruction
MCFG_CPU_PROGRAM_MAP(denver_program_map)
MCFG_CPU_DATA_MAP(denver_data_map)
MCFG_CPU_IO_MAP(denver_io_map)
@@ -688,6 +689,8 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::dcs_reset )
/* rev 4: reset the Denver ASIC */
case 4:
+ m_dmovlay_val = 0;
+ dmovlay_remap_memory();
denver_reset();
break;
}
@@ -752,6 +755,7 @@ void dcs_audio_device::dcs_register_state()
save_item(NAME(m_control_regs));
save_item(NAME(m_sounddata_bank));
+ save_item(NAME(m_dmovlay_val));
save_item(NAME(m_auto_ack));
save_item(NAME(m_latch_control));
@@ -786,6 +790,9 @@ void dcs_audio_device::dcs_register_state()
if (m_rev == 2)
machine().save().register_postload(save_prepost_delegate(FUNC(dcs_audio_device::sdrc_remap_memory), this));
+
+ if (m_rev == 4)
+ machine().save().register_postload(save_prepost_delegate(FUNC(dcs_audio_device::dmovlay_remap_memory), this));
}
@@ -958,8 +965,12 @@ void dcs2_audio_device::device_start()
/* supports both RAM and ROM variants */
if (m_dram_in_mb != 0)
{
- m_sounddata = auto_alloc_array(machine(), UINT16, m_dram_in_mb << (20-1));
- save_pointer(NAME(m_sounddata), m_dram_in_mb << (20-1));
+ UINT32 ramSize = m_dram_in_mb << (20 - 1);
+ // Add one extra bank for internal ram in ADSP 2181
+ if (m_rev == 4)
+ ramSize += soundbank_words;
+ m_sounddata = auto_alloc_array(machine(), UINT16, ramSize);
+ save_pointer(NAME(m_sounddata), ramSize);
m_sounddata_words = (m_dram_in_mb << 20) / 2;
}
else
@@ -973,6 +984,7 @@ void dcs2_audio_device::device_start()
m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, soundbank_words*2);
}
+
/* allocate memory for the SRAM */
m_sram = auto_alloc_array(machine(), UINT16, 0x8000*4/2);
@@ -1330,7 +1342,7 @@ WRITE16_MEMBER( dcs_audio_device::dsio_w )
/* offset 2 controls RAM pages */
case 2:
dsio.reg[2] = data;
- m_data_bank->set_entry(DSIO_DM_PG % m_sounddata_banks);
+ dmovlay_remap_memory();
break;
}
}
@@ -1388,7 +1400,7 @@ WRITE16_MEMBER( dcs_audio_device::denver_w )
m_dmadac[chan] = subdevice<dmadac_sound_device>(buffer);
}
dmadac_enable(&m_dmadac[0], m_channels, enable);
- if (m_channels < 6)
+ if (m_channels <= 6)
dmadac_enable(&m_dmadac[m_channels], 6 - m_channels, FALSE);
recompute_sample_rate();
}
@@ -1399,7 +1411,6 @@ WRITE16_MEMBER( dcs_audio_device::denver_w )
dsio.reg[2] = data;
m_data_bank->set_entry(DENV_DM_PG % m_sounddata_banks);
break;
-
/* offset 3 controls FIFO reset */
case 3:
if (!m_fifo_reset_w.isnull())
@@ -1460,6 +1471,32 @@ READ32_MEMBER( dcs_audio_device::dsio_idma_data_r )
return result;
}
+void dcs_audio_device::dmovlay_remap_memory()
+{
+ // Switch banks
+ // Internal ram is bank 0
+ int bankSel;
+ if (m_dmovlay_val == 0) {
+ bankSel = 0;
+ m_data_bank->set_entry(bankSel);
+ } else {
+ bankSel = 1 + (DSIO_DM_PG % m_sounddata_banks);
+ m_data_bank->set_entry(bankSel);
+ }
+ if (LOG_DCS_IO)
+ logerror("%s dmovlay_remap_memory: Switching data ram location bankSel = %i\n", machine().describe_context(), bankSel);
+}
+
+WRITE32_MEMBER(dcs_audio_device::dmovlay_callback)
+{
+ // Do some checking first
+ if (data < 0 || data > 1) {
+ logerror("dmovlay_callback: Error! dmovlay called with value = %X\n", data);
+ } else {
+ m_dmovlay_val = data;
+ dmovlay_remap_memory();
+ }
+}
/***************************************************************************
@@ -1872,10 +1909,10 @@ WRITE16_MEMBER(dcs_audio_device:: adsp_control_w )
switch (offset)
{
case SYSCONTROL_REG:
- /* bit 9 forces a reset */
- if (data & 0x0200)
+ /* bit 9 forces a reset (not on 2181) */
+ if ((data & 0x0200) && !(m_rev == 3 || m_rev == 4))
{
- logerror("%04X:Rebooting DCS due to SYSCONTROL write\n", space.device().safe_pc());
+ logerror("%04X:Rebooting DCS due to SYSCONTROL write = %04X\n", space.device().safe_pc(), data);
m_cpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
dcs_boot();
m_control_regs[SYSCONTROL_REG] = 0;
@@ -1950,9 +1987,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( dcs_audio_device::dcs_irq )
{
int count = m_size / (2*(m_incs ? m_incs : 1));
// sf2049se was having overflow issues with fixed size of 0x400 buffer (m_size==0xb40, count=0x5a0).
- //INT16 buffer[0x400];
- std::unique_ptr<INT16[]> buffer;
- buffer = std::make_unique<INT16[]>(count);
+ INT16 buffer[0x800];
int i;
for (i = 0; i < count; i++)
@@ -1962,7 +1997,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( dcs_audio_device::dcs_irq )
}
if (m_channels)
- dmadac_transfer(&m_dmadac[0], m_channels, 1, m_channels, count / m_channels, buffer.get());
+ dmadac_transfer(&m_dmadac[0], m_channels, 1, m_channels, count / m_channels, buffer);
}
/* check for wrapping */
diff --git a/src/mame/audio/dcs.h b/src/mame/audio/dcs.h
index 3d30e946604..5b84b994126 100644
--- a/src/mame/audio/dcs.h
+++ b/src/mame/audio/dcs.h
@@ -47,6 +47,8 @@ public:
DECLARE_WRITE32_MEMBER( dsio_idma_addr_w );
DECLARE_WRITE32_MEMBER( dsio_idma_data_w );
DECLARE_READ32_MEMBER( dsio_idma_data_r );
+ void dmovlay_remap_memory();
+ WRITE32_MEMBER(dmovlay_callback);
// non public
void dcs_boot();
@@ -202,6 +204,8 @@ protected:
UINT32 *m_internal_program_ram;
UINT32 *m_external_program_ram;
+ int m_dmovlay_val;
+
sdrc_state m_sdrc;
dsio_state m_dsio;
hle_transfer_state m_transfer;
diff --git a/src/mame/drivers/atlantis.cpp b/src/mame/drivers/atlantis.cpp
index 65102eee960..802704b8e43 100644
--- a/src/mame/drivers/atlantis.cpp
+++ b/src/mame/drivers/atlantis.cpp
@@ -43,8 +43,7 @@
#include "machine/vrc4373.h"
#include "machine/pci9050.h"
#include "machine/pci-ide.h"
-#include "includes/midzeus.h"
-#include "includes/midzeus2.h"
+#include "video/zeus2.h"
#include "machine/nvram.h"
#include "coreutil.h"
@@ -62,19 +61,22 @@
// These need more verification
#define IOASIC_IRQ_SHIFT 0
+#define GALILEO_IRQ_SHIFT 1
+#define ZEUS_IRQ_SHIFT 2
#define PARALLEL_IRQ_SHIFT 3
#define UART0_SHIFT 4
#define UART1_SHIFT 5
-#define ZEUS_IRQ_SHIFT 2
#define VBLANK_IRQ_SHIFT 7
-#define GALILEO_IRQ_SHIFT 0
/* static interrupts */
#define GALILEO_IRQ_NUM MIPS3_IRQ0
+#define VBLANK_IRQ_NUM MIPS3_IRQ3
#define IDE_IRQ_NUM MIPS3_IRQ4
-#define LOG_RTC (1)
-#define LOG_ZEUS (0)
+#define LOG_RTC (0)
+#define LOG_RED (0)
+#define LOG_PORT (0)
+#define LOG_IRQ (0)
class atlantis_state : public driver_device
{
@@ -83,6 +85,8 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
+ m_palette(*this, "palette"),
+ m_zeus(*this, "zeus2"),
m_dcs(*this, "dcs"),
m_ioasic(*this, "ioasic"),
m_uart0(*this, "uart0"),
@@ -95,14 +99,14 @@ public:
UINT32 screen_update_mwskins(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<mips3_device> m_maincpu;
required_device<screen_device> m_screen;
- //required_device<dcs2_audio_dsio_device> m_dcs;
- //required_device<dcs2_audio_denver_device> m_dcs;
+ optional_device<palette_device> m_palette;
+ required_device<zeus2_device> m_zeus;
required_device<dcs_audio_device> m_dcs;
required_device<midway_ioasic_device> m_ioasic;
required_device<ns16550_device> m_uart0;
required_device<ns16550_device> m_uart1;
required_device<nvram_device> m_rtc;
- UINT8 m_rtc_data[0x800];
+ UINT8 m_rtc_data[0x8000];
UINT32 m_last_offset;
READ8_MEMBER(cmos_r);
@@ -110,6 +114,7 @@ public:
DECLARE_WRITE32_MEMBER(cmos_protect_w);
DECLARE_READ32_MEMBER(cmos_protect_r);
UINT32 m_cmos_write_enabled;
+ UINT32 m_serial_count;
DECLARE_READ32_MEMBER(status_leds_r);
DECLARE_WRITE32_MEMBER(status_leds_w);
@@ -118,15 +123,6 @@ public:
DECLARE_WRITE32_MEMBER(asic_fifo_w);
DECLARE_WRITE32_MEMBER(dcs3_fifo_full_w);
- DECLARE_WRITE32_MEMBER(zeus_w);
- DECLARE_READ32_MEMBER(zeus_r);
- UINT32 m_zeus_data[0x80];
-
- READ8_MEMBER (red_r);
- WRITE8_MEMBER(red_w);
- UINT8 m_red_data[0x1000];
- int m_red_count;
-
READ32_MEMBER (green_r);
WRITE32_MEMBER(green_w);
READ8_MEMBER (blue_r);
@@ -142,6 +138,8 @@ public:
UINT8 board_ctrl[CTRL_SIZE];
void update_asic_irq();
+ DECLARE_WRITE_LINE_MEMBER(vblank_irq);
+ DECLARE_WRITE_LINE_MEMBER(zeus_irq);
DECLARE_WRITE_LINE_MEMBER(ide_irq);
DECLARE_WRITE_LINE_MEMBER(ioasic_irq);
@@ -154,37 +152,6 @@ public:
UINT32 m_port_ctrl_reg[0x8];
};
-READ8_MEMBER (atlantis_state::red_r)
-{
- UINT8 data = m_red_data[offset];
- logerror("%06X: red_r %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, data);
- m_last_offset = offset | 0x10000;
- return data;
-}
-
-WRITE8_MEMBER(atlantis_state::red_w)
-{
- COMBINE_DATA(&m_red_data[offset]);
-
- switch (offset) {
- case 0:
- // User I/O 0 = Allow write to red[0]. Serial Write Enable?
- if (m_user_io_state & 0x1) {
- // Data written is shifted by 1 bit each time. Maybe a serial line output?
- if (m_red_count == 0)
- logerror("%06X: red_w start serial %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, data);
- m_red_count++;
- if (m_red_count == 8)
- m_red_count = 0;
- break;
- } // Fall through to default if not enabled
- default:
- logerror("%06X: red_w %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, data);
- break;
- }
- m_last_offset = offset | 0x10000;
-}
-
READ32_MEMBER(atlantis_state::green_r)
{
// If not 0x80 cpu writes to 00e80000 = 0
@@ -222,10 +189,12 @@ READ32_MEMBER(atlantis_state::board_ctrl_r)
if (1 && m_screen->vblank())
data |= 0x80;
if (m_last_offset != (newOffset | 0x40000))
- logerror("%s:board_ctrl_r read from CTRL_STATUS offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_r read from CTRL_STATUS offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
default:
- logerror("%s:board_ctrl_r read from offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_r read from offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
}
m_last_offset = newOffset | 0x40000;
@@ -251,66 +220,70 @@ WRITE32_MEMBER(atlantis_state::board_ctrl_w)
m_dcs->reset_w(CLEAR_LINE);
}
}
- logerror("%s:board_ctrl_w write to CTRL_POWER0 offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_w write to CTRL_POWER0 offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
case CTRL_POWER1:
- // 0x1 VBlank clear?
+ // 0x1 VBlank clear?
if (changeData & 0x1) {
if ((data & 0x0001) == 0) {
+ //UINT32 status_bit = (1 << VBLANK_IRQ_SHIFT);
+ UINT32 status_bit = (1 << 7);
+ board_ctrl[CTRL_CAUSE] &= ~status_bit;
+ board_ctrl[CTRL_STATUS] &= ~status_bit;
+ update_asic_irq();
}
else {
}
}
- logerror("%s:board_ctrl_w write to CTRL_POWER1 offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_w write to CTRL_POWER1 offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
case CTRL_GLOBAL_EN:
// Zero bit will clear cause
board_ctrl[CTRL_CAUSE] &= data;
update_asic_irq();
- logerror("%s:board_ctrl_w write to CTRL_GLOBAL_EN offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_w write to CTRL_GLOBAL_EN offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
default:
- logerror("%s:board_ctrl_w write to offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
+ if (LOG_IRQ)
+ logerror("%s:board_ctrl_w write to offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
break;
}
}
-WRITE32_MEMBER(atlantis_state::asic_fifo_w)
-{
- m_ioasic->fifo_w(data);
-}
-
READ8_MEMBER(atlantis_state::cmos_r)
{
UINT8 result = m_rtc_data[offset];
switch (offset) {
- case 0x7F9:
- case 0x7FA:
- case 0x7FB:
- case 0x7FC:
- case 0x7FD:
- case 0x7FE:
- case 0x7FF:
- if ((m_rtc_data[0x7F8] & 0x40)==0) {
+ case 0x7FF9:
+ case 0x7FFA:
+ case 0x7FFB:
+ case 0x7FFC:
+ case 0x7FFD:
+ case 0x7FFE:
+ case 0x7FFF:
+ if ((m_rtc_data[0x7FF8] & 0x40)==0) {
system_time systime;
// get the current date/time from the core
machine().current_datetime(systime);
- m_rtc_data[0x7F9] = dec_2_bcd(systime.local_time.second);
- m_rtc_data[0x7FA] = dec_2_bcd(systime.local_time.minute);
- m_rtc_data[0x7FB] = dec_2_bcd(systime.local_time.hour);
-
- m_rtc_data[0x7FC] = dec_2_bcd((systime.local_time.weekday != 0) ? systime.local_time.weekday : 7);
- m_rtc_data[0x7FD] = dec_2_bcd(systime.local_time.mday);
- m_rtc_data[0x7FE] = dec_2_bcd(systime.local_time.month + 1);
- m_rtc_data[0x7FF] = dec_2_bcd(systime.local_time.year - 1900); // Epoch is 1900
+ m_rtc_data[0x7FF9] = dec_2_bcd(systime.local_time.second);
+ m_rtc_data[0x7FFA] = dec_2_bcd(systime.local_time.minute);
+ m_rtc_data[0x7FFB] = dec_2_bcd(systime.local_time.hour);
+
+ m_rtc_data[0x7FFC] = dec_2_bcd((systime.local_time.weekday != 0) ? systime.local_time.weekday : 7);
+ m_rtc_data[0x7FFD] = dec_2_bcd(systime.local_time.mday);
+ m_rtc_data[0x7FFE] = dec_2_bcd(systime.local_time.month + 1);
+ m_rtc_data[0x7FFF] = dec_2_bcd(systime.local_time.year - 1900); // Epoch is 1900
result = m_rtc_data[offset];
}
break;
default:
if (LOG_RTC)
- logerror("%s:RTC read from offset %04X = %08X m_rtc_data[0x7F8] %02X\n", machine().describe_context(), offset, result, m_rtc_data[0x7F8]);
+ logerror("%s:RTC read from offset %04X = %08X m_rtc_data[0x7FF8] %02X\n", machine().describe_context(), offset, result, m_rtc_data[0x7FF8]);
break;
}
return result;
@@ -319,23 +292,31 @@ READ8_MEMBER(atlantis_state::cmos_r)
WRITE8_MEMBER(atlantis_state::cmos_w)
{
system_time systime;
-
- if (m_cmos_write_enabled) {
+ // User I/O 0 = Allow write to cmos[0]. Serial Write Enable?
+ if (offset == 0 && (m_user_io_state & 0x1)) {
+ // Data written is shifted by 1 bit each time. Maybe a serial line output?
+ if (LOG_RTC && m_serial_count == 0)
+ logerror("%06X: cmos_w[0] start serial %08x = %02x\n", machine().device("maincpu")->safe_pc(), offset, data);
+ m_serial_count++;
+ if (m_serial_count == 8)
+ m_serial_count = 0;
+ }
+ else if (m_cmos_write_enabled) {
COMBINE_DATA(&m_rtc_data[offset]);
m_cmos_write_enabled = FALSE;
switch (offset) {
- case 0x7F8: // M48T02 time
+ case 0x7FF8: // M48T02 time
if (data & 0x40) {
// get the current date/time from the core
machine().current_datetime(systime);
- m_rtc_data[0x7F9] = dec_2_bcd(systime.local_time.second);
- m_rtc_data[0x7FA] = dec_2_bcd(systime.local_time.minute);
- m_rtc_data[0x7FB] = dec_2_bcd(systime.local_time.hour);
-
- m_rtc_data[0x7FC] = dec_2_bcd((systime.local_time.weekday != 0) ? systime.local_time.weekday : 7);
- m_rtc_data[0x7FD] = dec_2_bcd(systime.local_time.mday);
- m_rtc_data[0x7FE] = dec_2_bcd(systime.local_time.month + 1);
- m_rtc_data[0x7FF] = dec_2_bcd(systime.local_time.year - 1900); // Epoch is 1900
+ m_rtc_data[0x7FF9] = dec_2_bcd(systime.local_time.second);
+ m_rtc_data[0x7FFA] = dec_2_bcd(systime.local_time.minute);
+ m_rtc_data[0x7FFB] = dec_2_bcd(systime.local_time.hour);
+
+ m_rtc_data[0x7FFC] = dec_2_bcd((systime.local_time.weekday != 0) ? systime.local_time.weekday : 7);
+ m_rtc_data[0x7FFD] = dec_2_bcd(systime.local_time.mday);
+ m_rtc_data[0x7FFE] = dec_2_bcd(systime.local_time.month + 1);
+ m_rtc_data[0x7FFF] = dec_2_bcd(systime.local_time.year - 1900); // Epoch is 1900
}
if (LOG_RTC)
logerror("%s:RTC write to offset %04X = %08X & %08X\n", machine().describe_context(), offset, data, mem_mask);
@@ -396,40 +377,14 @@ WRITE32_MEMBER(atlantis_state::status_leds_w)
}
}
-READ32_MEMBER(atlantis_state::zeus_r)
-{
- UINT32 result = m_zeus_data[offset];
- switch (offset) {
- case 0x1:
- /* bit $000C0070 are tested in a loop until 0 */
- /* bits $00080000 is tested in a loop until 0 */
- /* bit $00000004 is tested for toggling; probably VBLANK */
- // zeus is reset if 0x80 is read
- //if (m_screen->vblank())
- m_zeus_data[offset] = (m_zeus_data[offset] + 1) & 0xf;
- break;
- case 0x41:
- // CPU resets map2, writes 0xffffffff here, and then expects this read
- result &= 0x1fff03ff;
- break;
- }
- if (LOG_ZEUS)
- logerror("%s:zeus_r read from offset %04X = %08X & %08X\n", machine().describe_context(), offset, result, mem_mask);
- return result;
-}
-
-WRITE32_MEMBER(atlantis_state::zeus_w)
+READ32_MEMBER(atlantis_state::cmos_protect_r)
{
- COMBINE_DATA(&m_zeus_data[offset]);
- if (LOG_ZEUS)
- logerror("%s:zeus_w write to offset %04X = %08X & %08X\n", machine().describe_context(), offset, data, mem_mask);
- m_last_offset = offset | 0x30000;
+ return m_cmos_write_enabled;
}
-
-READ32_MEMBER(atlantis_state::cmos_protect_r)
+WRITE32_MEMBER(atlantis_state::asic_fifo_w)
{
- return m_cmos_write_enabled;
+ m_ioasic->fifo_w(data);
}
WRITE32_MEMBER(atlantis_state::dcs3_fifo_full_w)
@@ -496,12 +451,48 @@ WRITE_LINE_MEMBER(atlantis_state::uart1_irq_callback)
}
/*************************************
+* Video interrupts
+*************************************/
+WRITE_LINE_MEMBER(atlantis_state::vblank_irq)
+{
+ //logerror("%s: atlantis_state::vblank state = %i\n", machine().describe_context(), state);
+ if (1) {
+ if (state) {
+ board_ctrl[CTRL_STATUS] |= (1 << VBLANK_IRQ_SHIFT);
+ update_asic_irq();
+ }
+ else {
+ board_ctrl[CTRL_STATUS] &= ~(1 << VBLANK_IRQ_SHIFT);
+ board_ctrl[CTRL_CAUSE] &= ~(1 << VBLANK_IRQ_SHIFT);
+ update_asic_irq();
+ }
+ } else {
+ m_maincpu->set_input_line(VBLANK_IRQ_NUM, state);
+ }
+}
+
+WRITE_LINE_MEMBER(atlantis_state::zeus_irq)
+{
+ //logerror("%s: atlantis_state::zeus_irq state = %i\n", machine().describe_context(), state);
+ if (state) {
+ board_ctrl[CTRL_STATUS] |= (1 << ZEUS_IRQ_SHIFT);
+ update_asic_irq();
+ }
+ else {
+ board_ctrl[CTRL_STATUS] &= ~(1 << ZEUS_IRQ_SHIFT);
+ board_ctrl[CTRL_CAUSE] &= ~(1 << ZEUS_IRQ_SHIFT);
+ update_asic_irq();
+ }
+}
+
+/*************************************
* IDE interrupts
*************************************/
WRITE_LINE_MEMBER(atlantis_state::ide_irq)
{
m_maincpu->set_input_line(IDE_IRQ_NUM, state);
- logerror("%s: atlantis_state::ide_irq state = %i\n", machine().describe_context(), state);
+ if (LOG_IRQ)
+ logerror("%s: atlantis_state::ide_irq state = %i\n", machine().describe_context(), state);
}
/*************************************
@@ -509,7 +500,8 @@ WRITE_LINE_MEMBER(atlantis_state::ide_irq)
*************************************/
WRITE_LINE_MEMBER(atlantis_state::ioasic_irq)
{
- logerror("%s: atlantis_state::ioasic_irq state = %i\n", machine().describe_context(), state);
+ if (LOG_IRQ)
+ logerror("%s: atlantis_state::ioasic_irq state = %i\n", machine().describe_context(), state);
if (state) {
board_ctrl[CTRL_STATUS] |= (1 << IOASIC_IRQ_SHIFT);
update_asic_irq();
@@ -535,13 +527,13 @@ void atlantis_state::update_asic_irq()
if (irqBits && !currState) {
m_maincpu->set_input_line(MIPS3_IRQ0 + irqIndex, ASSERT_LINE);
m_irq_state |= (1 << irqIndex);
- if (1)
+ if (LOG_IRQ)
logerror("atlantis_state::update_asic_irq Asserting IRQ(%d) CAUSE = %02X\n", irqIndex, board_ctrl[CTRL_CAUSE]);
}
else if (!(causeBits) && currState) {
m_maincpu->set_input_line(MIPS3_IRQ0 + irqIndex, CLEAR_LINE);
m_irq_state &= ~(1 << irqIndex);
- if (1)
+ if (LOG_IRQ)
logerror("atlantis_state::update_asic_irq Clearing IRQ(%d) CAUSE = %02X\n", irqIndex, board_ctrl[CTRL_CAUSE]);
}
}
@@ -553,7 +545,8 @@ READ32_MEMBER(atlantis_state::port_ctrl_r)
{
UINT32 newOffset = offset >> 17;
UINT32 result = m_port_ctrl_reg[newOffset];
- logerror("%s: port_ctrl_r newOffset = %02X data = %08X\n", machine().describe_context(), newOffset, result);
+ if (LOG_PORT)
+ logerror("%s: port_ctrl_r newOffset = %02X data = %08X\n", machine().describe_context(), newOffset, result);
return result;
}
@@ -562,22 +555,24 @@ WRITE32_MEMBER(atlantis_state::port_ctrl_w)
UINT32 newOffset = offset >> 17;
COMBINE_DATA(&m_port_ctrl_reg[newOffset]);
- switch (newOffset) {
- //case 1:
- // m_port_ctrl_reg[newOffset] = 0;
- // if (!(data & 0x8))
- // m_port_ctrl_reg[newOffset] = 0*3; // Row 0
- // else if (!(data & 0x10))
- // m_port_ctrl_reg[newOffset] = 1*3; // Row 1
- // else if (!(data & 0x20))
- // m_port_ctrl_reg[newOffset] = 2*3; // Row 2
- // else if (!(data & 0x40))
- // m_port_ctrl_reg[newOffset] = 3*3; // Row 3
- // logerror("%s: port_ctrl_w Keypad Row Sel = %04X data = %08X\n", machine().describe_context(), m_port_ctrl_reg[newOffset], data);
- // break;
- default:
- logerror("%s: port_ctrl_w write to offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
- break;
+ //switch (newOffset) {
+ if (newOffset == 1) {
+ UINT32 bits = ioport("KEYPAD")->read();
+ m_port_ctrl_reg[2] = 0;
+ if (!(data & 0x8))
+ m_port_ctrl_reg[2] = bits & 7; // Row 0
+ else if (!(data & 0x10))
+ m_port_ctrl_reg[2] = (bits >> 4) & 7; // Row 1
+ else if (!(data & 0x20))
+ m_port_ctrl_reg[2] = (bits >> 8) & 7; // Row 2
+ else if (!(data & 0x40))
+ m_port_ctrl_reg[2] = (bits >> 12) & 7; // Row 3
+ if (LOG_PORT)
+ logerror("%s: port_ctrl_w Keypad Row Sel = %04X bits = %08X\n", machine().describe_context(), data, bits);
+ }
+ else {
+ if (LOG_PORT)
+ logerror("%s: port_ctrl_w write to offset %04X = %08X & %08X bus offset = %08X\n", machine().describe_context(), newOffset, data, mem_mask, offset);
}
}
@@ -625,24 +620,17 @@ void atlantis_state::machine_reset()
m_dcs->reset_w(0);
m_user_io_state = 0;
m_cmos_write_enabled = FALSE;
- memset(m_zeus_data, 0, sizeof(m_zeus_data));
- m_red_count = 0;
+ m_serial_count = 0;
m_irq_state = 0;
memset(board_ctrl, 0, sizeof(board_ctrl));
memset(m_port_ctrl_reg, 0, sizeof(m_port_ctrl_reg));
}
-
-
/*************************************
- *
- * Main CPU memory handlers
- *
+ * Address Maps
*************************************/
-
static ADDRESS_MAP_START( map0, AS_PROGRAM, 32, atlantis_state )
- AM_RANGE(0x00000000, 0x00000fff) AM_READWRITE8(red_r, red_w, 0xff)
- AM_RANGE(0x0001e000, 0x0001ffff) AM_READWRITE8(cmos_r, cmos_w, 0xff)
+ AM_RANGE(0x00000000, 0x0001ffff) AM_READWRITE8(cmos_r, cmos_w, 0xff)
AM_RANGE(0x00100000, 0x0010001f) AM_DEVREADWRITE8("uart0", ns16550_device, ins8250_r, ins8250_w, 0xff) // Serial UART0 (TL16C552 CS0)
AM_RANGE(0x00180000, 0x0018001f) AM_DEVREADWRITE8("uart1", ns16550_device, ins8250_r, ins8250_w, 0xff) // Serial UART1 (TL16C552 CS1)
//AM_RANGE(0x00200000, 0x0020001f) // Parallel UART (TL16C552 CS2)
@@ -666,21 +654,20 @@ static ADDRESS_MAP_START( map1, AS_PROGRAM, 32, atlantis_state )
AM_RANGE(0x00000000, 0x0000003f) AM_DEVREADWRITE("ioasic", midway_ioasic_device, read, write)
// asic_fifo_w
// dcs3_fifo_full_w
- //AM_RANGE(0x00200000, 0x00200003)
+ AM_RANGE(0x00200000, 0x00200003) AM_WRITE(dcs3_fifo_full_w)
AM_RANGE(0x00400000, 0x00400003) AM_DEVWRITE("dcs", dcs_audio_device, dsio_idma_addr_w)
AM_RANGE(0x00600000, 0x00600003) AM_DEVREADWRITE("dcs", dcs_audio_device, dsio_idma_data_r, dsio_idma_data_w)
- //AM_RANGE(0x00800000, 0x00800003) AM_WRITE(dcs3_fifo_full_w)
- //AM_RANGE(0x00800000, 0x00800003) AM_WRITE(asic_fifo_w)
- //AM_RANGE(0x00800000, 0x00a00003) AM_READWRITE(port_ctrl_r, port_ctrl_w)
+ AM_RANGE(0x00800000, 0x00900003) AM_READWRITE(port_ctrl_r, port_ctrl_w)
//AM_RANGE(0x00800000, 0x00800003) // Written once = 0000fff8
//AM_RANGE(0x00880000, 0x00880003) // Initial write 0000fff0, follow by sequence ffef, ffdf, ffbf, fff7. Row Select?
//AM_RANGE(0x00900000, 0x00900003) // Read once before each sequence write to 0x00880000. Code checks bits 0,1,2. Keypad?
//AM_RANGE(0x00980000, 0x00980003) // Read / Write. Bytes written 0x8f, 0xcf. Code if read 0x1 then read 00a00000. POTs?
//AM_RANGE(0x00a00000, 0x00a00003)
- ADDRESS_MAP_END
+ AM_RANGE(0x00980000, 0x00980003) AM_NOP // AM_WRITE(asic_fifo_w)
+ADDRESS_MAP_END
static ADDRESS_MAP_START(map2, AS_PROGRAM, 32, atlantis_state)
- AM_RANGE(0x00000000, 0x000001ff) AM_READWRITE(zeus_r, zeus_w)
+ AM_RANGE(0x00000000, 0x000001ff) AM_DEVREADWRITE("zeus2", zeus2_device, zeus2_r, zeus2_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( map3, AS_PROGRAM, 32, atlantis_state )
@@ -696,26 +683,26 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( mwskins )
PORT_START("DIPS")
PORT_DIPNAME(0x0003, 0x0003, "Boot Mode")
- PORT_DIPSETTING(0x0003, "Normal Boot")
+ PORT_DIPSETTING(0x0003, "Run Game")
PORT_DIPSETTING(0x0002, "Boot EEPROM Based Self Test")
PORT_DIPSETTING(0x0001, "Boot Disk Based Self Test")
PORT_DIPSETTING(0x0000, "Run Factory Tests")
- PORT_DIPNAME(0x0004, 0x0004, "Unknown0004")
- PORT_DIPSETTING(0x0004, DEF_STR(Off))
- PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME(0x0008, 0x0008, "Unknown0008")
+ PORT_DIPNAME(0x0004, 0x0004, "Boot Message")
+ PORT_DIPSETTING(0x0004, "Quiet")
+ PORT_DIPSETTING(0x0000, "Squawk During Boot")
+ PORT_DIPNAME(0x0008, 0x0008, "Reserved")
PORT_DIPSETTING(0x0008, DEF_STR(Off))
PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME(0x0010, 0x0010, "Unknown0010")
+ PORT_DIPNAME(0x0010, 0x0010, "Reserved")
PORT_DIPSETTING(0x0010, DEF_STR(Off))
PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME(0x0020, 0x0020, "Unknown0020")
+ PORT_DIPNAME(0x0020, 0x0020, "Reserved")
PORT_DIPSETTING(0x0020, DEF_STR(Off))
PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME(0x0040, 0x0040, "Unknown0040")
+ PORT_DIPNAME(0x0040, 0x0040, "Reserved")
PORT_DIPSETTING(0x0040, DEF_STR(Off))
PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME(0x0080, 0x0080, "Unknown0080")
+ PORT_DIPNAME(0x0080, 0x0080, "Reserved")
PORT_DIPSETTING(0x0080, DEF_STR(Off))
PORT_DIPSETTING(0x0000, DEF_STR(On))
PORT_DIPNAME(0x0100, 0x0100, "Unknown0100")
@@ -783,18 +770,18 @@ static INPUT_PORTS_START( mwskins )
PORT_BIT(0xffff, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("KEYPAD")
- PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) /* keypad 3 */
- PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) /* keypad 1 */
- PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) /* keypad 2 */
- PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) /* keypad 6 */
- PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) /* keypad 4 */
- PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) /* keypad 5 */
- PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) /* keypad 9 */
- PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) /* keypad 7 */
- PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) /* keypad 8 */
- PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad #") PORT_CODE(KEYCODE_PLUS_PAD) /* keypad # */
- PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_MINUS_PAD) /* keypad * */
- PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) /* keypad 0 */
+ PORT_BIT(0x0001, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 1") PORT_CODE(KEYCODE_1_PAD) /* keypad 1 */
+ PORT_BIT(0x0002, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 2") PORT_CODE(KEYCODE_2_PAD) /* keypad 2 */
+ PORT_BIT(0x0004, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) /* keypad 3 */
+ PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 4") PORT_CODE(KEYCODE_4_PAD) /* keypad 4 */
+ PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 5") PORT_CODE(KEYCODE_5_PAD) /* keypad 5 */
+ PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) /* keypad 6 */
+ PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) /* keypad 7 */
+ PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) /* keypad 8 */
+ PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) /* keypad 9 */
+ PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad *") PORT_CODE(KEYCODE_MINUS_PAD) /* keypad - */
+ PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad 0") PORT_CODE(KEYCODE_0_PAD) /* keypad 0 */
+ PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_NAME("Keypad #") PORT_CODE(KEYCODE_PLUS_PAD) /* keypad + */
INPUT_PORTS_END
@@ -830,21 +817,18 @@ static MACHINE_CONFIG_START( mwskins, atlantis_state )
MCFG_IDE_PCI_IRQ_HANDLER(DEVWRITELINE(":", atlantis_state, ide_irq))
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(320, 240)
- MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 239)
- MCFG_SCREEN_UPDATE_DRIVER(atlantis_state, screen_update_mwskins)
- MCFG_SCREEN_PALETTE("palette")
+ MCFG_DEVICE_ADD("zeus2", ZEUS2, ZEUS2_VIDEO_CLOCK)
+ MCFG_ZEUS2_IRQ_CB(WRITELINE(atlantis_state, zeus_irq))
+ MCFG_ZEUS2_VBLANK_CB(WRITELINE(atlantis_state, vblank_irq))
- MCFG_PALETTE_ADD_BBBBBGGGGGRRRRR("palette")
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_RAW_PARAMS(ZEUS2_VIDEO_CLOCK / 8, 529, 0, 400, 278, 0, 256)
+ MCFG_SCREEN_UPDATE_DEVICE("zeus2", zeus2_device, screen_update)
/* sound hardware */
//MCFG_DEVICE_ADD("dcs", DCS2_AUDIO_DSIO, 0)
MCFG_DEVICE_ADD("dcs", DCS2_AUDIO_DENVER, 0)
- MCFG_DCS2_AUDIO_DRAM_IN_MB(8)
+ MCFG_DCS2_AUDIO_DRAM_IN_MB(4)
MCFG_DCS2_AUDIO_POLLING_OFFSET(0) /* no place to hook :-( */
MCFG_DEVICE_ADD("ioasic", MIDWAY_IOASIC, 0)
diff --git a/src/mame/drivers/midzeus.cpp b/src/mame/drivers/midzeus.cpp
index 816dc219648..a8eb9a68f72 100644
--- a/src/mame/drivers/midzeus.cpp
+++ b/src/mame/drivers/midzeus.cpp
@@ -37,6 +37,7 @@ The Grid v1.2 10/18/2000
#include "machine/nvram.h"
#include "crusnexo.lh"
+#include "video/zeus2.h"
#define CPU_CLOCK XTAL_60MHz
@@ -114,6 +115,10 @@ INTERRUPT_GEN_MEMBER(midzeus_state::display_irq)
machine().scheduler().timer_set(attotime::from_hz(30000000), timer_expired_delegate(FUNC(midzeus_state::display_irq_off),this));
}
+WRITE_LINE_MEMBER(midzeus2_state::zeus_irq)
+{
+ m_maincpu->set_input_line(2, ASSERT_LINE);
+}
/*************************************
@@ -575,7 +580,7 @@ static ADDRESS_MAP_START( zeus2_map, AS_PROGRAM, 32, midzeus2_state )
AM_RANGE(0x000000, 0x03ffff) AM_RAM AM_SHARE("ram_base")
AM_RANGE(0x400000, 0x43ffff) AM_RAM
AM_RANGE(0x808000, 0x80807f) AM_READWRITE(tms32031_control_r, tms32031_control_w) AM_SHARE("tms32031_ctl")
- AM_RANGE(0x880000, 0x88007f) AM_READWRITE(zeus2_r, zeus2_w) AM_SHARE("zeusbase")
+ AM_RANGE(0x880000, 0x88007f) AM_DEVREADWRITE("zeus2", zeus2_device, zeus2_r, zeus2_w)
AM_RANGE(0x8a0000, 0x8a003f) AM_READWRITE(linkram_r, linkram_w) AM_SHARE("linkram")
AM_RANGE(0x8d0000, 0x8d000a) AM_READWRITE(bitlatches_r, bitlatches_w)
AM_RANGE(0x900000, 0x91ffff) AM_READWRITE(zpram_r, zpram_w) AM_SHARE("nvram") AM_MIRROR(0x020000)
@@ -1134,7 +1139,7 @@ static MACHINE_CONFIG_START( midzeus2, midzeus2_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", TMS32032, CPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(zeus2_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", midzeus2_state, display_irq)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", midzeus2_state, display_irq)
MCFG_MACHINE_START_OVERRIDE(midzeus2_state,midzeus)
MCFG_MACHINE_RESET_OVERRIDE(midzeus2_state,midzeus)
@@ -1143,9 +1148,10 @@ static MACHINE_CONFIG_START( midzeus2, midzeus2_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(MIDZEUS_VIDEO_CLOCK/4, 666, 0, 512, 438, 0, 400)
- MCFG_SCREEN_UPDATE_DRIVER(midzeus2_state, screen_update_midzeus2)
+ MCFG_SCREEN_UPDATE_DEVICE("zeus2", zeus2_device, screen_update)
- MCFG_VIDEO_START_OVERRIDE(midzeus2_state,midzeus2)
+ MCFG_DEVICE_ADD("zeus2", ZEUS2, ZEUS2_VIDEO_CLOCK)
+ MCFG_ZEUS2_IRQ_CB(WRITELINE(midzeus2_state, zeus_irq))
/* sound hardware */
MCFG_DEVICE_ADD("dcs", DCS2_AUDIO_2104, 0)
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index 6fa412a978c..846f87cb95e 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -3185,6 +3185,8 @@ static MACHINE_CONFIG_FRAGMENT( pc9801_ide )
MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(pc9801_state, ide1_irq_w))
MCFG_ATA_INTERFACE_ADD("ide2", pc9801_atapi_devices, "pc9801_cd", nullptr, false)
MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(pc9801_state, ide2_irq_w))
+
+ MCFG_SOFTWARE_LIST_ADD("cd_list","pc98_cd")
MACHINE_CONFIG_END
static MACHINE_CONFIG_FRAGMENT( pc9801_common )
diff --git a/src/mame/drivers/poker72.cpp b/src/mame/drivers/poker72.cpp
index 4867465e902..2d88b84b5b4 100644
--- a/src/mame/drivers/poker72.cpp
+++ b/src/mame/drivers/poker72.cpp
@@ -1,16 +1,22 @@
// license:BSD-3-Clause
-// copyright-holders:David Haywood
-/*
- Unknown game, dump was marked 'slot 72 - poker'
+// copyright-holders:David Haywood, Robbbert
+/************************************************************************************************
+ Poker Monarch
GFX roms contain
'Extrema Systems International Ltd'
as well as a logo for the company.
- There are also 'Lucky Boy' graphics in various places, which might be the title.
+ There are also 'Lucky Boy' graphics in various places.
+ * Turn on all the dips of SW1
+ * Restart game
+ * If it says ERROR OF RAM GAME STOP, press F2
+ * When you get a blank blue screen Press Alt+2
+ * This gives a setup screen. Press F2 to see cards and logo (and it beeps)
+ * Depending on settings of SW1, you can get other cards, or other test screens.
-*/
+*************************************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
@@ -89,17 +95,15 @@ WRITE8_MEMBER(poker72_state::poker72_paletteram_w)
WRITE8_MEMBER(poker72_state::output_w)
{
- UINT8 *ROM = memregion("maincpu")->base();
-
printf("%02x\n",data);
/* if((data & 0xc) == 0xc)
- membank("bank1")->set_base(&ROM[0x10000]);
+ membank("bank1")->set_entry(2);
else*/
if(data & 8)
- membank("bank1")->set_base(&ROM[0x08000]);
+ membank("bank1")->set_entry(1);
else
- membank("bank1")->set_base(&ROM[0x00000]);
+ membank("bank1")->set_entry(0);
}
WRITE8_MEMBER(poker72_state::tile_bank_w)
@@ -108,17 +112,17 @@ WRITE8_MEMBER(poker72_state::tile_bank_w)
}
static ADDRESS_MAP_START( poker72_map, AS_PROGRAM, 8, poker72_state )
- AM_RANGE(0x0000, 0xbfff) AM_ROMBANK("bank1")
+ AM_RANGE(0x0000, 0x7fff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xdfff) AM_RAM //work ram
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("vram")
AM_RANGE(0xf000, 0xfbff) AM_RAM_WRITE(poker72_paletteram_w) AM_SHARE("pal")
AM_RANGE(0xfc00, 0xfdff) AM_RAM //???
- AM_RANGE(0xfe08, 0xfe08) AM_READ_PORT("IN0")
+ AM_RANGE(0xfe08, 0xfe08) AM_READ_PORT("SW1")
AM_RANGE(0xfe09, 0xfe09) AM_READ_PORT("IN1")
AM_RANGE(0xfe0a, 0xfe0a) AM_READ_PORT("IN2")
- AM_RANGE(0xfe0c, 0xfe0c) AM_READ_PORT("IN3")
- AM_RANGE(0xfe0d, 0xfe0d) AM_READ_PORT("IN4")
- AM_RANGE(0xfe0e, 0xfe0e) AM_READ_PORT("IN5")
+ AM_RANGE(0xfe0c, 0xfe0c) AM_READ_PORT("SW4")
+ AM_RANGE(0xfe0d, 0xfe0d) AM_READ_PORT("SW5")
+ AM_RANGE(0xfe0e, 0xfe0e) AM_READ_PORT("SW6")
AM_RANGE(0xfe17, 0xfe17) AM_READNOP //irq ack
AM_RANGE(0xfe20, 0xfe20) AM_WRITE(output_w) //output, irq enable?
@@ -142,8 +146,8 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( poker72 )
- PORT_START("IN0")
- PORT_DIPNAME( 0x01, 0x00, "IN0" )
+ PORT_START("SW1")
+ PORT_DIPNAME( 0x01, 0x00, "SW1" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -169,28 +173,28 @@ static INPUT_PORTS_START( poker72 )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
PORT_START("IN1")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_POKER_HOLD1 )
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_POKER_HOLD2 )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_POKER_HOLD3 )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_POKER_HOLD4 )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_POKER_HOLD5 )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("M. Bet")
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Black")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_POKER_HOLD1 ) // Z
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_POKER_HOLD2 ) // X
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_POKER_HOLD3 ) // C
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_POKER_HOLD4 ) // V
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_POKER_HOLD5 ) // B
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("M. Bet")
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Black")
PORT_START("IN2")
- PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Red")
- PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_GAMBLE_D_UP )
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_GAMBLE_TAKE )
- PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_GAMBLE_DEAL )
- PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_GAMBLE_BET )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_SERVICE( 0x0080, IP_ACTIVE_LOW )
-
- PORT_START("IN3")
- PORT_DIPNAME( 0x01, 0x00, "IN3" )
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Red")
+ PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_GAMBLE_D_UP )
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_GAMBLE_TAKE )
+ PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_GAMBLE_DEAL ) // '2'
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_GAMBLE_BET ) // M
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_SERVICE1 ) // '9'
+ PORT_SERVICE( 0x0080, IP_ACTIVE_HIGH ) // F2
+
+ PORT_START("SW4")
+ PORT_DIPNAME( 0x01, 0x00, "SW4" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -214,8 +218,8 @@ static INPUT_PORTS_START( poker72 )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("IN4")
- PORT_DIPNAME( 0x01, 0x00, "IN4" )
+ PORT_START("SW5")
+ PORT_DIPNAME( 0x01, 0x00, "SW5" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -239,8 +243,8 @@ static INPUT_PORTS_START( poker72 )
PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("IN5")
- PORT_DIPNAME( 0x01, 0x00, "IN5" )
+ PORT_START("SW6")
+ PORT_DIPNAME( 0x01, 0x00, "SW6" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -266,8 +270,8 @@ static INPUT_PORTS_START( poker72 )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("DSW0")
- PORT_DIPNAME( 0x01, 0x00, "DSW0" )
+ PORT_START("SW2")
+ PORT_DIPNAME( 0x01, 0x00, "SW2" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -292,8 +296,8 @@ static INPUT_PORTS_START( poker72 )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x00, "DSW1" )
+ PORT_START("SW3")
+ PORT_DIPNAME( 0x01, 0x00, "SW3" )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) )
@@ -354,9 +358,7 @@ PALETTE_INIT_MEMBER(poker72_state, poker72)
void poker72_state::machine_reset()
{
- UINT8 *ROM = memregion("maincpu")->base();
-
- membank("bank1")->set_base(&ROM[0]);
+ membank("bank1")->set_entry(0);
}
static MACHINE_CONFIG_START( poker72, poker72_state )
@@ -384,15 +386,15 @@ static MACHINE_CONFIG_START( poker72, poker72_state )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ay", AY8910, 8000000/8) /* ? Mhz */
- MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW0"))
- MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW1"))
+ MCFG_AY8910_PORT_A_READ_CB(IOPORT("SW2"))
+ MCFG_AY8910_PORT_B_READ_CB(IOPORT("SW3"))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END
ROM_START( poker72 )
- ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_REGION( 0x20000, "roms", 0 )
ROM_LOAD( "27010.bin", 0x00000, 0x20000, CRC(62447341) SHA1(e442c1f834a5dd2ab6ab3bdd316dfa86f2ca6647) )
ROM_REGION( 0x1000, "89c51", 0 )
@@ -407,9 +409,14 @@ ROM_END
DRIVER_INIT_MEMBER(poker72_state,poker72)
{
- UINT8 *rom = memregion("maincpu")->base();
+ UINT8 *rom = memregion("roms")->base();
+
+ // configure and intialize bank 1
+ membank("bank1")->configure_entries(0, 4, memregion("roms")->base(), 0x8000);
+ membank("bank1")->set_entry(0);
- rom[0x4a9] = 0x28;
+ //rom[0x4a9] = 0x28;
+ rom[0x4aa] = 0x00;
}
-GAME( 1995, poker72, 0, poker72, poker72, poker72_state, poker72, ROT0, "Extrema Systems International Ltd.", "Poker Monarch (v2.50)", MACHINE_NOT_WORKING ) // actually unknown, was marked 'slot 72 poker' Manufacturers logo and 'Lucky Boy' gfx in rom..
+GAME( 1995, poker72, 0, poker72, poker72, poker72_state, poker72, ROT0, "Extrema Systems International Ltd.", "Poker Monarch (v2.50)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp
index e89fa616231..ceae4a5e568 100644
--- a/src/mame/drivers/sun4.cpp
+++ b/src/mame/drivers/sun4.cpp
@@ -387,6 +387,8 @@
#include "emu.h"
#include "cpu/sparc/sparc.h"
+#include "machine/z80scc.h"
+#include "bus/rs232/rs232.h"
#define ENA_NOTBOOT 0x80
#define ENA_SDVMA 0x20
@@ -394,6 +396,22 @@
#define ENA_RESET 0x04
#define ENA_DIAG 0x01
+#define SCC1_TAG "kbdmouse"
+#define SCC2_TAG "uart"
+#define RS232A_TAG "rs232a"
+#define RS232B_TAG "rs232b"
+
+#define ASI_SYSTEM_SPACE 2
+#define ASI_SEGMENT_MAP 3
+#define ASI_PAGE_MAP 4
+#define ASI_USER_INSN 8
+#define ASI_SUPER_INSN 9
+#define ASI_USER_DATA 10
+#define ASI_SUPER_DATA 11
+#define ASI_FLUSH_SEGMENT 12
+#define ASI_FLUSH_PAGE 13
+#define ASI_FLUSH_CONTEXT 14
+
class sun4_state : public driver_device
{
public:
@@ -401,7 +419,10 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_rom(*this, "user1")
+ , m_kbdmouse(*this, SCC1_TAG)
+ , m_uart(*this, SCC2_TAG)
, m_rom_ptr(nullptr)
+ , m_context(0)
, m_system_enable(0)
{
}
@@ -416,39 +437,172 @@ protected:
required_device<mb86901_device> m_maincpu;
required_memory_region m_rom;
+ required_device<z80scc_device> m_kbdmouse;
+ required_device<z80scc_device> m_uart;
+
+ UINT32 read_supervisor_data(UINT32 vaddr, UINT32 mem_mask);
+ void write_supervisor_data(UINT32 vaddr, UINT32 data, UINT32 mem_mask);
+
UINT32 *m_rom_ptr;
UINT32 m_context;
+ UINT16 m_segmap[8][4096];
+ UINT32 m_pagemap[8192];
UINT32 m_system_enable;
};
+#define SEGMENT(vaddr) m_segmap[m_context & 7][((vaddr) >> 18) & 0xfff]
+#define PAGE(vaddr) m_pagemap[((m_segmap[m_context & 7][((vaddr) >> 18) & 0xfff] & 0x7f) << 6) | (((vaddr) >> 12) & 0x3f)]
+#define PADDR(vaddr) (((PAGE(vaddr) << 12) & 0x0ffff000) | ((vaddr) & 0xfff))
+
+UINT32 sun4_state::read_supervisor_data(UINT32 vaddr, UINT32 mem_mask)
+{
+ UINT32 page = PAGE(vaddr);
+ bool v = (page & 0x80000000) ? true : false;
+ bool w = (page & 0x40000000) ? true : false;
+ bool s = (page & 0x20000000) ? true : false;
+ bool x = (page & 0x10000000) ? true : false;
+ int t = (page & 0x0c000000) >> 26;
+ bool a = (page & 0x02000000) ? true : false;
+ bool m = (page & 0x01000000) ? true : false;
+ char mode[4] = { 'M', 'S', '0', '1' };
+
+ logerror("supervisor data read: vaddr %08x, paddr %08x, context %d, segment entry %02x, page entry %08x, %c%c%c%c%c%c%c\n", vaddr, PADDR(vaddr), m_context, SEGMENT(vaddr), PAGE(vaddr)
+ , v ? 'V' : 'v', w ? 'W' : 'w', s ? 'S' : 's', x ? 'X' : 'x', mode[t], a ? 'A' : 'a', m ? 'M' : 'm');
+ return 0;
+}
+
+void sun4_state::write_supervisor_data(UINT32 vaddr, UINT32 data, UINT32 mem_mask)
+{
+ UINT32 page = PAGE(vaddr);
+ bool v = (page & 0x80000000) ? true : false;
+ bool w = (page & 0x40000000) ? true : false;
+ bool s = (page & 0x20000000) ? true : false;
+ bool x = (page & 0x10000000) ? true : false;
+ int t = (page & 0x0c000000) >> 26;
+ bool a = (page & 0x02000000) ? true : false;
+ bool m = (page & 0x01000000) ? true : false;
+ char mode[4] = { 'M', 'S', '0', '1' };
+
+ logerror("supervisor data write: vaddr %08x, paddr %08x, data %08x, mem_mask %08x, context %d, segment entry %02x, page entry %08x, %c%c%c%c%c%c%c\n", vaddr, PADDR(vaddr), data, mem_mask,
+ m_context, SEGMENT(vaddr), PAGE(vaddr), v ? 'V' : 'v', w ? 'W' : 'w', s ? 'S' : 's', x ? 'X' : 'x', mode[t], a ? 'A' : 'a', m ? 'M' : 'm');
+}
+
READ32_MEMBER( sun4_state::sun4_mmu_r )
{
UINT8 asi = m_maincpu->get_asi();
- if (asi == 2 && !space.debugger_access())
+ if (!space.debugger_access())
{
- switch (offset >> 26)
+ switch(asi)
{
- case 3: // context reg
- return m_context;
-
- case 4: // system enable reg
- return m_system_enable;
-
- case 6: // bus error register
- return 0;
-
- case 8: // (d-)cache tags
- logerror("sun4: read dcache tags @ %x, PC = %x\n", offset, m_maincpu->pc());
- return 0xffffffff;
+ case ASI_SYSTEM_SPACE:
+ switch (offset >> 26)
+ {
+ case 3: // context reg
+ logerror("sun4: read context register %08x (& %08x) asi 2, offset %x, PC = %x\n", m_context << 24, mem_mask, offset << 2, m_maincpu->pc());
+ return m_context << 24;
+
+ case 4: // system enable reg
+ logerror("sun4: read system enable register %08x (& %08x) asi 2, offset %x, PC = %x\n", m_system_enable << 24, mem_mask, offset << 2, m_maincpu->pc());
+ return m_system_enable << 24;
+
+ case 8: // (d-)cache tags
+ logerror("sun4: read dcache tags %08x (& %08x) asi 2, offset %x, PC = %x\n", 0xffffffff, mem_mask, offset << 2, m_maincpu->pc());
+ return 0xffffffff;
+
+ case 9: // (d-)cache data
+ logerror("sun4: read dcache data %08x (& %08x) asi 2, offset %x, PC = %x\n", 0xffffffff, mem_mask, offset << 2, m_maincpu->pc());
+ return 0xffffffff;
+
+ case 15: // Type 1 space passthrough
+ switch ((offset >> 22) & 15)
+ {
+ case 0: // keyboard/mouse
+ switch (offset & 1)
+ {
+ case 0:
+ {
+ UINT32 ret = 0;
+ if (mem_mask & 0xffff0000)
+ ret |= m_kbdmouse->cb_r(space, 0) << 24;
+ if (mem_mask & 0x0000ffff)
+ ret |= m_kbdmouse->db_r(space, 0) << 8;
+ return ret;
+ }
+ case 1:
+ {
+ UINT32 ret = 0;
+ if (mem_mask & 0xffff0000)
+ ret |= m_kbdmouse->ca_r(space, 0) << 24;
+ if (mem_mask & 0x0000ffff)
+ ret |= m_kbdmouse->da_r(space, 0) << 8;
+ return ret;
+ }
+ }
+ break;
+ case 1: // serial ports
+ switch (offset & 1)
+ {
+ case 0:
+ {
+ UINT32 ret = 0;
+ if (mem_mask & 0xffff0000)
+ ret |= m_uart->cb_r(space, 0) << 24;
+ if (mem_mask & 0x0000ffff)
+ ret |= m_uart->db_r(space, 0) << 8;
+ return ret;
+ }
+ case 1:
+ {
+ UINT32 ret = 0;
+ if (mem_mask & 0xffff0000)
+ ret |= m_uart->ca_r(space, 0) << 24;
+ if (mem_mask & 0x0000ffff)
+ ret |= m_uart->da_r(space, 0) << 8;
+ return ret;
+ }
+ }
+ break;
+
+ default:
+ logerror("sun4: read unknown type 1 space at address %x (& %08x) asi 2, offset %x, PC = %x\n", offset << 2, mem_mask, offset << 2, m_maincpu->pc());
+ }
+ break;
+
+ case 0: // IDPROM - TODO: SPARCstation-1 does not have an ID prom and a timeout should occur.
+ default:
+ logerror("sun4: read unknown register (& %08x) asi 2, offset %x, PC = %x\n", mem_mask, offset << 2, m_maincpu->pc());
+ return 0;
+ }
+ break;
+
+ case ASI_SEGMENT_MAP:
+ {
+ logerror("sun4: read m_segmap[%d][(%08x >> 18) & 0xfff = %03x] = %08x << 24 & %08x\n", m_context & 7, offset << 2, (offset >> 16) & 0xfff, SEGMENT(offset << 2), mem_mask);
+ UINT32 result = SEGMENT(offset << 2);
+ while (!(mem_mask & 1))
+ {
+ mem_mask >>= 1;
+ result <<= 1;
+ }
+ return result;
+ }
+
+ case ASI_PAGE_MAP: // page map
+ {
+ logerror("sun4: read m_pagemap[(m_segmap[%d][(%08x >> 18) & 0xfff = %03x] = %08x << 6) | ((%08x >> 12) & 0x3f)]] = %08x & %08x\n", m_context & 7, offset << 2, (offset >> 16) & 0xfff, SEGMENT(offset << 2), offset << 2, PAGE(offset << 2), mem_mask);
+ return PAGE(offset << 2);
+ }
+
+ case ASI_SUPER_INSN: // supervisor instruction space
+ return m_rom_ptr[offset & 0x1ffff]; // wrong, but works for now
+
+ case ASI_SUPER_DATA:
+ return read_supervisor_data(offset << 2, mem_mask);
- case 9: // (d-)cache data
- logerror("sun4: read dcache data @ %x, PC = %x\n", offset, m_maincpu->pc());
- return 0xffffffff;
-
- case 0: // IDPROM - TODO: SPARCstation-1 does not have an ID prom and a timeout should occur.
default:
- return 0;
+ logerror("sun4: read (& %08x) asi %d byte offset %x, PC = %x\n", mem_mask, asi, offset << 2, m_maincpu->pc());
+ break;
}
}
@@ -456,10 +610,6 @@ READ32_MEMBER( sun4_state::sun4_mmu_r )
{
return m_rom_ptr[offset & 0x1ffff];
}
- else if (asi < 8 || asi > 11)
- {
- logerror("sun4: read asi %d byte offset %x, PC = %x\n", asi, offset << 2, m_maincpu->pc());
- }
return 0;
}
@@ -468,34 +618,107 @@ WRITE32_MEMBER( sun4_state::sun4_mmu_w )
{
UINT8 asi = m_maincpu->get_asi();
- if (asi == 2)
+ switch (asi)
{
- switch (offset >> 26)
+ case 2:
+ switch (offset >> 26)
+ {
+ case 3: // context reg
+ logerror("sun4: %08x (& %08x) asi 2 to context register, offset %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ m_context = (UINT8)(data >> 24) & 7;
+ return;
+
+ case 4: // system enable reg
+ logerror("sun4: write %08x (& %08x) asi 2 to system enable register, offset %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ m_system_enable = (UINT8)data;
+ return;
+
+ case 8: // cache tags
+ logerror("sun4: write %08x (& %08x) asi 2 to cache tags @ %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ return;
+
+ case 9: // cache data
+ logerror("sun4: write %08x (& %08x) asi 2 to cache data @ %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ return;
+
+ case 15: // Type 1 space passthrough
+ switch ((offset >> 22) & 15)
+ {
+ case 0: // keyboard/mouse
+ switch (offset & 1)
+ {
+ case 0:
+ if (mem_mask & 0xffff0000)
+ m_kbdmouse->cb_w(space, 0, data >> 24);
+ if (mem_mask & 0x0000ffff)
+ m_kbdmouse->db_w(space, 0, data >> 24);
+ break;
+ case 1:
+ if (mem_mask & 0xffff0000)
+ m_kbdmouse->ca_w(space, 0, data >> 24);
+ if (mem_mask & 0x0000ffff)
+ m_kbdmouse->da_w(space, 0, data >> 24);
+ break;
+ }
+ break;
+ case 1: // serial ports
+ switch (offset & 1)
+ {
+ case 0:
+ if (mem_mask & 0xffff0000)
+ m_uart->cb_w(space, 0, data >> 24);
+ if (mem_mask & 0x0000ffff)
+ m_uart->db_w(space, 0, data >> 24);
+ break;
+ case 1:
+ if (mem_mask & 0xffff0000)
+ m_uart->ca_w(space, 0, data >> 24);
+ if (mem_mask & 0x0000ffff)
+ m_uart->da_w(space, 0, data >> 24);
+ break;
+ }
+ break;
+ default:
+ logerror("sun4: write unknown type 1 space %08x (& %08x) asi 2, offset %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ }
+ break;
+
+ case 0: // IDPROM
+ default:
+ logerror("sun4: write %08x (& %08x) asi 2 to unknown register, offset %x, PC = %x\n", data, mem_mask, offset << 2, m_maincpu->pc());
+ return;
+ }
+ break;
+
+ case 3: // segment map
+ offset <<= 2;
+ while (!(mem_mask & 1))
+ {
+ mem_mask >>= 1;
+ data >>= 1;
+ }
+ SEGMENT(offset) = data;
+ //m_segmap[m_context & 7][(offset >> 18) & 0xfff] &= ~(mem_mask >> 16);
+ //m_segmap[m_context & 7][(offset >> 18) & 0xfff] |= (data >> 16) & (mem_mask >> 16);
+ logerror("sun4: write m_segmap[%d][(%08x >> 18) & 0xfff = %03x] = %08x & %08x\n", m_context & 7, offset << 2, (offset >> 16) & 0xfff, data, mem_mask);
+ break;
+
+ case ASI_PAGE_MAP: // page map
{
- case 3: // context reg
- m_context = (UINT8)data;
- return;
-
- case 4: // system enable reg
- m_system_enable = (UINT8)data;
- return;
-
- case 8: // cache tags
- logerror("sun4: %08x to cache tags @ %x, PC = %x\n", data, offset, m_maincpu->pc());
- return;
+ logerror("sun4: write m_pagemap[(m_segmap[%d][(%08x >> 18) & 0xfff = %03x] = %08x << 6) | ((%08x >> 12) & 0x3f)]] = %08x & %08x\n", m_context & 7, offset << 2,
+ (offset >> 16) & 0xfff, SEGMENT(offset << 2), offset << 2, data, mem_mask);
+ COMBINE_DATA(&PAGE(offset << 2));
+ PAGE(offset << 2) &= 0xff00ffff;
+ break;
+ }
- case 9: // cache data
- logerror("sun4: %08x to cache data @ %x, PC = %x\n", data, offset, m_maincpu->pc());
- return;
+ case ASI_SUPER_DATA:
+ write_supervisor_data(offset << 2, data, mem_mask);
+ break;
- case 0: // IDPROM
- default:
- return;
- }
- }
- else if (asi < 8 || asi > 11)
- {
- logerror("sun4: %08x to asi %d byte offset %x, PC = %x\n", data, asi, offset << 2, m_maincpu->pc());
+ default:
+ logerror("sun4: write %08x (& %08x) to asi %d byte offset %x, PC = %x\n", data, mem_mask, asi, offset << 2, m_maincpu->pc());
+ break;
}
}
@@ -521,6 +744,21 @@ static MACHINE_CONFIG_START( sun4, sun4_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", MB86901, 16670000)
MCFG_DEVICE_ADDRESS_MAP(AS_PROGRAM, sun4_mem)
+
+ MCFG_SCC8530_ADD(SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
+ MCFG_SCC8530_ADD(SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
+ MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE(RS232A_TAG, rs232_port_device, write_txd))
+ MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE(RS232B_TAG, rs232_port_device, write_txd))
+
+ MCFG_RS232_PORT_ADD(RS232A_TAG, default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, rxa_w))
+ MCFG_RS232_DCD_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, dcda_w))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, ctsa_w))
+
+ MCFG_RS232_PORT_ADD(RS232B_TAG, default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, rxb_w))
+ MCFG_RS232_DCD_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, dcdb_w))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE(SCC2_TAG, z80scc_device, ctsb_w))
MACHINE_CONFIG_END
/*
diff --git a/src/mame/includes/midzeus.h b/src/mame/includes/midzeus.h
index 7530b0b68f2..7a38879e142 100644
--- a/src/mame/includes/midzeus.h
+++ b/src/mame/includes/midzeus.h
@@ -29,7 +29,7 @@ public:
required_shared_ptr<UINT32> m_ram_base;
optional_shared_ptr<UINT32> m_linkram;
required_shared_ptr<UINT32> m_tms32031_control;
- required_shared_ptr<UINT32> m_zeusbase;
+ optional_shared_ptr<UINT32> m_zeusbase;
optional_device<timekeeper_device> m_m48t35;
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
diff --git a/src/mame/includes/midzeus2.h b/src/mame/includes/midzeus2.h
index ff876ae1b94..2a3801a117f 100644
--- a/src/mame/includes/midzeus2.h
+++ b/src/mame/includes/midzeus2.h
@@ -5,13 +5,16 @@
Driver for Midway Zeus games
**************************************************************************/
+#include "video/zeus2.h"
class midzeus2_state : public midzeus_state
{
public:
midzeus2_state(const machine_config &mconfig, device_type type, const char *tag)
- : midzeus_state(mconfig, type, tag) { }
+ : midzeus_state(mconfig, type, tag), m_zeus(*this, "zeus2") { }
+ required_device<zeus2_device> m_zeus;
+ DECLARE_WRITE_LINE_MEMBER(zeus_irq);
DECLARE_VIDEO_START(midzeus2);
UINT32 screen_update_midzeus2(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ32_MEMBER( zeus2_r );
diff --git a/src/mame/layout/dlair.lay b/src/mame/layout/dlair.lay
index 7b94c1f89cc..51c7096adbd 100644
--- a/src/mame/layout/dlair.lay
+++ b/src/mame/layout/dlair.lay
@@ -1,83 +1,51 @@
<?xml version="1.0"?>
<mamelayout version="2">
- <element name="digit" defstate="10">
- <led7seg>
- <color red="1.0" green="0.3" blue="0.0" />
- </led7seg>
- </element>
-
- <view name="Simple LEDs">
- <screen index="0">
- <bounds left="0" top="0" right="4" bottom="3" />
- </screen>
-
-
- <bezel name="digit0" element="digit">
- <bounds x="1.4" y="-1.5" width="0.2" height="0.3" />
- </bezel>
-
- <bezel name="digit1" element="digit">
- <bounds x="1.6" y="-1.5" width="0.2" height="0.3" />
- </bezel>
-
- <bezel name="digit2" element="digit">
- <bounds x="1.8" y="-1.5" width="0.2" height="0.3" />
- </bezel>
- <bezel name="digit3" element="digit">
- <bounds x="2.0" y="-1.5" width="0.2" height="0.3" />
- </bezel>
+<!-- define elements -->
- <bezel name="digit4" element="digit">
- <bounds x="2.2" y="-1.5" width="0.2" height="0.3" />
- </bezel>
-
- <bezel name="digit5" element="digit">
- <bounds x="2.4" y="-1.5" width="0.2" height="0.3" />
- </bezel>
-
-
- <bezel name="digit6" element="digit">
- <bounds x="1.9" y="-1.2" width="0.2" height="0.3" />
- </bezel>
-
-
- <bezel name="digit8" element="digit">
- <bounds x="1.4" y="-0.9" width="0.2" height="0.3" />
- </bezel>
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.1" blue="0.15" /></led7seg>
+ </element>
- <bezel name="digit9" element="digit">
- <bounds x="1.6" y="-0.9" width="0.2" height="0.3" />
- </bezel>
+ <element name="text_p1"><text string="PLAYER 1 SCORE"><color red="0.9" green="0.8" blue="0.05" /></text></element>
+ <element name="text_p2"><text string="PLAYER 2 SCORE"><color red="0.9" green="0.8" blue="0.05" /></text></element>
+ <element name="text_lives"><text string="LIVES" align="1"><color red="0.9" green="0.8" blue="0.05" /></text></element>
+ <element name="text_credits"><text string="CREDITS" align="1"><color red="0.9" green="0.8" blue="0.05" /></text></element>
- <bezel name="digit10" element="digit">
- <bounds x="1.8" y="-0.9" width="0.2" height="0.3" />
- </bezel>
- <bezel name="digit11" element="digit">
- <bounds x="2.0" y="-0.9" width="0.2" height="0.3" />
- </bezel>
+<!-- build screen -->
- <bezel name="digit12" element="digit">
- <bounds x="2.2" y="-0.9" width="0.2" height="0.3" />
- </bezel>
+ <view name="Internal Layout">
+ <bounds x="0" y="0" width="4950" height="3000" />
+ <screen index="0">
+ <bounds x="0" y="0" width="4000" height="3000" />
+ </screen>
- <bezel name="digit13" element="digit">
- <bounds x="2.4" y="-0.9" width="0.2" height="0.3" />
- </bezel>
+ <bezel element="text_p1"><bounds x="4086" y="280" width="788" height="85" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="4086" y="380" width="118" height="165" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="4220" y="380" width="118" height="165" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="4354" y="380" width="118" height="165" /></bezel>
+ <bezel name="digit3" element="digit"><bounds x="4488" y="380" width="118" height="165" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="4622" y="380" width="118" height="165" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="4756" y="380" width="118" height="165" /></bezel>
+ <bezel element="text_lives"><bounds x="4580" y="639" width="400" height="85" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="4419" y="599" width="118" height="165" /></bezel>
- <bezel name="digit7" element="digit">
- <bounds x="1.9" y="-0.6" width="0.2" height="0.3" />
- </bezel>
+ <bezel element="text_p2"><bounds x="4086" y="783" width="788" height="85" /></bezel>
+ <bezel name="digit8" element="digit"><bounds x="4086" y="883" width="118" height="165" /></bezel>
+ <bezel name="digit9" element="digit"><bounds x="4220" y="883" width="118" height="165" /></bezel>
+ <bezel name="digit10" element="digit"><bounds x="4354" y="883" width="118" height="165" /></bezel>
+ <bezel name="digit11" element="digit"><bounds x="4488" y="883" width="118" height="165" /></bezel>
+ <bezel name="digit12" element="digit"><bounds x="4622" y="883" width="118" height="165" /></bezel>
+ <bezel name="digit13" element="digit"><bounds x="4756" y="883" width="118" height="165" /></bezel>
+ <bezel element="text_lives"><bounds x="4580" y="1144" width="400" height="85" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="4419" y="1104" width="118" height="165" /></bezel>
- <bezel name="digit14" element="digit">
- <bounds x="1.7" y="-0.3" width="0.2" height="0.3" />
- </bezel>
+ <bezel element="text_credits"><bounds x="4580" y="1413" width="400" height="85" /></bezel>
+ <bezel name="digit14" element="digit"><bounds x="4285" y="1383" width="118" height="165" /></bezel>
+ <bezel name="digit15" element="digit"><bounds x="4419" y="1383" width="118" height="165" /></bezel>
- <bezel name="digit15" element="digit">
- <bounds x="1.9" y="-0.3" width="0.2" height="0.3" />
- </bezel>
</view>
</mamelayout>