summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/toaplan/fireshrk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/toaplan/fireshrk.cpp')
-rw-r--r--src/mame/toaplan/fireshrk.cpp822
1 files changed, 822 insertions, 0 deletions
diff --git a/src/mame/toaplan/fireshrk.cpp b/src/mame/toaplan/fireshrk.cpp
new file mode 100644
index 00000000000..505a1e345b7
--- /dev/null
+++ b/src/mame/toaplan/fireshrk.cpp
@@ -0,0 +1,822 @@
+// license:BSD-3-Clause
+// copyright-holders:Darren Olafson, Quench, Stephane Humbert
+/***************************************************************************
+
+ Toaplan Fire Shark hardware
+ ------------------------------------
+ MAME Driver by: Darren Olafson
+ Technical info: Carl-Henrik Skarstedt & Magnus Danielsson
+ Driver updates: Quench
+ Video updates : SUZ
+ Driven from toaplan/toaplan1.cpp
+
+
+Hardware info by Guru
+
+PCB Layout
+----------
+TOAPLAN Co., Ltd.
+TP-O17
+|---------------------------------------------------------|
+|MB3730 YM3812 10MHz O17_01 |
+| YM3014 MN53007 O17_02 6264 |
+|VOL LM358 |---------------| O17_03 |
+| | 68000 | O17_04 6264 |
+| 647180 |---------------| |
+| O17_12 O17_11 6264 |
+| O17_10 O17_09 2018 2018 |
+|J 6264 6264 2018 2018 6264 |
+|A O17_07 O17_05 |
+|M O17_08 O17_06 6264 |
+|M |------| |
+|A DSW1 |------| |FCU-2 | |
+| |BCU-2 | 8464 | | |
+| DSW2 | | 8464 |------| |
+| |------| 8464 PROM15 |
+| D65024 8464 6116 |
+| 8464 6116 |
+| BCU 8464 6116 |
+| 6116 8464 PROM14 |
+| 6116 8464 28MHz |
+|---------------------------------------------------------|
+Notes:
+ 68000 - Motorola MC68000P10 CPU. Clock input 10.000MHz
+ 647180 - Hitachi HD647180XOFS6 micro-controller with 16k internal OTP EPROM and 512 bytes internal RAM. Clock input 10.000MHz on pin 75
+ YM3812 - Yamaha YM3812 FM operator type-L II (OPL II) LSI (DIP24). Clock input 3.500MHz [28/8]
+ YM3014 - Yamaha YM3014 Serial Input Floating D/A Converter (DIP8)
+ 2018 - Motorola MCM2018AN45 2kx8 SRAM (NDIP24)
+ 8464 - Fujitsu MB8464A-10L 8kx8 SRAM (NDIP28)
+ 6464 - Hyundai HY6264LP-10 8kx8 SRAM (DIP28)
+ 6116 - Hyundai HY6116AP-15 2kx8 SRAM (DIP24)
+ BCU-2 - Custom graphics IC (QFP160)
+ FCU-2 - Custom graphics IC (QFP136)
+ LM358 - National Semiconductor LM358 Dual Operational Amplifier (DIP8)
+ D65024 - NEC D65024GF035 uPD65000-series CMOS Gate Array (QFP100)
+ MN53007 - Panasonic MN53007 CMOS Gate Array {732 gates} (DIP42)
+ PROM14/15 - Philips/Signetics N82S123 Bipolar PROM (DIP16)
+ MB3730 - Fujitsu MB3730 14W BTL Audio Power Amplifier
+ DSW1/2 - 8-position DIP switch
+ BCU - Unpopulated position for PGA177 IC
+ HSYNC - 14.86496kHz
+ VSYNC - 57.61308Hz
+
+
+Supported games:
+
+ ROM set Toaplan
+ name board No Game name
+ --------------------------------------------------
+ fireshrk TP-O17 Fire Shark (World) [1990]
+ fireshrka TP-O17 Fire Shark (World) [1989]
+ fireshrkd TP-O17 Fire Shark (Korea) [1990] (Easier set)
+ fireshrkdh TP-O17 Fire Shark (Korea) [1990] (Harder set)
+ samesame TP-O17 Same! Same! Same! (Japan) [1989] (1 Player version)
+ samesame2 TP-O17 Same! Same! Same! (Japan) [1989] (2 Player version)
+ samesamecn TP-O17 Jiao! Jiao! Jiao! (China) [1990]
+
+
+Notes:
+ Fire Shark and clones have a hidden function for the
+ service input. When invulnerability is enabled, pressing the
+ service input makes the screen scroll faster.
+
+***************************************************************************/
+
+#include "emu.h"
+
+#include "toaplan_bcu.h"
+#include "toaplan_fcu.h"
+#include "toaplan_video_controller.h"
+
+#include "cpu/m68000/m68000.h"
+#include "cpu/z180/hd647180x.h"
+#include "machine/gen_latch.h"
+#include "sound/ymopl.h"
+
+#include "emupal.h"
+#include "screen.h"
+#include "speaker.h"
+
+namespace {
+
+class fireshrk_state : public driver_device
+{
+public:
+ fireshrk_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_audiocpu(*this, "audiocpu"),
+ m_ymsnd(*this, "ymsnd"),
+ m_fcu(*this, "fcu"),
+ m_bcu(*this, "bcu"),
+ m_vctrl(*this, "vctrl"),
+ m_soundlatch(*this, "soundlatch"),
+ m_screen(*this, "screen"),
+ m_palette(*this, "palette_%u", 0U),
+ m_paletteram(*this, "paletteram_%u", 0U, 0x800U, ENDIANNESS_BIG),
+ m_spriteram(*this, "spriteram", 0x800, ENDIANNESS_BIG),
+ m_spritesizeram(*this, "spritesizeram", 0x80, ENDIANNESS_BIG),
+ m_tjump_io(*this, "TJUMP")
+ { }
+
+ void fireshrk(machine_config &config) ATTR_COLD;
+
+protected:
+ virtual void machine_reset() override ATTR_COLD;
+
+private:
+ required_device<m68000_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ required_device<ym3812_device> m_ymsnd;
+ required_device<toaplan_fcu_device> m_fcu;
+ required_device<toaplan_bcu_device> m_bcu;
+ required_device<toaplan_video_controller_device> m_vctrl;
+ required_device<generic_latch_8_device> m_soundlatch;
+ required_device<screen_device> m_screen;
+ required_device_array<palette_device, 2> m_palette;
+
+ memory_share_array_creator<u16, 2> m_paletteram;
+
+ memory_share_creator<u16> m_spriteram;
+ memory_share_creator<u16> m_spritesizeram;
+
+ required_ioport m_tjump_io;
+
+ void coin_w(u8 data);
+
+ u8 cmdavailable_r();
+ u8 port_6_word_r();
+
+ void pri_cb(u8 priority, u32 &pri_mask);
+ u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void screen_vblank(int state);
+
+ void reset_callback(int state);
+
+ void main_map(address_map &map) ATTR_COLD;
+ void sound_io_map(address_map &map) ATTR_COLD;
+};
+
+
+/***************************************************************************
+ Sprite Handlers
+***************************************************************************/
+
+void fireshrk_state::pri_cb(u8 priority, u32 &pri_mask)
+{
+ // ~0 for behind tilemap in same priority
+ pri_mask = (~u32(0)) << priority;
+}
+
+
+/***************************************************************************
+ Draw the game screen in the given bitmap.
+***************************************************************************/
+
+u32 fireshrk_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ screen.priority().fill(0, cliprect);
+
+ // first draw everything, including "disabled" tiles and priority 0
+ m_bcu->draw_background(screen, bitmap, cliprect, 0, 0);
+
+ // then draw the higher priority layers in order
+ for (int priority = 1; priority < 16; priority++)
+ {
+ m_bcu->draw_tilemap(screen, bitmap, cliprect, TILEMAP_DRAW_CATEGORY(priority), priority, 0);
+ }
+
+ m_fcu->draw_sprites(screen, bitmap, cliprect);
+ return 0;
+}
+
+/****************************************************************************
+ Spriteram is always 1 frame ahead, suggesting spriteram buffering.
+ There are no CPU output registers that control this so we
+ assume it happens automatically every frame, at the end of vblank
+****************************************************************************/
+
+void fireshrk_state::screen_vblank(int state)
+{
+ // rising edge
+ if (state)
+ {
+ if (m_vctrl->intenable())
+ m_maincpu->set_input_line(4, HOLD_LINE);
+ m_maincpu->set_input_line(M68K_IRQ_2, HOLD_LINE); // Frame done
+ }
+}
+
+u8 fireshrk_state::port_6_word_r()
+{
+ /* Bit 0x80 is secondary CPU (HD647180) ready signal */
+ return (m_soundlatch->pending_r() ? 0 : 0x80) | m_tjump_io->read();
+}
+
+void fireshrk_state::coin_w(u8 data)
+{
+ // Upper 4 bits are junk (normally 1110 or 0000, which are artifacts of sound command processing)
+ machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
+ machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
+ machine().bookkeeping().coin_lockout_w(0, !BIT(data, 2));
+ machine().bookkeeping().coin_lockout_w(1, !BIT(data, 3));
+}
+
+void fireshrk_state::reset_callback(int state)
+{
+ m_ymsnd->reset();
+ m_audiocpu->pulse_input_line(INPUT_LINE_RESET, attotime::zero);
+ m_soundlatch->acknowledge_w();
+}
+
+/***************************** 68000 Memory Map *****************************/
+
+void fireshrk_state::main_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).rom();
+ map(0x040000, 0x07ffff).rom();
+ map(0x080000, 0x080003).w(m_bcu, FUNC(toaplan_bcu_device::tile_offsets_w));
+ map(0x080006, 0x080006).w(m_fcu, FUNC(toaplan_fcu_device::flipscreen_w));
+ map(0x0c0000, 0x0c3fff).ram(); /* Frame done at $c1ada */
+ map(0x100000, 0x107fff).m(m_vctrl, FUNC(toaplan_video_controller_device::host_map));
+ map(0x140000, 0x140001).portr("P1");
+ map(0x140002, 0x140003).portr("P2");
+ map(0x140004, 0x140005).portr("DSWA");
+ map(0x140006, 0x140007).portr("DSWB");
+ map(0x140008, 0x140009).portr("SYSTEM");
+ map(0x14000b, 0x14000b).r(FUNC(fireshrk_state::port_6_word_r)); /* Territory, and MCU ready */
+ map(0x14000d, 0x14000d).w(FUNC(fireshrk_state::coin_w)); /* Coin counter/lockout */
+// map(0x14000e, 0x14000f).nopr(); // irq ack?
+ map(0x14000f, 0x14000f).w(m_soundlatch, FUNC(generic_latch_8_device::write)); /* Commands sent to HD647180 */
+ map(0x180000, 0x18001f).m(m_bcu, FUNC(toaplan_bcu_device::host_map));
+ map(0x1c0000, 0x1c0007).m(m_fcu, FUNC(toaplan_fcu_device::host_map));
+}
+
+u8 fireshrk_state::cmdavailable_r()
+{
+ return m_soundlatch->pending_r() ? 1 : 0;
+}
+
+void fireshrk_state::sound_io_map(address_map &map)
+{
+ map.unmap_value_high();
+ map.global_mask(0xff);
+
+ map(0x63, 0x63).nopr(); // read port D
+ map(0x80, 0x81).rw(m_ymsnd, FUNC(ym3812_device::read), FUNC(ym3812_device::write));
+ map(0xa0, 0xa0).r(m_soundlatch, FUNC(generic_latch_8_device::read));
+ map(0xb0, 0xb0).w(m_soundlatch, FUNC(generic_latch_8_device::acknowledge_w));
+}
+
+/*****************************************************************************
+ Input Port definitions
+*****************************************************************************/
+
+static INPUT_PORTS_START( fireshrk )
+ PORT_START("VBLANK")
+ PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("screen", FUNC(screen_device::vblank))
+ PORT_BIT( 0xfffe, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("P2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_START("DSWA") /* DSW A */
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!1") // No upright/cocktail DIPSW in fireshrk
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:!2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_SERVICE( 0x04, IP_ACTIVE_HIGH ) PORT_DIPLOCATION("SW1:!3")
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:!4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:!5,!6")
+ PORT_DIPSETTING( 0x30, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:!7,!8")
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_6C ) )
+
+ PORT_START("DSWB") /* DSW B */
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:!1,!2")
+ PORT_DIPSETTING( 0x01, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:!3,!4")
+ PORT_DIPSETTING( 0x04, "50K, every 150K" )
+ PORT_DIPSETTING( 0x00, "70K, every 200K" )
+ PORT_DIPSETTING( 0x08, "100K" )
+ PORT_DIPSETTING( 0x0c, DEF_STR( None ) )
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:!5,!6")
+ PORT_DIPSETTING( 0x30, "2" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x20, "4" )
+ PORT_DIPSETTING( 0x10, "5" )
+ PORT_DIPNAME( 0x40, 0x00, "Invulnerability" ) PORT_DIPLOCATION("SW2:!7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:!8")
+ PORT_DIPSETTING( 0x80, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_TILT )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("screen", FUNC(screen_device::vblank))
+
+ PORT_START("TJUMP") /* Territory Jumper Block */
+ PORT_DIPNAME( 0x01, 0x00, "Show Territory Notice" ) PORT_DIPLOCATION("JMPR:!1") // When NO is selected, the region reverts to Europe
+ PORT_DIPSETTING( 0x01, DEF_STR( No ) ) // regardless of which region is selected
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x06, 0x02, DEF_STR( Region ) ) PORT_DIPLOCATION("JMPR:!2,!3")
+ PORT_DIPSETTING( 0x02, DEF_STR( Europe ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( USA ) )
+ PORT_DIPSETTING( 0x00, "USA (Romstar)" )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( fireshrka ) /* No "Romstar" license */
+ PORT_INCLUDE( fireshrk )
+
+ PORT_MODIFY("TJUMP") /* Territory Jumper Block */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Region ) ) PORT_DIPLOCATION("JMPR:!1,!2")
+ PORT_DIPSETTING( 0x03, DEF_STR( Europe ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Europe ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Europe ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( USA ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( samesame )
+ PORT_INCLUDE( fireshrk )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_COCKTAIL PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_COCKTAIL PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_COCKTAIL PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_COCKTAIL PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_COCKTAIL
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_COCKTAIL
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) \
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+
+ PORT_MODIFY("DSWA") /* DSW A */
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:!1")
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Upright ) )
+ PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!5")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!6")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:!8")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+/* settings listed in service mode, but not actually used ???
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) )
+*/
+
+ PORT_MODIFY("TJUMP") /* Territory Jumper Block */
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!1")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( samesame2 )
+ PORT_INCLUDE( fireshrk )
+
+ PORT_MODIFY("TJUMP") /* Territory Jumper Block */
+/* settings listed in service mode, but not actually used
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Region ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Europe ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( USA ) )
+*/
+ PORT_DIPNAME( 0x03, 0x00, "Show Territory Notice" ) PORT_DIPLOCATION("JMPR:!1,!2")
+ PORT_DIPSETTING( 0x03, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( jiaojiao )
+ PORT_INCLUDE( fireshrk )
+
+ PORT_MODIFY("DSWA") /* DSW A */
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:!5,!6")
+ PORT_DIPSETTING( 0x30, DEF_STR( 4C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x30, DEF_STR( 2C_3C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:!7,!8")
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_3C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x80, DEF_STR( 1C_4C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_6C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x01)
+ PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0xc0, DEF_STR( 2C_3C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+ PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) PORT_CONDITION("TJUMP", 0x01, EQUALS, 0x00)
+
+ PORT_MODIFY("TJUMP") /* Territory Jumper Block */
+ PORT_DIPNAME( 0x01, 0x00, "Coinage Style" ) PORT_DIPLOCATION("JMPR:!1")
+ PORT_DIPSETTING( 0x01, "Fire Shark" )
+ PORT_DIPSETTING( 0x00, "Same! Same! Same!" )
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!2")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!3")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("JMPR:!4")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+static const gfx_layout tilelayout =
+{
+ 8,8, /* 8x8 */
+ RGN_FRAC(1,2), /* 16384/32768 tiles */
+ 4, /* 4 bits per pixel */
+ { RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
+ { STEP8(0,1) },
+ { STEP8(0,8*2) },
+ 16*8 /* every tile takes 16 consecutive bytes */
+};
+
+
+static GFXDECODE_START( gfx_bcu )
+ GFXDECODE_ENTRY( "tiles", 0, tilelayout, 0, 64 )
+GFXDECODE_END
+
+static GFXDECODE_START( gfx_fcu )
+ GFXDECODE_ENTRY( "sprites", 0, tilelayout, 0, 64 )
+GFXDECODE_END
+
+
+void fireshrk_state::machine_reset()
+{
+ machine().bookkeeping().coin_lockout_global_w(0);
+}
+
+
+void fireshrk_state::fireshrk(machine_config &config)
+{
+ /* basic machine hardware */
+ M68000(config, m_maincpu, XTAL(10'000'000));
+ m_maincpu->set_addrmap(AS_PROGRAM, &fireshrk_state::main_map);
+ m_maincpu->reset_cb().set(FUNC(fireshrk_state::reset_callback));
+
+ hd647180x_device &audiocpu(HD647180X(config, m_audiocpu, XTAL(10'000'000))); // HD647180XOFS6 CPU
+ // 16k byte ROM and 512 byte RAM are internal
+ audiocpu.set_addrmap(AS_IO, &fireshrk_state::sound_io_map);
+ audiocpu.in_pd_callback().set(FUNC(fireshrk_state::cmdavailable_r));
+
+ GENERIC_LATCH_8(config, m_soundlatch).set_separate_acknowledge(true);
+
+ config.set_maximum_quantum(attotime::from_hz(600));
+
+ /* video hardware */
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_video_attributes(VIDEO_UPDATE_BEFORE_VBLANK);
+ // Parameter uploaded to CRTC
+ m_screen->set_raw(XTAL(28'000'000) / 4, (224+1)*2, 0, 320, (134+1)*2, 0, 240);
+ m_screen->set_screen_update(FUNC(fireshrk_state::screen_update));
+ m_screen->screen_vblank().set(m_fcu, FUNC(toaplan_fcu_device::vblank));
+ m_screen->screen_vblank().append(FUNC(fireshrk_state::screen_vblank));
+
+ PALETTE(config, m_palette[0]).set_format(palette_device::xBGR_555, 0x400);
+ PALETTE(config, m_palette[1]).set_format(palette_device::xBGR_555, 0x400);
+
+ TOAPLAN_BCU(config, m_bcu, XTAL(28'000'000), m_palette[0], gfx_bcu);
+ m_bcu->set_offset(-0x1ef, -0x101, -0x11, -0xff);
+
+ TOAPLAN_FCU(config, m_fcu, XTAL(28'000'000), m_palette[1], gfx_fcu);
+ m_fcu->set_spriteram_tag(m_spriteram);
+ m_fcu->set_spritesizeram_tag(m_spritesizeram);
+ m_fcu->set_pri_callback(FUNC(fireshrk_state::pri_cb));
+ m_fcu->frame_done_cb().set(m_screen, FUNC(screen_device::vblank));
+
+ TOAPLAN_VIDEO_CONTROLLER(config, m_vctrl, XTAL(28'000'000));
+ m_vctrl->set_screen(m_screen);
+ m_vctrl->set_palette_tag(0, m_palette[0]);
+ m_vctrl->set_palette_tag(1, m_palette[1]);
+ m_vctrl->set_paletteram_tag(0, m_paletteram[0]);
+ m_vctrl->set_paletteram_tag(1, m_paletteram[1]);
+ m_vctrl->set_byte_per_color(0, 2);
+ m_vctrl->set_byte_per_color(1, 2);
+ m_vctrl->vblank_callback().set_ioport("VBLANK");
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+
+ YM3812(config, m_ymsnd, XTAL(28'000'000) / 8);
+ m_ymsnd->irq_handler().set_inputline(m_audiocpu, 0);
+ m_ymsnd->add_route(ALL_OUTPUTS, "mono", 1.0);
+}
+
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+ROM_START( fireshrk )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "09.8j", 0x000000, 0x08000, CRC(f0c70e6f) SHA1(037690448786d61aa116b24b638430c577ea78e2) )
+ ROM_LOAD16_BYTE( "10.8l", 0x000001, 0x08000, CRC(9d253d77) SHA1(0414d1f475abb9ccfd7daa11c2f400a14f25db09) )
+ ROM_LOAD16_BYTE( "o17_11ii.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) )
+ ROM_LOAD16_BYTE( "o17_12ii.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( fireshrka )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09ii.8j", 0x000000, 0x08000, CRC(b60541ee) SHA1(e4fb752073c99a83939ebc45307777b94519f01c) )
+ ROM_LOAD16_BYTE( "o17_10ii.8l", 0x000001, 0x08000, CRC(96f5045e) SHA1(16cf2f4d55570cf0489a426d6e841d2968f9423a) )
+ ROM_LOAD16_BYTE( "o17_11ii.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) )
+ ROM_LOAD16_BYTE( "o17_12ii.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( fireshrkd )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09dyn.8j",0x000000, 0x10000, CRC(e25eee27) SHA1(1ff3f838123180a0b6672c9beee6c0f0092a0f94) ) // Identical halves
+ ROM_LOAD16_BYTE( "o17_10dyn.8l",0x000001, 0x10000, CRC(c4c58cf6) SHA1(5867ecf66cd6c16cfcc54a581d3f4a8b666fd839) ) // Identical halves
+ ROM_LOAD16_BYTE( "o17_11ii.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) )
+ ROM_LOAD16_BYTE( "o17_12ii.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( fireshrkdh )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09dyh.8j",0x000000, 0x10000, CRC(7b4c14dd) SHA1(d40dcf223f16c0f507aeb282d1524dbf1349c536) ) /* Identical halves */
+ ROM_LOAD16_BYTE( "o17_10dyh.8l",0x000001, 0x10000, CRC(a3f159f9) SHA1(afc9630ca38da730f7cf4954d1333954e8d75787) ) /* Identical halves */
+ ROM_LOAD16_BYTE( "o17_11ii.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) )
+ ROM_LOAD16_BYTE( "o17_12ii.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( samesame )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09.8j", 0x000000, 0x08000, CRC(3f69e437) SHA1(f2a40fd42cb5ecb2e514b72e7550aa479a9f9ad6) )
+ ROM_LOAD16_BYTE( "o17_10.8l", 0x000001, 0x08000, CRC(4e723e0a) SHA1(e06394d50addeda1045c02c646964afbc6005a82) )
+ ROM_LOAD16_BYTE( "o17_11.7j", 0x040000, 0x20000, CRC(be07d101) SHA1(1eda14ba24532b565d6ad57490b73ff312f98b53) )
+ ROM_LOAD16_BYTE( "o17_12.7l", 0x040001, 0x20000, CRC(ef698811) SHA1(4c729704eba0bf469599c79009327e4fa5dc540b) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( samesame2 )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09x.8j", 0x000000, 0x08000, CRC(3472e03e) SHA1(a0f12622a1963bfac2d5f357afbfb5d7db2cd8df) )
+ ROM_LOAD16_BYTE( "o17_10x.8l", 0x000001, 0x08000, CRC(a3ac49b5) SHA1(c5adf026b9129b64acee5a079e102377a8488220) )
+ ROM_LOAD16_BYTE( "o17_11ii.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) )
+ ROM_LOAD16_BYTE( "o17_12ii.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( samesamecn )
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17-09-h2.8j",0x000000, 0x08000, CRC(fc8c2420) SHA1(cf8333d3749213f2007467d3a80bd36ff7b4ce92) ) // The actual label is stamped with the letter "H" and separate "2"
+ ROM_LOAD16_BYTE( "o17-10-h2.8l",0x000001, 0x08000, CRC(cc0ffbeb) SHA1(1cf85f68b4e368294069053ba8f5710d6c557ede) ) // The actual label is stamped with the letter "H" and separate "2"
+ ROM_LOAD16_BYTE( "o17-11-2.7j", 0x040000, 0x20000, CRC(6beac378) SHA1(041ba98a89a4bac32575858db8a061bdf7804594) ) // The actual label is stamped with the number "2"
+ ROM_LOAD16_BYTE( "o17-12-2.7l", 0x040001, 0x20000, CRC(6adb6eb5) SHA1(9b6e63aa50d271c2bb0b4cf822fc6f3684f10230) ) // The actual label is stamped with the number "2"
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+ROM_START( samesamenh ) /* this hack has been used on various PCBs */
+ ROM_REGION( 0x080000, "maincpu", 0 ) // Main 68K code
+ ROM_LOAD16_BYTE( "o17_09_nv.8j", 0x000000, 0x08000, CRC(f60af2f9) SHA1(ce41efd5ca4f4adc8bf1976f61a8a8d357fb234a) )
+ ROM_LOAD16_BYTE( "o17_10_nv.8l", 0x000001, 0x08000, CRC(023bcb95) SHA1(69a051fb223e6cacaf1cda8bf5430933d24fb8a7) )
+ ROM_LOAD16_BYTE( "o17_11.7j", 0x040000, 0x20000, CRC(be07d101) SHA1(1eda14ba24532b565d6ad57490b73ff312f98b53) )
+ ROM_LOAD16_BYTE( "o17_12.7l", 0x040001, 0x20000, CRC(ef698811) SHA1(4c729704eba0bf469599c79009327e4fa5dc540b) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 ) // HD647180 (Z180) with internal ROM
+ ROM_LOAD( "hd647180_tp-017.8m", 0x00000, 0x08000, CRC(43523032) SHA1(1b94003a00e7bf6bdf1b1b946f42ff5d04629949) )
+
+ ROM_REGION( 0x80000, "tiles", 0 )
+ ROM_LOAD16_BYTE( "o17_05.12j", 0x00000, 0x20000, CRC(565315f8) SHA1(6b1c5ef52359483228b329c89c2e1174e3fbf017) )
+ ROM_LOAD16_BYTE( "o17_06.13j", 0x00001, 0x20000, CRC(95262d4c) SHA1(16f3aabecb1c87ce7eadf4f0ff61b29a4c017614) )
+ ROM_LOAD16_BYTE( "o17_07.12l", 0x40000, 0x20000, CRC(4c4b735c) SHA1(812c3bf46bd7764b2bb812bd2b9eb0331ed257ae) )
+ ROM_LOAD16_BYTE( "o17_08.13l", 0x40001, 0x20000, CRC(95c6586c) SHA1(ff87901f79d80f73ad09664b0c0d892898570616) )
+
+ ROM_REGION( 0x80000, "sprites", 0 )
+ ROM_LOAD16_BYTE( "o17_01.1d", 0x00000, 0x20000, CRC(ea12e491) SHA1(02190722b7c5383471e0af9596be7039a5367240) )
+ ROM_LOAD16_BYTE( "o17_02.3d", 0x00001, 0x20000, CRC(32a13a9f) SHA1(1446acdfd21cd41f3d97aaf30f498c0c5d890605) )
+ ROM_LOAD16_BYTE( "o17_03.5d", 0x40000, 0x20000, CRC(68723dc9) SHA1(4f1b7aa2469c955e03737b611a7d2524f1e4f61e) )
+ ROM_LOAD16_BYTE( "o17_04.7d", 0x40001, 0x20000, CRC(fe0ecb13) SHA1(634a49262b9c092c25f11b14c6757fe94ea9eddc) )
+
+ ROM_REGION( 0x40, "proms", 0 ) // nibble BPROMs, lo/hi order to be determined
+ ROM_LOAD( "prom14.25b", 0x00, 0x20, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) // sprite attribute (flip/position) ??
+ ROM_LOAD( "prom15.20c", 0x20, 0x20, CRC(a1e17492) SHA1(9ddec4c97f2d541f69f3c32c47aaa21fd9699ae2) ) // ???
+ROM_END
+
+} // Anonymous namespace
+
+
+// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS
+GAME( 1990, fireshrk, 0, fireshrk, fireshrk, fireshrk_state, empty_init, ROT270, "Toaplan", "Fire Shark", 0 )
+GAME( 1989, fireshrka, fireshrk, fireshrk, fireshrka, fireshrk_state, empty_init, ROT270, "Toaplan", "Fire Shark (earlier)", 0 )
+GAME( 1990, fireshrkd, fireshrk, fireshrk, samesame2, fireshrk_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 1, easier)", 0 )
+GAME( 1990, fireshrkdh, fireshrk, fireshrk, samesame2, fireshrk_state, empty_init, ROT270, "Toaplan (Dooyong license)", "Fire Shark (Korea, set 2, harder)", 0 )
+GAME( 1989, samesame, fireshrk, fireshrk, samesame, fireshrk_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (Japan, 1P set)", 0 )
+GAME( 1989, samesame2, fireshrk, fireshrk, samesame2, fireshrk_state, empty_init, ROT270, "Toaplan", "Same! Same! Same! (Japan, 2P set)", 0 )
+GAME( 1990, samesamecn, fireshrk, fireshrk, jiaojiao, fireshrk_state, empty_init, ROT270, "Toaplan (Hong Kong Honest Trading license)", "Jiao! Jiao! Jiao! (China)", 0 )
+GAME( 2015, samesamenh, fireshrk, fireshrk, samesame, fireshrk_state, empty_init, ROT270, "hack (trap15)", "Same! Same! Same! (Japan, 1P set, NEW VER! hack)", 0 )