From 4e2095b5c08bb3b4248e9b91f9713bbce8efca78 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 14 Jul 2021 18:10:16 +0200 Subject: [PATCH] royalmah.cpp: preliminary banking for chalgirl, mjsenka, mjyarou, mjyarou2. Girls now appear. These games don't appear to set the palette bank, so they all have bad colors. --- src/mame/drivers/royalmah.cpp | 131 +++++++++++++++++++++++++--------- 1 file changed, 98 insertions(+), 33 deletions(-) diff --git a/src/mame/drivers/royalmah.cpp b/src/mame/drivers/royalmah.cpp index bbf8a1cb541..364c7ba866f 100644 --- a/src/mame/drivers/royalmah.cpp +++ b/src/mame/drivers/royalmah.cpp @@ -125,6 +125,7 @@ public: m_rtc(*this, "rtc"), m_soundlatch(*this, "soundlatch"), m_mainbank(*this, "mainbank"), + m_mainopbank(*this, "mainopbank"), m_decrypted_opcodes(*this, "decrypted_opcodes") { } @@ -155,6 +156,7 @@ public: void mjclub(machine_config &config); void makaijan(machine_config &config); void janyoup2(machine_config &config); + void chalgirl(machine_config &config); void init_tahjong(); void init_dynax(); @@ -167,6 +169,7 @@ public: void init_janptr96(); void init_mjsenka(); void init_mjsiyoub(); + void init_chalgirl(); protected: virtual void machine_start() override; @@ -194,6 +197,10 @@ private: void mjapinky_palbank_w(uint8_t data); uint8_t mjapinky_dsw_r(); + void chalgirl_bank_w(uint8_t data); + + void mjyarou_bank_w(offs_t offset, uint8_t data); + void tontonb_bank_w(uint8_t data); void dynax_bank_w(uint8_t data); @@ -266,6 +273,8 @@ private: void cafetime_map(address_map &map); + void chalgirl_map(address_map &map); + void chalgirl_iomap(address_map &map); void daisyari_iomap(address_map &map); void dondenmj_iomap(address_map &map); void ippatsu_iomap(address_map &map); @@ -288,7 +297,6 @@ 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); @@ -310,6 +318,7 @@ private: optional_device m_rtc; optional_device m_soundlatch; optional_memory_bank m_mainbank; + optional_memory_bank m_mainopbank; optional_shared_ptr m_decrypted_opcodes; // used by most games @@ -323,6 +332,7 @@ private: std::unique_ptr m_janptr96_nvram; uint8_t m_suzume_bank; + uint8_t m_mjyarou_bank; uint8_t m_gfx_adr_l; uint8_t m_gfx_adr_m; @@ -401,7 +411,6 @@ void royalmah_state::mjderngr_palette(palette_device &palette) const } } - void royalmah_state::royalmah_palbank_w(uint8_t data) { /* bit 1 = coin counter */ @@ -525,6 +534,33 @@ void royalmah_state::tahjong_bank_w(uint8_t data) m_mainbank->set_entry(data & 0x01); } +void royalmah_state::chalgirl_bank_w(uint8_t data) // TODO: verify behaviour by finishing the game +{ + logerror("chalgirl_bank_w: %02x\n", data); + + // bit 7: only set at start up, then always 0? + // bit 6: always set? + // bit 5, 4: always 0? + // bit 3: alway set? + // bit 2, 1, 0: ROM bank? + + m_mainbank->set_entry(data & 0x07); +} + +void royalmah_state::mjyarou_bank_w(offs_t offset, uint8_t data) // TODO: taken from jongkyo.cpp, verify +{ + uint8_t mask = 1 << (offset >> 1); + + m_mjyarou_bank &= ~mask; + + if (offset & 1) + m_mjyarou_bank |= mask; + + m_mainbank->set_entry(m_mjyarou_bank); + + if (m_mainopbank) + m_mainopbank->set_entry(m_mjyarou_bank); +} void royalmah_state::suzume_bank_w(uint8_t data) { @@ -662,17 +698,20 @@ void royalmah_state::tahjong_map(address_map &map) map(0x8000, 0xffff).writeonly().share("videoram"); } -void royalmah_state::mjyarou_map(address_map &map) +void royalmah_state::chalgirl_map(address_map &map) // TODO: guesswork, needs verifying { - map(0x0000, 0x6fff).rom().nopw(); - map(0x7000, 0x77ff).ram().share("nvram"); - map(0x7800, 0x9fff).rom(); + map(0x0000, 0x6bff).rom().nopw(); + map(0x6c00, 0x6fff).bankr(m_mainbank); + map(0x7000, 0x7fff).ram().share("nvram"); + map(0x8000, 0xffff).rom(); map(0x8000, 0xffff).writeonly().share("videoram"); } void royalmah_state::mjsenka_opcodes_map(address_map &map) { - map(0x0000, 0x9fff).rom().share(m_decrypted_opcodes); + map(0x0000, 0x6bff).rom().share(m_decrypted_opcodes); + map(0x6c00, 0x6fff).bankr(m_mainopbank); + map(0x8000, 0xffff).rom().region("maincpu", 0x8000); } void royalmah_state::royalmah_iomap(address_map &map) @@ -702,6 +741,14 @@ void royalmah_state::janyoup2_iomap(address_map &map) map(0x21, 0x21).w("crtc", FUNC(mc6845_device::register_w)); } +void royalmah_state::chalgirl_iomap(address_map &map) +{ + royalmah_iomap(map); + + map(0x10, 0x10).w(FUNC(royalmah_state::mjderngr_coin_w)); + map(0x40, 0x40).w(FUNC(royalmah_state::chalgirl_bank_w)); +} + void royalmah_state::seljan_map(address_map &map) { map(0x0000, 0x8fff).rom().nopw(); @@ -761,9 +808,10 @@ void royalmah_state::mjyarou_iomap(address_map &map) map.global_mask(0xff); map(0x01, 0x01).r(m_ay, FUNC(ay8910_device::data_r)); map(0x02, 0x03).w(m_ay, FUNC(ay8910_device::data_address_w)); - map(0x10, 0x10).portr("DSW1").w(FUNC(royalmah_state::royalmah_palbank_w)); + map(0x10, 0x10).portr("DSW1").w(FUNC(royalmah_state::mjderngr_coin_w)); map(0x11, 0x11).portr("SYSTEM").w(FUNC(royalmah_state::input_port_select_w)); map(0x12, 0x12).portr("DSW2"); + map(0x50, 0x55).w(FUNC(royalmah_state::mjyarou_bank_w)); } void royalmah_state::dondenmj_iomap(address_map &map) @@ -3654,10 +3702,16 @@ void royalmah_state::mjclub(machine_config &config) m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjclub_iomap); } -void royalmah_state::mjyarou(machine_config &config) +void royalmah_state::chalgirl(machine_config &config) { royalmah(config); - m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::mjyarou_map); + m_maincpu->set_addrmap(AS_PROGRAM, &royalmah_state::chalgirl_map); + m_maincpu->set_addrmap(AS_IO, &royalmah_state::chalgirl_iomap); +} + +void royalmah_state::mjyarou(machine_config &config) +{ + chalgirl(config); m_maincpu->set_addrmap(AS_IO, &royalmah_state::mjyarou_iomap); } @@ -5044,13 +5098,13 @@ ROM_START( mjsenka ) ROM_LOAD( "1", 0x6000, 0x2000, CRC(83e943d1) SHA1(c4f9b5036627ccb369e7db03a743e496b149af85) ) ROM_LOAD( "2", 0x8000, 0x2000, CRC(cdb02fc5) SHA1(5de6b15b79ea7c4246a294b17f166e53be6a4abc) ) - ROM_REGION( 0x0040, "proms", 0 ) + ROM_REGION( 0x0020, "proms", 0 ) ROM_LOAD( "4.8k", 0x0000, 0x0020, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) - ROM_LOAD( "2.2k", 0x0020, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) - ROM_REGION( 0x0200, "user1", 0 ) //? + ROM_REGION( 0x0220, "user1", 0 ) //? ROM_LOAD( "1.2l", 0x0000, 0x0100, CRC(24599429) SHA1(6c93bb2e7bc9902cace0c9d482fc1584c4c1a114) ) ROM_LOAD( "3.1d", 0x0100, 0x0100, CRC(86aeafd1) SHA1(c4e5c56ce5baf2be3962675ae333e28bd8108a00) ) + ROM_LOAD( "2.2k", 0x0020, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) ROM_END /* @@ -5144,14 +5198,13 @@ ROM_START( mjyarou ) ROM_LOAD( "7.ic2", 0x6000, 0x2000, CRC(de6bfdd8) SHA1(dd9727d4d7de4add48cde229b8aa194f0492af7e) ) // on sub board ROM_LOAD( "8.ic3", 0x8000, 0x2000, CRC(1adef246) SHA1(b5f5598daf71694effffbfb486b03fcda5a593ee) ) // " - ROM_REGION( 0x0040, "proms", 0 ) - ROM_LOAD( "82s123n.ic7", 0x0000, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) // on sub board - ROM_LOAD( "4.6k", 0x0020, 0x0010, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) // on main board - ROM_CONTINUE(0x0000, 0x0010) + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "4.6k", 0x0000, 0x0020, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) // on main board - ROM_REGION( 0x0200, "user1", 0 ) //? + ROM_REGION( 0x0220, "user1", 0 ) //? ROM_LOAD( "82s129n.ic15", 0x0000, 0x0100, CRC(86aeafd1) SHA1(c4e5c56ce5baf2be3962675ae333e28bd8108a00) ) // on sub board ROM_LOAD( "82s129n.ic4", 0x0100, 0x0100, CRC(f09d3c4c) SHA1(a9e752d75e7f3ebd05add4ccf2f9f15d8f9a8d15) ) // " + ROM_LOAD( "82s123n.ic7", 0x0200, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) // on sub board ROM_END ROM_START( mjyarou2 ) @@ -5165,14 +5218,13 @@ ROM_START( mjyarou2 ) ROM_LOAD( "7", 0x6000, 0x2000, CRC(de6bfdd8) SHA1(dd9727d4d7de4add48cde229b8aa194f0492af7e) ) ROM_LOAD( "8", 0x8000, 0x2000, CRC(1adef246) SHA1(b5f5598daf71694effffbfb486b03fcda5a593ee) ) - ROM_REGION( 0x0040, "proms", 0 ) - ROM_LOAD( "82s123n.ic7", 0x0000, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) // not dumped for this board - ROM_LOAD( "82s123", 0x0020, 0x0010, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) - ROM_CONTINUE(0x0000, 0x0010) + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "82s123", 0x0000, 0x0020, CRC(41bd4d69) SHA1(4d2da761b338b62b2ea151c201063a24d6e4cc97) ) - ROM_REGION( 0x0200, "user1", 0 ) //? + ROM_REGION( 0x0220, "user1", 0 ) //? ROM_LOAD( "82s129n.ic15", 0x0000, 0x0100, CRC(86aeafd1) SHA1(c4e5c56ce5baf2be3962675ae333e28bd8108a00) ) // not dumped for this board ROM_LOAD( "82s129n.ic4", 0x0100, 0x0100, CRC(f09d3c4c) SHA1(a9e752d75e7f3ebd05add4ccf2f9f15d8f9a8d15) ) // not dumped for this board + ROM_LOAD( "82s123n.ic7", 0x0200, 0x0020, CRC(46014727) SHA1(eec451f292ee319fa6bfbbf223aaa12b231692c1) ) // not dumped for this board ROM_END /* @@ -5289,7 +5341,8 @@ ROM_START( rkjanoh2 ) ROM_LOAD( "82s123", 0x000, 0x020, CRC(74a53e94) SHA1(ca9114bd9b2b07f5abe82616b41ae9fdb9537a4f) ) ROM_END -ROM_START( chalgirl ) +// video reference: https://www.youtube.com/watch?v=66KDyKQA1q0 (video of the original, this is a bootleg) +ROM_START( chalgirl ) // TODO: verify ROM load / banking, this is correct for starting the game but it needs finishing the game to check it. ROM_REGION( 0x10000, "maincpu", 0 ) // the first 6 ROMs are on the FRM-03 board, the following on the SK-1B sub board ROM_LOAD( "cg_11.o1", 0x0000, 0x1000, CRC(1c064d3e) SHA1(cfe7e536efb377f009d7c9bee5b5a814ad1404ad) ) // 2732 ROM_LOAD( "cg_22.o2", 0x1000, 0x1000, CRC(3244fe61) SHA1(3163f14b8977fe4b05aa11d332347c5f3cc2fbfa) ) // 2732 @@ -5298,12 +5351,12 @@ ROM_START( chalgirl ) ROM_LOAD( "cg_5.o4", 0x4000, 0x1000, CRC(c0849a41) SHA1(1d901d59248cf0d8beff03207c46e3c50d0011cf) ) // 2732 ROM_LOAD( "cg_6.o4", 0x5000, 0x1000, CRC(92687327) SHA1(4fafba5881dca2a147616d94dd055eba6aa3c653) ) // 2732 ROM_LOAD( "7.f1", 0x6000, 0x1000, CRC(465db6e1) SHA1(e08fe431ab8676372fc13c51a2684a0320e01031) ) // 2732 - ROM_LOAD( "8.e1", 0x7000, 0x2000, CRC(42fafb6f) SHA1(32d06ee4fe28033ae04058d806917bf5b5690246) ) // 2764 - ROM_LOAD( "9.c1", 0x9000, 0x2000, CRC(8291e28a) SHA1(9a05cae191babdf3f78a7131985d8c6583f7c973) ) // 2764 - ROM_LOAD( "10.b1", 0xb000, 0x2000, CRC(04e76413) SHA1(e85db89084a8ae448fde4e202e8516b2e14a8265) ) // 2764 + ROM_LOAD( "10.b1", 0x8000, 0x2000, CRC(04e76413) SHA1(e85db89084a8ae448fde4e202e8516b2e14a8265) ) // 2764 + ROM_LOAD( "8.e1", 0xa000, 0x2000, CRC(42fafb6f) SHA1(32d06ee4fe28033ae04058d806917bf5b5690246) ) // 2764 + ROM_LOAD( "9.c1", 0xc000, 0x2000, CRC(8291e28a) SHA1(9a05cae191babdf3f78a7131985d8c6583f7c973) ) // 2764 ROM_REGION( 0x0020, "proms", 0 ) - ROM_LOAD( "f-rom.bpr", 0x0000, 0x0020, BAD_DUMP CRC(d3007282) SHA1(e4d863ab193e49208ed0f59dcddb1da0492314f6) ) // not dumped for this set, using the one from royalmah for now + ROM_LOAD( "f-rom.bpr", 0x0000, 0x0020, BAD_DUMP CRC(d3007282) SHA1(e4d863ab193e49208ed0f59dcddb1da0492314f6) ) // not dumped for this set, using the one from royalmah for now, girl colors don't seem correct ROM_END void royalmah_state::init_tahjong() @@ -5410,6 +5463,10 @@ void royalmah_state::init_mjsenka() rom[i] = bitswap<8>(rom[i], 0, 6, 5, 4, 3, 1, 2, 7); } + + m_mainopbank->configure_entries(0, 8, m_decrypted_opcodes + 0x8000, 0x400); + + init_chalgirl(); } void royalmah_state::init_mjsiyoub() @@ -5417,6 +5474,14 @@ void royalmah_state::init_mjsiyoub() m_mainbank->set_base(memregion("maincpu")->base() + 0x8000); } +void royalmah_state::init_chalgirl() +{ + m_mainbank->configure_entries(0, 8, memregion("maincpu")->base() + 0x8000, 0x400); + + save_item(NAME(m_mjyarou_bank)); + m_mjyarou_bank = 0; +} + } // Anonymous namespace @@ -5424,7 +5489,7 @@ void royalmah_state::init_mjsiyoub() GAME( 1981, royalmj, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Nichibutsu", "Royal Mahjong (Japan, v1.13)", 0 ) GAME( 1981?, openmj, royalmj, royalmah, royalmah, royalmah_state, empty_init, ROT0, "Sapporo Mechanic", "Open Mahjong [BET] (Japan)", 0 ) GAME( 1982, royalmah, royalmj, royalmah, royalmah, royalmah_state, empty_init, ROT0, "bootleg", "Royal Mahjong (Falcon bootleg, v1.01)", 0 ) -GAME( 1984?, chalgirl, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "bootleg", "Challenge Girl (Falcon bootleg)", MACHINE_NOT_WORKING ) // correct rom loading / banking, girls aren't shown +GAME( 1984?, chalgirl, 0, chalgirl, royalmah, royalmah_state, init_chalgirl, ROT0, "bootleg", "Challenge Girl (Falcon bootleg)", MACHINE_WRONG_COLORS | MACHINE_NOT_WORKING ) // verify ROM loading / banking, bad girl colors GAME( 1983, seljan, 0, seljan, seljan, royalmah_state, empty_init, ROT0, "Jem / Dyna Corp", "Sel-Jan [BET] (Japan)", 0 ) GAME( 1983, janyoup2, royalmj, janyoup2, janyoup2, royalmah_state, empty_init, ROT0, "Cosmo Denshi", "Janyou Part II (ver 7.03, July 1 1983)",0 ) GAME( 1985, tahjong, royalmj, tahjong, tahjong, royalmah_state, init_tahjong, ROT0, "Bally Pond / Nasco", "Tahjong Yakitori (ver. 2-1)", 0 ) // 1985 Jun. 17 @@ -5432,7 +5497,7 @@ GAME( 1981, janputer, 0, royalmah, royalmah, royalmah_state, empty_init, GAME( 1984, rkjanoh2, 0, royalmah, royalmah, royalmah_state, empty_init, ROT0, "SNK / Dyna Corp", "Royal King Jang Oh 2 (v4.00 1984 Jun 10th)", MACHINE_NOT_WORKING ) GAME( 1984, janoh, 0, janoh, royalmah, royalmah_state, empty_init, ROT0, "Toaplan", "Jan Oh (set 1)", MACHINE_NOT_WORKING ) GAME( 1984, janoha, janoh, janoha, royalmah, royalmah_state, empty_init, ROT0, "Toaplan", "Jan Oh (set 2)", MACHINE_NOT_WORKING ) // this one is complete? -GAME( 1985, jansou, 0, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jansou (set 1)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND ) +GAME( 1985, jansou, 0, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jansou (set 1)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) GAME( 1985, jansoua, jansou, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jansou (V 1.1)", 0 ) GAME( 1986, jangtaku, 0, jansou, jansou, royalmah_state, init_jansou, ROT0, "Dyna Computer", "Jang Taku (V 1.3)", 0 ) GAME( 1986, dondenmj, 0, dondenmj, majs101b, royalmah_state, init_dynax, ROT0, "Dyna Electronics", "Don Den Mahjong [BET] (Japan)", 0 ) @@ -5440,9 +5505,9 @@ 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, init_mjsiyoub, ROT0, "Visco", "Mahjong Shiyou (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, mjsenka, 0, mjsenka, mjyarou, royalmah_state, init_mjsenka, ROT0, "Visco", "Mahjong Senka (Japan)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // never seems to set the palette bank? +GAME( 1986, mjyarou, 0, mjyarou, mjyarou, royalmah_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 1)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? +GAME( 1986, mjyarou2, mjyarou, mjyarou, mjyarou, royalmah_state, init_chalgirl, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 2)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS ) // never seems to set the palette bank? GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_state, init_tontonb, ROT0, "Xex", "Mahjong Club [BET] (Japan)", 0 ) GAME( 1987, mjdiplob, 0, mjdiplob, mjdiplob, royalmah_state, init_tontonb, ROT0, "Dynax", "Mahjong Diplomat [BET] (Japan)", 0 ) GAME( 1987, tontonb, 0, tontonb, tontonb, royalmah_state, init_tontonb, ROT0, "Dynax", "Tonton [BET] (Japan, set 1)", 0 )