📄 cclimber.c
字号:
{
8,8, /* 8*8 characters */
256, /* 256 characters */
2, /* 2 bits per pixel */
{ 0, 256*8*8 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 }, /* pretty straightforward layout */
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 consecutive bytes */
};
static struct GfxLayout spritelayout =
{
16,16, /* 16*16 sprites */
128, /* 128 sprites (64 in Crazy Climber) */
2, /* 2 bits per pixel */
{ 0, 128*16*16 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7, /* pretty straightforward layout */
8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 },
32*8 /* every sprite takes 32 consecutive bytes */
};
static struct GfxDecodeInfo gfxdecodeinfo[] =
{
{ 1, 0x0000, &charlayout, 0, 16 }, /* char set #1 */
{ 1, 0x2000, &charlayout, 0, 16 }, /* char set #2 */
{ 1, 0x4000, &bscharlayout, 16*4, 8 }, /* big sprite char set */
{ 1, 0x0000, &spritelayout, 0, 16 }, /* sprite set #1 */
{ 1, 0x2000, &spritelayout, 0, 16 }, /* sprite set #2 */
{ -1 } /* end of array */
};
/* the PROMs of this bootleg are a mix of Crazy Climber and Crazy Kong */
static unsigned char wrong_color_prom[] =
{
/* char palette */
0x00,0x79,0x04,0x87,0x00,0xB7,0xFF,0x5F,0x00,0xC0,0xE8,0xF4,0x00,0x3F,0x04,0x38,
0x00,0x0D,0x7A,0xB7,0x00,0x07,0x26,0x02,0x00,0x27,0x16,0x30,0x00,0xB7,0xF4,0x0C,
0x00,0x4F,0xF6,0x24,0x00,0xB6,0xFF,0x5F,0x00,0x33,0x00,0xB7,0x00,0x66,0x00,0x3A,
0x00,0xC0,0x3F,0xB7,0x00,0x20,0xF4,0x16,0x00,0xFF,0x7F,0x87,0x00,0xB6,0xF4,0xC0,
/* bigsprite palette */
0x00,0xFF,0x18,0xC0,0x00,0xFF,0xC6,0x8F,0x00,0x0F,0xFF,0x1F,0x00,0xFF,0xC0,0x67,
0x00,0x47,0x7F,0x88,0x00,0x88,0x47,0x7F,0x00,0x7F,0x88,0x47,0x00,0x40,0x08,0xFF
};
static struct AY8910interface ay8910_interface =
{
1, /* 1 chip */
1536000, /* 1.536 MHz */
{ 255 },
{ 0 },
{ 0 },
{ cclimber_portA_w },
{ 0 }
};
static struct CustomSound_interface custom_interface =
{
cclimber_sh_start,
cclimber_sh_stop,
0
};
static struct MachineDriver machine_driver =
{
/* basic machine hardware */
{
{
CPU_Z80,
3072000, /* 3.072 MHz */
0,
readmem,writemem,readport,writeport,
nmi_interrupt,1
}
},
60, DEFAULT_60HZ_VBLANK_DURATION, /* frames per second, vblank duration */
1, /* single CPU, no need for interleaving */
cclimber_init_machine,
/* video hardware */
32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
gfxdecodeinfo,
96,16*4+8*4,
cclimber_vh_convert_color_prom,
VIDEO_TYPE_RASTER,
0,
cclimber_vh_start,
cclimber_vh_stop,
cclimber_vh_screenrefresh,
/* sound hardware */
0,0,0,0,
{
{
SOUND_AY8910,
&ay8910_interface
},
{
SOUND_CUSTOM,
&custom_interface
}
}
};
/***************************************************************************
Game driver(s)
***************************************************************************/
ROM_START( cclimber_rom )
ROM_REGION(0x10000) /* 64k for code */
ROM_LOAD( "cc11", 0x0000, 0x1000, 0x217ec4ff )
ROM_LOAD( "cc10", 0x1000, 0x1000, 0xb3c26cef )
ROM_LOAD( "cc09", 0x2000, 0x1000, 0x6db0879c )
ROM_LOAD( "cc08", 0x3000, 0x1000, 0xf48c5fe3 )
ROM_LOAD( "cc07", 0x4000, 0x1000, 0x3e873baf )
ROM_REGION_DISPOSE(0x5000) /* temporary space for graphics (disposed after conversion) */
ROM_LOAD( "cc06", 0x0000, 0x0800, 0x481b64cc )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc04", 0x1000, 0x0800, 0x332347cb )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc05", 0x2000, 0x0800, 0x2c33b760 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc03", 0x3000, 0x0800, 0x4e4b3658 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc02", 0x4000, 0x0800, 0x14f3ecc9 )
ROM_LOAD( "cc01", 0x4800, 0x0800, 0x21c0f9fb )
ROM_REGION(0x60) /* color proms */
ROM_LOAD( "cclimber.pr1", 0x0000, 0x20, 0x751c3325 )
ROM_LOAD( "cclimber.pr2", 0x0020, 0x20, 0xab1940fa )
ROM_LOAD( "cclimber.pr3", 0x0040, 0x20, 0x71317756 )
ROM_REGION(0x2000) /* samples */
ROM_LOAD( "cc13", 0x0000, 0x1000, 0xe0042f75 )
ROM_LOAD( "cc12", 0x1000, 0x1000, 0x5da13aaa )
ROM_END
static void cclimber_decode(void)
{
/*
translation mask is layed out like this:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 <------A------> <------A------>
1 <------B------> <------B------>
2 <------A------> <------A------>
3 <------B------> <------B------>
4 <------C------> <------C------>
5 <------D------> <------D------>
6 <------C------> <------C------>
7 <------D------> <------D------>
8 <------E------> <------E------>
9 <------F------> <------F------>
a <------E------> <------E------>
b <------F------> <------F------>
c <------G------> <------G------>
d <------H------> <------H------>
e <------G------> <------G------>
f <------H------> <------H------>
Where <------A------> etc. are groups of 8 unrelated values.
therefore in the following table we only keep track of <--A-->, <--B--> etc.
*/
static const unsigned char xortable[2][64] =
{
/* -1 marks spots which are unused and therefore unknown */
{
0x44,0x15,0x45,0x11,0x50,0x15,0x15,0x41,
0x01,0x50,0x15,0x41,0x11,0x45,0x45,0x11,
0x11,0x41,0x01,0x55,0x04,0x10,0x51,0x05,
0x15,0x55,0x51,0x05,0x55,0x40,0x01,0x55,
0x54,0x50,0x51,0x05,0x11,0x40,0x14, -1,
0x54,0x10,0x40,0x51,0x05,0x54,0x14, -1,
0x44,0x14,0x01,0x40,0x14, -1,0x41,0x50,
0x50,0x41,0x41,0x45,0x14, -1,0x10,0x01
},
{
0x44,0x11,0x04,0x50,0x11,0x50,0x41,0x05,
0x10,0x50,0x54,0x01,0x54,0x44, -1,0x40,
0x54,0x04,0x51,0x15,0x55,0x15,0x14,0x05,
0x51,0x05,0x55, -1,0x50,0x50,0x40,0x54,
-1,0x55, -1, -1,0x10,0x55,0x50,0x04,
0x41,0x10,0x05,0x51, -1,0x55,0x51,0x54,
0x01,0x51,0x11,0x45,0x44,0x10,0x14,0x40,
0x55,0x15,0x41,0x15,0x45,0x10,0x44,0x41
}
};
int A;
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
for (A = 0x0000;A < 0x10000;A++)
{
int i,j;
unsigned char src;
src = RAM[A];
/* pick the translation table from bit 0 of the address */
i = A & 1;
/* pick the offset in the table from bits 012467 of the source data */
j = (src & 0x07) + ((src & 0x10) >> 1) + ((src & 0xc0) >> 2);
/* decode the opcodes */
ROM[A] = src ^ xortable[i][j];
}
}
ROM_START( ccjap_rom )
ROM_REGION(0x10000) /* 64k for code */
ROM_LOAD( "cc11j.bin", 0x0000, 0x1000, 0x89783959 )
ROM_LOAD( "cc10j.bin", 0x1000, 0x1000, 0x14eda506 )
ROM_LOAD( "cc09j.bin", 0x2000, 0x1000, 0x26489069 )
ROM_LOAD( "cc08j.bin", 0x3000, 0x1000, 0xb33c96f8 )
ROM_LOAD( "cc07j.bin", 0x4000, 0x1000, 0xfbc9626c )
ROM_REGION_DISPOSE(0x5000) /* temporary space for graphics (disposed after conversion) */
ROM_LOAD( "cc06", 0x0000, 0x0800, 0x481b64cc )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc04", 0x1000, 0x0800, 0x332347cb )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc05", 0x2000, 0x0800, 0x2c33b760 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc03", 0x3000, 0x0800, 0x4e4b3658 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "cc02", 0x4000, 0x0800, 0x14f3ecc9 )
ROM_LOAD( "cc01", 0x4800, 0x0800, 0x21c0f9fb )
ROM_REGION(0x60) /* color proms */
ROM_LOAD( "cclimber.pr1", 0x0000, 0x20, 0x751c3325 )
ROM_LOAD( "cclimber.pr2", 0x0020, 0x20, 0xab1940fa )
ROM_LOAD( "cclimber.pr3", 0x0040, 0x20, 0x71317756 )
ROM_REGION(0x2000) /* samples */
ROM_LOAD( "cc13j.bin", 0x0000, 0x1000, 0x5f0bcdfb )
ROM_LOAD( "cc12j.bin", 0x1000, 0x1000, 0x9003ffbd )
ROM_END
ROM_START( ccboot_rom )
ROM_REGION(0x10000) /* 64k for code */
ROM_LOAD( "m11.bin", 0x0000, 0x1000, 0x5efbe180 )
ROM_LOAD( "m10.bin", 0x1000, 0x1000, 0xbe2748c7 )
ROM_LOAD( "cc09j.bin", 0x2000, 0x1000, 0x26489069 )
ROM_LOAD( "m08.bin", 0x3000, 0x1000, 0xe3c542d6 )
ROM_LOAD( "cc07j.bin", 0x4000, 0x1000, 0xfbc9626c )
ROM_REGION_DISPOSE(0x5000) /* temporary space for graphics (disposed after conversion) */
ROM_LOAD( "cc06", 0x0000, 0x0800, 0x481b64cc )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "m04.bin", 0x1000, 0x0800, 0x6fb80538 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "m05.bin", 0x2000, 0x0800, 0x056af36b )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "m03.bin", 0x3000, 0x0800, 0x67127253 )
/* empty hole - Crazy Kong has an additional ROM here */
ROM_LOAD( "m02.bin", 0x4000, 0x0800, 0x7f4877de )
ROM_LOAD( "m01.bin", 0x4800, 0x0800, 0x49fab908 )
ROM_REGION(0x60) /* color proms */
ROM_LOAD( "cclimber.pr1", 0x0000, 0x20, 0x751c3325 )
ROM_LOAD( "cclimber.pr2", 0x0020, 0x20, 0xab1940fa )
ROM_LOAD( "cclimber.pr3", 0x0040, 0x20, 0x71317756 )
ROM_REGION(0x2000) /* samples */
ROM_LOAD( "cc13j.bin", 0x0000, 0x1000, 0x5f0bcdfb )
ROM_LOAD( "cc12j.bin", 0x1000, 0x1000, 0x9003ffbd )
ROM_END
static void ccjap_decode(void)
{
/*
translation mask is layed out like this:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 <------A------> <------A------>
1 <------B------> <------B------>
2 <------A------> <------A------>
3 <------B------> <------B------>
4 <------C------> <------C------>
5 <------D------> <------D------>
6 <------C------> <------C------>
7 <------D------> <------D------>
8 <------E------> <------E------>
9 <------F------> <------F------>
a <------E------> <------E------>
b <------F------> <------F------>
c <------G------> <------G------>
d <------H------> <------H------>
e <------G------> <------G------>
f <------H------> <------H------>
Where <------A------> etc. are groups of 8 unrelated values.
therefore in the following table we only keep track of <--A-->, <--B--> etc.
*/
static const unsigned char xortable[2][64] =
{
{
0x41,0x55,0x44,0x10,0x55,0x11,0x04,0x55,
0x15,0x01,0x51,0x45,0x15,0x40,0x10,0x01,
0x04,0x50,0x55,0x01,0x44,0x15,0x15,0x10,
0x45,0x11,0x55,0x41,0x50,0x10,0x55,0x10,
0x14,0x40,0x05,0x54,0x05,0x41,0x04,0x55,
0x14,0x41,0x01,0x51,0x45,0x50,0x40,0x01,
0x51,0x01,0x05,0x10,0x10,0x50,0x54,0x41,
0x40,0x51,0x14,0x50,0x01,0x50,0x15,0x40
},
{
0x50,0x10,0x10,0x51,0x44,0x50,0x50,0x50,
0x41,0x05,0x11,0x55,0x51,0x11,0x54,0x11,
0x14,0x54,0x54,0x50,0x54,0x40,0x44,0x04,
0x14,0x50,0x15,0x44,0x54,0x14,0x05,0x50,
0x01,0x04,0x55,0x51,0x45,0x40,0x11,0x15,
0x44,0x41,0x11,0x15,0x41,0x05,0x55,0x51,
0x51,0x54,0x05,0x01,0x15,0x51,0x41,0x45,
0x14,0x11,0x41,0x45,0x50,0x55,0x05,0x01
}
};
int A;
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
for (A = 0x0000;A < 0x10000;A++)
{
int i,j;
unsigned char src;
src = RAM[A];
/* pick the translation table from bit 0 of the address */
i = A & 1;
/* pick the offset in the table from bits 012467 of the source data */
j = (src & 0x07) + ((src & 0x10) >> 1) + ((src & 0xc0) >> 2);
/* decode the opcodes */
ROM[A] = src ^ xortable[i][j];
}
}
ROM_START( ckong_rom )
ROM_REGION(0x10000) /* 64k for code */
ROM_LOAD( "d05-07.bin", 0x0000, 0x1000, 0xb27df032 )
ROM_LOAD( "f05-08.bin", 0x1000, 0x1000, 0x5dc1aaba )
ROM_LOAD( "h05-09.bin", 0x2000, 0x1000, 0xc9054c94 )
ROM_LOAD( "k05-10.bin", 0x3000, 0x1000, 0x069c4797 )
ROM_LOAD( "l05-11.bin", 0x4000, 0x1000, 0xae159192 )
ROM_LOAD( "n05-12.bin", 0x5000, 0x1000, 0x966bc9ab )
ROM_REGION_DISPOSE(0x5000) /* temporary space for graphics (disposed after conversion) */
ROM_LOAD( "n11-06.bin", 0x0000, 0x1000, 0x2dcedd12 )
ROM_LOAD( "k11-04.bin", 0x1000, 0x1000, 0x3375b3bd )
ROM_LOAD( "l11-05.bin", 0x2000, 0x1000, 0xfa7cbd91 )
ROM_LOAD( "h11-03.bin", 0x3000, 0x1000, 0x5655cc11 )
ROM_LOAD( "c11-02.bin", 0x4000, 0x0800, 0xd1352c31 )
ROM_LOAD( "a11-01.bin", 0x4800, 0x0800, 0xa7a2fdbd )
ROM_REGION(0x60) /* color proms */
ROM_LOAD( "prom.v6", 0x0000, 0x20, 0xb3fc1505 )
ROM_LOAD( "prom.u6", 0x0020, 0x20, 0x26aada9e )
ROM_LOAD( "prom.t6", 0x0040, 0x20, 0x676b3166 )
ROM_REGION(0x2000) /* samples */
ROM_LOAD( "s05-14.bin", 0x0000, 0x1000, 0x5f0bcdfb )
ROM_LOAD( "r05-13.bin", 0x1000, 0x1000, 0x9003ffbd )
ROM_END
ROM_START( ckonga_rom )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -