summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/funybubl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/funybubl.cpp')
-rw-r--r--src/mame/drivers/funybubl.cpp314
1 files changed, 314 insertions, 0 deletions
diff --git a/src/mame/drivers/funybubl.cpp b/src/mame/drivers/funybubl.cpp
new file mode 100644
index 00000000000..6f96d3a482f
--- /dev/null
+++ b/src/mame/drivers/funybubl.cpp
@@ -0,0 +1,314 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+/*
+
+Funny Bubble ...
+
+It's a Puzzloop (Lup Lup Puzzle) rip-off .. but with two Z80 CPUs
+
+The program roms say omega 1997
+ Omega made Super Lup Lup Puzzle/Lup Lup Puzzle/Puzzle Bang Bang see vamphalf.c
+ These games copy the game play of Puzzloop but add adult picture backgrounds.
+
+The gfx roms say 1999
+Title screen has no date
+
+( a z80 as the main cpu in 1999 ??! )
+
+Did In Chang Electronic Co do the "original" version of Funny Bubble?
+ Comad either hacked or licensed it. As "In Chang Electronic" are
+ spelled out in the default high score table ;-)
+
+todo :
+ convert to tilemaps
+
+
+ +-----------------------------------------+
+ | 8MHz M6295 SU12 UG1 UG3 |
+ | SU13 UG2 UG4 |
+++ 6116 Z80 |
+| SU6 |
+|J 6116 6116 |
+|A 6116 A1020B 6116 |
+|M 6116 UM6264 6116 |
+|M |
+|A SW2* SW4* |
+| |
+| SW1 SW3* UG13 UG16 |
+++ UB16 UH13 UG16 |
+ | UM6264 UG15 UG17 |
+ | Z80 30MHz 12MHZ UH15 UH17 |
+ +-----------------------------------------+
+
+ Z80: ZiLOG Z0840006PSC (6MHz rated) - Both Z80s
+A1020B: Actel A1020B PL84C
+ M6295: OKI M6295 (badged as AD-65)
+
+Note: SW2, SW3 & SW4 not populated
+
+*/
+
+
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "sound/okim6295.h"
+#include "includes/funybubl.h"
+
+
+WRITE8_MEMBER(funybubl_state::funybubl_vidram_bank_w)
+{
+ membank("bank1")->set_entry(data & 1);
+}
+
+WRITE8_MEMBER(funybubl_state::funybubl_cpurombank_w)
+{
+ membank("bank2")->set_entry(data & 0x3f); // should we add a check that (data&0x3f) < #banks?
+}
+
+
+WRITE8_MEMBER(funybubl_state::funybubl_soundcommand_w)
+{
+ soundlatch_byte_w(space, 0, data);
+ m_audiocpu->set_input_line(0, HOLD_LINE);
+}
+
+WRITE8_MEMBER(funybubl_state::funybubl_oki_bank_sw)
+{
+ m_oki->set_bank_base(((data & 1) * 0x40000));
+}
+
+
+static ADDRESS_MAP_START( funybubl_map, AS_PROGRAM, 8, funybubl_state )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank2") // banked port 1?
+ AM_RANGE(0xc400, 0xcfff) AM_RAM_WRITE(funybubl_paldatawrite) AM_SHARE("paletteram") // palette
+ AM_RANGE(0xd000, 0xdfff) AM_RAMBANK("bank1") // banked port 0?
+ AM_RANGE(0xe000, 0xffff) AM_RAM
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( io_map, AS_IO, 8, funybubl_state )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x00) AM_READ_PORT("SYSTEM") AM_WRITE(funybubl_vidram_bank_w) // vidram bank
+ AM_RANGE(0x01, 0x01) AM_READ_PORT("P1") AM_WRITE(funybubl_cpurombank_w) // rom bank?
+ AM_RANGE(0x02, 0x02) AM_READ_PORT("P2")
+ AM_RANGE(0x03, 0x03) AM_READ_PORT("DSW") AM_WRITE(funybubl_soundcommand_w)
+ AM_RANGE(0x06, 0x06) AM_READNOP /* Nothing is done with the data read */
+ AM_RANGE(0x06, 0x06) AM_WRITENOP /* Written directly after IO port 0 */
+ AM_RANGE(0x07, 0x07) AM_WRITENOP /* Reset something on startup - Sound CPU ?? */
+ADDRESS_MAP_END
+
+/* Sound CPU */
+
+static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, funybubl_state )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0x87ff) AM_RAM
+ AM_RANGE(0x9000, 0x9000) AM_WRITE(funybubl_oki_bank_sw)
+ AM_RANGE(0x9800, 0x9800) AM_DEVREADWRITE("oki", okim6295_device, read, write)
+ AM_RANGE(0xa000, 0xa000) AM_READ(soundlatch_byte_r)
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( funybubl )
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+
+ PORT_START("P1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+
+ PORT_START("P2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
+
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
+ PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 3C_2C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Free_Play) )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:4,5,6")
+ PORT_DIPSETTING( 0x30, DEF_STR( Very_Easy) )
+ PORT_DIPSETTING( 0x28, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x38, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x20, "Hard 1" )
+ PORT_DIPSETTING( 0x18, "Hard 2" )
+ PORT_DIPSETTING( 0x10, "Hard 3" )
+ PORT_DIPSETTING( 0x08, "Hard 4" )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x00, "Nudity" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x80, "Semi" )
+ PORT_DIPSETTING( 0x00, "Full" )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout tiles16x16x8_1_layout =
+{
+ 8,8,
+ RGN_FRAC(1,8),
+ 8,
+ { RGN_FRAC(3,8),RGN_FRAC(2,8),RGN_FRAC(1,8),RGN_FRAC(0,8),RGN_FRAC(7,8),RGN_FRAC(6,8),RGN_FRAC(5,8), RGN_FRAC(4,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
+};
+
+static const gfx_layout tiles16x16x8_2_layout =
+{
+ 16,16,
+ RGN_FRAC(1,4),
+ 8,
+ { RGN_FRAC(3,4)+4,RGN_FRAC(3,4)+0, RGN_FRAC(2,4)+4, RGN_FRAC(2,4)+0, RGN_FRAC(1,4)+4, RGN_FRAC(1,4)+0, RGN_FRAC(0,4)+4, RGN_FRAC(0,4)+0 },
+ { 0, 1,2,3, 8,9,10,11, 256,257,258,259, 264,265,266,267},
+ { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
+ 8*16, 9*16,10*16,11*16,12*16,13*16,14*16,15*16 },
+ 32*16
+};
+
+
+static GFXDECODE_START( funybubl )
+ GFXDECODE_ENTRY( "gfx1", 0, tiles16x16x8_1_layout, 0, 16 )
+ GFXDECODE_ENTRY( "gfx2", 0, tiles16x16x8_2_layout, 0, 16 )
+GFXDECODE_END
+
+
+
+void funybubl_state::machine_start()
+{
+ UINT8 *ROM = memregion("maincpu")->base();
+
+
+ save_item(NAME(m_banked_vram));
+
+ membank("bank1")->configure_entries(0, 2, &m_banked_vram[0x0000], 0x1000);
+ membank("bank2")->configure_entries(0, 0x10, ROM, 0x4000);
+
+ membank("bank1")->set_entry(0);
+}
+
+
+static MACHINE_CONFIG_START( funybubl, funybubl_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz?? */
+ MCFG_CPU_PROGRAM_MAP(funybubl_map)
+ MCFG_CPU_IO_MAP(io_map)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", funybubl_state, irq0_line_hold)
+
+ MCFG_CPU_ADD("audiocpu", Z80,8000000/2) /* 4 MHz?? */
+ MCFG_CPU_PROGRAM_MAP(sound_map)
+
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(512, 256)
+ MCFG_SCREEN_VISIBLE_AREA(12*8, 512-12*8-1, 16, 256-16-1)
+// MCFG_SCREEN_VISIBLE_AREA(0*8, 512-1, 0, 256-1)
+ MCFG_SCREEN_UPDATE_DRIVER(funybubl_state, screen_update_funybubl)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", funybubl)
+ MCFG_PALETTE_ADD("palette", 0x400)
+
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_OKIM6295_ADD("oki", 1056000, OKIM6295_PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+
+ROM_START( funybubl )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* main z80, lots of banked data */
+ ROM_LOAD( "a.ub16", 0x00000, 0x40000, CRC(4e799cdd) SHA1(c6474fd2f621c27224e847ecb88a1ae17a0dbaf9) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_INVERT ) // bg gfx 8x8x8
+ ROM_LOAD( "f.ug13", 0x000000, 0x40000, CRC(64d7163d) SHA1(2619ac96e05779ea23c7f0f71665d284c79ba72f) )
+ ROM_LOAD( "g.uh13", 0x040000, 0x40000, CRC(6891e2b8) SHA1(ca711019e5c330759d2a90024dbc0e6731b6227f) )
+ ROM_LOAD( "h.ug15", 0x080000, 0x40000, CRC(ca7f7528) SHA1(6becfe8fabd19443a13b948838f41e10e5c9dc87) )
+ ROM_LOAD( "i.uh15", 0x0c0000, 0x40000, CRC(23608ec6) SHA1(1c0a5d6e300f9a1abfda73d6a6a31e29a42b30ad) )
+ ROM_LOAD( "l.ug16", 0x100000, 0x40000, CRC(0acf8143) SHA1(f49f45496b870d1f51f09a4dda8c5bb7763c40d3) )
+ ROM_LOAD( "m.uh16", 0x140000, 0x40000, CRC(55ed8d9c) SHA1(f17bb4d02d4eedc2f297bb008be2fa340bc321d2) )
+ ROM_LOAD( "n.ug17", 0x180000, 0x40000, CRC(52398b68) SHA1(522baa8123998e9161fa1ccaf760ac006c5be2dd) )
+ ROM_LOAD( "o.uh17", 0x1c0000, 0x40000, CRC(446e31b2) SHA1(7f37a7090c83f2c9b07f1993707540fb32bbed35) )
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_INVERT )
+ ROM_LOAD( "d.ug1", 0x000000, 0x80000, CRC(b7ebbc00) SHA1(92520fda2f8f242b8cd49aeaac21b279f48276bf) ) /* Same as below, different labels */
+ ROM_LOAD( "e.ug2", 0x080000, 0x80000, CRC(28afc396) SHA1(555d51948ffb237311112dcfd0516a43f603ff03) )
+ ROM_LOAD( "j.ug3", 0x100000, 0x80000, CRC(9e8687cd) SHA1(42fcba2532ae5028fcfc1df50750d99ad2586820) )
+ ROM_LOAD( "k.ug4", 0x180000, 0x80000, CRC(63f0e810) SHA1(5c7ed32ee8dc1d9aabc8d136ec370471096356c2) )
+
+ ROM_REGION( 0x08000, "audiocpu", 0 ) /* sound z80 (not much code here ..) */
+ ROM_LOAD( "p.su6", 0x00000, 0x08000, CRC(33169d4d) SHA1(0ebc932d15b6df022c7e1f44df884e64b25ba745) ) /* Same as below, different label */
+
+ ROM_REGION( 0x80000, "oki", 0 )
+ ROM_LOAD( "b.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) ) /* Same as below, different label */
+ ROM_RELOAD( 0x40000, 0x20000 )
+ ROM_LOAD( "c.su13", 0x20000, 0x20000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) ) /* Same as below, different label */
+ ROM_CONTINUE( 0x60000, 0x20000 )
+ROM_END
+
+ROM_START( funybublc )
+ ROM_REGION( 0x40000, "maincpu", 0 ) /* main z80, lots of banked data */
+ ROM_LOAD( "2.ub16", 0x00000, 0x40000, CRC(d684c13f) SHA1(6a58b44dd775f374d6fd476a8fd175c28a83a495) )
+
+ ROM_REGION( 0x200000, "gfx1", ROMREGION_INVERT ) // bg gfx 8x8x8
+ ROM_LOAD( "7.ug12", 0x000000, 0x40000, CRC(87603d7b) SHA1(21aec4cd011691f8608c3ddab83697bd89634fc8) )
+ ROM_LOAD( "8.uh13", 0x040000, 0x40000, CRC(ab6031bd) SHA1(557793817f98c07c82caab4293aed7dffa4dbf7b) )
+ ROM_LOAD( "9.ug15", 0x080000, 0x40000, CRC(0e8352ff) SHA1(29679a7ece2585e1a66296439b68bd56c937e313) )
+ ROM_LOAD( "10.uh15", 0x0c0000, 0x40000, CRC(df7dd356) SHA1(13b9f40714dfa7b8cebc0191dcdde88b51f5e78c) )
+ ROM_LOAD( "13.ug16", 0x100000, 0x40000, CRC(9f57bdd5) SHA1(6fd60da5f5eee0251e3a08957952ed9f037eeaec) )
+ ROM_LOAD( "14.uh16", 0x140000, 0x40000, CRC(2ac15ea3) SHA1(de5be6378b4b6eee6faf532c9ef14bd609041cb3) )
+ ROM_LOAD( "15.ug17", 0x180000, 0x40000, CRC(9a5e66a6) SHA1(cbe727e4f1e9a7072520d2e30eb0047cc67bff1b) )
+ ROM_LOAD( "16.uh17", 0x1c0000, 0x40000, CRC(218060b3) SHA1(35124afce7f0f998b5c4761bbc888235de4e56ef) )
+
+ ROM_REGION( 0x200000, "gfx2", ROMREGION_INVERT )
+ ROM_LOAD( "5.ug1", 0x000000, 0x80000, CRC(b7ebbc00) SHA1(92520fda2f8f242b8cd49aeaac21b279f48276bf) )
+ ROM_LOAD( "6.ug2", 0x080000, 0x80000, CRC(28afc396) SHA1(555d51948ffb237311112dcfd0516a43f603ff03) )
+ ROM_LOAD( "11.ug3", 0x100000, 0x80000, CRC(9e8687cd) SHA1(42fcba2532ae5028fcfc1df50750d99ad2586820) )
+ ROM_LOAD( "12.ug4", 0x180000, 0x80000, CRC(63f0e810) SHA1(5c7ed32ee8dc1d9aabc8d136ec370471096356c2) )
+
+ ROM_REGION( 0x08000, "audiocpu", 0 ) /* sound z80 (not much code here ..) */
+ ROM_LOAD( "1.su6", 0x00000, 0x08000, CRC(33169d4d) SHA1(0ebc932d15b6df022c7e1f44df884e64b25ba745) )
+
+ ROM_REGION( 0x80000, "oki", 0 )
+ ROM_LOAD( "3.su12", 0x00000, 0x20000, CRC(a2d780f4) SHA1(bebba3db21ab9ddde8c6f19db3b67c869df582eb) )
+ ROM_RELOAD( 0x40000, 0x20000 )
+ ROM_LOAD( "4.su13", 0x20000, 0x20000, CRC(1f7e9269) SHA1(5c16b49a4e94aec7606d088c2d45a77842ab565b) )
+ ROM_CONTINUE( 0x60000, 0x20000 )
+ROM_END
+
+
+GAME( 1999, funybubl, 0, funybubl, funybubl, driver_device, 0, ROT0, "In Chang Electronic Co", "Funny Bubble", MACHINE_SUPPORTS_SAVE )
+GAME( 1999, funybublc,funybubl, funybubl, funybubl, driver_device, 0, ROT0, "Comad", "Funny Bubble (Comad version)", MACHINE_SUPPORTS_SAVE )