diff --git a/src/mame/drivers/popeye.cpp b/src/mame/drivers/popeye.cpp index 7c74bff31b0..0cc8f8db31c 100644 --- a/src/mame/drivers/popeye.cpp +++ b/src/mame/drivers/popeye.cpp @@ -12,8 +12,6 @@ Notes: (which is the same revision of the program code) has the protection disabled in a very clean way, so I don't know if it's an original (without the protection device to save costs), or a very well done bootleg. -- The bootleg derives from a different revision of the program code which we - don't have. ***************************************************************************/ @@ -159,7 +157,7 @@ WRITE8_MEMBER(popeye_state::protection_w) -static ADDRESS_MAP_START( skyskipr_map, AS_PROGRAM, 8, popeye_state ) +static ADDRESS_MAP_START( tnx1_map, AS_PROGRAM, 8, popeye_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8800, 0x8bff) AM_WRITENOP // Attempts to initialize this area with 00 on boot @@ -169,11 +167,11 @@ static ADDRESS_MAP_START( skyskipr_map, AS_PROGRAM, 8, popeye_state ) AM_RANGE(0x8e80, 0x8fff) AM_RAM AM_RANGE(0xa000, 0xa3ff) AM_WRITE(popeye_videoram_w) AM_SHARE("videoram") AM_RANGE(0xa400, 0xa7ff) AM_WRITE(popeye_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xc000, 0xcfff) AM_WRITE(skyskipr_bitmap_w) + AM_RANGE(0xc000, 0xcfff) AM_WRITE(tnx1_bitmap_w) AM_RANGE(0xe000, 0xe001) AM_READWRITE(protection_r,protection_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( popeye_map, AS_PROGRAM, 8, popeye_state ) +static ADDRESS_MAP_START( tpp2_map, AS_PROGRAM, 8, popeye_state ) AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x8000, 0x87ff) AM_RAM // unpopulated 7f AM_RANGE(0x8800, 0x8bff) AM_RAM @@ -183,7 +181,7 @@ static ADDRESS_MAP_START( popeye_map, AS_PROGRAM, 8, popeye_state ) AM_RANGE(0x8e80, 0x8fff) AM_RAM AM_RANGE(0xa000, 0xa3ff) AM_WRITE(popeye_videoram_w) AM_SHARE("videoram") AM_RANGE(0xa400, 0xa7ff) AM_WRITE(popeye_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xc000, 0xdfff) AM_WRITE(popeye_bitmap_w) + AM_RANGE(0xc000, 0xdfff) AM_WRITE(tpp2_bitmap_w) AM_RANGE(0xe000, 0xe001) AM_READWRITE(protection_r,protection_w) ADDRESS_MAP_END @@ -196,7 +194,7 @@ static ADDRESS_MAP_START( popeyebl_map, AS_PROGRAM, 8, popeye_state ) AM_RANGE(0x8e80, 0x8fff) AM_RAM AM_RANGE(0xa000, 0xa3ff) AM_WRITE(popeye_videoram_w) AM_SHARE("videoram") AM_RANGE(0xa400, 0xa7ff) AM_WRITE(popeye_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xc000, 0xcfff) AM_WRITE(skyskipr_bitmap_w) + AM_RANGE(0xc000, 0xcfff) AM_WRITE(tnx1_bitmap_w) AM_RANGE(0xe000, 0xe01f) AM_ROM AM_REGION("blprot", 0x00) ADDRESS_MAP_END @@ -447,10 +445,10 @@ WRITE8_MEMBER(popeye_state::popeye_portB_w) m_dswbit = (data & 0x0e) >> 1; } -static MACHINE_CONFIG_START( skyskipr ) +static MACHINE_CONFIG_START( tnx1 ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz/2) /* 4 MHz */ - MCFG_CPU_PROGRAM_MAP(skyskipr_map) + MCFG_CPU_PROGRAM_MAP(tnx1_map) MCFG_CPU_IO_MAP(popeye_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", popeye_state, popeye_interrupt) @@ -465,7 +463,7 @@ static MACHINE_CONFIG_START( skyskipr ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", popeye) MCFG_PALETTE_ADD("palette", 16+16*2+64*4) - MCFG_PALETTE_INIT_OWNER(popeye_state, skyskipr) + MCFG_PALETTE_INIT_OWNER(popeye_state, tnx1) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("mono") @@ -476,14 +474,16 @@ static MACHINE_CONFIG_START( skyskipr ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( popeyej, skyskipr ) +static MACHINE_CONFIG_DERIVED( tpp1, tnx1 ) MCFG_PALETTE_MODIFY("palette") - MCFG_PALETTE_INIT_OWNER(popeye_state,popeye) + MCFG_PALETTE_INIT_OWNER(popeye_state,tpp1) + + MCFG_VIDEO_START_OVERRIDE(popeye_state,tpp1) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( popeye, popeyej ) +static MACHINE_CONFIG_DERIVED( tpp2, tpp1 ) MCFG_CPU_MODIFY("maincpu") - MCFG_CPU_PROGRAM_MAP(popeye_map) + MCFG_CPU_PROGRAM_MAP(tpp2_map) MCFG_SOUND_MODIFY("aysnd") MCFG_SOUND_ROUTES_RESET() @@ -507,12 +507,10 @@ static MACHINE_CONFIG_DERIVED( popeye, popeyej ) MCFG_NETLIST_STREAM_OUTPUT("snd_nl", 0, "ROUT.1") MCFG_NETLIST_ANALOG_MULT_OFFSET(30000.0, -65000.0) - - MCFG_VIDEO_START_OVERRIDE(popeye_state,popeye) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( popeyebl, popeye ) +static MACHINE_CONFIG_DERIVED( popeyebl, tpp1 ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(popeyebl_map) @@ -815,7 +813,7 @@ ROM_START( popeyejo ) ROM_END -DRIVER_INIT_MEMBER(popeye_state,skyskipr) +DRIVER_INIT_MEMBER(popeye_state,tnx1) { uint8_t *rom = memregion("maincpu")->base(); int len = memregion("maincpu")->bytes(); @@ -834,7 +832,7 @@ DRIVER_INIT_MEMBER(popeye_state,skyskipr) save_item(NAME(m_prot_shift)); } -DRIVER_INIT_MEMBER(popeye_state,popeye) +DRIVER_INIT_MEMBER(popeye_state,tpp2) { uint8_t *rom = memregion("maincpu")->base(); int len = memregion("maincpu")->bytes(); @@ -854,12 +852,12 @@ DRIVER_INIT_MEMBER(popeye_state,popeye) } -GAME( 1981, skyskipr, 0, skyskipr, skyskipr, popeye_state, skyskipr, ROT0, "Nintendo", "Sky Skipper", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeye, 0, popeye, popeye, popeye_state, popeye, ROT0, "Nintendo", "Popeye (revision D)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyeu, popeye, popeye, popeye, popeye_state, popeye, ROT0, "Nintendo", "Popeye (revision D not protected)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyef, popeye, popeye, popeyef, popeye_state, popeye, ROT0, "Nintendo", "Popeye (revision F)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyebl, popeye, popeyebl, popeye, popeye_state, 0, ROT0, "bootleg", "Popeye (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyeb2, popeye, popeyebl, popeye, popeye_state, 0, ROT0, "bootleg", "Popeye (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyeb3, popeye, popeye, popeye, popeye_state, popeye, ROT0, "bootleg", "Popeye (bootleg set 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1982, popeyej, popeye, popeyej, popeye, popeye_state, skyskipr, ROT0, "Nintendo", "Popeye (Japan, Sky Skipper hardware)", MACHINE_SUPPORTS_SAVE ) // this is the original Japanese release on the same hardware as Sky Skipper -GAME( 1982, popeyejo, popeye, popeyej, popeye, popeye_state, skyskipr, ROT0, "Nintendo", "Popeye (Japan, Sky Skipper hardware, Older)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, skyskipr, 0, tnx1, skyskipr, popeye_state, tnx1, ROT0, "Nintendo", "Sky Skipper", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeye, 0, tpp2, popeye, popeye_state, tpp2, ROT0, "Nintendo", "Popeye (revision D)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyeu, popeye, tpp2, popeye, popeye_state, tpp2, ROT0, "Nintendo", "Popeye (revision D not protected)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyef, popeye, tpp2, popeyef, popeye_state, tpp2, ROT0, "Nintendo", "Popeye (revision F)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyebl, popeye, popeyebl, popeye, popeye_state, 0, ROT0, "bootleg", "Popeye (bootleg set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyeb2, popeye, popeyebl, popeye, popeye_state, 0, ROT0, "bootleg", "Popeye (bootleg set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyeb3, popeye, tpp2, popeye, popeye_state, tpp2, ROT0, "bootleg", "Popeye (bootleg set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyej, popeye, tpp1, popeye, popeye_state, tnx1, ROT0, "Nintendo", "Popeye (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1982, popeyejo, popeye, tpp1, popeye, popeye_state, tnx1, ROT0, "Nintendo", "Popeye (Japan, Older)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/popeye.h b/src/mame/includes/popeye.h index 062e9511bab..b677b677d25 100644 --- a/src/mame/includes/popeye.h +++ b/src/mame/includes/popeye.h @@ -41,18 +41,18 @@ public: DECLARE_WRITE8_MEMBER(protection_w); DECLARE_WRITE8_MEMBER(popeye_videoram_w); DECLARE_WRITE8_MEMBER(popeye_colorram_w); - DECLARE_WRITE8_MEMBER(popeye_bitmap_w); - DECLARE_WRITE8_MEMBER(skyskipr_bitmap_w); + DECLARE_WRITE8_MEMBER(tpp2_bitmap_w); + DECLARE_WRITE8_MEMBER(tnx1_bitmap_w); DECLARE_WRITE8_MEMBER(popeye_portB_w); DECLARE_CUSTOM_INPUT_MEMBER(dsw1_read); - DECLARE_DRIVER_INIT(skyskipr); - DECLARE_DRIVER_INIT(popeye); + DECLARE_DRIVER_INIT(tnx1); + DECLARE_DRIVER_INIT(tpp2); TILE_GET_INFO_MEMBER(get_fg_tile_info); virtual void video_start() override; - DECLARE_PALETTE_INIT(popeye); - DECLARE_VIDEO_START(popeye); + DECLARE_PALETTE_INIT(tpp1); + DECLARE_VIDEO_START(tpp1); DECLARE_PALETTE_INIT(popeyebl); - DECLARE_PALETTE_INIT(skyskipr); + DECLARE_PALETTE_INIT(tnx1); uint32_t screen_update_popeye(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(popeye_interrupt); DECLARE_CUSTOM_INPUT_MEMBER( pop_field_r ); diff --git a/src/mame/video/popeye.cpp b/src/mame/video/popeye.cpp index c79c8b156c5..d887fe058d7 100644 --- a/src/mame/video/popeye.cpp +++ b/src/mame/video/popeye.cpp @@ -15,7 +15,7 @@ static const size_t popeye_bitmapram_size = 0x2000; // 8k nybbles packed into 4k ram chip -enum { TYPE_SKYSKIPR, TYPE_POPEYE }; +enum { TYPE_TNX1, TYPE_TPP1 }; #define USE_NEW_COLOR (1) @@ -199,7 +199,7 @@ void popeye_state::convert_color_prom(const uint8_t *color_prom) #endif } -PALETTE_INIT_MEMBER(popeye_state, popeye) +PALETTE_INIT_MEMBER(popeye_state, tpp1) { m_invertmask = (USE_NEW_COLOR) ? 0x00 : 0xff; @@ -213,7 +213,7 @@ PALETTE_INIT_MEMBER(popeye_state,popeyebl) convert_color_prom(m_color_prom); } -PALETTE_INIT_MEMBER(popeye_state, skyskipr) +PALETTE_INIT_MEMBER(popeye_state, tnx1) { /* Two of the PROM address pins are tied together and one is not connected... */ for (int i = 0;i < 0x100;i++) @@ -265,7 +265,7 @@ void popeye_state::set_background_palette(int bank) bit0 = 0; bit1 = ((color_prom[0] ^ m_invertmask) >> 6) & 0x01; bit2 = ((color_prom[0] ^ m_invertmask) >> 7) & 0x01; - if (m_bitmap_type == TYPE_SKYSKIPR) + if (m_bitmap_type == TYPE_TNX1) { /* Sky Skipper has different weights */ bit0 = bit1; @@ -292,13 +292,13 @@ WRITE8_MEMBER(popeye_state::popeye_colorram_w) m_fg_tilemap->mark_tile_dirty(offset); } -WRITE8_MEMBER(popeye_state::popeye_bitmap_w) +WRITE8_MEMBER(popeye_state::tpp2_bitmap_w) { int sx,sy,x,y,colour; m_bitmapram[offset] = data & 0xf; - if (m_bitmap_type == TYPE_SKYSKIPR) + if (m_bitmap_type == TYPE_TNX1) { sx = 8 * (offset % 128); sy = 8 * (offset / 128); @@ -334,13 +334,13 @@ WRITE8_MEMBER(popeye_state::popeye_bitmap_w) } } -WRITE8_MEMBER(popeye_state::skyskipr_bitmap_w) +WRITE8_MEMBER(popeye_state::tnx1_bitmap_w) { offset = ((offset & 0xfc0) << 1) | (offset & 0x03f); if (data & 0x80) offset |= 0x40; - popeye_bitmap_w(space,offset,data); + tpp2_bitmap_w(space,offset,data); } TILE_GET_INFO_MEMBER(popeye_state::get_fg_tile_info) @@ -356,7 +356,7 @@ void popeye_state::video_start() m_bitmapram = std::make_unique(popeye_bitmapram_size); m_tmpbitmap2 = std::make_unique(1024,1024); /* actually 1024x512 but not rolling over vertically? */ - m_bitmap_type = TYPE_SKYSKIPR; + m_bitmap_type = TYPE_TNX1; m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popeye_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_fg_tilemap->set_transparent_pen(0); @@ -370,12 +370,12 @@ void popeye_state::video_start() save_pointer(NAME(m_bitmapram.get()), popeye_bitmapram_size); } -VIDEO_START_MEMBER(popeye_state,popeye) +VIDEO_START_MEMBER(popeye_state,tpp1) { m_bitmapram = std::make_unique(popeye_bitmapram_size); - m_tmpbitmap2 = std::make_unique(512,512); + m_tmpbitmap2 = std::make_unique(512,1024); /* actually 512x512 but not rolling over vertically? */ - m_bitmap_type = TYPE_POPEYE; + m_bitmap_type = TYPE_TPP1; m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(popeye_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); m_fg_tilemap->set_transparent_pen(0); @@ -397,33 +397,25 @@ void popeye_state::draw_background(bitmap_ind16 &bitmap, const rectangle &clipre if (m_lastflip != flip_screen()) { for (offs = 0;offs < popeye_bitmapram_size;offs++) - popeye_bitmap_w(space,offs,m_bitmapram[offs]); + tpp2_bitmap_w(space,offs,m_bitmapram[offs]); m_lastflip = flip_screen(); } set_background_palette((*m_palettebank & 0x08) >> 3); - if (m_background_pos[1] == 0) /* no background */ - bitmap.fill(0, cliprect); - else + /* copy the background graphics */ + int scrollx = 2 * (456 - (m_background_pos[0] | (m_background_pos[2] << 8))); + int scrolly = 2 * (256 - m_background_pos[1]); + + if (flip_screen()) { - /* copy the background graphics */ - int scrollx = 200 - m_background_pos[0] - 256*(m_background_pos[2]&1); /* ??? */ - int scrolly = 2 * (256 - m_background_pos[1]); - - if (m_bitmap_type == TYPE_SKYSKIPR) - scrollx = 2*scrollx - 512; - - if (flip_screen()) - { - if (m_bitmap_type == TYPE_POPEYE) - scrollx = -scrollx; - scrolly = -scrolly; - } - - copyscrollbitmap(bitmap,*m_tmpbitmap2,1,&scrollx,1,&scrolly,cliprect); + if (m_bitmap_type == TYPE_TPP1) + scrollx = -scrollx; + scrolly = -scrolly; } + + copyscrollbitmap(bitmap,*m_tmpbitmap2,1,&scrollx,1,&scrolly,cliprect); } void popeye_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)