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 // 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(_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) #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 // 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(_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 // 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(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) #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: // 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" #include "rendlay.h"
class gal3_state : public driver_device class gal3_state : public namcos2_shared_state
{ {
public: public:
gal3_state(const machine_config &mconfig, device_type type, const char *tag) 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_nvmem(*this, "nvmem"),
m_rso_shared_ram(*this, "rso_shared_ram"){ } m_rso_shared_ram(*this, "rso_shared_ram"){ }
@ -166,10 +166,10 @@ static VIDEO_START(gal3)
gal3_state *state = machine.driver_data<gal3_state>(); gal3_state *state = machine.driver_data<gal3_state>();
state->m_generic_paletteram_16.allocate(0x10000); state->m_generic_paletteram_16.allocate(0x10000);
namco_obj_init(machine, state->c355_obj_init(
0, /* gfx bank */ 0, /* gfx bank */
0xf, /* reverse palette mapping */ 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++ ) 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 ); /* CopyVisiblePolyFrameBuffer( bitmap, cliprect,0,0x7fbf );
for( pri=pivot; pri<15; pri++ ) for( pri=pivot; pri<15; pri++ )
{ {
namco_obj_draw(screen.machine(), bitmap, cliprect, pri ); state->c355_obj_draw(bitmap, cliprect, pri);
}*/ }*/
// CPU Diag LEDs // 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(0xf1440000, 0xf1440003) AM_READWRITE_LEGACY(pointram_data_r,pointram_data_w)
/// AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (frame buffer?) */ /// AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (frame buffer?) */
/// AM_RANGE(0xf1480000, 0xf14807ff) AM_READWRITE_LEGACY(namcos21_depthcue_r,namcos21_depthcue_w) /// 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(0xf1700000, 0xf170ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0xf1720000, 0xf1720007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w) 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(0xf1740000, 0xf175ffff) AM_READWRITE(paletteram32_r,paletteram32_w)
AM_RANGE(0xf1760000, 0xf1760003) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) AM_RANGE(0xf1760000, 0xf1760003) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w)
AM_RANGE(0xf2200000, 0xf220ffff) AM_RAM AM_RANGE(0xf2200000, 0xf220ffff) AM_RAM
AM_RANGE(0xf2700000, 0xf270ffff) AM_RAM //AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_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_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w) 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(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) AM_RANGE(0xf2760000, 0xf2760003) AM_RAM //AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w)
ADDRESS_MAP_END ADDRESS_MAP_END

View File

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

View File

