From 1bd171323a1f163d9419258114a720ba39cc87bf Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 29 Jun 2020 23:20:51 +0200 Subject: royalmah.cpp: decrypted mjsenka, gets in game but glitches heavily (nw) --- src/mame/drivers/royalmah.cpp | 89 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 11 deletions(-) diff --git a/src/mame/drivers/royalmah.cpp b/src/mame/drivers/royalmah.cpp index 19895d9e600..7fcb6e4df24 100644 --- a/src/mame/drivers/royalmah.cpp +++ b/src/mame/drivers/royalmah.cpp @@ -123,13 +123,15 @@ public: m_audiocpu(*this, "audiocpu"), m_rtc(*this, "rtc"), m_soundlatch(*this, "soundlatch"), - m_mainbank(*this, "mainbank") + m_mainbank(*this, "mainbank"), + m_decrypted_opcodes(*this, "decrypted_opcodes") { } void mjdiplob(machine_config &config); void tahjong(machine_config &config); void tontonb(machine_config &config); void mjderngr(machine_config &config); + void mjsenka(machine_config &config); void mjyarou(machine_config &config); void janoh(machine_config &config); void mjtensin(machine_config &config); @@ -161,6 +163,10 @@ public: void init_mjifb(); void init_tontonb(); void init_janptr96(); + void init_mjsenka(); + +protected: + virtual void machine_start() override; private: uint8_t player_1_port_r(); @@ -280,6 +286,8 @@ private: void mjderngr_iomap(address_map &map); void mjdiplob_iomap(address_map &map); void mjifb_map(address_map &map); + void mjyarou_map(address_map &map); + void mjsenka_opcodes_map(address_map &map); void mjtensin_map(address_map &map); void mjvegasa_map(address_map &map); void mjyarou_iomap(address_map &map); @@ -292,8 +300,6 @@ private: void tahjong_map(address_map &map); void tontonb_iomap(address_map &map); - virtual void machine_start() override; - required_device m_maincpu; required_device m_palette; required_device m_ay; @@ -302,6 +308,7 @@ private: optional_device m_rtc; optional_device m_soundlatch; optional_memory_bank m_mainbank; + optional_shared_ptr m_decrypted_opcodes; // used by most games uint8_t m_input_port_select; @@ -651,8 +658,18 @@ void royalmah_state::tahjong_map(address_map &map) map(0x8000, 0xffff).writeonly().share("videoram"); } +void royalmah_state::mjyarou_map(address_map &map) +{ + map(0x0000, 0x6fff).rom().nopw(); + map(0x7000, 0x77ff).ram().share("nvram"); + map(0x7800, 0x9fff).rom(); + map(0x8000, 0xffff).writeonly().share("videoram"); +} - +void royalmah_state::mjsenka_opcodes_map(address_map &map) +{ + map(0x0000, 0x9fff).rom().share(m_decrypted_opcodes); +} void royalmah_state::royalmah_iomap(address_map &map) { @@ -3636,9 +3653,16 @@ void royalmah_state::mjclub(machine_config &config) void royalmah_state::mjyarou(machine_config &config) { royalmah(config); + m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::mjyarou_map); m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjyarou_iomap); } +void royalmah_state::mjsenka(machine_config &config) +{ + mjyarou(config); + m_maincpu->set_addrmap(AS_OPCODES, &royalmah_state::mjsenka_opcodes_map); +} + void royalmah_state::ippatsu(machine_config &config) { dondenmj(config); @@ -4986,7 +5010,7 @@ Mahjong Senka Modified Royal Mahjong Hardware -CPU: Z80 <- wrong,they are 2 z80 CPUs -AS +CPU: Z80 Sound: AY-3-8910 OSC: 18.432MHz Others: Battery @@ -5013,11 +5037,8 @@ ROM_START( mjsenka ) ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD( "3", 0x0000, 0x4000, CRC(b2d8be1f) SHA1(da75e1072d271de2dbd897a551f6c32593f6421b) ) ROM_LOAD( "4", 0x4000, 0x2000, CRC(e9e84999) SHA1(7b5f0edd92cf3a45e85055460e6cb00b154fd152) ) - ROM_LOAD( "2", 0x6000, 0x2000, CRC(cdb02fc5) SHA1(5de6b15b79ea7c4246a294b17f166e53be6a4abc) ) - - /*encrypted z80*/ - ROM_REGION( 0x10000, "sub", 0 ) - ROM_LOAD( "1", 0x0000, 0x2000, CRC(83e943d1) SHA1(c4f9b5036627ccb369e7db03a743e496b149af85) ) + ROM_LOAD( "1", 0x6000, 0x2000, CRC(83e943d1) SHA1(c4f9b5036627ccb369e7db03a743e496b149af85) ) + ROM_LOAD( "2", 0x8000, 0x2000, CRC(cdb02fc5) SHA1(5de6b15b79ea7c4246a294b17f166e53be6a4abc) ) ROM_REGION( 0x0040, "proms", 0 ) ROM_LOAD( "4.8k", 0x0000, 0x0020, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) @@ -5339,7 +5360,53 @@ void royalmah_state::init_janptr96() membank("rambank")->configure_entries(0, 8, m_janptr96_nvram.get() + 0x1000, 0x1000); } +void royalmah_state::init_mjsenka() +{ + uint8_t *rom = memregion("maincpu")->base(); + + for (int i = 0x0000; i < 0xa000; i++) + m_decrypted_opcodes[i] = rom[i]; + + for (int i = 0x6000; i < 0x8000; i++) + { + switch (i & 0x15) + { + case 0x00: m_decrypted_opcodes[i] ^= 0x03; break; + case 0x01: m_decrypted_opcodes[i] ^= 0x07; break; + case 0x04: m_decrypted_opcodes[i] ^= 0x01; break; + case 0x05: m_decrypted_opcodes[i] ^= 0x05; break; + case 0x10: m_decrypted_opcodes[i] ^= 0x02; break; + case 0x11: m_decrypted_opcodes[i] ^= 0x06; break; + case 0x14: m_decrypted_opcodes[i] ^= 0x00; break; + case 0x15: m_decrypted_opcodes[i] ^= 0x04; break; + } + + if (i & 0x02) + m_decrypted_opcodes[i] ^= 0x80; + m_decrypted_opcodes[i] = bitswap<8>(m_decrypted_opcodes[i], 2, 6, 5, 4, 3, 0, 7, 1); + } + + for (int i = 0x6000; i < 0x8000; i++) + { + switch (i & 0x0e) + { + case 0x00: rom[i] ^= 0x01; break; + case 0x02: rom[i] ^= 0x03; break; + case 0x04: rom[i] ^= 0x05; break; + case 0x06: rom[i] ^= 0x07; break; + case 0x08: rom[i] ^= 0x00; break; + case 0x0a: rom[i] ^= 0x02; break; + case 0x0c: rom[i] ^= 0x04; break; + case 0x0e: rom[i] ^= 0x06; break; + } + + if ((i & 0x01) == 0x00) + rom[i] ^= 0x80; + + rom[i] = bitswap<8>(rom[i], 0, 6, 5, 4, 3, 1, 2, 7); + } +} // the original Janputer (Sanritsu) is not yet dumped, basically Royal Mahjong but non-BET type GAME( 1981, royalmj, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Nichibutsu", "Royal Mahjong (Japan, v1.13)", 0 ) @@ -5361,7 +5428,7 @@ GAME( 1986, ippatsu, 0, ippatsu, ippatsu, royalmah_state, init_ippats GAME( 1986, suzume, 0, suzume, suzume, royalmah_state, init_suzume, ROT0, "Dyna Electronics", "Watashiha Suzumechan (Japan)", 0 ) GAME( 1986, jongshin, 0, jongshin, jongshin, royalmah_state, init_jongshin, ROT0, "Dyna Electronics", "Jong Shin (Japan)", 0 ) GAME( 1986, mjsiyoub, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Visco", "Mahjong Shiyou (Japan)", MACHINE_NOT_WORKING ) -GAME( 1986, mjsenka, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Visco", "Mahjong Senka (Japan)", MACHINE_NOT_WORKING ) +GAME( 1986, mjsenka, 0, mjsenka, mjyarou, royalmah_state, init_mjsenka, ROT0, "Visco", "Mahjong Senka (Japan)", MACHINE_NOT_WORKING ) // heavy GFX glitches, wrong palette decode, code flow doesn't seem totally correct GAME( 1986, mjyarou, 0, mjyarou, mjyarou, royalmah_state, empty_init, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 1)", MACHINE_IMPERFECT_GRAPHICS ) // girls aren't shown GAME( 1986, mjyarou2, mjyarou, mjyarou, mjyarou, royalmah_state, empty_init, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 2)", MACHINE_IMPERFECT_GRAPHICS ) // girls aren't shown GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_state, init_tontonb, ROT0, "Xex", "Mahjong Club [BET] (Japan)", 0 ) -- cgit v1.2.3