WIP Namco System 2/21/etc cleanup/modernization.

This commit is contained in:
Aaron Giles 2012-09-05 09:47:52 +00:00
parent 629a101739
commit f6c7aa39ba
17 changed files with 570 additions and 790 deletions

View File

@ -638,13 +638,16 @@ private:
// function definition for a get info callback
#define TILE_GET_INFO(_name) void _name(running_machine &machine, tile_data &tileinfo, tilemap_memory_index tile_index, void *param)
#define TILE_GET_INFO_MEMBER(_name) void _name(tile_data &tileinfo, tilemap_memory_index tile_index, void *param)
#define TILE_GET_INFO_DEVICE(_name) void _name(device_t *device, tile_data &tileinfo, tilemap_memory_index tile_index, void *param)
// function definition for a logical-to-memory mapper
#define TILEMAP_MAPPER(_name) tilemap_memory_index _name(running_machine &machine, UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows)
#define TILEMAP_MAPPER_MEMBER(_name) tilemap_memory_index _name(UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows)
// useful macro inside of a TILE_GET_INFO callback to set tile information
#define SET_TILE_INFO(GFX,CODE,COLOR,FLAGS) tileinfo.set(machine, GFX, CODE, COLOR, FLAGS)
#define SET_TILE_INFO_MEMBER(GFX,CODE,COLOR,FLAGS) tileinfo.set(machine(), GFX, CODE, COLOR, FLAGS)
#define SET_TILE_INFO_DEVICE(GFX,CODE,COLOR,FLAGS) tileinfo.set(device->machine(), GFX, CODE, COLOR, FLAGS)
// Macros for setting tile attributes in the TILE_GET_INFO callback:

View File

@ -133,11 +133,11 @@ better notes (complete chip lists) for each board still needed
#include "rendlay.h"
class gal3_state : public driver_device
class gal3_state : public namcos2_shared_state
{
public:
gal3_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) ,
: namcos2_shared_state(mconfig, type, tag) ,
m_nvmem(*this, "nvmem"),
m_rso_shared_ram(*this, "rso_shared_ram"){ }
@ -166,10 +166,10 @@ static VIDEO_START(gal3)
gal3_state *state = machine.driver_data<gal3_state>();
state->m_generic_paletteram_16.allocate(0x10000);
namco_obj_init(machine,
state->c355_obj_init(
0, /* gfx bank */
0xf, /* reverse palette mapping */
NULL );
namcos2_shared_state::c355_obj_code2tile_delegate() );
}
@ -208,14 +208,14 @@ static SCREEN_UPDATE_RGB32(gal3)
for( pri=0; pri<pivot; pri++ )
{
namco_obj_draw(screen.machine(), bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri);
}
/* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf );
for( pri=pivot; pri<15; pri++ )
{
namco_obj_draw(screen.machine(), bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri);
}*/
// CPU Diag LEDs
@ -391,14 +391,14 @@ static ADDRESS_MAP_START( cpu_slv_map, AS_PROGRAM, 32, gal3_state )
/// AM_RANGE(0xf1440000, 0xf1440003) AM_READWRITE_LEGACY(pointram_data_r,pointram_data_w)
/// AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (frame buffer?) */
/// AM_RANGE(0xf1480000, 0xf14807ff) AM_READWRITE_LEGACY(namcos21_depthcue_r,namcos21_depthcue_w)
AM_RANGE(0xf1700000, 0xf170ffff) AM_READWRITE_LEGACY(namco_obj32_r,namco_obj32_w)
AM_RANGE(0xf1720000, 0xf1720007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w)
AM_RANGE(0xf1700000, 0xf170ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0xf1720000, 0xf1720007) AM_READWRITE16(c355_obj_position_r,c355_obj_position_w,0xffffffff)
AM_RANGE(0xf1740000, 0xf175ffff) AM_READWRITE(paletteram32_r,paletteram32_w)
AM_RANGE(0xf1760000, 0xf1760003) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w)
AM_RANGE(0xf2200000, 0xf220ffff) AM_RAM
AM_RANGE(0xf2700000, 0xf270ffff) AM_RAM //AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w)
AM_RANGE(0xf2720000, 0xf2720007) AM_RAM //AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w)
AM_RANGE(0xf2700000, 0xf270ffff) AM_RAM //AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0xf2720000, 0xf2720007) AM_RAM //AM_READWRITE16(c355_obj_position_r,c355_obj_position_w,0xffffffff)
AM_RANGE(0xf2740000, 0xf275ffff) AM_RAM //AM_READWRITE(paletteram16_r,paletteram16_w) AM_SHARE("paletteram")
AM_RANGE(0xf2760000, 0xf2760003) AM_RAM //AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w)
ADDRESS_MAP_END

View File

@ -156,7 +156,6 @@ OSC3: 48.384MHz
*/
#include "emu.h"
#include "includes/namcos2.h"
#include "includes/namcoic.h"
#include "cpu/i960/i960.h"
#include "cpu/m37710/m37710.h"
@ -236,9 +235,9 @@ static ADDRESS_MAP_START( namcofl_mem, AS_PROGRAM, 32, namcofl_state )
AM_RANGE(0x30400000, 0x3040ffff) AM_RAM_WRITE(namcofl_paletteram_w) AM_SHARE("paletteram")
AM_RANGE(0x30800000, 0x3080ffff) AM_READWRITE_LEGACY(namco_tilemapvideoram32_le_r, namco_tilemapvideoram32_le_w )
AM_RANGE(0x30a00000, 0x30a0003f) AM_READWRITE_LEGACY(namco_tilemapcontrol32_le_r, namco_tilemapcontrol32_le_w )
AM_RANGE(0x30c00000, 0x30c1ffff) AM_READWRITE_LEGACY(namco_rozvideoram32_le_r,namco_rozvideoram32_le_w)
AM_RANGE(0x30d00000, 0x30d0001f) AM_READWRITE_LEGACY(namco_rozcontrol32_le_r,namco_rozcontrol32_le_w)
AM_RANGE(0x30e00000, 0x30e1ffff) AM_READWRITE_LEGACY(namco_obj32_le_r, namco_obj32_le_w)
AM_RANGE(0x30c00000, 0x30c1ffff) AM_READWRITE16(c169_roz_videoram_r,c169_roz_videoram_w,0xffffffff) AM_SHARE("rozvideoram")
AM_RANGE(0x30d00000, 0x30d0001f) AM_READWRITE16(c169_roz_control_r,c169_roz_control_w,0xffffffff)
AM_RANGE(0x30e00000, 0x30e1ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0x30f00000, 0x30f0000f) AM_RAM /* NebulaM2 code says this is int enable at 0000, int request at 0004, but doesn't do much about it */
AM_RANGE(0x40000000, 0x4000005f) AM_READWRITE(namcofl_sysreg_r, namcofl_sysreg_w )
AM_RANGE(0xfffffffc, 0xffffffff) AM_READ(fl_unk1_r )
@ -818,13 +817,13 @@ static void namcofl_common_init(running_machine &machine)
DRIVER_INIT_MEMBER(namcofl_state,speedrcr)
{
namcofl_common_init(machine());
namcos2_gametype = NAMCOFL_SPEED_RACER;
m_gametype = NAMCOFL_SPEED_RACER;
}
DRIVER_INIT_MEMBER(namcofl_state,finalapr)
{
namcofl_common_init(machine());
namcos2_gametype = NAMCOFL_FINAL_LAP_R;
m_gametype = NAMCOFL_FINAL_LAP_R;
}
GAME ( 1995, speedrcr, 0, namcofl, speedrcr, namcofl_state, speedrcr, ROT0, "Namco", "Speed Racer", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )

View File

