00895: arabianm and clones: During level 6, there is a rain effect, but the water is coloured green.

01917: gunlock, rayforce, rayfocj: The color of Battleships is wrong in the 1st stage.
01925: gunlock, rayforce, rayforcj: The explosive color of the demo is different.
This commit is contained in:
Nicola Salmoria 2008-07-12 12:12:34 +00:00
parent 990adaa4c4
commit 369948f58c
2 changed files with 113 additions and 86 deletions

View File

@ -348,7 +348,7 @@ static const gfx_layout spriteram_layout =
{
16,16,
RGN_FRAC(1,2),
6,
6, /* Palettes have 4 bpp indexes despite up to 6 bpp data */
{ RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, 0, 1, 2, 3 },
{
4, 0, 12, 8,
@ -364,7 +364,7 @@ static const gfx_layout tile_layout =
{
16,16,
RGN_FRAC(1,2),
6,
6, /* Palettes have 4 bpp indexes despite up to 6 bpp data */
{ RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3, 0, 1, 2, 3 },
{
4, 0, 16+4, 16+0,
@ -378,10 +378,10 @@ static const gfx_layout tile_layout =
};
static GFXDECODE_START( taito_f3 )
GFXDECODE_ENTRY( 0, 0x000000, charlayout, 0, 64 ) /* Dynamically modified */
GFXDECODE_ENTRY( REGION_GFX2, 0x000000, tile_layout, 0, 512 ) /* Tiles area */
GFXDECODE_ENTRY( REGION_GFX1, 0x000000, spriteram_layout, 4096, 256 ) /* Sprites area */
GFXDECODE_ENTRY( 0, 0x000000, pivotlayout, 0, 64 ) /* Dynamically modified */
GFXDECODE_ENTRY( 0, 0x000000, charlayout, 0x0000, 0x400>>4 ) /* Dynamically modified */
GFXDECODE_ENTRY( REGION_GFX2, 0x000000, tile_layout, 0x0000, 0x2000>>4 ) /* Tiles area */
GFXDECODE_ENTRY( REGION_GFX1, 0x000000, spriteram_layout, 0x1000, 0x1000>>4 ) /* Sprites area */
GFXDECODE_ENTRY( 0, 0x000000, pivotlayout, 0x0000, 0x400>>4 ) /* Dynamically modified */
GFXDECODE_END
/******************************************************************************/
@ -462,7 +462,7 @@ static MACHINE_DRIVER_START( f3 )
MDRV_SCREEN_VISIBLE_AREA(46, 40*8-1 + 46, 24, 24+232-1)
MDRV_GFXDECODE(taito_f3)
MDRV_PALETTE_LENGTH(8192)
MDRV_PALETTE_LENGTH(0x2000)
MDRV_VIDEO_START(f3)
MDRV_VIDEO_EOF(f3)
@ -3251,13 +3251,13 @@ ROM_END
/******************************************************************************/
static void tile_decode(running_machine *machine, int uses_5bpp_tiles)
static void tile_decode(running_machine *machine)
{
UINT8 lsb,msb;
UINT32 offset,i;
UINT8 *gfx = memory_region(machine, REGION_GFX2);
int size=memory_region_length(machine, REGION_GFX2);
int half=size/2,data;
int data;
/* Setup ROM formats:
@ -3266,10 +3266,12 @@ static void tile_decode(running_machine *machine, int uses_5bpp_tiles)
are tied low on the game board if unused. This is backed up by the fact the palette
indices are always related to 4 bpp data, even in 6 bpp games.
Most (all?) games with 5bpp tiles have the sixth bit set. Also, in Arabian Magic
sprites 1200-120f contain 6bpp data which is probably bogus.
VIDEO_START( f3 ) clears the fifth and sixth bit of the decoded graphics according
to the bit depth specified in f3_config_table.
*/
if (uses_5bpp_tiles)
for (i=half; i<size; i+=2)
gfx[i+1]=0;
offset = size/2;
for (i = size/2+size/4; i<size; i+=2)
@ -3368,54 +3370,54 @@ F3_IRQ_SPEEDUP_2_R(kirameki, 0x12fc6, 0x0414/4, 0x0000ff00 )
static DRIVER_INIT( ringrage )
{
f3_game=RINGRAGE;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( arabianm )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408124, 0x408127, 0, 0, irq_speedup_r_arabianm );
f3_game=ARABIANM;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( ridingf )
{
f3_game=RIDINGF;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( gseeker )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x40ad94, 0x40ad97, 0, 0, irq_speedup_r_gseeker );
f3_game=GSEEKER;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( gunlock )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400004, 0x400007, 0, 0, irq_speedup_r_gunlock );
f3_game=GUNLOCK;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( elvactr )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4007a0, 0x4007a3, 0, 0, irq_speedup_r_eaction2 );
f3_game=EACTION2;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( cupfinal )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cupfinal );
f3_game=SCFINALS;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( trstaroj )
{
f3_game=TRSTAR;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( scfinals )
@ -3430,69 +3432,69 @@ static DRIVER_INIT( scfinals )
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_scfinals );
f3_game=SCFINALS;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( lightbr )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400130, 0x400133, 0, 0, irq_speedup_r_lightbr );
f3_game=LIGHTBR;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( kaiserkn )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408110, 0x408113, 0, 0, irq_speedup_r_kaiserkn );
f3_game=KAISERKN;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( dariusg )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406ba8, 0x406bab, 0, 0, irq_speedup_r_dariusg );
f3_game=DARIUSG;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( spcinvdj )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400230, 0x400233, 0, 0, irq_speedup_r_spcinvdj );
f3_game=SPCINVDX;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( qtheater )
{
f3_game=QTHEATER;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( spcinv95 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_spcinv95 );
f3_game=SPCINV95;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( gekirido )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406bb0, 0x406bb3, 0, 0, irq_speedup_r_gekirido );
f3_game=GEKIRIDO;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( ktiger2 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400570, 0x400573, 0, 0, irq_speedup_r_ktiger2 );
f3_game=KTIGER2;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( bubsymph )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubsymph );
f3_game=BUBSYMPH;
tile_decode(machine, 1);
tile_decode(machine);
}
@ -3523,7 +3525,7 @@ static DRIVER_INIT( bubsympb )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubsymph );
f3_game=BUBSYMPH;
//tile_decode(machine, 1);
//tile_decode(machine);
/* expand gfx rom */
{
@ -3553,28 +3555,28 @@ static DRIVER_INIT( bubblem )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubblem );
f3_game=BUBBLEM;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( cleopatr )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cleopatr );
f3_game=CLEOPATR;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( popnpop )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x401cf8, 0x401cfb, 0, 0, irq_speedup_r_popnpop );
f3_game=POPNPOP;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( landmakr )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400824, 0x400827, 0, 0, irq_speedup_r_landmakr );
f3_game=LANDMAKR;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( landmkrp )
@ -3590,94 +3592,94 @@ static DRIVER_INIT( landmkrp )
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400824, 0x400827, 0, 0, irq_speedup_r_landmakr );
f3_game=LANDMAKR;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( pbobble3 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405af4, 0x405af7, 0, 0, irq_speedup_r_pbobble3 );
f3_game=PBOBBLE3;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( pbobble4 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4058f4, 0x4058f7, 0, 0, irq_speedup_r_pbobble4 );
f3_game=PBOBBLE4;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( quizhuhu )
{
f3_game=QUIZHUHU;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( pbobble2 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x404a50, 0x404a53, 0, 0, irq_speedup_r_pbobble2 );
f3_game=PBOBBLE2;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( pbobbl2x )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405c58, 0x405c5b, 0, 0, irq_speedup_r_pbobbl2x );
f3_game=PBOBBLE2;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( hthero95 )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_pwrgoal );
f3_game=HTHERO95;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( kirameki )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400414, 0x400417, 0, 0, irq_speedup_r_kirameki );
f3_game=KIRAMEKI;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( puchicar )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4024d8, 0x4024db, 0, 0, irq_speedup_r_puchicar );
f3_game=PUCHICAR;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( twinqix )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_twinqix );
f3_game=TWINQIX;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( arkretrn )
{
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x402154, 0x402157, 0, 0, irq_speedup_r_arkretrn );
f3_game=ARKRETRN;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( intcup94 )
{
f3_game=SCFINALS;
tile_decode(machine, 1);
tile_decode(machine);
}
static DRIVER_INIT( recalh )
{
f3_game=RECALH;
tile_decode(machine, 0);
tile_decode(machine);
}
static DRIVER_INIT( commandw )
{
f3_game=COMMANDW;
tile_decode(machine, 1);
tile_decode(machine);
}
/******************************************************************************/

