diff options
Diffstat (limited to 'src/devices/bus/coco/coco_multi.cpp')
-rw-r--r-- | src/devices/bus/coco/coco_multi.cpp | 228 |
1 files changed, 124 insertions, 104 deletions
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index d6c5627ca11..312823b7a8f 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -57,13 +57,6 @@ #include "coco_multi.h" #include "cococart.h" -#include "coco_dcmodem.h" -#include "coco_fdc.h" -#include "coco_gmc.h" -#include "coco_orch90.h" -#include "coco_pak.h" -#include "coco_rs232.h" -#include "coco_ssc.h" #define SLOT1_TAG "slot1" #define SLOT2_TAG "slot2" @@ -72,12 +65,20 @@ #define SWITCH_CONFIG_TAG "switch" +#define LOG_CART (1U << 1) // shows cart line changes +#define LOG_SWITCH (1U << 2) // shows switch changes +//#define VERBOSE (LOG_CART|LOG_SWITCH) + +#include "logmacro.h" + +#define LOGCART(...) LOGMASKED(LOG_CART, __VA_ARGS__) +#define LOGSWITCH(...) LOGMASKED(LOG_SWITCH, __VA_ARGS__) //************************************************************************** // MACROS / CONSTANTS //************************************************************************** -static constexpr uint8_t MULTI_SLOT_LOOKUP[] = {0xcc, 0xdd, 0xee, 0xff}; +static constexpr u8 MULTI_SLOT_LOOKUP[] = {0xcc, 0xdd, 0xee, 0xff}; //************************************************************************** // TYPE DEFINITIONS @@ -94,36 +95,40 @@ namespace { public: // construction/destruction - coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); INPUT_CHANGED_MEMBER( switch_changed ); protected: + coco_multipak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - virtual READ8_MEMBER(cts_read) override; - virtual WRITE8_MEMBER(cts_write) override; - virtual READ8_MEMBER(scs_read) override; - virtual WRITE8_MEMBER(scs_write) override; + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual u8 cts_read(offs_t offset) override; + virtual void cts_write(offs_t offset, u8 data) override; + virtual u8 scs_read(offs_t offset) override; + virtual void scs_write(offs_t offset, u8 data) override; virtual void set_sound_enable(bool sound_enable) override; // optional information overrides - virtual void device_add_mconfig(machine_config &config) override; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; - virtual uint8_t* get_cart_base() override; - virtual uint32_t get_cart_size() override; + virtual u8 *get_cart_base() override; + virtual u32 get_cart_size() override; virtual address_space &cartridge_space() override; - virtual ioport_constructor device_input_ports() const override; + virtual ioport_constructor device_input_ports() const override ATTR_COLD; - private: // device references required_device_array<cococart_slot_device, 4> m_slots; + void update_line(int slot_number, line ln); + + private: // internal state - uint8_t m_select; - uint8_t m_block; + u8 m_select; + u8 m_block; // internal accessors int active_scs_slot_number() const; @@ -133,79 +138,99 @@ namespace cococart_slot_device &active_cts_slot(); // methods - void set_select(uint8_t new_select); - DECLARE_READ8_MEMBER(ff7f_read); - DECLARE_WRITE8_MEMBER(ff7f_write); - void update_line(int slot_number, line ln); - - DECLARE_WRITE_LINE_MEMBER(multi_slot1_cart_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot1_nmi_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot1_halt_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot2_cart_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot2_nmi_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot2_halt_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot3_cart_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot3_nmi_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot3_halt_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot4_cart_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot4_nmi_w); - DECLARE_WRITE_LINE_MEMBER(multi_slot4_halt_w); + void set_select(u8 new_select); + u8 ff7f_read(); + void ff7f_write(u8 data); }; }; +// ======================> dragon_multipak_device + +class dragon_multipak_device : public coco_multipak_device +{ +public: + // construction/destruction + dragon_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; +}; + + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ static void coco_cart_slot1_3(device_slot_interface &device) { - device.option_add("rs232", COCO_RS232); - device.option_add("dcmodem", COCO_DCMODEM); - device.option_add("orch90", COCO_ORCH90); - device.option_add("ssc", COCO_SSC); - device.option_add("games_master", COCO_PAK_GMC); - device.option_add("banked_16k", COCO_PAK_BANKED); - device.option_add("pak", COCO_PAK); + coco_cart_add_basic_devices(device); } + static void coco_cart_slot4(device_slot_interface &device) { - device.option_add("cc2hdb1", COCO2_HDB1); - device.option_add("cc3hdb1", COCO3_HDB1); - device.option_add("fdcv11", COCO_FDC_V11); - device.option_add("rs232", COCO_RS232); - device.option_add("dcmodem", COCO_DCMODEM); - device.option_add("orch90", COCO_ORCH90); - device.option_add("ssc", COCO_SSC); - device.option_add("games_master", COCO_PAK_GMC); - device.option_add("banked_16k", COCO_PAK_BANKED); - device.option_add("pak", COCO_PAK); + coco_cart_add_basic_devices(device); + coco_cart_add_fdcs(device); } void coco_multipak_device::device_add_mconfig(machine_config &config) { COCOCART_SLOT(config, m_slots[0], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr); - m_slots[0]->cart_callback().set(FUNC(coco_multipak_device::multi_slot1_cart_w)); - m_slots[0]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot1_nmi_w)); - m_slots[0]->halt_callback().set(FUNC(coco_multipak_device::multi_slot1_halt_w)); + m_slots[0]->cart_callback().set([this](int state) { update_line(1, line::CART); }); + m_slots[0]->nmi_callback().set([this](int state) { update_line(1, line::NMI); }); + m_slots[0]->halt_callback().set([this](int state) { update_line(1, line::HALT); }); COCOCART_SLOT(config, m_slots[1], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr); - m_slots[1]->cart_callback().set(FUNC(coco_multipak_device::multi_slot2_cart_w)); - m_slots[1]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot2_nmi_w)); - m_slots[1]->halt_callback().set(FUNC(coco_multipak_device::multi_slot2_halt_w)); + m_slots[1]->cart_callback().set([this](int state) { update_line(2, line::CART); }); + m_slots[1]->nmi_callback().set([this](int state) { update_line(2, line::NMI); }); + m_slots[1]->halt_callback().set([this](int state) { update_line(2, line::HALT); }); COCOCART_SLOT(config, m_slots[2], DERIVED_CLOCK(1, 1), coco_cart_slot1_3, nullptr); - m_slots[2]->cart_callback().set(FUNC(coco_multipak_device::multi_slot3_cart_w)); - m_slots[2]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot3_nmi_w)); - m_slots[2]->halt_callback().set(FUNC(coco_multipak_device::multi_slot3_halt_w)); - COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), coco_cart_slot4, "fdcv11"); - m_slots[3]->cart_callback().set(FUNC(coco_multipak_device::multi_slot4_cart_w)); - m_slots[3]->nmi_callback().set(FUNC(coco_multipak_device::multi_slot4_nmi_w)); - m_slots[3]->halt_callback().set(FUNC(coco_multipak_device::multi_slot4_halt_w)); + m_slots[2]->cart_callback().set([this](int state) { update_line(3, line::CART); }); + m_slots[2]->nmi_callback().set([this](int state) { update_line(3, line::NMI); }); + m_slots[2]->halt_callback().set([this](int state) { update_line(3, line::HALT); }); + COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), coco_cart_slot4, "fdc"); + m_slots[3]->cart_callback().set([this](int state) { update_line(4, line::CART); }); + m_slots[3]->nmi_callback().set([this](int state) { update_line(4, line::NMI); }); + m_slots[3]->halt_callback().set([this](int state) { update_line(4, line::HALT); }); +} + + +static void dragon_cart_slot1_3(device_slot_interface &device) +{ + dragon_cart_add_basic_devices(device); +} + +static void dragon_cart_slot4(device_slot_interface &device) +{ + dragon_cart_add_basic_devices(device); + dragon_cart_add_fdcs(device); +} + + +void dragon_multipak_device::device_add_mconfig(machine_config &config) +{ + COCOCART_SLOT(config, m_slots[0], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr); + m_slots[0]->cart_callback().set([this](int state) { update_line(1, line::CART); }); + m_slots[0]->nmi_callback().set([this](int state) { update_line(1, line::NMI); }); + m_slots[0]->halt_callback().set([this](int state) { update_line(1, line::HALT); }); + COCOCART_SLOT(config, m_slots[1], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr); + m_slots[1]->cart_callback().set([this](int state) { update_line(2, line::CART); }); + m_slots[1]->nmi_callback().set([this](int state) { update_line(2, line::NMI); }); + m_slots[1]->halt_callback().set([this](int state) { update_line(2, line::HALT); }); + COCOCART_SLOT(config, m_slots[2], DERIVED_CLOCK(1, 1), dragon_cart_slot1_3, nullptr); + m_slots[2]->cart_callback().set([this](int state) { update_line(3, line::CART); }); + m_slots[2]->nmi_callback().set([this](int state) { update_line(3, line::NMI); }); + m_slots[2]->halt_callback().set([this](int state) { update_line(3, line::HALT); }); + COCOCART_SLOT(config, m_slots[3], DERIVED_CLOCK(1, 1), dragon_cart_slot4, "dragon_fdc"); + m_slots[3]->cart_callback().set([this](int state) { update_line(4, line::CART); }); + m_slots[3]->nmi_callback().set([this](int state) { update_line(4, line::NMI); }); + m_slots[3]->halt_callback().set([this](int state) { update_line(4, line::HALT); }); } INPUT_PORTS_START( coco_multipack ) PORT_START( SWITCH_CONFIG_TAG ) - PORT_CONFNAME( 0x03, 0x03, "Multi-Pak Slot Switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, coco_multipak_device, switch_changed, 0) + PORT_CONFNAME( 0x03, 0x03, "Multi-Pak Slot Switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(coco_multipak_device::switch_changed), 0) PORT_CONFSETTING( 0x00, "Slot 1" ) PORT_CONFSETTING( 0x01, "Slot 2" ) PORT_CONFSETTING( 0x02, "Slot 3" ) @@ -217,6 +242,7 @@ INPUT_PORTS_END //************************************************************************** DEFINE_DEVICE_TYPE_PRIVATE(COCO_MULTIPAK, device_cococart_interface, coco_multipak_device, "coco_multipack", "CoCo Multi-Pak Interface") +DEFINE_DEVICE_TYPE_PRIVATE(DRAGON_MULTIPAK, device_cococart_interface, dragon_multipak_device, "dragon_multipack", "Dragon Multi-Pak Interface") @@ -237,13 +263,22 @@ ioport_constructor coco_multipak_device::device_input_ports() const // coco_multipak_device - constructor //------------------------------------------------- -coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, COCO_MULTIPAK, tag, owner, clock) +coco_multipak_device::coco_multipak_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , device_cococart_interface(mconfig, *this) , m_slots(*this, "slot%u", 1), m_select(0), m_block(0) { } +coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : coco_multipak_device(mconfig, COCO_MULTIPAK, tag, owner, clock) +{ +} + +dragon_multipak_device::dragon_multipak_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : coco_multipak_device(mconfig, DRAGON_MULTIPAK, tag, owner, clock) +{ +} //------------------------------------------------- // device_start - device-specific startup @@ -252,7 +287,7 @@ coco_multipak_device::coco_multipak_device(const machine_config &mconfig, const void coco_multipak_device::device_start() { // install $FF7F handler - install_readwrite_handler(0xFF7F, 0xFF7F, read8_delegate(FUNC(coco_multipak_device::ff7f_read), this),write8_delegate(FUNC(coco_multipak_device::ff7f_write), this)); + install_readwrite_handler(0xFF7F, 0xFF7F, read8smo_delegate(*this, FUNC(coco_multipak_device::ff7f_read)), write8smo_delegate(*this, FUNC(coco_multipak_device::ff7f_write))); // initial state m_select = 0xFF; @@ -351,8 +386,10 @@ cococart_slot_device &coco_multipak_device::active_cts_slot() // set_select //------------------------------------------------- -void coco_multipak_device::set_select(uint8_t new_select) +void coco_multipak_device::set_select(u8 new_select) { + LOGSWITCH( "set_select: 0x%02X\n", new_select); + // identify old value for CART, in case this needs to change cococart_slot_device::line_value old_cart = active_cts_slot().get_line_value(line::CART); @@ -372,7 +409,7 @@ void coco_multipak_device::set_select(uint8_t new_select) // ff7f_read //------------------------------------------------- -READ8_MEMBER(coco_multipak_device::ff7f_read) +u8 coco_multipak_device::ff7f_read() { return m_select | 0xcc; } @@ -381,7 +418,7 @@ READ8_MEMBER(coco_multipak_device::ff7f_read) // ff7f_write //------------------------------------------------- -WRITE8_MEMBER(coco_multipak_device::ff7f_write) +void coco_multipak_device::ff7f_write(u8 data) { m_block = 0xff; set_select(data); @@ -402,6 +439,7 @@ void coco_multipak_device::update_line(int slot_number, line ln) case line::CART: // only propagate if this is coming from the slot specified propagate = slot_number == active_cts_slot_number(); + LOGCART( "update_line: slot: %d, line: CART, value: %s, propogate: %s\n", slot_number, owning_slot().line_value_string(slot(slot_number).get_line_value(ln)), propagate ? "yes" : "no" ); break; case line::NMI: @@ -437,7 +475,7 @@ void coco_multipak_device::set_sound_enable(bool sound_enable) // get_cart_base //------------------------------------------------- -uint8_t* coco_multipak_device::get_cart_base() +u8 *coco_multipak_device::get_cart_base() { return active_cts_slot().get_cart_base(); } @@ -447,7 +485,7 @@ uint8_t* coco_multipak_device::get_cart_base() // get_cart_size //------------------------------------------------- -uint32_t coco_multipak_device::get_cart_size() +u32 coco_multipak_device::get_cart_size() { return active_cts_slot().get_cart_size(); } @@ -457,9 +495,9 @@ uint32_t coco_multipak_device::get_cart_size() // cts_read //------------------------------------------------- -READ8_MEMBER(coco_multipak_device::cts_read) +u8 coco_multipak_device::cts_read(offs_t offset) { - return active_cts_slot().cts_read(space, offset); + return active_cts_slot().cts_read(offset); } @@ -467,9 +505,9 @@ READ8_MEMBER(coco_multipak_device::cts_read) // cts_write //------------------------------------------------- -WRITE8_MEMBER(coco_multipak_device::cts_write) +void coco_multipak_device::cts_write(offs_t offset, u8 data) { - active_cts_slot().cts_write(space, offset, data); + active_cts_slot().cts_write(offset, data); } @@ -477,9 +515,9 @@ WRITE8_MEMBER(coco_multipak_device::cts_write) // scs_read //------------------------------------------------- -READ8_MEMBER(coco_multipak_device::scs_read) +u8 coco_multipak_device::scs_read(offs_t offset) { - return active_scs_slot().scs_read(space, offset); + return active_scs_slot().scs_read(offset); } @@ -487,31 +525,13 @@ READ8_MEMBER(coco_multipak_device::scs_read) // scs_write //------------------------------------------------- -WRITE8_MEMBER(coco_multipak_device::scs_write) +void coco_multipak_device::scs_write(offs_t offset, u8 data) { - active_scs_slot().scs_write(space, offset, data); + active_scs_slot().scs_write(offset, data); } //------------------------------------------------- -// multiX_slotX_[cart|nmi|halt] trampolines -//------------------------------------------------- - -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_cart_w) { update_line(1, line::CART); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_nmi_w) { update_line(1, line::NMI); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot1_halt_w) { update_line(1, line::HALT); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_cart_w) { update_line(2, line::CART); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_nmi_w) { update_line(2, line::NMI); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot2_halt_w) { update_line(2, line::HALT); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_cart_w) { update_line(3, line::CART); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_nmi_w) { update_line(3, line::NMI); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot3_halt_w) { update_line(3, line::HALT); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_cart_w) { update_line(4, line::CART); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_nmi_w) { update_line(4, line::NMI); } -WRITE_LINE_MEMBER(coco_multipak_device::multi_slot4_halt_w) { update_line(4, line::HALT); } - - -//------------------------------------------------- // cartridge_space //------------------------------------------------- |