mirror of
https://github.com/holub/mame
synced 2025-05-04 13:33:05 +03:00
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:
parent
21a686cf7d
commit
bc4b470ebb
@ -828,14 +828,10 @@ transfer_dword( running_machine *machine, UINT32 dest, UINT32 source )
|
||||
{
|
||||
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 );
|
||||
}
|
||||
else if( dest>=0xff8000 && dest<0xffc000 )
|
||||
{
|
||||
namcona1_rozvideoram_w( machine, (dest-0xff8000)/2, data, 0xffff );
|
||||
}
|
||||
else if( dest>=0xfff000 && dest<0x1000000 )
|
||||
{
|
||||
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(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(0xff0000, 0xff7fff) 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(0xff0000, 0xffbfff) AM_READWRITE(namcona1_videoram_r, namcona1_videoram_w) AM_BASE(&videoram16)
|
||||
AM_RANGE(0xffd000, 0xffdfff) AM_RAM /* unknown */
|
||||
AM_RANGE(0xffe000, 0xffefff) AM_RAM AM_BASE(&namcona1_scroll) /* scroll registers */
|
||||
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_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_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(0xf00000, 0xf01fff) AM_READ(namcona1_paletteram_r)
|
||||
AM_RANGE(0xf40000, 0xf7ffff) AM_READ(namcona1_gfxram_r)
|
||||
AM_RANGE(0xff0000, 0xff7fff) AM_READ(namcona1_videoram_r)
|
||||
AM_RANGE(0xff8000, 0xffbfff) AM_READ(namcona1_rozvideoram_r )
|
||||
AM_RANGE(0xff0000, 0xffbfff) AM_READ(namcona1_videoram_r)
|
||||
AM_RANGE(0xffd000, 0xffdfff) AM_READ(SMH_RAM) /* unknown */
|
||||
AM_RANGE(0xffe000, 0xffefff) AM_READ(SMH_RAM) /* scroll registers */
|
||||
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(0xf00000, 0xf01fff) AM_WRITE(namcona1_paletteram_w) AM_BASE(&paletteram16)
|
||||
AM_RANGE(0xf40000, 0xf7ffff) AM_WRITE(namcona1_gfxram_w)
|
||||
AM_RANGE(0xff0000, 0xff7fff) AM_WRITE(namcona1_videoram_w) AM_BASE(&videoram16)
|
||||
AM_RANGE(0xff8000, 0xffbfff) AM_WRITE(namcona1_rozvideoram_w) AM_BASE(&namcona1_rozvideoram)
|
||||
AM_RANGE(0xff0000, 0xffbfff) AM_WRITE(namcona1_videoram_w) AM_BASE(&videoram16)
|
||||
AM_RANGE(0xffd000, 0xffdfff) AM_WRITE(SMH_RAM) /* unknown */
|
||||
AM_RANGE(0xffe000, 0xffefff) AM_WRITE(SMH_RAM) AM_BASE(&namcona1_scroll)
|
||||
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_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_UPDATE(namcona1)
|
||||
|
@ -22,14 +22,10 @@ enum
|
||||
|
||||
#define NA1_NVRAM_SIZE (0x800)
|
||||
|
||||
extern UINT16 *namcona1_rozvideoram;
|
||||
extern UINT16 *namcona1_workram;
|
||||
extern UINT16 *namcona1_vreg;
|
||||
extern UINT16 *namcona1_scroll;
|
||||
|
||||
extern WRITE16_HANDLER( namcona1_rozvideoram_w );
|
||||
extern READ16_HANDLER( namcona1_rozvideoram_r );
|
||||
|
||||
extern WRITE16_HANDLER( namcona1_videoram_w );
|
||||
extern READ16_HANDLER( namcona1_videoram_r );
|
||||
|
||||
|
@ -16,7 +16,6 @@ UINT16 *namcona1_vreg;
|
||||
UINT16 *namcona1_scroll;
|
||||
UINT16 *namcona1_workram;
|
||||
UINT16 *namcona1_sparevram;
|
||||
UINT16 *namcona1_rozvideoram;
|
||||
UINT16 *namcona1_pixmap;
|
||||
|
||||
/* private variables */
|
||||
@ -95,7 +94,7 @@ static TILE_GET_INFO( roz_get_info )
|
||||
int use_4bpp_gfx = namcona1_vreg[0xbc/2]&16;
|
||||
int c = 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 gfx = use_4bpp_gfx;
|
||||
if( use_4bpp_gfx )
|
||||
@ -129,22 +128,19 @@ static TILE_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 )
|
||||
{
|
||||
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 */
|
||||
|
||||
READ16_HANDLER( namcona1_videoram_r )
|
||||
@ -157,8 +153,20 @@ READ16_HANDLER( namcona1_videoram_r )
|
||||
static void
|
||||
UpdatePalette(running_machine *machine, int offset )
|
||||
{
|
||||
UINT16 color = paletteram16[offset]; /* -RRRRRGGGGGBBBBB */
|
||||
palette_set_color_rgb( machine, offset, pal5bit(color >> 10), pal5bit(color >> 5), pal5bit(color >> 0));
|
||||
int r,g,b;
|
||||
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 */
|
||||
|
||||
READ16_HANDLER( namcona1_paletteram_r )
|
||||
@ -293,8 +301,7 @@ static void UpdateGfx(running_machine *machine)
|
||||
}
|
||||
}
|
||||
|
||||
pSource = namcona1_rozvideoram;
|
||||
for( i=0; i<0x800; i++ )
|
||||
for( i=0; i<0x1000; i++ )
|
||||
{
|
||||
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] )
|
||||
{
|
||||
@ -333,9 +340,8 @@ VIDEO_START( namcona1 )
|
||||
}
|
||||
|
||||
shaperam = auto_malloc( 0x2000*4 );
|
||||
cgram = auto_malloc( 0x1000*0x20*2 );
|
||||
cgram = auto_malloc( 0x1000*0x40 );
|
||||
dirtychar = auto_malloc( 0x1000 );
|
||||
namcona1_rozvideoram = auto_malloc( 0x4000 );
|
||||
|
||||
gfx0 = allocgfx( &cg_layout_8bpp );
|
||||
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]];
|
||||
}
|
||||
else
|
||||
{ // bad?
|
||||
dest[x] = pal_base+c;
|
||||
{
|
||||
dest[x] = pal_base + c + 0x1000;
|
||||
}
|
||||
}
|
||||
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 )
|
||||
{
|
||||
int x;
|
||||
UINT16 data;
|
||||
|
||||
for( x=0; x<38*8; x+=2 )
|
||||
{
|
||||
pPri[x / 2] = 0xff;
|
||||
data = *pSource++;
|
||||
pDest[x] = paldata[data>>8];
|
||||
UINT16 data = *pSource++;
|
||||
pPri[x+0] = 0xff;
|
||||
pPri[x+1] = 0xff;
|
||||
pDest[x+0] = paldata[data>>8];
|
||||
pDest[x+1] = paldata[data&0xff];
|
||||
} /* next x */
|
||||
} /* draw_pixel_line */
|
||||
@ -647,32 +652,25 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
|
||||
draw_pixel_line(
|
||||
BITMAP_ADDR16(bitmap, line, 0),
|
||||
BITMAP_ADDR8(priority_bitmap, line, 0),
|
||||
namcona1_rozvideoram + (ydata-0x4000) + 25,
|
||||
videoram16 + ydata + 25,
|
||||
paldata );
|
||||
}
|
||||
else
|
||||
{
|
||||
// used in emeraldia
|
||||
if(which == NAMCONA1_NUM_TILEMAPS )// && namcona1_vreg[0x8a/2] == 0xfd /* maybe reg & 0x4 */)
|
||||
if(which == NAMCONA1_NUM_TILEMAPS )
|
||||
{
|
||||
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 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 yoffset = namcona1_vreg[0xca/2];
|
||||
int dx = 46;
|
||||
int dy = -8;
|
||||
|
||||
// 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.
|
||||
int dx = 46; /* horizontal adjust */
|
||||
int dy = -8; /* vertical adjust */
|
||||
UINT32 startx = (xoffset<<12)+incxx*dx+incyx*dy;
|
||||
UINT32 starty = (yoffset<<12)+incxy*dx+incyy*dy;
|
||||
|
||||
tilemap_draw_roz_primask(bitmap, &clip, roz_tilemap,
|
||||
startx, starty, incxx, incxy, incyx, incyy,
|
||||
0, 0, primask, 0);
|
||||
startx, starty, incxx, incxy, incyx, incyy, 0, 0, primask, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -737,7 +735,7 @@ VIDEO_UPDATE( namcona1 )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
draw_background(screen->machine,bitmap,cliprect,which,priority);
|
||||
|
Loading…
Reference in New Issue
Block a user