From c49f1ee406ca614172aa6a2485197496fa86f38d Mon Sep 17 00:00:00 2001 From: tim lindner Date: Thu, 24 Dec 2020 19:28:09 -0800 Subject: [PATCH] =?UTF-8?q?bus/coco=20Added=20CoCo=C2=A0and=20Dragon=20MID?= =?UTF-8?q?I=20cartridges.=20(#7589)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/src/bus.lua | 2 + src/devices/bus/coco/coco_midi.cpp | 112 +++++++++++++++++++++++++++++ src/devices/bus/coco/coco_midi.h | 14 ++++ src/devices/bus/coco/cococart.cpp | 4 +- src/mame/drivers/dragon.cpp | 2 + 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/devices/bus/coco/coco_midi.cpp create mode 100644 src/devices/bus/coco/coco_midi.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 47313f4f5ca..1f158ae6b06 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -3409,6 +3409,8 @@ if (BUSES["COCO"]~=null) then MAME_DIR .. "src/devices/bus/coco/coco_fdc.h", MAME_DIR .. "src/devices/bus/coco/coco_gmc.cpp", MAME_DIR .. "src/devices/bus/coco/coco_gmc.h", + MAME_DIR .. "src/devices/bus/coco/coco_midi.cpp", + MAME_DIR .. "src/devices/bus/coco/coco_midi.h", MAME_DIR .. "src/devices/bus/coco/coco_multi.cpp", MAME_DIR .. "src/devices/bus/coco/coco_multi.h", MAME_DIR .. "src/devices/bus/coco/coco_orch90.cpp", diff --git a/src/devices/bus/coco/coco_midi.cpp b/src/devices/bus/coco/coco_midi.cpp new file mode 100644 index 00000000000..6bb27eb5456 --- /dev/null +++ b/src/devices/bus/coco/coco_midi.cpp @@ -0,0 +1,112 @@ +// license:BSD-3-Clause +// copyright-holders:tim lindner +/*************************************************************************** + + coco_midi.cpp + + Emulation of Rutherford Research's Midi Pak and also compatible with + Go4Retro's MIDI Maestro. + +***************************************************************************/ + +#include "emu.h" +#include "coco_midi.h" + +#include "machine/6850acia.h" +#include "machine/clock.h" +#include "bus/midi/midi.h" + +// ======================> coco_midi_device + +class coco_midi_device : + public device_t, + public device_cococart_interface +{ + public: + // construction/destruction + coco_midi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + protected: + coco_midi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + required_device m_acia; + DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); + + private: + required_device m_mdthru; +}; + +class dragon_midi_device : public coco_midi_device +{ + public: + // construction/destruction + dragon_midi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + protected: + dragon_midi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + virtual void device_start() override; +}; + +coco_midi_device::coco_midi_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_acia(*this, "mc6850") + , m_mdthru(*this, "mdthru") +{ +} + +coco_midi_device::coco_midi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : coco_midi_device(mconfig, COCO_MIDI, tag, owner, clock) +{ +} + +void coco_midi_device::device_add_mconfig(machine_config &config) +{ + ACIA6850(config, m_acia).txd_handler().set("mdout", FUNC(midi_port_device::write_txd)); + m_acia->irq_handler().set(FUNC(coco_midi_device::acia_irq_w)); + + midi_port_device &mdin(MIDI_PORT(config, "mdin", midiin_slot, "midiin")); + mdin.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + mdin.rxd_handler().append(m_mdthru, FUNC(midi_port_device::write_txd)); + MIDI_PORT(config, m_mdthru, midiout_slot, "midiout"); + MIDI_PORT(config, "mdout", midiout_slot, "midiout"); + + clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16)); + acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc)); + acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)); +} + +void coco_midi_device::device_start() +{ + install_readwrite_handler(0xff6e, 0xff6f, + read8sm_delegate(m_acia, FUNC(acia6850_device::read)), + write8sm_delegate(m_acia, FUNC(acia6850_device::write))); +} + +WRITE_LINE_MEMBER(coco_midi_device::acia_irq_w) +{ + set_line_value(line::CART, state == 0); +} + +dragon_midi_device::dragon_midi_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : coco_midi_device(mconfig, type, tag, owner, clock) +{ +} + +dragon_midi_device::dragon_midi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : dragon_midi_device(mconfig, DRAGON_MIDI, tag, owner, clock) +{ +} + +void dragon_midi_device::device_start() +{ + install_readwrite_handler(0xff74, 0xff75, + read8sm_delegate(m_acia, FUNC(acia6850_device::read)), + write8sm_delegate(m_acia, FUNC(acia6850_device::write))); +} + +DEFINE_DEVICE_TYPE(COCO_MIDI, coco_midi_device, "coco_midi", "CoCo MIDI PAK"); +DEFINE_DEVICE_TYPE(DRAGON_MIDI, dragon_midi_device, "dragon_midi", "Dragon MIDI PAK"); diff --git a/src/devices/bus/coco/coco_midi.h b/src/devices/bus/coco/coco_midi.h new file mode 100644 index 00000000000..668c074aac5 --- /dev/null +++ b/src/devices/bus/coco/coco_midi.h @@ -0,0 +1,14 @@ +// license:BSD-3-Clause +// copyright-holders:tim lindner +#ifndef MAME_BUS_COCO_COCO_MIDI_H +#define MAME_BUS_COCO_COCO_MIDI_H + +#include "cococart.h" + +#pragma once + +// device type definition +DECLARE_DEVICE_TYPE(COCO_MIDI, coco_midi_device) +DECLARE_DEVICE_TYPE(DRAGON_MIDI, dragon_midi_device) + +#endif // MAME_BUS_COCO_COCO_MIDI_H diff --git a/src/devices/bus/coco/cococart.cpp b/src/devices/bus/coco/cococart.cpp index 4a13fb4491c..78f78288753 100644 --- a/src/devices/bus/coco/cococart.cpp +++ b/src/devices/bus/coco/cococart.cpp @@ -43,6 +43,7 @@ #include "coco_dcmodem.h" #include "coco_fdc.h" #include "coco_gmc.h" +#include "coco_midi.h" #include "coco_multi.h" #include "coco_orch90.h" #include "coco_pak.h" @@ -694,11 +695,12 @@ void coco_cart_add_basic_devices(device_slot_interface &device) { // basic devices, on both the main slot and the Multi-Pak interface device.option_add_internal("banked_16k", COCO_PAK_BANKED); + device.option_add_internal("pak", COCO_PAK); device.option_add("ccpsg", COCO_PSG); device.option_add("dcmodem", COCO_DCMODEM); device.option_add("games_master", COCO_PAK_GMC); + device.option_add("midi", COCO_MIDI); device.option_add("orch90", COCO_ORCH90); - device.option_add_internal("pak", COCO_PAK); device.option_add("ram", COCO_PAK_RAM); device.option_add("rs232", COCO_RS232); device.option_add("ssc", COCO_SSC); diff --git a/src/mame/drivers/dragon.cpp b/src/mame/drivers/dragon.cpp index 7f4ac70715b..ed907dc1210 100644 --- a/src/mame/drivers/dragon.cpp +++ b/src/mame/drivers/dragon.cpp @@ -25,6 +25,7 @@ #include "bus/coco/coco_gmc.h" #include "bus/coco/coco_orch90.h" +#include "bus/coco/coco_midi.h" #include "bus/coco/coco_pak.h" #include "bus/coco/coco_psg.h" #include "bus/coco/coco_ram.h" @@ -213,6 +214,7 @@ void dragon_cart(device_slot_interface &device) device.option_add("gmc", COCO_PAK_GMC); device.option_add("jcbsnd", DRAGON_JCBSND); device.option_add("jcbspch", DRAGON_JCBSPCH); + device.option_add("midi", DRAGON_MIDI); device.option_add("orch90", COCO_ORCH90); device.option_add("pak", COCO_PAK); device.option_add("premier_fdc", PREMIER_FDC);