mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
namcoic.cpp : Simpler bit-swapped values (#3609)
* namcoic.cpp : Simpler bit-swapped values * namcoic.cpp : Fix Lucky & Wild * namcoic.cpp : Fix bitswap * namcoic.cpp : Convert ROZ tilemap code mangles into callback, Split config for each game when tilemap mangle is different, Reduce duplicates, Move metalhawk swap xy function into gfxdecode, Fix metalhawk zoom namcos2.cpp : Add notes, demote with MACHINE_IMPERFECT_GRAPHICS because tilemap and ROZ issue, Reduce duplicate fix gfxdecode name for namconb2, namcofl * namcoic.cpp : Add notes, Fix finalapr* Title screen, Fix mask, Add c169 wraparound disable bit, Fix mask namconb1.cpp : Fix builds
This commit is contained in:
parent
da1d649df8
commit
e6f78ae943
@ -508,10 +508,10 @@ static const gfx_layout roz_layout =
|
||||
16*128
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_2 )
|
||||
GFXDECODE_ENTRY( NAMCOFL_TILEGFXREGION, 0, tile_layout, 0x1000, 0x08 )
|
||||
GFXDECODE_ENTRY( NAMCOFL_SPRITEGFXREGION, 0, obj_layout, 0x0000, 0x10 )
|
||||
GFXDECODE_ENTRY( NAMCOFL_ROTGFXREGION, 0, roz_layout, 0x1800, 0x08 )
|
||||
static GFXDECODE_START( gfx_namcofl )
|
||||
GFXDECODE_ENTRY( NAMCOFL_TILEGFXREGION, 0, tile_layout, 0x1000, 0x08 )
|
||||
GFXDECODE_ENTRY( NAMCOFL_SPRITEGFXREGION, 0, obj_layout, 0x0000, 0x10 )
|
||||
GFXDECODE_ENTRY( NAMCOFL_ROTGFXREGION, 0, roz_layout, 0x1800, 0x08 )
|
||||
GFXDECODE_END
|
||||
|
||||
|
||||
@ -605,7 +605,7 @@ MACHINE_CONFIG_START(namcofl_state::namcofl)
|
||||
|
||||
MCFG_PALETTE_ADD("palette", 8192)
|
||||
|
||||
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_2)
|
||||
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namcofl)
|
||||
|
||||
MCFG_DEVICE_ADD("c116", NAMCO_C116, 0)
|
||||
MCFG_GFX_PALETTE("palette")
|
||||
|
@ -1049,10 +1049,10 @@ static GFXDECODE_START( gfx_namconb1 )
|
||||
GFXDECODE_ENTRY( NAMCONB1_SPRITEGFXREGION, 0, obj_layout, 0x0000, 0x10 )
|
||||
GFXDECODE_END /* gfxdecodeinfo */
|
||||
|
||||
static GFXDECODE_START( gfx_2 )
|
||||
static GFXDECODE_START( gfx_namconb2 )
|
||||
GFXDECODE_ENTRY( NAMCONB1_TILEGFXREGION, 0, tile_layout, 0x1000, 0x08 )
|
||||
GFXDECODE_ENTRY( NAMCONB1_SPRITEGFXREGION, 0, obj_layout, 0x0000, 0x10 )
|
||||
GFXDECODE_ENTRY( NAMCONB1_ROTGFXREGION, 0, roz_layout, 0x1800, 0x08 )
|
||||
GFXDECODE_ENTRY( NAMCONB1_ROTGFXREGION, 0, roz_layout, 0x1800, 0x08 )
|
||||
GFXDECODE_END /* gfxdecodeinfo2 */
|
||||
|
||||
|
||||
@ -1134,15 +1134,13 @@ MACHINE_CONFIG_START(namconb1_state::namconb2)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(namconb1_state, screen_update_namconb2)
|
||||
MCFG_SCREEN_PALETTE("palette")
|
||||
|
||||
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_2)
|
||||
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_namconb2)
|
||||
MCFG_PALETTE_ADD("palette", 0x2000)
|
||||
MCFG_PALETTE_ENABLE_SHADOWS()
|
||||
|
||||
MCFG_DEVICE_ADD("c116", NAMCO_C116, 0)
|
||||
MCFG_GFX_PALETTE("palette")
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(namconb1_state,namconb2)
|
||||
|
||||
SPEAKER(config, "lspeaker").front_left();
|
||||
SPEAKER(config, "rspeaker").front_right();
|
||||
MCFG_DEVICE_ADD("c352", C352, MASTER_CLOCK/2, 288)
|
||||
@ -1152,6 +1150,18 @@ MACHINE_CONFIG_START(namconb1_state::namconb2)
|
||||
//MCFG_SOUND_ROUTE(3, "rspeaker", 1.00)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(namconb1_state::machbrkr)
|
||||
namconb2(config);
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(namconb1_state,machbrkr)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(namconb1_state::outfxies)
|
||||
namconb2(config);
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(namconb1_state,outfxies)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
/***************************************************************/
|
||||
|
||||
@ -2004,7 +2014,7 @@ GAME( 1996, sws96, 0, namconb1, namconb1, namconb1_state, init_sws96,
|
||||
GAME( 1997, sws97, 0, namconb1, namconb1, namconb1_state, init_sws97, ROT0, "Namco", "Super World Stadium '97 (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, vshoot, 0, namconb1, namconb1, namconb1_state, init_vshoot, ROT0, "Namco", "J-League Soccer V-Shoot (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
GAME( 1994, outfxies, 0, namconb2, namconb1, namconb1_state, init_outfxies, ROT0, "Namco", "The Outfoxies (World, OU2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, outfxiesj,outfxies, namconb2, namconb1, namconb1_state, init_outfxies, ROT0, "Namco", "The Outfoxies (Japan, OU1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1995, machbrkr, 0, namconb2, namconb1, namconb1_state, init_machbrkr, ROT0, "Namco", "Mach Breakers (World, MB2)", MACHINE_SUPPORTS_SAVE ) /* Title screen doesn't show subtitle "Numan Athletics 2" */
|
||||
GAME( 1995, machbrkrj,machbrkr, namconb2, namconb1, namconb1_state, init_machbrkr, ROT0, "Namco", "Mach Breakers - Numan Athletics 2 (Japan, MB1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, outfxies, 0, outfxies, namconb1, namconb1_state, init_outfxies, ROT0, "Namco", "The Outfoxies (World, OU2)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1994, outfxiesj,outfxies, outfxies, namconb1, namconb1_state, init_outfxies, ROT0, "Namco", "The Outfoxies (Japan, OU1)", MACHINE_SUPPORTS_SAVE )
|
||||
GAME( 1995, machbrkr, 0, machbrkr, namconb1, namconb1_state, init_machbrkr, ROT0, "Namco", "Mach Breakers (World, MB2)", MACHINE_SUPPORTS_SAVE ) /* Title screen doesn't show subtitle "Numan Athletics 2" */
|
||||
GAME( 1995, machbrkrj,machbrkr, machbrkr, namconb1, namconb1_state, init_machbrkr, ROT0, "Namco", "Mach Breakers - Numan Athletics 2 (Japan, MB1)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -44,6 +44,10 @@ known issues:
|
||||
Bubble Trouble (Golly Ghost II)
|
||||
- no artwork
|
||||
|
||||
Metal Hawk
|
||||
- tilemap issues (ex : Result and stage select screen)
|
||||
- ROZ wraparound isn't implemented
|
||||
|
||||
The Namco System II board is a 5 ( only 4 are emulated ) CPU system. The
|
||||
complete system consists of two boards: CPU + GRAPHICS. It contains a large
|
||||
number of custom ASICs to perform graphics operations, there is no
|
||||
@ -1577,19 +1581,9 @@ static const gfx_layout chr_layout = {
|
||||
8,8,
|
||||
RGN_FRAC(1,1),
|
||||
8,
|
||||
{ 0,1,2,3,4,5,6,7 },
|
||||
{ 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 },
|
||||
{ 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64 },
|
||||
8*64
|
||||
};
|
||||
|
||||
static const gfx_layout roz_layout = {
|
||||
8,8,
|
||||
0x10000,
|
||||
8,
|
||||
{ 0,1,2,3,4,5,6,7 },
|
||||
{ 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8 },
|
||||
{ 0*64,1*64,2*64,3*64,4*64,5*64,6*64,7*64 },
|
||||
{ STEP8(0,1) },
|
||||
{ STEP8(0,8) },
|
||||
{ STEP8(0,8*8) },
|
||||
8*64
|
||||
};
|
||||
|
||||
@ -1621,33 +1615,44 @@ static const gfx_layout luckywld_roz_layout =
|
||||
16,16,
|
||||
RGN_FRAC(1,1),
|
||||
8,
|
||||
{ 0,1,2,3,4,5,6,7 },
|
||||
{ 0*8,1*8,2*8,3*8,4*8,5*8,6*8,7*8,8*8,9*8,10*8,11*8,12*8,13*8,14*8,15*8 },
|
||||
{ 0*128,1*128,2*128,3*128,4*128,5*128,6*128,7*128,8*128,9*128,10*128,11*128,12*128,13*128,14*128,15*128 },
|
||||
{ STEP8(0,1) },
|
||||
{ STEP16(0,8) },
|
||||
{ STEP16(0,8*16) },
|
||||
16*128
|
||||
};
|
||||
|
||||
static const gfx_layout metlhawk_sprite_layout = {
|
||||
32,32,
|
||||
0x1000, /* number of sprites */
|
||||
RGN_FRAC(1,1), /* number of sprites */
|
||||
8, /* bits per pixel */
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7 },
|
||||
{ 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232, 240, 248 },
|
||||
{ 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304, 2560, 2816, 3072, 3328, 3584, 3840, 4096, 4352, 4608, 4864, 5120, 5376, 5632, 5888, 6144, 6400, 6656, 6912, 7168, 7424, 7680, 7936 },
|
||||
{ STEP8(0,1) },
|
||||
{ STEP32(0,8) },
|
||||
{ STEP32(0,8*32) },
|
||||
32*32*8
|
||||
};
|
||||
|
||||
static const gfx_layout metlhawk_sprite_layout_swapped = {
|
||||
32,32,
|
||||
RGN_FRAC(1,1), /* number of sprites */
|
||||
8, /* bits per pixel */
|
||||
{ STEP8(0,1) },
|
||||
{ STEP32(0,8*32) },
|
||||
{ STEP32(0,8) },
|
||||
32*32*8
|
||||
};
|
||||
|
||||
static GFXDECODE_START( gfx_metlhawk )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x000000, metlhawk_sprite_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx3", 0x000000, luckywld_roz_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0x000000, chr_layout, 16*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x000000, metlhawk_sprite_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx3", 0x000000, luckywld_roz_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0x000000, chr_layout, 16*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x000000, metlhawk_sprite_layout_swapped, 0*256, 16 )
|
||||
GFXDECODE_END
|
||||
|
||||
static GFXDECODE_START( gfx_namcos2 )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x000000, obj_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx1", 0x200000, obj_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx2", 0x000000, chr_layout, 16*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx3", 0x000000, roz_layout, 0*256, 16 )
|
||||
GFXDECODE_ENTRY( "gfx3", 0x000000, chr_layout, 0*256, 16 )
|
||||
GFXDECODE_END
|
||||
|
||||
static GFXDECODE_START( gfx_finallap )
|
||||
@ -1920,6 +1925,13 @@ MACHINE_CONFIG_START(namcos2_state::finallap)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
// finalap2 has different mangle
|
||||
MACHINE_CONFIG_START(namcos2_state::finalap2)
|
||||
finallap(config);
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(namcos2_state, finalap2)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(namcos2_state::sgunner)
|
||||
MCFG_DEVICE_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
|
||||
MCFG_DEVICE_PROGRAM_MAP(master_sgunner_am)
|
||||
@ -3905,7 +3917,7 @@ ROM_START( metlhawk )
|
||||
ROM_LOAD( "sys2mcpu.bin", 0x000000, 0x002000, CRC(a342a97e) SHA1(2c420d34dba21e409bf78ddca710fc7de65a6642) )
|
||||
ROM_LOAD( "sys2c65c.bin", 0x008000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) )
|
||||
|
||||
ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */
|
||||
ROM_REGION( 0x200000, "gfx1", 0 ) /* Sprites */
|
||||
ROM_LOAD32_BYTE( "mhobj-4.5c", 0x000000, 0x40000, CRC(e3590e1a) SHA1(9afffa54a63e676f5d78a01c76ca50cd795dd6e9) )
|
||||
ROM_LOAD32_BYTE( "mhobj-5.5a", 0x000001, 0x40000, CRC(b85c0d07) SHA1(e1ae542c0e884ef454ba57ecdfd007b85f2dc59d) )
|
||||
ROM_LOAD32_BYTE( "mhobj-6.6c", 0x000002, 0x40000, CRC(90c4523d) SHA1(c6f84da3187ebb747445b1b7499acf5adc0f39d8) )
|
||||
@ -3976,7 +3988,7 @@ ROM_START( metlhawkj )
|
||||
ROM_LOAD( "sys2mcpu.bin", 0x000000, 0x002000, CRC(a342a97e) SHA1(2c420d34dba21e409bf78ddca710fc7de65a6642) )
|
||||
ROM_LOAD( "sys2c65c.bin", 0x008000, 0x008000, CRC(a5b2a4ff) SHA1(068bdfcc71a5e83706e8b23330691973c1c214dc) )
|
||||
|
||||
ROM_REGION( 0x400000, "gfx1", 0 ) /* Sprites */
|
||||
ROM_REGION( 0x200000, "gfx1", 0 ) /* Sprites */
|
||||
ROM_LOAD32_BYTE( "mhobj-4.5c", 0x000000, 0x40000, CRC(e3590e1a) SHA1(9afffa54a63e676f5d78a01c76ca50cd795dd6e9) )
|
||||
ROM_LOAD32_BYTE( "mhobj-5.5a", 0x000001, 0x40000, CRC(b85c0d07) SHA1(e1ae542c0e884ef454ba57ecdfd007b85f2dc59d) )
|
||||
ROM_LOAD32_BYTE( "mhobj-6.6c", 0x000002, 0x40000, CRC(90c4523d) SHA1(c6f84da3187ebb747445b1b7499acf5adc0f39d8) )
|
||||
@ -5735,7 +5747,8 @@ void namcos2_state::init_metlhawk()
|
||||
{
|
||||
/* unscramble sprites */
|
||||
uint8_t *data = memregion("gfx1")->base();
|
||||
for (int i=0; i<0x200000; i+=32*32)
|
||||
int size = memregion("gfx1")->bytes();
|
||||
for (int i=0; i<size; i+=32*32)
|
||||
{
|
||||
for (int j=0; j<32*32; j+=32*4)
|
||||
{
|
||||
@ -5776,18 +5789,6 @@ void namcos2_state::init_metlhawk()
|
||||
} /* next j */
|
||||
} /* next i */
|
||||
|
||||
/* 90 degrees prepare a turned character */
|
||||
for (int i=0; i<0x200000; i+=32*32)
|
||||
{
|
||||
for (int j=0; j<32; j++)
|
||||
{
|
||||
for (int k=0; k<32; k++)
|
||||
{
|
||||
data[0x200000+i+j*32+k] = data[i+j+k*32];
|
||||
} /* next k */
|
||||
} /* next j */
|
||||
} /* next i */
|
||||
|
||||
m_gametype = NAMCOS2_METAL_HAWK;
|
||||
}
|
||||
|
||||
@ -5875,16 +5876,7 @@ void namcos2_state::init_luckywld()
|
||||
for( i=0; i<32*0x4000; i++ )
|
||||
{ /* unscramble gfx mask */
|
||||
int code = pData[i];
|
||||
int out = 0;
|
||||
if( code&0x01 ) out |= 0x80;
|
||||
if( code&0x02 ) out |= 0x40;
|
||||
if( code&0x04 ) out |= 0x20;
|
||||
if( code&0x08 ) out |= 0x10;
|
||||
if( code&0x10 ) out |= 0x08;
|
||||
if( code&0x20 ) out |= 0x04;
|
||||
if( code&0x40 ) out |= 0x02;
|
||||
if( code&0x80 ) out |= 0x01;
|
||||
pData[i] = out;
|
||||
pData[i] = bitswap<8>(code, 0, 1, 2, 3, 4, 5, 6, 7);
|
||||
}
|
||||
m_gametype = NAMCOS2_LUCKY_AND_WILD;
|
||||
}
|
||||
@ -5904,8 +5896,8 @@ GAME( 1988, assault, 0, base2, assault, namcos2_state, init_assau
|
||||
GAME( 1988, assaultj, assault, base2, assault, namcos2_state, init_assaultj, ROT90, "Namco", "Assault (Japan)", 0 )
|
||||
GAME( 1988, assaultp, assault, assaultp, assault, namcos2_state, init_assaultp_hack, ROT90, "Namco", "Assault Plus (Japan)", 0)
|
||||
|
||||
GAME( 1988, metlhawk, 0, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Rev C)", 0)
|
||||
GAME( 1988, metlhawkj, metlhawk, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Japan, Rev F)", 0)
|
||||
GAME( 1988, metlhawk, 0, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Rev C)", 0 )
|
||||
GAME( 1988, metlhawkj, metlhawk, metlhawk, metlhawk, namcos2_state, init_metlhawk, ROT90, "Namco", "Metal Hawk (Japan, Rev F)", 0 )
|
||||
|
||||
GAME( 1988, ordyne, 0, base, base, namcos2_state, init_ordyne, ROT180, "Namco", "Ordyne (World)", 0 )
|
||||
GAME( 1988, ordyneje, ordyne, base, base, namcos2_state, init_ordyne, ROT180, "Namco", "Ordyne (Japan, English Version)", 0 )
|
||||
|
@ -23,8 +23,8 @@
|
||||
class namcofl_state : public namcos2_shared_state
|
||||
{
|
||||
public:
|
||||
namcofl_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: namcos2_shared_state(mconfig, type, tag),
|
||||
namcofl_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
namcos2_shared_state(mconfig, type, tag),
|
||||
m_c116(*this,"c116"),
|
||||
m_in0(*this, "IN0"),
|
||||
m_in1(*this, "IN1"),
|
||||
@ -88,6 +88,7 @@ private:
|
||||
void common_init();
|
||||
int FLobjcode2tile(int code);
|
||||
void TilemapCB(uint16_t code, int *tile, int *mask);
|
||||
void RozCB(uint16_t code, int *tile, int *mask, int which);
|
||||
void namcoc75_am(address_map &map);
|
||||
void namcoc75_io(address_map &map);
|
||||
void namcofl_mem(address_map &map);
|
||||
|
@ -29,8 +29,8 @@
|
||||
class namconb1_state : public namcos2_shared_state
|
||||
{
|
||||
public:
|
||||
namconb1_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: namcos2_shared_state(mconfig, type, tag),
|
||||
namconb1_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
namcos2_shared_state(mconfig, type, tag),
|
||||
m_c116(*this, "c116"),
|
||||
m_eeprom(*this, "eeprom"),
|
||||
m_p1(*this, "P1"),
|
||||
@ -48,6 +48,8 @@ public:
|
||||
|
||||
void namconb1(machine_config &config);
|
||||
void namconb2(machine_config &config);
|
||||
void outfxies(machine_config &config);
|
||||
void machbrkr(machine_config &config);
|
||||
|
||||
void init_sws95();
|
||||
void init_machbrkr();
|
||||
@ -109,7 +111,8 @@ private:
|
||||
virtual void machine_start() override;
|
||||
DECLARE_MACHINE_RESET(namconb);
|
||||
DECLARE_VIDEO_START(namconb1);
|
||||
DECLARE_VIDEO_START(namconb2);
|
||||
DECLARE_VIDEO_START(machbrkr);
|
||||
DECLARE_VIDEO_START(outfxies);
|
||||
void video_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bROZ);
|
||||
uint32_t screen_update_namconb1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
uint32_t screen_update_namconb2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
@ -120,9 +123,13 @@ private:
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(mcu_adc_cb);
|
||||
|
||||
int NB1objcode2tile(int code);
|
||||
int NB2objcode2tile(int code);
|
||||
int NB2objcode2tile_machbrkr(int code);
|
||||
int NB2objcode2tile_outfxies(int code);
|
||||
void NB1TilemapCB(uint16_t code, int *tile, int *mask);
|
||||
void NB2TilemapCB(uint16_t code, int *tile, int *mask);
|
||||
void NB2TilemapCB_machbrkr(uint16_t code, int *tile, int *mask);
|
||||
void NB2TilemapCB_outfxies(uint16_t code, int *tile, int *mask);
|
||||
void NB2RozCB_machbrkr(uint16_t code, int *tile, int *mask, int which);
|
||||
void NB2RozCB_outfxies(uint16_t code, int *tile, int *mask, int which);
|
||||
void namcoc75_am(address_map &map);
|
||||
void namcoc75_io(address_map &map);
|
||||
void namconb1_am(address_map &map);
|
||||
|
@ -160,12 +160,7 @@ protected:
|
||||
DECLARE_READ16_MEMBER( c123_tilemap_videoram_r );
|
||||
DECLARE_WRITE16_MEMBER( c123_tilemap_control_w );
|
||||
DECLARE_READ16_MEMBER( c123_tilemap_control_r );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info0 );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info1 );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info2 );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info3 );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info4 );
|
||||
TILE_GET_INFO_MEMBER( get_tile_info5 );
|
||||
template<int Offset> TILE_GET_INFO_MEMBER( get_tile_info );
|
||||
typedef delegate<void (uint16_t, int*, int*)> c123_tilemap_delegate;
|
||||
void c123_tilemap_init(int gfxbank, void *pMaskROM, c123_tilemap_delegate tilemap_cb);
|
||||
void c123_tilemap_invalidate(void);
|
||||
@ -198,7 +193,8 @@ protected:
|
||||
c123_mTilemapInfo m_c123_TilemapInfo;
|
||||
|
||||
// C169 ROZ Layer Emulation
|
||||
void c169_roz_init(int gfxbank, const char *maskregion);
|
||||
typedef delegate<void (uint16_t, int*, int*, int)> c169_tilemap_delegate;
|
||||
void c169_roz_init(int gfxbank, const char *maskregion, c169_tilemap_delegate tilemap_cb);
|
||||
void c169_roz_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
|
||||
DECLARE_READ16_MEMBER( c169_roz_control_r );
|
||||
DECLARE_WRITE16_MEMBER( c169_roz_control_w );
|
||||
@ -207,19 +203,20 @@ protected:
|
||||
DECLARE_READ16_MEMBER( c169_roz_videoram_r );
|
||||
DECLARE_WRITE16_MEMBER( c169_roz_videoram_w );
|
||||
|
||||
c169_tilemap_delegate m_c169_cb;
|
||||
struct roz_parameters
|
||||
{
|
||||
uint32_t left, top, size;
|
||||
uint32_t startx, starty;
|
||||
int incxx, incxy, incyx, incyy;
|
||||
int color, priority;
|
||||
int wrap;
|
||||
};
|
||||
void c169_roz_unpack_params(const uint16_t *source, roz_parameters ¶ms);
|
||||
void c169_roz_draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms);
|
||||
void c169_roz_draw_scanline(screen_device &screen, 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 );
|
||||
template<int Which> TILE_GET_INFO_MEMBER( c169_roz_get_info );
|
||||
TILEMAP_MAPPER_MEMBER( c169_roz_mapper );
|
||||
|
||||
static const int ROZ_TILEMAP_COUNT = 2;
|
||||
@ -286,14 +283,14 @@ protected:
|
||||
class namcos2_state : public namcos2_shared_state
|
||||
{
|
||||
public:
|
||||
namcos2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: namcos2_shared_state(mconfig, type, tag),
|
||||
m_dpram(*this, "dpram"),
|
||||
m_paletteram(*this, "paletteram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_rozram(*this, "rozram"),
|
||||
m_roz_ctrl(*this, "rozctrl"),
|
||||
m_c45_road(*this, "c45_road")
|
||||
namcos2_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
namcos2_shared_state(mconfig, type, tag),
|
||||
m_dpram(*this, "dpram"),
|
||||
m_paletteram(*this, "paletteram"),
|
||||
m_spriteram(*this, "spriteram"),
|
||||
m_rozram(*this, "rozram"),
|
||||
m_roz_ctrl(*this, "rozctrl"),
|
||||
m_c45_road(*this, "c45_road")
|
||||
{ }
|
||||
|
||||
void configure_c148_standard(machine_config &config);
|
||||
@ -303,6 +300,7 @@ public:
|
||||
void sgunner2(machine_config &config);
|
||||
void base2(machine_config &config);
|
||||
void finallap(machine_config &config);
|
||||
void finalap2(machine_config &config);
|
||||
void luckywld(machine_config &config);
|
||||
void base3(machine_config &config);
|
||||
void sgunner(machine_config &config);
|
||||
@ -354,6 +352,7 @@ private:
|
||||
|
||||
virtual void video_start() override;
|
||||
void video_start_finallap();
|
||||
void video_start_finalap2();
|
||||
void video_start_luckywld();
|
||||
void video_start_metlhawk();
|
||||
void video_start_sgunner();
|
||||
@ -405,6 +404,9 @@ private:
|
||||
void GollyGhostUpdateLED_ca( int data );
|
||||
void GollyGhostUpdateDiorama_c0( int data );
|
||||
void TilemapCB(uint16_t code, int *tile, int *mask);
|
||||
void TilemapCB_finalap2(uint16_t code, int *tile, int *mask);
|
||||
void RozCB_luckywld(uint16_t code, int *tile, int *mask, int which);
|
||||
void RozCB_metlhawk(uint16_t code, int *tile, int *mask, int which);
|
||||
|
||||
void c68_default_am(address_map &map);
|
||||
void common_default_am(address_map &map);
|
||||
|
@ -16,21 +16,16 @@ void namcos2_shared_state::c123_tilemap_invalidate(void)
|
||||
}
|
||||
} /* namco_tilemap_invalidate */
|
||||
|
||||
inline void namcos2_shared_state::namcoic_get_tile_info(tile_data &tileinfo,int tile_index,uint16_t *vram)
|
||||
template<int Offset>
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info )
|
||||
{
|
||||
const uint16_t *vram = &m_c123_TilemapInfo.videoram[Offset];
|
||||
int tile, mask;
|
||||
m_c123_TilemapInfo.cb( vram[tile_index], &tile, &mask );
|
||||
tileinfo.mask_data = m_c123_TilemapInfo.maskBaseAddr+mask*8;
|
||||
SET_TILE_INFO_MEMBER(m_c123_TilemapInfo.gfxbank,tile,0,0);
|
||||
} /* get_tile_info */
|
||||
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info0 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x0000]); }
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info1 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x1000]); }
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info2 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x2000]); }
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info3 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x3000]); }
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info4 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x4008]); }
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::get_tile_info5 ) { namcoic_get_tile_info(tileinfo,tile_index,&m_c123_TilemapInfo.videoram[0x4408]); }
|
||||
|
||||
void namcos2_shared_state::c123_tilemap_init( int gfxbank, void *maskBaseAddr, c123_tilemap_delegate tilemap_cb )
|
||||
{
|
||||
m_c123_TilemapInfo.gfxbank = gfxbank;
|
||||
@ -39,14 +34,14 @@ void namcos2_shared_state::c123_tilemap_init( int gfxbank, void *maskBaseAddr, c
|
||||
m_c123_TilemapInfo.videoram = std::make_unique<uint16_t[]>( 0x10000 );
|
||||
|
||||
/* four scrolling tilemaps */
|
||||
m_c123_TilemapInfo.tmap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info0),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info1),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info2),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info3),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x0000>),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x1000>),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x2000>),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
m_c123_TilemapInfo.tmap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x3000>),this),TILEMAP_SCAN_ROWS,8,8,64,64);
|
||||
|
||||
/* two non-scrolling tilemaps */
|
||||
m_c123_TilemapInfo.tmap[4] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info4),this),TILEMAP_SCAN_ROWS,8,8,36,28);
|
||||
m_c123_TilemapInfo.tmap[5] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info5),this),TILEMAP_SCAN_ROWS,8,8,36,28);
|
||||
m_c123_TilemapInfo.tmap[4] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x4008>),this),TILEMAP_SCAN_ROWS,8,8,36,28);
|
||||
m_c123_TilemapInfo.tmap[5] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(namcos2_shared_state::get_tile_info<0x4408>),this),TILEMAP_SCAN_ROWS,8,8,36,28);
|
||||
|
||||
/* define offsets for scrolling */
|
||||
for( int i = 0; i < 4; i++ )
|
||||
@ -436,7 +431,6 @@ void namcos2_state::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &
|
||||
* x--------------- unknown
|
||||
*/
|
||||
const uint16_t *pSource = m_spriteram;
|
||||
rectangle rect;
|
||||
int loop;
|
||||
if( pri==0 )
|
||||
{
|
||||
@ -470,13 +464,13 @@ void namcos2_state::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &
|
||||
int sy = (0x1ff-(ypos&0x01ff))-0x50+0x02;
|
||||
int flipx = flags&2;
|
||||
int flipy = flags&4;
|
||||
int scalex = (sizex<<16)/(bBigSprite?0x20:0x10);
|
||||
int scalex = (sizex<<16)/(0x20);//(sizex<<16)/(bBigSprite?0x20:0x10); correct formula?
|
||||
int scaley = (sizey<<16)/(bBigSprite?0x20:0x10);
|
||||
|
||||
if( (flags&0x01) )
|
||||
{ /* swap xy */
|
||||
sprn |= 0x800;
|
||||
}
|
||||
/* swap xy */
|
||||
int rgn = (flags&0x01) ? 3 : 0;
|
||||
|
||||
gfx_element *gfx = m_gfxdecode->gfx(rgn);
|
||||
|
||||
if( bBigSprite )
|
||||
{
|
||||
@ -488,33 +482,16 @@ void namcos2_state::draw_sprites_metalhawk(screen_device &screen, bitmap_ind16 &
|
||||
{
|
||||
sy += (0x20-sizey)/0xC;
|
||||
}
|
||||
gfx->set_source_clip(0, 32, 0, 32);
|
||||
}
|
||||
else
|
||||
gfx->set_source_clip((tile&0x0001) ? 16 : 0, 16, (tile&0x0002) ? 16 : 0, 16);
|
||||
|
||||
/* Set the clipping rect to mask off the other portion of the sprite */
|
||||
rect.set(sx, sx+(sizex-1), sy, sy+(sizey-1));
|
||||
rect &= cliprect;
|
||||
|
||||
if( !bBigSprite )
|
||||
{
|
||||
sizex = 16;
|
||||
sizey = 16;
|
||||
scalex = 1<<16;
|
||||
scaley = 1<<16;
|
||||
|
||||
sx -= (tile&1)?16:0;
|
||||
sy -= (tile&2)?16:0;
|
||||
|
||||
rect.set(sx, sx+(sizex-1), sy, sy+(sizey-1));
|
||||
rect.min_x += (tile&1)?16:0;
|
||||
rect.max_x += (tile&1)?16:0;
|
||||
rect.min_y += (tile&2)?16:0;
|
||||
rect.max_y += (tile&2)?16:0;
|
||||
}
|
||||
zdrawgfxzoom(
|
||||
screen,
|
||||
bitmap,
|
||||
rect,
|
||||
m_gfxdecode->gfx(0),
|
||||
cliprect,
|
||||
gfx,
|
||||
sprn, color,
|
||||
flipx,flipy,
|
||||
sx,sy,
|
||||
@ -865,103 +842,34 @@ READ16_MEMBER( namcos2_shared_state::c355_obj_ram_r )
|
||||
/**
|
||||
* Graphics ROM addressing varies across games.
|
||||
*/
|
||||
void namcos2_shared_state::c169_roz_get_info(tile_data &tileinfo, int tile_index, int which)
|
||||
template<int Which>
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info )
|
||||
{
|
||||
uint16_t tile = m_c169_roz_videoram[tile_index];
|
||||
int bank, mangle;
|
||||
|
||||
switch (m_gametype)
|
||||
{
|
||||
case NAMCONB2_MACH_BREAKERS:
|
||||
bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (tile >> 11) & 0x7);
|
||||
tile = (tile & 0x7ff) | (bank * 0x800);
|
||||
mangle = tile;
|
||||
break;
|
||||
|
||||
case NAMCONB2_OUTFOXIES:
|
||||
bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (tile >> 11) & 0x7);
|
||||
tile = (tile & 0x7ff) | (bank * 0x800);
|
||||
mangle = tile & ~0x50;
|
||||
if (tile & 0x10) mangle |= 0x40;
|
||||
if (tile & 0x40) mangle |= 0x10;
|
||||
break;
|
||||
|
||||
case NAMCOS2_LUCKY_AND_WILD:
|
||||
mangle = tile & 0x01ff;
|
||||
tile &= 0x3fff;
|
||||
switch (tile >> 9)
|
||||
{
|
||||
case 0x00: mangle |= 0x1c00; break;
|
||||
case 0x01: mangle |= 0x0800; break;
|
||||
case 0x02: mangle |= 0x0000; break;
|
||||
|
||||
case 0x08: mangle |= 0x1e00; break;
|
||||
case 0x09: mangle |= 0x0a00; break;
|
||||
case 0x0a: mangle |= 0x0200; break;
|
||||
|
||||
case 0x10: mangle |= 0x2000; break;
|
||||
case 0x11: mangle |= 0x0c00; break;
|
||||
case 0x12: mangle |= 0x0400; break;
|
||||
|
||||
case 0x18: mangle |= 0x2200; break;
|
||||
case 0x19: mangle |= 0x0e00; break;
|
||||
case 0x1a: mangle |= 0x0600; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case NAMCOS2_METAL_HAWK:
|
||||
mangle = tile & 0x01ff;
|
||||
if (tile & 0x1000) mangle |= 0x0200;
|
||||
if (tile & 0x0200) mangle |= 0x0400;
|
||||
if (tile & 0x0400) mangle |= 0x0800;
|
||||
if (tile & 0x0800) mangle |= 0x1000;
|
||||
tile &= 0x3fff; // cap mask offset
|
||||
break;
|
||||
|
||||
default:
|
||||
case NAMCOFL_SPEED_RACER:
|
||||
case NAMCOFL_FINAL_LAP_R:
|
||||
mangle = tile;
|
||||
tile &= 0x3fff; // cap mask offset
|
||||
break;
|
||||
}
|
||||
SET_TILE_INFO_MEMBER(m_c169_roz_gfxbank, mangle, 0/*color*/, 0/*flag*/);
|
||||
tileinfo.mask_data = m_c169_roz_mask + 32*tile;
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info0 )
|
||||
{
|
||||
c169_roz_get_info(tileinfo, tile_index, 0);
|
||||
}
|
||||
|
||||
TILE_GET_INFO_MEMBER( namcos2_shared_state::c169_roz_get_info1 )
|
||||
{
|
||||
c169_roz_get_info(tileinfo, tile_index, 1);
|
||||
int tile, mask;
|
||||
m_c169_cb( m_c169_roz_videoram[tile_index] & 0x3fff, &tile, &mask, Which );
|
||||
tileinfo.mask_data = m_c169_roz_mask + 32*mask;
|
||||
SET_TILE_INFO_MEMBER(m_c169_roz_gfxbank, tile, 0/*color*/, 0/*flag*/);
|
||||
}
|
||||
|
||||
TILEMAP_MAPPER_MEMBER( namcos2_shared_state::c169_roz_mapper )
|
||||
{
|
||||
if (col >= 128)
|
||||
{
|
||||
col %= 128;
|
||||
row += 256;
|
||||
}
|
||||
return row * 128 + col;
|
||||
return ((col & 0x80) << 8) | ((row & 0xff) << 7) | (col & 0x7f);
|
||||
}
|
||||
|
||||
void namcos2_shared_state::c169_roz_init(int gfxbank, const char *maskregion)
|
||||
void namcos2_shared_state::c169_roz_init(int gfxbank, const char *maskregion, c169_tilemap_delegate tilemap_cb)
|
||||
{
|
||||
m_c169_roz_gfxbank = gfxbank;
|
||||
m_c169_roz_mask = memregion(maskregion)->base();
|
||||
m_c169_cb = tilemap_cb;
|
||||
|
||||
m_c169_roz_tilemap[0] = &machine().tilemap().create(*m_gfxdecode,
|
||||
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info0), this),
|
||||
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info<0>), this),
|
||||
tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this),
|
||||
16,16,
|
||||
256,256);
|
||||
|
||||
m_c169_roz_tilemap[1] = &machine().tilemap().create(*m_gfxdecode,
|
||||
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info1), this),
|
||||
tilemap_get_info_delegate(FUNC(namcos2_shared_state::c169_roz_get_info<1>), this),
|
||||
tilemap_mapper_delegate(FUNC(namcos2_shared_state::c169_roz_mapper), this),
|
||||
16,16,
|
||||
256,256);
|
||||
@ -983,6 +891,7 @@ void namcos2_shared_state::c169_roz_unpack_params(const uint16_t *source, roz_pa
|
||||
*/
|
||||
|
||||
uint16_t temp = source[1];
|
||||
params.wrap = BIT(~temp, 11);
|
||||
params.size = 512 << ((temp & 0x0300) >> 8);
|
||||
if (m_gametype == NAMCOFL_SPEED_RACER || m_gametype == NAMCOFL_FINAL_LAP_R)
|
||||
params.color = (temp & 0x0007) * 256;
|
||||
@ -1028,6 +937,7 @@ void namcos2_shared_state::c169_roz_unpack_params(const uint16_t *source, roz_pa
|
||||
void namcos2_shared_state::c169_roz_draw_helper(screen_device &screen, bitmap_ind16 &bitmap, tilemap_t &tmap, const rectangle &clip, const roz_parameters ¶ms)
|
||||
{
|
||||
if (m_gametype != NAMCOFL_SPEED_RACER && m_gametype != NAMCOFL_FINAL_LAP_R)
|
||||
// if (m_gametype != NAMCOFL_FINAL_LAP_R) // Fix speedrcr some title animations, but broke at road scene
|
||||
{
|
||||
uint32_t size_mask = params.size - 1;
|
||||
bitmap_ind16 &srcbitmap = tmap.pixmap();
|
||||
@ -1043,7 +953,7 @@ void namcos2_shared_state::c169_roz_draw_helper(screen_device &screen, bitmap_in
|
||||
uint32_t cy = starty;
|
||||
uint16_t *dest = &bitmap.pix(sy, sx);
|
||||
while (x <= clip.max_x)
|
||||
{
|
||||
{ // TODO : Wraparound disable isn't implemented
|
||||
uint32_t xpos = (((cx >> 16) & size_mask) + params.left) & 0xfff;
|
||||
uint32_t ypos = (((cy >> 16) & size_mask) + params.top) & 0xfff;
|
||||
if (flagsbitmap.pix(ypos, xpos) & TILEMAP_PIXEL_LAYER0)
|
||||
@ -1068,7 +978,7 @@ void namcos2_shared_state::c169_roz_draw_helper(screen_device &screen, bitmap_in
|
||||
params.startx, params.starty,
|
||||
params.incxx, params.incxy,
|
||||
params.incyx, params.incyy,
|
||||
1,0,0); // wrap, flags, pri
|
||||
params.wrap,0,0); // wrap, flags, pri
|
||||
}
|
||||
}
|
||||
|
||||
@ -1113,7 +1023,7 @@ void namcos2_shared_state::c169_roz_draw(screen_device &screen, bitmap_ind16 &bi
|
||||
// second ROZ layer is configured to use per-scanline registers
|
||||
if (which == special && mode == 0x8000)
|
||||
{
|
||||
for (int line = 0; line < 224; line++)
|
||||
for (int line = cliprect.min_y; line <= cliprect.max_y; line++)
|
||||
c169_roz_draw_scanline(screen, bitmap, line, which, pri, cliprect);
|
||||
}
|
||||
else
|
||||
|
@ -54,6 +54,12 @@ void namcofl_state::TilemapCB(uint16_t code, int *tile, int *mask)
|
||||
*mask = code;
|
||||
}
|
||||
|
||||
void namcofl_state::RozCB(uint16_t code, int *tile, int *mask, int which)
|
||||
{
|
||||
*tile = code;
|
||||
*mask = code;
|
||||
}
|
||||
|
||||
|
||||
uint32_t namcofl_state::screen_update_namcofl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
@ -92,5 +98,5 @@ VIDEO_START_MEMBER(namcofl_state,namcofl)
|
||||
{
|
||||
c123_tilemap_init(NAMCOFL_TILEGFX, memregion(NAMCOFL_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namcofl_state::TilemapCB, this));
|
||||
c355_obj_init(NAMCOFL_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namcofl_state::FLobjcode2tile, this));
|
||||
c169_roz_init(NAMCOFL_ROTGFX,NAMCOFL_ROTMASKREGION);
|
||||
c169_roz_init(NAMCOFL_ROTGFX,NAMCOFL_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namcofl_state::RozCB, this));
|
||||
}
|
||||
|
@ -8,6 +8,20 @@
|
||||
#include "machine/namcoic.h"
|
||||
|
||||
|
||||
static inline uint8_t
|
||||
nth_byte16( const uint16_t *pSource, int which )
|
||||
{
|
||||
uint16_t data = pSource[which/2];
|
||||
if( which&1 )
|
||||
{
|
||||
return data&0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
return data>>8;
|
||||
}
|
||||
} /* nth_byte16 */
|
||||
|
||||
/* nth_word32 is a general-purpose utility function, which allows us to
|
||||
* read from 32-bit aligned memory as if it were an array of 16 bit words.
|
||||
*/
|
||||
@ -47,29 +61,44 @@ void namconb1_state::NB1TilemapCB(uint16_t code, int *tile, int *mask)
|
||||
*mask = code;
|
||||
} /* NB1TilemapCB */
|
||||
|
||||
void namconb1_state::NB2TilemapCB(uint16_t code, int *tile, int *mask )
|
||||
void namconb1_state::NB2TilemapCB_machbrkr(uint16_t code, int *tile, int *mask )
|
||||
{
|
||||
int mangle;
|
||||
/* 00010203 04050607 00010203 04050607 (normal) */
|
||||
/* 00010718 191a1b07 00010708 090a0b07 (alt bank) */
|
||||
int bank = nth_byte32( m_tilebank32, (code>>13)+8 );
|
||||
int mangle = (code&0x1fff) | (bank<<13);
|
||||
*tile = mangle;
|
||||
*mask = mangle;
|
||||
|
||||
if( m_gametype == NAMCONB2_MACH_BREAKERS )
|
||||
{
|
||||
/* 00010203 04050607 00010203 04050607 (normal) */
|
||||
/* 00010718 191a1b07 00010708 090a0b07 (alt bank) */
|
||||
int bank = nth_byte32( m_tilebank32, (code>>13)+8 );
|
||||
mangle = (code&0x1fff) + bank*0x2000;
|
||||
*tile = mangle;
|
||||
*mask = mangle;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* the pixmap index is mangled, the transparency bitmask index is not */
|
||||
mangle = code&~(0x140);
|
||||
if( code&0x100 ) mangle |= 0x040;
|
||||
if( code&0x040 ) mangle |= 0x100;
|
||||
*tile = mangle;
|
||||
*mask = code;
|
||||
}
|
||||
} /* NB2TilemapCB */
|
||||
} /* NB2TilemapCB_machbrkr */
|
||||
|
||||
void namconb1_state::NB2TilemapCB_outfxies(uint16_t code, int *tile, int *mask )
|
||||
{
|
||||
/* the pixmap index is mangled, the transparency bitmask index is not */
|
||||
*tile = bitswap<16>(code, 15, 14, 13, 12, 11, 10, 9, 6, 7, 8, 5, 4, 3, 2, 1, 0);
|
||||
*mask = code;
|
||||
|
||||
} /* NB2TilemapCB_outfxies */
|
||||
|
||||
void namconb1_state::NB2RozCB_machbrkr(uint16_t code, int *tile, int *mask, int which )
|
||||
{
|
||||
int bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (code >> 11) & 0x7);
|
||||
int mangle = (code & 0x7ff) | (bank << 11);
|
||||
*tile = mangle;
|
||||
*mask = mangle;
|
||||
|
||||
} /* NB2RozCB_machbrkr */
|
||||
|
||||
void namconb1_state::NB2RozCB_outfxies(uint16_t code, int *tile, int *mask, int which )
|
||||
{
|
||||
/* the pixmap index is mangled, the transparency bitmask index is not */
|
||||
int bank = nth_byte16(&m_c169_roz_bank[which * 8 / 2], (code >> 11) & 0x7);
|
||||
int mangle = (code & 0x7ff) | (bank << 11);
|
||||
*mask = mangle;
|
||||
mangle = bitswap<19>(mangle & 0x7ffff, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 4, 5, 6, 3, 2, 1, 0);
|
||||
*tile = mangle;
|
||||
|
||||
} /* NB2RozCB_outfxies */
|
||||
|
||||
void namconb1_state::video_update_common(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int bROZ )
|
||||
{
|
||||
@ -121,7 +150,7 @@ uint32_t namconb1_state::screen_update_namconb1(screen_device &screen, bitmap_in
|
||||
int namconb1_state::NB1objcode2tile( int code )
|
||||
{
|
||||
int bank = nth_word32( m_spritebank32, code>>11 );
|
||||
return (code&0x7ff) + bank*0x800;
|
||||
return (code&0x7ff) | (bank<<11);
|
||||
}
|
||||
|
||||
VIDEO_START_MEMBER(namconb1_state,namconb1)
|
||||
@ -157,36 +186,36 @@ uint32_t namconb1_state::screen_update_namconb2(screen_device &screen, bitmap_in
|
||||
return 0;
|
||||
}
|
||||
|
||||
int namconb1_state::NB2objcode2tile( int code )
|
||||
int namconb1_state::NB2objcode2tile_machbrkr( int code )
|
||||
{
|
||||
int bank = nth_byte32( m_spritebank32, (code>>11)&0xf );
|
||||
code &= 0x7ff;
|
||||
if( m_gametype == NAMCONB2_MACH_BREAKERS )
|
||||
{
|
||||
if( bank&0x01 ) code |= 0x01*0x800;
|
||||
if( bank&0x02 ) code |= 0x02*0x800;
|
||||
if( bank&0x04 ) code |= 0x04*0x800;
|
||||
if( bank&0x08 ) code |= 0x08*0x800;
|
||||
if( bank&0x10 ) code |= 0x10*0x800;
|
||||
if( bank&0x40 ) code |= 0x20*0x800;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( bank&0x01 ) code |= 0x01*0x800;
|
||||
if( bank&0x02 ) code |= 0x04*0x800;
|
||||
if( bank&0x04 ) code |= 0x02*0x800;
|
||||
if( bank&0x08 ) code |= 0x08*0x800;
|
||||
if( bank&0x10 ) code |= 0x10*0x800;
|
||||
if( bank&0x40 ) code |= 0x20*0x800;
|
||||
}
|
||||
code |= bitswap<6>(bank & 0x5f, 6, 4, 3, 2, 1, 0) << 11;
|
||||
return code;
|
||||
} /* NB2objcode2tile */
|
||||
} /* NB2objcode2tile_machbrkr */
|
||||
|
||||
VIDEO_START_MEMBER(namconb1_state,namconb2)
|
||||
int namconb1_state::NB2objcode2tile_outfxies( int code )
|
||||
{
|
||||
c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB, this));
|
||||
c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile, this));
|
||||
c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION);
|
||||
int bank = nth_byte32( m_spritebank32, (code>>11)&0xf );
|
||||
code &= 0x7ff;
|
||||
code |= bitswap<6>(bank & 0x5f, 6, 4, 3, 1, 2, 0) << 11;
|
||||
return code;
|
||||
} /* NB2objcode2tile_outfxies */
|
||||
|
||||
VIDEO_START_MEMBER(namconb1_state,machbrkr)
|
||||
{
|
||||
c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_machbrkr, this));
|
||||
c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_machbrkr, this));
|
||||
c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namconb1_state::NB2RozCB_machbrkr, this));
|
||||
|
||||
save_item(NAME(m_tilemap_tile_bank));
|
||||
} /* namconb2_vh_start */
|
||||
} /* machbrkr */
|
||||
|
||||
VIDEO_START_MEMBER(namconb1_state,outfxies)
|
||||
{
|
||||
c123_tilemap_init(NAMCONB1_TILEGFX, memregion(NAMCONB1_TILEMASKREGION)->base(), namcos2_shared_state::c123_tilemap_delegate(&namconb1_state::NB2TilemapCB_outfxies, this));
|
||||
c355_obj_init(NAMCONB1_SPRITEGFX,0x0,namcos2_shared_state::c355_obj_code2tile_delegate(&namconb1_state::NB2objcode2tile_outfxies, this));
|
||||
c169_roz_init(NAMCONB1_ROTGFX,NAMCONB1_ROTMASKREGION,namcos2_shared_state::c169_tilemap_delegate(&namconb1_state::NB2RozCB_outfxies, this));
|
||||
|
||||
save_item(NAME(m_tilemap_tile_bank));
|
||||
} /* outfxies */
|
||||
|
@ -8,19 +8,14 @@
|
||||
void namcos2_state::TilemapCB(uint16_t code, int *tile, int *mask)
|
||||
{
|
||||
*mask = code;
|
||||
/* The order of bits needs to be corrected to index the right tile 14 15 11 12 13 */
|
||||
*tile = bitswap<16>(code, 13, 12, 11, 15, 14, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
|
||||
}
|
||||
|
||||
switch( m_gametype )
|
||||
{
|
||||
case NAMCOS2_FINAL_LAP_2:
|
||||
case NAMCOS2_FINAL_LAP_3:
|
||||
*tile = (code&0x07ff)|((code&0x4000)>>3)|((code&0x3800)<<1);
|
||||
break;
|
||||
|
||||
default:
|
||||
/* The order of bits needs to be corrected to index the right tile 14 15 11 12 13 */
|
||||
*tile = (code&0x07ff)|((code&0xc000)>>3)|((code&0x3800)<<2);
|
||||
break;
|
||||
}
|
||||
void namcos2_state::TilemapCB_finalap2(uint16_t code, int *tile, int *mask)
|
||||
{
|
||||
*mask = code;
|
||||
*tile = bitswap<15>(code, 13, 12, 11, 14, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -448,6 +443,12 @@ void namcos2_state::video_start_finallap()
|
||||
draw_sprite_init();
|
||||
}
|
||||
|
||||
void namcos2_state::video_start_finalap2()
|
||||
{
|
||||
c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB_finalap2, this));
|
||||
draw_sprite_init();
|
||||
}
|
||||
|
||||
uint32_t namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
rectangle clip;
|
||||
@ -471,13 +472,29 @@ uint32_t namcos2_state::screen_update_finallap(screen_device &screen, bitmap_ind
|
||||
|
||||
/**************************************************************************/
|
||||
|
||||
void namcos2_state::RozCB_luckywld(uint16_t code, int *tile, int *mask, int which)
|
||||
{
|
||||
*mask = code;
|
||||
|
||||
uint16_t mangle = bitswap<11>(code & 0x31ff, 13, 12, 8, 7, 6, 5, 4, 3, 2, 1, 0);
|
||||
switch ((code >> 9) & 7)
|
||||
{
|
||||
case 0x00: mangle += 0x1c00; break; // Plus, NOT OR
|
||||
case 0x01: mangle |= 0x0800; break;
|
||||
case 0x02: mangle |= 0x0000; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
*tile = mangle;
|
||||
}
|
||||
|
||||
void namcos2_state::video_start_luckywld()
|
||||
{
|
||||
c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this));
|
||||
c355_obj_init( 0, 0x0, namcos2_shared_state::c355_obj_code2tile_delegate() );
|
||||
if( m_gametype==NAMCOS2_LUCKY_AND_WILD )
|
||||
{
|
||||
c169_roz_init(1, "gfx5");
|
||||
c169_roz_init(1, "gfx5", namcos2_shared_state::c169_tilemap_delegate(&namcos2_state::RozCB_luckywld, this));
|
||||
}
|
||||
}
|
||||
|
||||
@ -534,10 +551,16 @@ uint32_t namcos2_state::screen_update_sgunner(screen_device &screen, bitmap_ind1
|
||||
|
||||
/**************************************************************************/
|
||||
|
||||
void namcos2_state::RozCB_metlhawk(uint16_t code, int *tile, int *mask, int which)
|
||||
{
|
||||
*mask = code;
|
||||
*tile = bitswap<13>(code & 0x1fff, 11, 10, 9, 12, 8, 7, 6, 5, 4, 3, 2, 1, 0);
|
||||
}
|
||||
|
||||
void namcos2_state::video_start_metlhawk()
|
||||
{
|
||||
c123_tilemap_init(2,memregion("gfx4")->base(),namcos2_shared_state::c123_tilemap_delegate(&namcos2_state::TilemapCB, this));
|
||||
c169_roz_init(1, "gfx5");
|
||||
c169_roz_init(1, "gfx5", namcos2_shared_state::c169_tilemap_delegate(&namcos2_state::RozCB_metlhawk, this));
|
||||
}
|
||||
|
||||
uint32_t namcos2_state::screen_update_metlhawk(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
|
Loading…
Reference in New Issue
Block a user