From 40068a587964c4d200658051be189e593285bfef Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Fri, 27 Jan 2023 18:42:51 +0100 Subject: [PATCH] New systems marked not working ------------------------------ Fruit Genie (Version 1-1-03) [Brian Troha, The Dumping Union] --- src/mame/mame.lst | 1 + src/mame/misc/jungleyo.cpp | 193 ++++++++++++++++++++++++++++++++++++- 2 files changed, 191 insertions(+), 3 deletions(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index a0a91d0100b..6423e5ce827 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -29983,6 +29983,7 @@ joystand // 1997 Yuvo jubileep // @source:misc/jungleyo.cpp +frtgenie jungleyo @source:misc/kas89.cpp diff --git a/src/mame/misc/jungleyo.cpp b/src/mame/misc/jungleyo.cpp index 0f92f02911b..5569e444766 100644 --- a/src/mame/misc/jungleyo.cpp +++ b/src/mame/misc/jungleyo.cpp @@ -3,8 +3,10 @@ /****************************************************************************** Jungle (c) 2001 Yonshi + Fruit Genie (c) 2003 Global TODO: + Jungle: - with a clean NVRAM MAME needs to be soft reset after init or the game will trip a '1111 exception' (caused by invalid opcode executed at 0x102, incomplete decryption most likely); @@ -26,6 +28,17 @@ playback. - outputs (lamps & ticket dispenser at very least); + Fruit Genie: + - decryption seems good but gets stuck with 'data error' and 'illegal inst' + errors. Second one probably due to same problem as jungleyo. First one + possibly checksum failure due to patch in init_frtgenie()? + To bypass do: + bpset 5732. Once hit, do PC = 5810. + - second half of the main CPU ROM seems to contain an earlier version of the + data 'GENIE FRUITS DATA: 2001/08/15 VERSION: VA1.00'. Can it be reached or + just a leftover? + - it hits the layer_enable_w popmessage + =============================================================================== CPUs @@ -100,6 +113,7 @@ public: void jungleyo(machine_config &config); + void init_frtgenie(); void init_jungleyo(); protected: @@ -201,6 +215,9 @@ void jungleyo_state::video_start() m_layer_enable = 0; m_video_priority = 0; + + save_item(NAME(m_layer_enable)); + save_item(NAME(m_video_priority)); } uint32_t jungleyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) @@ -291,7 +308,7 @@ void jungleyo_state::video_priority_w(u8 data) void jungleyo_state::main_map(address_map &map) { - map(0x000000, 0x03ffff).rom().region("maincpu", 0); + map(0x000000, 0x07ffff).rom().region("maincpu", 0); map(0xa00310, 0xa00311).portr("IN0"); map(0xa0032a, 0xa0032b).portr("DSW12"); map(0xa0032c, 0xa0032d).portr("DSW34"); @@ -413,6 +430,120 @@ static INPUT_PORTS_START( jungleyo ) PORT_DIPUNKNOWN_DIPLOC( 0x8000, 0x8000, "DSW4:8" ) // no effect in system settings INPUT_PORTS_END +static INPUT_PORTS_START( frtgenie ) + PORT_START("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_GAMBLE_BET ) PORT_NAME("Play") + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("Ticket Sw.") + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no effect in input test + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) PORT_NAME("Take / Hold / Stop3") + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_NAME("Double Up / Stop1") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK ) // 'account' in input test + PORT_SERVICE( 0x100, IP_ACTIVE_LOW ) // if active high at boot the game shows the input test, if switched to input high after boot it shows system settings + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_SLOT_STOP_ALL ) PORT_NAME("Big / All Stop") // no effect in input test + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_NAME("Small / Stop2") + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no effect in input test + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // no effect in input test + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN ) + + PORT_START("DSW12") + PORT_DIPNAME( 0x0007, 0x0007, "Main Game Rate" ) PORT_DIPLOCATION("DSW1:1,2,3") + PORT_DIPSETTING( 0x0007, "90%" ) + PORT_DIPSETTING( 0x0003, "85%" ) + PORT_DIPSETTING( 0x0005, "80%" ) + PORT_DIPSETTING( 0x0001, "75%" ) + PORT_DIPSETTING( 0x0006, "70%" ) + PORT_DIPSETTING( 0x0002, "65%" ) + PORT_DIPSETTING( 0x0004, "60%" ) + PORT_DIPSETTING( 0x0000, "55%" ) + PORT_DIPUNKNOWN_DIPLOC( 0x0008, 0x0008, "DSW1:4" ) // no effect in system settings + PORT_DIPNAME( 0x0010, 0x0010, "Max. Play" ) PORT_DIPLOCATION("DSW1:5") + PORT_DIPSETTING( 0x0010, "40" ) + PORT_DIPSETTING( 0x0000, "80" ) + PORT_DIPUNKNOWN_DIPLOC( 0x0020, 0x0020, "DSW1:6" ) // no effect in system settings + PORT_DIPNAME( 0x0040, 0x0040, "Min. Play" ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPSETTING( 0x0000, "1" ) + PORT_DIPSETTING( 0x0040, "10" ) + PORT_DIPNAME( 0x0080, 0x0080, "Play Score" ) PORT_DIPLOCATION("DSW1:8") + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x0700, 0x0700, "Coin In" ) PORT_DIPLOCATION("DSW2:1,2,3") + PORT_DIPSETTING( 0x0700, "1" ) + PORT_DIPSETTING( 0x0300, "4" ) + PORT_DIPSETTING( 0x0500, "5" ) + PORT_DIPSETTING( 0x0100, "10" ) + PORT_DIPSETTING( 0x0600, "20" ) + PORT_DIPSETTING( 0x0200, "25" ) + PORT_DIPSETTING( 0x0400, "50" ) + PORT_DIPSETTING( 0x0000, "100" ) + PORT_DIPNAME( 0x3800, 0x3800, "Key In" ) PORT_DIPLOCATION("DSW2:4,5,6") + PORT_DIPSETTING( 0x3800, "1" ) + PORT_DIPSETTING( 0x1800, "4" ) + PORT_DIPSETTING( 0x2800, "5" ) + PORT_DIPSETTING( 0x0800, "15" ) + PORT_DIPSETTING( 0x3000, "25" ) + PORT_DIPSETTING( 0x1000, "75" ) + PORT_DIPSETTING( 0x2000, "100" ) + PORT_DIPSETTING( 0x0000, "500" ) + PORT_DIPNAME( 0xc000, 0xc000, "Pay Out" ) PORT_DIPLOCATION("DSW2:7,8") + PORT_DIPSETTING( 0x0000, "1" ) + PORT_DIPSETTING( 0xc000, "10" ) + PORT_DIPSETTING( 0x4000, "20" ) + PORT_DIPSETTING( 0x8000, "50" ) + + PORT_START("DSW34") + PORT_DIPNAME( 0x0003, 0x0003, "Game Limit" ) PORT_DIPLOCATION("DSW3:1,2") + PORT_DIPSETTING( 0x0003, "10000" ) + PORT_DIPSETTING( 0x0001, "50000" ) + PORT_DIPSETTING( 0x0002, "100000" ) + PORT_DIPSETTING( 0x0000, "200000" ) + PORT_DIPNAME( 0x0004, 0x0004, "Credit Limit" ) PORT_DIPLOCATION("DSW3:3") + PORT_DIPSETTING( 0x0004, "5000" ) + PORT_DIPSETTING( 0x0000, "10000" ) + PORT_DIPNAME( 0x0008, 0x0008, "Display Odds Table" ) PORT_DIPLOCATION("DSW3:4") + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x0010, 0x0010, "Reel Auto Stop" ) PORT_DIPLOCATION("DSW3:5") + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x0020, 0x0020, "Game Count" ) PORT_DIPLOCATION("DSW3:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x0000, "Count" ) + PORT_DIPNAME( 0x0040, 0x0040, "Reel Speed" ) PORT_DIPLOCATION("DSW3:7") // actually spelt 'Rell Speed' + PORT_DIPSETTING( 0x0040, "Slow" ) + PORT_DIPSETTING( 0x0000, "Fast" ) + PORT_DIPNAME( 0x0080, 0x0080, "Min. Play For Bonus" ) PORT_DIPLOCATION("DSW3:8") + PORT_DIPSETTING( 0x0080, "8" ) + PORT_DIPSETTING( 0x0000, "16" ) + PORT_DIPNAME( 0x0100, 0x0100, "Double Up Rate" ) PORT_DIPLOCATION("DSW4:1") + PORT_DIPSETTING( 0x0000, "75%" ) + PORT_DIPSETTING( 0x0100, "85%" ) + PORT_DIPNAME( 0x0200, 0x0200, "Play Score" ) PORT_DIPLOCATION("DSW4:2") + PORT_DIPSETTING( 0x0200, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPNAME( 0x0400, 0x0400, "Pay Out Mode" ) PORT_DIPLOCATION("DSW4:3") + PORT_DIPSETTING( 0x0400, "Manual" ) + PORT_DIPSETTING( 0x0000, "Auto" ) + PORT_DIPNAME( 0x0800, 0x0800, "Double Up Game" ) PORT_DIPLOCATION("DSW4:4") + PORT_DIPSETTING( 0x0800, DEF_STR( Yes ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) + PORT_DIPNAME( 0x1000, 0x1000, "Lose & Win Mode" ) PORT_DIPLOCATION("DSW4:5") + PORT_DIPSETTING( 0x1000, DEF_STR( No ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) ) + PORT_DIPNAME( 0xe000, 0xe000, "Key Out" ) PORT_DIPLOCATION("DSW4:6,7,8") + PORT_DIPSETTING( 0xe000, "1" ) + PORT_DIPSETTING( 0x6000, "5" ) + PORT_DIPSETTING( 0xa000, "15" ) + PORT_DIPSETTING( 0x2000, "20" ) + PORT_DIPSETTING( 0xc000, "50" ) + PORT_DIPSETTING( 0x4000, "75" ) + PORT_DIPSETTING( 0x8000, "100" ) + PORT_DIPSETTING( 0x0000, "500" ) +INPUT_PORTS_END + static const gfx_layout jungleyo16_layout = { @@ -462,7 +593,7 @@ void jungleyo_state::jungleyo(machine_config &config) ROM_START( jungleyo ) - ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code, encrypted + ROM_REGION( 0x80000, "maincpu", ROMREGION_ERASE00 ) // 68000 code, encrypted ROM_LOAD16_BYTE( "jungle_=record=_rom3_vi3.02.u15", 0x00000, 0x20000, CRC(7c9f431e) SHA1(fb3f90c4fe59c938f36b30c5fa3af227031e7d7a) ) ROM_LOAD16_BYTE( "jungle_=record=_rom2_vi3.02.u14", 0x00001, 0x20000, CRC(f6a71260) SHA1(8e48cbb9d701ad968540244396820359afe97c28) ) @@ -477,8 +608,33 @@ ROM_START( jungleyo ) ROM_REGION( 0x80000, "gfx3", 0 ) ROM_LOAD( "jungle_rom6.u60", 0x000000, 0x80000, CRC(caab8eb2) SHA1(472ca9f396d7c01a1bd03485581cfae677a3b365) ) + + ROM_REGION( 0x157, "plds", ROMREGION_ERASE00 ) + ROM_LOAD( "atf20v8b.u37", 0x000, 0x157, NO_DUMP ) ROM_END +ROM_START( frtgenie ) // MADE IN TAIWAN YONSHI PCB NO-006E + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 code, encrypted + ROM_LOAD16_BYTE( "fruit_genie_rom3_va1_1.03.u15", 0x00000, 0x40000, CRC(747099c3) SHA1(99f4aa6814ed2868d9758ad94b4497fd4c3142dc) ) + ROM_LOAD16_BYTE( "fruit_genie_rom2_va1_1.03.u14", 0x00001, 0x40000, CRC(627c9dfd) SHA1(c4e393c61911a3d646b53fc2742e8b7495509567) ) + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "fruit_genie_rom_1.u99", 0x00000, 0x40000, CRC(28b0c8fb) SHA1(5cdf59dcbed7da9b882c7dcf27020c1c37dd22cc) ) + + ROM_REGION( 0x80000, "reelgfx", 0 ) + ROM_LOAD( "fruit_genie_rom_4.u58", 0x000000, 0x80000, CRC(b3b467b6) SHA1(f1a64af7a8fe22c7ef76617aba359df11e4af737) ) + + ROM_REGION( 0x80000, "gfx2", 0 ) + ROM_LOAD( "fruit_genie_rom_5.u59", 0x000000, 0x80000, CRC(5c4497ed) SHA1(ed326867edb3a0e841a6d1ab9d6f238e9f7281b7) ) + + ROM_REGION( 0x80000, "gfx3", 0 ) + ROM_LOAD( "fruit_genie_rom_6.u60", 0x000000, 0x80000, CRC(2f66583e) SHA1(08a8a4266c7e118183784bfdca796da803d3a2dd) ) + + ROM_REGION( 0x157, "plds", ROMREGION_ERASE00 ) + ROM_LOAD( "atf20v8b.u37", 0x000, 0x157, NO_DUMP ) +ROM_END + + void jungleyo_state::init_jungleyo() { uint16_t *src = (uint16_t *)memregion("maincpu")->base(); @@ -503,8 +659,39 @@ void jungleyo_state::init_jungleyo() src[0x006 / 2] = 0x01f8; // reset opcode } +void jungleyo_state::init_frtgenie() +{ + uint16_t *src = (uint16_t *)memregion("maincpu")->base(); + + for (int i = 0x00000; i < 0x10000 / 2; i++) + src[i] = bitswap<16>(src[i] ^ 0x00ff, 11, 12, 14, 9, 10, 13, 8, 15, 5, 0, 2, 3, 6, 1, 4, 7); // ok + + for (int i = 0x10000 / 2; i < 0x20000 / 2; i++) + src[i] = bitswap<16>(src[i] ^ 0xff00, 14, 11, 8, 13, 15, 9, 12, 10, 1, 5, 3, 0, 7, 2, 6, 4); // ok + + for (int i = 0x20000 / 2; i < 0x30000 / 2; i++) + src[i] = bitswap<16>(src[i] ^ 0x00ff, 8, 14, 12, 11, 9, 15, 10, 13, 7, 4, 1, 5, 3, 6, 0, 2); // ok + + for (int i = 0x30000 / 2; i < 0x40000 / 2; i++) + src[i] = bitswap<16>(src[i] ^ 0xffff, 15, 9, 10, 12, 8, 11, 13, 14, 2, 6, 4, 5, 0, 7, 3, 1); // ok + + for (int i = 0x40000 / 2; i < 0x80000 / 2; i++) // the second half of the ROM seems to have the same bitswap + src[i] = bitswap<16>(src[i] ^ 0x0000, 10, 13, 15, 8, 12, 14, 11, 9, 0, 7, 6, 4, 1, 5, 2, 3); // ok + + // TODO: Stack Pointer/Initial PC settings don't seem to decrypt correctly + // hack these until better understood (still wrong values) + src[0x000 / 2] = 0x0000; + src[0x002 / 2] = 0x0000; + src[0x004 / 2] = 0x0000; + src[0x006 / 2] = 0x01f8; // reset opcode +} + + } // Anonymous namespace // version 3.02 built on 2001/02/09, there's copyright both for Yonshi and Global in strings -GAME( 2001, jungleyo, 0, jungleyo, jungleyo, jungleyo_state, init_jungleyo, ROT0, "Yonshi", "Jungle (Italy VI3.02)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND ) +GAME( 2001, jungleyo, 0, jungleyo, jungleyo, jungleyo_state, init_jungleyo, ROT0, "Yonshi", "Jungle (Italy VI3.02)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) + +// first half is version 1-1-03, with copyright both for Yonshi and Global in strings, second half is version VA1.0 2001/08/15 with copyright both for Yonshi and Global in strings +GAME( 2003, frtgenie, 0, jungleyo, frtgenie, jungleyo_state, init_frtgenie, ROT0, "Global", "Fruit Genie (Version 1-1-03)", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )