Removes color table from Centipede and related games

This commit is contained in:
Zsolt Vasvari 2008-01-29 13:50:12 +00:00
parent faa995111f
commit bd18da7d71
3 changed files with 167 additions and 175 deletions

View File

@ -9,26 +9,22 @@
* Maze Invaders (prototype)
* Bulls Eye Darts
Centipede sync-prom added by HIGHWAYMAN.
The prom pcb location is:P4 and is 256x4
(i need to update the dump, this one is read in 8bit-mode)
Known ROMs (listed in the manual) that need to be dumped/verified:
Known roms (listed in the manual) that need to be dumped/verified:
Centipede:
136001-203.d1 <-- Are these the proper labels for the timed version???
136001-204.e1
136001-205.fh1
136001-206.j1
Centipede:
136001-203.d1 <-- Are these the proper labels for the timed version???
136001-204.e1
136001-205.fh1
136001-206.j1
136001-303.d1 <-- Revision 3 set for the above listed roms
136001-304.e1
136001-305.fh1
136001-306.j1
136001-303.d1 <-- Revision 3 set for the above listed roms
136001-304.e1
136001-305.fh1
136001-306.j1
Milipede:
136013-109.5p
136013-110.5r
Milipede:
136013-109.5p
136013-110.5r
****************************************************************************
@ -1647,10 +1643,8 @@ static MACHINE_DRIVER_START( centiped )
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1)
MDRV_GFXDECODE(centiped)
MDRV_PALETTE_LENGTH(4+4)
MDRV_COLORTABLE_LENGTH(4+4*4*4*4)
MDRV_PALETTE_LENGTH(4+4*4*4*4)
MDRV_PALETTE_INIT(centiped)
MDRV_VIDEO_START(centiped)
MDRV_VIDEO_UPDATE(centiped)
@ -1683,7 +1677,7 @@ static MACHINE_DRIVER_START( centipdb )
/* sound hardware */
MDRV_SOUND_REPLACE("pokey", AY8910, 12096000/8)
MDRV_SOUND_CONFIG(centipdb_ay8910_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 10.0)
MACHINE_DRIVER_END
@ -1696,7 +1690,7 @@ static MACHINE_DRIVER_START( magworm )
/* sound hardware */
MDRV_SOUND_REPLACE("pokey", AY8910, 12096000/8)
MDRV_SOUND_CONFIG(centipdb_ay8910_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 15.0)
MACHINE_DRIVER_END
@ -1709,10 +1703,8 @@ static MACHINE_DRIVER_START( milliped )
/* video hardware */
MDRV_GFXDECODE(milliped)
MDRV_PALETTE_LENGTH(4*4+4*4)
MDRV_COLORTABLE_LENGTH(4*4+4*4*4*4*4)
MDRV_PALETTE_LENGTH(4*4+4*4*4*4*4)
MDRV_PALETTE_INIT(milliped)
MDRV_VIDEO_START(milliped)
MDRV_VIDEO_UPDATE(milliped)
@ -1736,8 +1728,7 @@ static MACHINE_DRIVER_START( warlords )
/* video hardware */
MDRV_GFXDECODE(warlords)
MDRV_PALETTE_LENGTH(128)
MDRV_COLORTABLE_LENGTH(8*4+8*4)
MDRV_PALETTE_LENGTH(8*4+8*4)
MDRV_PALETTE_INIT(warlords)
MDRV_VIDEO_START(warlords)
@ -1777,9 +1768,7 @@ static MACHINE_DRIVER_START( bullsdrt )
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1)
MDRV_GFXDECODE(centiped)
MDRV_PALETTE_LENGTH(4+4)
MDRV_COLORTABLE_LENGTH(4+4*4*4*4)
MDRV_PALETTE_INIT(centiped)
MDRV_PALETTE_LENGTH(4+4*4*4*4)
MDRV_VIDEO_START(bullsdrt)
MDRV_VIDEO_UPDATE(bullsdrt)
@ -1879,6 +1868,7 @@ ROM_START( centipdb )
ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) )
ROM_END
ROM_START( millpac )
ROM_REGION( 0x10000, REGION_CPU1, 0 )
ROM_LOAD( "millpac1.1d", 0x2000, 0x0800, CRC(4dd6913d) SHA1(9eca634e1a827f9bbcf3c532d44e175ac4751755) )
@ -1926,7 +1916,7 @@ ROM_END
ROM_START( mazeinv )
ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */
ROM_REGION( 0x10000, REGION_CPU1, 0 )
ROM_LOAD( "005.011", 0x3000, 0x1000, CRC(37129536) SHA1(356cb986a40b332100e00fb72194fd4dade2cba7) )
ROM_LOAD( "004.011", 0x4000, 0x1000, CRC(2d0fbf2f) SHA1(9d4c2bc9f80604d1ff5c5bf5a4a78378efdd8b33) )
ROM_LOAD( "003.011", 0x5000, 0x1000, CRC(0ff3747c) SHA1(1a7e1c487c24875dada967fb3a9ceaca25b7e2a7) )
@ -2028,4 +2018,4 @@ GAME( 1982, milliped, 0, milliped, milliped, 0, ROT270, "Atari",
GAME( 1980, warlords, 0, warlords, warlords, 0, ROT0, "Atari", "Warlords", GAME_SUPPORTS_SAVE )
GAME( 1981, mazeinv, 0, mazeinv, mazeinv, 0, ROT270, "Atari", "Maze Invaders (prototype)", 0 )
GAME( 1985, bullsdrt, 0, bullsdrt, bullsdrt, bullsdrt, ROT270, "Shinkai Inc. (Magic Eletronics Inc. licence)", "Bulls Eye Darts", GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1985, bullsdrt, 0, bullsdrt, bullsdrt, bullsdrt, ROT270, "Shinkai Inc. (Magic Eletronics Inc. licence)", "Bulls Eye Darts", GAME_WRONG_COLORS | GAME_SUPPORTS_SAVE )

View File

@ -8,8 +8,6 @@
extern UINT8 centiped_flipscreen, *bullsdrt_tiles_bankram;
PALETTE_INIT( centiped );
PALETTE_INIT( milliped );
PALETTE_INIT( warlords );
VIDEO_START( centiped );

View File

@ -57,6 +57,28 @@ static TILE_GET_INFO( bullsdrt_get_tile_info )
/*************************************
*
* Palette init
*
*************************************/
static void init_penmask(void)
{
int i;
for (i = 0; i < 64; i++)
{
UINT8 mask = 1;
if (((i >> 0) & 3) == 0) mask |= 2;
if (((i >> 2) & 3) == 0) mask |= 4;
if (((i >> 4) & 3) == 0) mask |= 8;
penmask[i] = mask;
}
}
/*************************************
*
* Video system start
@ -67,6 +89,8 @@ VIDEO_START( centiped )
{
bg_tilemap = tilemap_create(centiped_get_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8,8, 32,32);
init_penmask();
centiped_flipscreen = 0;
state_save_register_global(centiped_flipscreen);
@ -88,7 +112,10 @@ VIDEO_START( milliped )
{
bg_tilemap = tilemap_create(milliped_get_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8,8, 32,32);
init_penmask();
centiped_flipscreen = 0;
state_save_register_global(centiped_flipscreen);
}
@ -97,6 +124,8 @@ VIDEO_START( bullsdrt )
{
bg_tilemap = tilemap_create(bullsdrt_get_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8,8, 32,32);
init_penmask();
centiped_flipscreen = 0;
}
@ -156,28 +185,6 @@ WRITE8_HANDLER( bullsdrt_sprites_bank_w )
/*************************************
*
* Palette init
*
*************************************/
static void init_penmask(void)
{
int i;
for (i = 0; i < 64; i++)
{
UINT8 mask = 1;
if (((i >> 0) & 3) == 0) mask |= 2;
if (((i >> 2) & 3) == 0) mask |= 4;
if (((i >> 4) & 3) == 0) mask |= 8;
penmask[i] = mask;
}
}
/***************************************************************************
Centipede doesn't have a color PROM. Eight RAM locations control
@ -192,61 +199,64 @@ static void init_penmask(void)
The alternate bit affects blue and green, not red. The way I weighted its
effect might not be perfectly accurate, but is reasonably close.
Centipede is unusual because the sprite color code specifies the
colors to use one by one, instead of a combination code.
bit 5-4 = color to use for pen 11
bit 3-2 = color to use for pen 10
bit 1-0 = color to use for pen 01
pen 00 is transparent
***************************************************************************/
#define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
#define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
PALETTE_INIT( centiped )
{
int i;
/* characters use colors 0-3 */
for (i = 0; i < TOTAL_COLORS(0); i++)
COLOR(0,i) = i;
/* Centipede is unusual because the sprite color code specifies the */
/* colors to use one by one, instead of a combination code. */
/* bit 5-4 = color to use for pen 11 */
/* bit 3-2 = color to use for pen 10 */
/* bit 1-0 = color to use for pen 01 */
/* pen 00 is transparent */
for (i = 0; i < TOTAL_COLORS(1); i += 4)
{
COLOR(1,i+0) = 0;
COLOR(1,i+1) = 4 + ((i >> 2) & 3);
COLOR(1,i+2) = 4 + ((i >> 4) & 3);
COLOR(1,i+3) = 4 + ((i >> 6) & 3);
}
/* create a pen mask for sprite drawing */
init_penmask();
}
WRITE8_HANDLER( centiped_paletteram_w )
{
int r, g, b;
paletteram[offset] = data;
r = 0xff * ((~data >> 0) & 1);
g = 0xff * ((~data >> 1) & 1);
b = 0xff * ((~data >> 2) & 1);
if (~data & 0x08) /* alternate = 1 */
{
/* when blue component is not 0, decrease it. When blue component is 0, */
/* decrease green component. */
if (b) b = 0xc0;
else if (g) g = 0xc0;
}
/* bit 2 of the output palette RAM is always pulled high, so we ignore */
/* any palette changes unless the write is to a palette RAM address */
/* that is actually used */
if (offset & 4)
palette_set_color(Machine, ((offset >> 1) & 4) | (offset & 3), MAKE_RGB(r, g, b));
{
rgb_t color;
int r = 0xff * ((~data >> 0) & 1);
int g = 0xff * ((~data >> 1) & 1);
int b = 0xff * ((~data >> 2) & 1);
if (~data & 0x08) /* alternate = 1 */
{
/* when blue component is not 0, decrease it. When blue component is 0, */
/* decrease green component. */
if (b) b = 0xc0;
else if (g) g = 0xc0;
}
color = MAKE_RGB(r, g, b);
/* character colors, set directly */
if ((offset & 0x08) == 0)
palette_set_color(Machine, offset & 0x03, color);
/* sprite colors - set all the applicable ones */
else
{
int i;
offset = offset & 0x03;
for (i = 0; i < 0x100; i += 4)
{
if (offset == ((i >> 2) & 0x03))
palette_set_color(Machine, i + 4 + 1, color);
if (offset == ((i >> 4) & 0x03))
palette_set_color(Machine, i + 4 + 2, color);
if (offset == ((i >> 6) & 0x03))
palette_set_color(Machine, i + 4 + 3, color);
}
}
}
}
@ -265,32 +275,35 @@ WRITE8_HANDLER( centiped_paletteram_w )
PALETTE_INIT( warlords )
{
int i, j;
int i;
for (i = 0; i < machine->drv->total_colors; i++)
{
int r = ((*color_prom >> 2) & 0x01) * 0xff;
int g = ((*color_prom >> 1) & 0x01) * 0xff;
int b = ((*color_prom >> 0) & 0x01) * 0xff;
UINT8 pen;
int r, g, b;
/* Colors 0x40-0x7f are converted to grey scale as it's used on the
if (i < 0x20)
/* characters */
pen = (((i - 0x00) & 0x1c) << 2) | (((i - 0x00) & 0x03) << 0);
else
/* sprites */
pen = (((i - 0x20) & 0x1c) << 2) | (((i - 0x20) & 0x03) << 2);
r = ((color_prom[pen] >> 2) & 0x01) * 0xff;
g = ((color_prom[pen] >> 1) & 0x01) * 0xff;
b = ((color_prom[pen] >> 0) & 0x01) * 0xff;
/* colors 0x40-0x7f are converted to grey scale as it's used on the
upright version that had an overlay */
if (i >= machine->drv->total_colors / 2)
if (pen >= 0x40)
{
/* Use the standard ratios: r = 30%, g = 59%, b = 11% */
/* use the standard ratios: r = 30%, g = 59%, b = 11% */
int grey = (r * 0x4d / 0xff) + (g * 0x96 / 0xff) + (b * 0x1c / 0xff);
r = g = b = grey;
}
palette_set_color(machine,i,MAKE_RGB(r,g,b));
color_prom++;
}
for (i = 0; i < 8; i++)
for (j = 0; j < 4; j++)
{
COLOR(0,i*4+j) = i*16+j;
COLOR(1,i*4+j) = i*16+j*4;
}
palette_set_color(machine, i, MAKE_RGB(r, g, b));
}
}
@ -309,43 +322,21 @@ PALETTE_INIT( warlords )
blue
bit 0 blue
Millipede is unusual because the sprite color code specifies the
colors to use one by one, instead of a combination code.
bit 7-6 = palette bank (there are 4 groups of 4 colors)
bit 5-4 = color to use for pen 11
bit 3-2 = color to use for pen 10
bit 1-0 = color to use for pen 01
pen 00 is transparent
***************************************************************************/
PALETTE_INIT( milliped )
static void melliped_mazeinv_set_color(running_machine *machine, offs_t offset, UINT8 data)
{
int i;
/* characters use colors 0-15 */
for (i = 0; i < TOTAL_COLORS(0); i++)
COLOR(0,i) = i;
/* Millipede is unusual because the sprite color code specifies the */
/* colors to use one by one, instead of a combination code. */
/* bit 7-6 = palette bank (there are 4 groups of 4 colors) */
/* bit 5-4 = color to use for pen 11 */
/* bit 3-2 = color to use for pen 10 */
/* bit 1-0 = color to use for pen 01 */
/* pen 00 is transparent */
for (i = 0; i < TOTAL_COLORS(1); i += 4)
{
int base = 16 + 4 * ((i >> 8) & 3);
COLOR(1,i+0) = 0;
COLOR(1,i+1) = base + ((i >> 2) & 3);
COLOR(1,i+2) = base + ((i >> 4) & 3);
COLOR(1,i+3) = base + ((i >> 6) & 3);
}
/* create a pen mask for sprite drawing */
init_penmask();
}
WRITE8_HANDLER( milliped_paletteram_w )
{
int bit0,bit1,bit2;
int r,g,b;
paletteram[offset] = data;
rgb_t color;
int bit0, bit1, bit2;
int r, g, b;
/* red component */
bit0 = (~data >> 5) & 0x01;
@ -365,37 +356,50 @@ WRITE8_HANDLER( milliped_paletteram_w )
bit2 = (~data >> 2) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette_set_color(Machine, offset, MAKE_RGB(r, g, b));
color = MAKE_RGB(r, g, b);
/* character colors, set directly */
if (offset < 0x10)
palette_set_color(machine, offset, color);
/* sprite colors - set all the applicable ones */
else
{
int i;
int base = offset & 0x0c;
offset = offset & 0x03;
for (i = (base << 6); i < (base << 6) + 0x100; i += 4)
{
if (offset == ((i >> 2) & 0x03))
palette_set_color(machine, i + 0x10 + 1, color);
if (offset == ((i >> 4) & 0x03))
palette_set_color(machine, i + 0x10 + 2, color);
if (offset == ((i >> 6) & 0x03))
palette_set_color(machine, i + 0x10 + 3, color);
}
}
}
WRITE8_HANDLER( milliped_paletteram_w )
{
paletteram[offset] = data;
melliped_mazeinv_set_color(Machine, offset, data);
}
WRITE8_HANDLER( mazeinv_paletteram_w )
{
int bit0,bit1,bit2;
int r,g,b;
paletteram[offset] = data;
data = memory_region(REGION_PROMS)[~data & 0x0f];
/* red component */
bit0 = (data >> 5) & 0x01;
bit1 = (data >> 6) & 0x01;
bit2 = (data >> 7) & 0x01;
r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* green component */
bit0 = 0;
bit1 = (data >> 3) & 0x01;
bit2 = (data >> 4) & 0x01;
g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
/* blue component */
bit0 = (data >> 0) & 0x01;
bit1 = (data >> 1) & 0x01;
bit2 = (data >> 2) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette_set_color(Machine, offset, MAKE_RGB(r, g, b));
/* the value passed in is a look-up index into the color PROM */
melliped_mazeinv_set_color(Machine, offset, ~memory_region(REGION_PROMS)[~data & 0x0f]);
}