diff options
Diffstat (limited to 'src/devices/bus/coco/coco_multi.cpp')
-rw-r--r-- | src/devices/bus/coco/coco_multi.cpp | 170 |
1 files changed, 92 insertions, 78 deletions
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp index ee7cbfb41c1..1e385dab107 100644 --- a/src/devices/bus/coco/coco_multi.cpp +++ b/src/devices/bus/coco/coco_multi.cpp @@ -57,15 +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_ram.h" -#include "coco_rs232.h" -#include "coco_ssc.h" -#include "coco_stecomp.h" #define SLOT1_TAG "slot1" #define SLOT2_TAG "slot2" @@ -74,6 +65,14 @@ #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 @@ -101,6 +100,8 @@ namespace 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; @@ -119,10 +120,12 @@ namespace virtual address_space &cartridge_space() override; virtual ioport_constructor device_input_ports() const override; - private: // device references required_device_array<cococart_slot_device, 4> m_slots; + void update_line(int slot_number, line ln); + + private: // internal state u8 m_select; u8 m_block; @@ -138,75 +141,91 @@ namespace void set_select(u8 new_select); u8 ff7f_read(); void ff7f_write(u8 data); - 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); }; }; +// ======================> 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; +}; + + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ static void coco_cart_slot1_3(device_slot_interface &device) { - device.option_add("banked_16k", COCO_PAK_BANKED); - device.option_add("dcmodem", COCO_DCMODEM); - device.option_add("games_master", COCO_PAK_GMC); - device.option_add("orch90", COCO_ORCH90); - device.option_add("pak", COCO_PAK); - device.option_add("ram", COCO_PAK_RAM); - device.option_add("rs232", COCO_RS232); - device.option_add("ssc", COCO_SSC); - device.option_add("stecomp", COCO_STEREO_COMPOSER); + coco_cart_add_basic_devices(device); } + static void coco_cart_slot4(device_slot_interface &device) { - device.option_add("banked_16k", COCO_PAK_BANKED); - device.option_add("cc2hdb1", COCO2_HDB1); - device.option_add("cc3hdb1", COCO3_HDB1); - device.option_add("dcmodem", COCO_DCMODEM); - device.option_add("fdcv11", COCO_FDC_V11); - device.option_add("games_master", COCO_PAK_GMC); - device.option_add("orch90", COCO_ORCH90); - device.option_add("pak", COCO_PAK); - device.option_add("ram", COCO_PAK_RAM); - device.option_add("rs232", COCO_RS232); - device.option_add("ssc", COCO_SSC); - device.option_add("stecomp", COCO_STEREO_COMPOSER); + 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 ) @@ -223,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") @@ -243,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, u32 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 @@ -359,6 +388,8 @@ cococart_slot_device &coco_multipak_device::active_cts_slot() 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); @@ -408,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: @@ -500,24 +532,6 @@ void coco_multipak_device::scs_write(offs_t offset, u8 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 //------------------------------------------------- |