From 18541972c01490823fe2c36e21d3187de5b16dab Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 23 Feb 2018 10:32:30 +1100 Subject: 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. --- src/mame/drivers/a2600.cpp | 200 +++++++++++++++++++++++---------------------- src/mame/drivers/tvboy.cpp | 53 ++++++------ src/mame/includes/a2600.h | 74 ++++++++++------- 3 files changed, 176 insertions(+), 151 deletions(-) diff --git a/src/mame/drivers/a2600.cpp b/src/mame/drivers/a2600.cpp index 8a8bfd9885f..0c16a985bde 100644 --- a/src/mame/drivers/a2600.cpp +++ b/src/mame/drivers/a2600.cpp @@ -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; diff --git a/src/mame/drivers/tvboy.cpp b/src/mame/drivers/tvboy.cpp index c4fd1f02f2c..d0fb7f2b7f3 100644 --- a/src/mame/drivers/tvboy.cpp +++ b/src/mame/drivers/tvboy.cpp @@ -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 m_crom; + required_memory_bank m_crom; required_region_ptr m_rom; - - virtual void machine_reset() override; }; -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); +} + +void tvboy_state::machine_reset() +{ + m_crom->set_entry(0); + a2600_base_state::machine_reset(); } -WRITE8_MEMBER(tvboy_state::bank_write) { +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)) diff --git a/src/mame/includes/a2600.h b/src/mame/includes/a2600.h index 60e933f8d2f..b3fc8edce24 100644 --- a/src/mame/includes/a2600.h +++ b/src/mame/includes/a2600.h @@ -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,34 +62,54 @@ protected: DECLARE_READ8_MEMBER(a2600_get_databus_contents); DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback); DECLARE_WRITE16_MEMBER(a2600_tia_vsync_callback_pal); - 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); - DECLARE_WRITE8_MEMBER(cart_over_riot_w); - DECLARE_READ8_MEMBER(cart_over_all_r); - DECLARE_WRITE8_MEMBER(cart_over_all_w); - void a2600_cartslot(machine_config &config); void a2600_mem(address_map &map); -private: required_shared_ptr m_riot_ram; - uint16_t m_current_screen_height; - - required_device m_joy1; - required_device m_joy2; - optional_device m_cart; required_device m_tia; - required_device m_maincpu; - required_device m_screen; - required_ioport m_swb; #if USE_NEW_RIOT required_device m_riot; #else required_device m_riot; #endif + +private: + uint16_t m_current_screen_height; + + required_device m_joy1; + required_device m_joy2; + + required_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); + DECLARE_WRITE8_MEMBER(cart_over_riot_w); + DECLARE_READ8_MEMBER(cart_over_all_r); + DECLARE_WRITE8_MEMBER(cart_over_all_w); + + void a2600_cartslot(machine_config &config); + +private: + required_device m_cart; +}; + #endif // MAME_INCLUDES_A2600_H -- cgit v1.2.3