@ -3,8 +3,6 @@
#include "includes/namcoic.h"
/**************************************************************************************/
static int mPalXOR; /* XOR'd with palette select register; needed for System21 */
static struct
{
UINT16 control[0x40/2];
@ -265,7 +263,7 @@ WRITE32_HANDLER( namco_tilemapvideoram32_le_w )
/**************************************************************************************/
static void zdrawgfxzoom(
void namcos2_shared_state::zdrawgfxzoom(
bitmap_ind16 &dest_bmp,const rectangle &clip,const gfx_element *gfx,
UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy,
int scalex, int scaley, int zpos )
@ -347,7 +345,7 @@ static void zdrawgfxzoom(
UINT16 *dest = &dest_bmp.pix16(y);
UINT8 *pri = &priority_bitmap.pix8(y);
int x, x_index = x_index_base;
if( mPalXOR )
if( m_c355_obj_palxor )
{
for( x=sx; x<ex; x++ )
{
@ -407,7 +405,7 @@ static void zdrawgfxzoom(
}
} /* zdrawgfxzoom */
static void zdrawgfxzoom(
void namcos2_shared_state::zdrawgfxzoom(
bitmap_rgb32 &dest_bmp,const rectangle &clip,const gfx_element *gfx,
UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy,
int scalex, int scaley, int zpos )
@ -618,31 +616,13 @@ void namcos2_state::draw_sprites_metalhawk(bitmap_ind16 &bitmap, const rectangle
/**************************************************************************************/
static UINT16 mSpritePos[4];
static UINT16 *m_spriteram;
WRITE16_HANDLER( namco_spritepos16_w )
WRITE16_MEMBER( namcos2_shared_state::c355_obj_position_w )
{
COMBINE_DATA( &mSpritePos[offset] );
COMBINE_DATA(&m_c355_obj_position[offset]);
}
READ16_HANDLER( namco_spritepos16_r )
READ16_MEMBER( namcos2_shared_state::c355_obj_position_r )
{
return mSpritePos[offset];
}
WRITE32_HANDLER( namco_spritepos32_w )
{
UINT32 v;
offset *= 2;
v = (mSpritePos[offset]<<16)|mSpritePos[offset+1];
COMBINE_DATA( &v );
mSpritePos[offset+0] = v>>16;
mSpritePos[offset+1] = v&0xffff;
}
READ32_HANDLER( namco_spritepos32_r )
{
offset *= 2;
return (mSpritePos[offset]<<16)|mSpritePos[offset+1];
return m_c355_obj_position[offset];
}
INLINE UINT8
@ -698,9 +678,6 @@ nth_byte32( const UINT32 *pSource, int which )
/**************************************************************************************************************/
static int (*mpCodeToTile)( running_machine &machine, int code ); /* sprite banking callback */
static int mGfxC355; /* gfx bank for sprites */
/**
* 0x00000 sprite attr (page0)
* 0x02000 sprite list (page0)
@ -712,10 +689,9 @@ static int mGfxC355; /* gfx bank for sprites */
* 0x14000 sprite list (page1)
*/
template<class _BitmapClass>
static void
draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle &cliprect, const UINT16 *pSource, int pri, int zpos )
void namcos2_shared_state::c355_obj_draw_sprite(_BitmapClass &bitmap, const rectangle &cliprect, const UINT16 *pSource, int pri, int zpos )
{
UINT16 *spriteram16 = m_spriteram;
UINT16 *spriteram16 = m_c355_obj_ram;
unsigned screen_height_remaining, screen_width_remaining;
unsigned source_height_remaining, source_width_remaining;
int hpos,vpos;
@ -762,8 +738,8 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
if( linkno*4>=0x4000/2 ) return; /* avoid garbage memory reads */
xscroll = (INT16)mSpritePos[1];
yscroll = (INT16)mSpritePos[0];
xscroll = (INT16)m_c355_obj_position[1];
yscroll = (INT16)m_c355_obj_position[0];
// xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff;
xscroll &= 0x1ff; if( xscroll & 0x100 ) xscroll |= ~0x1ff;
@ -771,7 +747,7 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
if( bitmap.width() > 384 )
{ /* Medium Resolution: System21 adjust */
xscroll = (INT16)mSpritePos[1];
xscroll = (INT16)m_c355_obj_position[1];
xscroll &= 0x3ff; if( xscroll & 0x200 ) xscroll |= ~0x3ff;
if( yscroll<0 )
{ /* solvalou */
@ -781,7 +757,7 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
}
else
{
if ((namcos2_gametype == NAMCOFL_SPEED_RACER) || (namcos2_gametype == NAMCOFL_FINAL_LAP_R))
if ((m_gametype == NAMCOFL_SPEED_RACER) || (m_gametype == NAMCOFL_FINAL_LAP_R))
{ /* Namco FL: don't adjust and things line up fine */
}
else
@ -836,7 +812,7 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
vpos -= dy;
}
color = (palette&0xf)^mPalXOR;
color = (palette&0xf)^m_c355_obj_palxor;
source_height_remaining = num_rows*16;
screen_height_remaining = vsize;
@ -866,8 +842,8 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
zdrawgfxzoom(
bitmap,
clip,
machine.gfx[mGfxC355],
mpCodeToTile(machine, tile) + offset,
machine().gfx[m_c355_obj_gfxbank],
m_c355_obj_code2tile(tile) + offset,
color,
flipx,flipy,
sx,sy,
@ -887,132 +863,73 @@ draw_spriteC355(running_machine &machine, _BitmapClass &bitmap, const rectangle
screen_height_remaining -= tile_screen_height;
source_height_remaining -= 16;
} /* next row */
} /* draw_spriteC355 */
}
static int DefaultCodeToTile( running_machine &machine, int code )
int namcos2_shared_state::c355_obj_default_code2tile(int code)
{
return code;
}
void
namco_obj_init( running_machine &machine, int gfxbank, int palXOR, int (*codeToTile)( running_machine &machine, int code ) )
void namcos2_shared_state::c355_obj_init(int gfxbank, int pal_xor, c355_obj_code2tile_delegate code2tile)
{
mGfxC355 = gfxbank;
mPalXOR = palXOR;
if( codeToTile )
{
mpCodeToTile = codeToTile;
}
m_c355_obj_gfxbank = gfxbank;
m_c355_obj_palxor = pal_xor;
if (!code2tile.isnull())
m_c355_obj_code2tile = code2tile;
else
{
mpCodeToTile = DefaultCodeToTile;
}
m_spriteram = auto_alloc_array(machine, UINT16, 0x20000/2);
memset( m_spriteram, 0, 0x20000 ); /* needed for Nebulas Ray */
memset( mSpritePos,0x00,sizeof(mSpritePos) );
} /* namcosC355_init */
m_c355_obj_code2tile = c355_obj_code2tile_delegate(FUNC(namcos2_shared_state::c355_obj_default_code2tile), this);
memset(&m_c355_obj_ram[0], 0, memshare("objram")->bytes()); // needed for Nebulas Ray
memset(m_c355_obj_position, 0, sizeof(m_c355_obj_position));
}
template<class _BitmapClass>
static void
DrawObjectList(running_machine &machine,
_BitmapClass &bitmap,
const rectangle &cliprect,
int pri,
const UINT16 *pSpriteList16,
const UINT16 *pSpriteTable )
void namcos2_shared_state::c355_obj_draw_list(_BitmapClass &bitmap, const rectangle &cliprect, int pri, const UINT16 *pSpriteList16, const UINT16 *pSpriteTable)
{
int i;
/* draw the sprites */
for( i=0; i<256; i++ )
{
UINT16 which = pSpriteList16[i];
draw_spriteC355(machine, bitmap, cliprect, &pSpriteTable[(which&0xff)*8], pri, i );
c355_obj_draw_sprite(bitmap, cliprect, &pSpriteTable[(which&0xff)*8], pri, i );
if( which&0x100 ) break;
}
} /* DrawObjectList */
}
void
namco_obj_draw(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri )
void namcos2_shared_state::c355_obj_draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
{
// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */
if( pri==0 )
{
machine.priority_bitmap.fill(0, cliprect );
}
// if( offs==0 )
{ /* boot */
DrawObjectList(machine, bitmap,cliprect,pri,&m_spriteram[0x02000/2], &m_spriteram[0x00000/2] );
}
// else
{
DrawObjectList(machine, bitmap,cliprect,pri,&m_spriteram[0x14000/2], &m_spriteram[0x10000/2] );
}
} /* namco_obj_draw */
if (pri == 0)
machine().priority_bitmap.fill(0, cliprect);
void
namco_obj_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri )
// if (offs == 0) // boot
c355_obj_draw_list(bitmap, cliprect, pri, &m_c355_obj_ram[0x02000/2], &m_c355_obj_ram[0x00000/2]);
// else
c355_obj_draw_list(bitmap, cliprect, pri, &m_c355_obj_ram[0x14000/2], &m_c355_obj_ram[0x10000/2]);
}
void namcos2_shared_state::c355_obj_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri)
{
// int offs = spriteram16[0x18000/2]; /* end-of-sprite-list */
if( pri==0 )
{
machine.priority_bitmap.fill(0, cliprect );
}
// if( offs==0 )
{ /* boot */
DrawObjectList(machine, bitmap,cliprect,pri,&m_spriteram[0x02000/2], &m_spriteram[0x00000/2] );
}
if (pri == 0)
machine().priority_bitmap.fill(0, cliprect);
// if (offs == 0) // boot
c355_obj_draw_list(bitmap, cliprect, pri, &m_c355_obj_ram[0x02000/2], &m_c355_obj_ram[0x00000/2]);
// else
{
DrawObjectList(machine, bitmap,cliprect,pri,&m_spriteram[0x14000/2], &m_spriteram[0x10000/2] );
}
} /* namco_obj_draw */
c355_obj_draw_list(bitmap, cliprect, pri, &m_c355_obj_ram[0x14000/2], &m_c355_obj_ram[0x10000/2]);
}
WRITE16_HANDLER( namco_obj16_w )
WRITE16_MEMBER( namcos2_shared_state::c355_obj_ram_w )
{
COMBINE_DATA( &m_spriteram[offset] );
} /* namco_obj16_w */
COMBINE_DATA(&m_c355_obj_ram[offset]);
}
READ16_HANDLER( namco_obj16_r )
READ16_MEMBER( namcos2_shared_state::c355_obj_ram_r )
{
return m_spriteram[offset];
} /* namco_obj16_r */
WRITE32_HANDLER( namco_obj32_w )
{
UINT16 *spriteram16 = m_spriteram;
UINT32 v;
offset *= 2;
v = (spriteram16[offset]<<16)|spriteram16[offset+1];
COMBINE_DATA( &v );
spriteram16[offset] = v>>16;
spriteram16[offset+1] = v&0xffff;
} /* namco_obj32_w */
READ32_HANDLER( namco_obj32_r )
{
UINT16 *spriteram16 = m_spriteram;
offset *= 2;
return (spriteram16[offset]<<16)|spriteram16[offset+1];
} /* namco_obj32_r */
WRITE32_HANDLER( namco_obj32_le_w )
{
UINT16 *spriteram16 = m_spriteram;
UINT32 v;
offset *= 2;
v = (spriteram16[offset+1]<<16)|spriteram16[offset];
COMBINE_DATA( &v );
spriteram16[offset+1] = v>>16;
spriteram16[offset] = v&0xffff;
} /* namco_obj32_w */
READ32_HANDLER( namco_obj32_le_r )
{
UINT16 *spriteram16 = m_spriteram;
offset *= 2;
return (spriteram16[offset+1]<<16)|spriteram16[offset];
} /* namco_obj32_r */
return m_c355_obj_ram[offset];
}
/**************************************************************************************************************/
@ -1027,142 +944,114 @@ READ32_HANDLER( namco_obj32_le_r )
* Namco System 2 - Metal Hawk, Lucky and Wild
* Namco System FL - Final Lap R, Speed Racer
*/
#define ROZ_TILEMAP_COUNT 2
static tilemap_t *mRozTilemap[ROZ_TILEMAP_COUNT];
static UINT16 *rozbank16;
static UINT16 *rozvideoram16;
static UINT16 *rozcontrol16;
static int mRozGfxBank;
static const char * mRozMaskRegion;
/**
* Graphics ROM addressing varies across games.
*/
static void
roz_get_info( running_machine &machine, tile_data &tileinfo, int tile_index, int which)
void namcos2_shared_state::c169_roz_get_info(tile_data &tileinfo, int tile_index, int which)
{
UINT16 tile = rozvideoram16[tile_index];
UINT16 tile = m_c169_roz_videoram[tile_index];
int bank, mangle;
switch( namcos2_gametype )
switch (m_gametype)
{
case NAMCONB2_MACH_BREAKERS:
bank = nth_byte16( &rozbank16[which*8/2], (tile>>11)&0x7 );
tile = (tile&0x7ff)|(bank*0x800);
mangle = tile;
break;
case NAMCONB2_MACH_BREAKERS:
bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (tile >> 11) & 0x7);
tile = (tile & 0x7ff) | (bank * 0x800);
mangle = tile;
break;
case NAMCONB2_OUTFOXIES:
bank = nth_byte16( &rozbank16[which*8/2], (tile>>11)&0x7 );
tile = (tile&0x7ff)|(bank*0x800);
mangle = tile&~(0x50);
if( tile&0x10 ) mangle |= 0x40;
if( tile&0x40 ) mangle |= 0x10;
break;
case NAMCONB2_OUTFOXIES:
bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (tile >> 11) & 0x7);
tile = (tile & 0x7ff) | (bank * 0x800);
mangle = tile & ~0x50;
if (tile & 0x10) mangle |= 0x40;
if (tile & 0x40) mangle |= 0x10;
break;
case NAMCOS2_LUCKY_AND_WILD:
mangle = tile&0x01ff;
tile &= 0x3fff;
switch( tile>>9 )
{
case 0x00: mangle |= 0x1c00; break;
case 0x01: mangle |= 0x0800; break;
case 0x02: mangle |= 0x0000; break;
case NAMCOS2_LUCKY_AND_WILD:
mangle = tile & 0x01ff;
tile &= 0x3fff;
switch (tile >> 9)
{
case 0x00: mangle |= 0x1c00; break;
case 0x01: mangle |= 0x0800; break;
case 0x02: mangle |= 0x0000; break;
case 0x08: mangle |= 0x1e00; break;
case 0x09: mangle |= 0x0a00; break;
case 0x0a: mangle |= 0x0200; break;
case 0x08: mangle |= 0x1e00; break;
case 0x09: mangle |= 0x0a00; break;
case 0x0a: mangle |= 0x0200; break;
case 0x10: mangle |= 0x2000; break;
case 0x11: mangle |= 0x0c00; break;
case 0x12: mangle |= 0x0400; break;
case 0x10: mangle |= 0x2000; break;
case 0x11: mangle |= 0x0c00; break;
case 0x12: mangle |= 0x0400; break;
case 0x18: mangle |= 0x2200; break;
case 0x19: mangle |= 0x0e00; break;
case 0x1a: mangle |= 0x0600; break;
}
break;
case 0x18: mangle |= 0x2200; break;
case 0x19: mangle |= 0x0e00; break;
case 0x1a: mangle |= 0x0600; break;
}
break;
case NAMCOS2_METAL_HAWK:
mangle = tile&0x01ff;
if( tile&0x1000 ) mangle |= 0x0200;
if( tile&0x0200 ) mangle |= 0x0400;
if( tile&0x0400 ) mangle |= 0x0800;
if( tile&0x0800 ) mangle |= 0x1000;
tile &= 0x3fff; /* cap mask offset */
break;
case NAMCOS2_METAL_HAWK:
mangle = tile & 0x01ff;
if (tile & 0x1000) mangle |= 0x0200;
if (tile & 0x0200) mangle |= 0x0400;
if (tile & 0x0400) mangle |= 0x0800;
if (tile & 0x0800) mangle |= 0x1000;
tile &= 0x3fff; // cap mask offset
break;
default:
case NAMCOFL_SPEED_RACER:
case NAMCOFL_FINAL_LAP_R:
mangle = tile;
tile &= 0x3fff; /* cap mask offset */
break;
default:
case NAMCOFL_SPEED_RACER:
case NAMCOFL_FINAL_LAP_R:
mangle = tile;
tile &= 0x3fff; // cap mask offset
break;
}
SET_TILE_INFO( mRozGfxBank,mangle,0/*color*/,0/*flag*/ );
tileinfo.mask_data = 32*tile + (UINT8 *)machine.root_device().memregion( mRozMaskRegion )->base();
} /* roz_get_info */
SET_TILE_INFO_MEMBER(m_c169_roz_gfxbank, mangle, 0/*color*/, 0/*flag*/);
tileinfo.mask_data = m_c169_roz_mask + 32*tile;
}
static
TILE_GET_INFO( roz_get_info0 )
TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info0 )
{
roz_get_info( machine,tileinfo,tile_index,0 );
} /* roz_get_info0 */
c169_roz_get_info(tileinfo, tile_index, 0);
}
static
TILE_GET_INFO( roz_get_info1 )
TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info1 )
{
roz_get_info( machine,tileinfo,tile_index,1 );
} /* roz_get_info1 */
c169_roz_get_info(tileinfo, tile_index, 1);
}
static
TILEMAP_MAPPER( namco_roz_scan )
TILEMAP_MAPPER_MEMBER( namcos2_shared_state::c169_roz_mapper )
{
if( col>=128 )
if (col >= 128)
{
col %= 128;
row += 256;
}
return row*128+col;
} /* namco_roz_scan*/
return row * 128 + col;
}
void
namco_roz_init( running_machine &machine, int gfxbank, const char * maskregion )
void namcos2_shared_state::c169_roz_init(int gfxbank, const char *maskregion)
{
int i;
static const tile_get_info_func roz_info[ROZ_TILEMAP_COUNT] =
{
roz_get_info0,
roz_get_info1
};
m_c169_roz_gfxbank = gfxbank;
m_c169_roz_mask = memregion(maskregion)->base();
mRozGfxBank = gfxbank;
mRozMaskRegion = maskregion;
m_c169_roz_tilemap[0] = &machine().tilemap().create(
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info0), this),
tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this),
16,16,
256,256);
rozbank16 = auto_alloc_array(machine, UINT16, 0x10/2);
rozvideoram16 = auto_alloc_array(machine, UINT16, 0x20000/2);
rozcontrol16 = auto_alloc_array(machine, UINT16, 0x20/2);
m_c169_roz_tilemap[1] = &machine().tilemap().create(
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info1), this),
tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this),
16,16,
256,256);
for( i=0; i<ROZ_TILEMAP_COUNT; i++ )
{
mRozTilemap[i] = tilemap_create(machine,
roz_info[i],
namco_roz_scan,
16,16,
256,256 );
}
} /* namco_roz_init */
}
struct RozParam
{
UINT32 left, top, size;
UINT32 startx,starty;
int incxx,incxy,incyx,incyy;
int color,priority;
};
static void
UnpackRozParam( const UINT16 *pSource, struct RozParam *pRozParam )
void namcos2_shared_state::c169_roz_unpack_params(const UINT16 *source, roz_parameters &params)
{
const int xoffset = 36, yoffset = 3;
@ -1173,306 +1062,186 @@ UnpackRozParam( const UINT16 *pSource, struct RozParam *pRozParam )
* --------.xxxx---- priority
* --------.----xxxx color
*/
UINT16 temp = pSource[1];
pRozParam->size = 512<<((temp&0x0300)>>8);
if ((namcos2_gametype == NAMCOFL_SPEED_RACER) || (namcos2_gametype == NAMCOFL_FINAL_LAP_R))
{
pRozParam->color = (temp&0x0007)*256;
}
UINT16 temp = source[1];
params.size = 512 << ((temp & 0x0300) >> 8);
if (m_gametype == NAMCOFL_SPEED_RACER || m_gametype == NAMCOFL_FINAL_LAP_R)
params.color = (temp & 0x0007) * 256;
else
{
pRozParam->color = (temp&0x000f)*256;
}
pRozParam->priority = (temp&0x00f0)>>4;
params.color = (temp & 0x000f) * 256;
params.priority = (temp & 0x00f0) >> 4;
temp = pSource[2];
pRozParam->left = (temp&0x7000)>>3;
if( temp&0x8000 ) temp |= 0xf000; else temp&=0x0fff; /* sign extend */
pRozParam->incxx = (INT16)temp;
temp = source[2];
params.left = (temp & 0x7000) >> 3;
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
params.incxx = INT16(temp);
temp = pSource[3];
pRozParam->top = (temp&0x7000)>>3;
if( temp&0x8000 ) temp |= 0xf000; else temp&=0x0fff; /* sign extend */
pRozParam->incxy = (INT16)temp;
temp = source[3];
params.top = (temp&0x7000)>>3;
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
params.incxy = INT16(temp);
temp = pSource[4];
if( temp&0x8000 ) temp |= 0xf000; else temp&=0x0fff; /* sign extend */
pRozParam->incyx = (INT16)temp;
temp = source[4];
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
params.incyx = INT16(temp);
temp = pSource[5];
if( temp&0x8000 ) temp |= 0xf000; else temp&=0x0fff; /* sign extend */
pRozParam->incyy = (INT16)temp;
temp = source[5];
if (temp & 0x8000) temp |= 0xf000; else temp &= 0x0fff; // sign extend
params.incyy = INT16(temp);
pRozParam->startx = (INT16)pSource[6];
pRozParam->starty = (INT16)pSource[7];
pRozParam->startx <<= 4;
pRozParam->starty <<= 4;
params.startx = INT16(source[6]);
params.starty = INT16(source[7]);
params.startx <<= 4;
params.starty <<= 4;
pRozParam->startx += xoffset * pRozParam->incxx + yoffset * pRozParam->incyx;
pRozParam->starty += xoffset * pRozParam->incxy + yoffset * pRozParam->incyy;
params.startx += xoffset * params.incxx + yoffset * params.incyx;
params.starty += xoffset * params.incxy + yoffset * params.incyy;
/* normalize */
pRozParam->startx <<= 8;
pRozParam->starty <<= 8;
pRozParam->incxx <<= 8;
pRozParam->incxy <<= 8;
pRozParam->incyx <<= 8;
pRozParam->incyy <<= 8;
} /* UnpackRozParam */
// normalize
params.startx <<= 8;
params.starty <<= 8;
params.incxx <<= 8;
params.incxy <<= 8;
params.incyx <<= 8;
params.incyy <<= 8;
}
static void
DrawRozHelper(
bitmap_ind16 &bitmap,
tilemap_t *tmap,
const rectangle &clip,
const struct RozParam *rozInfo )
void namcos2_shared_state::c169_roz_draw_helper(bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters &params)
{
if( (bitmap.bpp() == 16) &&
(namcos2_gametype != NAMCOFL_SPEED_RACER) &&
(namcos2_gametype != NAMCOFL_FINAL_LAP_R))
if (m_gametype != NAMCOFL_SPEED_RACER && m_gametype != NAMCOFL_FINAL_LAP_R)
{
UINT32 size_mask = rozInfo->size-1;
bitmap_ind16 &srcbitmap = tmap->pixmap();
bitmap_ind8 &flagsbitmap = tmap->flagsmap();
UINT32 startx = rozInfo->startx + clip.min_x * rozInfo->incxx + clip.min_y * rozInfo->incyx;
UINT32 starty = rozInfo->starty + clip.min_x * rozInfo->incxy + clip.min_y * rozInfo->incyy;
UINT32 size_mask = params.size - 1;
bitmap_ind16 &srcbitmap = tmap.pixmap();
bitmap_ind8 &flagsbitmap = tmap.flagsmap();
UINT32 startx = params.startx + clip.min_x * params.incxx + clip.min_y * params.incyx;
UINT32 starty = params.starty + clip.min_x * params.incxy + clip.min_y * params.incyy;
int sx = clip.min_x;
int sy = clip.min_y;
while( sy <= clip.max_y )
while (sy <= clip.max_y)
{
int x = sx;
UINT32 cx = startx;
UINT32 cy = starty;
UINT16 *dest = &bitmap.pix16(sy, sx);
while( x <= clip.max_x )
UINT16 *dest = &bitmap.pix(sy, sx);
while (x <= clip.max_x)
{
UINT32 xpos = (((cx>>16)&size_mask) + rozInfo->left)&0xfff;
UINT32 ypos = (((cy>>16)&size_mask) + rozInfo->top)&0xfff;
if( flagsbitmap.pix8(ypos, xpos)&TILEMAP_PIXEL_LAYER0 )
{
*dest = srcbitmap.pix16(ypos, xpos)+rozInfo->color;
}
cx += rozInfo->incxx;
cy += rozInfo->incxy;
UINT32 xpos = (((cx >> 16) & size_mask) + params.left) & 0xfff;
UINT32 ypos = (((cy >> 16) & size_mask) + params.top) & 0xfff;
if (flagsbitmap.pix(ypos, xpos) & TILEMAP_PIXEL_LAYER0)
*dest = srcbitmap.pix(ypos, xpos) + params.color;
cx += params.incxx;
cy += params.incxy;
x++;
dest++;
} /* next x */
startx += rozInfo->incyx;
starty += rozInfo->incyy;
}
startx += params.incyx;
starty += params.incyy;
sy++;
} /* next y */
}
}
else
{
tmap->set_palette_offset( rozInfo->color );
tmap->draw_roz(
tmap.set_palette_offset(params.color);
tmap.draw_roz(
bitmap,
clip,
rozInfo->startx, rozInfo->starty,
rozInfo->incxx, rozInfo->incxy,
rozInfo->incyx, rozInfo->incyy,
params.startx, params.starty,
params.incxx, params.incxy,
params.incyx, params.incyy,
1,0,0); // wrap, flags, pri
}
} /* DrawRozHelper */
}
static void
DrawRozScanline( bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect )
void namcos2_shared_state::c169_roz_draw_scanline(bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect)
{
if( line>=cliprect.min_y && line<=cliprect.max_y )
if (line >= cliprect.min_y && line <= cliprect.max_y)
{
struct RozParam rozInfo;
rectangle clip;
int row = line/8;
int offs = row*0x100+(line&7)*0x10 + 0xe080;
UINT16 *pSource = &rozvideoram16[offs/2];
if( (pSource[1]&0x8000)==0 )
int row = line / 8;
int offs = row * 0x100 + (line & 7) * 0x10 + 0xe080;
UINT16 *source = &m_c169_roz_videoram[offs / 2];
// if enabled
if ((source[1] & 0x8000) == 0)
{
UnpackRozParam( pSource, &rozInfo );
if( pri == rozInfo.priority )
roz_parameters params;
c169_roz_unpack_params(source, params);
// check priority
if (pri == params.priority)
{
clip.set(0, bitmap.width()-1, line, line);
rectangle clip(0, bitmap.width() - 1, line, line);
clip &= cliprect;
DrawRozHelper( bitmap, mRozTilemap[which], clip, &rozInfo );
} /* priority */
} /* enabled */
c169_roz_draw_helper(bitmap, *m_c169_roz_tilemap[which], clip, params);
}
}
}
} /* DrawRozScanline */
}
void
namco_roz_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri )
void namcos2_shared_state::c169_roz_draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri)
{
int mode = rozcontrol16[0]; /* 0x8000 or 0x1000 */
int which, special = 1;
int special = (m_gametype == NAMCOFL_SPEED_RACER || m_gametype == NAMCOFL_FINAL_LAP_R) ? 0 : 1;
int mode = m_c169_roz_control[0]; // 0x8000 or 0x1000
if ((namcos2_gametype == NAMCOFL_SPEED_RACER) || (namcos2_gametype == NAMCOFL_FINAL_LAP_R))
for (int which = 1; which >= 0; which--)
{
special = 0;
}
for( which=1; which>=0; which-- )
{
const UINT16 *pSource = &rozcontrol16[which*8];
UINT16 attrs = pSource[1];
if( (attrs&0x8000)==0 )
{ /* layer is enabled */
if( which==special && mode==0x8000 )
{ /* second ROZ layer is configured to use per-scanline registers */
int line;
for( line=0; line<224; line++ )
{
DrawRozScanline( bitmap, line, which, pri, cliprect/*, tmap*/ );
}
const UINT16 *source = &m_c169_roz_control[which * 8];
UINT16 attrs = source[1];
// if enabled
if ((attrs & 0x8000) == 0)
{
// second ROZ layer is configured to use per-scanline registers
if (which == special && mode == 0x8000)
{
for (int line = 0; line < 224; line++)
c169_roz_draw_scanline(bitmap, line, which, pri, cliprect);
}
else
{
struct RozParam rozInfo;
UnpackRozParam( pSource, &rozInfo );
if( rozInfo.priority == pri )
{
DrawRozHelper( bitmap, mRozTilemap[which], cliprect, &rozInfo );
} /* roz_pri==pri */
roz_parameters params;
c169_roz_unpack_params(source, params);
if (params.priority == pri)
c169_roz_draw_helper(bitmap, *m_c169_roz_tilemap[which], cliprect, params);
}
} /* enable */
} /* which */
} /* namco_roz_draw */
READ16_HANDLER( namco_rozcontrol16_r )
{
return rozcontrol16[offset];
} /* namco_rozcontrol16_r */
WRITE16_HANDLER( namco_rozcontrol16_w )
{
COMBINE_DATA( &rozcontrol16[offset] );
} /* namco_rozcontrol16_w */
#ifdef UNUSED_FUNCTION
READ16_HANDLER( namco_rozbank16_r )
{
return rozbank16[offset];
} /* namco_rozbank16_r */
WRITE16_HANDLER( namco_rozbank16_w )
{
UINT16 old_data = rozbank16[offset];
COMBINE_DATA( &rozbank16[offset] );
if( rozbank16[offset]!=old_data )
{
int i;
for( i=0; i<ROZ_TILEMAP_COUNT; i++ )
{
mRozTilemap[i]->mark_all_dirty();
}
}
} /* namco_rozbank16_w */
#endif
}
}
static void
writerozvideo( int offset, UINT16 data )
READ16_MEMBER( namcos2_shared_state::c169_roz_control_r )
{
int i;
rozvideoram16[offset] = data;
for( i=0; i<ROZ_TILEMAP_COUNT; i++ )
{
mRozTilemap[i]->mark_tile_dirty( offset );
}
} /* writerozvideo */
return m_c169_roz_control[offset];
}
READ16_HANDLER( namco_rozvideoram16_r )
WRITE16_MEMBER( namcos2_shared_state::c169_roz_control_w )
{
return rozvideoram16[offset];
} /* namco_rozvideoram16_r */
COMBINE_DATA(&m_c169_roz_control[offset]);
}
WRITE16_HANDLER( namco_rozvideoram16_w )
READ16_MEMBER( namcos2_shared_state::c169_roz_bank_r )
{
UINT16 v = rozvideoram16[offset];
COMBINE_DATA( &v );
writerozvideo( offset, v );
} /* namco_rozvideoram16_w */
return m_c169_roz_bank[offset];
}
READ32_HANDLER( namco_rozcontrol32_r )
WRITE16_MEMBER( namcos2_shared_state::c169_roz_bank_w )
{
offset *= 2;
return (rozcontrol16[offset]<<16)|rozcontrol16[offset+1];
} /* namco_rozcontrol32_r */
UINT16 old_data = m_c169_roz_bank[offset];
COMBINE_DATA(&m_c169_roz_bank[offset]);
if (m_c169_roz_bank[offset] != old_data)
for (int i = 0; i < ROZ_TILEMAP_COUNT; i++)
m_c169_roz_tilemap[i]->mark_all_dirty();
}
WRITE32_HANDLER( namco_rozcontrol32_w )
READ16_MEMBER( namcos2_shared_state::c169_roz_videoram_r )
{
UINT32 v;
offset *=2;
v = (rozcontrol16[offset]<<16)|rozcontrol16[offset+1];
COMBINE_DATA(&v);
rozcontrol16[offset] = v>>16;
rozcontrol16[offset+1] = v&0xffff;
} /* namco_rozcontrol32_w */
return m_c169_roz_videoram[offset];
}
READ32_HANDLER( namco_rozcontrol32_le_r )
WRITE16_MEMBER( namcos2_shared_state::c169_roz_videoram_w )
{
offset *= 2;
return (rozcontrol16[offset]<<16)|rozcontrol16[offset+1];
} /* namco_rozcontrol32_le_r */
WRITE32_HANDLER( namco_rozcontrol32_le_w )
{
UINT32 v;
offset *=2;
v = (rozcontrol16[offset+1]<<16)|rozcontrol16[offset];
COMBINE_DATA(&v);
rozcontrol16[offset+1] = v>>16;
rozcontrol16[offset] = v&0xffff;
} /* namco_rozcontrol32_le_w */
READ32_HANDLER( namco_rozbank32_r )
{
offset *= 2;
return (rozbank16[offset]<<16)|rozbank16[offset+1];
} /* namco_rozbank32_r */
WRITE32_HANDLER( namco_rozbank32_w )
{
UINT32 v;
offset *=2;
v = (rozbank16[offset]<<16)|rozbank16[offset+1];
COMBINE_DATA(&v);
rozbank16[offset] = v>>16;
rozbank16[offset+1] = v&0xffff;
} /* namco_rozbank32_w */
READ32_HANDLER( namco_rozvideoram32_r )
{
offset *= 2;
return (rozvideoram16[offset]<<16)|rozvideoram16[offset+1];
} /* namco_rozvideoram32_r */
WRITE32_HANDLER( namco_rozvideoram32_w )
{
UINT32 v;
offset *= 2;
v = (rozvideoram16[offset]<<16)|rozvideoram16[offset+1];
COMBINE_DATA( &v );
writerozvideo(offset,v>>16);
writerozvideo(offset+1,v&0xffff);
} /* namco_rozvideoram32_w */
READ32_HANDLER( namco_rozvideoram32_le_r )
{
offset *= 2;
return (rozvideoram16[offset+1]<<16)|rozvideoram16[offset];
} /* namco_rozvideoram32_le_r */
WRITE32_HANDLER( namco_rozvideoram32_le_w )
{
UINT32 v;
offset *= 2;
v = (rozvideoram16[offset+1]<<16)|rozvideoram16[offset];
COMBINE_DATA( &v );
writerozvideo(offset+1,v>>16);
writerozvideo(offset,v&0xffff);
} /* namco_rozvideoram32_le_w */
COMBINE_DATA(&m_c169_roz_videoram[offset]);
for (int i = 0; i < ROZ_TILEMAP_COUNT; i++)
m_c169_roz_tilemap[i]->mark_tile_dirty(offset);
}
/**************************************************************************************************************/
/*

View File

@ -272,7 +272,6 @@ GFX: Custom 145 ( 80 pin PQFP)
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "includes/namconb1.h"
#include "includes/namcos2.h"
#include "includes/namcoic.h"
#include "sound/c352.h"
#include "cpu/m37710/m37710.h"
@ -590,7 +589,7 @@ static NVRAM_HANDLER( namconb1 )
else
{
memset( state->m_nvmem32, 0x00, NB1_NVMEM_SIZE );
if( namcos2_gametype == NAMCONB1_GUNBULET )
if( state->m_gametype == NAMCONB1_GUNBULET )
{
state->m_nvmem32[0] = 0x0f260f26; /* default gun calibration */
}
@ -612,52 +611,52 @@ DRIVER_INIT_MEMBER(namconb1_state,nebulray)
size_t numBytes = (0xfe7-0xe6f)*8;
memset( &pMem[0xe6f*8], 0, numBytes );
namcos2_gametype = NAMCONB1_NEBULRAY;
m_gametype = NAMCONB1_NEBULRAY;
} /* nebulray */
DRIVER_INIT_MEMBER(namconb1_state,gslgr94u)
{
namcos2_gametype = NAMCONB1_GSLGR94U;
m_gametype = NAMCONB1_GSLGR94U;
} /* gslgr94u */
DRIVER_INIT_MEMBER(namconb1_state,gslgr94j)
{
namcos2_gametype = NAMCONB1_GSLGR94J;
m_gametype = NAMCONB1_GSLGR94J;
} /* gslgr94j */
DRIVER_INIT_MEMBER(namconb1_state,sws95)
{
namcos2_gametype = NAMCONB1_SWS95;
m_gametype = NAMCONB1_SWS95;
} /* sws95 */
DRIVER_INIT_MEMBER(namconb1_state,sws96)
{
namcos2_gametype = NAMCONB1_SWS96;
m_gametype = NAMCONB1_SWS96;
} /* sws96 */
DRIVER_INIT_MEMBER(namconb1_state,sws97)
{
namcos2_gametype = NAMCONB1_SWS97;
m_gametype = NAMCONB1_SWS97;
} /* sws97 */
DRIVER_INIT_MEMBER(namconb1_state,gunbulet)
{
namcos2_gametype = NAMCONB1_GUNBULET;
m_gametype = NAMCONB1_GUNBULET;
} /* gunbulet */
DRIVER_INIT_MEMBER(namconb1_state,vshoot)
{
namcos2_gametype = NAMCONB1_VSHOOT;
m_gametype = NAMCONB1_VSHOOT;
} /* vshoot */
DRIVER_INIT_MEMBER(namconb1_state,machbrkr)
{
namcos2_gametype = NAMCONB2_MACH_BREAKERS;
m_gametype = NAMCONB2_MACH_BREAKERS;
}
DRIVER_INIT_MEMBER(namconb1_state,outfxies)
{
namcos2_gametype = NAMCONB2_OUTFOXIES;
m_gametype = NAMCONB2_OUTFOXIES;
}
READ32_MEMBER(namconb1_state::custom_key_r)
@ -669,7 +668,7 @@ READ32_MEMBER(namconb1_state::custom_key_r)
m_count = machine().rand();
} while( m_count==old_count );
switch( namcos2_gametype )
switch( m_gametype )
{
case NAMCONB1_GUNBULET:
return 0; /* no protection */
@ -856,8 +855,8 @@ static ADDRESS_MAP_START( namconb1_am, AS_PROGRAM, 32, namconb1_state )
AM_RANGE(0x208000, 0x2fffff) AM_RAM
AM_RANGE(0x400000, 0x40001f) AM_READWRITE(namconb_cpureg_r, namconb1_cpureg_w)
AM_RANGE(0x580000, 0x5807ff) AM_RAM AM_SHARE("nvmem32")
AM_RANGE(0x600000, 0x61ffff) AM_READWRITE_LEGACY(namco_obj32_r,namco_obj32_w)
AM_RANGE(0x620000, 0x620007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w)
AM_RANGE(0x600000, 0x61ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0x620000, 0x620007) AM_READWRITE16(c355_obj_position_r,c355_obj_position_w,0xffffffff)
AM_RANGE(0x640000, 0x64ffff) AM_READWRITE_LEGACY(namco_tilemapvideoram32_r,namco_tilemapvideoram32_w )
AM_RANGE(0x660000, 0x66003f) AM_READWRITE_LEGACY(namco_tilemapcontrol32_r,namco_tilemapcontrol32_w)
AM_RANGE(0x680000, 0x68000f) AM_RAM AM_SHARE("spritebank32")
@ -872,17 +871,17 @@ static ADDRESS_MAP_START( namconb2_am, AS_PROGRAM, 32, namconb1_state )
AM_RANGE(0x200000, 0x207fff) AM_READWRITE(namconb_share_r, namconb_share_w)
AM_RANGE(0x208000, 0x2fffff) AM_RAM
AM_RANGE(0x400000, 0x4fffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x600000, 0x61ffff) AM_READWRITE_LEGACY(namco_obj32_r,namco_obj32_w)
AM_RANGE(0x620000, 0x620007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w)
AM_RANGE(0x600000, 0x61ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0x620000, 0x620007) AM_READWRITE16(c355_obj_position_r,c355_obj_position_w,0xffffffff)
AM_RANGE(0x640000, 0x64000f) AM_RAM /* unknown xy offset */
AM_RANGE(0x680000, 0x68ffff) AM_READWRITE_LEGACY(namco_tilemapvideoram32_r, namco_tilemapvideoram32_w )
AM_RANGE(0x6c0000, 0x6c003f) AM_READWRITE_LEGACY(namco_tilemapcontrol32_r, namco_tilemapcontrol32_w )
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE_LEGACY(namco_rozvideoram32_r,namco_rozvideoram32_w)
AM_RANGE(0x740000, 0x74001f) AM_READWRITE_LEGACY(namco_rozcontrol32_r,namco_rozcontrol32_w)
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE16(c169_roz_videoram_r,c169_roz_videoram_w,0xffffffff) AM_SHARE("rozvideoram")
AM_RANGE(0x740000, 0x74001f) AM_READWRITE16(c169_roz_control_r,c169_roz_control_w,0xffffffff)
AM_RANGE(0x800000, 0x807fff) AM_RAM AM_SHARE("paletteram")
AM_RANGE(0x900008, 0x90000f) AM_RAM AM_SHARE("spritebank32")
AM_RANGE(0x940000, 0x94000f) AM_RAM AM_SHARE("tilebank32")
AM_RANGE(0x980000, 0x98000f) AM_READ_LEGACY(namco_rozbank32_r) AM_WRITE_LEGACY(namco_rozbank32_w)
AM_RANGE(0x980000, 0x98000f) AM_READWRITE16(c169_roz_bank_r,c169_roz_bank_w,0xffffffff)
AM_RANGE(0xa00000, 0xa007ff) AM_RAM AM_SHARE("nvmem32")
AM_RANGE(0xc00000, 0xc0001f) AM_READ(custom_key_r) AM_WRITENOP
AM_RANGE(0xf00000, 0xf0001f) AM_READWRITE(namconb_cpureg_r, namconb2_cpureg_w)

View File

@ -538,7 +538,7 @@ WRITE16_MEMBER(namcos2_state::dpram_word_w)
{
m_dpram[offset] = data&0xff;
if( namcos2_gametype==NAMCOS2_GOLLY_GHOST )
if( m_gametype==NAMCOS2_GOLLY_GHOST )
{
switch( offset )
{
@ -601,10 +601,10 @@ ADDRESS_MAP_END
/*************************************************************/
static ADDRESS_MAP_START( common_default_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0xc00000, 0xc03fff) AM_READWRITE(spriteram_word_r, spriteram_word_w) AM_SHARE("spriteram")
AM_RANGE(0xc40000, 0xc40001) AM_READWRITE_LEGACY(namcos2_gfx_ctrl_r,namcos2_gfx_ctrl_w)
AM_RANGE(0xc80000, 0xc9ffff) AM_READWRITE(rozram_word_r,rozram_word_w) AM_SHARE("rozram")
AM_RANGE(0xcc0000, 0xcc000f) AM_READWRITE(roz_ctrl_word_r, roz_ctrl_word_w)
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xc40000, 0xc40001) AM_READWRITE(gfx_ctrl_r, gfx_ctrl_w)
AM_RANGE(0xc80000, 0xc9ffff) AM_RAM_WRITE(rozram_word_w) AM_SHARE("rozram")
AM_RANGE(0xcc0000, 0xcc000f) AM_RAM AM_SHARE("rozctrl")
AM_RANGE(0xd00000, 0xd0000f) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END
@ -629,8 +629,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( common_finallap_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x300000, 0x33ffff) AM_READ_LEGACY(namcos2_flap_prot_r)
AM_RANGE(0x800000, 0x80ffff) AM_READWRITE(spriteram_word_r, spriteram_word_w) AM_SHARE("spriteram")
AM_RANGE(0x840000, 0x840001) AM_READ_LEGACY(namcos2_gfx_ctrl_r) AM_WRITE_LEGACY(namcos2_gfx_ctrl_w)
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x840000, 0x840001) AM_READWRITE(gfx_ctrl_r, gfx_ctrl_w)
AM_RANGE(0x880000, 0x89ffff) AM_READ_LEGACY(namco_road16_r) AM_WRITE_LEGACY(namco_road16_w)
AM_RANGE(0x8c0000, 0x8c0001) AM_WRITENOP
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
@ -654,7 +654,7 @@ ADDRESS_MAP_END
/*************************************************************/
static ADDRESS_MAP_START( common_sgunner_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x800000, 0x8141ff) AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w)
AM_RANGE(0x800000, 0x8141ff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram")
AM_RANGE(0x818000, 0x818001) AM_WRITENOP
AM_RANGE(0xa00000, 0xa0000f) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
@ -678,10 +678,10 @@ ADDRESS_MAP_END
/*************************************************************/
static ADDRESS_MAP_START( common_metlhawk_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0xc00000, 0xc03fff) AM_READWRITE(spriteram_word_r, spriteram_word_w) AM_SHARE("spriteram") \
AM_RANGE(0xc40000, 0xc4ffff) AM_READWRITE_LEGACY(namco_rozvideoram16_r,namco_rozvideoram16_w) \
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE_LEGACY(namco_rozcontrol16_r,namco_rozcontrol16_w) \
AM_RANGE(0xe00000, 0xe00001) AM_READWRITE_LEGACY(namcos2_gfx_ctrl_r,namcos2_gfx_ctrl_w) /* ??? */ \
AM_RANGE(0xc00000, 0xc03fff) AM_RAM AM_SHARE("spriteram") \
AM_RANGE(0xc40000, 0xc4ffff) AM_READWRITE(c169_roz_videoram_r,c169_roz_videoram_w) AM_SHARE("rozvideoram") \
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE(c169_roz_control_r,c169_roz_control_w) \
AM_RANGE(0xe00000, 0xe00001) AM_READWRITE(gfx_ctrl_r, gfx_ctrl_w) /* ??? */ \
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END
@ -703,14 +703,14 @@ ADDRESS_MAP_END
/*************************************************************/
static ADDRESS_MAP_START( common_luckywld_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x800000, 0x8141ff) AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w)
AM_RANGE(0x800000, 0x8141ff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram")
AM_RANGE(0x818000, 0x818001) AM_NOP /* enable? */
AM_RANGE(0x81a000, 0x81a001) AM_WRITENOP /* enable? */
AM_RANGE(0x840000, 0x840001) AM_READNOP
AM_RANGE(0x900000, 0x900007) AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w)
AM_RANGE(0x900000, 0x900007) AM_READWRITE(c355_obj_position_r,c355_obj_position_w)
AM_RANGE(0xa00000, 0xa1ffff) AM_READWRITE_LEGACY(namco_road16_r,namco_road16_w)
AM_RANGE(0xc00000, 0xc0ffff) AM_READWRITE_LEGACY(namco_rozvideoram16_r,namco_rozvideoram16_w)
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE_LEGACY(namco_rozcontrol16_r,namco_rozcontrol16_w)
AM_RANGE(0xc00000, 0xc0ffff) AM_READWRITE(c169_roz_videoram_r,c169_roz_videoram_w) AM_SHARE("rozvideoram")
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE(c169_roz_control_r,c169_roz_control_w)
AM_RANGE(0xf00000, 0xf00007) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END
@ -5004,17 +5004,17 @@ ROM_END
DRIVER_INIT_MEMBER(namcos2_state,assault)
{
namcos2_gametype=NAMCOS2_ASSAULT;
m_gametype=NAMCOS2_ASSAULT;
}
DRIVER_INIT_MEMBER(namcos2_state,assaultj)
{
namcos2_gametype=NAMCOS2_ASSAULT_JP;
m_gametype=NAMCOS2_ASSAULT_JP;
}
DRIVER_INIT_MEMBER(namcos2_state,assaultp)
{
namcos2_gametype=NAMCOS2_ASSAULT_PLUS;
m_gametype=NAMCOS2_ASSAULT_PLUS;
}
DRIVER_INIT_MEMBER(namcos2_state,assaultp_hack)
@ -5033,67 +5033,67 @@ DRIVER_INIT_MEMBER(namcos2_state,assaultp_hack)
DRIVER_INIT_MEMBER(namcos2_state,burnforc)
{
namcos2_gametype=NAMCOS2_BURNING_FORCE;
m_gametype=NAMCOS2_BURNING_FORCE;
}
DRIVER_INIT_MEMBER(namcos2_state,cosmogng)
{
namcos2_gametype=NAMCOS2_COSMO_GANG;
m_gametype=NAMCOS2_COSMO_GANG;
}
DRIVER_INIT_MEMBER(namcos2_state,dsaber)
{
namcos2_gametype=NAMCOS2_DRAGON_SABER;
m_gametype=NAMCOS2_DRAGON_SABER;
}
DRIVER_INIT_MEMBER(namcos2_state,dsaberj)
{
namcos2_gametype=NAMCOS2_DRAGON_SABER;
m_gametype=NAMCOS2_DRAGON_SABER;
}
DRIVER_INIT_MEMBER(namcos2_state,dirtfoxj)
{
namcos2_gametype=NAMCOS2_DIRT_FOX_JP;
m_gametype=NAMCOS2_DIRT_FOX_JP;
}
DRIVER_INIT_MEMBER(namcos2_state,finallap)
{
namcos2_gametype=NAMCOS2_FINAL_LAP;
m_gametype=NAMCOS2_FINAL_LAP;
}
DRIVER_INIT_MEMBER(namcos2_state,finalap2)
{
namcos2_gametype=NAMCOS2_FINAL_LAP_2;
m_gametype=NAMCOS2_FINAL_LAP_2;
}
DRIVER_INIT_MEMBER(namcos2_state,finalap3)
{
namcos2_gametype=NAMCOS2_FINAL_LAP_3;
m_gametype=NAMCOS2_FINAL_LAP_3;
}
DRIVER_INIT_MEMBER(namcos2_state,finehour)
{
namcos2_gametype=NAMCOS2_FINEST_HOUR;
m_gametype=NAMCOS2_FINEST_HOUR;
}
DRIVER_INIT_MEMBER(namcos2_state,fourtrax)
{
namcos2_gametype=NAMCOS2_FOUR_TRAX;
m_gametype=NAMCOS2_FOUR_TRAX;
}
DRIVER_INIT_MEMBER(namcos2_state,kyukaidk)
{
namcos2_gametype=NAMCOS2_KYUUKAI_DOUCHUUKI;
m_gametype=NAMCOS2_KYUUKAI_DOUCHUUKI;
}
DRIVER_INIT_MEMBER(namcos2_state,marvlanj)
{
namcos2_gametype=NAMCOS2_MARVEL_LAND;
m_gametype=NAMCOS2_MARVEL_LAND;
}
DRIVER_INIT_MEMBER(namcos2_state,marvland)
{
namcos2_gametype=NAMCOS2_MARVEL_LAND;
m_gametype=NAMCOS2_MARVEL_LAND;
}
DRIVER_INIT_MEMBER(namcos2_state,metlhawk)
@ -5151,82 +5151,82 @@ DRIVER_INIT_MEMBER(namcos2_state,metlhawk)
} /* next k */
} /* next j */
} /* next i */
namcos2_gametype=NAMCOS2_METAL_HAWK;
m_gametype=NAMCOS2_METAL_HAWK;
} /* metlhawk */
DRIVER_INIT_MEMBER(namcos2_state,mirninja)
{
namcos2_gametype=NAMCOS2_MIRAI_NINJA;
m_gametype=NAMCOS2_MIRAI_NINJA;
}
DRIVER_INIT_MEMBER(namcos2_state,ordyne)
{
namcos2_gametype=NAMCOS2_ORDYNE;
m_gametype=NAMCOS2_ORDYNE;
}
DRIVER_INIT_MEMBER(namcos2_state,phelios)
{
namcos2_gametype=NAMCOS2_PHELIOS;
m_gametype=NAMCOS2_PHELIOS;
}
DRIVER_INIT_MEMBER(namcos2_state,rthun2)
{
namcos2_gametype=NAMCOS2_ROLLING_THUNDER_2;
m_gametype=NAMCOS2_ROLLING_THUNDER_2;
}
DRIVER_INIT_MEMBER(namcos2_state,rthun2j)
{
namcos2_gametype=NAMCOS2_ROLLING_THUNDER_2;
m_gametype=NAMCOS2_ROLLING_THUNDER_2;
}
DRIVER_INIT_MEMBER(namcos2_state,sgunner2)
{
namcos2_gametype=NAMCOS2_STEEL_GUNNER_2;
m_gametype=NAMCOS2_STEEL_GUNNER_2;
}
DRIVER_INIT_MEMBER(namcos2_state,sws)
{
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM;
m_gametype=NAMCOS2_SUPER_WSTADIUM;
}
DRIVER_INIT_MEMBER(namcos2_state,sws92)
{
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_92;
m_gametype=NAMCOS2_SUPER_WSTADIUM_92;
}
DRIVER_INIT_MEMBER(namcos2_state,sws92g)
{
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_92T;
m_gametype=NAMCOS2_SUPER_WSTADIUM_92T;
}
DRIVER_INIT_MEMBER(namcos2_state,sws93)
{
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_93;
m_gametype=NAMCOS2_SUPER_WSTADIUM_93;
}
DRIVER_INIT_MEMBER(namcos2_state,suzuka8h)
{
namcos2_gametype=NAMCOS2_SUZUKA_8_HOURS;
m_gametype=NAMCOS2_SUZUKA_8_HOURS;
}
DRIVER_INIT_MEMBER(namcos2_state,suzuk8h2)
{
namcos2_gametype=NAMCOS2_SUZUKA_8_HOURS_2;
m_gametype=NAMCOS2_SUZUKA_8_HOURS_2;
}
DRIVER_INIT_MEMBER(namcos2_state,valkyrie)
{
namcos2_gametype=NAMCOS2_VALKYRIE;
m_gametype=NAMCOS2_VALKYRIE;
}
DRIVER_INIT_MEMBER(namcos2_state,gollygho)
{
namcos2_gametype=NAMCOS2_GOLLY_GHOST;
m_gametype=NAMCOS2_GOLLY_GHOST;
}
DRIVER_INIT_MEMBER(namcos2_state,bubbletr)
{
namcos2_gametype=NAMCOS2_BUBBLE_TROUBLE;
m_gametype=NAMCOS2_BUBBLE_TROUBLE;
}
@ -5249,7 +5249,7 @@ DRIVER_INIT_MEMBER(namcos2_state,luckywld)
if( code&0x80 ) out |= 0x01;
pData[i] = out;
}
namcos2_gametype=NAMCOS2_LUCKY_AND_WILD;
m_gametype=NAMCOS2_LUCKY_AND_WILD;
}
/* Based on the dumped BIOS versions it looks like Namco changed the BIOS rom */

