From 2f43a53ee80b7fa5dbb413002bab4c991450a72e Mon Sep 17 00:00:00 2001 From: David Haywood Date: Thu, 6 Dec 2018 19:10:04 +0000 Subject: 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) --- src/mame/drivers/tumbleb.cpp | 137 ++++++++++++++++++++++++++++++++++--------- src/mame/includes/tumbleb.h | 4 ++ src/mame/mame.lst | 1 + 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 -- cgit v1.2.3