summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <mamehaze@gmail.com>2018-12-06 19:10:04 +0000
committer R. Belmont <rb6502@users.noreply.github.com>2018-12-06 14:10:04 -0500
commit2f43a53ee80b7fa5dbb413002bab4c991450a72e (patch)
tree99ab32f7380b770c42cd928770fceb86d44c381d
parentbb1a1ed95669071060ddd99133de74f608c63dd5 (diff)
new WORKING machines ---- Magic Purple [David Haywood, Jose IBI, Arcade Vintage, Recreativas.org, DU] (#4372)
* new WORKING machines ---- Magic Purple [David Haywood, Jose IBI, Arcade Vintage, Recreativas.org, DU] * sound balance seems off (nw) * use XTAL (nw) * simplify things a bit (nw) * no 'language' dip on this (nw) * not related (nw)
-rw-r--r--src/mame/drivers/tumbleb.cpp137
-rw-r--r--src/mame/includes/tumbleb.h4
-rw-r--r--src/mame/mame.lst1
3 files changed, 114 insertions, 28 deletions
diff --git a/src/mame/drivers/tumbleb.cpp b/src/mame/drivers/tumbleb.cpp
index df2a6dfbf54..1b29370b02f 100644
--- a/src/mame/drivers/tumbleb.cpp
+++ b/src/mame/drivers/tumbleb.cpp
@@ -185,7 +185,7 @@ Stephh's notes (based on the games M68000 code and some tests) :
due to code at 0x000fe6 ('beq $fea'). So I've marked it as "Unused".
-8) 'fncywrld'
+8) 'fncywld'
- I'm not sure about the release date of this game :
* on the title screen, it ALWAYS displays 1996
@@ -313,7 +313,6 @@ Stephh's notes (based on the games M68000 code and some tests) :
#define TUMBLEP_HACK 0
-#define FNCYWLD_HACK 0
@@ -669,12 +668,8 @@ void tumbleb_state::tumblepopba_main_map(address_map &map)
map(0x322000, 0x322fff).w(FUNC(tumbleb_state::tumblepb_pf2_data_w)).share("pf2_data");
}
-void tumbleb_state::fncywld_main_map(address_map &map)
+void tumbleb_state::unico_base_map(address_map &map)
{
- map(0x000000, 0x0fffff).rom();
-#if FNCYWLD_HACK
- map(0x000000, 0x0fffff).writeonly(); /* To write levels modifications */
-#endif
map(0x100000, 0x100003).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write)).umask16(0x00ff);
map(0x100005, 0x100005).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x140000, 0x140fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
@@ -690,7 +685,25 @@ void tumbleb_state::fncywld_main_map(address_map &map)
map(0x340400, 0x34047f).nopw(); /* Unused col scroll */
map(0x342000, 0x3421ff).nopw();
map(0x342400, 0x34247f).nopw();
+}
+
+void tumbleb_state::fncywld_main_map(address_map &map)
+{
+ map(0x000000, 0x0fffff).rom();
map(0xff0000, 0xffffff).ram();
+
+ unico_base_map(map);
+}
+
+
+void tumbleb_state::magipur_main_map(address_map &map)
+{
+ map(0x000000, 0x00ffff).ram().share("mainram");
+ map(0xf00000, 0xffffff).rom().region("maincpu", 0);
+
+ map(0x100010, 0x100011).nopw(); // TODO: what is this, fncywld doesn't write here, can't be related to the RAM/ROM arrangement as the writes happen well after boot
+
+ unico_base_map(map);
}
@@ -1115,7 +1128,7 @@ static INPUT_PORTS_START( fncywld )
PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Demo_Sounds ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Language ) ) // only seems to the title screen
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Language ) ) // changes the region disclaimer and title screen only, not story text
PORT_DIPSETTING( 0x0004, DEF_STR( English ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Korean ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Flip_Screen ) )
@@ -1135,19 +1148,10 @@ static INPUT_PORTS_START( fncywld )
PORT_DIPSETTING( 0x2000, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
-
-#if FNCYWLD_HACK
- PORT_DIPNAME( 0x0800, 0x0800, "Remove Monsters" )
-#else
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unused ) ) // See notes
-#endif
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unused ) ) // See notes (is 'Remove Monsters' if code is patched to enable debug mode)
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
-#if FNCYWLD_HACK
- PORT_DIPNAME( 0x0400, 0x0400, "Edit Levels" )
-#else
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unused ) ) // See notes
-#endif
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unused ) ) // See notes (is 'Edit Levels' if code is patched to enable debug mode)
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unused ) )
@@ -1158,6 +1162,15 @@ static INPUT_PORTS_START( fncywld )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
+static INPUT_PORTS_START( magipur )
+ PORT_INCLUDE(fncywld)
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( htchctch )
PORT_START("PLAYERS")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
@@ -2005,14 +2018,14 @@ static GFXDECODE_START( gfx_suprtrio )
GFXDECODE_ENTRY( "tilegfx", 0, tcharlayout, 256, 16 ) /* Characters 8x8 */
GFXDECODE_ENTRY( "tilegfx", 0, suprtrio_tlayout, 512, 16 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "tilegfx", 0, suprtrio_tlayout, 256, 16 ) /* Tiles 16x16 */
- GFXDECODE_ENTRY( "sprgfx", 0, tlayout, 0, 16 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "sprgfx", 0, tlayout, 0, 16 ) /* Sprites 16x16 */
GFXDECODE_END
static GFXDECODE_START( gfx_fncywld )
GFXDECODE_ENTRY( "tilegfx", 0, tcharlayout, 0x400, 0x40 ) /* Characters 8x8 */
GFXDECODE_ENTRY( "tilegfx", 0, tlayout, 0x400, 0x40 ) /* Tiles 16x16 */
GFXDECODE_ENTRY( "tilegfx", 0, tlayout, 0x200, 0x40 ) /* Tiles 16x16 */
- GFXDECODE_ENTRY( "sprgfx", 0, tlayout, 0x000, 0x40 ) /* Sprites 16x16 */
+ GFXDECODE_ENTRY( "sprgfx", 0, tlayout, 0x000, 0x40 ) /* Sprites 16x16 */
GFXDECODE_END
/******************************************************************************/
@@ -2194,12 +2207,52 @@ MACHINE_CONFIG_START(tumbleb_state::fncywld)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- YM2151(config, "ymsnd", 32220000/9).add_route(ALL_OUTPUTS, "mono", 0.20);
+ YM2151(config, "ymsnd", 32220000/9).add_route(ALL_OUTPUTS, "mono", 0.10);
MCFG_DEVICE_ADD("oki", OKIM6295, 1023924, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
+/// OSCs: 12MHz, 4MHz, 28.63636MHz, not the same PCB as fncywld
+MACHINE_CONFIG_START(tumbleb_state::magipur)
+
+ /* basic machine hardware */
+ MCFG_DEVICE_ADD("maincpu", M68000, XTAL(12'000'000))
+ MCFG_DEVICE_PROGRAM_MAP(magipur_main_map)
+ MCFG_DEVICE_VBLANK_INT_DRIVER("screen", tumbleb_state, irq6_line_hold)
+
+ MCFG_MACHINE_START_OVERRIDE(tumbleb_state,tumbleb)
+ MCFG_MACHINE_RESET_OVERRIDE(tumbleb_state,tumbleb)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60) // refresh rate not verified
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529))
+ MCFG_SCREEN_SIZE(40*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
+ MCFG_SCREEN_UPDATE_DRIVER(tumbleb_state, screen_update_fncywld)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_DEVICE_ADD("spritegen", DECO_SPRITE, 0)
+ MCFG_DECO_SPRITE_GFX_REGION(3)
+ MCFG_DECO_SPRITE_ISBOOTLEG(true)
+ MCFG_DECO_SPRITE_TRANSPEN(15)
+ MCFG_DECO_SPRITE_GFXDECODE("gfxdecode")
+
+ MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_fncywld)
+ MCFG_PALETTE_ADD("palette", 0x800)
+ MCFG_PALETTE_FORMAT(xxxxRRRRGGGGBBBB)
+
+ MCFG_VIDEO_START_OVERRIDE(tumbleb_state,fncywld)
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+
+ YM2151(config, "ymsnd", XTAL(4'000'000)).add_route(ALL_OUTPUTS, "mono", 0.10);
+
+ MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(4'000'000)/4, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
MACHINE_RESET_MEMBER(tumbleb_state,htchctch)
@@ -2555,6 +2608,27 @@ ROM_START( fncywld )
ROM_LOAD( "00_fw01.bin", 0x000000, 0x040000, CRC(b395fe01) SHA1(ac7f2e21413658f8d2a1abf3a76b7817a4e050c9) )
ROM_END
+ROM_START( magipur )
+ ROM_REGION( 0x100000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "2-27c040.bin", 0x000000, 0x080000, CRC(135c5de7) SHA1(95c75e9e69793f67df9378391ae45915ef9bbb89) )
+ ROM_LOAD16_BYTE( "3-27c040.bin", 0x000001, 0x080000, CRC(ee4b16da) SHA1(82391ed4d21d3944ca482be00ab7c0838cf190ff) )
+
+ ROM_REGION( 0x100000, "sprgfx", 0 )
+ ROM_LOAD16_BYTE( "4-27c040.bin", 0x80000, 0x40000, CRC(e460a77d) SHA1(bde15705750e002bd576098700161b0944984401) )
+ ROM_CONTINUE(0x80001, 0x40000)
+ ROM_LOAD16_BYTE( "5-27c040.bin", 0x00000, 0x40000, CRC(79c53627) SHA1(9e2673b3becf0508f630f3bd8ff5fc30520b120b) )
+ ROM_CONTINUE(0x00001, 0x40000)
+
+ ROM_REGION( 0x100000, "tilegfx", 0 )
+ ROM_LOAD16_BYTE( "6-27c040.bin", 0x00001, 0x40000, CRC(b25b5872) SHA1(88a6a110073060c3b7b2987cc41d23c4ca412b43) )
+ ROM_CONTINUE(0x00000, 0x40000)
+ ROM_LOAD16_BYTE( "7-27c040.bin", 0x80001, 0x40000, CRC(d3c3a672) SHA1(5bbd67a953e1d47d05006a4ef4aa7a23e807f11b) )
+ ROM_CONTINUE(0x80000, 0x40000)
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "1-27c020.bin", 0x000000, 0x040000, CRC(84dcf771) SHA1(f8a693a11b14608a582a90b7fd7d3be92e46a0e1) )
+ROM_END
+
ROM_START( suprtrio )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68k */
ROM_LOAD16_BYTE( "rom2", 0x00000, 0x40000, CRC(4102e59d) SHA1(f06f1273dbbb91fa61d84541aa124d9c88ee94c1) )
@@ -3509,13 +3583,20 @@ void tumbleb_state::init_fncywld()
{
tumblepb_gfx_rearrange(1);
- #if FNCYWLD_HACK
/* This is a hack to allow you to use the extra features
of the 2 first "Unused" Dip Switch (see notes above). */
- uint16_t *RAM = (uint16_t *)memregion("maincpu")->base();
- RAM[0x0005fa/2] = 0x4e71;
- RAM[0x00060a/2] = 0x4e71;
- #endif
+ //uint16_t *RAM = (uint16_t *)memregion("maincpu")->base();
+ //RAM[0x0005fa/2] = 0x4e71;
+ //RAM[0x00060a/2] = 0x4e71;
+}
+
+void tumbleb_state::init_magipur()
+{
+ tumblepb_gfx_rearrange(1);
+
+ uint16_t *src = (uint16_t*)memregion( "maincpu" )->base();
+ // copy vector table? game expects RAM at 0, and ROM at f00000?!
+ memcpy(m_mainram, src, 0x80);
}
@@ -3645,7 +3726,7 @@ GAME( 1994, suprtrio, 0, suprtrio, suprtrio, tumbleb_state, init_suprtr
GAME( 1996, fncywld, 0, fncywld, fncywld, tumbleb_state, init_fncywld, ROT0, "Unico", "Fancy World - Earth of Crisis" , MACHINE_SUPPORTS_SAVE ) // game says 1996, testmode 1995?
-// Unico - Magic Purple almost certainly goes here
+GAME( 1996, magipur, 0, magipur, magipur, tumbleb_state, init_magipur, ROT0, "Unico", "Magic Purple" , MACHINE_SUPPORTS_SAVE )
/* First Amusement / Mijin / SemiCom hardware (MCU protected) */
GAME( 1994, metlsavr, 0, metlsavr, metlsavr, tumbleb_state, init_chokchok, ROT0, "First Amusement", "Metal Saver", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/tumbleb.h b/src/mame/includes/tumbleb.h
index 90a1dd5300b..aab68d672ef 100644
--- a/src/mame/includes/tumbleb.h
+++ b/src/mame/includes/tumbleb.h
@@ -38,6 +38,7 @@ public:
void cookbib(machine_config &config);
void metlsavr(machine_config &config);
void fncywld(machine_config &config);
+ void magipur(machine_config &config);
void suprtrio(machine_config &config);
void htchctch(machine_config &config);
void sdfight(machine_config &config);
@@ -57,6 +58,7 @@ public:
void init_tumbleb2();
void init_chokchok();
void init_fncywld();
+ void init_magipur();
void init_carket();
private:
@@ -159,7 +161,9 @@ private:
void suprtrio_decrypt_code();
void suprtrio_decrypt_gfx();
+ void unico_base_map(address_map &map);
void fncywld_main_map(address_map &map);
+ void magipur_main_map(address_map &map);
void htchctch_main_map(address_map &map);
void jumpkids_main_map(address_map &map);
void jumpkids_sound_map(address_map &map);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 62d298040a7..a4219e27034 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -37968,6 +37968,7 @@ cookbib // (c) 1995 SemiCom
cookbiba //
dquizgo // (c) 1998 SemiCom
fncywld // (c) 1996 Unico
+magipur // (c) 1996 Unico
htchctch // (c) 1995 SemiCom
jumpkids // (c) 1993 Comad
magicbal // (c) 1994 SemiCom