@ -272,7 +272,6 @@ GFX: Custom 145 ( 80 pin PQFP)
#include "emu.h" #include "emu.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "includes/namconb1.h" #include "includes/namconb1.h"
#include "includes/namcos2.h"
#include "includes/namcoic.h" #include "includes/namcoic.h"
#include "sound/c352.h" #include "sound/c352.h"
#include "cpu/m37710/m37710.h" #include "cpu/m37710/m37710.h"
@ -590,7 +589,7 @@ static NVRAM_HANDLER( namconb1 )
else else
{ {
memset( state->m_nvmem32, 0x00, NB1_NVMEM_SIZE ); 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 */ state->m_nvmem32[0] = 0x0f260f26; /* default gun calibration */
} }
@ -612,52 +611,52 @@ DRIVER_INIT_MEMBER(namconb1_state,nebulray)
size_t numBytes = (0xfe7-0xe6f)*8; size_t numBytes = (0xfe7-0xe6f)*8;
memset( &pMem[0xe6f*8], 0, numBytes ); memset( &pMem[0xe6f*8], 0, numBytes );
namcos2_gametype = NAMCONB1_NEBULRAY; m_gametype = NAMCONB1_NEBULRAY;
} /* nebulray */ } /* nebulray */
DRIVER_INIT_MEMBER(namconb1_state,gslgr94u) DRIVER_INIT_MEMBER(namconb1_state,gslgr94u)
{ {
namcos2_gametype = NAMCONB1_GSLGR94U; m_gametype = NAMCONB1_GSLGR94U;
} /* gslgr94u */ } /* gslgr94u */
DRIVER_INIT_MEMBER(namconb1_state,gslgr94j) DRIVER_INIT_MEMBER(namconb1_state,gslgr94j)
{ {
namcos2_gametype = NAMCONB1_GSLGR94J; m_gametype = NAMCONB1_GSLGR94J;
} /* gslgr94j */ } /* gslgr94j */
DRIVER_INIT_MEMBER(namconb1_state,sws95) DRIVER_INIT_MEMBER(namconb1_state,sws95)
{ {
namcos2_gametype = NAMCONB1_SWS95; m_gametype = NAMCONB1_SWS95;
} /* sws95 */ } /* sws95 */
DRIVER_INIT_MEMBER(namconb1_state,sws96) DRIVER_INIT_MEMBER(namconb1_state,sws96)
{ {
namcos2_gametype = NAMCONB1_SWS96; m_gametype = NAMCONB1_SWS96;
} /* sws96 */ } /* sws96 */
DRIVER_INIT_MEMBER(namconb1_state,sws97) DRIVER_INIT_MEMBER(namconb1_state,sws97)
{ {
namcos2_gametype = NAMCONB1_SWS97; m_gametype = NAMCONB1_SWS97;
} /* sws97 */ } /* sws97 */
DRIVER_INIT_MEMBER(namconb1_state,gunbulet) DRIVER_INIT_MEMBER(namconb1_state,gunbulet)
{ {
namcos2_gametype = NAMCONB1_GUNBULET; m_gametype = NAMCONB1_GUNBULET;
} /* gunbulet */ } /* gunbulet */
DRIVER_INIT_MEMBER(namconb1_state,vshoot) DRIVER_INIT_MEMBER(namconb1_state,vshoot)
{ {
namcos2_gametype = NAMCONB1_VSHOOT; m_gametype = NAMCONB1_VSHOOT;
} /* vshoot */ } /* vshoot */
DRIVER_INIT_MEMBER(namconb1_state,machbrkr) DRIVER_INIT_MEMBER(namconb1_state,machbrkr)
{ {
namcos2_gametype = NAMCONB2_MACH_BREAKERS; m_gametype = NAMCONB2_MACH_BREAKERS;
} }
DRIVER_INIT_MEMBER(namconb1_state,outfxies) DRIVER_INIT_MEMBER(namconb1_state,outfxies)
{ {
namcos2_gametype = NAMCONB2_OUTFOXIES; m_gametype = NAMCONB2_OUTFOXIES;
} }
READ32_MEMBER(namconb1_state::custom_key_r) READ32_MEMBER(namconb1_state::custom_key_r)
@ -669,7 +668,7 @@ READ32_MEMBER(namconb1_state::custom_key_r)
m_count = machine().rand(); m_count = machine().rand();
} while( m_count==old_count ); } while( m_count==old_count );
switch( namcos2_gametype ) switch( m_gametype )
{ {
case NAMCONB1_GUNBULET: case NAMCONB1_GUNBULET:
return 0; /* no protection */ 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(0x208000, 0x2fffff) AM_RAM
AM_RANGE(0x400000, 0x40001f) AM_READWRITE(namconb_cpureg_r, namconb1_cpureg_w) AM_RANGE(0x400000, 0x40001f) AM_READWRITE(namconb_cpureg_r, namconb1_cpureg_w)
AM_RANGE(0x580000, 0x5807ff) AM_RAM AM_SHARE("nvmem32") AM_RANGE(0x580000, 0x5807ff) AM_RAM AM_SHARE("nvmem32")
AM_RANGE(0x600000, 0x61ffff) AM_READWRITE_LEGACY(namco_obj32_r,namco_obj32_w) AM_RANGE(0x600000, 0x61ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0x620000, 0x620007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w) 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(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(0x660000, 0x66003f) AM_READWRITE_LEGACY(namco_tilemapcontrol32_r,namco_tilemapcontrol32_w)
AM_RANGE(0x680000, 0x68000f) AM_RAM AM_SHARE("spritebank32") 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(0x200000, 0x207fff) AM_READWRITE(namconb_share_r, namconb_share_w)
AM_RANGE(0x208000, 0x2fffff) AM_RAM AM_RANGE(0x208000, 0x2fffff) AM_RAM
AM_RANGE(0x400000, 0x4fffff) AM_ROM AM_REGION("data", 0) 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(0x600000, 0x61ffff) AM_READWRITE16(c355_obj_ram_r,c355_obj_ram_w,0xffffffff) AM_SHARE("objram")
AM_RANGE(0x620000, 0x620007) AM_READWRITE_LEGACY(namco_spritepos32_r,namco_spritepos32_w) 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(0x640000, 0x64000f) AM_RAM /* unknown xy offset */
AM_RANGE(0x680000, 0x68ffff) AM_READWRITE_LEGACY(namco_tilemapvideoram32_r, namco_tilemapvideoram32_w ) 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(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(0x700000, 0x71ffff) AM_READWRITE16(c169_roz_videoram_r,c169_roz_videoram_w,0xffffffff) AM_SHARE("rozvideoram")
AM_RANGE(0x740000, 0x74001f) AM_READWRITE_LEGACY(namco_rozcontrol32_r,namco_rozcontrol32_w) 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(0x800000, 0x807fff) AM_RAM AM_SHARE("paletteram")
AM_RANGE(0x900008, 0x90000f) AM_RAM AM_SHARE("spritebank32") AM_RANGE(0x900008, 0x90000f) AM_RAM AM_SHARE("spritebank32")
AM_RANGE(0x940000, 0x94000f) AM_RAM AM_SHARE("tilebank32") 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(0xa00000, 0xa007ff) AM_RAM AM_SHARE("nvmem32")
AM_RANGE(0xc00000, 0xc0001f) AM_READ(custom_key_r) AM_WRITENOP AM_RANGE(0xc00000, 0xc0001f) AM_READ(custom_key_r) AM_WRITENOP
AM_RANGE(0xf00000, 0xf0001f) AM_READWRITE(namconb_cpureg_r, namconb2_cpureg_w) 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; m_dpram[offset] = data&0xff;
if( namcos2_gametype==NAMCOS2_GOLLY_GHOST ) if( m_gametype==NAMCOS2_GOLLY_GHOST )
{ {
switch( offset ) switch( offset )
{ {
@ -601,10 +601,10 @@ ADDRESS_MAP_END
/*************************************************************/ /*************************************************************/
static ADDRESS_MAP_START( common_default_am, AS_PROGRAM, 16, namcos2_state ) 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(0xc00000, 0xc03fff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xc40000, 0xc40001) AM_READWRITE_LEGACY(namcos2_gfx_ctrl_r,namcos2_gfx_ctrl_w) AM_RANGE(0xc40000, 0xc40001) AM_READWRITE(gfx_ctrl_r, gfx_ctrl_w)
AM_RANGE(0xc80000, 0xc9ffff) AM_READWRITE(rozram_word_r,rozram_word_w) AM_SHARE("rozram") AM_RANGE(0xc80000, 0xc9ffff) AM_RAM_WRITE(rozram_word_w) AM_SHARE("rozram")
AM_RANGE(0xcc0000, 0xcc000f) AM_READWRITE(roz_ctrl_word_r, roz_ctrl_word_w) 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_RANGE(0xd00000, 0xd0000f) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am ) AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -629,8 +629,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( common_finallap_am, AS_PROGRAM, 16, namcos2_state ) 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(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(0x800000, 0x80ffff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x840000, 0x840001) AM_READ_LEGACY(namcos2_gfx_ctrl_r) AM_WRITE_LEGACY(namcos2_gfx_ctrl_w) 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(0x880000, 0x89ffff) AM_READ_LEGACY(namco_road16_r) AM_WRITE_LEGACY(namco_road16_w)
AM_RANGE(0x8c0000, 0x8c0001) AM_WRITENOP AM_RANGE(0x8c0000, 0x8c0001) AM_WRITENOP
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am ) 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 ) 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(0x818000, 0x818001) AM_WRITENOP
AM_RANGE(0xa00000, 0xa0000f) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w) AM_RANGE(0xa00000, 0xa0000f) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am ) 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 ) 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(0xc00000, 0xc03fff) AM_RAM AM_SHARE("spriteram") \
AM_RANGE(0xc40000, 0xc4ffff) AM_READWRITE_LEGACY(namco_rozvideoram16_r,namco_rozvideoram16_w) \ AM_RANGE(0xc40000, 0xc4ffff) AM_READWRITE(c169_roz_videoram_r,c169_roz_videoram_w) AM_SHARE("rozvideoram") \
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE_LEGACY(namco_rozcontrol16_r,namco_rozcontrol16_w) \ AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE(c169_roz_control_r,c169_roz_control_w) \
AM_RANGE(0xe00000, 0xe00001) AM_READWRITE_LEGACY(namcos2_gfx_ctrl_r,namcos2_gfx_ctrl_w) /* ??? */ \ AM_RANGE(0xe00000, 0xe00001) AM_READWRITE(gfx_ctrl_r, gfx_ctrl_w) /* ??? */ \
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am ) AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -703,14 +703,14 @@ ADDRESS_MAP_END
/*************************************************************/ /*************************************************************/
static ADDRESS_MAP_START( common_luckywld_am, AS_PROGRAM, 16, namcos2_state ) 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(0x818000, 0x818001) AM_NOP /* enable? */
AM_RANGE(0x81a000, 0x81a001) AM_WRITENOP /* enable? */ AM_RANGE(0x81a000, 0x81a001) AM_WRITENOP /* enable? */
AM_RANGE(0x840000, 0x840001) AM_READNOP 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(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(0xc00000, 0xc0ffff) AM_READWRITE(c169_roz_videoram_r,c169_roz_videoram_w) AM_SHARE("rozvideoram")
AM_RANGE(0xd00000, 0xd0001f) AM_READWRITE_LEGACY(namco_rozcontrol16_r,namco_rozcontrol16_w) 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_RANGE(0xf00000, 0xf00007) AM_READWRITE_LEGACY(namcos2_68k_key_r,namcos2_68k_key_w)
AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am ) AM_IMPORT_FROM( namcos2_68k_default_cpu_board_am )
ADDRESS_MAP_END ADDRESS_MAP_END
@ -5004,17 +5004,17 @@ ROM_END
DRIVER_INIT_MEMBER(namcos2_state,assault) DRIVER_INIT_MEMBER(namcos2_state,assault)
{ {
namcos2_gametype=NAMCOS2_ASSAULT; m_gametype=NAMCOS2_ASSAULT;
} }
DRIVER_INIT_MEMBER(namcos2_state,assaultj) DRIVER_INIT_MEMBER(namcos2_state,assaultj)
{ {
namcos2_gametype=NAMCOS2_ASSAULT_JP; m_gametype=NAMCOS2_ASSAULT_JP;
} }
DRIVER_INIT_MEMBER(namcos2_state,assaultp) DRIVER_INIT_MEMBER(namcos2_state,assaultp)
{ {
namcos2_gametype=NAMCOS2_ASSAULT_PLUS; m_gametype=NAMCOS2_ASSAULT_PLUS;
} }
DRIVER_INIT_MEMBER(namcos2_state,assaultp_hack) DRIVER_INIT_MEMBER(namcos2_state,assaultp_hack)
@ -5033,67 +5033,67 @@ DRIVER_INIT_MEMBER(namcos2_state,assaultp_hack)
DRIVER_INIT_MEMBER(namcos2_state,burnforc) DRIVER_INIT_MEMBER(namcos2_state,burnforc)
{ {
namcos2_gametype=NAMCOS2_BURNING_FORCE; m_gametype=NAMCOS2_BURNING_FORCE;
} }
DRIVER_INIT_MEMBER(namcos2_state,cosmogng) DRIVER_INIT_MEMBER(namcos2_state,cosmogng)
{ {
namcos2_gametype=NAMCOS2_COSMO_GANG; m_gametype=NAMCOS2_COSMO_GANG;
} }
DRIVER_INIT_MEMBER(namcos2_state,dsaber) DRIVER_INIT_MEMBER(namcos2_state,dsaber)
{ {
namcos2_gametype=NAMCOS2_DRAGON_SABER; m_gametype=NAMCOS2_DRAGON_SABER;
} }
DRIVER_INIT_MEMBER(namcos2_state,dsaberj) DRIVER_INIT_MEMBER(namcos2_state,dsaberj)
{ {
namcos2_gametype=NAMCOS2_DRAGON_SABER; m_gametype=NAMCOS2_DRAGON_SABER;
} }
DRIVER_INIT_MEMBER(namcos2_state,dirtfoxj) DRIVER_INIT_MEMBER(namcos2_state,dirtfoxj)
{ {
namcos2_gametype=NAMCOS2_DIRT_FOX_JP; m_gametype=NAMCOS2_DIRT_FOX_JP;
} }
DRIVER_INIT_MEMBER(namcos2_state,finallap) DRIVER_INIT_MEMBER(namcos2_state,finallap)
{ {
namcos2_gametype=NAMCOS2_FINAL_LAP; m_gametype=NAMCOS2_FINAL_LAP;
} }
DRIVER_INIT_MEMBER(namcos2_state,finalap2) DRIVER_INIT_MEMBER(namcos2_state,finalap2)
{ {
namcos2_gametype=NAMCOS2_FINAL_LAP_2; m_gametype=NAMCOS2_FINAL_LAP_2;
} }
DRIVER_INIT_MEMBER(namcos2_state,finalap3) DRIVER_INIT_MEMBER(namcos2_state,finalap3)
{ {
namcos2_gametype=NAMCOS2_FINAL_LAP_3; m_gametype=NAMCOS2_FINAL_LAP_3;
} }
DRIVER_INIT_MEMBER(namcos2_state,finehour) DRIVER_INIT_MEMBER(namcos2_state,finehour)
{ {
namcos2_gametype=NAMCOS2_FINEST_HOUR; m_gametype=NAMCOS2_FINEST_HOUR;
} }
DRIVER_INIT_MEMBER(namcos2_state,fourtrax) DRIVER_INIT_MEMBER(namcos2_state,fourtrax)
{ {
namcos2_gametype=NAMCOS2_FOUR_TRAX; m_gametype=NAMCOS2_FOUR_TRAX;
} }
DRIVER_INIT_MEMBER(namcos2_state,kyukaidk) DRIVER_INIT_MEMBER(namcos2_state,kyukaidk)
{ {
namcos2_gametype=NAMCOS2_KYUUKAI_DOUCHUUKI; m_gametype=NAMCOS2_KYUUKAI_DOUCHUUKI;
} }
DRIVER_INIT_MEMBER(namcos2_state,marvlanj) DRIVER_INIT_MEMBER(namcos2_state,marvlanj)
{ {
namcos2_gametype=NAMCOS2_MARVEL_LAND; m_gametype=NAMCOS2_MARVEL_LAND;
} }
DRIVER_INIT_MEMBER(namcos2_state,marvland) DRIVER_INIT_MEMBER(namcos2_state,marvland)
{ {
namcos2_gametype=NAMCOS2_MARVEL_LAND; m_gametype=NAMCOS2_MARVEL_LAND;
} }
DRIVER_INIT_MEMBER(namcos2_state,metlhawk) DRIVER_INIT_MEMBER(namcos2_state,metlhawk)
@ -5151,82 +5151,82 @@ DRIVER_INIT_MEMBER(namcos2_state,metlhawk)
} /* next k */ } /* next k */
} /* next j */ } /* next j */
} /* next i */ } /* next i */
namcos2_gametype=NAMCOS2_METAL_HAWK; m_gametype=NAMCOS2_METAL_HAWK;
} /* metlhawk */ } /* metlhawk */
DRIVER_INIT_MEMBER(namcos2_state,mirninja) DRIVER_INIT_MEMBER(namcos2_state,mirninja)
{ {
namcos2_gametype=NAMCOS2_MIRAI_NINJA; m_gametype=NAMCOS2_MIRAI_NINJA;
} }
DRIVER_INIT_MEMBER(namcos2_state,ordyne) DRIVER_INIT_MEMBER(namcos2_state,ordyne)
{ {
namcos2_gametype=NAMCOS2_ORDYNE; m_gametype=NAMCOS2_ORDYNE;
} }
DRIVER_INIT_MEMBER(namcos2_state,phelios) DRIVER_INIT_MEMBER(namcos2_state,phelios)
{ {
namcos2_gametype=NAMCOS2_PHELIOS; m_gametype=NAMCOS2_PHELIOS;
} }
DRIVER_INIT_MEMBER(namcos2_state,rthun2) DRIVER_INIT_MEMBER(namcos2_state,rthun2)
{ {
namcos2_gametype=NAMCOS2_ROLLING_THUNDER_2; m_gametype=NAMCOS2_ROLLING_THUNDER_2;
} }
DRIVER_INIT_MEMBER(namcos2_state,rthun2j) DRIVER_INIT_MEMBER(namcos2_state,rthun2j)
{ {
namcos2_gametype=NAMCOS2_ROLLING_THUNDER_2; m_gametype=NAMCOS2_ROLLING_THUNDER_2;
} }
DRIVER_INIT_MEMBER(namcos2_state,sgunner2) DRIVER_INIT_MEMBER(namcos2_state,sgunner2)
{ {
namcos2_gametype=NAMCOS2_STEEL_GUNNER_2; m_gametype=NAMCOS2_STEEL_GUNNER_2;
} }
DRIVER_INIT_MEMBER(namcos2_state,sws) DRIVER_INIT_MEMBER(namcos2_state,sws)
{ {
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM; m_gametype=NAMCOS2_SUPER_WSTADIUM;
} }
DRIVER_INIT_MEMBER(namcos2_state,sws92) DRIVER_INIT_MEMBER(namcos2_state,sws92)
{ {
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_92; m_gametype=NAMCOS2_SUPER_WSTADIUM_92;
} }
DRIVER_INIT_MEMBER(namcos2_state,sws92g) DRIVER_INIT_MEMBER(namcos2_state,sws92g)
{ {
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_92T; m_gametype=NAMCOS2_SUPER_WSTADIUM_92T;
} }
DRIVER_INIT_MEMBER(namcos2_state,sws93) DRIVER_INIT_MEMBER(namcos2_state,sws93)
{ {
namcos2_gametype=NAMCOS2_SUPER_WSTADIUM_93; m_gametype=NAMCOS2_SUPER_WSTADIUM_93;
} }
DRIVER_INIT_MEMBER(namcos2_state,suzuka8h) DRIVER_INIT_MEMBER(namcos2_state,suzuka8h)
{ {
namcos2_gametype=NAMCOS2_SUZUKA_8_HOURS; m_gametype=NAMCOS2_SUZUKA_8_HOURS;
} }
DRIVER_INIT_MEMBER(namcos2_state,suzuk8h2) 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) DRIVER_INIT_MEMBER(namcos2_state,valkyrie)
{ {
namcos2_gametype=NAMCOS2_VALKYRIE; m_gametype=NAMCOS2_VALKYRIE;
} }
DRIVER_INIT_MEMBER(namcos2_state,gollygho) DRIVER_INIT_MEMBER(namcos2_state,gollygho)
{ {
namcos2_gametype=NAMCOS2_GOLLY_GHOST; m_gametype=NAMCOS2_GOLLY_GHOST;
} }
DRIVER_INIT_MEMBER(namcos2_state,bubbletr) 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; if( code&0x80 ) out |= 0x01;
pData[i] = out; 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 */ /* 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 "emu.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "cpu/m6805/m6805.h" #include "cpu/m6805/m6805.h"
#include "includes/namcos2.h"
#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h"
#include "cpu/tms32025/tms32025.h" #include "cpu/tms32025/tms32025.h"
#include "includes/namcoic.h" #include "includes/namcoic.h"
@ -341,7 +340,7 @@ WRITE16_MEMBER(namcos21_state::dspcuskey_w)
READ16_MEMBER(namcos21_state::dspcuskey_r) READ16_MEMBER(namcos21_state::dspcuskey_r)
{ {
UINT16 result = 0; UINT16 result = 0;
if( namcos2_gametype == NAMCOS21_SOLVALOU ) if( m_gametype == NAMCOS21_SOLVALOU )
{ {
switch( cpu_get_pc(&space.device()) ) switch( cpu_get_pc(&space.device()) )
{ {
@ -354,7 +353,7 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
break; break;
} }
} }
else if( namcos2_gametype == NAMCOS21_CYBERSLED ) else if( m_gametype == NAMCOS21_CYBERSLED )
{ {
switch( cpu_get_pc(&space.device()) ) switch( cpu_get_pc(&space.device()) )
{ {
@ -365,7 +364,7 @@ READ16_MEMBER(namcos21_state::dspcuskey_r)
break; break;
} }
} }
else if( namcos2_gametype == NAMCOS21_AIRCOMBAT ) else if( m_gametype == NAMCOS21_AIRCOMBAT )
{ {
switch( cpu_get_pc(&space.device()) ) 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>(); namcos21_state *state = machine.driver_data<namcos21_state>();
/* patch dsp watchdog */ /* patch dsp watchdog */
switch( namcos2_gametype ) switch( state->m_gametype )
{ {
case NAMCOS21_AIRCOMBAT: case NAMCOS21_AIRCOMBAT:
state->m_master_dsp_code[0x008e] = 0x808f; state->m_master_dsp_code[0x008e] = 0x808f;
@ -567,7 +566,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
{ {
COMBINE_DATA( &m_dspram16[offset] ); COMBINE_DATA( &m_dspram16[offset] );
if( namcos2_gametype != NAMCOS21_WINRUN91 ) if( m_gametype != NAMCOS21_WINRUN91 )
{ {
if( m_mpDspState->masterSourceAddr && if( m_mpDspState->masterSourceAddr &&
offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) ) offset == 1+(m_mpDspState->masterSourceAddr&0x7fff) )
@ -575,7 +574,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" ); if (ENABLE_LOGGING) logerror( "IDC-CONTINUE\n" );
TransferDspData(machine()); TransferDspData(machine());
} }
else if (namcos2_gametype == NAMCOS21_SOLVALOU && else if (m_gametype == NAMCOS21_SOLVALOU &&
offset == 0x103 && offset == 0x103 &&
&space.device() == machine().device("maincpu")) &space.device() == machine().device("maincpu"))
{ /* hack; synchronization for solvalou */ { /* 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(0x440000, 0x440001) AM_READWRITE(pointram_data_r,pointram_data_w) \
AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (?) Air Combat */ \ AM_RANGE(0x440002, 0x47ffff) AM_WRITENOP /* (?) Air Combat */ \
AM_RANGE(0x480000, 0x4807ff) AM_READWRITE(namcos21_depthcue_r,namcos21_depthcue_w) /* 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(0x700000, 0x71ffff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram") \
AM_RANGE(0x720000, 0x720007) AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w) \ 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(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(0x760000, 0x760001) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) \
AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \ AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \
@ -1415,8 +1414,8 @@ ADDRESS_MAP_END
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define DRIVEYES_68K_COMMON \ #define DRIVEYES_68K_COMMON \
AM_RANGE(0x700000, 0x71ffff) AM_READWRITE_LEGACY(namco_obj16_r,namco_obj16_w) \ AM_RANGE(0x700000, 0x71ffff) AM_READWRITE(c355_obj_ram_r,c355_obj_ram_w) AM_SHARE("objram") \
AM_RANGE(0x720000, 0x720007) AM_READWRITE_LEGACY(namco_spritepos16_r,namco_spritepos16_w) \ 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(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(0x760000, 0x760001) AM_READWRITE(namcos21_video_enable_r,namcos21_video_enable_w) \
AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \ AM_RANGE(0x800000, 0x8fffff) AM_READ(datarom_r) \
@ -2217,7 +2216,7 @@ ROM_END
static void namcos21_init( running_machine &machine, int game_type ) static void namcos21_init( running_machine &machine, int game_type )
{ {
namcos21_state *state = machine.driver_data<namcos21_state>(); 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_pointram = auto_alloc_array(machine, UINT8, PTRAM_SIZE);
state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base(); state->m_mpDataROM = (UINT16 *)state->memregion( "user1" )->base();
InitDSP(machine); InitDSP(machine);
@ -2237,7 +2236,7 @@ DRIVER_INIT_MEMBER(namcos21_state,winrun)
m_winrun_dspcomram = auto_alloc_array(machine(), UINT16, 0x1000*2); 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_mpDataROM = (UINT16 *)memregion( "user1" )->base();
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE); m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
m_pointram_idx = 0; m_pointram_idx = 0;
@ -2278,7 +2277,7 @@ DRIVER_INIT_MEMBER(namcos21_state,driveyes)
pMem[pc++] = 0xff80; /* b */ pMem[pc++] = 0xff80; /* b */
pMem[pc++] = 0; pMem[pc++] = 0;
m_winrun_dspcomram = auto_alloc_array(machine(), UINT16, 0x1000*2); 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_mpDataROM = (UINT16 *)memregion( "user1" )->base();
m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE); m_pointram = auto_alloc_array(machine(), UINT8, PTRAM_SIZE);
m_pointram_idx = 0; m_pointram_idx = 0;

View File

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

View File

@ -111,48 +111,6 @@ READ32_HANDLER( namco_tilemapcontrol32_le_r );
WRITE32_HANDLER( namco_tilemapcontrol32_le_w ); 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 */ /* C45 Land (Road) Emulation */

View File

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

View File

@ -17,7 +17,7 @@
/*********************************************/ /*********************************************/
/* IF GAME SPECIFIC HACKS ARE REQUIRED THEN */ /* 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 */ /* OUT WHAT GAME IS RUNNING */
/*********************************************/ /*********************************************/
@ -85,15 +85,103 @@ enum
NAMCOFL_FINAL_LAP_R 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: public:
namcos2_state(const machine_config &mconfig, device_type type, const char *tag) 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_dpram(*this, "dpram"),
m_spriteram(*this, "spriteram"),
m_paletteram(*this, "paletteram"), 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_READ16_MEMBER(dpram_word_r);
DECLARE_WRITE16_MEMBER(dpram_word_w); DECLARE_WRITE16_MEMBER(dpram_word_w);
@ -146,15 +234,15 @@ public:
UINT32 screen_update_metlhawk(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); 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_READ16_MEMBER( paletteram_word_r );
DECLARE_WRITE16_MEMBER( paletteram_word_w ); 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_WRITE16_MEMBER( rozram_word_w );
DECLARE_READ16_MEMBER( roz_ctrl_word_r ); DECLARE_READ16_MEMBER( gfx_ctrl_r );
DECLARE_WRITE16_MEMBER( roz_ctrl_word_w ); DECLARE_WRITE16_MEMBER( gfx_ctrl_w );
void draw_sprite_init();
void update_palette(); void update_palette();
void apply_clip( rectangle &clip, const rectangle &cliprect ); void apply_clip( rectangle &clip, const rectangle &cliprect );
void draw_roz(bitmap_ind16 &bitmap, 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 ); void draw_sprites_metalhawk(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri );
UINT16 get_palette_register( int which ); UINT16 get_palette_register( int which );
required_shared_ptr<UINT8> m_dpram; /* 2Kx8 */ int get_pos_irq_scanline() { return (get_palette_register(5) - 32) & 0xff; }
optional_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_paletteram;
optional_shared_ptr<UINT16> m_rozram;
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; tilemap_t *m_tilemap_roz;
UINT16 m_gfx_ctrl;
}; };
@ -176,21 +266,6 @@ public:
#define NAMCOS21_NUM_COLORS 0x8000 #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 */ /* Shared video palette function handlers */
/**************************************************************/ /**************************************************************/
@ -204,7 +279,6 @@ READ16_HANDLER( namcos2_gfx_ctrl_r );
/*----------- defined in machine/namcos2.c -----------*/ /*----------- defined in machine/namcos2.c -----------*/
extern void (*namcos2_kickstart)(running_machine &machine, int internal); extern void (*namcos2_kickstart)(running_machine &machine, int internal);
extern int namcos2_gametype;
MACHINE_START( namcos2 ); MACHINE_START( namcos2 );
MACHINE_RESET( namcos2 ); MACHINE_RESET( namcos2 );

View File

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

View File

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

View File

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

View File

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

View File

@ -10,7 +10,8 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
{ {
*mask = code; *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_2:
case NAMCOS2_FINAL_LAP_3: case NAMCOS2_FINAL_LAP_3:
@ -25,9 +26,9 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
} /* TilemapCB */ } /* 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 * m_gfx_ctrl also supplies palette and priority information that is applied to the output of the
* Namco System 2 ROZ chip * Namco System 2 ROZ chip
* *
* -xxx ---- ---- ---- roz priority * -xxx ---- ---- ---- roz priority
@ -35,23 +36,21 @@ TilemapCB( running_machine &machine, UINT16 code, int *tile, int *mask )
* ---- ---- xxxx ---- always zero? * ---- ---- xxxx ---- always zero?
* ---- ---- ---- xxxx sprite bank * ---- ---- ---- xxxx sprite bank
*/ */
static UINT16 namcos2_gfx_ctrl; READ16_MEMBER( namcos2_state::gfx_ctrl_r )
READ16_HANDLER( namcos2_gfx_ctrl_r )
{ {
return namcos2_gfx_ctrl; return m_gfx_ctrl;
} /* namcos2_gfx_ctrl_r */ } /* 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 */ } /* 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]; int tile = m_rozram[tile_index];
SET_TILE_INFO(3,tile,0/*color*/,0); SET_TILE_INFO_MEMBER(3,tile,0/*color*/,0);
} /* get_tile_info_roz */ } /* roz_tile_info */
struct RozParam struct RozParam
{ {
@ -240,7 +239,7 @@ void namcos2_state::draw_roz(bitmap_ind16 &bitmap, const rectangle &cliprect)
const int xoffset = 38,yoffset = 0; const int xoffset = 38,yoffset = 0;
struct RozParam rozParam; struct RozParam rozParam;
rozParam.color = (namcos2_gfx_ctrl & 0x0f00); rozParam.color = (m_gfx_ctrl & 0x0f00);
rozParam.incxx = (INT16)m_roz_ctrl[0]; rozParam.incxx = (INT16)m_roz_ctrl[0];
rozParam.incxy = (INT16)m_roz_ctrl[1]; rozParam.incxy = (INT16)m_roz_ctrl[1];
rozParam.incyx = (INT16)m_roz_ctrl[2]; 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 ); 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 ) WRITE16_MEMBER( namcos2_state::rozram_word_w )
{ {
COMBINE_DATA(&m_rozram[offset]); 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]; const UINT16 *source = &m_paletteram[0x3000/2];
return ((source[which*2]&0xff)<<8) | (source[which*2+1]&0xff); 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: /*case 0x180a:*/ case 0x180b:
if (data^m_paletteram[offset]) { if (data^m_paletteram[offset]) {
m_paletteram[offset] = data; m_paletteram[offset] = data;
namcos2_adjust_posirq_timer(machine(),namcos2_GetPosIrqScanline(machine())); namcos2_adjust_posirq_timer(machine(),get_pos_irq_scanline());
} }
break; break;
@ -379,12 +363,6 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
} /* namcos2_68k_video_palette_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 inline void
namcos2_state::update_palette() namcos2_state::update_palette()
{ {
@ -407,35 +385,23 @@ namcos2_state::update_palette()
/**************************************************************************/ /**************************************************************************/
static void void namcos2_state::draw_sprite_init()
DrawSpriteInit( running_machine &machine )
{ {
int i;
/* set table for sprite color == 0x0f */ /* 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() void namcos2_state::video_start()
{ {
namco_tilemap_init(machine(), 2, memregion("gfx4")->base(), TilemapCB); 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); m_tilemap_roz->set_transparent_pen(0xff);
DrawSpriteInit(machine()); draw_sprite_init();
} }
void namcos2_state::apply_clip( rectangle &clip, const rectangle &cliprect ) 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 ); apply_clip( clip, cliprect );
/* HACK: enable ROZ layer only if it has priority > 0 */ /* 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++ ) 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 ); 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_roz(bitmap,clip);
} }
draw_sprites(bitmap, clip, pri/2, namcos2_gfx_ctrl ); draw_sprites(bitmap, clip, pri/2, m_gfx_ctrl );
} }
} }
return 0; return 0;
@ -481,7 +447,7 @@ UINT32 namcos2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap,
void namcos2_state::video_start_finallap() void namcos2_state::video_start_finallap()
{ {
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB); namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB);
DrawSpriteInit(machine()); draw_sprite_init();
namco_road_init(machine(), 3); 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_tilemap_draw( bitmap, clip, pri/2 );
} }
namco_road_draw(machine(), bitmap,clip,pri ); 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; return 0;
} }
@ -511,12 +477,12 @@ UINT32 namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_luckywld() void namcos2_state::video_start_luckywld()
{ {
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB); 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() );
if( namcos2_gametype==NAMCOS2_LUCKY_AND_WILD ) 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); 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_tilemap_draw( bitmap, clip, pri/2 );
} }
namco_road_draw(machine(), bitmap,clip,pri ); 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; return 0;
} }
@ -552,7 +518,7 @@ UINT32 namcos2_state::screen_update_luckywld(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_sgunner() void namcos2_state::video_start_sgunner()
{ {
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB); 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) 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++ ) for( pri=0; pri<8; pri++ )
{ {
namco_tilemap_draw( bitmap, clip, pri ); namco_tilemap_draw( bitmap, clip, pri );
namco_obj_draw(machine(), bitmap, clip, pri ); c355_obj_draw(bitmap, clip, pri );
} }
return 0; return 0;
} }
@ -578,7 +544,7 @@ UINT32 namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind16
void namcos2_state::video_start_metlhawk() void namcos2_state::video_start_metlhawk()
{ {
namco_tilemap_init(machine(),2,memregion("gfx4")->base(),TilemapCB); 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) 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_tilemap_draw( bitmap, clip, pri/2 );
} }
namco_roz_draw( bitmap, clip, pri ); c169_roz_draw(bitmap, clip, pri);
draw_sprites_metalhawk(bitmap,clip,pri ); draw_sprites_metalhawk(bitmap,clip,pri );
} }
return 0; return 0;

View File

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