Follow-up to "Cps1 bootlegs, some more new sets #5895" (#5899)

* create fcrash.h

* change includes, add to arcade.lua
This commit is contained in:
Tom 2019-11-14 14:35:20 +00:00 committed by Vas Crabb
parent d1086ca8b1
commit 09bf7fe735
6 changed files with 224 additions and 195 deletions

View File

@ -1482,6 +1482,7 @@ files {
MAME_DIR .. "src/mame/includes/exedexes.h",
MAME_DIR .. "src/mame/video/exedexes.cpp",
MAME_DIR .. "src/mame/drivers/fcrash.cpp",
MAME_DIR .. "src/mame/includes/fcrash.h",
MAME_DIR .. "src/mame/drivers/gng.cpp",
MAME_DIR .. "src/mame/includes/gng.h",
MAME_DIR .. "src/mame/video/gng.cpp",

View File

@ -23,7 +23,7 @@
*/
#include "emu.h"
#include "includes/cps1.h"
#include "includes/fcrash.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
@ -36,6 +36,63 @@
#define CODE_SIZE 0x400000
class cps1bl_5205_state : public fcrash_state
{
public:
cps1bl_5205_state(const machine_config &mconfig, device_type type, const char *tag)
: fcrash_state(mconfig, type, tag)
, m_msm_mux(*this, "msm_mux%u", 1)
{ }
void captcommb2(machine_config &config);
void sf2b(machine_config &config);
void sf2mdt(machine_config &config);
void init_captcommb2();
void init_knightsb();
void init_sf2b();
void init_sf2mdt();
void init_sf2mdta();
void init_sf2mdtb();
private:
DECLARE_MACHINE_START(captcommb2);
DECLARE_MACHINE_RESET(captcommb2);
DECLARE_MACHINE_START(sf2mdt);
DECLARE_WRITE16_MEMBER(captcommb2_layer_w);
DECLARE_WRITE16_MEMBER(captcommb2_soundlatch_w);
DECLARE_READ8_MEMBER(captcommb2_soundlatch_r);
DECLARE_WRITE8_MEMBER(captcommb2_snd_bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(captcommb2_mux_select_w);
DECLARE_WRITE16_MEMBER(knightsb_layer_w);
DECLARE_WRITE16_MEMBER(sf2b_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdt_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdt_soundlatch_w);
DECLARE_WRITE16_MEMBER(sf2mdta_layer_w);
void captcommb2_map(address_map &map);
void sf2b_map(address_map &map);
void sf2mdt_map(address_map &map);
void captcommb2_z80map(address_map &map);
bool m_captcommb2_mux_toggle;
optional_device_array<ls157_device, 2> m_msm_mux;
};
class captcommb2_state : public cps1bl_5205_state
{
public:
captcommb2_state(const machine_config &mconfig, device_type type, const char *tag)
: cps1bl_5205_state(mconfig, type, tag)
{ }
private:
void bootleg_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
};
WRITE16_MEMBER(cps1bl_5205_state::captcommb2_layer_w)
{
switch (offset)
@ -510,9 +567,6 @@ MACHINE_START_MEMBER(cps1bl_5205_state, sf2mdt)
void cps1bl_5205_state::init_captcommb2()
{
//m_bootleg_sprite_renderer = &cps1bl_5205_state::captcommb2_render_sprites;
m_bootleg_sprite_renderer = static_cast<void (fcrash_state::*)(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)>(&cps1bl_5205_state::captcommb2_render_sprites);
// gfx data bits 2 and 4 swapped
uint8_t *gfx = memregion("gfx")->base();
for (int i = 0; i < 0x400000; i++)
@ -531,8 +585,6 @@ void cps1bl_5205_state::init_captcommb2()
void cps1bl_5205_state::init_knightsb()
{
//m_bootleg_sprite_renderer = &cps1bl_5205_state::captcommb2_render_sprites;
m_bootleg_sprite_renderer = static_cast<void (fcrash_state::*)(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)>(&cps1bl_5205_state::captcommb2_render_sprites);
m_maincpu->space(AS_PROGRAM).unmap_write(0x980000, 0x980023);
m_maincpu->space(AS_PROGRAM).install_write_handler(0x980000, 0x980025, write16_delegate(*this, FUNC(cps1bl_5205_state::knightsb_layer_w)));
m_msm_1->reset_routes().add_route(ALL_OUTPUTS, "mono", 0.5);
@ -793,7 +845,7 @@ static INPUT_PORTS_START( sf2mdtb )
INPUT_PORTS_END
void cps1bl_5205_state::captcommb2_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
void captcommb2_state::bootleg_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int pos;
int last_sprite_offset = 0;
@ -1179,10 +1231,10 @@ ROM_END
// ************************************************************************* DRIVER MACROS
GAME( 1991, captcommb2, 0, captcommb2, captcommb2, cps1bl_5205_state, init_captcommb2, ROT0, "bootleg", "Captain Commando (bootleg with 2xMSM5205)", MACHINE_SUPPORTS_SAVE ) // 911014 ETC
GAME( 1991, captcommb2, 0, captcommb2, captcommb2, captcommb2_state, init_captcommb2, ROT0, "bootleg", "Captain Commando (bootleg with 2xMSM5205)", MACHINE_SUPPORTS_SAVE ) // 911014 ETC
GAME( 1991, knightsb, knights, captcommb2, knights, cps1bl_5205_state, init_knightsb, ROT0, "bootleg", "Knights of the Round (bootleg with 2xMSM5205, set 1)", MACHINE_SUPPORTS_SAVE ) // 911127 ETC
GAME( 1991, knightsb3, 0, captcommb2, knights, cps1bl_5205_state, init_knightsb, ROT0, "bootleg", "Knights of the Round (bootleg with 2xMSM5205, set 2)", MACHINE_SUPPORTS_SAVE ) // 911127 ETC
GAME( 1991, knightsb, knights, captcommb2, knights, captcommb2_state, init_knightsb, ROT0, "bootleg", "Knights of the Round (bootleg with 2xMSM5205, set 1)", MACHINE_SUPPORTS_SAVE ) // 911127 ETC
GAME( 1991, knightsb3, 0, captcommb2, knights, captcommb2_state, init_knightsb, ROT0, "bootleg", "Knights of the Round (bootleg with 2xMSM5205, set 2)", MACHINE_SUPPORTS_SAVE ) // 911127 ETC
GAME( 1992, sf2b, sf2, sf2b, sf2mdt, cps1bl_5205_state, init_sf2b, ROT0, "bootleg (Playmark)", "Street Fighter II: The World Warrior (bootleg, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 910204 ETC
GAME( 1992, sf2b2, sf2, sf2b, sf2mdt, cps1bl_5205_state, init_sf2mdtb, ROT0, "bootleg", "Street Fighter II: The World Warrior (bootleg, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 910204 ETC

View File

@ -24,7 +24,7 @@
*/
#include "emu.h"
#include "includes/cps1.h"
#include "includes/fcrash.h"
#include "cpu/m68000/m68000.h"
#include "cpu/pic16c5x/pic16c5x.h"
@ -37,6 +37,57 @@
#define CODE_SIZE 0x400000
class cps1bl_pic_state : public fcrash_state
{
public:
cps1bl_pic_state(const machine_config &mconfig, device_type type, const char *tag)
: fcrash_state(mconfig, type, tag)
{ }
void dinopic(machine_config &config);
void punipic(machine_config &config);
void slampic(machine_config &config);
void slampic2(machine_config &config);
void init_dinopic();
void init_punipic();
void init_punipic3();
void init_slampic();
void init_slampic2();
private:
DECLARE_MACHINE_START(dinopic);
DECLARE_MACHINE_START(punipic);
DECLARE_MACHINE_START(slampic);
DECLARE_MACHINE_START(slampic2);
DECLARE_WRITE16_MEMBER(dinopic_layer_w);
DECLARE_WRITE16_MEMBER(dinopic_layer2_w);
DECLARE_WRITE16_MEMBER(punipic_layer_w);
DECLARE_WRITE16_MEMBER(slampic_layer_w);
DECLARE_WRITE16_MEMBER(slampic_layer2_w);
DECLARE_READ16_MEMBER(slampic2_cps_a_r);
DECLARE_WRITE16_MEMBER(slampic2_sound_w);
DECLARE_WRITE16_MEMBER(slampic2_sound2_w);
void dinopic_map(address_map &map);
void punipic_map(address_map &map);
void slampic_map(address_map &map);
void slampic2_map(address_map &map);
};
class slampic2_state : public cps1bl_pic_state
{
public:
slampic2_state(const machine_config &mconfig, device_type type, const char *tag)
: cps1bl_pic_state(mconfig, type, tag)
{ }
private:
void bootleg_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) override;
};
WRITE16_MEMBER(cps1bl_pic_state::dinopic_layer_w)
{
switch (offset)
@ -494,9 +545,6 @@ void cps1bl_pic_state::init_punipic3()
void cps1bl_pic_state::init_slampic2()
{
//m_bootleg_sprite_renderer = &cps1bl_pic_state::slampic2_render_sprites;
m_bootleg_sprite_renderer = static_cast<void (fcrash_state::*)(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)>(&cps1bl_pic_state::slampic2_render_sprites);
m_bootleg_sprite_ram = std::make_unique<uint16_t[]>(0x2000);
m_maincpu->space(AS_PROGRAM).install_ram(0x930000, 0x933fff, m_bootleg_sprite_ram.get());
m_maincpu->space(AS_PROGRAM).install_ram(0xff0000, 0xff3fff, m_bootleg_sprite_ram.get());
@ -654,7 +702,7 @@ INPUT_PORTS_END
m_gfxdecode->gfx(2)->prio_transpen(bitmap, cliprect, CODE, COLOR, FLIPX, FLIPY, SX, SY, screen.priority(), 2, 15); \
}
void cps1bl_pic_state::slampic2_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
void slampic2_state::bootleg_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int i, j = 0;
int last_sprite_offset = 0;
@ -1281,4 +1329,4 @@ GAME( 1993, punipic2, punisher, punipic, punisher, cps1bl_pic_state, init
GAME( 1993, punipic3, punisher, punipic, punisher, cps1bl_pic_state, init_punipic3, ROT0, "bootleg", "The Punisher (bootleg with PIC16c57, set 3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930422 ETC
GAME( 1993, slampic, slammast, slampic, slampic, cps1bl_pic_state, init_dinopic, ROT0, "bootleg", "Saturday Night Slam Masters (bootleg with PIC16c57, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930713 ETC
GAME( 1993, slampic2, 0, slampic2, slampic2, cps1bl_pic_state, init_slampic2, ROT0, "bootleg", "Saturday Night Slam Masters (bootleg with PIC16c57, set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930713 ETC
GAME( 1993, slampic2, 0, slampic2, slampic2, slampic2_state, init_slampic2, ROT0, "bootleg", "Saturday Night Slam Masters (bootleg with PIC16c57, set 2)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) // 930713 ETC

View File

@ -116,7 +116,7 @@ dinopic3: no sound. Some minor gfx priority issues, confirmed present on real bo
*/
#include "emu.h"
#include "includes/cps1.h"
#include "includes/fcrash.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
@ -1295,7 +1295,7 @@ void fcrash_state::fcrash_update_transmasks()
}
}
void fcrash_state::fcrash_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
void fcrash_state::bootleg_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
{
int pos;
int base = m_sprite_base / 2;
@ -1340,7 +1340,7 @@ void fcrash_state::fcrash_render_layer( screen_device &screen, bitmap_ind16 &bit
switch (layer)
{
case 0:
(this->*m_bootleg_sprite_renderer)(screen, bitmap, cliprect);
bootleg_render_sprites(screen, bitmap, cliprect);
break;
case 1:
case 2:

View File

@ -9,6 +9,8 @@
#ifndef MAME_INCLUDES_CPS1_H
#define MAME_INCLUDES_CPS1_H
#pragma once
#include "sound/msm5205.h"
#include "sound/qsound.h"
#include "sound/okim6295.h"
@ -408,182 +410,6 @@ private:
int m_ecofghtr_dial_last1;
};
class fcrash_state : public cps_state
{
public:
fcrash_state(const machine_config &mconfig, device_type type, const char *tag)
: cps_state(mconfig, type, tag, 1)
, m_msm_1(*this, "msm1")
, m_msm_2(*this, "msm2")
, m_bootleg_sprite_renderer(&fcrash_state::fcrash_render_sprites)
{ }
void fcrash(machine_config &config);
void cawingbl(machine_config &config);
void kodb(machine_config &config);
void mtwinsb(machine_config &config);
void sf2m1(machine_config &config);
void sgyxz(machine_config &config);
void wofabl(machine_config &config);
void varthb(machine_config &config);
void init_cawingbl();
void init_kodb();
void init_mtwinsb();
void init_sf2m1();
void init_wofabl();
protected:
DECLARE_MACHINE_START(fcrash);
DECLARE_MACHINE_RESET(fcrash);
DECLARE_MACHINE_START(cawingbl);
DECLARE_MACHINE_START(kodb);
DECLARE_MACHINE_START(mtwinsb);
DECLARE_MACHINE_START(sf2m1);
DECLARE_MACHINE_START(sgyxz);
DECLARE_WRITE16_MEMBER(fcrash_soundlatch_w);
DECLARE_WRITE8_MEMBER(fcrash_snd_bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(m5205_int1);
DECLARE_WRITE_LINE_MEMBER(m5205_int2);
DECLARE_WRITE8_MEMBER(fcrash_msm5205_0_data_w);
DECLARE_WRITE8_MEMBER(fcrash_msm5205_1_data_w);
DECLARE_WRITE16_MEMBER(cawingbl_soundlatch_w);
DECLARE_WRITE16_MEMBER(kodb_layer_w);
DECLARE_WRITE16_MEMBER(mtwinsb_layer_w);
DECLARE_WRITE16_MEMBER(sf2m1_layer_w);
DECLARE_WRITE16_MEMBER(varthb_layer_w);
DECLARE_WRITE16_MEMBER(varthb_layer2_w);
uint32_t screen_update_fcrash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void fcrash_update_transmasks();
void fcrash_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void fcrash_render_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask);
void fcrash_render_high_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer);
void fcrash_build_palette();
void fcrash_map(address_map &map);
void mtwinsb_map(address_map &map);
void sf2m1_map(address_map &map);
void sgyxz_map(address_map &map);
void wofabl_map(address_map &map);
void varthb_map(address_map &map);
void fcrash_sound_map(address_map &map);
void kodb_sound_map(address_map &map);
void sgyxz_sound_map(address_map &map);
/* sound hw */
int m_sample_buffer1;
int m_sample_buffer2;
int m_sample_select1;
int m_sample_select2;
/* video config */
uint8_t m_layer_enable_reg;
uint8_t m_layer_mask_reg[4];
int m_layer_scroll1x_offset;
int m_layer_scroll2x_offset;
int m_layer_scroll3x_offset;
int m_sprite_base;
int m_sprite_list_end_marker;
int m_sprite_x_offset;
std::unique_ptr<uint16_t[]> m_bootleg_sprite_ram;
std::unique_ptr<uint16_t[]> m_bootleg_work_ram;
optional_device<msm5205_device> m_msm_1;
optional_device<msm5205_device> m_msm_2;
void (fcrash_state::*m_bootleg_sprite_renderer)(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
class cps1bl_5205_state : public fcrash_state
{
public:
cps1bl_5205_state(const machine_config &mconfig, device_type type, const char *tag)
: fcrash_state(mconfig, type, tag)
, m_msm_mux(*this, "msm_mux%u", 1)
{ }
void captcommb2(machine_config &config);
void sf2b(machine_config &config);
void sf2mdt(machine_config &config);
void init_captcommb2();
void init_knightsb();
void init_sf2b();
void init_sf2mdt();
void init_sf2mdta();
void init_sf2mdtb();
private:
DECLARE_MACHINE_START(captcommb2);
DECLARE_MACHINE_RESET(captcommb2);
DECLARE_MACHINE_START(sf2mdt);
DECLARE_WRITE16_MEMBER(captcommb2_layer_w);
DECLARE_WRITE16_MEMBER(captcommb2_soundlatch_w);
DECLARE_READ8_MEMBER(captcommb2_soundlatch_r);
DECLARE_WRITE8_MEMBER(captcommb2_snd_bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(captcommb2_mux_select_w);
DECLARE_WRITE16_MEMBER(knightsb_layer_w);
DECLARE_WRITE16_MEMBER(sf2b_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdt_layer_w);
DECLARE_WRITE16_MEMBER(sf2mdt_soundlatch_w);
DECLARE_WRITE16_MEMBER(sf2mdta_layer_w);
void captcommb2_map(address_map &map);
void sf2b_map(address_map &map);
void sf2mdt_map(address_map &map);
void captcommb2_z80map(address_map &map);
bool m_captcommb2_mux_toggle;
optional_device_array<ls157_device, 2> m_msm_mux;
void captcommb2_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
class cps1bl_pic_state : public fcrash_state
{
public:
cps1bl_pic_state(const machine_config &mconfig, device_type type, const char *tag)
: fcrash_state(mconfig, type, tag)
{ }
void dinopic(machine_config &config);
void punipic(machine_config &config);
void slampic(machine_config &config);
void slampic2(machine_config &config);
void init_dinopic();
void init_punipic();
void init_punipic3();
void init_slampic();
void init_slampic2();
private:
DECLARE_MACHINE_START(dinopic);
DECLARE_MACHINE_START(punipic);
DECLARE_MACHINE_START(slampic);
DECLARE_MACHINE_START(slampic2);
DECLARE_WRITE16_MEMBER(dinopic_layer_w);
DECLARE_WRITE16_MEMBER(dinopic_layer2_w);
DECLARE_WRITE16_MEMBER(punipic_layer_w);
DECLARE_WRITE16_MEMBER(slampic_layer_w);
DECLARE_WRITE16_MEMBER(slampic_layer2_w);
DECLARE_READ16_MEMBER(slampic2_cps_a_r);
DECLARE_WRITE16_MEMBER(slampic2_sound_w);
DECLARE_WRITE16_MEMBER(slampic2_sound2_w);
void dinopic_map(address_map &map);
void punipic_map(address_map &map);
void slampic_map(address_map &map);
void slampic2_map(address_map &map);
void slampic2_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
/*----------- defined in drivers/cps1.cpp -----------*/

102
src/mame/includes/fcrash.h Normal file
View File

@ -0,0 +1,102 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/***************************************************************************
CPS1 bootleg "Final Crash" hardware
***************************************************************************/
#ifndef MAME_INCLUDES_FCRASH_H
#define MAME_INCLUDES_FCRASH_H
#pragma once
#include "includes/cps1.h"
class fcrash_state : public cps_state
{
public:
fcrash_state(const machine_config &mconfig, device_type type, const char *tag)
: cps_state(mconfig, type, tag, 1)
, m_msm_1(*this, "msm1")
, m_msm_2(*this, "msm2")
{ }
void fcrash(machine_config &config);
void cawingbl(machine_config &config);
void kodb(machine_config &config);
void mtwinsb(machine_config &config);
void sf2m1(machine_config &config);
void sgyxz(machine_config &config);
void wofabl(machine_config &config);
void varthb(machine_config &config);
void init_cawingbl();
void init_kodb();
void init_mtwinsb();
void init_sf2m1();
void init_wofabl();
protected:
DECLARE_MACHINE_START(fcrash);
DECLARE_MACHINE_RESET(fcrash);
DECLARE_MACHINE_START(cawingbl);
DECLARE_MACHINE_START(kodb);
DECLARE_MACHINE_START(mtwinsb);
DECLARE_MACHINE_START(sf2m1);
DECLARE_MACHINE_START(sgyxz);
DECLARE_WRITE16_MEMBER(fcrash_soundlatch_w);
DECLARE_WRITE8_MEMBER(fcrash_snd_bankswitch_w);
DECLARE_WRITE_LINE_MEMBER(m5205_int1);
DECLARE_WRITE_LINE_MEMBER(m5205_int2);
DECLARE_WRITE8_MEMBER(fcrash_msm5205_0_data_w);
DECLARE_WRITE8_MEMBER(fcrash_msm5205_1_data_w);
DECLARE_WRITE16_MEMBER(cawingbl_soundlatch_w);
DECLARE_WRITE16_MEMBER(kodb_layer_w);
DECLARE_WRITE16_MEMBER(mtwinsb_layer_w);
DECLARE_WRITE16_MEMBER(sf2m1_layer_w);
DECLARE_WRITE16_MEMBER(varthb_layer_w);
DECLARE_WRITE16_MEMBER(varthb_layer2_w);
uint32_t screen_update_fcrash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void fcrash_update_transmasks();
virtual void bootleg_render_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void fcrash_render_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask);
void fcrash_render_high_layer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer);
void fcrash_build_palette();
void fcrash_map(address_map &map);
void mtwinsb_map(address_map &map);
void sf2m1_map(address_map &map);
void sgyxz_map(address_map &map);
void wofabl_map(address_map &map);
void varthb_map(address_map &map);
void fcrash_sound_map(address_map &map);
void kodb_sound_map(address_map &map);
void sgyxz_sound_map(address_map &map);
/* sound hw */
int m_sample_buffer1;
int m_sample_buffer2;
int m_sample_select1;
int m_sample_select2;
/* video config */
uint8_t m_layer_enable_reg;
uint8_t m_layer_mask_reg[4];
int m_layer_scroll1x_offset;
int m_layer_scroll2x_offset;
int m_layer_scroll3x_offset;
int m_sprite_base;
int m_sprite_list_end_marker;
int m_sprite_x_offset;
std::unique_ptr<uint16_t[]> m_bootleg_sprite_ram;
std::unique_ptr<uint16_t[]> m_bootleg_work_ram;
optional_device<msm5205_device> m_msm_1;
optional_device<msm5205_device> m_msm_2;
};
#endif // MAME_INCLUDES_FCRASH_H