From 18ead2f86f90426d74ff68abc80ae3a73a710ec1 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Sat, 24 Apr 2021 01:23:03 +0100 Subject: [PATCH] tweaks to the funkyjet addition, also apply single pixel video offset to match hardware (#7996) --- src/mame/drivers/funkyjet.cpp | 53 ++++++++++++++++++++++++----------- src/mame/includes/funkyjet.h | 4 +++ src/mame/video/funkyjet.cpp | 16 +++++++++++ 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/mame/drivers/funkyjet.cpp b/src/mame/drivers/funkyjet.cpp index 3576571ff30..7f6918de7b9 100644 --- a/src/mame/drivers/funkyjet.cpp +++ b/src/mame/drivers/funkyjet.cpp @@ -2,6 +2,8 @@ // copyright-holders:Bryan McPhail /*************************************************************************** + All game use a DE-0372-0 PCB (see below for layout) + Funky Jet (c) 1992 Data East / Mitchell Corporation Sotsugyo Shousho (c) 1995 Mitchell Corporation @@ -98,7 +100,6 @@ Notes: #include "sound/okim6295.h" #include "sound/ym2151.h" #include "emupal.h" -#include "screen.h" #include "speaker.h" /******************************************************************************/ @@ -244,6 +245,17 @@ static INPUT_PORTS_START( funkyjetj ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END +static INPUT_PORTS_START( funkyjeta2 ) + PORT_INCLUDE(funkyjetj) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:2,1") + PORT_DIPSETTING( 0x0000, "0" ) + PORT_DIPSETTING( 0x8000, "1" ) + PORT_DIPSETTING( 0xc000, "2" ) + PORT_DIPSETTING( 0x4000, "3" ) +INPUT_PORTS_END + static INPUT_PORTS_START( sotsugyo ) PORT_INCLUDE(funkyjet) @@ -305,7 +317,7 @@ GFXDECODE_END void funkyjet_state::funkyjet(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(28'000'000)/2); /* 28 MHz crystal */ + M68000(config, m_maincpu, XTAL(28'322'000)/2); /* 28 MHz crystal - 28.322000 on funkyjeta2 PCB at least*/ m_maincpu->set_addrmap(AS_PROGRAM, &funkyjet_state::funkyjet_map); m_maincpu->set_vblank_int("screen", FUNC(funkyjet_state::irq6_line_hold)); @@ -315,13 +327,13 @@ void funkyjet_state::funkyjet(machine_config &config) m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0); /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(58); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(529)); - screen.set_size(40*8, 32*8); - screen.set_visarea(0*8, 40*8-1, 1*8, 31*8-1); - screen.set_screen_update(FUNC(funkyjet_state::screen_update)); - screen.set_palette("palette"); + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(58); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529)); + m_screen->set_size(40*8, 32*8); + m_screen->set_visarea(0*8, 40*8-1, 1*8, 31*8-1); + m_screen->set_screen_update(FUNC(funkyjet_state::screen_update)); + m_screen->set_palette("palette"); DECO146PROT(config, m_deco146, 0); m_deco146->port_a_cb().set_ioport("INPUTS"); @@ -380,7 +392,9 @@ ROM_START( funkyjet ) ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) ) ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ - ROM_LOAD( "jk03.15h", 0x00000, 0x20000, CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) + // needs verifying, looks like a bad dump compared to the ROM in funkyjeta2 + // 0x20 bytes at 0x79e0 are blanked out and 0x20 bytes at 0xa6a0 are replaced with different (bad?) data + ROM_LOAD( "jk03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) ROM_END ROM_START( funkyjeta ) @@ -399,16 +413,17 @@ ROM_START( funkyjeta ) ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) ) ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ - ROM_LOAD( "jk03.15h", 0x00000, 0x20000, CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) + // see comment in funkyjet set + ROM_LOAD( "jk03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) ROM_END ROM_START( funkyjeta2 ) ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "jk00-1.12f", 0x00000, 0x40000, CRC(a18de697) SHA1(063f7f4c31c80b8fd807699e0412abb9271ddc59) ) /* sldh */ - ROM_LOAD16_BYTE( "jk01-1.13f", 0x00001, 0x40000, CRC(695a27cd) SHA1(79b4e61e7c6bdab439d70993c296443f97339351) ) /* sldh */ + ROM_LOAD16_BYTE( "12f", 0x00000, 0x40000, CRC(a18de697) SHA1(063f7f4c31c80b8fd807699e0412abb9271ddc59) ) // labels were blank + ROM_LOAD16_BYTE( "13f", 0x00001, 0x40000, CRC(695a27cd) SHA1(79b4e61e7c6bdab439d70993c296443f97339351) ) ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ - ROM_LOAD( "jk02.16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) ) + ROM_LOAD( "16f", 0x00000, 0x10000, CRC(748c0bd8) SHA1(35910e6a4c4f198fb76bde0f5b053e2c66cfa0ff) ) ROM_REGION( 0x080000, "gfx1", 0 ) ROM_LOAD( "mat02", 0x000000, 0x80000, CRC(e4b94c7e) SHA1(7b6ddd0bd388c8d32277fce4b3abb102724bc7d1) ) /* Encrypted chars */ @@ -418,7 +433,7 @@ ROM_START( funkyjeta2 ) ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) ) ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ - ROM_LOAD( "jk03.15h", 0x00000, 0x20000, CRC(d7c0f0fe) SHA1(7a4a21bbf0da27767de099fba66011732b2c835a) ) /* sldh */ + ROM_LOAD( "15h", 0x00000, 0x20000, CRC(d7c0f0fe) SHA1(7a4a21bbf0da27767de099fba66011732b2c835a) ) ROM_END ROM_START( funkyjetj ) @@ -437,7 +452,8 @@ ROM_START( funkyjetj ) ROM_LOAD( "mat00", 0x080000, 0x80000, CRC(fbda0228) SHA1(815d49898d02e699393e370209181f2ca8301949) ) ROM_REGION( 0x40000, "oki", 0 ) /* ADPCM samples */ - ROM_LOAD( "jh03.15h", 0x00000, 0x20000, CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) /* same as jk03.15h from world set */ + // see comment in funkyjet set, was this verified as label is different? + ROM_LOAD( "jh03.15h", 0x00000, 0x20000, BAD_DUMP CRC(69a0eaf7) SHA1(05038e82ee03106625f05082fe9912e16be181ee) ) /* same as jk03.15h from world set */ ROM_END ROM_START( sotsugyo ) @@ -468,6 +484,9 @@ void funkyjet_state::init_funkyjet() GAME( 1992, funkyjet, 0, funkyjet, funkyjet, funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (World, rev 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, funkyjeta, funkyjet, funkyjet, funkyjet, funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (World)", MACHINE_SUPPORTS_SAVE ) -GAME( 1992, funkyjeta2,funkyjet, funkyjet, funkyjet, funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (World, alternate demo)", MACHINE_SUPPORTS_SAVE ) +// This set, from a Korean PCB, has numerous changes, including a different 'how to play' demo, modified stage layouts +// It also has you collecting smiley faces rather than fuel cells to charge your super +GAME( 1992, funkyjeta2,funkyjet, funkyjet, funkyjeta2,funkyjet_state, init_funkyjet, ROT0, "Mitchell", "Funky Jet (Korea, prototype?)", MACHINE_SUPPORTS_SAVE ) GAME( 1992, funkyjetj, funkyjet, funkyjet, funkyjetj, funkyjet_state, init_funkyjet, ROT0, "Mitchell (Data East Corporation license)", "Funky Jet (Japan, rev 2)", MACHINE_SUPPORTS_SAVE ) + GAME( 1995, sotsugyo, 0, funkyjet, sotsugyo, funkyjet_state, init_funkyjet, ROT0, "Mitchell (Atlus license)", "Sotsugyo Shousho", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/funkyjet.h b/src/mame/includes/funkyjet.h index b70f5db8bfa..ff705f5bf85 100644 --- a/src/mame/includes/funkyjet.h +++ b/src/mame/includes/funkyjet.h @@ -6,6 +6,8 @@ *************************************************************************/ +#include "screen.h" + #include "cpu/h6280/h6280.h" #include "video/decospr.h" #include "video/deco16ic.h" @@ -19,6 +21,7 @@ public: : driver_device(mconfig, type, tag) , m_spriteram(*this, "spriteram") , m_pf_rowscroll(*this, "pf%u_rowscroll", 1) + , m_screen(*this, "screen") , m_maincpu(*this, "maincpu") , m_audiocpu(*this, "audiocpu") , m_deco146(*this, "ioprot") @@ -36,6 +39,7 @@ private: required_shared_ptr_array m_pf_rowscroll; /* devices */ + required_device m_screen; required_device m_maincpu; required_device m_audiocpu; required_device m_deco146; diff --git a/src/mame/video/funkyjet.cpp b/src/mame/video/funkyjet.cpp index 5a6b56964f2..00bc1975d1b 100644 --- a/src/mame/video/funkyjet.cpp +++ b/src/mame/video/funkyjet.cpp @@ -13,6 +13,22 @@ uint32_t funkyjet_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { + // Similar to chinatwn and tumblep, see video/supbtime.cpp + // + // This causes a 2 pixel gap on the left side of the first stage of all worlds in funkyjet + // but allows subsequent stages to be centered and avoids corruption on the world select + // screen after each world. It also correctly aligns the graphics in sotsugyo. + // + // The 2 pixel gap on the first stage of each world has been verified to occur on hardware. + // (it can easily be seen by moving your player sprite to the far left) + // + // it is unclear where this offset comes from, but real hardware videos confirm it is needed + + m_deco_tilegen->set_scrolldx(0, 0, 1, 1); + m_deco_tilegen->set_scrolldx(0, 1, 1, 1); + m_deco_tilegen->set_scrolldx(1, 0, 1, 1); + m_deco_tilegen->set_scrolldx(1, 1, 1, 1); + uint16_t flip = m_deco_tilegen->pf_control_r(0); flip_screen_set(BIT(flip, 7));