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, 16,16,
RGN_FRAC(1,2), 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 }, { RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, 0, 1, 2, 3 },
{ {
4, 0, 12, 8, 4, 0, 12, 8,
@ -364,7 +364,7 @@ static const gfx_layout tile_layout =
{ {
16,16, 16,16,
RGN_FRAC(1,2), 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 }, { RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3, 0, 1, 2, 3 },
{ {
4, 0, 16+4, 16+0, 4, 0, 16+4, 16+0,
@ -378,10 +378,10 @@ static const gfx_layout tile_layout =
}; };
static GFXDECODE_START( taito_f3 ) static GFXDECODE_START( taito_f3 )
GFXDECODE_ENTRY( 0, 0x000000, charlayout, 0, 64 ) /* Dynamically modified */ GFXDECODE_ENTRY( 0, 0x000000, charlayout, 0x0000, 0x400>>4 ) /* Dynamically modified */
GFXDECODE_ENTRY( REGION_GFX2, 0x000000, tile_layout, 0, 512 ) /* Tiles area */ GFXDECODE_ENTRY( REGION_GFX2, 0x000000, tile_layout, 0x0000, 0x2000>>4 ) /* Tiles area */
GFXDECODE_ENTRY( REGION_GFX1, 0x000000, spriteram_layout, 4096, 256 ) /* Sprites area */ GFXDECODE_ENTRY( REGION_GFX1, 0x000000, spriteram_layout, 0x1000, 0x1000>>4 ) /* Sprites area */
GFXDECODE_ENTRY( 0, 0x000000, pivotlayout, 0, 64 ) /* Dynamically modified */ GFXDECODE_ENTRY( 0, 0x000000, pivotlayout, 0x0000, 0x400>>4 ) /* Dynamically modified */
GFXDECODE_END 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_SCREEN_VISIBLE_AREA(46, 40*8-1 + 46, 24, 24+232-1)
MDRV_GFXDECODE(taito_f3) MDRV_GFXDECODE(taito_f3)
MDRV_PALETTE_LENGTH(8192) MDRV_PALETTE_LENGTH(0x2000)
MDRV_VIDEO_START(f3) MDRV_VIDEO_START(f3)
MDRV_VIDEO_EOF(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; UINT8 lsb,msb;
UINT32 offset,i; UINT32 offset,i;
UINT8 *gfx = memory_region(machine, REGION_GFX2); UINT8 *gfx = memory_region(machine, REGION_GFX2);
int size=memory_region_length(machine, REGION_GFX2); int size=memory_region_length(machine, REGION_GFX2);
int half=size/2,data; int data;
/* Setup ROM formats: /* 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 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. 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; offset = size/2;
for (i = size/2+size/4; i<size; i+=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 ) static DRIVER_INIT( ringrage )
{ {
f3_game=RINGRAGE; f3_game=RINGRAGE;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( arabianm ) static DRIVER_INIT( arabianm )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408124, 0x408127, 0, 0, irq_speedup_r_arabianm ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408124, 0x408127, 0, 0, irq_speedup_r_arabianm );
f3_game=ARABIANM; f3_game=ARABIANM;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( ridingf ) static DRIVER_INIT( ridingf )
{ {
f3_game=RIDINGF; f3_game=RIDINGF;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( gseeker ) static DRIVER_INIT( gseeker )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x40ad94, 0x40ad97, 0, 0, irq_speedup_r_gseeker ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x40ad94, 0x40ad97, 0, 0, irq_speedup_r_gseeker );
f3_game=GSEEKER; f3_game=GSEEKER;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( gunlock ) static DRIVER_INIT( gunlock )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400004, 0x400007, 0, 0, irq_speedup_r_gunlock ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400004, 0x400007, 0, 0, irq_speedup_r_gunlock );
f3_game=GUNLOCK; f3_game=GUNLOCK;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( elvactr ) static DRIVER_INIT( elvactr )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4007a0, 0x4007a3, 0, 0, irq_speedup_r_eaction2 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4007a0, 0x4007a3, 0, 0, irq_speedup_r_eaction2 );
f3_game=EACTION2; f3_game=EACTION2;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( cupfinal ) static DRIVER_INIT( cupfinal )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cupfinal ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cupfinal );
f3_game=SCFINALS; f3_game=SCFINALS;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( trstaroj ) static DRIVER_INIT( trstaroj )
{ {
f3_game=TRSTAR; f3_game=TRSTAR;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( scfinals ) 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 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_scfinals );
f3_game=SCFINALS; f3_game=SCFINALS;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( lightbr ) static DRIVER_INIT( lightbr )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400130, 0x400133, 0, 0, irq_speedup_r_lightbr ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400130, 0x400133, 0, 0, irq_speedup_r_lightbr );
f3_game=LIGHTBR; f3_game=LIGHTBR;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( kaiserkn ) static DRIVER_INIT( kaiserkn )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408110, 0x408113, 0, 0, irq_speedup_r_kaiserkn ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408110, 0x408113, 0, 0, irq_speedup_r_kaiserkn );
f3_game=KAISERKN; f3_game=KAISERKN;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( dariusg ) static DRIVER_INIT( dariusg )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406ba8, 0x406bab, 0, 0, irq_speedup_r_dariusg ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406ba8, 0x406bab, 0, 0, irq_speedup_r_dariusg );
f3_game=DARIUSG; f3_game=DARIUSG;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( spcinvdj ) static DRIVER_INIT( spcinvdj )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400230, 0x400233, 0, 0, irq_speedup_r_spcinvdj ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400230, 0x400233, 0, 0, irq_speedup_r_spcinvdj );
f3_game=SPCINVDX; f3_game=SPCINVDX;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( qtheater ) static DRIVER_INIT( qtheater )
{ {
f3_game=QTHEATER; f3_game=QTHEATER;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( spcinv95 ) static DRIVER_INIT( spcinv95 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_spcinv95 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_spcinv95 );
f3_game=SPCINV95; f3_game=SPCINV95;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( gekirido ) static DRIVER_INIT( gekirido )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406bb0, 0x406bb3, 0, 0, irq_speedup_r_gekirido ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x406bb0, 0x406bb3, 0, 0, irq_speedup_r_gekirido );
f3_game=GEKIRIDO; f3_game=GEKIRIDO;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( ktiger2 ) static DRIVER_INIT( ktiger2 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400570, 0x400573, 0, 0, irq_speedup_r_ktiger2 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400570, 0x400573, 0, 0, irq_speedup_r_ktiger2 );
f3_game=KTIGER2; f3_game=KTIGER2;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( bubsymph ) static DRIVER_INIT( bubsymph )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubsymph ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubsymph );
f3_game=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 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubsymph );
f3_game=BUBSYMPH; f3_game=BUBSYMPH;
//tile_decode(machine, 1); //tile_decode(machine);
/* expand gfx rom */ /* 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 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_bubblem );
f3_game=BUBBLEM; f3_game=BUBBLEM;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( cleopatr ) static DRIVER_INIT( cleopatr )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cleopatr ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_cleopatr );
f3_game=CLEOPATR; f3_game=CLEOPATR;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( popnpop ) static DRIVER_INIT( popnpop )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x401cf8, 0x401cfb, 0, 0, irq_speedup_r_popnpop ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x401cf8, 0x401cfb, 0, 0, irq_speedup_r_popnpop );
f3_game=POPNPOP; f3_game=POPNPOP;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( landmakr ) static DRIVER_INIT( landmakr )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400824, 0x400827, 0, 0, irq_speedup_r_landmakr ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400824, 0x400827, 0, 0, irq_speedup_r_landmakr );
f3_game=LANDMAKR; f3_game=LANDMAKR;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( landmkrp ) 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 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400824, 0x400827, 0, 0, irq_speedup_r_landmakr );
f3_game=LANDMAKR; f3_game=LANDMAKR;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( pbobble3 ) static DRIVER_INIT( pbobble3 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405af4, 0x405af7, 0, 0, irq_speedup_r_pbobble3 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405af4, 0x405af7, 0, 0, irq_speedup_r_pbobble3 );
f3_game=PBOBBLE3; f3_game=PBOBBLE3;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( pbobble4 ) static DRIVER_INIT( pbobble4 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4058f4, 0x4058f7, 0, 0, irq_speedup_r_pbobble4 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4058f4, 0x4058f7, 0, 0, irq_speedup_r_pbobble4 );
f3_game=PBOBBLE4; f3_game=PBOBBLE4;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( quizhuhu ) static DRIVER_INIT( quizhuhu )
{ {
f3_game=QUIZHUHU; f3_game=QUIZHUHU;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( pbobble2 ) static DRIVER_INIT( pbobble2 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x404a50, 0x404a53, 0, 0, irq_speedup_r_pbobble2 ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x404a50, 0x404a53, 0, 0, irq_speedup_r_pbobble2 );
f3_game=PBOBBLE2; f3_game=PBOBBLE2;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( pbobbl2x ) static DRIVER_INIT( pbobbl2x )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405c58, 0x405c5b, 0, 0, irq_speedup_r_pbobbl2x ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x405c58, 0x405c5b, 0, 0, irq_speedup_r_pbobbl2x );
f3_game=PBOBBLE2; f3_game=PBOBBLE2;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( hthero95 ) static DRIVER_INIT( hthero95 )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_pwrgoal ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x408114, 0x408117, 0, 0, irq_speedup_r_pwrgoal );
f3_game=HTHERO95; f3_game=HTHERO95;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( kirameki ) static DRIVER_INIT( kirameki )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400414, 0x400417, 0, 0, irq_speedup_r_kirameki ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400414, 0x400417, 0, 0, irq_speedup_r_kirameki );
f3_game=KIRAMEKI; f3_game=KIRAMEKI;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( puchicar ) static DRIVER_INIT( puchicar )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4024d8, 0x4024db, 0, 0, irq_speedup_r_puchicar ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x4024d8, 0x4024db, 0, 0, irq_speedup_r_puchicar );
f3_game=PUCHICAR; f3_game=PUCHICAR;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( twinqix ) static DRIVER_INIT( twinqix )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_twinqix ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400134, 0x400137, 0, 0, irq_speedup_r_twinqix );
f3_game=TWINQIX; f3_game=TWINQIX;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( arkretrn ) static DRIVER_INIT( arkretrn )
{ {
memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x402154, 0x402157, 0, 0, irq_speedup_r_arkretrn ); memory_install_read32_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x402154, 0x402157, 0, 0, irq_speedup_r_arkretrn );
f3_game=ARKRETRN; f3_game=ARKRETRN;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( intcup94 ) static DRIVER_INIT( intcup94 )
{ {
f3_game=SCFINALS; f3_game=SCFINALS;
tile_decode(machine, 1); tile_decode(machine);
} }
static DRIVER_INIT( recalh ) static DRIVER_INIT( recalh )
{ {
f3_game=RECALH; f3_game=RECALH;
tile_decode(machine, 0); tile_decode(machine);
} }
static DRIVER_INIT( commandw ) static DRIVER_INIT( commandw )
{ {
f3_game=COMMANDW; f3_game=COMMANDW;
tile_decode(machine, 1); tile_decode(machine);
} }
/******************************************************************************/ /******************************************************************************/

View File

@ -236,45 +236,47 @@ struct F3config
int name; int name;
int extend; int extend;
int sprite_lag; int sprite_lag;
int sprite_bpp;
int tile_bpp;
}; };
static const struct F3config *f3_game_config; static const struct F3config *f3_game_config;
static const struct F3config f3_config_table[] = static const struct F3config f3_config_table[] =
{ {
/* Name Extend Sprite Lag */ /* Name Extend Lag Bpp */
{ RINGRAGE, 0, 2 }, { RINGRAGE, 0, 2, 5, 6 },
{ ARABIANM, 0, 2 }, { ARABIANM, 0, 2, 5, 5 }, /* sprites 1200-120F contain 6bpp pixels but this seems to be a data error */
{ RIDINGF, 1, 1 }, { RIDINGF, 1, 1, 4, 4 },
{ GSEEKER, 0, 1 }, { GSEEKER, 0, 1, 4, 4 },
{ TRSTAR, 1, 0 }, { COMMANDW, 1, 1, 5, 5 },
{ GUNLOCK, 1, 2 }, { SCFINALS, 0, 1, 5, 5 },
{ TWINQIX, 1, 1 }, { TRSTAR, 1, 0, 5, 5 },
{ SCFINALS, 0, 1 }, { GUNLOCK, 1, 2, 5, 5 },
{ LIGHTBR, 1, 2 }, { LIGHTBR, 1, 2, 5, 5 },
{ KAISERKN, 0, 2 }, { KAISERKN, 0, 2, 5, 5 },
{ DARIUSG, 0, 2 }, { DARIUSG, 0, 2, 5, 5 },
{ BUBSYMPH, 1, 1 }, { BUBSYMPH, 1, 1, 5, 5 },
{ SPCINVDX, 1, 1 }, { SPCINVDX, 1, 1, 4, 4 },
{ QTHEATER, 1, 1 }, { HTHERO95, 0, 1, 6, 6 },
{ HTHERO95, 0, 1 }, { QTHEATER, 1, 1, 4, 4 },
{ SPCINV95, 0, 1 }, { EACTION2, 1, 2, 5, 5 },
{ EACTION2, 1, 2 }, { RECALH, 1, 1, 4, 4 },
{ QUIZHUHU, 1, 1 }, { SPCINV95, 0, 1, 5, 5 },
{ PBOBBLE2, 0, 1 }, { TWINQIX, 1, 1, 4, 6 },
{ GEKIRIDO, 0, 1 }, { QUIZHUHU, 1, 1, 6, 6 },
{ KTIGER2, 0, 0 }, { PBOBBLE2, 0, 1, 4, 6 },
{ BUBBLEM, 1, 1 }, { GEKIRIDO, 0, 1, 5, 5 },
{ CLEOPATR, 0, 1 }, { KTIGER2, 0, 0, 4, 4 },
{ PBOBBLE3, 0, 1 }, { BUBBLEM, 1, 1, 4, 5 },
{ ARKRETRN, 1, 1 }, { CLEOPATR, 0, 1, 4, 6 },
{ KIRAMEKI, 0, 1 }, { PBOBBLE3, 0, 1, 4, 6 },
{ PUCHICAR, 1, 1 }, { ARKRETRN, 1, 1, 5, 6 },
{ PBOBBLE4, 0, 1 }, { KIRAMEKI, 0, 1, 5, 6 },
{ POPNPOP, 1, 1 }, { PUCHICAR, 1, 1, 5, 6 },
{ LANDMAKR, 1, 1 }, { PBOBBLE4, 0, 1, 4, 6 },
{ RECALH, 1, 1 }, { POPNPOP, 1, 1, 6, 6 },
{ COMMANDW, 1, 1 }, { LANDMAKR, 1, 1, 5, 6 },
{0} {0}
}; };
@ -443,11 +445,16 @@ INLINE void get_tile_info(running_machine *machine, tile_data *tileinfo, int til
{ {
UINT32 tile=gfx_base[tile_index]; UINT32 tile=gfx_base[tile_index];
UINT8 abtype=(tile>>(16+9))&0x1f; 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( SET_TILE_INFO(
1, 1,
tile&0xffff, tile&0xffff,
(tile>>16)&0x1ff, (tile>>16) & 0x1ff & color_mask,
TILE_FLIPYX( tile >> 30 )); TILE_FLIPYX( tile >> 30 ));
tileinfo->category = abtype&1; /* alpha blending type */ 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(vram_layer,0);
tilemap_set_transparent_pen(pixel_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[1]->color_granularity=16;
machine->gfx[2]->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; flipscreen = 0;
memset(spriteram32_buffered,0,spriteram_size); memset(spriteram32_buffered,0,spriteram_size);
memset(spriteram32,0,spriteram_size); memset(spriteram32,0,spriteram_size);
@ -642,6 +653,7 @@ VIDEO_START( f3 )
{ {
const gfx_element *sprite_gfx = machine->gfx[2]; const gfx_element *sprite_gfx = machine->gfx[2];
int c; int c;
int bpp_mask = (1 << f3_game_config->sprite_bpp) - 1;
for (c = 0;c < sprite_gfx->total_elements;c++) for (c = 0;c < sprite_gfx->total_elements;c++)
{ {
@ -652,6 +664,9 @@ VIDEO_START( f3 )
{ {
for (x = 0;x < sprite_gfx->width;x++) 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; if(!dp[x]) chk_trans_or_opa|=2;
else chk_trans_or_opa|=1; else chk_trans_or_opa|=1;
} }
@ -666,6 +681,7 @@ VIDEO_START( f3 )
{ {
const gfx_element *pf_gfx = machine->gfx[1]; const gfx_element *pf_gfx = machine->gfx[1];
int c; int c;
int bpp_mask = (1 << f3_game_config->tile_bpp) - 1;
for (c = 0;c < pf_gfx->total_elements;c++) for (c = 0;c < pf_gfx->total_elements;c++)
{ {
@ -676,6 +692,9 @@ VIDEO_START( f3 )
{ {
for (x = 0;x < pf_gfx->width;x++) 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; if(!dp[x]) chk_trans_or_opa|=2;
else chk_trans_or_opa|=1; 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 struct tempsprite *sprite_ptr;
const gfx_element *sprite_gfx = machine->gfx[2]; const gfx_element *sprite_gfx = machine->gfx[2];
int color_mask;
sprite_ptr = sprite_end; sprite_ptr = sprite_end;
sprite_pri_usage=0; 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) while (sprite_ptr != spritelist)
{ {
int pri; int pri;
@ -3172,7 +3197,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
f3_drawgfx(machine, f3_drawgfx(machine,
bitmap,sprite_gfx, bitmap,sprite_gfx,
sprite_ptr->code, sprite_ptr->code,
sprite_ptr->color, sprite_ptr->color & color_mask,
sprite_ptr->flipx,sprite_ptr->flipy, sprite_ptr->flipx,sprite_ptr->flipy,
sprite_ptr->x,sprite_ptr->y, sprite_ptr->x,sprite_ptr->y,
cliprect, cliprect,
@ -3181,7 +3206,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
f3_drawgfxzoom(machine, f3_drawgfxzoom(machine,
bitmap,sprite_gfx, bitmap,sprite_gfx,
sprite_ptr->code, sprite_ptr->code,
sprite_ptr->color, sprite_ptr->color & color_mask,
sprite_ptr->flipx,sprite_ptr->flipy, sprite_ptr->flipx,sprite_ptr->flipy,
sprite_ptr->x,sprite_ptr->y, sprite_ptr->x,sprite_ptr->y,
cliprect, cliprect,