View File

@ -236,45 +236,47 @@ struct F3config
int name;
int extend;
int sprite_lag;
int sprite_bpp;
int tile_bpp;
};
static const struct F3config *f3_game_config;
static const struct F3config f3_config_table[] =
{
/* Name Extend Sprite Lag */
{ RINGRAGE, 0, 2 },
{ ARABIANM, 0, 2 },
{ RIDINGF, 1, 1 },
{ GSEEKER, 0, 1 },
{ TRSTAR, 1, 0 },
{ GUNLOCK, 1, 2 },
{ TWINQIX, 1, 1 },
{ SCFINALS, 0, 1 },
{ LIGHTBR, 1, 2 },
{ KAISERKN, 0, 2 },
{ DARIUSG, 0, 2 },
{ BUBSYMPH, 1, 1 },
{ SPCINVDX, 1, 1 },
{ QTHEATER, 1, 1 },
{ HTHERO95, 0, 1 },
{ SPCINV95, 0, 1 },
{ EACTION2, 1, 2 },
{ QUIZHUHU, 1, 1 },
{ PBOBBLE2, 0, 1 },
{ GEKIRIDO, 0, 1 },
{ KTIGER2, 0, 0 },
{ BUBBLEM, 1, 1 },
{ CLEOPATR, 0, 1 },
{ PBOBBLE3, 0, 1 },
{ ARKRETRN, 1, 1 },
{ KIRAMEKI, 0, 1 },
{ PUCHICAR, 1, 1 },
{ PBOBBLE4, 0, 1 },
{ POPNPOP, 1, 1 },
{ LANDMAKR, 1, 1 },
{ RECALH, 1, 1 },
{ COMMANDW, 1, 1 },
/* Name Extend Lag Bpp */
{ RINGRAGE, 0, 2, 5, 6 },
{ ARABIANM, 0, 2, 5, 5 }, /* sprites 1200-120F contain 6bpp pixels but this seems to be a data error */
{ RIDINGF, 1, 1, 4, 4 },
{ GSEEKER, 0, 1, 4, 4 },
{ COMMANDW, 1, 1, 5, 5 },
{ SCFINALS, 0, 1, 5, 5 },
{ TRSTAR, 1, 0, 5, 5 },
{ GUNLOCK, 1, 2, 5, 5 },
{ LIGHTBR, 1, 2, 5, 5 },
{ KAISERKN, 0, 2, 5, 5 },
{ DARIUSG, 0, 2, 5, 5 },
{ BUBSYMPH, 1, 1, 5, 5 },
{ SPCINVDX, 1, 1, 4, 4 },
{ HTHERO95, 0, 1, 6, 6 },
{ QTHEATER, 1, 1, 4, 4 },
{ EACTION2, 1, 2, 5, 5 },
{ RECALH, 1, 1, 4, 4 },
{ SPCINV95, 0, 1, 5, 5 },
{ TWINQIX, 1, 1, 4, 6 },
{ QUIZHUHU, 1, 1, 6, 6 },
{ PBOBBLE2, 0, 1, 4, 6 },
{ GEKIRIDO, 0, 1, 5, 5 },
{ KTIGER2, 0, 0, 4, 4 },
{ BUBBLEM, 1, 1, 4, 5 },
{ CLEOPATR, 0, 1, 4, 6 },
{ PBOBBLE3, 0, 1, 4, 6 },
{ ARKRETRN, 1, 1, 5, 6 },
{ KIRAMEKI, 0, 1, 5, 6 },
{ PUCHICAR, 1, 1, 5, 6 },
{ PBOBBLE4, 0, 1, 4, 6 },
{ POPNPOP, 1, 1, 6, 6 },
{ LANDMAKR, 1, 1, 5, 6 },
{0}
};
@ -443,11 +445,16 @@ INLINE void get_tile_info(running_machine *machine, tile_data *tileinfo, int til
{
UINT32 tile=gfx_base[tile_index];
UINT8 abtype=(tile>>(16+9))&0x1f;
int color_mask;
// if tiles use more than 4bpp, the bottom bits of the color code must be masked out.
// This fixes (at least) the rain in round 6 of Arabian Magic.
color_mask = ~((1 << (f3_game_config->tile_bpp - 4)) - 1);
SET_TILE_INFO(
1,
tile&0xffff,
(tile>>16)&0x1ff,
(tile>>16) & 0x1ff & color_mask,
TILE_FLIPYX( tile >> 30 ));
tileinfo->category = abtype&1; /* alpha blending type */
}
@ -617,10 +624,14 @@ VIDEO_START( f3 )
tilemap_set_transparent_pen(vram_layer,0);
tilemap_set_transparent_pen(pixel_layer,0);
/* Palettes have 4 bpp indexes despite up to 6 bpp data */
// Palettes have 4 bpp indexes despite up to 6 bpp data. The unused
// top bits in the gfx data are cleared later.
machine->gfx[1]->color_granularity=16;
machine->gfx[2]->color_granularity=16;
assert(f3_game_config->tile_bpp >= 4 && f3_game_config->tile_bpp <= 6);
assert(f3_game_config->sprite_bpp >= 4 && f3_game_config->sprite_bpp <= 6);
flipscreen = 0;
memset(spriteram32_buffered,0,spriteram_size);
memset(spriteram32,0,spriteram_size);
@ -642,6 +653,7 @@ VIDEO_START( f3 )
{
const gfx_element *sprite_gfx = machine->gfx[2];
int c;
int bpp_mask = (1 << f3_game_config->sprite_bpp) - 1;
for (c = 0;c < sprite_gfx->total_elements;c++)
{
@ -652,6 +664,9 @@ VIDEO_START( f3 )
{
for (x = 0;x < sprite_gfx->width;x++)
{
// clear unused top bits from gfx data
dp[x] &= bpp_mask;
if(!dp[x]) chk_trans_or_opa|=2;
else chk_trans_or_opa|=1;
}
@ -666,6 +681,7 @@ VIDEO_START( f3 )
{
const gfx_element *pf_gfx = machine->gfx[1];
int c;
int bpp_mask = (1 << f3_game_config->tile_bpp) - 1;
for (c = 0;c < pf_gfx->total_elements;c++)
{
@ -676,6 +692,9 @@ VIDEO_START( f3 )
{
for (x = 0;x < pf_gfx->width;x++)
{
// clear unused top bits from gfx data
dp[x] &= bpp_mask;
if(!dp[x]) chk_trans_or_opa|=2;
else chk_trans_or_opa|=1;
}
@ -3157,9 +3176,15 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
{
const struct tempsprite *sprite_ptr;
const gfx_element *sprite_gfx = machine->gfx[2];
int color_mask;
sprite_ptr = sprite_end;
sprite_pri_usage=0;
// if sprites use more than 4bpp, the bottom bits of the color code must be masked out.
// This fixes (at least) stage 1 battle ships and attract mode explosions in Ray Force.
color_mask = ~((1 << (f3_game_config->sprite_bpp - 4)) - 1);
while (sprite_ptr != spritelist)
{
int pri;
@ -3172,7 +3197,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
f3_drawgfx(machine,
bitmap,sprite_gfx,
sprite_ptr->code,
sprite_ptr->color,
sprite_ptr->color & color_mask,
sprite_ptr->flipx,sprite_ptr->flipy,
sprite_ptr->x,sprite_ptr->y,
cliprect,
@ -3181,7 +3206,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
f3_drawgfxzoom(machine,
bitmap,sprite_gfx,
sprite_ptr->code,
sprite_ptr->color,
sprite_ptr->color & color_mask,
sprite_ptr->flipx,sprite_ptr->flipy,
sprite_ptr->x,sprite_ptr->y,
cliprect,