bbc: Added Music 2000 and EMR BBC Midi Interface 1MHz bus devices.

This commit is contained in:
Nigel Barnes 2018-12-22 17:44:51 +00:00
parent 9f4e2a58ac
commit 2eb95974d9
6 changed files with 399 additions and 2 deletions

View File

@ -349,8 +349,12 @@ if (BUSES["BBC_1MHZBUS"]~=null) then
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/1mhzbus.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/beebsid.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/beebsid.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/emrmidi.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/emrmidi.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ieee488.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ieee488.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/m2000.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/m2000.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/opus3.cpp",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/opus3.h",
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp",

View File

@ -131,8 +131,9 @@ WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w)
// slot devices
//#include "teletext.h"
#include "emrmidi.h"
#include "ieee488.h"
//#include "m2000.h"
#include "m2000.h"
//#include "m5000.h"
//#include "scsi.h"
//#include "multiform.h"
@ -151,6 +152,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
//device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
//device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
device.option_add("b488", BBC_B488); /* Aries B488 */
device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */
//device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */
//device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
//device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
@ -168,9 +170,10 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
//device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
//device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
device.option_add("b488", BBC_B488); /* Aries B488 */
device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */
//device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */
//device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
//device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 Interface */
device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 Interface */
//device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
//device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
//device.option_add("m87", BBC_M87); /* Peartree Music 87 Synthesiser */

View File

@ -0,0 +1,108 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
EMR BBC Midi Interface
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/EMR_BBCMIDI.html
IUB-1 standard model.
IUB-2 updated model to also sync with Korg rhythm units.
IUB-2T, as IUB-2, with Sync to Tape for supplying click track
to multitrackers.
The Clock Start/Stop port is not implemented. It requires the
device to be also connected to the Userport, providing timing
control on PB0, PB1.
**********************************************************************/
#include "emu.h"
#include "emrmidi.h"
#include "bus/midi/midi.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_EMRMIDI, bbc_emrmidi_device, "bbc_emrmidi", "EMR BBC Midi Interface");
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_emrmidi_device::device_add_mconfig(machine_config &config)
{
ACIA6850(config, m_acia, 0);
m_acia->txd_handler().set("mdout1", FUNC(midi_port_device::write_txd));
m_acia->txd_handler().append("mdout2", FUNC(midi_port_device::write_txd));
m_acia->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
CLOCK(config, m_acia_clock, 2_MHz_XTAL / 4);
m_acia_clock->signal_handler().set(FUNC(bbc_emrmidi_device::write_acia_clock));
midiout_slot(MIDI_PORT(config, "mdout1"));
midiout_slot(MIDI_PORT(config, "mdout2"));
auto &mdin(MIDI_PORT(config, "mdin"));
midiin_slot(mdin);
mdin.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_emrmidi_device - constructor
//-------------------------------------------------
bbc_emrmidi_device::bbc_emrmidi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_EMRMIDI, tag, owner, clock)
, device_bbc_1mhzbus_interface(mconfig, *this)
, m_acia(*this, "acia1")
, m_acia_clock(*this, "acia_clock")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_emrmidi_device::device_start()
{
}
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
READ8_MEMBER(bbc_emrmidi_device::fred_r)
{
uint8_t data = 0xff;
if (offset >= 0xf0 && offset < 0xf2)
{
data = m_acia->read(space, offset & 1);
}
return data;
}
WRITE8_MEMBER(bbc_emrmidi_device::fred_w)
{
if (offset >= 0xf0 && offset < 0xf2)
{
m_acia->write(space, offset & 1, data);
}
}
WRITE_LINE_MEMBER(bbc_emrmidi_device::write_acia_clock)
{
m_acia->write_txc(state);
m_acia->write_rxc(state);
}

View File

@ -0,0 +1,54 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
EMR BBC Midi Interface
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/EMR_BBCMIDI.html
**********************************************************************/
#ifndef MAME_BUS_BBC_1MHZBUS_EMRMIDI_H
#define MAME_BUS_BBC_1MHZBUS_EMRMIDI_H
#include "1mhzbus.h"
#include "machine/6850acia.h"
#include "machine/clock.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class bbc_emrmidi_device :
public device_t,
public device_bbc_1mhzbus_interface
{
public:
// construction/destruction
bbc_emrmidi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual DECLARE_READ8_MEMBER(fred_r) override;
virtual DECLARE_WRITE8_MEMBER(fred_w) override;
private:
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
required_device<acia6850_device> m_acia;
required_device<clock_device> m_acia_clock;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_EMRMIDI, bbc_emrmidi_device);
#endif /* MAME_BUS_BBC_1MHZBUS_EMRMIDI_H */

View File

