summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2018-01-10 03:13:03 +1100
committer Robbbert <Robbbert@users.noreply.github.com>2018-01-10 03:13:03 +1100
commitb66737f7bea07aa280c2fe5d5ac2703dc5f3fcfa (patch)
tree7c712ce21c6797bf0c0bd71649189cc10242369a
parentf80b76c3913ebd75a0183fe8fe509fe91bf379cf (diff)
Maketrax : simulate protection [iq_132, Robbbert]
-rw-r--r--src/mame/drivers/pacman.cpp89
-rw-r--r--src/mame/includes/pacman.h42
2 files changed, 82 insertions, 49 deletions
diff --git a/src/mame/drivers/pacman.cpp b/src/mame/drivers/pacman.cpp
index 4e376f3b777..462444fd24f 100644
--- a/src/mame/drivers/pacman.cpp
+++ b/src/mame/drivers/pacman.cpp
@@ -395,7 +395,12 @@ MACHINE_RESET_MEMBER(pacman_state,superabc)
superabc_bank_w(m_maincpu->space(AS_PROGRAM), 0, 0);
}
-
+MACHINE_RESET_MEMBER(pacman_state,maketrax)
+{
+ m_maketrax_counter = 0;
+ m_maketrax_offset = 0;
+ m_maketrax_disable_protection = 0;
+}
/*************************************
*
@@ -575,13 +580,44 @@ READ8_MEMBER(pacman_state::alibaba_mystery_2_r)
*
*************************************/
-READ8_MEMBER(pacman_state::maketrax_special_port2_r)
+WRITE8_MEMBER(pacman_state::maketrax_protection_w)
{
- int data = ioport("DSW1")->read();
- int pc = m_maincpu->pcbase();
+ if (data == 0) // disable protection / reset?
+ {
+ m_maketrax_counter = 0;
+ m_maketrax_offset = 0;
+ m_maketrax_disable_protection = 1;
+ return;
+ }
- if ((pc == 0x1973) || (pc == 0x2389)) return data | 0x40;
+ if (data == 1)
+ {
+ m_maketrax_disable_protection = 0;
+ m_maketrax_counter++;
+ if (m_maketrax_counter == 0x3c)
+ {
+ m_maketrax_counter = 0;
+ m_maketrax_offset++;
+
+ if (m_maketrax_offset == 0x1e)
+ m_maketrax_offset = 0;
+ }
+ }
+}
+
+READ8_MEMBER(pacman_state::maketrax_special_port2_r)
+{
+ const uint8_t protdata[0x1e] = { // table at $ebd (odd entries)
+ 0x00, 0xc0, 0x00, 0x40, 0xc0, 0x40, 0x00, 0xc0, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0xc0, 0x40,
+ 0x00, 0xc0, 0x00, 0x40, 0x00, 0xc0, 0x00, 0x40, 0xc0, 0x40, 0x00, 0xc0, 0x00, 0x40
+ };
+
+ if (m_maketrax_disable_protection == 0)
+ return protdata[m_maketrax_offset];
+
+ uint8_t data = ioport("DSW1")->read() & 0x3f;
+
switch (offset)
{
case 0x01:
@@ -598,11 +634,13 @@ READ8_MEMBER(pacman_state::maketrax_special_port2_r)
READ8_MEMBER(pacman_state::maketrax_special_port3_r)
{
- int pc = m_maincpu->pcbase();
-
- if (pc == 0x040e) return 0x20;
-
- if ((pc == 0x115e) || (pc == 0x3ae2)) return 0x00;
+ const uint8_t protdata[0x1e] = { // table at $ebd (even entries)
+ 0x1f, 0x3f, 0x2f, 0x2f, 0x0f, 0x0f, 0x0f, 0x3f, 0x0f, 0x0f, 0x1c, 0x3c, 0x2c, 0x2c, 0x0c, 0x0c,
+ 0x0c, 0x3c, 0x0c, 0x0c, 0x11, 0x31, 0x21, 0x21, 0x01, 0x01, 0x01, 0x31, 0x01, 0x01
+ };
+
+ if (m_maketrax_disable_protection == 0)
+ return protdata[m_maketrax_offset];
switch (offset)
{
@@ -3512,7 +3550,11 @@ static MACHINE_CONFIG_START( pacman )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( maketrax, pacman )
- MCFG_CPU_MODIFY("maincpu")
+ MCFG_MACHINE_RESET_OVERRIDE(pacman_state,maketrax)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( korosuke, pacman )
+ MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_DECRYPTED_OPCODES_MAP(patched_opcodes_map)
MCFG_DEVICE_MODIFY("mainlatch") // 8K on original boards
@@ -6813,33 +6855,12 @@ ROM_END
*
*************************************/
-void pacman_state::maketrax_rom_decode()
-{
- uint8_t *rom = memregion("maincpu")->base();
-
- /* patch protection using a copy of the opcodes so ROM checksum */
- /* tests will not fail */
-
- memcpy(m_patched_opcodes,rom,0x4000);
-
- m_patched_opcodes[0x0415] = 0xc9;
- m_patched_opcodes[0x1978] = 0x18;
- m_patched_opcodes[0x238e] = 0xc9;
- m_patched_opcodes[0x3ae5] = 0xe6;
- m_patched_opcodes[0x3ae7] = 0x00;
- m_patched_opcodes[0x3ae8] = 0xc9;
- m_patched_opcodes[0x3aed] = 0x86;
- m_patched_opcodes[0x3aee] = 0xc0;
- m_patched_opcodes[0x3aef] = 0xb0;
-}
-
DRIVER_INIT_MEMBER(pacman_state,maketrax)
{
/* set up protection handlers */
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x5004, 0x5004, write8_delegate(FUNC(pacman_state::maketrax_protection_w),this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x5080, 0x50bf, read8_delegate(FUNC(pacman_state::maketrax_special_port2_r),this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x50c0, 0x50ff, read8_delegate(FUNC(pacman_state::maketrax_special_port3_r),this));
-
- maketrax_rom_decode();
}
void pacman_state::korosuke_rom_decode()
@@ -7323,7 +7344,7 @@ GAME( 1981, crush4, crush, pacman, maketrax, pacman_state, eyes, ROT
GAME( 1981, crush5, crush, crush4, crush4, pacman_state, 0, ROT90, "Alpha Denshi Co. / Kural TWT", "Crush Roller (set 5)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, maketrax, crush, maketrax, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, maketrxb, crush, maketrax, maketrax, pacman_state, maketrax, ROT270, "Alpha Denshi Co. / Kural (Williams license)", "Make Trax (US set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1981, korosuke, crush, maketrax, korosuke, pacman_state, korosuke, ROT90, "Alpha Denshi Co. / Kural Electric, Ltd.", "Korosuke Roller (Japan)", MACHINE_SUPPORTS_SAVE ) // ADK considers it a sequel?
+GAME( 1981, korosuke, crush, korosuke, korosuke, pacman_state, korosuke, ROT90, "Alpha Denshi Co. / Kural Electric, Ltd.", "Korosuke Roller (Japan)", MACHINE_SUPPORTS_SAVE ) // ADK considers it a sequel?
GAME( 1981, crushrlf, crush, pacman, maketrax, pacman_state, 0, ROT90, "bootleg", "Crush Roller (Famare SA PCB)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, crushbl, crush, pacman, maketrax, pacman_state, 0, ROT90, "bootleg", "Crush Roller (bootleg set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, crushbl2, crush, maketrax, mbrush, pacman_state, maketrax, ROT90, "bootleg", "Crush Roller (bootleg set 2)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/pacman.h b/src/mame/includes/pacman.h
index 7f296581efa..e8c53755852 100644
--- a/src/mame/includes/pacman.h
+++ b/src/mame/includes/pacman.h
@@ -13,23 +13,25 @@ class pacman_state : public driver_device
{
public:
pacman_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_namco_sound(*this, "namco"),
- m_watchdog(*this, "watchdog"),
- m_spriteram(*this, "spriteram"),
- m_spriteram2(*this, "spriteram2"),
- m_s2650_spriteram(*this, "s2650_spriteram"),
- m_videoram(*this, "videoram"),
- m_colorram(*this, "colorram"),
- m_s2650games_tileram(*this, "s2650_tileram"),
- m_rocktrv2_prot_data(*this, "rocktrv2_prot"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_patched_opcodes(*this, "patched_opcodes")
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_namco_sound(*this, "namco")
+ , m_watchdog(*this, "watchdog")
+ , m_spriteram(*this, "spriteram")
+ , m_spriteram2(*this, "spriteram2")
+ , m_s2650_spriteram(*this, "s2650_spriteram")
+ , m_videoram(*this, "videoram")
+ , m_colorram(*this, "colorram")
+ , m_s2650games_tileram(*this, "s2650_tileram")
+ , m_rocktrv2_prot_data(*this, "rocktrv2_prot")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_patched_opcodes(*this, "patched_opcodes")
{ }
required_device<cpu_device> m_maincpu;
+
+private:
optional_device<namco_device> m_namco_sound;
required_device<watchdog_timer_device> m_watchdog;
optional_shared_ptr<uint8_t> m_spriteram;
@@ -57,6 +59,11 @@ public:
uint8_t m_bgpriority;
int m_xoffsethack;
uint8_t m_inv_spr;
+ uint8_t m_maketrax_counter;
+ uint8_t m_maketrax_offset;
+ int m_maketrax_disable_protection;
+
+public:
uint8_t m_irq_mask;
DECLARE_WRITE8_MEMBER(pacman_interrupt_vector_w);
@@ -69,6 +76,7 @@ public:
DECLARE_WRITE8_MEMBER(alibaba_sound_w);
DECLARE_READ8_MEMBER(alibaba_mystery_1_r);
DECLARE_READ8_MEMBER(alibaba_mystery_2_r);
+ DECLARE_WRITE8_MEMBER(maketrax_protection_w);
DECLARE_READ8_MEMBER(maketrax_special_port2_r);
DECLARE_READ8_MEMBER(maketrax_special_port3_r);
DECLARE_READ8_MEMBER(korosuke_special_port2_r);
@@ -145,6 +153,7 @@ public:
DECLARE_VIDEO_START(s2650games);
DECLARE_MACHINE_RESET(mschamp);
DECLARE_MACHINE_RESET(superabc);
+ DECLARE_MACHINE_RESET(maketrax);
DECLARE_VIDEO_START(pengo);
DECLARE_VIDEO_START(jrpacman);
uint32_t screen_update_pacman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -152,13 +161,15 @@ public:
INTERRUPT_GEN_MEMBER(vblank_irq);
INTERRUPT_GEN_MEMBER(vblank_nmi);
INTERRUPT_GEN_MEMBER(s2650_interrupt);
+
+private:
void init_save_state();
void jrpacman_mark_tile_dirty( int offset );
- void maketrax_rom_decode();
void korosuke_rom_decode();
void eyes_decode(uint8_t *data);
void mspacman_install_patches(uint8_t *ROM);
+public:
// epos.c
DECLARE_READ8_MEMBER(epos_decryption_w);
DECLARE_MACHINE_START(theglobp);
@@ -168,6 +179,7 @@ public:
DECLARE_MACHINE_START(acitya);
DECLARE_MACHINE_RESET(acitya);
+private:
// pacplus.c
uint8_t pacplus_decrypt(int addr, uint8_t e);
void pacplus_decode();