mirror of
https://github.com/holub/mame
synced 2025-05-24 14:56:21 +03:00
First step in refactoring the video system in metro.c driver [David Haywood]
This commit is contained in:
parent
99c61e3592
commit
cd5f1f4011
@ -450,6 +450,16 @@ void tilemap_set_enable(tilemap_t *tmap, int enable)
|
||||
tmap->enable = (enable != 0);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------
|
||||
tilemap_get_scrolldx - return the enable flag
|
||||
for the tilemap
|
||||
-------------------------------------------------*/
|
||||
|
||||
int tilemap_get_enable(tilemap_t *tmap)
|
||||
{
|
||||
return tmap->enable;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
tilemap_set_flip - set a global flip for the
|
||||
|
@ -439,6 +439,9 @@ void tilemap_set_palette_offset(tilemap_t *tmap, UINT32 offset);
|
||||
/* set an enable flag for the tilemap; if 0, requests to draw the tilemap are ignored */
|
||||
void tilemap_set_enable(tilemap_t *tmap, int enable);
|
||||
|
||||
/* return enable flag for the tilemap */
|
||||
int tilemap_get_enable(tilemap_t *tmap);
|
||||
|
||||
/* set a global flip for the tilemap */
|
||||
void tilemap_set_flip(tilemap_t *tmap, UINT32 attributes);
|
||||
|
||||
|
@ -54,11 +54,17 @@ Not dumped yet:
|
||||
|
||||
To Do:
|
||||
|
||||
- 1 pixel granularity in the window's placement (8 pixels now, see daitorid and msgogo title)
|
||||
- Coin lockout
|
||||
- Some gfx problems in ladykill, 3kokushi, puzzli, gakusai
|
||||
- Seems related to how we handle windows and wrapping
|
||||
- Are the 16x16 tiles used by Mouja a Imagetek 14300-only feature?
|
||||
- Flip screen doesn't work correctly in Mouja due to asymmetrical visible area
|
||||
- Interrupt timing needs figuring out properly, having it incorrect
|
||||
causes scrolling glitches in some games. Test cases Mouse Go Go
|
||||
title screen, GunMaster title screen. Changing it can cause
|
||||
excessive slowdown in said games however.
|
||||
- Bang Bang Ball / Bubble Buster slow to a crawl when you press a
|
||||
button between levels, on a real PCB it speeds up instead (related
|
||||
to above?)
|
||||
|
||||
Notes:
|
||||
|
||||
@ -214,6 +220,24 @@ static INTERRUPT_GEN( bangball_interrupt )
|
||||
update_irq_state(device->machine);
|
||||
}
|
||||
|
||||
static INTERRUPT_GEN( msgogo_interrupt )
|
||||
{
|
||||
metro_state *state = (metro_state *)device->machine->driver_data;
|
||||
|
||||
switch (cpu_getiloops(device))
|
||||
{
|
||||
case 10:
|
||||
state->requested_int[0] = 1;
|
||||
update_irq_state(device->machine);
|
||||
break;
|
||||
|
||||
case 224:
|
||||
state->requested_int[4] = 1;
|
||||
update_irq_state(device->machine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static TIMER_CALLBACK( vblank_end_callback )
|
||||
{
|
||||
@ -3637,7 +3661,7 @@ static MACHINE_DRIVER_START( msgogo )
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M68000, 16000000)
|
||||
MDRV_CPU_PROGRAM_MAP(msgogo_map)
|
||||
MDRV_CPU_VBLANK_INT("screen", bangball_interrupt)
|
||||
MDRV_CPU_VBLANK_INT_HACK(msgogo_interrupt,262) /* ? */
|
||||
|
||||
MDRV_MACHINE_START(metro)
|
||||
MDRV_MACHINE_RESET(metro)
|
||||
@ -4280,7 +4304,8 @@ static MACHINE_DRIVER_START( pururun )
|
||||
/* basic machine hardware */
|
||||
MDRV_CPU_ADD("maincpu", M68000, 12000000)
|
||||
MDRV_CPU_PROGRAM_MAP(pururun_map)
|
||||
MDRV_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */
|
||||
//MDRV_CPU_VBLANK_INT_HACK(msgogo_interrupt,262) /* fixes the title screen scroll in GunMaster, but makes the game painfully slow */
|
||||
MDRV_CPU_VBLANK_INT_HACK(metro_interrupt,10) /* ? */
|
||||
|
||||
MDRV_CPU_ADD("audiocpu", UPD7810, 12000000)
|
||||
MDRV_CPU_CONFIG(metro_cpu_config)
|
||||
@ -4873,7 +4898,49 @@ Notes:
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* The MASK roms weren't dumped from this set, but it's safe to assume they're the same in this case */
|
||||
ROM_START( gstrik2 )
|
||||
ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 */
|
||||
ROM_LOAD16_BYTE( "hum_003_g2f.rom1.u107", 0x000000, 0x80000, CRC(2712d9ca) SHA1(efa967de931728534a663fa1529e92003afbb3e9) )
|
||||
ROM_LOAD16_BYTE( "hum_003_g2f.rom2.u108", 0x000001, 0x80000, CRC(86785c64) SHA1(ef172d6e859a68eb80f7c127b61883d50eefb0fe) )
|
||||
ROM_LOAD16_BYTE( "prg2.109", 0x100000, 0x80000, CRC(ead86919) SHA1(eb9b68dff4e08d90ac90043c7f3021914caa007d) )
|
||||
ROM_LOAD16_BYTE( "prg3.110", 0x100001, 0x80000, CRC(e0b026e3) SHA1(05f75c0432efda3dec0372199382e310bb268fba) )
|
||||
|
||||
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 */
|
||||
ROM_LOAD( "sprg.30", 0x0000, 0x20000, CRC(aeef6045) SHA1(61b8c89ca495d3aac79e53413a85dd203db816f3) )
|
||||
|
||||
ROM_REGION( 0x1000000, "gfx1", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
|
||||
ROMX_LOAD( "chr0.80", 0x0000000, 0x200000, CRC(f63a52a9) SHA1(1ad52bb3a051eaffe8fb6ba49d4fc1d0b6144156) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr1.79", 0x0000002, 0x200000, CRC(4110c184) SHA1(90ccb3d50eff7a655336cfa9c072f7213589e64c) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr2.78", 0x0000004, 0x200000, CRC(ddb4b9ee) SHA1(0e2c151c3690b9c3d298dda8842e283660d37386) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr3.77", 0x0000006, 0x200000, CRC(5ab367db) SHA1(adf8749451f4583f8e9e00ab61f3408d804a7265) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr4.84", 0x0800000, 0x200000, CRC(77d7ef99) SHA1(8f5cf72f5919fe9363e7549e0bb1b3ee633cec3b) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr5.83", 0x0800002, 0x200000, CRC(a4d49e95) SHA1(9789bacba7876100e0f0293f54c81def545ed068) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr6.82", 0x0800004, 0x200000, CRC(32eb33b0) SHA1(2ea06484ca326b44a35ee470343147a9d91d5626) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr7.81", 0x0800006, 0x200000, CRC(2d30a21e) SHA1(749e86b7935ef71556eaee4caf6f954634e9bcbf) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
/* not populated */
|
||||
// ROMX_LOAD( "chr8.88", 0x1000000, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr9.87", 0x1000002, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr10.86", 0x1000004, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr11.85", 0x1000006, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr12.92", 0x1800000, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr13.91", 0x1800002, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr14.90", 0x1800004, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr15.89", 0x1800006, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
|
||||
ROM_REGION( 0x200000, "gfx3", 0 ) /* 053936 gfx data */
|
||||
ROM_LOAD( "psacrom.60", 0x000000, 0x200000, CRC(73f1f279) SHA1(1135b2b1eb4c52249bc12ee178340bbb202a94c8) )
|
||||
|
||||
ROM_REGION( 0x200000, "ymsnd.deltat", 0 ) /* Samples */
|
||||
ROM_LOAD( "sndpcm-b.22", 0x000000, 0x200000, CRC(a5d844d2) SHA1(18d644545f0844e66aa53775b67b0a29c7b7c31b) )
|
||||
|
||||
ROM_REGION( 0x400000, "ymsnd", 0 ) /* ? YRW801-M ? */
|
||||
ROM_LOAD( "sndpcm-a.23", 0x000000, 0x200000, CRC(e6d32373) SHA1(8a79d4ea8b27d785fffd80e38d5ae73b7cea7304) )
|
||||
/* ROM7.27 not populated? */
|
||||
ROM_END
|
||||
|
||||
ROM_START( gstrik2j )
|
||||
ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 */
|
||||
ROM_LOAD16_BYTE( "prg0.107", 0x000000, 0x80000, CRC(e60a8c19) SHA1(19be6cfcb60ede6fd4eb2e14914b174107c4b52d) )
|
||||
ROM_LOAD16_BYTE( "prg1.108", 0x000001, 0x80000, CRC(853f6f7c) SHA1(8fb9d7cd0390f620560a1669bb13f2033eed7c81) )
|
||||
@ -4913,45 +4980,6 @@ ROM_START( gstrik2 )
|
||||
/* ROM7.27 not populated? */
|
||||
ROM_END
|
||||
|
||||
ROM_START( gstrik2e )
|
||||
ROM_REGION( 0x200000, "maincpu", 0 ) /* 68000 */
|
||||
ROM_LOAD16_BYTE( "hum_003_g2f.rom1.u107", 0x000000, 0x80000, CRC(2712d9ca) SHA1(efa967de931728534a663fa1529e92003afbb3e9) )
|
||||
ROM_LOAD16_BYTE( "hum_003_g2f.rom2.u108", 0x000001, 0x80000, CRC(86785c64) SHA1(ef172d6e859a68eb80f7c127b61883d50eefb0fe) )
|
||||
ROM_LOAD16_BYTE( "prg2.109", 0x100000, 0x80000, BAD_DUMP CRC(ead86919) SHA1(eb9b68dff4e08d90ac90043c7f3021914caa007d) )
|
||||
ROM_LOAD16_BYTE( "prg3.110", 0x100001, 0x80000, BAD_DUMP CRC(e0b026e3) SHA1(05f75c0432efda3dec0372199382e310bb268fba) )
|
||||
|
||||
ROM_REGION( 0x20000, "audiocpu", 0 ) /* Z80 */
|
||||
ROM_LOAD( "sprg.30", 0x0000, 0x20000, BAD_DUMP CRC(aeef6045) SHA1(61b8c89ca495d3aac79e53413a85dd203db816f3) )
|
||||
|
||||
ROM_REGION( 0x1000000, "gfx1", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
|
||||
ROMX_LOAD( "chr0.80", 0x0000000, 0x200000, BAD_DUMP CRC(f63a52a9) SHA1(1ad52bb3a051eaffe8fb6ba49d4fc1d0b6144156) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr1.79", 0x0000002, 0x200000, BAD_DUMP CRC(4110c184) SHA1(90ccb3d50eff7a655336cfa9c072f7213589e64c) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr2.78", 0x0000004, 0x200000, BAD_DUMP CRC(ddb4b9ee) SHA1(0e2c151c3690b9c3d298dda8842e283660d37386) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr3.77", 0x0000006, 0x200000, BAD_DUMP CRC(5ab367db) SHA1(adf8749451f4583f8e9e00ab61f3408d804a7265) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr4.84", 0x0800000, 0x200000, BAD_DUMP CRC(77d7ef99) SHA1(8f5cf72f5919fe9363e7549e0bb1b3ee633cec3b) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr5.83", 0x0800002, 0x200000, BAD_DUMP CRC(a4d49e95) SHA1(9789bacba7876100e0f0293f54c81def545ed068) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr6.82", 0x0800004, 0x200000, BAD_DUMP CRC(32eb33b0) SHA1(2ea06484ca326b44a35ee470343147a9d91d5626) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
ROMX_LOAD( "chr7.81", 0x0800006, 0x200000, BAD_DUMP CRC(2d30a21e) SHA1(749e86b7935ef71556eaee4caf6f954634e9bcbf) , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
/* not populated */
|
||||
// ROMX_LOAD( "chr8.88", 0x1000000, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr9.87", 0x1000002, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr10.86", 0x1000004, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr11.85", 0x1000006, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr12.92", 0x1800000, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr13.91", 0x1800002, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr14.90", 0x1800004, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
// ROMX_LOAD( "chr15.89", 0x1800006, 0x200000, CRC() SHA1() , ROM_GROUPWORD | ROM_SKIP(6))
|
||||
|
||||
ROM_REGION( 0x200000, "gfx3", 0 ) /* 053936 gfx data */
|
||||
ROM_LOAD( "psacrom.60", 0x000000, 0x200000, BAD_DUMP CRC(73f1f279) SHA1(1135b2b1eb4c52249bc12ee178340bbb202a94c8) )
|
||||
|
||||
ROM_REGION( 0x200000, "ymsnd.deltat", 0 ) /* Samples */
|
||||
ROM_LOAD( "sndpcm-b.22", 0x000000, 0x200000, BAD_DUMP CRC(a5d844d2) SHA1(18d644545f0844e66aa53775b67b0a29c7b7c31b) )
|
||||
|
||||
ROM_REGION( 0x400000, "ymsnd", 0 ) /* ? YRW801-M ? */
|
||||
ROM_LOAD( "sndpcm-a.23", 0x000000, 0x200000, BAD_DUMP CRC(e6d32373) SHA1(8a79d4ea8b27d785fffd80e38d5ae73b7cea7304) )
|
||||
/* ROM7.27 not populated? */
|
||||
ROM_END
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -6202,8 +6230,8 @@ GAME( 1995, puzzli, 0, daitorid, puzzli, daitorid, ROT0, "Metro /
|
||||
GAME( 1996, 3kokushi, 0, 3kokushi, 3kokushi, karatour, ROT0, "Mitchell", "Sankokushi (Japan)", GAME_IMPERFECT_GRAPHICS )
|
||||
GAME( 1996, balcube, 0, balcube, balcube, balcube, ROT0, "Metro", "Bal Cube", 0 )
|
||||
GAME( 1996, bangball, 0, bangball, bangball, balcube, ROT0, "Banpresto / Kunihiko Tashiro+Goodhouse", "Bang Bang Ball (v1.05)", 0 )
|
||||
GAME( 1996, gstrik2, 0, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) // priority between rounds
|
||||
GAME( 1996, gstrik2e, gstrik2, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Europe and Oceania)", GAME_IMPERFECT_GRAPHICS )
|
||||
GAME( 1996, gstrik2, 0, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Europe and Oceania)", GAME_IMPERFECT_GRAPHICS )
|
||||
GAME( 1996, gstrik2j, gstrik2, gstrik2, gstrik2, blzntrnd, ROT0, "Human Amusement", "Grand Striker 2 (Japan)", GAME_IMPERFECT_GRAPHICS ) // priority between rounds
|
||||
GAME( 1999, batlbubl, bangball, batlbubl, batlbubl, balcube, ROT0, "Limenko", "Battle Bubble (v2.00)", 0 )
|
||||
GAME( 1996, mouja, 0, mouja, mouja, mouja, ROT0, "Etona", "Mouja (Japan)", GAME_NO_COCKTAIL )
|
||||
GAME( 1997, gakusai, 0, gakusai, gakusai, gakusai, ROT0, "MakeSoft", "Mahjong Gakuensai (Japan)", GAME_IMPERFECT_GRAPHICS )
|
||||
|
@ -35,13 +35,15 @@ public:
|
||||
size_t spriteram_size;
|
||||
size_t tiletable_size;
|
||||
|
||||
|
||||
int flip_screen;
|
||||
// UINT16 * paletteram; // currently this uses generic palette handling
|
||||
|
||||
/* video-related */
|
||||
tilemap_t *k053936_tilemap;
|
||||
tilemap_t *bg_tilemap[3];
|
||||
tilemap_t *tilemap_16x16[3];
|
||||
tilemap_t *bg_tilemap_16x16[3];
|
||||
|
||||
|
||||
int support_8bpp, support_16x16;
|
||||
int has_zoom;
|
||||
int sprite_xoffs, sprite_yoffs;
|
||||
|
@ -2411,7 +2411,7 @@ V-V TP-027
|
||||
DRIVER( agalletj ) /* (c) 1996 Banpresto / Gazelle (country is in EEPROM) */
|
||||
DRIVER( agalletk ) /* (c) 1996 Banpresto / Gazelle (country is in EEPROM) */
|
||||
DRIVER( agallett ) /* (c) 1996 Banpresto / Gazelle (country is in EEPROM) */
|
||||
DRIVER( agalleth ) /* (c) 1996 Banpresto / Gazelle (country is in EEPROM) */
|
||||
DRIVER( agalleth ) /* (c) 1996 Banpresto / Gazelle (country is in EEPROM) */
|
||||
DRIVER( hotdogst ) /* (c) 1996 Marble */
|
||||
DRIVER( ddonpach ) /* (c) 1997 Atlus/Cave */
|
||||
DRIVER( ddonpachj ) /* (c) 1997 Atlus/Cave */
|
||||
@ -8030,7 +8030,7 @@ Other Sun games
|
||||
DRIVER( gakusai2 ) /* (c) 1998 MakeSoft */
|
||||
DRIVER( blzntrnd ) /* (c) 1994 Human Amusement */
|
||||
DRIVER( gstrik2 ) /* (c) 1996 Human Amusement */
|
||||
DRIVER( gstrik2e )
|
||||
DRIVER( gstrik2j )
|
||||
DRIVER( hyprduel ) /* (c) 1993 Technosoft (World) */
|
||||
DRIVER( hyprdelj ) /* (c) 1993 Technosoft (Japan) */
|
||||
DRIVER( magerror ) /* (c) 1994 Technosoft (Japan) (Arcade TV Game List - P.100, Left, 13 from Bottom) */
|
||||
|
@ -101,22 +101,6 @@ static TILEMAP_MAPPER( tilemap_scan_gstrik2 )
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
|
||||
Palette GGGGGRRRRRBBBBBx
|
||||
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifdef UNUSED_FUNCTION
|
||||
WRITE16_HANDLER( metro_paletteram_w )
|
||||
{
|
||||
data = COMBINE_DATA(&space->machine->generic.paletteram.u16[offset]);
|
||||
palette_set_color_rgb(space->machine, offset, pal5bit(data >> 6), pal5bit(data >> 11), pal5bit(data >> 1));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
@ -148,16 +132,13 @@ WRITE16_HANDLER( metro_paletteram_w )
|
||||
***************************************************************************/
|
||||
|
||||
/* A 2048 x 2048 virtual tilemap */
|
||||
#define BIG_NX 0x100
|
||||
#define BIG_NY 0x100
|
||||
#define BIG_NX (0x100)
|
||||
#define BIG_NY (0x100)
|
||||
|
||||
/* A smaller 512 x 256 window defines the actual tilemap */
|
||||
|
||||
#define WIN_NX (0x40)
|
||||
#define WIN_NY (0x20)
|
||||
//#define WIN_NX (0x40 + 1)
|
||||
//#define WIN_NY (0x20 + 1)
|
||||
|
||||
|
||||
/* 8x8x4 tiles only */
|
||||
INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram )
|
||||
@ -167,10 +148,6 @@ INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int ti
|
||||
int table_index;
|
||||
UINT32 tile;
|
||||
|
||||
/* The actual tile index depends on the window */
|
||||
tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX +
|
||||
((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX);
|
||||
|
||||
/* Fetch the code */
|
||||
code = vram[tile_index];
|
||||
|
||||
@ -184,11 +161,11 @@ INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int ti
|
||||
tileinfo->pen_data = state->empty_tiles + _code * 16 * 16;
|
||||
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
|
||||
tileinfo->flags = 0;
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
SET_TILE_INFO(
|
||||
0,
|
||||
(tile & 0xfffff) + (code & 0xf),
|
||||
@ -197,7 +174,6 @@ INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int ti
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 8x8x4 or 8x8x8 tiles. It's the tile's color that decides: if its low 4
|
||||
bits are high ($f,$1f,$2f etc) the tile is 8bpp, otherwise it's 4bpp */
|
||||
INLINE void get_tile_info_8bit( running_machine *machine, tile_data *tileinfo, int tile_index, int layer, UINT16 *vram )
|
||||
@ -207,10 +183,6 @@ INLINE void get_tile_info_8bit( running_machine *machine, tile_data *tileinfo, i
|
||||
int table_index;
|
||||
UINT32 tile;
|
||||
|
||||
/* The actual tile index depends on the window */
|
||||
tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX +
|
||||
((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX);
|
||||
|
||||
/* Fetch the code */
|
||||
code = vram[tile_index];
|
||||
|
||||
@ -224,11 +196,11 @@ INLINE void get_tile_info_8bit( running_machine *machine, tile_data *tileinfo, i
|
||||
tileinfo->pen_data = state->empty_tiles + _code * 16 * 16;
|
||||
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
|
||||
tileinfo->flags = 0;
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
}
|
||||
else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */
|
||||
{
|
||||
tileinfo->group = 1;
|
||||
tileinfo->category = 1;
|
||||
SET_TILE_INFO(
|
||||
1,
|
||||
(tile & 0xfffff) + 2*(code & 0xf),
|
||||
@ -237,7 +209,7 @@ INLINE void get_tile_info_8bit( running_machine *machine, tile_data *tileinfo, i
|
||||
}
|
||||
else
|
||||
{
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
SET_TILE_INFO(
|
||||
0,
|
||||
(tile & 0xfffff) + (code & 0xf),
|
||||
@ -255,10 +227,6 @@ INLINE void get_tile_info_16x16_8bit( running_machine *machine, tile_data *tilei
|
||||
int table_index;
|
||||
UINT32 tile;
|
||||
|
||||
/* The actual tile index depends on the window */
|
||||
tile_index = ((tile_index / WIN_NX + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX +
|
||||
((tile_index % WIN_NX + state->window[layer * 2 + 1] / 8) % BIG_NX);
|
||||
|
||||
/* Fetch the code */
|
||||
code = vram[tile_index];
|
||||
|
||||
@ -272,11 +240,11 @@ INLINE void get_tile_info_16x16_8bit( running_machine *machine, tile_data *tilei
|
||||
tileinfo->pen_data = state->empty_tiles + _code * 16 * 16;
|
||||
tileinfo->palette_base = ((code & 0x0ff0)) + 0x1000;
|
||||
tileinfo->flags = 0;
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
}
|
||||
else if ((tile & 0x00f00000) == 0x00f00000) /* draw tile as 8bpp */
|
||||
{
|
||||
tileinfo->group = 1;
|
||||
tileinfo->category = 1;
|
||||
SET_TILE_INFO(
|
||||
3,
|
||||
(tile & 0xfffff) + 8*(code & 0xf),
|
||||
@ -285,7 +253,7 @@ INLINE void get_tile_info_16x16_8bit( running_machine *machine, tile_data *tilei
|
||||
}
|
||||
else
|
||||
{
|
||||
tileinfo->group = 0;
|
||||
tileinfo->category = 0;
|
||||
SET_TILE_INFO(
|
||||
2,
|
||||
(tile & 0xfffff) + 4*(code & 0xf),
|
||||
@ -295,27 +263,16 @@ INLINE void get_tile_info_16x16_8bit( running_machine *machine, tile_data *tilei
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INLINE void metro_vram_w( running_machine *machine, offs_t offset, UINT16 data, UINT16 mem_mask, int layer, UINT16 *vram )
|
||||
{
|
||||
metro_state *state = (metro_state *)machine->driver_data;
|
||||
|
||||
COMBINE_DATA(&vram[offset]);
|
||||
{
|
||||
/* Account for the window */
|
||||
int col = (offset % BIG_NX) - ((state->window[layer * 2 + 1] / 8) % BIG_NX);
|
||||
int row = (offset / BIG_NX) - ((state->window[layer * 2 + 0] / 8) % BIG_NY);
|
||||
if (col < -(BIG_NX-WIN_NX)) col += (BIG_NX-WIN_NX) + WIN_NX;
|
||||
if (row < -(BIG_NY-WIN_NY)) row += (BIG_NY-WIN_NY) + WIN_NY;
|
||||
if ((col >= 0) && (col < WIN_NX) && (row >= 0) && (row < WIN_NY))
|
||||
{
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap[layer], row * WIN_NX + col);
|
||||
if (state->tilemap_16x16[layer])
|
||||
tilemap_mark_tile_dirty(state->tilemap_16x16[layer], row * WIN_NX + col);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap[layer], offset);
|
||||
if (state->bg_tilemap_16x16[layer])
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap_16x16[layer], offset);
|
||||
}
|
||||
|
||||
|
||||
static TILE_GET_INFO( get_tile_info_0 ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info(machine, tileinfo, tile_index, 0, state->vram_0); }
|
||||
@ -330,6 +287,7 @@ static TILE_GET_INFO( get_tile_info_0_16x16_8bit ) { metro_state *state = (metro
|
||||
static TILE_GET_INFO( get_tile_info_1_16x16_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_16x16_8bit(machine, tileinfo, tile_index, 1, state->vram_1); }
|
||||
static TILE_GET_INFO( get_tile_info_2_16x16_8bit ) { metro_state *state = (metro_state *)machine->driver_data; get_tile_info_16x16_8bit(machine, tileinfo, tile_index, 2, state->vram_2); }
|
||||
|
||||
|
||||
WRITE16_HANDLER( metro_vram_0_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 0, state->vram_0); }
|
||||
WRITE16_HANDLER( metro_vram_1_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 1, state->vram_1); }
|
||||
WRITE16_HANDLER( metro_vram_2_w ) { metro_state *state = (metro_state *)space->machine->driver_data; metro_vram_w(space->machine, offset, data, mem_mask, 2, state->vram_2); }
|
||||
@ -340,15 +298,8 @@ WRITE16_HANDLER( metro_vram_2_w ) { metro_state *state = (metro_state *)space->m
|
||||
WRITE16_HANDLER( metro_window_w )
|
||||
{
|
||||
metro_state *state = (metro_state *)space->machine->driver_data;
|
||||
UINT16 olddata = state->window[offset];
|
||||
UINT16 newdata = COMBINE_DATA(&state->window[offset]);
|
||||
if (newdata != olddata)
|
||||
{
|
||||
offset /= 2;
|
||||
tilemap_mark_all_tiles_dirty(state->bg_tilemap[offset]);
|
||||
if (state->tilemap_16x16[offset])
|
||||
tilemap_mark_all_tiles_dirty(state->tilemap_16x16[offset]);
|
||||
}
|
||||
COMBINE_DATA(&state->window[offset]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -374,20 +325,21 @@ static void dirty_tiles( running_machine *machine, int layer, UINT16 *vram )
|
||||
{
|
||||
metro_state *state = (metro_state *)machine->driver_data;
|
||||
int col, row;
|
||||
int offset = 0;
|
||||
|
||||
for (row = 0; row < WIN_NY; row++)
|
||||
for (row = 0; row < BIG_NY; row++)
|
||||
{
|
||||
for (col = 0; col < WIN_NX; col++)
|
||||
for (col = 0; col < BIG_NX; col++)
|
||||
{
|
||||
int offset = (col + state->window[layer * 2 + 1] / 8) % BIG_NX +
|
||||
((row + state->window[layer * 2 + 0] / 8) % BIG_NY) * BIG_NX;
|
||||
UINT16 code = vram[offset];
|
||||
|
||||
offset++;
|
||||
|
||||
if (!(code & 0x8000) && state->dirtyindex[(code & 0x1ff0) >> 4])
|
||||
{
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap[layer], row * WIN_NX + col);
|
||||
if (state->tilemap_16x16[layer])
|
||||
tilemap_mark_tile_dirty(state->tilemap_16x16[layer], row * WIN_NX + col);
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap[layer], offset);
|
||||
if (state->bg_tilemap_16x16[layer])
|
||||
tilemap_mark_tile_dirty(state->bg_tilemap_16x16[layer], offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -431,22 +383,13 @@ VIDEO_START( metro_14100 )
|
||||
state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2);
|
||||
state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4);
|
||||
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
|
||||
state->tilemap_16x16[0] = NULL;
|
||||
state->tilemap_16x16[1] = NULL;
|
||||
state->tilemap_16x16[2] = NULL;
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
state->bg_tilemap_16x16[0] = NULL;
|
||||
state->bg_tilemap_16x16[1] = NULL;
|
||||
state->bg_tilemap_16x16[2] = NULL;
|
||||
|
||||
state_save_register_global_pointer(machine, state->tiletable_old, state->tiletable_size / 2);
|
||||
state_save_register_postload(machine, metro_tile_dirty_postload, NULL);
|
||||
@ -465,22 +408,13 @@ VIDEO_START( metro_14220 )
|
||||
state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2);
|
||||
state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4);
|
||||
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
|
||||
state->tilemap_16x16[0] = NULL;
|
||||
state->tilemap_16x16[1] = NULL;
|
||||
state->tilemap_16x16[2] = NULL;
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
state->bg_tilemap_16x16[0] = NULL;
|
||||
state->bg_tilemap_16x16[1] = NULL;
|
||||
state->bg_tilemap_16x16[2] = NULL;
|
||||
|
||||
tilemap_set_scrolldx(state->bg_tilemap[0], -2, 2);
|
||||
tilemap_set_scrolldx(state->bg_tilemap[1], -2, 2);
|
||||
@ -503,31 +437,13 @@ VIDEO_START( metro_14300 )
|
||||
state->tiletable_old = auto_alloc_array(machine, UINT16, state->tiletable_size / 2);
|
||||
state->dirtyindex = auto_alloc_array(machine, UINT8, state->tiletable_size / 4);
|
||||
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, WIN_NX, WIN_NY);
|
||||
state->bg_tilemap[0] = tilemap_create(machine, get_tile_info_0_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[1] = tilemap_create(machine, get_tile_info_1_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap[2] = tilemap_create(machine, get_tile_info_2_8bit, tilemap_scan_rows, 8, 8, BIG_NX, BIG_NY);
|
||||
|
||||
state->tilemap_16x16[0] = tilemap_create(machine, get_tile_info_0_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY);
|
||||
state->tilemap_16x16[1] = tilemap_create(machine, get_tile_info_1_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY);
|
||||
state->tilemap_16x16[2] = tilemap_create(machine, get_tile_info_2_16x16_8bit, tilemap_scan_rows, 16, 16, WIN_NX, WIN_NY);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->bg_tilemap[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[0], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[0], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[1], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[1], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[2], 0, 15, TILEMAP_PIXEL_TRANSPARENT);
|
||||
tilemap_map_pen_to_layer(state->tilemap_16x16[2], 1, 255, TILEMAP_PIXEL_TRANSPARENT);
|
||||
state->bg_tilemap_16x16[0] = tilemap_create(machine, get_tile_info_0_16x16_8bit, tilemap_scan_rows, 16, 16, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap_16x16[1] = tilemap_create(machine, get_tile_info_1_16x16_8bit, tilemap_scan_rows, 16, 16, BIG_NX, BIG_NY);
|
||||
state->bg_tilemap_16x16[2] = tilemap_create(machine, get_tile_info_2_16x16_8bit, tilemap_scan_rows, 16, 16, BIG_NX, BIG_NY);
|
||||
|
||||
state_save_register_global_pointer(machine, state->tiletable_old, state->tiletable_size / 2);
|
||||
state_save_register_postload(machine, metro_tile_dirty_postload, NULL);
|
||||
@ -712,7 +628,7 @@ void metro_draw_sprites( running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
gfxdata = base_gfx + (8 * 8 * 4 / 8) * (((attr & 0x000f) << 16) + code);
|
||||
|
||||
if (flip_screen_get(machine))
|
||||
if (state->flip_screen)
|
||||
{
|
||||
flipx = !flipx; x = max_x - x - width;
|
||||
flipy = !flipy; y = max_y - y - height;
|
||||
@ -772,65 +688,126 @@ void metro_draw_sprites( running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
static void draw_tilemap( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT32 priority,
|
||||
/* copy a 'window' from the large 2048x2048 (or 4096x4096 for 16x16 tiles) tilemap */
|
||||
|
||||
static void draw_tilemap( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, tilemap_t *tmap, UINT32 flags, UINT32 pcode,
|
||||
int sx, int sy, int wx, int wy ) // scroll & window values
|
||||
{
|
||||
#if 1
|
||||
tilemap_set_scrollx(tmap, 0, sx - wx + (wx & 7));
|
||||
tilemap_set_scrolly(tmap, 0, sy - wy + (wy & 7));
|
||||
tilemap_draw(bitmap, cliprect, tmap, flags, priority);
|
||||
#else
|
||||
int x, y, i;
|
||||
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
|
||||
metro_state *state = (metro_state *)machine->driver_data;
|
||||
|
||||
/* sub tile placement */
|
||||
// sx = sx - (wx & ~7) + (wx & 7);
|
||||
sx = sx - wx;
|
||||
sx = ((sx & 0x7fff) - (sx & 0x8000)) % ((WIN_NX - 1) * 8);
|
||||
UINT16 *srcpixline;
|
||||
UINT8 *srcflgline;
|
||||
int y;
|
||||
|
||||
// sy = sy - (wy & ~7) + (wy & 7);
|
||||
sy = sy - wy;
|
||||
sy = ((sy & 0x7fff) - (sy & 0x8000)) % ((WIN_NY - 1) * 8);
|
||||
bitmap_t *pixdata = tilemap_get_pixmap(tmap);
|
||||
bitmap_t *flgdata = tilemap_get_flagsmap(tmap);
|
||||
bitmap_t *priority_bitmap = machine->priority_bitmap;
|
||||
|
||||
/* splitting point */
|
||||
x = (WIN_NX - 1) * 8 - sx;
|
||||
int width = pixdata->width;
|
||||
int height = pixdata->height;
|
||||
|
||||
int scrwidth = bitmap->width;
|
||||
int scrheight = bitmap->height;
|
||||
|
||||
y = (WIN_NY - 1) * 8 - sy;
|
||||
int windowwidth = width >> 2;
|
||||
int windowheight = height >> 3;
|
||||
|
||||
for (i = 0; i < 4 ; i++)
|
||||
if (tilemap_get_enable(tmap)==0) return;
|
||||
|
||||
if (!state->flip_screen)
|
||||
{
|
||||
rectangle clip;
|
||||
|
||||
tilemap_set_scrollx(tmap, 0, sx + ((i & 1) ? -x : 0));
|
||||
tilemap_set_scrolly(tmap, 0, sy + ((i & 2) ? -y : 0));
|
||||
|
||||
clip.min_x = x - ((i & 1) ? 0 : (WIN_NX - 1) * 8);
|
||||
clip.min_y = y - ((i & 2) ? 0 : (WIN_NY - 1) * 8);
|
||||
|
||||
clip.max_x = clip.min_x + (WIN_NX - 1) * 8 - 1;
|
||||
clip.max_y = clip.min_y + (WIN_NY - 1) * 8 - 1;
|
||||
|
||||
if (clip.min_x > visarea->max_x) continue;
|
||||
if (clip.min_y > visarea->max_y) continue;
|
||||
|
||||
if (clip.max_x < visarea->min_x) continue;
|
||||
if (clip.max_y < visarea->min_y) continue;
|
||||
|
||||
if (clip.min_x < visarea->min_x) clip.min_x = visarea->min_x;
|
||||
if (clip.max_x > visarea->max_x) clip.max_x = visarea->max_x;
|
||||
|
||||
if (clip.min_y < visarea->min_y) clip.min_y = visarea->min_y;
|
||||
if (clip.max_y > visarea->max_y) clip.max_y = visarea->max_y;
|
||||
|
||||
/* The clip region's width must be a multiple of 8!
|
||||
This fact renderes the function useless, as far as
|
||||
we are concerned! */
|
||||
tilemap_set_clip(tmap, &clip);
|
||||
tilemap_draw(bitmap, cliprect, tmap, flags, priority);
|
||||
sx -= tilemap_get_scrolldx(tmap);
|
||||
sy -= tilemap_get_scrolldy(tmap);
|
||||
}
|
||||
else
|
||||
{
|
||||
sx += tilemap_get_scrolldx(tmap);
|
||||
sy += tilemap_get_scrolldy(tmap);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
for (y=0;y<scrheight;y++)
|
||||
{
|
||||
int scrolly = (sy+y-wy)&(windowheight-1);
|
||||
int x;
|
||||
UINT16* dst;
|
||||
UINT8 *priority_baseaddr;
|
||||
|
||||
srcpixline = BITMAP_ADDR16(pixdata,(wy+scrolly)&(height-1), 0);
|
||||
srcflgline = BITMAP_ADDR8(flgdata,(wy+scrolly)&(height-1), 0);
|
||||
|
||||
if (!state->flip_screen)
|
||||
{
|
||||
dst = BITMAP_ADDR16(bitmap, y, 0);
|
||||
priority_baseaddr = BITMAP_ADDR8(priority_bitmap, y, 0);
|
||||
|
||||
for (x=0;x<scrwidth;x++)
|
||||
{
|
||||
int scrollx = (sx+x-wx)&(windowwidth-1);
|
||||
UINT16 dat;
|
||||
UINT8 flg;
|
||||
|
||||
dat = srcpixline[(wx+scrollx)&(width-1)];
|
||||
flg = srcflgline[(wx+scrollx)&(width-1)];
|
||||
|
||||
|
||||
if (flg&0xf) // check category bits to see if we're 4bpp/8bpp
|
||||
{
|
||||
// 8bpp tile data
|
||||
if ((dat&0xff) != 0xff)
|
||||
{
|
||||
dst[x] = dat;
|
||||
priority_baseaddr[x] = (priority_baseaddr[x] & (pcode >> 8)) | pcode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 4bpp tile data
|
||||
if ((dat&0xf) != 0xf)
|
||||
{
|
||||
dst[x] = dat;
|
||||
priority_baseaddr[x] = (priority_baseaddr[x] & (pcode >> 8)) | pcode;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else // flipped case
|
||||
{
|
||||
dst = BITMAP_ADDR16(bitmap, scrheight-y-1, 0);
|
||||
priority_baseaddr = BITMAP_ADDR8(priority_bitmap, scrheight-y-1, 0);
|
||||
|
||||
for (x=0;x<scrwidth;x++)
|
||||
{
|
||||
int scrollx = (sx+x-wx)&(windowwidth-1);
|
||||
UINT16 dat;
|
||||
UINT8 flg;
|
||||
|
||||
dat = srcpixline[(wx+scrollx)&(width-1)];
|
||||
flg = srcflgline[(wx+scrollx)&(width-1)];
|
||||
|
||||
|
||||
if (flg&0xf) // check category bits to see if we're 4bpp/8bpp
|
||||
{
|
||||
// 8bpp tile data
|
||||
if ((dat&0xff) != 0xff)
|
||||
{
|
||||
dst[scrwidth-x-1] = dat;
|
||||
priority_baseaddr[scrwidth-x-1] = (priority_baseaddr[scrwidth-x-1] & (pcode >> 8)) | pcode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 4bpp tile data
|
||||
if ((dat&0xf) != 0xf)
|
||||
{
|
||||
dst[scrwidth-x-1] = dat;
|
||||
priority_baseaddr[scrwidth-x-1] = (priority_baseaddr[scrwidth-x-1] & (pcode >> 8)) | pcode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Draw all the layers that match the given priority */
|
||||
static void draw_layers( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri, int layers_ctrl )
|
||||
@ -850,10 +827,9 @@ static void draw_layers( running_machine *machine, bitmap_t *bitmap, const recta
|
||||
|
||||
if (BIT(layers_ctrl, layer)) // for debug
|
||||
{
|
||||
/* Only *one* of tilemap_16x16 & tilemap is enabled at any given time! */
|
||||
draw_tilemap(machine, bitmap, cliprect, state->bg_tilemap[layer], 0, 1 << (3 - pri), sx, sy, wx, wy);
|
||||
if (state->tilemap_16x16[layer])
|
||||
draw_tilemap(machine, bitmap, cliprect, state->tilemap_16x16[layer], 0, 1 << (3 - pri), sx, sy, wx, wy);
|
||||
if (state->bg_tilemap_16x16[layer])
|
||||
draw_tilemap(machine, bitmap, cliprect, state->bg_tilemap_16x16[layer], 0, 1 << (3 - pri), sx, sy, wx, wy);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -913,7 +889,8 @@ VIDEO_UPDATE( metro )
|
||||
if (screenctrl & 2)
|
||||
return 0;
|
||||
|
||||
flip_screen_set(screen->machine, screenctrl & 1);
|
||||
//flip_screen_set(screen->machine, screenctrl & 1);
|
||||
state->flip_screen = screenctrl & 1;
|
||||
|
||||
/* If the game supports 16x16 tiles, make sure that the
|
||||
16x16 and 8x8 tilemaps of a given layer are not simultaneously
|
||||
@ -927,7 +904,7 @@ VIDEO_UPDATE( metro )
|
||||
int big = screenctrl & (0x0020 << layer);
|
||||
|
||||
tilemap_set_enable(state->bg_tilemap[layer],!big);
|
||||
tilemap_set_enable(state->tilemap_16x16[layer], big);
|
||||
tilemap_set_enable(state->bg_tilemap_16x16[layer], big);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user