@ -0,0 +1,166 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Hybrid Music 2000 Interface
https://www.retro-kit.co.uk/page.cfm/content/Hybrid-Music-2000-Interface/
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Hybrid_M2000.html
**********************************************************************/
#include "emu.h"
#include "m2000.h"
#include "bus/midi/midi.h"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
DEFINE_DEVICE_TYPE(BBC_M2000, bbc_m2000_device, "bbc_m2000", "Hybrid Music 2000 Interface");
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void bbc_m2000_device::device_add_mconfig(machine_config &config)
{
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
ACIA6850(config, m_acia1, 0);
m_acia1->txd_handler().set("mdout1", FUNC(midi_port_device::write_txd));
m_acia1->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
ACIA6850(config, m_acia2, 0);
m_acia2->txd_handler().set("mdout2", FUNC(midi_port_device::write_txd));
m_acia2->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
ACIA6850(config, m_acia3, 0);
m_acia3->txd_handler().set("mdout3", FUNC(midi_port_device::write_txd));
m_acia3->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>));
CLOCK(config, m_acia_clock, DERIVED_CLOCK(1, 2));
m_acia_clock->signal_handler().set(FUNC(bbc_m2000_device::write_acia_clock));
midiout_slot(MIDI_PORT(config, "mdout1"));
midiout_slot(MIDI_PORT(config, "mdout2"));
midiout_slot(MIDI_PORT(config, "mdout3"));
auto &mdin(MIDI_PORT(config, "mdin"));
midiin_slot(mdin);
mdin.rxd_handler().set(m_acia3, FUNC(acia6850_device::write_rxd));
BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 1), bbc_1mhzbus_devices, nullptr);
m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>));
m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w));
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// bbc_m2000_device - constructor
//-------------------------------------------------
bbc_m2000_device::bbc_m2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, BBC_M2000, tag, owner, clock)
, device_bbc_1mhzbus_interface(mconfig, *this)
, m_1mhzbus(*this, "1mhzbus")
, m_acia1(*this, "acia1")
, m_acia2(*this, "acia2")
, m_acia3(*this, "acia3")
, m_acia_clock(*this, "acia_clock")
, m_irqs(*this, "irqs")
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void bbc_m2000_device::device_start()
{
}
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
READ8_MEMBER(bbc_m2000_device::fred_r)
{
uint8_t data = 0xff;
if (offset >= 0x08 && offset < 0x10)
{
switch (offset & 0x06)
{
case 0x00:
data = m_acia1->read(space, offset & 1);
break;
case 0x02:
data = m_acia2->read(space, offset & 1);
break;
case 0x04:
data = m_acia3->read(space, offset & 1);
break;
case 0x06:
break;
}
}
data &= m_1mhzbus->fred_r(space, offset);
return data;
}
WRITE8_MEMBER(bbc_m2000_device::fred_w)
{
if (offset >= 0x08 && offset < 0x10)
{
switch (offset & 0x06)
{
case 0x00:
m_acia1->write(space, offset & 1, data);
break;
case 0x02:
m_acia2->write(space, offset & 1, data);
break;
case 0x04:
m_acia3->write(space, offset & 1, data);
break;
case 0x06:
break;
}
}
m_1mhzbus->fred_w(space, offset, data);
}
READ8_MEMBER(bbc_m2000_device::jim_r)
{
uint8_t data = 0xff;
data &= m_1mhzbus->jim_r(space, offset);
return data;
}
WRITE8_MEMBER(bbc_m2000_device::jim_w)
{
m_1mhzbus->jim_w(space, offset, data);
}
WRITE_LINE_MEMBER(bbc_m2000_device::write_acia_clock)
{
m_acia1->write_txc(state);
m_acia1->write_rxc(state);
m_acia2->write_txc(state);
m_acia2->write_rxc(state);
m_acia3->write_txc(state);
m_acia3->write_rxc(state);
}

View File

@ -0,0 +1,62 @@
// license:BSD-3-Clause
// copyright-holders:Nigel Barnes
/**********************************************************************
Hybrid Music 2000 Interface
https://www.retro-kit.co.uk/page.cfm/content/Hybrid-Music-2000-Interface/
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Hybrid_M2000.html
**********************************************************************/
#ifndef MAME_BUS_BBC_1MHZBUS_M2000_H
#define MAME_BUS_BBC_1MHZBUS_M2000_H
#include "1mhzbus.h"
#include "machine/6850acia.h"
#include "machine/clock.h"
#include "machine/input_merger.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class bbc_m2000_device :
public device_t,
public device_bbc_1mhzbus_interface
{
public:
// construction/destruction
bbc_m2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
virtual void device_start() override;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual DECLARE_READ8_MEMBER(fred_r) override;
virtual DECLARE_WRITE8_MEMBER(fred_w) override;
virtual DECLARE_READ8_MEMBER(jim_r) override;
virtual DECLARE_WRITE8_MEMBER(jim_w) override;
private:
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
required_device<acia6850_device> m_acia1;
required_device<acia6850_device> m_acia2;
required_device<acia6850_device> m_acia3;
required_device<clock_device> m_acia_clock;
required_device<input_merger_device> m_irqs;
};
// device type definition
DECLARE_DEVICE_TYPE(BBC_M2000, bbc_m2000_device);
#endif /* MAME_BUS_BBC_1MHZBUS_M2000_H */