diff options
-rw-r--r-- | src/devices/machine/steppers.cpp | 16 | ||||
-rw-r--r-- | src/mame/barcrest/mpu3.cpp | 465 | ||||
-rw-r--r-- | src/mame/barcrest/mpu4_characteriser_pal.cpp | 17 | ||||
-rw-r--r-- | src/mame/barcrest/mpu4_characteriser_pal.h | 7 | ||||
-rw-r--r-- | src/mame/mame.lst | 2 |
5 files changed, 295 insertions, 212 deletions
diff --git a/src/devices/machine/steppers.cpp b/src/devices/machine/steppers.cpp index f59713e60b5..98e67916f01 100644 --- a/src/devices/machine/steppers.cpp +++ b/src/devices/machine/steppers.cpp @@ -325,23 +325,23 @@ void reel_device::advance_phase() break; case MPU3_48STEP_REEL : - /* The MPU3 interface is actually the same as the MPU4 setup, but with two active lines instead of four + /* The MPU3 harness is actually the same as the MPU4 setup, but with two active lines instead of four, and a slight change to the windings. Inverters are used so if a pin is low, the higher bit of the pair is activated, and if high the lower bit is activated. - TODO:Check this, 2 and 1 could be switched over. - */ + The stepper driven MPU2 should use this hardware as well. + */ switch (m_pattern) { - // Yellow(2) Brown(1) Orange(!2) Black(!1) - case 0x00 :// 0 0 1 1 + // Grey(1) Yellow(2) Grey (2) Yellow (2) + case 0x02 :// 0 1 0 1 m_phase = 6; break; - case 0x01 :// 0 1 1 0 + case 0x03 :// 0 1 1 0 m_phase = 4; break; - case 0x03 :// 1 1 0 0 + case 0x01 :// 1 0 1 0 m_phase = 2; break; - case 0x02 :// 1 0 0 1 + case 0x00 :// 1 0 0 1 m_phase = 0; break; } diff --git a/src/mame/barcrest/mpu3.cpp b/src/mame/barcrest/mpu3.cpp index cace1839f78..b403f8970a8 100644 --- a/src/mame/barcrest/mpu3.cpp +++ b/src/mame/barcrest/mpu3.cpp @@ -104,6 +104,8 @@ TODO: - Distinguish door switches using manual #include "emu.h" #include "awpvid.h" //Fruit Machines Only +#include "mpu4_characteriser_pal.h" + #include "machine/6821pia.h" #include "machine/6840ptm.h" #include "machine/input_merger.h" @@ -168,14 +170,6 @@ TODO: - Distinguish door switches using manual #define LOG(x) do { if (MPU3VERBOSE) logerror x; } while (0) -/* Lookup table for CHR data */ - -struct mpu3_chr_table -{ - uint8_t call; - uint8_t response; -}; - class mpu3_state : public driver_device { public: @@ -198,13 +192,16 @@ public: void mpu3base(machine_config &config); - void init_m3hprvpr(); + void init_mpu3(); + +protected: + void mpu3_basemap(address_map &map); + + required_device<cpu_device> m_maincpu; private: template <unsigned N> DECLARE_WRITE_LINE_MEMBER(reel_optic_cb) { if (state) m_optic_pattern |= (1 << N); else m_optic_pattern &= ~(1 << N); } - void characteriser_w(offs_t offset, uint8_t data); - uint8_t characteriser_r(offs_t offset); void mpu3ptm_w(offs_t offset, uint8_t data); uint8_t mpu3ptm_r(offs_t offset); DECLARE_WRITE_LINE_MEMBER(ic2_o1_callback); @@ -237,7 +234,6 @@ private: virtual void machine_start() override; virtual void machine_reset() override; - void mpu3_basemap(address_map &map); int m_triac_ic3 = 0; int m_triac_ic4 = 0; @@ -262,14 +258,10 @@ private: uint8_t m_led_strobe = 0; int m_signal_50hz = 0; - const mpu3_chr_table* m_current_chr_table = nullptr; - int m_prot_col = 0; - int m_optic_pattern = 0; emu_timer *m_ic21_timer = nullptr; - required_device<cpu_device> m_maincpu; required_shared_ptr<uint8_t> m_nvram; required_device_array<stepper_device, 4> m_reels; required_device<meters_device> m_meters; @@ -289,6 +281,25 @@ private: #define BWB_FUNCTIONALITY 2 +class mpu3_chr_state : public mpu3_state +{ +public: + mpu3_chr_state(const machine_config &mconfig, device_type type, const char *tag) + : mpu3_state(mconfig, type, tag) + , m_characteriser(*this, "characteriser") + { } + + void mpu3_chr_3000(machine_config &config); + void mpu3_chr_c000(machine_config &config); + +private: + void mpu3_map_chr_3000(address_map &map); + void mpu3_map_chr_c000(address_map &map); + + required_device<mpu4_characteriser_pal> m_characteriser; +}; + + void mpu3_state::update_triacs() { int const triacdata = m_triac_ic3 + (m_triac_ic4 << 8) + (m_triac_ic5 << 9); @@ -732,54 +743,6 @@ void mpu3_state::machine_start() m_digit.resolve(); m_lamp.resolve(); } -/* -Characteriser (CHR) - -The MPU3 characteriser is surprisingly simple to simulate, as it operates a call, response pairing. The only factor that provides a challenge is that the -address of the PAL in memory varies between games. Once found, the memory location of the data table is easily found from the X register of the CPU. -*/ - -void mpu3_state::characteriser_w(offs_t offset, uint8_t data) -{ - int x; - int call=data; - if (!m_current_chr_table) - fatalerror("No Characteriser Table @ %04x\n", m_maincpu->pcbase()); - - if (offset == 0) - { - { - if (call == 0) - { - m_prot_col = 0; - } - else - { - for (x = m_prot_col; x < 64; x++) - { - if (m_current_chr_table[(x)].call == call) - { - m_prot_col = x; - break; - } - } - } - } - } -} - - -uint8_t mpu3_state::characteriser_r(offs_t offset) -{ - if (!m_current_chr_table) - fatalerror("No Characteriser Table @ %04x\n", m_maincpu->pcbase()); - - if (offset == 0) - { - return m_current_chr_table[m_prot_col].response; - } - return 0; -} /* generate a 50 Hz signal (some components rely on this for external sync) */ TIMER_DEVICE_CALLBACK_MEMBER(mpu3_state::gen_50hz) @@ -823,6 +786,18 @@ void mpu3_state::mpu3_basemap(address_map &map) map(0xa800, 0xa803).rw(m_pia6, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); /* PIA6821 IC6 */ } +void mpu3_chr_state::mpu3_map_chr_3000(address_map &map) +{ + mpu3_basemap(map); + map(0x3000, 0x3000).rw(m_characteriser, FUNC(mpu4_characteriser_pal::read), FUNC(mpu4_characteriser_pal::write)); +} + +void mpu3_chr_state::mpu3_map_chr_c000(address_map &map) +{ + mpu3_basemap(map); + map(0xc000, 0xc000).rw(m_characteriser, FUNC(mpu4_characteriser_pal::read), FUNC(mpu4_characteriser_pal::write)); +} + void mpu3_state::mpu3base(machine_config &config) { M6808(config, m_maincpu, 4_MHz_XTAL); @@ -873,13 +848,13 @@ void mpu3_state::mpu3base(machine_config &config) m_pia6->irqa_handler().set("mainirq", FUNC(input_merger_device::in_w<3>)); m_pia6->irqb_handler().set("mainirq", FUNC(input_merger_device::in_w<4>)); - REEL(config, m_reels[0], MPU3_48STEP_REEL, 1, 3, 0x00, 2); + REEL(config, m_reels[0], MPU3_48STEP_REEL, 96, 2, 0x00, 2); m_reels[0]->optic_handler().set(FUNC(mpu3_state::reel_optic_cb<0>)); - REEL(config, m_reels[1], MPU3_48STEP_REEL, 1, 3, 0x00, 2); + REEL(config, m_reels[1], MPU3_48STEP_REEL, 96, 2, 0x00, 2); m_reels[1]->optic_handler().set(FUNC(mpu3_state::reel_optic_cb<1>)); - REEL(config, m_reels[2], MPU3_48STEP_REEL, 1, 3, 0x00, 2); + REEL(config, m_reels[2], MPU3_48STEP_REEL, 96, 2, 0x00, 2);; m_reels[2]->optic_handler().set(FUNC(mpu3_state::reel_optic_cb<2>)); - REEL(config, m_reels[3], MPU3_48STEP_REEL, 1, 3, 0x00, 2); + REEL(config, m_reels[3], MPU3_48STEP_REEL, 96, 2, 0x00, 2); m_reels[3]->optic_handler().set(FUNC(mpu3_state::reel_optic_cb<3>)); METERS(config, m_meters, 0).set_number(8); @@ -889,25 +864,31 @@ void mpu3_state::mpu3base(machine_config &config) config.set_default_layout(layout_mpu3); } +void mpu3_chr_state::mpu3_chr_3000(machine_config &config) +{ + mpu3base(config); -static const mpu3_chr_table hprvpr_data[64] = { -{0x00, 0x00},{0x1a, 0x80},{0x04, 0xec},{0x10, 0x1c},{0x18, 0xf0},{0x0f, 0x28},{0x13, 0x54},{0x1b, 0x04}, -{0x03, 0xa4},{0x07, 0xac},{0x17, 0x3c},{0x1d, 0xf4},{0x16, 0x48},{0x15, 0x54},{0x0b, 0x00},{0x08, 0xc4}, -{0x19, 0x88},{0x01, 0x7c},{0x02, 0xf4},{0x05, 0x48},{0x0c, 0x54},{0x09, 0x04},{0x11, 0xc0},{0x14, 0xc8}, -{0x0a, 0x7c},{0x1f, 0xf4},{0x06, 0x6c},{0x0e, 0x70},{0x1c, 0x00},{0x12, 0xa4},{0x1e, 0x8c},{0x0d, 0x5c}, -{0x14, 0xf0},{0x0a, 0x28},{0x19, 0x30},{0x15, 0x40},{0x06, 0xe4},{0x0f, 0x88},{0x08, 0x5c},{0x1b, 0x94}, -{0x1e, 0x0c},{0x04, 0x74},{0x01, 0x40},{0x0c, 0xc4},{0x18, 0x8c},{0x1a, 0x7c},{0x11, 0xd4},{0x0b, 0x08}, -{0x03, 0x34},{0x17, 0x40},{0x10, 0xa4},{0x1d, 0xe8},{0x0e, 0x78},{0x07, 0x90},{0x12, 0x0c},{0x09, 0x54}, -{0x0d, 0x04},{0x1f, 0xc0},{0x16, 0xc8},{0x05, 0x78},{0x13, 0xd4},{0x1c, 0x0c},{0x02, 0x74},{0x00, 0x00}, -}; + m_maincpu->set_addrmap(AS_PROGRAM, &mpu3_chr_state::mpu3_map_chr_3000); -void mpu3_state::init_m3hprvpr() + MPU4_CHARACTERISER_PAL(config, m_characteriser, 0); + m_characteriser->set_cpu_tag("maincpu"); + m_characteriser->set_allow_6800_cheat(true); +} + +void mpu3_chr_state::mpu3_chr_c000(machine_config &config) { - address_space &space = m_maincpu->space(AS_PROGRAM); + mpu3base(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &mpu3_chr_state::mpu3_map_chr_c000); + + MPU4_CHARACTERISER_PAL(config, m_characteriser, 0); + m_characteriser->set_cpu_tag("maincpu"); + m_characteriser->set_allow_6800_cheat(true); +} +void mpu3_state::init_mpu3() +{ m_disp_func = METER_PORT; - m_current_chr_table = hprvpr_data; - space.install_readwrite_handler(0xc000, 0xc000, read8sm_delegate(*this, FUNC(mpu3_state::characteriser_r)), write8sm_delegate(*this, FUNC(mpu3_state::characteriser_w))); } ROM_START( m3tst ) @@ -918,9 +899,6 @@ ROM_END - - - ROM_START( m3acech ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "ac10p.p1", 0x6000, 0x2000, CRC(bf72f9cd) SHA1(78885c39d08949cfac662c37564e71b01129b9bb) ) @@ -1126,8 +1104,8 @@ ROM_END ROM_START( m3gcrown ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "crown.2l", 0x7000, 0x1000, CRC(184780c5) SHA1(e07f56e536823c28d524a687d607cb2877199210) ) // == m3nudge - ROM_LOAD( "crown.2l2", 0x6000, 0x1000, CRC(04fadad3) SHA1(d82536f18122b9fb33fae6a238f29e4c615b3681) ) // == m3nudge + ROM_LOAD( "crown.2l", 0x7000, 0x1000, CRC(184780c5) SHA1(e07f56e536823c28d524a687d607cb2877199210) ) + ROM_LOAD( "crown.2l2", 0x6000, 0x1000, CRC(04fadad3) SHA1(d82536f18122b9fb33fae6a238f29e4c615b3681) ) ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) ROM_END @@ -1225,13 +1203,6 @@ ROM_START( m3oxo ) ROM_END -ROM_START( m3nudge ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "nu1.2l", 0x7000, 0x1000, CRC(184780c5) SHA1(e07f56e536823c28d524a687d607cb2877199210) ) // == m3gcrown - ROM_LOAD( "nu1.2l2", 0x6000, 0x1000, CRC(04fadad3) SHA1(d82536f18122b9fb33fae6a238f29e4c615b3681) ) // == m3gcrown - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) -ROM_END - ROM_START( m3oddson ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) @@ -1350,8 +1321,8 @@ ROM_END ROM_START( m3circlea ) // most likely a bad dump of both roms ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "specialcircle.p1", 0x7000, 0x1000, CRC(21f7e745) SHA1(5b050cad957a055396f5aaa5558034cf55d62d18) ) // bad? boot vectors are missing.. - ROM_LOAD( "specialcircle.p2", 0x6000, 0x1000, CRC(8d5d26bd) SHA1(e88e368ad411529e982c76bff0696f6966fd7f11) ) // 1ST AND 2ND HALF IDENTICAL + ROM_LOAD( "specialcircle.p1", 0x7000, 0x1000, BAD_DUMP CRC(21f7e745) SHA1(5b050cad957a055396f5aaa5558034cf55d62d18) ) // bad? boot vectors are missing.. + ROM_LOAD( "specialcircle.p2", 0x6000, 0x1000, BAD_DUMP CRC(8d5d26bd) SHA1(e88e368ad411529e982c76bff0696f6966fd7f11) ) // 1ST AND 2ND HALF IDENTICAL ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) ROM_END @@ -1477,19 +1448,8 @@ ROM_END -ROM_START( m3supwin ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "superwin.p1", 0x6000, 0x2000, CRC(d6193f5b) SHA1(2813a982d1527d994a045840aaaa20032bd39c45) ) - ROM_LOAD( "superwin.p2", 0x4000, 0x2000, CRC(89f9af8a) SHA1(1705a0eb31a5ee77e77811798d3c99b65dc7ade4) ) - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) -ROM_END -ROM_START( m3supwina ) // odd in only p2 differing - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "superwin.p1", 0x6000, 0x2000, CRC(d6193f5b) SHA1(2813a982d1527d994a045840aaaa20032bd39c45) ) // == m3winagna - ROM_LOAD( "superwin_.p2", 0x4000, 0x2000, CRC(f4210f20) SHA1(e0c7e28950683e35102bfd0bef7b74c63a36798f) ) // == m3winagna - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) -ROM_END + ROM_START( m3sweep ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) @@ -1554,6 +1514,19 @@ ROM_START( m3wigwam ) ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) ROM_END +ROM_START( m3supwin ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "superwin.p1", 0x6000, 0x2000, CRC(d6193f5b) SHA1(2813a982d1527d994a045840aaaa20032bd39c45) ) + ROM_LOAD( "superwin.p2", 0x4000, 0x2000, CRC(89f9af8a) SHA1(1705a0eb31a5ee77e77811798d3c99b65dc7ade4) ) + ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) +ROM_END + +ROM_START( m3supwina ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD( "wag.p1", 0x6000, 0x2000, CRC(d6193f5b) SHA1(2813a982d1527d994a045840aaaa20032bd39c45) ) + ROM_LOAD( "wag.p2", 0x4000, 0x2000, CRC(f4210f20) SHA1(e0c7e28950683e35102bfd0bef7b74c63a36798f) ) + ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) +ROM_END ROM_START( m3winagn ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) @@ -1565,13 +1538,6 @@ ROM_END //ROM_LOAD( "bwbnwagn.bin", 0x0000, 0x8000, CRC(1163559a) SHA1(9e13b23eae478fd5b5468599b1163d06e189d446) ) //ROM_LOAD( "winagain.bin", 0x0000, 0x4000, CRC(193e743d) SHA1(1c2d0dc8bea80c29c012a6a43d5bcd342b2b9f2a) ) -ROM_START( m3winagna ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) - ROM_LOAD( "wag.p1", 0x6000, 0x2000, CRC(d6193f5b) SHA1(2813a982d1527d994a045840aaaa20032bd39c45) ) // == m3supwina - ROM_LOAD( "wag.p2", 0x4000, 0x2000, CRC(f4210f20) SHA1(e0c7e28950683e35102bfd0bef7b74c63a36798f) ) // == m3supwina - ROM_COPY( "maincpu", 0x0000, 0x8000, 0x8000 ) -ROM_END - ROM_START( m3winagnb ) ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD( "wag1.bin", 0x6000, 0x2000, CRC(ded10570) SHA1(abb938e02cac34ec800c53d1c19a66ef8456d483) ) @@ -1600,102 +1566,203 @@ ROM_END /* Barcrest */ +// search for cmpa (x+$01) in trace logs to find protection accesses + #define GAME_FLAGS MACHINE_NOT_WORKING|MACHINE_NO_SOUND|MACHINE_REQUIRES_ARTWORK|MACHINE_MECHANICAL|MACHINE_CLICKABLE_ARTWORK + + + GAME( 198?, m3tst, 0, mpu3base, mpu3, mpu3_state, empty_init, ROT0, "Barcrest","MPU3 Unit Test (Program 5) (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3autort, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Autoroute (Barcrest) (MPU3)", GAME_FLAGS, layout_m3autort ) -GAME( 198?, m3big20j, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Big 20 Joker (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3biggam, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","The Big Game (Barcrest) (MPU3)", GAME_FLAGS, layout_m3biggam ) -GAMEL( 198?, m3bigsht, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Big Shot (Barcrest) (MPU3)", GAME_FLAGS, layout_m3bigsht ) -GAMEL( 198?, m3blkhle, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Black Hole (Barcrest) (MPU3)", GAME_FLAGS, layout_m3blkhle ) -GAMEL( 198?, m3cabret, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3cabreta ) -GAMEL( 198?, m3cabreta, m3cabret, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3cabreta ) -GAMEL( 198?, m3cunlim, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Chances Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3cunlim ) -GAMEL( 198?, m3cskill, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Circle Skill (Barcrest) (MPU3)", GAME_FLAGS, layout_m3cskill ) -GAME( 198?, m3cjoker, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Crazy Joker (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3xchngg, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Exchanges Galore (Barcrest) (MPU3)", GAME_FLAGS, layout_m3xchngg ) -GAME( 198?, m3xchngu, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 1)",GAME_FLAGS ) -GAME( 198?, m3xchngua, m3xchngu, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 2)",GAME_FLAGS ) -GAMEL( 198?, m3fortun, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3fortun ) -GAMEL( 198?, m3fortuna, m3fortun, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3fortun ) -GAMEL( 198?, m3fortund, m3fortun, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Fortune Numbers (Barcrest) [Dutch] (MPU3)", GAME_FLAGS, layout_m3fortun ) -GAME( 198?, m3gaward, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Golden Award (Barcrest) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3hprvpr, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3snappy, m3hprvpr, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Snappy Viper (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3replay, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Instant Replay (Barcrest) (MPU3)", GAME_FLAGS, layout_m3replay ) -GAMEL( 198?, m3lineup, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Line Up (Barcrest) (MPU3)", GAME_FLAGS, layout_m3lineup ) -GAME( 198?, m3llotto, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Lucky Lotto (Barcrest) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3lstrik, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 1)",GAME_FLAGS ) -GAME( 198?, m3lstrika, m3lstrik, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 2)",GAME_FLAGS ) -GAME( 198?, m3magrp, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Magic Replay (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3nnice, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Naughty But Nice (Barcrest) (MPU3)", GAME_FLAGS, layout_m3nnice ) -GAME( 198?, m3nudge, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Nudges Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3oddson, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Odds On (Barcrest) (MPU3)", GAME_FLAGS, layout_m3oddson ) -GAME( 198?, m3optunl, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Options Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3razdaz, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3razdaza ) -GAMEL( 198?, m3razdaza, m3razdaz, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3razdaza ) -GAMEL( 198?, m3razdazd, m3razdaz, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Razzle Dazzle (Barcrest) [Dutch] (MPU3)", GAME_FLAGS, layout_m3razdaza ) -GAME( 198?, m3rolla, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Rollamatic 5-Line Special (Barcrest) (MPU3)", GAME_FLAGS ) // or 5-Line Special Rollamatic on the glass, using the title from the ROM -GAMEL( 198?, m3rxchng, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU3)", GAME_FLAGS, layout_m3rxchng ) -GAMEL( 198?, m3circle, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3circle ) -GAMEL( 198?, m3circlea, m3circle, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3circle ) -GAMEL( 198?, m3circleb, m3circle, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 3)", GAME_FLAGS, layout_m3circle ) -GAMEL( 198?, m3slight, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Strike A Light (Barcrest) (MPU3)", GAME_FLAGS, layout_m3slight ) -GAMEL( 198?, m3supadr, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Adders & Ladders (Barcrest) (MPU3)", GAME_FLAGS, layout_m3supadr ) -GAME( 198?, m3sdeal, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Deal (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3sexcu, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Exchanges Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3sexcu ) -GAME( 198?, m3suplin, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 1)",GAME_FLAGS ) -GAME( 198?, m3suplina, m3suplin, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 2)",GAME_FLAGS ) -GAMEL( 198?, m3supnud, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Nudges Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3supnud ) -GAME( 198?, m3supser, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Super Series (Barcrest) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3sweep, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3sweep ) -GAMEL( 198?, m3sweepa, m3sweep, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3sweep ) -GAME( 198?, m3topsht, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Top Shot (Barcrest) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3winstra, m3winstr, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Barcrest","Winstrike (Barcrest) (MPU3)",GAME_FLAGS ) - -/* Bwb */ - -GAMEL( 198?, m3acech, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Ace Chase (Bwb) (MPU3)", GAME_FLAGS, layout_m3acech ) -GAME( 198?, m3bankr, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Banker (Bwb) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3chase, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Chase It (Bwb) (MPU3)", GAME_FLAGS, layout_m3chase ) -GAMEL( 198?, m3gmine, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Gold Mine (Bwb) (MPU3)", GAME_FLAGS, layout_m3gmine ) -GAMEL( 198?, m3ratrce, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Rat Race (Bwb) (MPU3)", GAME_FLAGS, layout_m3ratrce ) -GAME( 198?, m3supasw, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Supaswop (Bwb) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3supwin, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 1)", GAME_FLAGS, layout_m3supwin ) -GAMEL( 198?, m3supwina, m3supwin, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Super Win (Bwb) (MPU3, set 2)", GAME_FLAGS, layout_m3supwin ) -GAMEL( 198?, m3winagn, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 1)", GAME_FLAGS, layout_m3winagnb ) -GAMEL( 198?, m3winagna, m3winagn, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 2)", GAME_FLAGS, layout_m3winagnb ) -GAMEL( 198?, m3winagnb, m3winagn, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Win-A-Gain (Bwb) (MPU3, set 3)", GAME_FLAGS, layout_m3winagnb ) -GAMEL( 198?, m3winstr, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Bwb","Winstrike (Bwb) (MPU3)", GAME_FLAGS, layout_m3winstr ) + +// no protection, boots without testing reels? +GAMEL( 198?, m3blkhle, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Black Hole (Barcrest) (MPU3)", GAME_FLAGS, layout_m3blkhle ) + +// no protection, boots without testing reels? +GAMEL( 198?, m3xchngg, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Exchanges Galore (Barcrest) (MPU3)", GAME_FLAGS, layout_m3xchngg ) + +// no protection, boots without testing reels? +GAME( 198?, m3xchngu, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3xchngua, m3xchngu, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Exchanges Unlimited (Barcrest) (MPU3, set 2)",GAME_FLAGS ) +GAMEL( 198?, m3sexcu, m3xchngu, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Exchanges Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3sexcu ) // == m3xchngua, what is the correct name? + +// no protection, boots without testing reels? +GAMEL( 198?, m3replay, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Instant Replay (Barcrest) (MPU3)", GAME_FLAGS, layout_m3replay ) + + +// no protection +GAMEL( 198?, m3cabret, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3cabreta ) +GAMEL( 198?, m3cabreta, m3cabret, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Cabaret (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3cabreta ) + +// no protection +GAMEL( 198?, m3lineup, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Line Up (Barcrest) (MPU3)", GAME_FLAGS, layout_m3lineup ) + +// no protection +GAME( 198?, m3magrp, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Magic Replay (Barcrest) (MPU3)",GAME_FLAGS ) + +// no protection +GAMEL( 198?, m3supadr, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Adders & Ladders (Barcrest) (MPU3)", GAME_FLAGS, layout_m3supadr ) + +// no protection +GAME( 198?, m3suplin, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3suplina, m3suplin, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Line Up (Barcrest) (MPU3, set 2)",GAME_FLAGS ) + + +// protection write sequence and address is different, maybe hacked? +GAME( 198?, m3big20j, 0, mpu3_chr_3000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Big 20 Joker (Barcrest) (MPU3)",GAME_FLAGS ) + + +// 00 a0 ac 1c 94 2c 10 64 e4 ec (shared sequence m3autort, m3nnice) +GAMEL( 198?, m3autort, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Autoroute (Barcrest) (MPU3)", GAME_FLAGS, layout_m3autort ) + +// 00 a0 a8 3c 94 2c 10 60 e4 e8 +GAMEL( 198?, m3biggam, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","The Big Game (Barcrest) (MPU3)", GAME_FLAGS, layout_m3biggam ) + +// 00 a0 88 18 b0 48 50 60 e4 c8 (shared sequence m3bigsht, m3topsht, also topgear_characteriser_prot on mpu4) +GAMEL( 198?, m3bigsht, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Big Shot (Barcrest) (MPU3)", GAME_FLAGS, layout_m3bigsht ) + +// 00 a0 88 58 d4 2c 30 20 e4 c8 (shared sequence m3cunlim, m3optunl, m3lstrik?) +GAMEL( 198?, m3cunlim, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Chances Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3cunlim ) + +// 00 e0 88 18 b0 48 50 60 e4 c8 (also bdash_characteriser_prot on mpu4?) +GAMEL( 198?, m3cskill, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Circle Skill (Barcrest) (MPU3)", GAME_FLAGS, layout_m3cskill ) + +// 00 60 68 bc d0 0c 94 20 e4 e8 +GAME( 198?, m3cjoker, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Crazy Joker (Barcrest) (MPU3)",GAME_FLAGS ) + +// 00 a0 a8 38 b4 28 30 64 e4 e8 +GAMEL( 198?, m3fortun, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3fortun ) +GAMEL( 198?, m3fortuna, m3fortun, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Fortune Numbers (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3fortun ) +// 00 60 68 bc d0 2c 94 20 e4 e8 (shared sequence as m3fortund, m3sdeal, also m400_characteriser_prot on mpu4) +GAMEL( 198?, m3fortund, m3fortun, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Fortune Numbers (Barcrest) (Dutch) (MPU3)", GAME_FLAGS, layout_m3fortun ) + +// 00 e0 88 78 94 48 50 60 e4 c8 +GAME( 198?, m3gaward, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Golden Award (Barcrest) (MPU3)",GAME_FLAGS ) + +// 00 80 ec 1c f0 28 54 04 a4 ac +GAME( 198?, m3hprvpr, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Hyper Viper (Barcrest) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3snappy, m3hprvpr, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Snappy Viper (Barcrest) (MPU3)",GAME_FLAGS ) + +// 00 e0 a8 3c 90 68 34 40 e4 e8 +GAME( 198?, m3llotto, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Lucky Lotto (Barcrest) (MPU3)",GAME_FLAGS ) + +// 00 a0 88 58 d4 2c 30 20 e4 c8 (shared sequence m3cunlim, m3optunl, m3lstrik?) +GAME( 198?, m3lstrik, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 1)",GAME_FLAGS ) +GAME( 198?, m3lstrika, m3lstrik, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Lucky Strike Club (Barcrest) (MPU3, set 2)",GAME_FLAGS ) + +// 00 a0 ac 1c 94 2c 10 64 e4 ec (shared sequence m3autort, m3nnice) +GAMEL( 198?, m3nnice, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Naughty But Nice (Barcrest) (MPU3)", GAME_FLAGS, layout_m3nnice ) + +// 00 e0 a8 38 90 68 30 60 e4 e8 (also hittop_characteriser_prot on mpu4) +GAMEL( 198?, m3oddson, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Odds On (Barcrest) (MPU3)", GAME_FLAGS, layout_m3oddson ) + +// 00 a0 88 58 d4 2c 30 20 e4 c8 (shared sequence m3cunlim, m3optunl, m3lstrik?) +GAME( 198?, m3optunl, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Options Unlimited (Barcrest) (MPU3)",GAME_FLAGS ) + +// 00 e0 88 18 b0 48 10 60 e4 c8 +GAMEL( 198?, m3razdaz, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3razdaza ) +GAMEL( 198?, m3razdaza, m3razdaz, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3razdaza ) +// 00 60 68 98 d4 2c b0 24 e4 e8 +GAMEL( 198?, m3razdazd, m3razdaz, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Razzle Dazzle (Barcrest) (Dutch) (MPU3)", GAME_FLAGS, layout_m3razdaza ) + +// 00 a0 a8 38 f4 2c 30 60 e4 e8 +GAMEL( 198?, m3rxchng, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Royal Exchange Club (Barcrest) (MPU3)", GAME_FLAGS, layout_m3rxchng ) + +// 00 e0 a8 38 94 48 50 60 e4 e8 (also m407_characteriser_prot on mpu4) +GAMEL( 198?, m3slight, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Strike A Light (Barcrest) (MPU3)", GAME_FLAGS, layout_m3slight ) + +// 00 60 68 bc d0 2c 94 20 e4 e8 (shared sequence as m3fortund, m3sdeal, also m400_characteriser_prot on mpu4) +GAME( 198?, m3sdeal, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Super Deal (Barcrest) (Dutch) (MPU3)",GAME_FLAGS ) + +// 00 a0 a8 18 f4 2c 70 60 e4 e8 (also viva_characteriser_prot on mpu4?) +GAMEL( 198?, m3sweep, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3sweep ) +GAMEL( 198?, m3sweepa, m3sweep, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Sweep Stake Club (Barcrest) (MPU3, set 2)", GAME_FLAGS, layout_m3sweep ) + +// 00 a0 88 18 b0 48 50 60 e4 c8 (shared sequence m3bigsht, m3topsht, also topgear_characteriser_prot on mpu4) +GAME( 198?, m3topsht, 0, mpu3_chr_c000, mpu3, mpu3_chr_state, init_mpu3, ROT0, "Barcrest","Top Shot (Barcrest) (MPU3)",GAME_FLAGS ) + + +// doesn't boot, does nothing? +GAMEL( 198?, m3supnud, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Nudges Unlimited (Barcrest) (MPU3)", GAME_FLAGS, layout_m3supnud ) + +// doesn't boot, does nothing? +GAME( 198?, m3supser, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Super Series (Barcrest) (MPU3)",GAME_FLAGS ) + +// doesn't boot, does nothing? +GAMEL( 198?, m3circle, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 1)", GAME_FLAGS, layout_m3circle ) +GAMEL( 198?, m3circlea, m3circle, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 2, bad)", GAME_FLAGS, layout_m3circle ) +GAMEL( 198?, m3circleb, m3circle, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Barcrest","Special Circle Club (Barcrest) (MPU3, set 3)", GAME_FLAGS, layout_m3circle ) + + +/* BWB */ + +GAMEL( 198?, m3acech, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Ace Chase (BWB) (MPU3)", GAME_FLAGS, layout_m3acech ) + +GAME( 198?, m3bankr, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Banker (BWB) (MPU3)",GAME_FLAGS ) + +GAMEL( 198?, m3chase, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Chase It (BWB) (MPU3)", GAME_FLAGS, layout_m3chase ) + +GAMEL( 198?, m3gmine, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Gold Mine (BWB) (MPU3)", GAME_FLAGS, layout_m3gmine ) + +GAMEL( 198?, m3ratrce, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Rat Race (BWB) (MPU3)", GAME_FLAGS, layout_m3ratrce ) + +GAME( 198?, m3supasw, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Supaswop (BWB) (MPU3)",GAME_FLAGS ) + +GAMEL( 198?, m3supwin, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Super Win (BWB) (MPU3, set 1) (W.AG2) ", GAME_FLAGS, layout_m3supwin ) // offset VFD +GAMEL( 198?, m3supwina, m3supwin, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Super Win (BWB) (MPU3, set 2) (S.W.2 1.0)", GAME_FLAGS, layout_m3supwin ) + +GAMEL( 198?, m3winagn, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Win-A-Gain (BWB) (MPU3, set 1) (W.A.G. 2.2)", GAME_FLAGS, layout_m3winagnb ) +GAMEL( 198?, m3winagnb, m3winagn, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Win-A-Gain (BWB) (MPU3, set 2) (W.A.G. 5.1)", GAME_FLAGS, layout_m3winagnb ) + +GAMEL( 198?, m3winstr, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Winstrike (BWB) (MPU3, set 1)", GAME_FLAGS, layout_m3winstr ) +GAMEL( 198?, m3winstra, m3winstr, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "BWB","Winstrike (BWB) (MPU3, set 2)", GAME_FLAGS, layout_m3winstr ) /* Pcp */ -GAME( 198?, m3cdash, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Cash Dash (Pcp) (MPU3)",GAME_FLAGS ) -GAMEL( 198?, m3loony, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Loonybin (Pcp) (MPU3)", GAME_FLAGS, layout_m3loony ) -GAMEL( 198?, m3online, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","On Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3online ) -GAMEL( 198?, m3rockpl, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Rock Pile (Pcp) (MPU3)", GAME_FLAGS, layout_m3rockpl ) -GAMEL( 198?, m3rollem, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Roll 'Em (Pcp) (MPU3)", GAME_FLAGS, layout_m3rollem ) -GAMEL( 198?, m3snaphp, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Snap Happy (Pcp) (MPU3)", GAME_FLAGS, layout_m3snaphp ) -GAMEL( 198?, m3spoof, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 1)", GAME_FLAGS, layout_m3spoof ) -GAMEL( 198?, m3spoofa, m3spoof, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 2)", GAME_FLAGS, layout_m3spoof ) -GAMEL( 198?, m3supspo, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 1)", GAME_FLAGS, layout_m3supspo ) -GAMEL( 198?, m3supspoa, m3supspo, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 2)", GAME_FLAGS, layout_m3supspo ) -GAMEL( 198?, m3toplin, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Top Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3toplin ) -GAME( 198?, m3wigwam, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Pcp","Wig Wam (Pcp) (MPU3)",GAME_FLAGS ) +// boot, does reel test, and runs +GAME( 198?, m3cdash, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Cash Dash (Pcp) (MPU3)",GAME_FLAGS ) +GAMEL( 198?, m3snaphp, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Snap Happy (Pcp) (MPU3)", GAME_FLAGS, layout_m3snaphp ) +GAMEL( 198?, m3spoof, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 1)", GAME_FLAGS, layout_m3spoof ) +GAMEL( 198?, m3spoofa, m3spoof, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Spoof (Pcp) (MPU3, set 2)", GAME_FLAGS, layout_m3spoof ) // bad dump +GAMEL( 198?, m3supspo, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 1)", GAME_FLAGS, layout_m3supspo ) +GAMEL( 198?, m3supspoa, m3supspo, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Super Spoof (Pcp) (MPU3, set 2)", GAME_FLAGS, layout_m3supspo ) + +// boots, reel error a +GAMEL( 198?, m3loony, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Loonybin (Pcp) (MPU3)", GAME_FLAGS, layout_m3loony ) + +// does nothing +GAMEL( 198?, m3online, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","On Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3online ) +GAMEL( 198?, m3toplin, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Top Line (Pcp) (MPU3)", GAME_FLAGS, layout_m3toplin ) + +// offset VFD, don't boot (act like m3supwin above) +GAMEL( 198?, m3rockpl, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Rock Pile (Pcp) (MPU3)", GAME_FLAGS, layout_m3rockpl ) +GAMEL( 198?, m3rollem, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Roll 'Em (Pcp) (MPU3)", GAME_FLAGS, layout_m3rollem ) +GAME( 198?, m3wigwam, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Pcp","Wig Wam (Pcp) (MPU3)",GAME_FLAGS ) + /* Mdm */ -GAMEL( 198?, m3gcrown, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Mdm","Golden Crowns (Mdm) (MPU3)", GAME_FLAGS, layout_m3gcrown ) -GAMEL( 198?, m3tfair, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Mdm","Tuppenny Fair (Mdm) (MPU3)", GAME_FLAGS, layout_m3tfair ) -GAME( 198?, m3wacky, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Mdm","Wacky Racer (Mdm) (MPU3)",GAME_FLAGS ) +// no protection, boots without testing reels? +GAMEL( 198?, m3gcrown, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Golden Crowns (Mdm) (MPU3)", GAME_FLAGS, layout_m3gcrown ) + +// reel A alarm +GAMEL( 198?, m3tfair, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Tuppenny Fair (Mdm) (MPU3)", GAME_FLAGS, layout_m3tfair ) +GAME( 198?, m3wacky, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Mdm","Wacky Racer (Mdm) (MPU3)",GAME_FLAGS ) /* VFS */ -GAMEL( 198?, m3oxo, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "VFS","Noughts 'n' Crosses (VFS) (MPU3)", GAME_FLAGS, layout_m3oxo ) -GAME( 198?, m3mremon, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "VFS","More Money (VFS) (MPU3)",GAME_FLAGS ) + +// no protection, boots without testing reels? +GAMEL( 198?, m3oxo, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "VFS","Noughts 'n' Crosses (VFS) (MPU3)", GAME_FLAGS, layout_m3oxo ) + +// shows 'initializing' then '.20' +GAME( 198?, m3mremon, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "VFS","More Money (VFS) (MPU3)",GAME_FLAGS ) /* Others */ -GAME( 198?, m3minmax, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Associated Leisure","Mini Max (Associated Leisure) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3scoop, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "Peter Simper","Scoop (Peter Simper, prototype?) (MPU3)",GAME_FLAGS ) -GAME( 198?, m3tlktwn, 0, mpu3base, mpu3, mpu3_state, init_m3hprvpr, ROT0, "<unknown>","Talk of the Town (MPU3?)",GAME_FLAGS ) +GAME( 198?, m3minmax, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Associated Leisure","Mini Max (Associated Leisure) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3scoop, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Peter Simper","Scoop (Peter Simper, prototype?) (MPU3)",GAME_FLAGS ) +GAME( 198?, m3tlktwn, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "<unknown>","Talk of the Town (MPU3?)",GAME_FLAGS ) + +// no protection +GAME( 198?, m3rolla, 0, mpu3base, mpu3, mpu3_state, init_mpu3, ROT0, "Nationwide Group","Rollamatic 5-Line Special (MPU3)", GAME_FLAGS ) // or 5-Line Special Rollamatic on the glass, using the title from the ROM diff --git a/src/mame/barcrest/mpu4_characteriser_pal.cpp b/src/mame/barcrest/mpu4_characteriser_pal.cpp index a57e29e0076..197f5da46d5 100644 --- a/src/mame/barcrest/mpu4_characteriser_pal.cpp +++ b/src/mame/barcrest/mpu4_characteriser_pal.cpp @@ -45,6 +45,7 @@ mpu4_characteriser_pal::mpu4_characteriser_pal(const machine_config &mconfig, de m_current_chr_table(nullptr), m_prot_col(0), m_cpu(*this, finder_base::DUMMY_TAG), + m_allow_6800_cheat(false), m_allow_6809_cheat(false), m_allow_68k_cheat(false), m_current_lamp_table(nullptr), @@ -177,12 +178,21 @@ void mpu4_characteriser_pal::write(offs_t offset, uint8_t data) uint8_t mpu4_characteriser_pal::protection_r() { - if (m_allow_6809_cheat || m_allow_68k_cheat) + if (m_allow_6800_cheat || m_allow_6809_cheat || m_allow_68k_cheat) { uint8_t ret = 0x00; - if (m_allow_6809_cheat) + + // the basic forms for many of these protection checks can be cheated quite easily + if (m_allow_6800_cheat) + { + // MPU3 + int addr = m_cpu->state_int(M6800_X); + ret = m_cpu->space(AS_PROGRAM).read_byte(addr+1); + logerror("%s: Characteriser protection_r WITH 6800 CHEAT (col is %02x returning %02x from addr %04x)\n", machine().describe_context(), m_prot_col, ret, addr); + } + else if (m_allow_6809_cheat) { - /* a cheat ... many early games use a standard check */ + // MPU4 (lamp scrambling where used not handled) int addr = m_cpu->state_int(M6809_X); if ((addr >= 0x800) && (addr <= 0xfff)) return 0x00; // prevent recursion, only care about ram/rom areas for this cheat. @@ -191,6 +201,7 @@ uint8_t mpu4_characteriser_pal::protection_r() } else if (m_allow_68k_cheat) { + // MPU4 Video (question decrambling where used not handled) ret = m_cpu->state_int(M68K_D0) & 0xff; logerror("%s: Characteriser protection_r WITH 68000 CHEAT (col is %02x returning %02x)\n", machine().describe_context(), m_prot_col, ret); } diff --git a/src/mame/barcrest/mpu4_characteriser_pal.h b/src/mame/barcrest/mpu4_characteriser_pal.h index f0570d0c92d..ea9e3b5a816 100644 --- a/src/mame/barcrest/mpu4_characteriser_pal.h +++ b/src/mame/barcrest/mpu4_characteriser_pal.h @@ -6,6 +6,7 @@ #pragma once +#include "cpu/m6800/m6800.h" #include "cpu/m6809/m6809.h" #include "cpu/m68000/m68000.h" @@ -32,6 +33,11 @@ public: m_current_chr_table = table; } + void set_allow_6800_cheat(bool allow) + { + m_allow_6800_cheat = allow; + } + void set_allow_6809_cheat(bool allow) { m_allow_6809_cheat = allow; @@ -1412,6 +1418,7 @@ private: optional_device<cpu_device> m_cpu; // needed for some of the protection 'cheats' + bool m_allow_6800_cheat; bool m_allow_6809_cheat; bool m_allow_68k_cheat; diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 70ac19efb35..5045c1dffc1 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -24473,7 +24473,6 @@ m3magrp // Magic Replay (Barcrest) m3minmax // Mini Max (Associated Leisure) m3mremon // More Money (VFS) m3nnice // Naughty But Nice (Barcrest) -m3nudge // Nudges Unlimited (Barcrest) m3oddson // Odds On (Barcrest) m3online // On Line (Pcp) m3optunl // Options Unlimited (Barcrest) @@ -24515,7 +24514,6 @@ m3tst // MPU3 Unit Test (Program 5) (Barcrest) m3wacky // Wacky Racer (Mdm) m3wigwam // Wig Wam (Pcp) m3winagn // Win-A-Gain (Bwb) -m3winagna // m3winagnb // m3winstr // Winstrike (Bwb) m3winstra // Winstrike (Barcrest) |