Untangle cartslot from TV Boy, replace unnecessary bankdev with ROM

bank, fix save state for TV Boy.

(nw) This is a great example of why trying to make a derived class that
removes stuff from the base is a bad idea.  The machine start hook for
a2600 both registered variables for save states and mapped the
cartridge.  The tvboy drivers couldn't call this as there's no cartridge
slot present.  This meant they didn't register for save state properly
either.  It may seem tempting to just make devices optional in the base
class, but you lose useful validation and set yourself up for subtle
issues like this.  It's better to separate out the common parts into a
base class.
This commit is contained in:
Vas Crabb 2018-02-23 10:32:30 +11:00
parent aa153f753e
commit 18541972c0
3 changed files with 179 additions and 154 deletions

View File

@ -29,7 +29,7 @@ TODO:
static const uint16_t supported_screen_heights[4] = { 262, 312, 328, 342 };
ADDRESS_MAP_START(a2600_state::a2600_mem) // 6507 has 13-bit address space, 0x0000 - 0x1fff
ADDRESS_MAP_START(a2600_base_state::a2600_mem) // 6507 has 13-bit address space, 0x0000 - 0x1fff
AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0f00) AM_DEVREADWRITE("tia_video", tia_video_device, read, write)
AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0d00) AM_RAM AM_SHARE("riot_ram")
#if USE_NEW_RIOT
@ -113,7 +113,7 @@ WRITE8_MEMBER(a2600_state::cart_over_all_w)
/* 0x300 - 0x3ff already masked out */
}
WRITE8_MEMBER(a2600_state::switch_A_w)
WRITE8_MEMBER(a2600_base_state::switch_A_w)
{
/* Left controller port */
m_joy1->joy_w( data >> 4 );
@ -129,54 +129,54 @@ WRITE8_MEMBER(a2600_state::switch_A_w)
// }
}
READ8_MEMBER(a2600_state::switch_A_r)
READ8_MEMBER(a2600_base_state::switch_A_r)
{
uint8_t val = 0;
/* Left controller port PINs 1-4 ( 4321 ) */
val |= ( m_joy1->joy_r() & 0x0F ) << 4;
// Left controller port PINs 1-4 ( 4321 )
val |= (m_joy1->joy_r() & 0x0f) << 4;
/* Right controller port PINs 1-4 ( 4321 ) */
val |= m_joy2->joy_r() & 0x0F;
// Right controller port PINs 1-4 ( 4321 )
val |= m_joy2->joy_r() & 0x0f;
return val;
}
WRITE8_MEMBER(a2600_state::switch_B_w)
WRITE8_MEMBER(a2600_base_state::switch_B_w)
{
}
WRITE_LINE_MEMBER(a2600_state::irq_callback)
WRITE_LINE_MEMBER(a2600_base_state::irq_callback)
{
}
READ8_MEMBER(a2600_state::riot_input_port_8_r)
READ8_MEMBER(a2600_base_state::riot_input_port_8_r)
{
return m_swb->read();
}
READ16_MEMBER(a2600_state::a2600_read_input_port)
READ16_MEMBER(a2600_base_state::a2600_read_input_port)
{
switch( offset )
switch (offset)
{
case 0: /* Left controller port PIN 5 */
case 0: // Left controller port PIN 5
return m_joy1->pot_x_r();
case 1: /* Left controller port PIN 9 */
case 1: // Left controller port PIN 9
return m_joy1->pot_y_r();
case 2: /* Right controller port PIN 5 */
case 2: // Right controller port PIN 5
return m_joy2->pot_x_r();
case 3: /* Right controller port PIN 9 */
case 3: // Right controller port PIN 9
return m_joy2->pot_y_r();
case 4: /* Left controller port PIN 6 */
return ( m_joy1->joy_r() & 0x20 ) ? 0xff : 0x7f;
case 4: // Left controller port PIN 6
return (m_joy1->joy_r() & 0x20) ? 0xff : 0x7f;
case 5: /* Right controller port PIN 6 */
return ( m_joy2->joy_r() & 0x20 ) ? 0xff : 0x7f;
case 5: // Right controller port PIN 6
return (m_joy2->joy_r() & 0x20) ? 0xff : 0x7f;
}
return 0xff;
}
@ -190,7 +190,7 @@ READ16_MEMBER(a2600_state::a2600_read_input_port)
Q-Bert's Qubes (NTSC,F6) at 0x1594
Berzerk at 0xF093.
*/
READ8_MEMBER(a2600_state::a2600_get_databus_contents)
READ8_MEMBER(a2600_base_state::a2600_get_databus_contents)
{
uint16_t last_address, prev_address;
uint8_t last_byte, prev_byte;
@ -228,7 +228,7 @@ static const rectangle visarea[4] = {
};
#endif
WRITE16_MEMBER(a2600_state::a2600_tia_vsync_callback)
WRITE16_MEMBER(a2600_base_state::a2600_tia_vsync_callback)
{
int i;
@ -245,7 +245,7 @@ WRITE16_MEMBER(a2600_state::a2600_tia_vsync_callback)
}
}
WRITE16_MEMBER(a2600_state::a2600_tia_vsync_callback_pal)
WRITE16_MEMBER(a2600_base_state::a2600_tia_vsync_callback_pal)
{
int i;
@ -284,76 +284,81 @@ WRITE8_MEMBER(a2600_state::cart_over_tia_w)
m_tia->write(space, offset, data);
}
void a2600_state::machine_start()
void a2600_base_state::machine_start()
{
m_current_screen_height = m_screen->height();
memset(m_riot_ram, 0x00, 0x80);
save_item(NAME(m_current_screen_height));
}
void a2600_state::machine_start()
{
a2600_base_state::machine_start();
switch (m_cart->get_cart_type())
{
case A26_2K:
case A26_4K:
case A26_F4:
case A26_F8:
case A26_F8SW:
case A26_FA:
case A26_E0:
case A26_E7:
case A26_CV:
case A26_DC:
case A26_FV:
case A26_8IN1:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_F6:
case A26_DPC:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_FE:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x01fe, 0x01ff, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_3E:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this));
break;
case A26_3F:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this));
break;
case A26_UA:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x200, 0x27f, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_JVP:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
// to verify the actual behavior...
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfa0, 0xfc0, read8_delegate(FUNC(a2600_state::cart_over_riot_r), this), write8_delegate(FUNC(a2600_state::cart_over_riot_w), this));
break;
case A26_4IN1:
case A26_32IN1:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_SS:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_CM:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_X07:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x0fff, read8_delegate(FUNC(a2600_state::cart_over_all_r), this), write8_delegate(FUNC(a2600_state::cart_over_all_w), this));
break;
case A26_HARMONY:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_2K:
case A26_4K:
case A26_F4:
case A26_F8:
case A26_F8SW:
case A26_FA:
case A26_E0:
case A26_E7:
case A26_CV:
case A26_DC:
case A26_FV:
case A26_8IN1:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_F6:
case A26_DPC:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_FE:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_read_handler(0x01fe, 0x01ff, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_3E:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_ram),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this));
break;
case A26_3F:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::cart_over_tia_w), this));
break;
case A26_UA:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x200, 0x27f, read8_delegate(FUNC(vcs_cart_slot_device::read_bank),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
case A26_JVP:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
// to verify the actual behavior...
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xfa0, 0xfc0, read8_delegate(FUNC(a2600_state::cart_over_riot_r), this), write8_delegate(FUNC(a2600_state::cart_over_riot_w), this));
break;
case A26_4IN1:
case A26_32IN1:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_SS:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_CM:
m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart));
break;
case A26_X07:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x0fff, read8_delegate(FUNC(a2600_state::cart_over_all_r), this), write8_delegate(FUNC(a2600_state::cart_over_all_w), this));
break;
case A26_HARMONY:
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x1fff, read8_delegate(FUNC(vcs_cart_slot_device::read_rom),(vcs_cart_slot_device*)m_cart), write8_delegate(FUNC(vcs_cart_slot_device::write_bank),(vcs_cart_slot_device*)m_cart));
break;
}
/* Banks may have changed, reset the cpu so it uses the correct reset vector */
// Banks may have changed, reset the cpu so it uses the correct reset vector
m_maincpu->reset();
save_item(NAME(m_current_screen_height));
}
@ -361,18 +366,21 @@ void a2600_state::machine_start()
// try to detect 2600 controller setup. returns 32bits with left/right controller info
unsigned a2600_state::long detect_2600controllers()
{
#define JOYS 0x001
#define PADD 0x002
#define KEYP 0x004
#define LGUN 0x008
#define INDY 0x010
#define BOOS 0x020
#define KVID 0x040
#define CMTE 0x080
#define MLNK 0x100
#define AMSE 0x200
#define CX22 0x400
#define CX80 0x800
enum
{
JOYS = 0x001,
PADD = 0x002,
KEYP = 0x004,
LGUN = 0x008,
INDY = 0x010,
BOOS = 0x020,
KVID = 0x040,
CMTE = 0x080,
MLNK = 0x100,
AMSE = 0x200,
CX22 = 0x400,
CX80 = 0x800
};
unsigned int left,right;
int i,j,foundkeypad = 0;

View File

@ -18,36 +18,48 @@ TODO:
#include "softlist.h"
#include "speaker.h"
class tvboy_state : public a2600_state
class tvboy_state : public a2600_base_state
{
public:
tvboy_state(const machine_config &mconfig, device_type type, const char *tag)
: a2600_state(mconfig, type, tag)
: a2600_base_state(mconfig, type, tag)
, m_crom(*this, "crom")
, m_rom(*this, "mainrom") { }
DECLARE_WRITE8_MEMBER(bank_write);
, m_rom(*this, "mainrom")
{ }
void tvboyii(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
DECLARE_WRITE8_MEMBER(bank_write);
void rom_map(address_map &map);
void tvboy_mem(address_map &map);
private:
required_device<address_map_bank_device> m_crom;
required_region_ptr<uint8_t> m_rom;
virtual void machine_reset() override;
private:
required_memory_bank m_crom;
required_region_ptr<uint8_t> m_rom;
};
void tvboy_state::machine_reset() {
m_crom->set_bank(0);
a2600_state::machine_reset();
void tvboy_state::machine_start()
{
a2600_base_state::machine_start();
m_crom->configure_entries(0, m_rom.bytes() / 0x1000, &m_rom[0], 0x1000);
}
WRITE8_MEMBER(tvboy_state::bank_write) {
void tvboy_state::machine_reset()
{
m_crom->set_entry(0);
a2600_base_state::machine_reset();
}
WRITE8_MEMBER(tvboy_state::bank_write)
{
logerror("banking (?) write %04x, %02x\n", offset, data);
if ((offset & 0xFF00) == 0x0800)
m_crom->set_bank(data);
if ((offset & 0xff00) == 0x0800)
m_crom->set_entry(data);
}
ADDRESS_MAP_START(tvboy_state::tvboy_mem) // 6507 has 13-bit address space, 0x0000 - 0x1fff
@ -59,11 +71,7 @@ ADDRESS_MAP_START(tvboy_state::tvboy_mem) // 6507 has 13-bit address space, 0x00
AM_RANGE(0x0280, 0x029f) AM_MIRROR(0x0d00) AM_DEVREADWRITE("riot", riot6532_device, read, write)
#endif
AM_RANGE(0x1000, 0x1fff) AM_WRITE(bank_write)
AM_RANGE(0x1000, 0x1fff) AM_DEVICE("crom", address_map_bank_device, amap8)
ADDRESS_MAP_END
ADDRESS_MAP_START(tvboy_state::rom_map)
AM_RANGE(0x00000, 0x7ffff) AM_ROM AM_REGION("mainrom", 0)
AM_RANGE(0x1000, 0x1fff) AM_ROMBANK("crom")
ADDRESS_MAP_END
#define MASTER_CLOCK_PAL 3546894
@ -74,13 +82,6 @@ MACHINE_CONFIG_START(tvboy_state::tvboyii)
MCFG_CPU_PROGRAM_MAP(tvboy_mem)
MCFG_M6502_DISABLE_DIRECT()
MCFG_DEVICE_ADD("crom", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(rom_map)
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8)
MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(19)
MCFG_ADDRESS_MAP_BANK_STRIDE(0x1000)
/* video hardware */
MCFG_DEVICE_ADD("tia_video", TIA_PAL_VIDEO, 0)
MCFG_TIA_READ_INPUT_PORT_CB(READ16(tvboy_state, a2600_read_input_port))

View File

@ -36,27 +36,23 @@
#define CONTROL2_TAG "joyport2"
class a2600_state : public driver_device
class a2600_base_state : public driver_device
{
public:
a2600_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
protected:
a2600_base_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_riot_ram(*this, "riot_ram"),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
m_cart(*this, "cartslot"),
m_tia(*this, "tia_video"),
m_maincpu(*this, "maincpu"),
m_riot(*this, "riot"),
m_joy1(*this, CONTROL1_TAG),
m_joy2(*this, CONTROL2_TAG),
m_screen(*this, "screen"),
m_swb(*this, "SWB"),
m_riot(*this, "riot")
m_swb(*this, "SWB")
{ }
void a2600(machine_config &config);
void a2600p(machine_config &config);
protected:
virtual void machine_start() override;
DECLARE_WRITE8_MEMBER(switch_A_w);
DECLARE_READ8_MEMBER(switch_A_r);
DECLARE_WRITE8_MEMBER(switch_B_w);
@ -66,6 +62,43 @@ protected:
DECLARE_READ8_MEMBER(a2600_get_databus_contents);
DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback);
DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback_pal);
void a2600_mem(address_map &map);
required_shared_ptr<uint8_t> m_riot_ram;
required_device<tia_video_device> m_tia;
required_device<m6507_device> m_maincpu;
#if USE_NEW_RIOT
required_device<mos6532_t> m_riot;
#else
required_device<riot6532_device> m_riot;
#endif
private:
uint16_t m_current_screen_height;
required_device<vcs_control_port_device> m_joy1;
required_device<vcs_control_port_device> m_joy2;
required_device<screen_device> m_screen;
required_ioport m_swb;
};
class a2600_state : public a2600_base_state
{
public:
a2600_state(const machine_config &mconfig, device_type type, const char *tag) :
a2600_base_state(mconfig, type, tag),
m_cart(*this, "cartslot")
{ }
void a2600(machine_config &config);
void a2600p(machine_config &config);
protected:
virtual void machine_start() override;
DECLARE_WRITE8_MEMBER(cart_over_tia_w);
// investigate how the carts mapped here (Mapper JVP) interact with the RIOT device
DECLARE_READ8_MEMBER(cart_over_riot_r);
@ -74,26 +107,9 @@ protected:
DECLARE_WRITE8_MEMBER(cart_over_all_w);
void a2600_cartslot(machine_config &config);
void a2600_mem(address_map &map);
private:
required_shared_ptr<uint8_t> m_riot_ram;
uint16_t m_current_screen_height;
required_device<vcs_control_port_device> m_joy1;
required_device<vcs_control_port_device> m_joy2;
optional_device<vcs_cart_slot_device> m_cart;
required_device<tia_video_device> m_tia;
required_device<m6507_device> m_maincpu;
required_device<screen_device> m_screen;
required_ioport m_swb;
#if USE_NEW_RIOT
required_device<mos6532_t> m_riot;
#else
required_device<riot6532_device> m_riot;
#endif
required_device<vcs_cart_slot_device> m_cart;
};
#endif // MAME_INCLUDES_A2600_H