diff options
Diffstat (limited to 'src/mame/drivers/fcrash.cpp')
-rw-r--r-- | src/mame/drivers/fcrash.cpp | 136 |
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 |