2
#include "includes/cclimber.h"
4
/* set to 1 to fix protection check after bonus round (see notes in pacman.c driver) */
7
static void cclimber_decode(running_machine &machine, const UINT8 convtable[8][16])
9
address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM);
10
UINT8 *rom = machine.region("maincpu")->base();
11
UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x10000);
14
space->set_decrypted_region(0x0000, 0xffff, decrypt);
16
for (A = 0x0000;A < 0x10000;A++)
21
/* pick the translation table from bit 0 of the address */
22
/* and from bits 1 7 of the source data */
23
i = (A & 1) | (src & 0x02) | ((src & 0x80) >> 5);
25
/* pick the offset in the table from bits 0 2 4 6 of the source data */
26
j = (src & 0x01) | ((src & 0x04) >> 1) | ((src & 0x10) >> 2) | ((src & 0x40) >> 3);
28
/* decode the opcodes */
29
decrypt[A] = (src & 0xaa) | convtable[i][j];
33
DRIVER_INIT( cclimber )
35
static const UINT8 convtable[8][16] =
37
/* -1 marks spots which are unused and therefore unknown */
38
{ 0x44,0x14,0x54,0x10,0x11,0x41,0x05,0x50,0x51,0x00,0x40,0x55,0x45,0x04,0x01,0x15 },
39
{ 0x44,0x10,0x15,0x55,0x00,0x41,0x40,0x51,0x14,0x45,0x11,0x50,0x01,0x54,0x04,0x05 },
40
{ 0x45,0x10,0x11,0x44,0x05,0x50,0x51,0x04,0x41,0x14,0x15,0x40,0x01,0x54,0x55,0x00 },
41
{ 0x04,0x51,0x45,0x00,0x44,0x10, -1,0x55,0x11,0x54,0x50,0x40,0x05, -1,0x14,0x01 },
42
{ 0x54,0x51,0x15,0x45,0x44,0x01,0x11,0x41,0x04,0x55,0x50, -1,0x00,0x10,0x40, -1 },
43
{ -1,0x54,0x14,0x50,0x51,0x01, -1,0x40,0x41,0x10,0x00,0x55,0x05,0x44,0x11,0x45 },
44
{ 0x51,0x04,0x10, -1,0x50,0x40,0x00, -1,0x41,0x01,0x05,0x15,0x11,0x14,0x44,0x54 },
45
{ -1, -1,0x54,0x01,0x15,0x40,0x45,0x41,0x51,0x04,0x50,0x05,0x11,0x44,0x10,0x14 }
48
cclimber_decode(machine, convtable);
51
DRIVER_INIT( cclimberj )
53
static const UINT8 convtable[8][16] =
55
{ 0x41,0x54,0x51,0x14,0x05,0x10,0x01,0x55,0x44,0x11,0x00,0x50,0x15,0x40,0x04,0x45 },
56
{ 0x50,0x11,0x40,0x55,0x51,0x14,0x45,0x04,0x54,0x15,0x10,0x05,0x44,0x01,0x00,0x41 },
57
{ 0x44,0x11,0x00,0x50,0x41,0x54,0x04,0x14,0x15,0x40,0x51,0x55,0x05,0x10,0x01,0x45 },
58
{ 0x10,0x50,0x54,0x55,0x01,0x44,0x40,0x04,0x14,0x11,0x00,0x41,0x45,0x15,0x51,0x05 },
59
{ 0x14,0x41,0x01,0x44,0x04,0x50,0x51,0x45,0x11,0x40,0x54,0x15,0x10,0x00,0x55,0x05 },
60
{ 0x01,0x05,0x41,0x45,0x54,0x50,0x55,0x10,0x11,0x15,0x51,0x14,0x44,0x40,0x04,0x00 },
61
{ 0x05,0x55,0x00,0x50,0x11,0x40,0x54,0x14,0x45,0x51,0x10,0x04,0x44,0x01,0x41,0x15 },
62
{ 0x55,0x50,0x15,0x10,0x01,0x04,0x41,0x44,0x45,0x40,0x05,0x00,0x11,0x14,0x51,0x54 },
65
cclimber_decode(machine, convtable);
71
UINT8 *rom = machine.region("maincpu")->base();
73
for (A = 0x0000;A < 0x6000;A++) /* all the program ROMs are encrypted */
75
rom[A] = rom[A] ^ 0xf0;
80
static void cannonb_patch(running_machine &machine)
82
UINT8 *rom = machine.region("maincpu")->base();
91
DRIVER_INIT( cannonb )
94
UINT8 *rom = machine.region("maincpu")->base();
96
for (A = 0x0000;A < 0x1000;A++) /* only first ROM is encrypted */
100
static const UINT8 xor_tab[4] ={0x92, 0x82, 0x12, 0x10};
102
src = rom[A+0x10000];
104
i = ((A&0x200)>>8) | ((A&0x80)>>7);
112
cannonb_patch(machine);
116
DRIVER_INIT( cannonb2 )
119
cannonb_patch(machine);