From 4f3fbef885808ed481c18f6cdef3597d2d93f19b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Banaan=20Ananas?= Date: Sat, 1 Oct 2011 21:46:20 +0000 Subject: [PATCH] fix tokyowar sprite problems --- src/mame/drivers/namcos22.c | 4 +- src/mame/video/namcos22.c | 135 +++++++++++++++++++----------------- 2 files changed, 72 insertions(+), 67 deletions(-) diff --git a/src/mame/drivers/namcos22.c b/src/mame/drivers/namcos22.c index 8704e2acbe9..1821bc62f01 100644 --- a/src/mame/drivers/namcos22.c +++ b/src/mame/drivers/namcos22.c @@ -4981,7 +4981,7 @@ static INPUT_PORTS_START( tokyowar ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("View Change") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) // also view-change function PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Right Trigger") PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Left Trigger") PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -5746,7 +5746,7 @@ GAME( 1995, timecris, 0, namcos22s, timecris, timecris, ROT0, "Namco", " GAME( 1995, timecrisa,timecris, namcos22s, timecris, timecris, ROT0, "Namco", "Time Crisis (Rev. TS2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/01/08 18:56:09 GAME( 1996, propcycl, 0, namcos22s, propcycl, propcycl, ROT0, "Namco", "Prop Cycle (Rev. PR2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/06/18 21:22:13 GAME( 1996, alpinesa, 0, namcos22s, alpiner, alpinesa, ROT0, "Namco", "Alpine Surfer (Rev. AF2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // 96/07/01 15:19:23. major gfx problems, slave dsp? -GAME( 1996, tokyowar, 0, namcos22s, tokyowar, tokyowar, ROT0, "Namco", "Tokyo Wars (Rev. TW2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // 96/09/03 14:08:47. boots but missing sprite clear DMA? +GAME( 1996, tokyowar, 0, namcos22s, tokyowar, tokyowar, ROT0, "Namco", "Tokyo Wars (Rev. TW2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING ) // 96/09/03 14:08:47. near-invincible tanks, maybe related to timecris helicopter bug? GAME( 1996, aquajet, 0, namcos22s, aquajet, aquajet, ROT0, "Namco", "Aqua Jet (Rev. AJ2 Ver.B)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/09/20 14:28:30 GAME( 1996, alpinr2b, 0, namcos22s, alpiner, alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.B)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 97/01/10 17:10:59 GAME( 1996, alpinr2a, alpinr2b, namcos22s, alpiner, alpiner2, ROT0, "Namco", "Alpine Racer 2 (Rev. ARS2 Ver.A)" , GAME_IMPERFECT_SOUND|GAME_IMPERFECT_GRAPHICS ) // 96/12/06 13:45:05 diff --git a/src/mame/video/namcos22.c b/src/mame/video/namcos22.c index 9505e2791a2..8ce82218412 100644 --- a/src/mame/video/namcos22.c +++ b/src/mame/video/namcos22.c @@ -12,7 +12,8 @@ * - spritelayer: * + xy offset * + clipping to window - * + eliminate garbage (airco22b, tokyowar) + * + priority above textlayer (used in at least timecris) + * + eliminate garbage (airco22b) * * - lots of smaller issues * @@ -1260,10 +1261,11 @@ DrawSpritesHelper( for( i=num_sprites; i>=0; i-- ) { - /* + /* attrs: ----.-x--.----.----.----.----.----.---- hidden? ----.--xx.----.----.----.----.----.---- ? - ----.----.xxxx.xxxx.xxxx.----.----.---- always 0xff0? + ----.----.xxxx.xxxx.----.----.----.---- linktype? + ----.----.----.----.xxxx.xx--.----.---- always 0? ----.----.----.----.----.--x-.----.---- right justify ----.----.----.----.----.---x.----.---- bottom justify ----.----.----.----.----.----.x---.---- flipx @@ -1287,7 +1289,7 @@ DrawSpritesHelper( int zoomx = (1<<16)*sizex/0x20; int zoomy = (1<<16)*sizey/0x20; int flipy = attrs&0x8; - int numrows = attrs&0x7; /* 0000 0001 1111 1111 0000 0000 fccc frrr */ + int numrows = attrs&0x7; int linkType = (attrs&0x00ff0000)>>16; int flipx = (attrs>>4)&0x8; int numcols = (attrs>>4)&0x7; @@ -1325,10 +1327,7 @@ DrawSpritesHelper( //printf("[%02d]: tile %x pri %x color %x flipX %d flipY %d cols %d rows %d link %d X %d Y %d sX %d sY %d trans %d cz %d\n", //i, tile, cz&0x80, color&0x7f, flipx, flipy, numcols, numrows, linkType, xpos, ypos, sizex, sizey, translucency, cz); - if (color == 0) color = 0x67; // extreme hack for Tokyo Wars - node->data.sprite.tile = tile; - node->data.sprite.color = color; node->data.sprite.flipx = flipx; node->data.sprite.flipy = flipy; node->data.sprite.numcols = numcols; @@ -1339,8 +1338,9 @@ DrawSpritesHelper( node->data.sprite.sizex = sizex; node->data.sprite.sizey = sizey; node->data.sprite.translucency = translucency; - node->data.sprite.pri = 0; // ? (not cz&0x80, not color&0x80) + node->data.sprite.color = color; node->data.sprite.cz = cz; + node->data.sprite.pri = 0; // ? priority over textlayer (not cz&0x80 or color&0x80 or in attrs) } } /* visible sprite */ pSource -= 4; @@ -1421,12 +1421,12 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre ... */ UINT32 *spriteram32 = state->m_spriteram; - int num_sprites = ((spriteram32[0x04/4]>>16)&0x3ff)+1; - const UINT32 *pSource = &spriteram32[0x4000/4]; - const UINT32 *pPal = &spriteram32[0x20000/4]; + int num_sprites; + const UINT32 *pSource; + const UINT32 *pPal; + int deltax = spriteram32[0x14/4]>>16; int deltay = spriteram32[0x18/4]>>16; - int enable = spriteram32[0]>>16; #if 1 /* HACK for Tokyo Wars */ @@ -1444,13 +1444,18 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre } #endif - if( enable==6 ) + int enable = spriteram32[0]>>16; + num_sprites = spriteram32[0x04/4]>>16 & 0x3ff; + num_sprites++; // alpinerd, propcycl, .. but garbage in airco22b + if( num_sprites > 0 && enable == 6 ) { + pSource = &spriteram32[0x04000/4]; + pPal = &spriteram32[0x20000/4]; DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, deltax, deltay ); } /* VICS RAM provides two additional banks */ - /* + /* (still many unknowns here) 0x940000 -x------ sprite chip busy 0x940018 xxxx---- clr.w $940018.l @@ -1463,21 +1468,21 @@ DrawSprites( running_machine &machine, bitmap_t *bitmap, const rectangle *clipre 0x940060..0x94007c set#2 */ - num_sprites = (state->m_vics_control[0x40/4]&0xffff)/0x10; - if( num_sprites>=1 ) - { - pSource = &state->m_vics_data[(state->m_vics_control[0x48/4]&0xffff)/4]; - pPal = &state->m_vics_data[(state->m_vics_control[0x58/4]&0xffff)/4]; - DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, deltax, deltay ); - } - - num_sprites = (state->m_vics_control[0x60/4]&0xffff)/0x10; - if( num_sprites>=1 ) + num_sprites = state->m_vics_control[0x60/4] >> 4 & 0x1ff; + if( num_sprites > 0 ) { pSource = &state->m_vics_data[(state->m_vics_control[0x68/4]&0xffff)/4]; pPal = &state->m_vics_data[(state->m_vics_control[0x78/4]&0xffff)/4]; DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, deltax, deltay ); } + + num_sprites = state->m_vics_control[0x40/4] >> 4 & 0x1ff; + if( num_sprites > 0 ) + { + pSource = &state->m_vics_data[(state->m_vics_control[0x48/4]&0xffff)/4]; + pPal = &state->m_vics_data[(state->m_vics_control[0x58/4]&0xffff)/4]; + DrawSpritesHelper( machine, bitmap, cliprect, pSource, pPal, num_sprites, deltax, deltay ); + } } /* DrawSprites */ static void UpdatePalette(running_machine &machine) @@ -1602,28 +1607,28 @@ static void namcos22s_mix_textlayer( running_machine &machine, bitmap_t *bitmap, for (x=0;x<640;x++) { // skip if transparent or under poly/sprite - if (!pri[x] || pri[x]&1) - continue; - - rgbint rgb; - rgb_to_rgbint(&rgb, pens[src[x]]); - - // apply alpha - if (alpha_factor) + if (pri[x] == 2) { - UINT8 pen = src[x]&0xff; - if ((pen&0xf) == alpha_mask || pen == alpha_check12 || pen == alpha_check13) + rgbint rgb; + rgb_to_rgbint(&rgb, pens[src[x]]); + + // apply alpha + if (alpha_factor) { - rgbint mix; - rgb_to_rgbint(&mix, dest[x]); - rgbint_blend(&rgb, &mix, 0xff - alpha_factor); + UINT8 pen = src[x]&0xff; + if ((pen&0xf) == alpha_mask || pen == alpha_check12 || pen == alpha_check13) + { + rgbint mix; + rgb_to_rgbint(&mix, dest[x]); + rgbint_blend(&rgb, &mix, 0xff - alpha_factor); + } } + + if (fade_enabled) + rgbint_blend(&rgb, &fade_color, fade_factor); + + dest[x] = rgbint_to_rgb(&rgb); } - - if (fade_enabled) - rgbint_blend(&rgb, &fade_color, fade_factor); - - dest[x] = rgbint_to_rgb(&rgb); } } } @@ -1656,32 +1661,32 @@ static void namcos22_mix_textlayer( running_machine &machine, bitmap_t *bitmap, for (x=0;x<640;x++) { // skip if transparent or under poly/sprite - if (!pri[x] || pri[x]&1) - continue; - - // apply shadow - rgbint rgb; - switch (src[x] & 0xff) + if (pri[x] == 2) { - case 0xfc: - case 0xfd: - case 0xfe: - if (shadow_enabled) - { - rgb_to_rgbint(&rgb, dest[x]); - rgbint_scale_channel_and_clamp(&rgb, &rgb_mix[(src[x]&0xf)-0xc]); + // apply shadow + rgbint rgb; + switch (src[x] & 0xff) + { + case 0xfc: + case 0xfd: + case 0xfe: + if (shadow_enabled) + { + rgb_to_rgbint(&rgb, dest[x]); + rgbint_scale_channel_and_clamp(&rgb, &rgb_mix[(src[x]&0xf)-0xc]); + break; + } + // (fall through) + default: + rgb_to_rgbint(&rgb, pens[src[x]]); break; - } - // (fall through) - default: - rgb_to_rgbint(&rgb, pens[src[x]]); - break; + } + + if (fade_enabled) + rgbint_scale_channel_and_clamp(&rgb, &fade_color); + + dest[x] = rgbint_to_rgb(&rgb); } - - if (fade_enabled) - rgbint_scale_channel_and_clamp(&rgb, &fade_color); - - dest[x] = rgbint_to_rgb(&rgb); } } }