summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fcrash.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fcrash.cpp')
-rw-r--r--src/mame/drivers/fcrash.cpp136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/mame/drivers/fcrash.cpp b/src/mame/drivers/fcrash.cpp
index 97d98393e6b..ee13dc22be2 100644
--- a/src/mame/drivers/fcrash.cpp
+++ b/src/mame/drivers/fcrash.cpp
@@ -277,6 +277,37 @@ WRITE16_MEMBER(cps_state::knightsb_layer_w)
}
}
+WRITE16_MEMBER(cps_state::mtwinsb_layer_w)
+{
+ m_cps_a_regs[0x06 / 2] = 0x9100; // bit of a hack - the game never writes this, but does need it
+
+ switch (offset)
+ {
+ case 0x00:
+ m_cps_a_regs[0x0e / 2] = data;
+ break;
+ case 0x01:
+ m_cps_a_regs[0x0c / 2] = data - 0x3e;
+ break;
+ case 0x02:
+ m_cps_a_regs[0x12 / 2] = data;
+ m_cps_a_regs[CPS1_ROWSCROLL_OFFS] = data; /* row scroll start */
+ break;
+ case 0x03:
+ m_cps_a_regs[0x10 / 2] = data - 0x3c;
+ break;
+ case 0x04:
+ m_cps_a_regs[0x16 / 2] = data;
+ break;
+ case 0x05:
+ m_cps_a_regs[0x14 / 2] = data - 0x40;
+ break;
+ default:
+ logerror("%s: Unknown layer cmd %X %X\n",machine().describe_context(),offset<<1,data);
+
+ }
+}
+
WRITE16_MEMBER(cps_state::punipic_layer_w)
{
switch (offset)
@@ -718,6 +749,20 @@ void cps_state::fcrash_map(address_map &map)
map(0xff0000, 0xffffff).ram();
}
+void cps_state::mtwinsb_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).rom();
+ map(0x800000, 0x800001).portr("IN1");
+ map(0x800006, 0x800007).w(FUNC(cps_state::cps1_soundlatch_w));
+ map(0x800018, 0x80001f).r(FUNC(cps_state::cps1_dsw_r));
+ map(0x800030, 0x800037).w(FUNC(cps_state::cps1_coinctrl_w));
+ map(0x800100, 0x80013f).w(FUNC(cps_state::cps1_cps_a_w)).share("cps_a_regs");
+ map(0x800140, 0x80017f).rw(FUNC(cps_state::cps1_cps_b_r), FUNC(cps_state::cps1_cps_b_w)).share("cps_b_regs");
+ map(0x980000, 0x98000b).w(FUNC(cps_state::mtwinsb_layer_w));
+ map(0x900000, 0x92ffff).ram().w(FUNC(cps_state::cps1_gfxram_w)).share("gfxram");
+ map(0xff0000, 0xffffff).ram().share("mainram");
+}
+
void cps_state::punipic_map(address_map &map)
{
map(0x000000, 0x3fffff).rom();
@@ -1530,6 +1575,21 @@ MACHINE_START_MEMBER(cps_state,kodb)
m_sprite_x_offset = 0;
}
+MACHINE_START_MEMBER(cps_state, mtwinsb)
+{
+ m_layer_enable_reg = 0x12;
+ m_layer_mask_reg[0] = 0x14;
+ m_layer_mask_reg[1] = 0x16;
+ m_layer_mask_reg[2] = 0x18;
+ m_layer_mask_reg[3] = 0x1a;
+ m_layer_scroll1x_offset = 0x00;
+ m_layer_scroll2x_offset = 0x00;
+ m_layer_scroll3x_offset = 0x00;
+ m_sprite_base = 0x1000;
+ m_sprite_list_end_marker = 0x8000;
+ m_sprite_x_offset = 0;
+}
+
MACHINE_START_MEMBER(cps_state, cawingbl)
{
MACHINE_START_CALL_MEMBER(fcrash);
@@ -1720,6 +1780,47 @@ MACHINE_CONFIG_START(cps_state::kodb)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MACHINE_CONFIG_END
+MACHINE_CONFIG_START(cps_state::mtwinsb)
+
+ /* basic machine hardware */
+ MCFG_DEVICE_ADD("maincpu", M68000, 10000000)
+ MCFG_DEVICE_PROGRAM_MAP(mtwinsb_map)
+ MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cps_state, cps1_interrupt)
+ MCFG_DEVICE_IRQ_ACKNOWLEDGE_DRIVER(cps_state, cps1_int_ack)
+
+ MCFG_DEVICE_ADD("audiocpu", Z80, 3579545)
+ MCFG_DEVICE_PROGRAM_MAP(sgyxz_sound_map)
+
+ MCFG_MACHINE_START_OVERRIDE(cps_state, mtwinsb)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_SIZE(64*8, 32*8)
+ MCFG_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 2*8, 30*8-1 )
+ MCFG_SCREEN_UPDATE_DRIVER(cps_state, screen_update_fcrash)
+ MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE(*this, cps_state, screen_vblank_cps1))
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cps1)
+ MCFG_PALETTE_ADD("palette", 0xc00)
+
+ /* sound hardware */
+ SPEAKER(config, "mono").front_center();
+
+ MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_8_ADD("soundlatch2")
+
+ MCFG_DEVICE_ADD("2151", YM2151, XTAL(3'579'545))
+ MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
+ MCFG_SOUND_ROUTE(0, "mono", 0.35)
+ MCFG_SOUND_ROUTE(1, "mono", 0.35)
+
+ MCFG_DEVICE_ADD("oki", OKIM6295, XTAL(16'000'000)/4/4, okim6295_device::PIN7_HIGH)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+MACHINE_CONFIG_END
+
MACHINE_CONFIG_START(cps_state::sf2mdt)
/* basic machine hardware */
@@ -2306,6 +2407,38 @@ void cps_state::init_dinopic()
}
+// ************************************************************************* MTWINSB
+
+ROM_START( mtwinsb ) // board marked MGT-026
+ ROM_REGION( CODE_SIZE, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "1-prg-27c4001.bin", 0x00001, 0x80000, CRC(8938a029) SHA1(50104d2afaec8d69d317780c071a4f2248e23e62) )
+ ROM_LOAD16_BYTE( "2-prg-27c4001.bin", 0x00000, 0x80000, CRC(7d5b8a97) SHA1(d3e456061a569765d400fc7c9b43e4fdacf17951) )
+
+ ROM_REGION( 0x200000, "gfx", 0 ) // identical to the original, but differently arranged
+ ROMX_LOAD( "g4.bin", 0x000004, 0x40000, CRC(11493e55) SHA1(0e45f53b034d66ce8d029346d4d88e46021df1a7), ROM_SKIP(7) )
+ ROM_CONTINUE( 0x000000, 0x40000)
+ ROMX_LOAD( "g3.bin", 0x000005, 0x40000, CRC(feda0f8b) SHA1(59c740478791ce95bf06feeda5173cc283a1eaea), ROM_SKIP(7) )
+ ROM_CONTINUE( 0x000001, 0x40000)
+ ROMX_LOAD( "g2.bin", 0x000006, 0x40000, CRC(745f0eba) SHA1(1cb07be5df7cc43b5aa236f114d303bf92436c74), ROM_SKIP(7) )
+ ROM_CONTINUE( 0x000002, 0x40000)
+ ROMX_LOAD( "g1.bin", 0x000007, 0x40000, CRC(8069026f) SHA1(3d5e9b36a349328bcd93d83d8d2fe3cd40e68a3b), ROM_SKIP(7) )
+ ROM_CONTINUE( 0x000003, 0x40000)
+
+ ROM_REGION( 0x18000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "4-snd-z80-27c512.bin", 0x00000, 0x08000, CRC(4d4255b7) SHA1(81a76b58043af7252a854b7efc4109957ef0e679) ) // identical to the original
+ ROM_CONTINUE( 0x10000, 0x08000 )
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "3-snd-27c208.bin", 0x00000, 0x40000, CRC(a0c3de92) SHA1(5135cd982564f898f799ff1bc2bb2a75154be0cd) ) // identical to the original, but one single bigger ROM
+ROM_END
+
+void cps_state::init_mtwinsb()
+{
+ m_bootleg_sprite_ram = std::make_unique<uint16_t[]>(0x2000);
+ m_maincpu->space(AS_PROGRAM).install_ram(0x990000, 0x993fff, m_bootleg_sprite_ram.get());
+ init_cps1();
+}
+
// ************************************************************************* SGYXZ
@@ -3195,8 +3328,11 @@ GAME( 1990, ffightbl, ffight, fcrash, fcrash, cps_state, init_cps1,
GAME( 1990, ffightbla, ffight, fcrash, fcrash, cps_state, init_cps1, ROT0, "bootleg", "Final Fight (bootleg on Final Crash PCB)", MACHINE_SUPPORTS_SAVE ) // same as Final Crash without the modified gfx
GAME( 1991, kodb, kod, kodb, kodb, cps_state, init_kodb, ROT0, "bootleg (Playmark)", "The King of Dragons (bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 910731 "ETC"
+
GAME( 1991, knightsb, knights, knightsb, knights, cps_state, init_dinopic, ROT0, "bootleg", "Knights of the Round (bootleg)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // 911127 - based on World version
+GAME( 1993, mtwinsb, mtwins, mtwinsb, mtwins, cps_state, init_mtwinsb, ROT0, "David Inc. (bootleg)", "Twins (Mega Twins bootleg)", MACHINE_SUPPORTS_SAVE ) // based on World version
+
GAME( 1993, punipic, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 1)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
GAME( 1993, punipic2, punisher, punipic, punisher, cps_state, init_punipic, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
GAME( 1993, punipic3, punisher, punipic, punisher, cps_state, init_punipic3, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC