summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <salese_corp_ltd@email.it>2016-12-25 03:05:19 +0100
committer angelosa <salese_corp_ltd@email.it>2016-12-25 03:05:36 +0100
commit0c9e11b5ae11e6f99be4de9db48972101a84a6c9 (patch)
tree1e50debac849748757ea74595529a898043e4229
parent2acac39d91874f3a6a9e7eddb4bcf9a6dba67351 (diff)
Fix MT #00101
-rw-r--r--src/mame/drivers/kaneko16.cpp125
-rw-r--r--src/mame/includes/kaneko16.h5
2 files changed, 81 insertions, 49 deletions
diff --git a/src/mame/drivers/kaneko16.cpp b/src/mame/drivers/kaneko16.cpp
index 6785cf16771..6f08c3d4d28 100644
--- a/src/mame/drivers/kaneko16.cpp
+++ b/src/mame/drivers/kaneko16.cpp
@@ -2518,11 +2518,83 @@ DRIVER_INIT_MEMBER( kaneko16_state, kaneko16 )
kaneko16_unscramble_tiles("gfx3");
}
-DRIVER_INIT_MEMBER( kaneko16_berlwall_state, berlwall )
+/*
+
+berlwallt original bug ?
+
+info from SebV:
+
+After about level 5 or so, if you insert a coin when the continue screen
+pops up, an error message "Copy Board" pops up.
+----------------------------------------
+Happened to me when player dies, at level 4.
+The message is not written in ROM, its sprite ram address is (always?)
+$30fd40
+Routine $337d2 writes it (and routine $5c8c erases it)
+The 'COPY BOARD!' message in stored in ROM directly as sprite number
+($1cfa8)
+
+$20288a : seems to contain the level number (initialized to 2 (?) when a
+game is started, and is incremented by 1 once a level is finished)
+
+01CF3E: move.b $20288a.l, D0
+01CF44: cmpi.b #$d, D0
+01CF48: bcs 1cf76 ; branch not taken -=> 'COPY BOARD!'
+01CF4A: movem.l D0/A0-A2, -(A7)
+01CF4E: movea.l A0, A1
+01CF50: lea ($4c,PC), A0; ($1cf9e)
+01CF54: nop
+01CF56: lea ($a,A0), A0 ; A0 = $1cfa8 = 'COPY BOARD!'
+01CF5A: lea $30e064.l, A1
+01CF60: lea (-$64,A1), A1
+01CF64: lea ($1d40,A1), A1
+01CF68: move.b #$80, D1
+01CF6C: jsr $33776.l ; display routine
+01CF72: movem.l (A7)+, D0/A0-A2
+01CF76:
+
+berlwall levels: 1-1,2,3(anim),...
+berlwallt levels: 1-1(anim)2-1/2/3/4/5(anim)3-1/2/3/4/5(anim)4-1(*)
+
+note: berlwall may be genuine while berlwallt may be bootleg! because
+stage 1-1 of berlwallt is stage 1-3 of berlwall, and berlwall has
+explanation ingame.
+(TAFA flyers exist for both berlwall and berlwallt player graphics)
+--------------------------------------------------------------------------------
+*/
+// TODO: this is certainly a protection issue, the level number variable can go up to 0x2f, which is way bigger than 0xd.
+// Sprite DMA decryption? @see berlwall_spriteram_r
+void kaneko16_berlwall_state::patch_protection(uint32_t bra_offset,uint16_t bra_value,uint16_t checksum)
+{
+ uint16_t *ROM = (uint16_t *)memregion("maincpu")->base();
+
+ ROM[bra_offset/2] = bra_value;
+ ROM[0x3fffe/2] = checksum;
+}
+
+DRIVER_INIT_MEMBER(kaneko16_berlwall_state, berlwall_common)
{
kaneko16_unscramble_tiles("gfx2");
}
+DRIVER_INIT_MEMBER( kaneko16_berlwall_state, berlwall )
+{
+ DRIVER_INIT_CALL(berlwall_common);
+ patch_protection(0x1a3ea,0x602c,0xc40d);
+}
+
+DRIVER_INIT_MEMBER( kaneko16_berlwall_state, berlwallt )
+{
+ DRIVER_INIT_CALL(berlwall_common);
+ patch_protection(0x1cf48,0x602c,0xaed4);
+}
+
+DRIVER_INIT_MEMBER( kaneko16_berlwall_state, berlwallk )
+{
+ DRIVER_INIT_CALL(berlwall_common);
+ patch_protection(0x1ceb0,0x602c,0x8364);
+}
+
DRIVER_INIT_MEMBER( kaneko16_state, samplebank )
{
kaneko16_unscramble_tiles("gfx2");
@@ -2738,51 +2810,6 @@ ROM_START( berlwall )
ROM_LOAD( "bw_u54.u54", 0x400, 0x0117, NO_DUMP)
ROM_END
-
-/*
-berlwallt original bug ?
-
-info from SebV:
-
-After about level 5 or so, if you insert a coin when the continue screen
-pops up, an error message "Copy Board" pops up.
-----------------------------------------
-Happened to me when player dies, at level 4.
-The message is not written in ROM, its sprite ram address is (always?)
-$30fd40
-Routine $337d2 writes it (and routine $5c8c erases it)
-The 'COPY BOARD!' message in stored in ROM directly as sprite number
-($1cfa8)
-
-$20288a : seems to contain the level number (initialized to 2 (?) when a
-game is started, and is incremented by 1 once a level is finished)
-
-01CF3E: move.b $20288a.l, D0
-01CF44: cmpi.b #$d, D0
-01CF48: bcs 1cf76 ; branch not taken -=> 'COPY BOARD!'
-01CF4A: movem.l D0/A0-A2, -(A7)
-01CF4E: movea.l A0, A1
-01CF50: lea ($4c,PC), A0; ($1cf9e)
-01CF54: nop
-01CF56: lea ($a,A0), A0 ; A0 = $1cfa8 = 'COPY BOARD!'
-01CF5A: lea $30e064.l, A1
-01CF60: lea (-$64,A1), A1
-01CF64: lea ($1d40,A1), A1
-01CF68: move.b #$80, D1
-01CF6C: jsr $33776.l ; display routine
-01CF72: movem.l (A7)+, D0/A0-A2
-01CF76:
-
-berlwall levels: 1-1,2,3(anim),...
-berlwallt levels: 1-1(anim)2-1/2/3/4/5(anim)3-1/2/3/4/5(anim)4-1(*)
-
-note: berlwall may be genuine while berlwallt may be bootleg! because
-stage 1-1 of berlwallt is stage 1-3 of berlwall, and berlwall has
-explanation ingame.
-(TAFA flyers exist for both berlwall and berlwallt player graphics)
---------------------------------------------------------------------------------
-*/
-
ROM_START( berlwallt )
ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "bw100a.u23", 0x000000, 0x020000, CRC(e6bcb4eb) SHA1(220b8fddc79230b4f6a8cf33e1035355c485e8d1) )
@@ -4441,9 +4468,9 @@ DRIVER_INIT_MEMBER( kaneko16_shogwarr_state, brapboys )
***************************************************************************/
GAME( 1991, berlwall, 0, berlwall, berlwall, kaneko16_berlwall_state, berlwall, ROT0, "Kaneko", "The Berlin Wall", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, berlwallt,berlwall, berlwall, berlwallt,kaneko16_berlwall_state, berlwall, ROT0, "Kaneko", "The Berlin Wall (bootleg?)", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, berlwallk,berlwall, berlwall, berlwallk,kaneko16_berlwall_state, berlwall, ROT0, "Kaneko (Inter license)", "The Berlin Wall (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, packbang, 0, berlwall, packbang, kaneko16_berlwall_state, berlwall, ROT90, "Kaneko", "Pack'n Bang Bang (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // priorities between stages?
+GAME( 1991, berlwallt,berlwall, berlwall, berlwallt,kaneko16_berlwall_state, berlwallt, ROT0, "Kaneko", "The Berlin Wall (bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, berlwallk,berlwall, berlwall, berlwallk,kaneko16_berlwall_state, berlwallk, ROT0, "Kaneko (Inter license)", "The Berlin Wall (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, packbang, 0, berlwall, packbang, kaneko16_berlwall_state, berlwall_common, ROT90, "Kaneko", "Pack'n Bang Bang (prototype)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) // priorities between stages?
GAME( 1991, mgcrystl, 0, mgcrystl, mgcrystl, kaneko16_state, kaneko16, ROT0, "Kaneko", "Magical Crystals (World, 92/01/10)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, mgcrystlo,mgcrystl, mgcrystl, mgcrystl, kaneko16_state, kaneko16, ROT0, "Kaneko", "Magical Crystals (World, 91/12/10)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/kaneko16.h b/src/mame/includes/kaneko16.h
index d0214282879..c8eb487869f 100644
--- a/src/mame/includes/kaneko16.h
+++ b/src/mame/includes/kaneko16.h
@@ -164,10 +164,15 @@ public:
DECLARE_WRITE16_MEMBER(berlwall_spriteregs_w);
DECLARE_DRIVER_INIT(berlwall);
+ DECLARE_DRIVER_INIT(berlwallk);
+ DECLARE_DRIVER_INIT(berlwallt);
+ DECLARE_DRIVER_INIT(berlwall_common);
DECLARE_PALETTE_INIT(berlwall);
DECLARE_VIDEO_START(berlwall);
uint32_t screen_update_berlwall(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void kaneko16_render_15bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ void patch_protection(uint32_t bra_offset,uint16_t bra_value,uint16_t checksum);
};
class kaneko16_shogwarr_state : public kaneko16_state