fixed long-standing bug with Emeralda text colors. A sprite attribute exists which signals an alternate interpretation of palette ram.

fixed priority for the bitmap layer used in Numan Athletics
This commit is contained in:
Phil Stroffolino 2008-05-15 12:43:54 +00:00
parent 21a686cf7d
commit bc4b470ebb
3 changed files with 46 additions and 59 deletions

View File

@ -828,14 +828,10 @@ transfer_dword( running_machine *machine, UINT32 dest, UINT32 source )
{ {
namcona1_gfxram_w( machine, (dest-0xf40000)/2, data, 0xffff ); namcona1_gfxram_w( machine, (dest-0xf40000)/2, data, 0xffff );
} }
else if( dest>=0xff0000 && dest<0xff8000 ) else if( dest>=0xff0000 && dest<0xffc000 )
{ {
namcona1_videoram_w( machine, (dest-0xff0000)/2, data, 0xffff ); namcona1_videoram_w( machine, (dest-0xff0000)/2, data, 0xffff );
} }
else if( dest>=0xff8000 && dest<0xffc000 )
{
namcona1_rozvideoram_w( machine, (dest-0xff8000)/2, data, 0xffff );
}
else if( dest>=0xfff000 && dest<0x1000000 ) else if( dest>=0xfff000 && dest<0x1000000 )
{ {
spriteram16[(dest-0xfff000)/2] = data; spriteram16[(dest-0xfff000)/2] = data;
@ -1049,8 +1045,7 @@ static ADDRESS_MAP_START( namcona1_main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xefff00, 0xefffff) AM_READWRITE(namcona1_vreg_r, namcona1_vreg_w) AM_BASE(&namcona1_vreg) AM_RANGE(0xefff00, 0xefffff) AM_READWRITE(namcona1_vreg_r, namcona1_vreg_w) AM_BASE(&namcona1_vreg)
AM_RANGE(0xf00000, 0xf01fff) AM_READWRITE(namcona1_paletteram_r, namcona1_paletteram_w) AM_BASE(&paletteram16) AM_RANGE(0xf00000, 0xf01fff) AM_READWRITE(namcona1_paletteram_r, namcona1_paletteram_w) AM_BASE(&paletteram16)
AM_RANGE(0xf40000, 0xf7ffff) AM_READWRITE(namcona1_gfxram_r, namcona1_gfxram_w) AM_RANGE(0xf40000, 0xf7ffff) AM_READWRITE(namcona1_gfxram_r, namcona1_gfxram_w)
AM_RANGE(0xff0000, 0xff7fff) AM_READWRITE(namcona1_videoram_r, namcona1_videoram_w) AM_BASE(&videoram16) AM_RANGE(0xff0000, 0xffbfff) AM_READWRITE(namcona1_videoram_r, namcona1_videoram_w) AM_BASE(&videoram16)
AM_RANGE(0xff8000, 0xffbfff) AM_READWRITE(namcona1_rozvideoram_r, namcona1_rozvideoram_w) AM_BASE(&namcona1_rozvideoram)
AM_RANGE(0xffd000, 0xffdfff) AM_RAM /* unknown */ AM_RANGE(0xffd000, 0xffdfff) AM_RAM /* unknown */
AM_RANGE(0xffe000, 0xffefff) AM_RAM AM_BASE(&namcona1_scroll) /* scroll registers */ AM_RANGE(0xffe000, 0xffefff) AM_RAM AM_BASE(&namcona1_scroll) /* scroll registers */
AM_RANGE(0xfff000, 0xffffff) AM_RAM AM_BASE(&spriteram16) /* spriteram */ AM_RANGE(0xfff000, 0xffffff) AM_RAM AM_BASE(&spriteram16) /* spriteram */
@ -1309,7 +1304,7 @@ static MACHINE_DRIVER_START( namcona1 )
MDRV_SCREEN_SIZE(38*8, 32*8) MDRV_SCREEN_SIZE(38*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1) MDRV_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1)
MDRV_PALETTE_LENGTH(0x1000) MDRV_PALETTE_LENGTH(0x2000)
MDRV_VIDEO_START(namcona1) MDRV_VIDEO_START(namcona1)
MDRV_VIDEO_UPDATE(namcona1) MDRV_VIDEO_UPDATE(namcona1)
@ -1345,8 +1340,7 @@ static ADDRESS_MAP_START( namcona2_readmem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xefff00, 0xefffff) AM_READ(namcona1_vreg_r) AM_RANGE(0xefff00, 0xefffff) AM_READ(namcona1_vreg_r)
AM_RANGE(0xf00000, 0xf01fff) AM_READ(namcona1_paletteram_r) AM_RANGE(0xf00000, 0xf01fff) AM_READ(namcona1_paletteram_r)
AM_RANGE(0xf40000, 0xf7ffff) AM_READ(namcona1_gfxram_r) AM_RANGE(0xf40000, 0xf7ffff) AM_READ(namcona1_gfxram_r)
AM_RANGE(0xff0000, 0xff7fff) AM_READ(namcona1_videoram_r) AM_RANGE(0xff0000, 0xffbfff) AM_READ(namcona1_videoram_r)
AM_RANGE(0xff8000, 0xffbfff) AM_READ(namcona1_rozvideoram_r )
AM_RANGE(0xffd000, 0xffdfff) AM_READ(SMH_RAM) /* unknown */ AM_RANGE(0xffd000, 0xffdfff) AM_READ(SMH_RAM) /* unknown */
AM_RANGE(0xffe000, 0xffefff) AM_READ(SMH_RAM) /* scroll registers */ AM_RANGE(0xffe000, 0xffefff) AM_READ(SMH_RAM) /* scroll registers */
AM_RANGE(0xfff000, 0xffffff) AM_READ(SMH_RAM) /* spriteram */ AM_RANGE(0xfff000, 0xffffff) AM_READ(SMH_RAM) /* spriteram */
@ -1366,8 +1360,7 @@ static ADDRESS_MAP_START( namcona2_writemem, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xefff00, 0xefffff) AM_WRITE(namcona1_vreg_w) AM_BASE(&namcona1_vreg) AM_RANGE(0xefff00, 0xefffff) AM_WRITE(namcona1_vreg_w) AM_BASE(&namcona1_vreg)
AM_RANGE(0xf00000, 0xf01fff) AM_WRITE(namcona1_paletteram_w) AM_BASE(&paletteram16) AM_RANGE(0xf00000, 0xf01fff) AM_WRITE(namcona1_paletteram_w) AM_BASE(&paletteram16)
AM_RANGE(0xf40000, 0xf7ffff) AM_WRITE(namcona1_gfxram_w) AM_RANGE(0xf40000, 0xf7ffff) AM_WRITE(namcona1_gfxram_w)
AM_RANGE(0xff0000, 0xff7fff) AM_WRITE(namcona1_videoram_w) AM_BASE(&videoram16) AM_RANGE(0xff0000, 0xffbfff) AM_WRITE(namcona1_videoram_w) AM_BASE(&videoram16)
AM_RANGE(0xff8000, 0xffbfff) AM_WRITE(namcona1_rozvideoram_w) AM_BASE(&namcona1_rozvideoram)
AM_RANGE(0xffd000, 0xffdfff) AM_WRITE(SMH_RAM) /* unknown */ AM_RANGE(0xffd000, 0xffdfff) AM_WRITE(SMH_RAM) /* unknown */
AM_RANGE(0xffe000, 0xffefff) AM_WRITE(SMH_RAM) AM_BASE(&namcona1_scroll) AM_RANGE(0xffe000, 0xffefff) AM_WRITE(SMH_RAM) AM_BASE(&namcona1_scroll)
AM_RANGE(0xfff000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16) AM_RANGE(0xfff000, 0xffffff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram16)
@ -1398,7 +1391,7 @@ static MACHINE_DRIVER_START( namcona2 )
MDRV_SCREEN_SIZE(38*8, 32*8) MDRV_SCREEN_SIZE(38*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1) MDRV_SCREEN_VISIBLE_AREA(8, 38*8-1-8, 4*8, 32*8-1)
MDRV_PALETTE_LENGTH(0x1000) MDRV_PALETTE_LENGTH(0x2000)
MDRV_VIDEO_START(namcona1) MDRV_VIDEO_START(namcona1)
MDRV_VIDEO_UPDATE(namcona1) MDRV_VIDEO_UPDATE(namcona1)

View File

@ -22,14 +22,10 @@ enum
#define NA1_NVRAM_SIZE (0x800) #define NA1_NVRAM_SIZE (0x800)
extern UINT16 *namcona1_rozvideoram;
extern UINT16 *namcona1_workram; extern UINT16 *namcona1_workram;
extern UINT16 *namcona1_vreg; extern UINT16 *namcona1_vreg;
extern UINT16 *namcona1_scroll; extern UINT16 *namcona1_scroll;
extern WRITE16_HANDLER( namcona1_rozvideoram_w );
extern READ16_HANDLER( namcona1_rozvideoram_r );
extern WRITE16_HANDLER( namcona1_videoram_w ); extern WRITE16_HANDLER( namcona1_videoram_w );
extern READ16_HANDLER( namcona1_videoram_r ); extern READ16_HANDLER( namcona1_videoram_r );

View File

@ -16,7 +16,6 @@ UINT16 *namcona1_vreg;
UINT16 *namcona1_scroll; UINT16 *namcona1_scroll;
UINT16 *namcona1_workram; UINT16 *namcona1_workram;
UINT16 *namcona1_sparevram; UINT16 *namcona1_sparevram;
UINT16 *namcona1_rozvideoram;
UINT16 *namcona1_pixmap; UINT16 *namcona1_pixmap;
/* private variables */ /* private variables */
@ -95,7 +94,7 @@ static TILE_GET_INFO( roz_get_info )
int use_4bpp_gfx = namcona1_vreg[0xbc/2]&16; int use_4bpp_gfx = namcona1_vreg[0xbc/2]&16;
int c = tile_index%0x40; int c = tile_index%0x40;
int r = tile_index/0x40; int r = tile_index/0x40;
int data = namcona1_rozvideoram[(r/4)*0x40+c/4]+(c%4)+(r%4)*0x40; int data = videoram16[0x8000/2+(r/4)*0x40+c/4]+(c%4)+(r%4)*0x40;
int tile = data&0xfff; int tile = data&0xfff;
int gfx = use_4bpp_gfx; int gfx = use_4bpp_gfx;
if( use_4bpp_gfx ) if( use_4bpp_gfx )
@ -129,22 +128,19 @@ static TILE_GET_INFO( roz_get_info )
} }
} /* roz_get_info */ } /* roz_get_info */
WRITE16_HANDLER( namcona1_rozvideoram_w )
{
COMBINE_DATA( &namcona1_rozvideoram[offset] );
roz_dirty = 1;
}
READ16_HANDLER( namcona1_rozvideoram_r )
{
return namcona1_rozvideoram[offset];
}
/*************************************************************************/ /*************************************************************************/
WRITE16_HANDLER( namcona1_videoram_w ) WRITE16_HANDLER( namcona1_videoram_w )
{ {
COMBINE_DATA( &videoram16[offset] ); COMBINE_DATA( &videoram16[offset] );
tilemap_mark_tile_dirty( bg_tilemap[offset/0x1000], offset&0xfff ); if( offset<0x8000/2 )
{
tilemap_mark_tile_dirty( bg_tilemap[offset/0x1000], offset&0xfff );
}
else if( offset<0xa000/2 )
{
roz_dirty = 1;
}
} /* namcona1_videoram_w */ } /* namcona1_videoram_w */
READ16_HANDLER( namcona1_videoram_r ) READ16_HANDLER( namcona1_videoram_r )
@ -157,8 +153,20 @@ READ16_HANDLER( namcona1_videoram_r )
static void static void
UpdatePalette(running_machine *machine, int offset ) UpdatePalette(running_machine *machine, int offset )
{ {
UINT16 color = paletteram16[offset]; /* -RRRRRGGGGGBBBBB */ int r,g,b;
palette_set_color_rgb( machine, offset, pal5bit(color >> 10), pal5bit(color >> 5), pal5bit(color >> 0)); UINT16 data = paletteram16[offset]; /* -RRRRRGG GGGBBBBB */
palette_set_color_rgb( machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0));
/**
* sprites can be configured to use an alternate interpretation of palette ram
* (used in-game in Emeraldia)
*
* RRRGGGBB RRRGGGBB
*/
r = ((data&0x00e0)>>5)|((data&0xe000)>>(13-3));
g = ((data&0x001c)>>2)|((data&0x1c00)>>(10-3));
b = ((data&0x0003)>>0)|((data&0x0300)>>(8-2));
palette_set_color_rgb( machine, offset+0x1000, pal6bit(r), pal6bit(g), pal4bit(b) );
} /* namcona1_paletteram_w */ } /* namcona1_paletteram_w */
READ16_HANDLER( namcona1_paletteram_r ) READ16_HANDLER( namcona1_paletteram_r )
@ -293,8 +301,7 @@ static void UpdateGfx(running_machine *machine)
} }
} }
pSource = namcona1_rozvideoram; for( i=0; i<0x1000; i++ )
for( i=0; i<0x800; i++ )
{ {
if( dirtychar[*pSource++ & 0xfff] ) if( dirtychar[*pSource++ & 0xfff] )
{ {
@ -303,7 +310,7 @@ static void UpdateGfx(running_machine *machine)
} }
} }
for( i = 0;i < 0x1000;i++ ) for( i = 0;i <0x1000; i++ )
{ {
if( dirtychar[i] ) if( dirtychar[i] )
{ {
@ -333,9 +340,8 @@ VIDEO_START( namcona1 )
} }
shaperam = auto_malloc( 0x2000*4 ); shaperam = auto_malloc( 0x2000*4 );
cgram = auto_malloc( 0x1000*0x20*2 ); cgram = auto_malloc( 0x1000*0x40 );
dirtychar = auto_malloc( 0x1000 ); dirtychar = auto_malloc( 0x1000 );
namcona1_rozvideoram = auto_malloc( 0x4000 );
gfx0 = allocgfx( &cg_layout_8bpp ); gfx0 = allocgfx( &cg_layout_8bpp );
gfx0->total_colors = machine->config->total_colors/256; gfx0->total_colors = machine->config->total_colors/256;
@ -476,8 +482,8 @@ static void pdraw_tile(running_machine *machine,
dest[x] = palette_shadow_table[dest[x]]; dest[x] = palette_shadow_table[dest[x]];
} }
else else
{ // bad? {
dest[x] = pal_base+c; dest[x] = pal_base + c + 0x1000;
} }
} }
else else
@ -584,13 +590,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static void draw_pixel_line( UINT16 *pDest, UINT8 *pPri, UINT16 *pSource, const pen_t *paldata ) static void draw_pixel_line( UINT16 *pDest, UINT8 *pPri, UINT16 *pSource, const pen_t *paldata )
{ {
int x; int x;
UINT16 data;
for( x=0; x<38*8; x+=2 ) for( x=0; x<38*8; x+=2 )
{ {
pPri[x / 2] = 0xff; UINT16 data = *pSource++;
data = *pSource++; pPri[x+0] = 0xff;
pDest[x] = paldata[data>>8]; pPri[x+1] = 0xff;
pDest[x+0] = paldata[data>>8];
pDest[x+1] = paldata[data&0xff]; pDest[x+1] = paldata[data&0xff];
} /* next x */ } /* next x */
} /* draw_pixel_line */ } /* draw_pixel_line */
@ -647,32 +652,25 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
draw_pixel_line( draw_pixel_line(
BITMAP_ADDR16(bitmap, line, 0), BITMAP_ADDR16(bitmap, line, 0),
BITMAP_ADDR8(priority_bitmap, line, 0), BITMAP_ADDR8(priority_bitmap, line, 0),
namcona1_rozvideoram + (ydata-0x4000) + 25, videoram16 + ydata + 25,
paldata ); paldata );
} }
else else
{ {
// used in emeraldia if(which == NAMCONA1_NUM_TILEMAPS )
if(which == NAMCONA1_NUM_TILEMAPS )// && namcona1_vreg[0x8a/2] == 0xfd /* maybe reg & 0x4 */)
{ {
int incxx = ((INT16)namcona1_vreg[0xc0/2])<<8; // or incyy ? int incxx = ((INT16)namcona1_vreg[0xc0/2])<<8;
int incxy = ((INT16)namcona1_vreg[0xc2/2])<<8; int incxy = ((INT16)namcona1_vreg[0xc2/2])<<8;
int incyx = ((INT16)namcona1_vreg[0xc4/2])<<8; int incyx = ((INT16)namcona1_vreg[0xc4/2])<<8;
int incyy = ((INT16)namcona1_vreg[0xc6/2])<<8; // or incxx ? int incyy = ((INT16)namcona1_vreg[0xc6/2])<<8;
INT16 xoffset = namcona1_vreg[0xc8/2]; INT16 xoffset = namcona1_vreg[0xc8/2];
INT16 yoffset = namcona1_vreg[0xca/2]; INT16 yoffset = namcona1_vreg[0xca/2];
int dx = 46; int dx = 46; /* horizontal adjust */
int dy = -8; int dy = -8; /* vertical adjust */
// now, apply adjustments to startx, starty to translate the
// ROZ plane. Note that these are corrected by the inc parameters
// to account for scale/rotate state.
UINT32 startx = (xoffset<<12)+incxx*dx+incyx*dy; UINT32 startx = (xoffset<<12)+incxx*dx+incyx*dy;
UINT32 starty = (yoffset<<12)+incxy*dx+incyy*dy; UINT32 starty = (yoffset<<12)+incxy*dx+incyy*dy;
tilemap_draw_roz_primask(bitmap, &clip, roz_tilemap, tilemap_draw_roz_primask(bitmap, &clip, roz_tilemap,
startx, starty, incxx, incxy, incyx, incyy, startx, starty, incxx, incxy, incyx, incyy, 0, 0, primask, 0);
0, 0, primask, 0);
} }
else else
{ {
@ -737,7 +735,7 @@ VIDEO_UPDATE( namcona1 )
{ {
for( which=4; which>=0; which-- ) for( which=4; which>=0; which-- )
{ {
int pri = namcona1_vreg[0xa0/2+which]&0x7; /* likely wrong for roz plane */ int pri = namcona1_vreg[0xa0/2+which]&0x7;
if( pri == priority ) if( pri == priority )
{ {
draw_background(screen->machine,bitmap,cliprect,which,priority); draw_background(screen->machine,bitmap,cliprect,which,priority);