View File

@ -296,7 +296,6 @@ CPU68 PCB:
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6805/m6805.h"
#include "includes/namcos2.h"
#include "cpu/m6809/m6809.h"
#include "cpu/tms32025/tms32025.h"
#include "includes/namcoic.h"
@ -341,7 +340,7 @@ WRITE16_MEMBER(namcos21_state::dspcuskey_w)
READ16_MEMBER(namcos21_state::dspcuskey_r)
{
UINT16 result = 0;
if( namcos2_gametype == NAMCOS21_SOLVALOU )
if( m_gametype == NAMCOS21_SOLVALOU )
{
switch( cpu_get_pc(&space.device()) )
{
@ -354,7 +353,7 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
break;
}
}
else if( namcos2_gametype == NAMCOS21_CYBERSLED )
else if( m_gametype == NAMCOS21_CYBERSLED )
{
switch( cpu_get_pc(&space.device()) )
{
@ -365,7 +364,7 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
break;
}
}
else if( namcos2_gametype == NAMCOS21_AIRCOMBAT )
else if( m_gametype == NAMCOS21_AIRCOMBAT )
{
switch( cpu_get_pc(&space.device()) )
{
@ -497,7 +496,7 @@ namcos21_kickstart( running_machine &machine, int internal )
{
namcos21_state *state = machine.driver_data<namcos21_state>();
/* patch dsp watchdog */
switch( namcos2_gametype )
switch( state->m_gametype )
{
case NAMCOS21_AIRCOMBAT:
state->m_master_dsp_code[0x008e] = 0x808f;
@ -567,7 +566,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
{
COMBINE_DATA( &m_dspram16[offset] );
if( namcos2_gametype != NAMCOS21_WINRUN91 )
if( m_gametype != NAMCOS21_WINRUN91 )
{
if( m_mpDspState->masterSourceAddr &&
offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
@ -575,7 +574,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
TransferDspData(machine());
}
else if (namcos2_gametype == NAMCOS21_SOLVALOU &&
else if (m_gametype == NAMCOS21_SOLVALOU &&
offset == 0x103 &&
&space.device() == machine().device("maincpu"))
{ /* hack; synchronization for solvalou */
@ -1075,8 +1074,8 @@ READ16_MEMBER(namcos21_state::NAMCO_C139_SCI_register_r){ return 0; }
AM_RANGE(0x440000, 0x440001) AM_READWRITE(pointram_data_r,pointram_data_w) \
AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (?) Air Combat */ \
AM_RANGE(0x480000, 0x4807ff) AM_READWRITE(namcos21_depthcue_r,namcos21_depthcue_w) /* Air Combat */ \
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w) \
AM_RANGE(0x720000, 0x720007) AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w) \
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram") \
AM_RANGE(0x720000, 0x720007) AM_READWRITE(c355_obj_position_r,c355_obj_position_w) \
AM_RANGE(0x740000, 0x75ffff) AM_READWRITE(paletteram16_r,paletteram16_w) AM_SHARE("paletteram") \
AM_RANGE(0x760000, 0x760001) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) \
AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \
@ -1415,8 +1414,8 @@ ADDRESS_MAP_END
////////////////////////////////////////////////////////////////////////////////
#define DRIVEYES_68K_COMMON \
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w) \
AM_RANGE(0x720000, 0x720007) AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w) \
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram") \
AM_RANGE(0x720000, 0x720007) AM_READWRITE(c355_obj_position_r,c355_obj_position_w) \
AM_RANGE(0x740000, 0x75ffff) AM_READWRITE(paletteram16_r,paletteram16_w) AM_SHARE("paletteram") \
AM_RANGE(0x760000, 0x760001) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) \
AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \
@ -2217,7 +2216,7 @@ ROM_END
static void namcos21_init( running_machine &machine, int game_type )
{
namcos21_state *state = machine.driver_data<namcos21_state>();
namcos2_gametype = game_type;
state->m_gametype = game_type;
state->m_pointram = auto_alloc_array(machine, UINT8, PTRAM_SIZE);
state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base();
InitDSP(machine);
@ -2237,7 +2236,7 @@ DRIVER_INIT_MEMBER(namcos21_state,winrun)
m_winrun_dspcomram = auto_alloc_array(machine(), UINT16, 0x1000*2);
namcos2_gametype = NAMCOS21_WINRUN91;
m_gametype = NAMCOS21_WINRUN91;
m_mpDataROM = (UINT16 *)memregion( "user1" )->base();
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
m_pointram_idx = 0;
@ -2278,7 +2277,7 @@ DRIVER_INIT_MEMBER(namcos21_state,driveyes)
pMem[pc++] = 0xff80; /* b */
pMem[pc++] = 0;
m_winrun_dspcomram = auto_alloc_array(machine(), UINT16, 0x1000*2);
namcos2_gametype = NAMCOS21_DRIVERS_EYES;
m_gametype = NAMCOS21_DRIVERS_EYES;
m_mpDataROM = (UINT16 *)memregion( "user1" )->base();
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
m_pointram_idx = 0;

View File

@ -1,3 +1,5 @@
#include "namcos2.h"
#define NAMCOFL_HTOTAL (288) /* wrong */
#define NAMCOFL_HBSTART (288)
#define NAMCOFL_VTOTAL (262) /* needs to be checked */
@ -13,11 +15,11 @@
#define NAMCOFL_SPRITEGFX 1
#define NAMCOFL_ROTGFX 2
class namcofl_state : public driver_device
class namcofl_state : public namcos2_shared_state
{
public:
namcofl_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
: namcos2_shared_state(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_mcu(*this,"mcu"),
m_shareram(*this, "shareram"){ }

View File

@ -111,48 +111,6 @@ READ32_HANDLER( namco_tilemapcontrol32_le_r );
WRITE32_HANDLER( namco_tilemapcontrol32_le_w );
/***********************************************************************************/
/* C355 Motion Object Emulation */
/* for palXOR, supply either 0x0 (normal) or 0xf (palette mapping reversed) */
void namco_obj_init( running_machine &machine, int gfxbank, int palXOR, int (*code2tile)( running_machine &machine, int code ) );
void namco_obj_draw( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri );
void namco_obj_draw( running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri );
WRITE16_HANDLER( namco_obj16_w );
READ16_HANDLER( namco_obj16_r );
WRITE32_HANDLER( namco_obj32_w );
READ32_HANDLER( namco_obj32_r );
WRITE32_HANDLER( namco_obj32_le_w );
READ32_HANDLER( namco_obj32_le_r );
WRITE16_HANDLER( namco_spritepos16_w );
READ16_HANDLER( namco_spritepos16_r );
WRITE32_HANDLER( namco_spritepos32_w );
READ32_HANDLER( namco_spritepos32_r );
/***********************************************************************************/
/* C169 ROZ Layer Emulation */
void namco_roz_init( running_machine &machine, int gfxbank, const char *maskregion );
void namco_roz_draw( bitmap_ind16 &bitmap, const rectangle &cliprect, int pri );
READ16_HANDLER( namco_rozcontrol16_r );
WRITE16_HANDLER( namco_rozcontrol16_w );
READ16_HANDLER( namco_rozvideoram16_r );
WRITE16_HANDLER( namco_rozvideoram16_w );
READ32_HANDLER( namco_rozcontrol32_r );
WRITE32_HANDLER( namco_rozcontrol32_w );
READ32_HANDLER( namco_rozcontrol32_le_r );
WRITE32_HANDLER( namco_rozcontrol32_le_w );
READ32_HANDLER( namco_rozbank32_r );
WRITE32_HANDLER( namco_rozbank32_w );
READ32_HANDLER( namco_rozvideoram32_r );
WRITE32_HANDLER( namco_rozvideoram32_w );
READ32_HANDLER( namco_rozvideoram32_le_r );
WRITE32_HANDLER( namco_rozvideoram32_le_w );
/***********************************************************************************/
/* C45 Land (Road) Emulation */

View File

@ -1,3 +1,5 @@
#include "namcos2.h"
#define NAMCONB1_HTOTAL (288) /* wrong */
#define NAMCONB1_HBSTART (288)
#define NAMCONB1_VTOTAL (262) /* needs to be checked */
@ -13,11 +15,11 @@
#define NAMCONB1_SPRITEGFX 1
#define NAMCONB1_ROTGFX 2
class namconb1_state : public driver_device
class namconb1_state : public namcos2_shared_state
{
public:
namconb1_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
: namcos2_shared_state(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_mcu(*this,"mcu"),
m_nvmem32(*this, "nvmem32"),

View File

@ -17,7 +17,7 @@
/*********************************************/
/* IF GAME SPECIFIC HACKS ARE REQUIRED THEN */
/* USE THE namcos2_gametype VARIABLE TO FIND */
/* USE THE m_gametype MEMBER TO FIND */
/* OUT WHAT GAME IS RUNNING */
/*********************************************/
@ -85,15 +85,103 @@ enum
NAMCOFL_FINAL_LAP_R
};
class namcos2_state : public driver_device
// fix me -- most of this should be devices eventually
class namcos2_shared_state : public driver_device
{
public:
namcos2_shared_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_gametype(0),
m_c169_roz_videoram(*this, "rozvideoram", 0),
m_c169_roz_gfxbank(0),
m_c169_roz_mask(NULL),
m_c355_obj_ram(*this, "objram", 0),
m_c355_obj_gfxbank(0),
m_c355_obj_palxor(0)
{ }
// game type helpers
bool is_system21();
int m_gametype;
// C169 ROZ Layer Emulation
public:
void c169_roz_init(int gfxbank, const char *maskregion);
void c169_roz_draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
DECLARE_READ16_MEMBER( c169_roz_control_r );
DECLARE_WRITE16_MEMBER( c169_roz_control_w );
DECLARE_READ16_MEMBER( c169_roz_bank_r );
DECLARE_WRITE16_MEMBER( c169_roz_bank_w );
DECLARE_READ16_MEMBER( c169_roz_videoram_r );
DECLARE_WRITE16_MEMBER( c169_roz_videoram_w );
protected:
struct roz_parameters
{
UINT32 left, top, size;
UINT32 startx, starty;
int incxx, incxy, incyx, incyy;
int color, priority;
};
void c169_roz_unpack_params(const UINT16 *source, roz_parameters &params);
void c169_roz_draw_helper(bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters &params);
void c169_roz_draw_scanline(bitmap_ind16 &bitmap, int line, int which, int pri, const rectangle &cliprect);
void c169_roz_get_info(tile_data &tileinfo, int tile_index, int which);
TILE_GET_INFO_MEMBER( c169_roz_get_info0 );
TILE_GET_INFO_MEMBER( c169_roz_get_info1 );
TILEMAP_MAPPER_MEMBER( c169_roz_mapper );
static const int ROZ_TILEMAP_COUNT = 2;
tilemap_t *m_c169_roz_tilemap[ROZ_TILEMAP_COUNT];
UINT16 m_c169_roz_bank[0x10/2];
UINT16 m_c169_roz_control[0x20/2];
optional_shared_ptr<UINT16> m_c169_roz_videoram;
int m_c169_roz_gfxbank;
UINT8 *m_c169_roz_mask;
// C355 Motion Object Emulation
public:
typedef delegate<int (int)> c355_obj_code2tile_delegate;
// for pal_xor, supply either 0x0 (normal) or 0xf (palette mapping reversed)
void c355_obj_init(int gfxbank, int pal_xor, c355_obj_code2tile_delegate code2tile);
int c355_obj_default_code2tile(int code);
void c355_obj_draw(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
void c355_obj_draw(bitmap_rgb32 &bitmap, const rectangle &cliprect, int pri);
DECLARE_READ16_MEMBER( c355_obj_ram_r );
DECLARE_WRITE16_MEMBER( c355_obj_ram_w );
DECLARE_READ16_MEMBER( c355_obj_position_r );
DECLARE_WRITE16_MEMBER( c355_obj_position_w );
protected:
// C355 Motion Object internals
template<class _BitmapClass>
void c355_obj_draw_sprite(_BitmapClass &bitmap, const rectangle &cliprect, const UINT16 *pSource, int pri, int zpos);
template<class _BitmapClass>
void c355_obj_draw_list(_BitmapClass &bitmap, const rectangle &cliprect, int pri, const UINT16 *pSpriteList16, const UINT16 *pSpriteTable);
optional_shared_ptr<UINT16> m_c355_obj_ram;
c355_obj_code2tile_delegate m_c355_obj_code2tile;
int m_c355_obj_gfxbank;
int m_c355_obj_palxor;
UINT16 m_c355_obj_position[4];
public:
// general
void zdrawgfxzoom(bitmap_ind16 &dest_bmp, const rectangle &clip, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
void zdrawgfxzoom(bitmap_rgb32 &dest_bmp, const rectangle &clip, const gfx_element *gfx, UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
};
class namcos2_state : public namcos2_shared_state
{
public:
namcos2_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
: namcos2_shared_state(mconfig, type, tag),
m_dpram(*this, "dpram"),
m_spriteram(*this, "spriteram"),
m_paletteram(*this, "paletteram"),
m_rozram(*this, "rozram")
m_spriteram(*this, "spriteram"),
m_rozram(*this, "rozram"),
m_roz_ctrl(*this, "rozctrl")
{ }
DECLARE_READ16_MEMBER(dpram_word_r);
DECLARE_WRITE16_MEMBER(dpram_word_w);
@ -145,16 +233,16 @@ public:
UINT32 screen_update_luckywld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_metlhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_sgunner(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TILE_GET_INFO_MEMBER( roz_tile_info );
DECLARE_READ16_MEMBER( paletteram_word_r );
DECLARE_WRITE16_MEMBER( paletteram_word_w );
DECLARE_READ16_MEMBER( spriteram_word_r );
DECLARE_WRITE16_MEMBER( spriteram_word_w );
DECLARE_READ16_MEMBER( rozram_word_r );
DECLARE_WRITE16_MEMBER( rozram_word_w );
DECLARE_READ16_MEMBER( roz_ctrl_word_r );
DECLARE_WRITE16_MEMBER( roz_ctrl_word_w );
DECLARE_READ16_MEMBER( gfx_ctrl_r );
DECLARE_WRITE16_MEMBER( gfx_ctrl_w );
void draw_sprite_init();
void update_palette();
void apply_clip( rectangle &clip, const rectangle &cliprect );
void draw_roz(bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -162,13 +250,15 @@ public:
void draw_sprites_metalhawk(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri );
UINT16 get_palette_register( int which );
required_shared_ptr<UINT8> m_dpram; /* 2Kx8 */
optional_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_paletteram;
optional_shared_ptr<UINT16> m_rozram;
int get_pos_irq_scanline() { return (get_palette_register(5) - 32) & 0xff; }
UINT16 m_roz_ctrl[0x8];
required_shared_ptr<UINT8> m_dpram; /* 2Kx8 */
required_shared_ptr<UINT16> m_paletteram;
optional_shared_ptr<UINT16> m_spriteram;
optional_shared_ptr<UINT16> m_rozram;
optional_shared_ptr<UINT16> m_roz_ctrl;
tilemap_t *m_tilemap_roz;
UINT16 m_gfx_ctrl;
};
@ -176,21 +266,6 @@ public:
#define NAMCOS21_NUM_COLORS 0x8000
VIDEO_START( namcos2 );
VIDEO_START( finallap );
VIDEO_START( luckywld );
VIDEO_START( metlhawk );
VIDEO_START( sgunner );
int namcos2_GetPosIrqScanline( running_machine &machine );
WRITE16_HANDLER( namcos2_gfx_ctrl_w );
READ16_HANDLER( namcos2_gfx_ctrl_r );
/**************************************************************/
/* Shared video palette function handlers */
/**************************************************************/
@ -204,7 +279,6 @@ READ16_HANDLER( namcos2_gfx_ctrl_r );
/*----------- defined in machine/namcos2.c -----------*/
extern void (*namcos2_kickstart)(running_machine &machine, int internal);
extern int namcos2_gametype;
MACHINE_START( namcos2 );
MACHINE_RESET( namcos2 );

View File

@ -2,6 +2,8 @@
* @file namcos21.h
*/
#include "namcos2.h"
#define NAMCOS21_POLY_FRAME_WIDTH 496
#define NAMCOS21_POLY_FRAME_HEIGHT 480
@ -23,11 +25,11 @@ struct dsp_state
int slaveActive;
};
class namcos21_state : public driver_device
class namcos21_state : public namcos2_shared_state
{
public:
namcos21_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
: namcos2_shared_state(mconfig, type, tag),
m_winrun_dspbios(*this,"winrun_dspbios"),
m_winrun_polydata(*this,"winrun_polydata"),
m_winrun_gpucomram(*this,"winrun_comram"),

View File

@ -21,7 +21,6 @@ static void InitC148(void);
static emu_timer *namcos2_posirq_timer;
void (*namcos2_kickstart)(running_machine &machine, int internal);
int namcos2_gametype;
static unsigned mFinalLapProtCount;
static int namcos2_mcu_analog_ctrl;
@ -31,6 +30,7 @@ static UINT8 *namcos2_eeprom;
static int sendval;
// not shared
READ16_HANDLER( namcos2_flap_prot_r )
{
static const UINT16 table0[8] = { 0x0000,0x0040,0x0440,0x2440,0x2480,0xa080,0x8081,0x8041 };
@ -86,7 +86,7 @@ ResetAllSubCPUs( running_machine &machine, int state )
{
cputag_set_input_line(machine, "slave", INPUT_LINE_RESET, state);
cputag_set_input_line(machine, "mcu", INPUT_LINE_RESET, state);
switch( namcos2_gametype )
switch( machine.driver_data<namcos2_shared_state>()->m_gametype )
{
case NAMCOS21_SOLVALOU:
case NAMCOS21_STARBLADE:
@ -232,7 +232,7 @@ sws93 1993 334 $014e
READ16_HANDLER( namcos2_68k_key_r )
{
switch (namcos2_gametype)
switch (space->machine().driver_data<namcos2_shared_state>()->m_gametype)
{
case NAMCOS2_ORDYNE:
switch(offset)
@ -406,19 +406,20 @@ READ16_HANDLER( namcos2_68k_key_r )
WRITE16_HANDLER( namcos2_68k_key_w )
{
if( namcos2_gametype == NAMCOS2_MARVEL_LAND && offset == 5 )
int gametype = space->machine().driver_data<namcos2_shared_state>()->m_gametype;
if( gametype == NAMCOS2_MARVEL_LAND && offset == 5 )
{
if (data == 0x615E) sendval = 1;
}
if( namcos2_gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4 )
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 4 )
{
if (data == 0x13EC) sendval = 1;
}
if( namcos2_gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7 )
if( gametype == NAMCOS2_ROLLING_THUNDER_2 && offset == 7 )
{
if (data == 0x13EC) sendval = 1;
}
if( namcos2_gametype == NAMCOS2_MARVEL_LAND && offset == 6 )
if( gametype == NAMCOS2_MARVEL_LAND && offset == 6 )
{
if (data == 0x1001) sendval = 0;
}
@ -437,19 +438,19 @@ static UINT16 namcos2_68k_slave_C148[0x20];
static UINT16 namcos2_68k_gpu_C148[0x20];
static int IsSystem21( void )
bool namcos2_shared_state::is_system21()
{
switch( namcos2_gametype )
switch (m_gametype)
{
case NAMCOS21_AIRCOMBAT:
case NAMCOS21_STARBLADE:
case NAMCOS21_CYBERSLED:
case NAMCOS21_SOLVALOU:
case NAMCOS21_WINRUN91:
case NAMCOS21_DRIVERS_EYES:
return 1;
default:
return 0;
case NAMCOS21_AIRCOMBAT:
case NAMCOS21_STARBLADE:
case NAMCOS21_CYBERSLED:
case NAMCOS21_SOLVALOU:
case NAMCOS21_WINRUN91:
case NAMCOS21_DRIVERS_EYES:
return 1;
default:
return 0;
}
}
@ -654,13 +655,15 @@ READ16_HANDLER( namcos2_68k_gpu_C148_r )
static int GetPosIRQScanline( running_machine &machine )
{
if (IsSystem21()) return 0;
return namcos2_GetPosIrqScanline(machine);
namcos2_shared_state *state = machine.driver_data<namcos2_shared_state>();
if (state->is_system21()) return 0;
return downcast<namcos2_state *>(state)->get_pos_irq_scanline();
}
static TIMER_CALLBACK( namcos2_posirq_tick )
{
if (IsSystem21()) {
namcos2_shared_state *state = machine.driver_data<namcos2_shared_state>();
if (state->is_system21()) {
if (namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
machine.primary_screen->update_partial(param);
cputag_set_input_line(machine, "gpu", namcos2_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
@ -682,13 +685,15 @@ void namcos2_adjust_posirq_timer( running_machine &machine, int scanline )
INTERRUPT_GEN( namcos2_68k_master_vblank )
{
if (!IsSystem21()) namcos2_adjust_posirq_timer(device->machine(), GetPosIRQScanline(device->machine()));
namcos2_shared_state *state = device->machine().driver_data<namcos2_shared_state>();
if (!state->is_system21()) namcos2_adjust_posirq_timer(device->machine(), GetPosIRQScanline(device->machine()));
device_set_input_line(device, namcos2_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
}
INTERRUPT_GEN( namcos2_68k_slave_vblank )
{
if (!IsSystem21()) namcos2_adjust_posirq_timer(device->machine(), GetPosIRQScanline(device->machine()));
namcos2_shared_state *state = device->machine().driver_data<namcos2_shared_state>();
if (!state->is_system21()) namcos2_adjust_posirq_timer(device->machine(), GetPosIRQScanline(device->machine()));
device_set_input_line(device, namcos2_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
}
@ -765,8 +770,8 @@ WRITE8_HANDLER( namcos2_mcu_analog_ctrl_w )
#if 0
/* Perform the offset handling on the input port */
/* this converts it to a twos complement number */
if( namcos2_gametype == NAMCOS2_DIRT_FOX ||
namcos2_gametype == NAMCOS2_DIRT_FOX_JP )
if( m_gametype == NAMCOS2_DIRT_FOX ||
m_gametype == NAMCOS2_DIRT_FOX_JP )
{
namcos2_mcu_analog_data ^= 0x80;
}

View File

@ -2,7 +2,6 @@
#include "emu.h"
#include "includes/namcoic.h"
#include "includes/namcos2.h"
#include "includes/namcofl.h"
@ -83,6 +82,7 @@ static void TilemapCB(running_machine &machine, UINT16 code, int *tile, int *mas
SCREEN_UPDATE_IND16( namcofl )
{
namcofl_state *state = screen.machine().driver_data<namcofl_state>();
int pri;
namcofl_install_palette(screen.machine());
@ -91,10 +91,10 @@ SCREEN_UPDATE_IND16( namcofl )
for( pri=0; pri<16; pri++ )
{
namco_roz_draw( bitmap,cliprect,pri );
state->c169_roz_draw(bitmap, cliprect, pri);
if((pri&1)==0)
namco_tilemap_draw( bitmap, cliprect, pri>>1 );
namco_obj_draw(screen.machine(), bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri );
}
return 0;
@ -119,7 +119,8 @@ static int FLobjcode2tile( running_machine &machine, int code )
VIDEO_START( namcofl )
{
namcofl_state *state = machine.driver_data<namcofl_state>();
namco_tilemap_init( machine, NAMCOFL_TILEGFX, machine.root_device().memregion(NAMCOFL_TILEMASKREGION)->base(), TilemapCB );
namco_obj_init(machine,NAMCOFL_SPRITEGFX,0x0,FLobjcode2tile);
namco_roz_init(machine,NAMCOFL_ROTGFX,NAMCOFL_ROTMASKREGION);
state->c355_obj_init(NAMCOFL_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(FUNC(FLobjcode2tile), &machine));
state->c169_roz_init(NAMCOFL_ROTGFX,NAMCOFL_ROTMASKREGION);
}

View File

@ -3,7 +3,6 @@
#include "emu.h"
#include "includes/namconb1.h"
#include "includes/namcoic.h"
#include "includes/namcos2.h"
/* nth_word32 is a general-purpose utility function, which allows us to
@ -52,7 +51,7 @@ NB2TilemapCB(running_machine &machine, UINT16 code, int *tile, int *mask )
namconb1_state *state = machine.driver_data<namconb1_state>();
int mangle;
if( namcos2_gametype == NAMCONB2_MACH_BREAKERS )
if( state->m_gametype == NAMCONB2_MACH_BREAKERS )
{
/* 00010203 04050607 00010203 04050607 (normal) */
/* 00010718 191a1b07 00010708 090a0b07 (alt bank) */
@ -105,6 +104,7 @@ static void namconb1_install_palette(running_machine &machine)
static void
video_update_common(running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int bROZ )
{
namconb1_state *state = machine.driver_data<namconb1_state>();
int pri;
namconb1_install_palette(machine);
@ -112,12 +112,12 @@ video_update_common(running_machine &machine, bitmap_ind16 &bitmap, const rectan
{
for( pri=0; pri<16; pri++ )
{
namco_roz_draw( bitmap,cliprect,pri );
state->c169_roz_draw(bitmap, cliprect, pri);
if( (pri&1)==0 )
{
namco_tilemap_draw( bitmap, cliprect, pri/2 );
}
namco_obj_draw(machine, bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri );
}
}
else
@ -125,7 +125,7 @@ video_update_common(running_machine &machine, bitmap_ind16 &bitmap, const rectan
for( pri=0; pri<8; pri++ )
{
namco_tilemap_draw( bitmap, cliprect, pri );
namco_obj_draw(machine, bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri );
}
}
} /* video_update_common */
@ -164,8 +164,9 @@ NB1objcode2tile( running_machine &machine, int code )
VIDEO_START( namconb1 )
{
namconb1_state *state = machine.driver_data<namconb1_state>();
namco_tilemap_init( machine, NAMCONB1_TILEGFX, machine.root_device().memregion(NAMCONB1_TILEMASKREGION)->base(), NB1TilemapCB );
namco_obj_init(machine,NAMCONB1_SPRITEGFX,0x0,NB1objcode2tile);
state->c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(FUNC(NB1objcode2tile), &machine));
} /* namconb1 */
/****************************************************************************************************/
@ -202,7 +203,7 @@ NB2objcode2tile( running_machine &machine, int code )
namconb1_state *state = machine.driver_data<namconb1_state>();
int bank = nth_byte32( state->m_spritebank32, (code>>11)&0xf );
code &= 0x7ff;
if( namcos2_gametype == NAMCONB2_MACH_BREAKERS )
if( state->m_gametype == NAMCONB2_MACH_BREAKERS )
{
if( bank&0x01 ) code |= 0x01*0x800;
if( bank&0x02 ) code |= 0x02*0x800;
@ -225,7 +226,8 @@ NB2objcode2tile( running_machine &machine, int code )
VIDEO_START( namconb2 )
{
namconb1_state *state = machine.driver_data<namconb1_state>();
namco_tilemap_init(machine, NAMCONB1_TILEGFX, machine.root_device().memregion(NAMCONB1_TILEMASKREGION)->base(), NB2TilemapCB );
namco_obj_init(machine,NAMCONB1_SPRITEGFX,0x0,NB2objcode2tile);
namco_roz_init(machine, NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION);
state->c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(FUNC(NB2objcode2tile), &machine));
state->c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION);
} /* namconb2_vh_start */

View File

@ -10,7 +10,8 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
{
*mask = code;
switch( namcos2_gametype )
namcos2_shared_state *state = machine.driver_data<namcos2_shared_state>();
switch( state->m_gametype )
{
case NAMCOS2_FINAL_LAP_2:
case NAMCOS2_FINAL_LAP_3:
@ -25,33 +26,31 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
} /* TilemapCB */
/**
* namcos2_gfx_ctrl selects a bank of 128 sprites within spriteram
* m_gfx_ctrl selects a bank of 128 sprites within spriteram
*
* namcos2_gfx_ctrl also supplies palette and priority information that is applied to the output of the
* Namco System 2 ROZ chip
* m_gfx_ctrl also supplies palette and priority information that is applied to the output of the
* Namco System 2 ROZ chip
*
* -xxx ---- ---- ---- roz priority
* ---- xxxx ---- ---- roz palette
* ---- ---- xxxx ---- always zero?
* ---- ---- ---- xxxx sprite bank
*/
static UINT16 namcos2_gfx_ctrl;
READ16_HANDLER( namcos2_gfx_ctrl_r )
READ16_MEMBER( namcos2_state::gfx_ctrl_r )
{
return namcos2_gfx_ctrl;
return m_gfx_ctrl;
} /* namcos2_gfx_ctrl_r */
WRITE16_HANDLER( namcos2_gfx_ctrl_w )
WRITE16_MEMBER( namcos2_state::gfx_ctrl_w )
{
COMBINE_DATA(&namcos2_gfx_ctrl);
COMBINE_DATA(&m_gfx_ctrl);
} /* namcos2_gfx_ctrl_w */
static TILE_GET_INFO( get_tile_info_roz )
TILE_GET_INFO_MEMBER( namcos2_state::roz_tile_info )
{
int tile = machine.driver_data<namcos2_state>()->m_rozram[tile_index];
SET_TILE_INFO(3,tile,0/*color*/,0);
} /* get_tile_info_roz */
int tile = m_rozram[tile_index];
SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
} /* roz_tile_info */
struct RozParam
{
@ -240,7 +239,7 @@ void namcos2_state::draw_roz(bitmap_ind16 &bitmap, const rectangle &cliprect)
const int xoffset = 38,yoffset = 0;
struct RozParam rozParam;
rozParam.color = (namcos2_gfx_ctrl & 0x0f00);
rozParam.color = (m_gfx_ctrl & 0x0f00);
rozParam.incxx = (INT16)m_roz_ctrl[0];
rozParam.incxy = (INT16)m_roz_ctrl[1];
rozParam.incyx = (INT16)m_roz_ctrl[2];
@ -285,21 +284,6 @@ void namcos2_state::draw_roz(bitmap_ind16 &bitmap, const rectangle &cliprect)
DrawRozHelper( bitmap, m_tilemap_roz, cliprect, &rozParam );
}
READ16_MEMBER(namcos2_state::roz_ctrl_word_r)
{
return m_roz_ctrl[offset];
}
WRITE16_MEMBER( namcos2_state::roz_ctrl_word_w )
{
COMBINE_DATA(&m_roz_ctrl[offset]);
}
READ16_MEMBER( namcos2_state::rozram_word_r )
{
return m_rozram[offset];
}
WRITE16_MEMBER( namcos2_state::rozram_word_w )
{
COMBINE_DATA(&m_rozram[offset]);
@ -312,7 +296,7 @@ WRITE16_MEMBER( namcos2_state::rozram_word_w )
/**************************************************************************/
inline UINT16 namcos2_state::get_palette_register( int which )
UINT16 namcos2_state::get_palette_register( int which )
{
const UINT16 *source = &m_paletteram[0x3000/2];
return ((source[which*2]&0xff)<<8) | (source[which*2+1]&0xff);
@ -362,7 +346,7 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
/*case 0x180a:*/ case 0x180b:
if (data^m_paletteram[offset]) {
m_paletteram[offset] = data;
namcos2_adjust_posirq_timer(machine(),namcos2_GetPosIrqScanline(machine()));
namcos2_adjust_posirq_timer(machine(),get_pos_irq_scanline());
}
break;
@ -379,12 +363,6 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
} /* namcos2_68k_video_palette_w */
int
namcos2_GetPosIrqScanline( running_machine &machine )
{
return (machine.driver_data<namcos2_state>()->get_palette_register(5) - 32) & 0xff;
} /* namcos2_GetPosIrqScanline */
inline void
namcos2_state::update_palette()
{
@ -407,35 +385,23 @@ namcos2_state::update_palette()
/**************************************************************************/
static void
DrawSpriteInit( running_machine &machine )
void namcos2_state::draw_sprite_init()
{
int i;
/* set table for sprite color == 0x0f */
for( i = 0; i<16*256; i++ )
for( int i = 0; i<16*256; i++ )
{
machine.shadow_table[i] = i+0x2000;
machine().shadow_table[i] = i+0x2000;
}
}
WRITE16_MEMBER( namcos2_state::spriteram_word_w )
{
COMBINE_DATA(&m_spriteram[offset]);
}
READ16_MEMBER( namcos2_state::spriteram_word_r )
{
return m_spriteram[offset];
}
/**************************************************************************/
void namcos2_state::video_start()
{
namco_tilemap_init(machine(), 2, memregion("gfx4")->base(), TilemapCB);
m_tilemap_roz = tilemap_create(machine(), get_tile_info_roz,tilemap_scan_rows,8,8,256,256);
m_tilemap_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(namcos2_state::roz_tile_info), this), tilemap_mapper_delegate(FUNC(tilemap_scan_rows), &machine()), 8,8,256,256);
m_tilemap_roz->set_transparent_pen(0xff);
DrawSpriteInit(machine());
draw_sprite_init();
}
void namcos2_state::apply_clip( rectangle &clip, const rectangle &cliprect )
@ -458,7 +424,7 @@ UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
apply_clip( clip, cliprect );
/* HACK: enable ROZ layer only if it has priority > 0 */
m_tilemap_roz->enable((namcos2_gfx_ctrl & 0x7000) ? 1 : 0);
m_tilemap_roz->enable((m_gfx_ctrl & 0x7000) ? 1 : 0);
for( pri=0; pri<16; pri++ )
{
@ -466,11 +432,11 @@ UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
{
namco_tilemap_draw( bitmap, clip, pri/2 );
if( ((namcos2_gfx_ctrl & 0x7000) >> 12)==pri/2 )
if( ((m_gfx_ctrl & 0x7000) >> 12)==pri/2 )
{
draw_roz(bitmap,clip);
}
draw_sprites(bitmap, clip, pri/2, namcos2_gfx_ctrl );
draw_sprites(bitmap, clip, pri/2, m_gfx_ctrl );
}
}
return 0;
@ -481,7 +447,7 @@ UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
void namcos2_state::video_start_finallap()
{
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB);
DrawSpriteInit(machine());
draw_sprite_init();
namco_road_init(machine(), 3);
}
@ -501,7 +467,7 @@ UINT32 namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16
namco_tilemap_draw( bitmap, clip, pri/2 );
}
namco_road_draw(machine(), bitmap,clip,pri );
draw_sprites(bitmap,clip,pri,namcos2_gfx_ctrl );
draw_sprites(bitmap,clip,pri,m_gfx_ctrl );
}
return 0;
}
@ -511,12 +477,12 @@ UINT32 namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_luckywld()
{
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB);
namco_obj_init( machine(), 0, 0x0, NULL );
if( namcos2_gametype==NAMCOS2_LUCKY_AND_WILD )
c355_obj_init( 0, 0x0, namcos2_shared_state::c355_obj_code2tile_delegate() );
if( m_gametype==NAMCOS2_LUCKY_AND_WILD )
{
namco_roz_init( machine(), 1, "gfx5" );
c169_roz_init(1, "gfx5");
}
if( namcos2_gametype!=NAMCOS2_STEEL_GUNNER_2 )
if( m_gametype!=NAMCOS2_STEEL_GUNNER_2 )
{
namco_road_init(machine(), 3);
}
@ -538,11 +504,11 @@ UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16
namco_tilemap_draw( bitmap, clip, pri/2 );
}
namco_road_draw(machine(), bitmap,clip,pri );
if( namcos2_gametype==NAMCOS2_LUCKY_AND_WILD )
if( m_gametype==NAMCOS2_LUCKY_AND_WILD )
{
namco_roz_draw( bitmap, clip, pri );
c169_roz_draw(bitmap, clip, pri);
}
namco_obj_draw(machine(), bitmap, clip, pri );
c355_obj_draw(bitmap, clip, pri );
}
return 0;
}
@ -552,7 +518,7 @@ UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_sgunner()
{
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB);
namco_obj_init( machine(), 0, 0x0, NULL );
c355_obj_init( 0, 0x0, namcos2_shared_state::c355_obj_code2tile_delegate() );
}
UINT32 namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -567,7 +533,7 @@ UINT32 namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16
for( pri=0; pri<8; pri++ )
{
namco_tilemap_draw( bitmap, clip, pri );
namco_obj_draw(machine(), bitmap, clip, pri );
c355_obj_draw(bitmap, clip, pri );
}
return 0;
}
@ -578,7 +544,7 @@ UINT32 namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_metlhawk()
{
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB);
namco_roz_init( machine(), 1, "gfx5" );
c169_roz_init(1, "gfx5");
}
UINT32 namcos2_state::screen_update_metlhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
@ -596,7 +562,7 @@ UINT32 namcos2_state::screen_update_metlhawk(screen_device &screen, bitmap_ind16
{
namco_tilemap_draw( bitmap, clip, pri/2 );
}
namco_roz_draw( bitmap, clip, pri );
c169_roz_draw(bitmap, clip, pri);
draw_sprites_metalhawk(bitmap,clip,pri );
}
return 0;

View File

@ -7,7 +7,6 @@ Namco System 21 Video Hardware
*/
#include "emu.h"
#include "includes/namcos2.h"
#include "includes/namcoic.h"
#include "includes/namcos21.h"
@ -117,15 +116,15 @@ CopyVisiblePolyFrameBuffer( running_machine &machine, bitmap_ind16 &bitmap, cons
VIDEO_START( namcos21 )
{
namcos21_state *state = machine.driver_data<namcos21_state>();
if( namcos2_gametype == NAMCOS21_WINRUN91 )
if( state->m_gametype == NAMCOS21_WINRUN91 )
{
state->m_videoram = auto_alloc_array(machine, UINT8, 0x80000);
}
AllocatePolyFrameBuffer(machine);
namco_obj_init(machine,
state->c355_obj_init(
0, /* gfx bank */
0xf, /* reverse palette mapping */
NULL );
namcos2_shared_state::c355_obj_code2tile_delegate() );
} /* VIDEO_START( namcos21 ) */
static void
@ -176,30 +175,30 @@ SCREEN_UPDATE_IND16( namcos21 )
update_palette(screen.machine());
bitmap.fill(0xff, cliprect );
if( namcos2_gametype != NAMCOS21_WINRUN91 )
if( state->m_gametype != NAMCOS21_WINRUN91 )
{ /* draw low priority 2d sprites */
namco_obj_draw(screen.machine(), bitmap, cliprect, 2 );
namco_obj_draw(screen.machine(), bitmap, cliprect, 14 ); //driver's eyes
state->c355_obj_draw(bitmap, cliprect, 2 );
state->c355_obj_draw(bitmap, cliprect, 14 ); //driver's eyes
}
CopyVisiblePolyFrameBuffer( screen.machine(), bitmap, cliprect, 0x7fc0, 0x7ffe );
if( namcos2_gametype != NAMCOS21_WINRUN91 )
if( state->m_gametype != NAMCOS21_WINRUN91 )
{ /* draw low priority 2d sprites */
namco_obj_draw(screen.machine(), bitmap, cliprect, 0 );
namco_obj_draw(screen.machine(), bitmap, cliprect, 1 );
state->c355_obj_draw(bitmap, cliprect, 0 );
state->c355_obj_draw(bitmap, cliprect, 1 );
}
CopyVisiblePolyFrameBuffer( screen.machine(), bitmap, cliprect, 0, 0x7fbf );
if( namcos2_gametype != NAMCOS21_WINRUN91 )
if( state->m_gametype != NAMCOS21_WINRUN91 )
{ /* draw high priority 2d sprites */
for( pri=pivot; pri<8; pri++ )
{
namco_obj_draw(screen.machine(), bitmap, cliprect, pri );
state->c355_obj_draw(bitmap, cliprect, pri );
}
namco_obj_draw(screen.machine(), bitmap, cliprect, 15 ); //driver's eyes
state->c355_obj_draw(bitmap, cliprect, 15 ); //driver's eyes
}
else
{ /* winrun bitmap layer */
@ -288,12 +287,12 @@ renderscanline_flat( namcos21_state *state, const edge *e1, const edge *e2, int
if( depthcueenable && zz>0 )
{
int depth = 0;
if( namcos2_gametype == NAMCOS21_WINRUN91 )
if( state->m_gametype == NAMCOS21_WINRUN91 )
{
depth = (zz>>10)*0x100;
pen += depth;
}
else if( namcos2_gametype == NAMCOS21_DRIVERS_EYES )
else if( state->m_gametype == NAMCOS21_DRIVERS_EYES )
{
depth = (zz>>10)*0x100;
pen -= depth;
@ -445,11 +444,11 @@ namcos21_DrawQuad( running_machine &machine, int sx[4], int sy[4], int zcode[4],
0x4000..0x5fff polygon palette bank1 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
0x6000..0x7fff polygon palette bank2 (0x10 sets of 0x200 colors or 0x20 sets of 0x100 colors)
*/
if( namcos2_gametype == NAMCOS21_WINRUN91 )
if( state->m_gametype == NAMCOS21_WINRUN91 )
{
color = 0x4000|(color&0xff);
}
else if ( namcos2_gametype == NAMCOS21_DRIVERS_EYES )
else if ( state->m_gametype == NAMCOS21_DRIVERS_EYES )
{
color = 0x3f00|(color&0xff);
}