summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/coco/coco_multi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/coco/coco_multi.cpp')
-rw-r--r--src/devices/bus/coco/coco_multi.cpp228
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
//-------------------------------------------------