diff options
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><unlicensed></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><unlicensed></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&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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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&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><unlicensed></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&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&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><unlicensed></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><unlicensed></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&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&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><unlicensed></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 "Nth" 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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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><unlicensed></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&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&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 & PC-98 (JPN).iso" size="508647424" crc="f82c51a9" sha1="3607d2cc8fea57ca915954e9ff2e2cbc82a02fff"/> + + CUE file used for conversion: + <rom name="Microsoft Windows 98 x86 & 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 & 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 = ®data[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> |