summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mame/misc/rbmk.cpp236
1 files changed, 136 insertions, 100 deletions
diff --git a/src/mame/misc/rbmk.cpp b/src/mame/misc/rbmk.cpp
index 6d8147db718..d4d96e6d51b 100644
--- a/src/mame/misc/rbmk.cpp
+++ b/src/mame/misc/rbmk.cpp
@@ -70,10 +70,10 @@ Keep pressed 9 and press reset to enter service mode.
namespace {
-class rbmk_state : public driver_device
+class gms_2layers_state : public driver_device
{
public:
- rbmk_state(const machine_config &mconfig, device_type type, const char *tag)
+ gms_2layers_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_vidram(*this, "vidram%u", 1U)
, m_maincpu(*this, "maincpu")
@@ -89,19 +89,16 @@ public:
void rbmk(machine_config &config);
void rbspm(machine_config &config);
- void magslot(machine_config &config);
void super555(machine_config &config);
void init_ballch();
void init_cots();
void init_rbspm();
- void init_sc2in1();
void init_super555();
protected:
virtual void video_start() override;
-private:
optional_shared_ptr_array<uint16_t, 3> m_vidram;
required_device<cpu_device> m_maincpu;
@@ -113,19 +110,22 @@ private:
optional_ioport_array<4> m_dsw;
uint16_t m_tilebank = 0;
+ tilemap_t *m_tilemap[3]{};
+
+ void super555_mem(address_map &map);
+
+ template <uint8_t Which> void vram_w(offs_t offset, u16 data, u16 mem_mask);
+
+private:
uint8_t m_mux_data = 0;
uint16_t m_dip_mux = 0;
//uint16_t m_prot_data = 0;
- tilemap_t *m_tilemap[3]{};
void mcu_io(address_map &map);
void mcu_mem(address_map &map);
void rbmk_mem(address_map &map);
void rbspm_mem(address_map &map);
- void magslot_mem(address_map &map);
- void super555_mem(address_map &map);
-
uint16_t unk_r();
uint16_t dip_mux_r();
void dip_mux_w(uint16_t data);
@@ -135,20 +135,39 @@ private:
void mcu_io_mux_w(uint8_t data);
void eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- template <uint8_t Which> void vram_w(offs_t offset, u16 data, u16 mem_mask);
TILE_GET_INFO_MEMBER(get_tile0_info);
TILE_GET_INFO_MEMBER(get_tile1_info);
- [[maybe_unused]] TILE_GET_INFO_MEMBER(get_tile2_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
+class gms_3layers_state : public gms_2layers_state
+{
+public:
+ gms_3layers_state(const machine_config &mconfig, device_type type, const char *tag)
+ : gms_2layers_state(mconfig, type, tag)
+ {
+ }
+
+ void init_sc2in1();
+
+ void magslot(machine_config &config);
-uint16_t rbmk_state::unk_r()
+protected:
+ virtual void video_start() override;
+
+private:
+ void magslot_mem(address_map &map);
+
+ TILE_GET_INFO_MEMBER(get_tile2_info);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+};
+
+uint16_t gms_2layers_state::unk_r()
{
return machine().rand();
}
-uint16_t rbmk_state::dip_mux_r()
+uint16_t gms_2layers_state::dip_mux_r()
{
uint16_t res = 0xffff;
@@ -164,24 +183,24 @@ uint16_t rbmk_state::dip_mux_r()
return res;
}
-void rbmk_state::tilebank_w(uint16_t data)
+void gms_2layers_state::tilebank_w(uint16_t data)
{
m_tilebank = data;
}
template <uint8_t Which>
-void rbmk_state::vram_w(offs_t offset, u16 data, u16 mem_mask)
+void gms_2layers_state::vram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_vidram[Which][offset]);
m_tilemap[Which]->mark_tile_dirty(offset);
}
-void rbmk_state::dip_mux_w(uint16_t data)
+void gms_2layers_state::dip_mux_w(uint16_t data)
{
m_dip_mux = data;
}
-void rbmk_state::eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+void gms_2layers_state::eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
// bad ?
if (ACCESSING_BITS_0_7)
@@ -194,51 +213,51 @@ void rbmk_state::eeprom_w(offs_t offset, uint16_t data, uint16_t mem_mask)
}
-void rbmk_state::rbmk_mem(address_map &map)
+void gms_2layers_state::rbmk_mem(address_map &map)
{
map(0x000000, 0x07ffff).rom().nopw();
map(0x100000, 0x10ffff).ram();
map(0x500000, 0x50ffff).ram();
map(0x940000, 0x940bff).ram();
- map(0x940c00, 0x940fff).ram().w(FUNC(rbmk_state::vram_w<0>)).share(m_vidram[0]);
+ map(0x940c00, 0x940fff).ram().w(FUNC(gms_2layers_state::vram_w<0>)).share(m_vidram[0]);
map(0x980300, 0x983fff).ram(); // 0x2048 words ???, byte access
map(0x900000, 0x900fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
- map(0x9c0000, 0x9c0fff).ram().w(FUNC(rbmk_state::vram_w<1>)).share(m_vidram[1]);
- map(0xb00000, 0xb00001).w(FUNC(rbmk_state::eeprom_w));
- map(0xc00000, 0xc00001).rw(FUNC(rbmk_state::dip_mux_r), FUNC(rbmk_state::dip_mux_w));
- map(0xc08000, 0xc08001).portr("IN1").w(FUNC(rbmk_state::tilebank_w));
+ map(0x9c0000, 0x9c0fff).ram().w(FUNC(gms_2layers_state::vram_w<1>)).share(m_vidram[1]);
+ map(0xb00000, 0xb00001).w(FUNC(gms_2layers_state::eeprom_w));
+ map(0xc00000, 0xc00001).rw(FUNC(gms_2layers_state::dip_mux_r), FUNC(gms_2layers_state::dip_mux_w));
+ map(0xc08000, 0xc08001).portr("IN1").w(FUNC(gms_2layers_state::tilebank_w));
map(0xc10000, 0xc10001).portr("IN2");
- map(0xc18080, 0xc18081).r(FUNC(rbmk_state::unk_r)); // TODO: from MCU?
+ map(0xc18080, 0xc18081).r(FUNC(gms_2layers_state::unk_r)); // TODO: from MCU?
map(0xc20000, 0xc20000).r("oki", FUNC(okim6295_device::read));
//map(0xc20080, 0xc20081) // TODO: to MCU?
map(0xc28000, 0xc28000).w("oki", FUNC(okim6295_device::write));
}
-void rbmk_state::rbspm_mem(address_map &map)
+void gms_2layers_state::rbspm_mem(address_map &map)
{
map(0x000000, 0x07ffff).rom();
- map(0x200000, 0x200001).w(FUNC(rbmk_state::eeprom_w)); // wrong
- map(0x300000, 0x300001).rw(FUNC(rbmk_state::dip_mux_r), FUNC(rbmk_state::dip_mux_w));
- map(0x308000, 0x308001).portr("IN1").w(FUNC(rbmk_state::tilebank_w)); // ok
+ map(0x200000, 0x200001).w(FUNC(gms_2layers_state::eeprom_w)); // wrong
+ map(0x300000, 0x300001).rw(FUNC(gms_2layers_state::dip_mux_r), FUNC(gms_2layers_state::dip_mux_w));
+ map(0x308000, 0x308001).portr("IN1").w(FUNC(gms_2layers_state::tilebank_w)); // ok
map(0x310000, 0x310001).portr("IN2");
- map(0x318080, 0x318081).r(FUNC(rbmk_state::unk_r));
+ map(0x318080, 0x318081).r(FUNC(gms_2layers_state::unk_r));
map(0x320000, 0x320000).r("oki", FUNC(okim6295_device::read));
map(0x328000, 0x328000).w("oki", FUNC(okim6295_device::write));
map(0x340002, 0x340003).nopw();
map(0x500000, 0x50ffff).ram();
map(0x900000, 0x900fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // if removed fails gfx test?
map(0x940000, 0x940bff).ram();
- map(0x940c00, 0x940fff).ram().w(FUNC(rbmk_state::vram_w<0>)).share(m_vidram[0]); // if removed fails palette test?
+ map(0x940c00, 0x940fff).ram().w(FUNC(gms_2layers_state::vram_w<0>)).share(m_vidram[0]); // if removed fails palette test?
map(0x980300, 0x983fff).ram(); // 0x2048 words ???, byte access, u25 and u26 according to test mode
- map(0x9c0000, 0x9c0fff).ram().w(FUNC(rbmk_state::vram_w<1>)).share(m_vidram[1]);
+ map(0x9c0000, 0x9c0fff).ram().w(FUNC(gms_2layers_state::vram_w<1>)).share(m_vidram[1]);
}
-void rbmk_state::super555_mem(address_map &map)
+void gms_2layers_state::super555_mem(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).ram();
- map(0x600000, 0x600001).rw(FUNC(rbmk_state::dip_mux_r), FUNC(rbmk_state::dip_mux_w));
- map(0x608000, 0x608001).portr("IN1").w(FUNC(rbmk_state::tilebank_w)); // ok
+ map(0x600000, 0x600001).rw(FUNC(gms_2layers_state::dip_mux_r), FUNC(gms_2layers_state::dip_mux_w));
+ map(0x608000, 0x608001).portr("IN1").w(FUNC(gms_2layers_state::tilebank_w)); // ok
map(0x610000, 0x610001).portr("IN2");
map(0x618080, 0x618081).nopr();//.lr16(NAME([this] () -> uint16_t { return m_prot_data; })); // reads something here from below, if these are hooked up booting stops with '0x09 U64 ERROR', like it's failing some checksum test
map(0x620000, 0x620000).r("oki", FUNC(okim6295_device::read)); // TODO: Oki controlled through a GAL at 18C, should be banked, too
@@ -246,25 +265,25 @@ void rbmk_state::super555_mem(address_map &map)
map(0x628000, 0x628000).w("oki", FUNC(okim6295_device::write));
map(0x900000, 0x900fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x940000, 0x940bff).ram();
- map(0x940c00, 0x940fff).ram().w(FUNC(rbmk_state::vram_w<0>)).share(m_vidram[0]);
+ map(0x940c00, 0x940fff).ram().w(FUNC(gms_2layers_state::vram_w<0>)).share(m_vidram[0]);
map(0x980000, 0x983fff).ram();
- map(0x9c0000, 0x9c0fff).ram().w(FUNC(rbmk_state::vram_w<1>)).share(m_vidram[1]);
- //map(0xf00000, 0xf00001).w(FUNC(rbmk_state::eeprom_w)); // wrong?
+ map(0x9c0000, 0x9c0fff).ram().w(FUNC(gms_2layers_state::vram_w<1>)).share(m_vidram[1]);
+ //map(0xf00000, 0xf00001).w(FUNC(gms_2layers_state::eeprom_w)); // wrong?
}
-void rbmk_state::magslot_mem(address_map &map)
+void gms_3layers_state::magslot_mem(address_map &map)
{
super555_mem(map);
- map(0x9e0000, 0x9e0fff).ram().share(m_vidram[2]);
+ map(0x9e0000, 0x9e0fff).ram().w(FUNC(gms_3layers_state::vram_w<2>)).share(m_vidram[2]);
}
-void rbmk_state::mcu_mem(address_map &map)
+void gms_2layers_state::mcu_mem(address_map &map)
{
// map(0x0000, 0x0fff).rom();
}
-uint8_t rbmk_state::mcu_io_r(offs_t offset)
+uint8_t gms_2layers_state::mcu_io_r(offs_t offset)
{
if (m_mux_data & 8)
{
@@ -282,7 +301,7 @@ uint8_t rbmk_state::mcu_io_r(offs_t offset)
return 0xff;
}
-void rbmk_state::mcu_io_w(offs_t offset, uint8_t data)
+void gms_2layers_state::mcu_io_w(offs_t offset, uint8_t data)
{
if (m_mux_data & 8) { m_ymsnd->write(offset & 1, data); }
else if (m_mux_data & 4)
@@ -294,14 +313,14 @@ void rbmk_state::mcu_io_w(offs_t offset, uint8_t data)
printf("Warning: mux data W = %02x", m_mux_data);
}
-void rbmk_state::mcu_io_mux_w(uint8_t data)
+void gms_2layers_state::mcu_io_mux_w(uint8_t data)
{
m_mux_data = ~data;
}
-void rbmk_state::mcu_io(address_map &map)
+void gms_2layers_state::mcu_io(address_map &map)
{
- map(0x0ff00, 0x0ffff).rw(FUNC(rbmk_state::mcu_io_r), FUNC(rbmk_state::mcu_io_w));
+ map(0x0ff00, 0x0ffff).rw(FUNC(gms_2layers_state::mcu_io_r), FUNC(gms_2layers_state::mcu_io_w));
}
static INPUT_PORTS_START( rbmk )
@@ -852,30 +871,20 @@ static INPUT_PORTS_START( sc2in1 )
// Only 1 8-DIP bank on PCB
PORT_START("DSW1")
- PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0001, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0002, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0004, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0008, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:5")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0010, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0020, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0040, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8")
- PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0080, DEF_STR( On ) )
+ PORT_DIPUNUSED_DIPLOC( 0x0001, 0x0000, "SW1:1")
+ PORT_DIPUNUSED_DIPLOC( 0x0002, 0x0000, "SW1:2")
+ PORT_DIPUNUSED_DIPLOC( 0x0004, 0x0000, "SW1:3")
+ PORT_DIPUNUSED_DIPLOC( 0x0008, 0x0000, "SW1:4")
+ PORT_DIPUNUSED_DIPLOC( 0x0010, 0x0000, "SW1:5")
+ PORT_DIPNAME( 0x0020, 0x0000, "Game Setup" ) PORT_DIPLOCATION("SW1:6")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0020, "Power On" )
+ PORT_DIPNAME( 0x0040, 0x0000, "Game Password" ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0040, "Power On" )
+ PORT_DIPNAME( 0x0080, 0x0000, "Connector" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x0000, "Joystick" ) // hardcoded
+ PORT_DIPSETTING( 0x0080, "Joystick" )
INPUT_PORTS_END
static INPUT_PORTS_START( ballch )
@@ -1152,10 +1161,10 @@ static GFXDECODE_START( gfx_magslot )
GFXDECODE_ENTRY( "gfx3", 0, gfx_8x8x4_packed_lsb, 0x100, 16 ) // wrong colors
GFXDECODE_END
-void rbmk_state::video_start()
+void gms_2layers_state::video_start()
{
- m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(rbmk_state::get_tile0_info)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
- m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(rbmk_state::get_tile1_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
+ m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_2layers_state::get_tile0_info)), TILEMAP_SCAN_ROWS, 8, 32, 64, 8);
+ m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_2layers_state::get_tile1_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_tilemap[1]->set_transparent_pen(0);
@@ -1166,37 +1175,62 @@ void rbmk_state::video_start()
save_item(NAME(m_dip_mux));
}
-TILE_GET_INFO_MEMBER(rbmk_state::get_tile0_info)
+void gms_3layers_state::video_start()
+{
+ gms_2layers_state::video_start();
+
+ m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gms_3layers_state::get_tile2_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
+
+ m_tilemap[2]->set_transparent_pen(0);
+}
+
+TILE_GET_INFO_MEMBER(gms_2layers_state::get_tile0_info)
{
const int tile = m_vidram[0][tile_index];
tileinfo.set(0, (tile & 0x0fff) + ((m_tilebank & 0x10) >> 4) * 0x1000, tile >> 12, 0);
}
-TILE_GET_INFO_MEMBER(rbmk_state::get_tile1_info)
+TILE_GET_INFO_MEMBER(gms_2layers_state::get_tile1_info)
{
const int tile = m_vidram[1][tile_index];
tileinfo.set(1, (tile & 0x0fff) + ((m_tilebank >> 1) & 3) * 0x1000, tile >> 12, 0);
}
+TILE_GET_INFO_MEMBER(gms_3layers_state::get_tile2_info)
+{
+ const int tile = m_vidram[2][tile_index];
+ tileinfo.set(2, (tile & 0x0fff) + ((m_tilebank >> 9) & 3) * 0x1000, tile >> 12, 0); // TODO: identify tilebank bits
+}
+
// TODO: ballch's and cots' title screens highlight a priority bug: the title and copyright are drawn behind the background
-uint32_t rbmk_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t gms_2layers_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ m_tilemap[0]->draw(screen, bitmap, cliprect);
+ m_tilemap[1]->draw(screen, bitmap, cliprect);
+
+ return 0;
+}
+
+uint32_t gms_3layers_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilemap[0]->draw(screen, bitmap, cliprect);
m_tilemap[1]->draw(screen, bitmap, cliprect);
+ m_tilemap[2]->draw(screen, bitmap, cliprect);
return 0;
}
-void rbmk_state::rbmk(machine_config &config)
+
+void gms_2layers_state::rbmk(machine_config &config)
{
M68000(config, m_maincpu, 22_MHz_XTAL / 2);
- m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::rbmk_mem);
- m_maincpu->set_vblank_int("screen", FUNC(rbmk_state::irq1_line_hold));
+ m_maincpu->set_addrmap(AS_PROGRAM, &gms_2layers_state::rbmk_mem);
+ m_maincpu->set_vblank_int("screen", FUNC(gms_2layers_state::irq1_line_hold));
AT89C4051(config, m_mcu, 22_MHz_XTAL / 4); // frequency isn't right
- m_mcu->set_addrmap(AS_PROGRAM, &rbmk_state::mcu_mem);
- m_mcu->set_addrmap(AS_IO, &rbmk_state::mcu_io);
- m_mcu->port_out_cb<3>().set(FUNC(rbmk_state::mcu_io_mux_w));
+ m_mcu->set_addrmap(AS_PROGRAM, &gms_2layers_state::mcu_mem);
+ m_mcu->set_addrmap(AS_IO, &gms_2layers_state::mcu_io);
+ m_mcu->port_out_cb<3>().set(FUNC(gms_2layers_state::mcu_io_mux_w));
GFXDECODE(config, m_gfxdecode, m_palette, gfx_rbmk);
@@ -1205,7 +1239,7 @@ void rbmk_state::rbmk(machine_config &config)
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 64*8-1, 0*8, 32*8-1);
- screen.set_screen_update(FUNC(rbmk_state::screen_update));
+ screen.set_screen_update(FUNC(gms_2layers_state::screen_update));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x800);
@@ -1224,27 +1258,29 @@ void rbmk_state::rbmk(machine_config &config)
m_ymsnd->add_route(1, "rspeaker", 0.60);
}
-void rbmk_state::rbspm(machine_config &config)
+void gms_2layers_state::rbspm(machine_config &config)
{
rbmk(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::rbspm_mem);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gms_2layers_state::rbspm_mem);
// PIC16F84 but no CPU core available
}
-void rbmk_state::super555(machine_config &config)
+void gms_2layers_state::super555(machine_config &config)
{
rbmk(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::super555_mem);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gms_2layers_state::super555_mem);
config.device_remove("mcu");
config.device_remove("ymsnd");
}
-void rbmk_state::magslot(machine_config &config)
+void gms_3layers_state::magslot(machine_config &config)
{
super555(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &rbmk_state::magslot_mem);
+ m_maincpu->set_addrmap(AS_PROGRAM, &gms_3layers_state::magslot_mem);
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(gms_3layers_state::screen_update));
m_gfxdecode->set_info(gfx_magslot);
}
@@ -1467,7 +1503,7 @@ ROM_END
// the following inits patch out protection (?) checks to allow for testing
// unfortunately the various U errors shown don't correspond to correct PCB locations
-void rbmk_state::init_rbspm()
+void gms_2layers_state::init_rbspm()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
@@ -1477,14 +1513,14 @@ void rbmk_state::init_rbspm()
rom[0x1f1fc / 2] = 0x6000;
}
-void rbmk_state::init_sc2in1()
+void gms_3layers_state::init_sc2in1()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
rom[0x45f48 / 2] = 0xff84;
}
-void rbmk_state::init_super555()
+void gms_2layers_state::init_super555()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
@@ -1493,7 +1529,7 @@ void rbmk_state::init_super555()
rom[0x4782e / 2] = 0x6000; // 0x0A U135 ERROR
}
-void rbmk_state::init_ballch()
+void gms_2layers_state::init_ballch()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
@@ -1501,7 +1537,7 @@ void rbmk_state::init_ballch()
rom[0x13212 / 2] = 0x4e71; // U64 U136 ERROR
}
-void rbmk_state::init_cots()
+void gms_2layers_state::init_cots()
{
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
@@ -1516,16 +1552,16 @@ void rbmk_state::init_cots()
// mahjong
-GAME( 1998, rbmk, 0, rbmk, rbmk, rbmk_state, empty_init, ROT0, "GMS", "Shizhan Majiang Wang (Version 8.8)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // misses YM2151 hookup, Oki hookup may be imperfect
-GAME( 1998, rbspm, 0, rbspm, rbspm, rbmk_state, init_rbspm, ROT0, "GMS", "Shizhan Ding Huang Maque (Version 4.1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
+GAME( 1998, rbmk, 0, rbmk, rbmk, gms_2layers_state, empty_init, ROT0, "GMS", "Shizhan Majiang Wang (Version 8.8)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // misses YM2151 hookup, Oki hookup may be imperfect
+GAME( 1998, rbspm, 0, rbspm, rbspm, gms_2layers_state, init_rbspm, ROT0, "GMS", "Shizhan Ding Huang Maque (Version 4.1)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
// card games
-GAME( 1999, super555, 0, super555, super555, rbmk_state, init_super555, ROT0, "GMS", "Super 555 (English version V1.5)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
-GAME( 2001, sc2in1, 0, magslot, sc2in1, rbmk_state, init_sc2in1, ROT0, "GMS", "Super Card 2 in 1 (English version 03.23)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
+GAME( 1999, super555, 0, super555, super555, gms_2layers_state, init_super555, ROT0, "GMS", "Super 555 (English version V1.5)", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
+GAME( 2001, sc2in1, 0, magslot, sc2in1, gms_3layers_state, init_sc2in1, ROT0, "GMS", "Super Card 2 in 1 (English version 03.23)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
// slot, on slightly different PCB
-GAME( 2003, magslot, 0, magslot, magslot, rbmk_state, empty_init, ROT0, "GMS", "Magic Slot (normal 1.0C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // needs implementing of 3rd GFX layer, correct GFX decode for 1st layer, inputs
+GAME( 2003, magslot, 0, magslot, magslot, gms_3layers_state, empty_init, ROT0, "GMS", "Magic Slot (normal 1.0C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // needs implementing of 3rd GFX layer, correct GFX decode for 1st layer, inputs
// train games
-GAME( 2002, ballch, 0, super555, ballch, rbmk_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
-GAME( 2005, cots, 0, super555, cots, rbmk_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
+GAME( 2002, ballch, 0, super555, ballch, gms_2layers_state, init_ballch, ROT0, "TVE", "Ball Challenge (20020607 1.0 OVERSEA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now
+GAME( 2005, cots, 0, super555, cots, gms_2layers_state, init_cots, ROT0, "ECM", "Creatures of the Sea (20050328 USA 6.3)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // stops during boot, patched for now