From f357a3a19faa6f779a965c56b8c70d14c467b567 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Wed, 30 Oct 2024 18:10:24 +0100 Subject: New working clones ------------------ Captain X [Dirk Best, Brian Troha, Sean Riddle] New clones marked not working ----------------------------- Batman Forever (Dutch, 3.02) [inkochnito, PinMAME] --- src/mame/irem/vigilant.cpp | 159 +++++++++++++++++++++++++++++++++++++++++---- src/mame/irem/vigilant.h | 53 +++++++++++++-- src/mame/mame.lst | 2 + src/mame/pinball/de_3.cpp | 16 ++++- 4 files changed, 209 insertions(+), 21 deletions(-) diff --git a/src/mame/irem/vigilant.cpp b/src/mame/irem/vigilant.cpp index 8d73df04697..81acce3f2e3 100644 --- a/src/mame/irem/vigilant.cpp +++ b/src/mame/irem/vigilant.cpp @@ -49,6 +49,24 @@ void vigilant_state::machine_start() membank("bank1")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x4000); } +void captainx_state::machine_start() +{ + vigilant_state::machine_start(); + + save_item(NAME(m_decryption_ram)); + save_item(NAME(m_mcu_porta)); + save_item(NAME(m_mcu_portb)); + save_item(NAME(m_mcu_portc)); +} + +void captainx_state::machine_reset() +{ + vigilant_state::machine_reset(); + + // the main cpu will be started later by the mcu + m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); +} + void vigilant_state::bank_select_w(uint8_t data) { membank("bank1")->set_entry(data & 0x07); @@ -87,6 +105,47 @@ void vigilant_state::kikcubic_coin_w(uint8_t data) } +//************************************************************************** +// CAPTAINX MCU EMULATION +//************************************************************************** + +void captainx_state::mcu_porta_w(u8 data) +{ + m_mcu_porta = data; +} + +void captainx_state::mcu_portb_w(u8 data) +{ + // 7------- unused + // -654---- address high bits + // ----32-- unused + // ------1- on transition write to ram + // -------0 main cpu control + + // write to decryption ram + if (BIT(m_mcu_portb, 1) == 1 && BIT(data, 1) == 0) + m_decryption_ram[(data & 0x70) << 4 | m_mcu_porta] = m_mcu_portc; + + // the main cpu will start running once the table upload is finished + m_maincpu->set_input_line(INPUT_LINE_HALT, BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); + + m_mcu_portb = data; +} + +void captainx_state::mcu_portc_w(u8 data) +{ + m_mcu_portc = data; +} + + +uint8_t captainx_state::rom_r(offs_t offset) +{ + // the range 0x0000 to 0x7fff is read indirectly using the decryption ram + // for captainx only the first 0x200 bytes (of 0x800 total) are used, so this works + offs_t address = (BIT(offset, 0) ? 0x100 : 0) | m_maincpu_region[offset]; + return m_decryption_ram[address] ^ 0xff; +} + void vigilant_state::vigilant_map(address_map &map) { @@ -98,6 +157,12 @@ void vigilant_state::vigilant_map(address_map &map) map(0xe000, 0xefff).ram(); } +void captainx_state::captainx_map(address_map &map) +{ + vigilant_map(map); + map(0x0000, 0x7fff).r(FUNC(captainx_state::rom_r)); +} + void vigilant_state::vigilant_io_map(address_map &map) { map.global_mask(0xff); @@ -724,6 +789,20 @@ void vigilant_state::buccanrs(machine_config &config) dac.add_route(ALL_OUTPUTS, "rspeaker", 0.35); } +void captainx_state::captainx(machine_config &config) +{ + buccanrs(config); + + Z80(config.replace(), m_maincpu, 5_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &captainx_state::captainx_map); + m_maincpu->set_addrmap(AS_IO, &captainx_state::vigilant_io_map); + + M68705R3(config, m_mcu, 5_MHz_XTAL / 2); // unknown clock + m_mcu->porta_w().set(FUNC(captainx_state::mcu_porta_w)); + m_mcu->portb_w().set(FUNC(captainx_state::mcu_portb_w)); + m_mcu->portc_w().set(FUNC(captainx_state::mcu_portc_w)); +} + void vigilant_state::kikcubic(machine_config &config) { /* basic machine hardware */ @@ -1354,6 +1433,58 @@ ROM_START( buccanrsb ) ROM_END +/* +PCB silkscreened DABONG-3 + +2 x Z80B +1 Motorola MC68705R3P + 11.bin on daughterboard riser +2 x Yamaha YM2203C +2 x Yamaha Y3014B DAC +2 x 8 position DipSwitch +18.432MHz OSC +5.0000MHz OSC + +It appears the MC68705R3P only does the decryption. +*/ + +ROM_START( captainx ) + ROM_REGION( 0x30000, "maincpu", 0 ) /* 64k for code + 128k for bankswitching */ + ROM_LOAD( "11.bin", 0x00000, 0x10000, CRC(1a80f2ba) SHA1(028f80731d2922ffd005e5ba1e957bc9de22cec7) ) // 1ST AND 2ND HALF IDENTICAL + ROM_LOAD( "12.bin", 0x10000, 0x10000, CRC(87303ba8) SHA1(49a25393e853b9adf7df00a6f9c38a526a02ea4e) ) + + ROM_REGION( 0x10000, "soundcpu", 0 ) /* 64k for sound */ + ROM_LOAD( "1.bin", 0x00000, 0x10000, CRC(eb65f8c3) SHA1(82566becb630ce92303905dc0c5bef9e80e9caad) ) + + ROM_REGION( 0x1000, "mcu", 0 ) + ROM_LOAD( "68705r3", 0x00000, 0x1000, CRC(33b737f9) SHA1(a7e8ce1d82c642d70300320947c94acc6035afc8) ) + + ROM_REGION( 0x20000, "gfx1", 0 ) + ROM_LOAD( "7.bin", 0x00000, 0x10000, CRC(95e3c517) SHA1(9954830ebc3a6414a3236f4e41981db082e5ea19) ) + ROM_LOAD( "8.bin", 0x10000, 0x10000, CRC(fe2377ab) SHA1(8578c5466d98f140fdfc41e91cd841e725786e32) ) + + ROM_REGION( 0x80000, "gfx2", 0 ) + ROM_LOAD( "3.bin", 0x00000, 0x10000, CRC(ebe12ed8) SHA1(f66c1839972d039e2bc7f09c5632506afbb5514f) ) + ROM_CONTINUE( 0x20000, 0x10000 ) + ROM_LOAD( "4.bin", 0x10000, 0x10000, CRC(4fe3bf97) SHA1(7910ace1eed80bfafa1f9f057ed67e23aa446a22) ) + ROM_LOAD( "6.bin", 0x40000, 0x10000, CRC(078aef7f) SHA1(72e60d39d8af8bd31e9ae019b12620797eb0af7f) ) + ROM_CONTINUE( 0x60000, 0x10000 ) + ROM_LOAD( "5.bin", 0x50000, 0x10000, CRC(f650fa90) SHA1(c87081b4d6b09f865d08c5120da3d0fb3196a2c3) ) + + ROM_REGION( 0x40000, "gfx3", 0 ) + ROM_LOAD( "9.bin", 0x20000, 0x20000, CRC(0c6188fb) SHA1(d49034384c6d0e94db2890223b32a2a49e79a639) ) + ROM_LOAD( "10.bin", 0x00000, 0x20000, CRC(2d383ff8) SHA1(3062baac27feba69c6ed94935c5ced72d89ed4fb) ) + + ROM_REGION( 0x10000, "m72", 0 ) /* samples */ + ROM_LOAD( "2.bin", 0x00000, 0x10000, CRC(36ee1dac) SHA1(6dfd2a885c0b1c9347abc4b204ade66551c4b404) ) + + ROM_REGION( 0x400, "proms", 0 ) /* NOT dumped from this PCB, assumed to be the same */ + ROM_LOAD( "prom1.u54", 0x0000, 0x0100, CRC(c324835e) SHA1(cf6ffe38523badfda211d341410e93e647de87a9) ) + ROM_LOAD( "prom4.u79", 0x0100, 0x0100, CRC(e6506ef4) SHA1(079841da7640b14d94aaaeb572bf018932b58293) ) + ROM_LOAD( "prom3.u88", 0x0200, 0x0100, CRC(b43d094f) SHA1(2bed4892d8a91d7faac5a07bf858d9294eb30606) ) + ROM_LOAD( "prom2.u99", 0x0300, 0x0100, CRC(e0aa8869) SHA1(ac8bdfeba69420ba56ec561bf3d0f1229d02cea2) ) +ROM_END + + ROM_START( bowmen ) ROM_REGION( 0x30000, "maincpu", 0 ) // 64k for code (+ 128k for bankswitching?) ROM_LOAD( "4_27256.bin", 0x00000, 0x08000, CRC(e8dcabb6) SHA1(d6baf9af0ebdced8b73a36486ffd9b48b0d446ca) ) @@ -1410,20 +1541,22 @@ void vigilant_state::init_bowmen() } -GAME( 1988, vigilant, 0, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev E)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilantg, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US, Rev G)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilanto, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilanta, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev A)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilantb, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US, Rev B)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilantc, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev C)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilantd, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (Japan, Rev D)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, vigilantbl, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "bootleg", "Vigilante (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1988, kikcubic, 0, kikcubic, kikcubic, vigilant_state, empty_init, ROT0, "Irem", "Meikyu Jima (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) /* English title is Kickle Cubicle */ -GAME( 1988, kikcubicb, kikcubic, kikcubic, kikcubic, vigilant_state, empty_init, ROT0, "bootleg", "Kickle Cubele", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilant, 0, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev E)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilantg, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US, Rev G)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilanto, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilanta, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev A)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilantb, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem (Data East license)", "Vigilante (US, Rev B)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilantc, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (World, Rev C)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilantd, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "Irem", "Vigilante (Japan, Rev D)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1988, vigilantbl, vigilant, vigilant, vigilant, vigilant_state, empty_init, ROT0, "bootleg", "Vigilante (bootleg)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) + +GAME( 1988, kikcubic, 0, kikcubic, kikcubic, vigilant_state, empty_init, ROT0, "Irem", "Meikyu Jima (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) /* English title is Kickle Cubicle */ +GAME( 1988, kikcubicb, kikcubic, kikcubic, kikcubic, vigilant_state, empty_init, ROT0, "bootleg", "Kickle Cubele", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1989, buccanrs, 0, buccanrs, buccanrs, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1989, buccanrsa, buccanrs, buccanrs, buccanra, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1989, buccanrsb, buccanrs, buccanrs, buccanrs, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 3, harder)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1989, buccanrs, 0, buccanrs, buccanrs, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1989, buccanrsa, buccanrs, buccanrs, buccanra, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1989, buccanrsb, buccanrs, buccanrs, buccanrs, vigilant_state, empty_init, ROT0, "Duintronic", "Buccaneers (set 3, harder)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1990, captainx, buccanrs, captainx, buccanrs, captainx_state, empty_init, ROT0, "bootleg (Electronics)", "Captain X", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) GAME( 1994, bowmen, 0, bowmen, bowmen, vigilant_state, init_bowmen, ROT0, "Ten-Level", "Bowmen", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/irem/vigilant.h b/src/mame/irem/vigilant.h index 5ed7cb932f4..8f40d9b2528 100644 --- a/src/mame/irem/vigilant.h +++ b/src/mame/irem/vigilant.h @@ -6,6 +6,7 @@ #pragma once #include "m72_a.h" +#include "cpu/m6805/m68705.h" #include "machine/timer.h" #include "emupal.h" @@ -30,8 +31,17 @@ public: void bowmen(machine_config &config); void init_bowmen(); -private: +protected: required_device m_maincpu; + + virtual void machine_start() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + virtual void video_reset() override ATTR_COLD; + + void vigilant_map(address_map &map) ATTR_COLD; + void vigilant_io_map(address_map &map) ATTR_COLD; + +private: required_device m_soundcpu; required_device m_audio; required_device m_gfxdecode; @@ -67,10 +77,6 @@ private: // kikcubic void kikcubic_coin_w(uint8_t data); - virtual void machine_start() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; - virtual void video_reset() override ATTR_COLD; - uint32_t screen_update_vigilant(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_kikcubic(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_bowmen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -88,9 +94,42 @@ private: void kikcubic_map(address_map &map) ATTR_COLD; void sound_io_map(address_map &map) ATTR_COLD; void sound_map(address_map &map) ATTR_COLD; - void vigilant_io_map(address_map &map) ATTR_COLD; - void vigilant_map(address_map &map) ATTR_COLD; void bowmen_io_map(address_map &map) ATTR_COLD; }; +class captainx_state : public vigilant_state +{ +public: + captainx_state(const machine_config &mconfig, device_type type, const char *tag) : + vigilant_state(mconfig, type, tag), + m_mcu(*this, "mcu"), + m_maincpu_region(*this, "maincpu") + {} + + void captainx(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + required_device m_mcu; + required_region_ptr m_maincpu_region; + + uint8_t m_decryption_ram[0x800]; + + uint8_t m_mcu_porta = 0; + uint8_t m_mcu_portb = 0; + uint8_t m_mcu_portc = 0; + + void mcu_porta_w(u8 data); + void mcu_portb_w(u8 data); + void mcu_portc_w(u8 data); + + void captainx_map(address_map &map) ATTR_COLD; + + uint8_t rom_r(offs_t offset); +}; + + #endif // MAME_IREM_VIGILANT_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 912fd456e4e..71db7949936 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -21646,6 +21646,7 @@ bowmen // (c) 1994 Ten-Level buccanrs // (c) 1989 Duintronic buccanrsa // (c) 1989 Duintronic buccanrsb // (c) 1989 Duintronic +captainx // bootleg kikcubic // (c) 1988 (Japan) kikcubicb // bootleg vigilant // (c) 1988 (World Rev E) @@ -36709,6 +36710,7 @@ bmf_fr // bmf_it // bmf_jp // bmf_nl // +bmf_nl302 // bmf_no // bmf_sp // bmf_sv // diff --git a/src/mame/pinball/de_3.cpp b/src/mame/pinball/de_3.cpp index e0a4ec10f4d..59a5ef21322 100644 --- a/src/mame/pinball/de_3.cpp +++ b/src/mame/pinball/de_3.cpp @@ -1799,6 +1799,19 @@ ROM_START(bmf_nl) ROM_LOAD("bmfu21.bin", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) ROM_END +ROM_START(bmf_nl302) + ROM_REGION(0x10000, "maincpu", 0) + ROM_LOAD("batnovd.302", 0x0000, 0x10000, CRC(844c7f6a) SHA1(8c035848644329d121780081a12d16721454cb8c)) + ROM_REGION16_BE(0x100000, "decodmd3", 0) + ROM_LOAD16_BYTE("bfdrom0f.401", 0x000001, 0x80000, CRC(e7473f6f) SHA1(f5951a9b6a8776073adf10e38b9d68d6d444240a)) + ROM_LOAD16_BYTE("bfdrom3f.401", 0x000000, 0x80000, CRC(f7951709) SHA1(ace5b374d1e382d6f612b2bafc0e9fdde9e21014)) + ROM_REGION(0x010000, "decobsmt:soundcpu", 0) + ROM_LOAD("bmfu7.bin", 0x0000, 0x10000, CRC(58c0d144) SHA1(88a404d3625c7c154892282598b4949ac97de12b)) + ROM_REGION(0x1000000, "decobsmt:bsmt", 0) + ROM_LOAD("bmfu17.bin", 0x000000, 0x80000, CRC(edcd5c10) SHA1(561f22fb7817f64e09ef6adda646f58f31b80bf4)) + ROM_LOAD("bmfu21.bin", 0x080000, 0x80000, CRC(e41a516d) SHA1(9c41803a01046e57f8bd8759fe5e62ad6abaa80c)) +ROM_END + ROM_START(bmf_it) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("batnovi.401", 0x0000, 0x10000, CRC(7053ef9e) SHA1(918ab3e250b5965998ca0a38e1b8ba3cc012083f)) @@ -2172,7 +2185,8 @@ GAME(1995, bmf_ch, batmanf, de_3b, de3, de_3_state, empty_init, ROT GAME(1995, bmf_de, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (German)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_be, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Belgian)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_fr, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (French)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -GAME(1995, bmf_nl, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_nl, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 4.0)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) +GAME(1995, bmf_nl302, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Dutch, 3.02)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_it, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Italian)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_sp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Spanish)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) GAME(1995, bmf_jp, batmanf, de_3b, de3, de_3_state, empty_init, ROT0, "Sega", "Batman Forever (Japanese)", MACHINE_IS_SKELETON_MECHANICAL | MACHINE_SUPPORTS_SAVE ) -- cgit v1.2.3-70-g09d2