summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2017-08-25 19:04:13 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2017-08-25 20:03:44 +0100
commitd9297807e2ffff087e48f64c735d96d6a37e7264 (patch)
treec5b6e9f1496ef5f5662b78dd6b67e88c09e3f9bf
parentc967171c7a9ef9358b08e45fc66042590a6d4390 (diff)
bbc: Added various 2nd processors as Tube slot devices:
- Acorn 6502 2nd Processor, Acorn 65C102 Co-Processor, Acorn Z80 2nd Processor, Acorn 80186 Co-Processor, Casper 68000 2nd Processor
-rw-r--r--scripts/src/bus.lua10
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp103
-rw-r--r--src/devices/bus/bbc/tube/tube.h28
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp157
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.h63
-rw-r--r--src/devices/bus/bbc/tube/tube_65c102.cpp157
-rw-r--r--src/devices/bus/bbc/tube/tube_65c102.h64
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.cpp139
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.h58
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.cpp130
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.h56
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp187
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.h69
-rw-r--r--src/mame/drivers/bbc.cpp95
-rw-r--r--src/mame/includes/bbc.h6
-rw-r--r--src/mame/machine/bbc.cpp6
16 files changed, 1232 insertions, 96 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index bbf1f35bd52..74658c3bff7 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -294,6 +294,16 @@ if (BUSES["BBC_TUBE"]~=null) then
files {
MAME_DIR .. "src/devices/bus/bbc/tube/tube.cpp",
MAME_DIR .. "src/devices/bus/bbc/tube/tube.h",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_6502.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_6502.h",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_65c102.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_65c102.h",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_80186.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_80186.h",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_casper.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_casper.h",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_z80.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/tube/tube_z80.h",
}
end
diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp
index 5404402c0c6..bff15cd5008 100644
--- a/src/devices/bus/bbc/tube/tube.cpp
+++ b/src/devices/bus/bbc/tube/tube.cpp
@@ -54,7 +54,18 @@ device_bbc_tube_interface::~device_bbc_tube_interface()
bbc_tube_slot_device::bbc_tube_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_TUBE_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this)
+ device_slot_interface(mconfig, *this),
+ m_card(nullptr),
+ m_irq_handler(*this)
+{
+}
+
+
+//-------------------------------------------------
+// bbc_tube_slot_device - destructor
+//-------------------------------------------------
+
+bbc_tube_slot_device::~bbc_tube_slot_device()
{
}
@@ -66,6 +77,9 @@ bbc_tube_slot_device::bbc_tube_slot_device(const machine_config &mconfig, const
void bbc_tube_slot_device::device_start()
{
m_card = dynamic_cast<device_bbc_tube_interface *>(get_card_device());
+
+ // resolve callbacks
+ m_irq_handler.resolve_safe();
}
@@ -83,44 +97,75 @@ void bbc_tube_slot_device::device_reset()
//-------------------------------------------------
-// SLOT_INTERFACE( bbc_tube_ext_devices )
+// host_r
//-------------------------------------------------
+READ8_MEMBER(bbc_tube_slot_device::host_r)
+{
+ if (m_card)
+ return m_card->host_r(space, offset);
+ else
+ return 0xfe;
+}
+
+//-------------------------------------------------
+// host_w
+//-------------------------------------------------
+
+WRITE8_MEMBER(bbc_tube_slot_device::host_w)
+{
+ if (m_card)
+ m_card->host_w(space, offset, data);
+}
+
// slot devices
-//#include "6502copro.h"
-//#include "z80copro.h"
-//#include "32016copro.h"
-//#include "cambcopro.h"
-//#include "armcopro.h"
-//#include "unicopro.h"
-
-
-SLOT_INTERFACE_START( bbc_tube_ext_devices )
-// SLOT_INTERFACE("6502copro", BBC_6502_COPRO) /* Acorn ANC01 6502 2nd processor */
-// SLOT_INTERFACE("z80copro", BBC_Z80_COPRO) /* Acorn ANC04 Z80 2nd processor */
-// SLOT_INTERFACE("32016copro", BBC_32016_COPRO) /* Acorn ANC05 32016 2nd processor */
-// SLOT_INTERFACE("cambcopro", BBC_CAMB_COPRO) /* Acorn ANC06 Cambridge Co-Processor */
-// SLOT_INTERFACE("armcopro", BBC_ARM_COPRO) /* Acorn ANC13 ARM Evaluation System */
-// SLOT_INTERFACE("unicopro", BBC_UNIVERSAL) /* Acorn ANC21 Universal 2nd Processor Unit */
-// SLOT_INTERFACE("a500copro", BBC_A500_COPRO) /* Acorn A500 2nd Processor */
-SLOT_INTERFACE_END
+#include "tube_6502.h"
+#include "tube_65c102.h"
+#include "tube_80186.h"
+//#include "tube_80286.h"
+//#include "tube_arm.h"
+#include "tube_casper.h"
+//#include "tube_x25.h"
+#include "tube_z80.h"
+//#include "tube_zep100.h"
//-------------------------------------------------
-// SLOT_INTERFACE( bbc_tube_int_devices )
+// SLOT_INTERFACE( bbc_extube_devices )
//-------------------------------------------------
+SLOT_INTERFACE_START( bbc_extube_devices )
+ SLOT_INTERFACE("6502", BBC_TUBE_6502) /* Acorn ANC01 6502 2nd processor */
+ SLOT_INTERFACE("z80", BBC_TUBE_Z80) /* Acorn ANC04 Z80 2nd processor */
+// SLOT_INTERFACE("32016", BBC_TUBE_32016) /* Acorn ANC05 32016 2nd processor */
+// SLOT_INTERFACE("camb", BBC_TUBE_CAMB) /* Acorn ANC06 Cambridge Co-Processor */
+// SLOT_INTERFACE("arm", BBC_TUBE_ARM) /* Acorn ANC13 ARM Evaluation System */
+// SLOT_INTERFACE("80286", BBC_TUBE_80286) /* Acorn 80286 2nd Processor */
+// SLOT_INTERFACE("a500", BBC_TUBE_A500) /* Acorn A500 2nd Processor */
+ SLOT_INTERFACE("casper", BBC_TUBE_CASPER) /* Casper 68000 2nd Processor */
+// SLOT_INTERFACE("zep100", BBC_TUBE_ZEP100) /* Torch Z80 Communicator (ZEP100) */
+ /* Acorn ANC21 Universal 2nd Processor Unit */
+ SLOT_INTERFACE("65c102", BBC_TUBE_65C102) /* Acorn ADC06 65C102 co-processor */
+ SLOT_INTERFACE("80186", BBC_TUBE_80186) /* Acorn ADC08 80186 co-processor */
+SLOT_INTERFACE_END
-// slot devices
-//#include "65c102copro.h"
-//#include "80186copro.h"
-//#include "arm7copro.h"
+//-------------------------------------------------
+// SLOT_INTERFACE( bbc_intube_devices )
+//-------------------------------------------------
-SLOT_INTERFACE_START( bbc_tube_int_devices )
-// SLOT_INTERFACE("65c102copro", BBC_65C102_COPRO) /* Acorn ADC06 6502 co-processor */
-// SLOT_INTERFACE("80186copro", BBC_80186_COPRO) /* Acorn ADC08 80186 co-processor */
-// SLOT_INTERFACE("80286copro", BBC_80286_COPRO) /* Acorn ADC08 80286 co-processor */
-// SLOT_INTERFACE("arm7copro", BBC_ARM7_COPRO) /* Sprow ARM7 co-processor */
+SLOT_INTERFACE_START( bbc_intube_devices )
+ SLOT_INTERFACE("65c102", BBC_TUBE_65C102) /* Acorn ADC06 65C102 co-processor */
+ SLOT_INTERFACE("80186", BBC_TUBE_80186) /* Acorn ADC08 80186 co-processor */
+// SLOT_INTERFACE("arm7", BBC_TUBE_ARM7) /* Sprow ARM7 co-processor */
SLOT_INTERFACE_END
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbc_x25tube_devices )
+//-------------------------------------------------
+
+//SLOT_INTERFACE_START( bbc_x25tube_devices )
+// SLOT_INTERFACE("x25", BBC_TUBE_X25) /* Econet X25 Gateway */
+//SLOT_INTERFACE_END
diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h
index 404b9312902..610c0d3ece9 100644
--- a/src/devices/bus/bbc/tube/tube.h
+++ b/src/devices/bus/bbc/tube/tube.h
@@ -53,15 +53,15 @@
MCFG_DEVICE_ADD(_tag, BBC_TUBE_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-#define MCFG_BBC_PASSTHRU_TUBE_SLOT_ADD() \
- MCFG_BBC_TUBE_SLOT_ADD(BBC_TUBE_SLOT_TAG, 0, bbc_tube_devices, nullptr)
-
+#define MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(_devcb) \
+ devcb = &bbc_tube_slot_device::set_irq_handler(*device, DEVCB_##_devcb);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
+
// ======================> bbc_tube_slot_device
class device_bbc_tube_interface;
@@ -71,6 +71,16 @@ class bbc_tube_slot_device : public device_t, public device_slot_interface
public:
// construction/destruction
bbc_tube_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~bbc_tube_slot_device();
+
+ // callbacks
+ template <class Object> static devcb_base &set_irq_handler(device_t &device, Object &&cb)
+ { return downcast<bbc_tube_slot_device &>(device).m_irq_handler.set_callback(std::forward<Object>(cb)); }
+
+ DECLARE_READ8_MEMBER( host_r );
+ DECLARE_WRITE8_MEMBER( host_w );
+
+ DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
protected:
// device-level overrides
@@ -78,6 +88,9 @@ protected:
virtual void device_reset() override;
device_bbc_tube_interface *m_card;
+
+private:
+ devcb_write_line m_irq_handler;
};
@@ -89,6 +102,10 @@ public:
// construction/destruction
virtual ~device_bbc_tube_interface();
+ // reading and writing
+ virtual DECLARE_READ8_MEMBER(host_r) { return 0xfe; }
+ virtual DECLARE_WRITE8_MEMBER(host_w) { }
+
protected:
device_bbc_tube_interface(const machine_config &mconfig, device_t &device);
@@ -99,8 +116,9 @@ protected:
// device type definition
DECLARE_DEVICE_TYPE(BBC_TUBE_SLOT, bbc_tube_slot_device)
-SLOT_INTERFACE_EXTERN( bbc_tube_ext_devices );
-SLOT_INTERFACE_EXTERN( bbc_tube_int_devices );
+SLOT_INTERFACE_EXTERN( bbc_extube_devices );
+SLOT_INTERFACE_EXTERN( bbc_intube_devices );
+//SLOT_INTERFACE_EXTERN( bbc_x25tube_devices );
#endif // MAME_BUS_BBC_TUBE_TUBE_H
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp
new file mode 100644
index 00000000000..be4e0add5ed
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_6502.cpp
@@ -0,0 +1,157 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC01 6502 2nd Processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC01_65022ndproc.html
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_6502.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_6502, bbc_tube_6502_device, "bbc_tube_6502", "Acorn 6502 2nd Processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_6502_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_6502_mem, AS_PROGRAM, 8, bbc_tube_6502_device)
+ AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ROM( tube_6502 )
+//-------------------------------------------------
+
+ROM_START( tube_6502 )
+ ROM_REGION(0x1000, "rom", 0)
+ ROM_LOAD("6502tube.rom", 0x0000, 0x1000, CRC(98b5fe42) SHA1(338269d03cf6bfa28e09d1651c273ea53394323b))
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+MACHINE_CONFIG_MEMBER( bbc_tube_6502_device::device_add_mconfig )
+ MCFG_CPU_ADD("m6502", M65C02, XTAL_12MHz / 4)
+ MCFG_CPU_PROGRAM_MAP(tube_6502_mem)
+
+ MCFG_TUBE_ADD("ula")
+ MCFG_TUBE_PNMI_HANDLER(INPUTLINE("m6502", M65C02_NMI_LINE))
+ MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("m6502", M65C02_IRQ_LINE))
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+ MCFG_RAM_DEFAULT_VALUE(0x00)
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_6502_device::device_rom_region() const
+{
+ return ROM_NAME( tube_6502 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_6502_device - constructor
+//-------------------------------------------------
+
+bbc_tube_6502_device::bbc_tube_6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_6502, tag, owner, clock),
+ device_bbc_tube_interface(mconfig, *this),
+ m_m6502(*this, "m6502"),
+ m_ula(*this, "ula"),
+ m_ram(*this, "ram"),
+ m_rom(*this, "rom"),
+ m_rom_enabled(true)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_6502_device::device_start()
+{
+ m_slot = dynamic_cast<bbc_tube_slot_device *>(owner());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_6502_device::device_reset()
+{
+ m_ula->reset();
+
+ m_rom_enabled = true;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_tube_6502_device::host_r)
+{
+ return m_ula->host_r(space, offset);
+}
+
+WRITE8_MEMBER(bbc_tube_6502_device::host_w)
+{
+ m_ula->host_w(space, offset, data);
+}
+
+
+READ8_MEMBER(bbc_tube_6502_device::read)
+{
+ uint8_t data;
+
+ if (offset >= 0xfef0 && offset <= 0xfeff)
+ {
+ if (!machine().side_effect_disabled()) m_rom_enabled = false;
+ data = m_ula->parasite_r(space, offset);
+ }
+ else if (m_rom_enabled && (offset >= 0xf000))
+ {
+ data = m_rom->base()[offset & 0xfff];
+ }
+ else
+ {
+ data = m_ram->pointer()[offset];
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_tube_6502_device::write)
+{
+ if (offset >= 0xfef0 && offset <= 0xfeff)
+ {
+ m_ula->parasite_w(space, offset, data);
+ }
+ else
+ {
+ m_ram->pointer()[offset] = data;
+ }
+}
diff --git a/src/devices/bus/bbc/tube/tube_6502.h b/src/devices/bus/bbc/tube/tube_6502.h
new file mode 100644
index 00000000000..cc1ab776d66
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_6502.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC01 6502 2nd Processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC01_65022ndproc.html
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_6502_H
+#define MAME_BUS_BBC_TUBE_6502_H
+
+#include "tube.h"
+#include "cpu/m6502/m65c02.h"
+#include "machine/ram.h"
+#include "machine/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_6502_device
+
+class bbc_tube_6502_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_6502_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER( host_r ) override;
+ virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+
+private:
+ required_device<cpu_device> m_m6502;
+ required_device<tube_device> m_ula;
+ required_device<ram_device> m_ram;
+ required_memory_region m_rom;
+
+ bool m_rom_enabled;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_6502, bbc_tube_6502_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_6502_H */
diff --git a/src/devices/bus/bbc/tube/tube_65c102.cpp b/src/devices/bus/bbc/tube/tube_65c102.cpp
new file mode 100644
index 00000000000..ef54be2c0ae
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_65c102.cpp
@@ -0,0 +1,157 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ADC06 65C102 Co-processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ADC06_65C102CoPro.html
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_65c102.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_65C102, bbc_tube_65c102_device, "bbc_tube_65c102", "Acorn 65C102 Co-Processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_6502_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_6502_mem, AS_PROGRAM, 8, bbc_tube_65c102_device)
+ AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ROM( tube_65c102 )
+//-------------------------------------------------
+
+ROM_START( tube_65c102 )
+ ROM_REGION(0x1000, "rom", 0)
+ ROM_LOAD("65C102_BOOT_110.rom", 0x0000, 0x1000, CRC(ad5b70cc) SHA1(0ac9a1c70e55a79e2c81e102afae1d016af229fa)) // 2201,243-02
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+MACHINE_CONFIG_MEMBER( bbc_tube_65c102_device::device_add_mconfig )
+ MCFG_CPU_ADD("maincpu", M65C02, XTAL_16MHz / 4)
+ MCFG_CPU_PROGRAM_MAP(tube_6502_mem)
+
+ MCFG_TUBE_ADD("ula")
+ MCFG_TUBE_PNMI_HANDLER(INPUTLINE("maincpu", M65C02_NMI_LINE))
+ MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE))
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+ MCFG_RAM_DEFAULT_VALUE(0x00)
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_65c102_device::device_rom_region() const
+{
+ return ROM_NAME( tube_65c102 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_65c102_device - constructor
+//-------------------------------------------------
+
+bbc_tube_65c102_device::bbc_tube_65c102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_65C102, tag, owner, clock),
+ device_bbc_tube_interface(mconfig, *this),
+ m_maincpu(*this, "maincpu"),
+ m_ula(*this, "ula"),
+ m_ram(*this, "ram"),
+ m_rom(*this, "rom"),
+ m_rom_enabled(true)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_65c102_device::device_start()
+{
+ m_slot = dynamic_cast<bbc_tube_slot_device *>(owner());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_65c102_device::device_reset()
+{
+ m_ula->reset();
+
+ m_rom_enabled = true;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_tube_65c102_device::host_r)
+{
+ return m_ula->host_r(space, offset);
+}
+
+WRITE8_MEMBER(bbc_tube_65c102_device::host_w)
+{
+ m_ula->host_w(space, offset, data);
+}
+
+
+READ8_MEMBER(bbc_tube_65c102_device::read)
+{
+ uint8_t data;
+
+ if ((offset >= 0xfef0) && (offset <= 0xfeff))
+ {
+ if (!machine().side_effect_disabled()) m_rom_enabled = false;
+ data = m_ula->parasite_r(space, offset);
+ }
+ else if (m_rom_enabled && (offset >= 0xf000))
+ {
+ data = m_rom->base()[offset & 0xfff];
+ }
+ else
+ {
+ data = m_ram->pointer()[offset];
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_tube_65c102_device::write)
+{
+ if ((offset >= 0xfef0) && (offset <= 0xfeff))
+ {
+ m_ula->parasite_w(space, offset, data);
+ }
+ else
+ {
+ m_ram->pointer()[offset] = data;
+ }
+}
diff --git a/src/devices/bus/bbc/tube/tube_65c102.h b/src/devices/bus/bbc/tube/tube_65c102.h
new file mode 100644
index 00000000000..690aa940d83
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_65c102.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ADC06 65C102 Co-processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ADC06_65C102CoPro.html
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_65C102_H
+#define MAME_BUS_BBC_TUBE_65C102_H
+
+#include "tube.h"
+#include "cpu/m6502/m65c02.h"
+#include "machine/ram.h"
+#include "machine/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_65c102_device
+
+class bbc_tube_65c102_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_65c102_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER( host_r ) override;
+ virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<tube_device> m_ula;
+ required_device<ram_device> m_ram;
+ required_memory_region m_rom;
+
+ bool m_rom_enabled;
+};
+
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_65C102, bbc_tube_65c102_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_65C102_H */
diff --git a/src/devices/bus/bbc/tube/tube_80186.cpp b/src/devices/bus/bbc/tube/tube_80186.cpp
new file mode 100644
index 00000000000..da84e68255d
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_80186.cpp
@@ -0,0 +1,139 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ADC08 Intel 80186 Co-processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ADC08_80186Copro.html
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_80186.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_80186, bbc_tube_80186_device, "bbc_tube_80186", "Acorn 80186 Co-Processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_80186_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_80186_mem, AS_PROGRAM, 16, bbc_tube_80186_device)
+ ADDRESS_MAP_UNMAP_HIGH
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_80186_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_80186_io, AS_IO, 16, bbc_tube_80186_device)
+ AM_RANGE(0x80, 0x8f) AM_DEVREADWRITE8("ula", tube_device, parasite_r, parasite_w, 0x00ff)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ROM( tube_80186 )
+//-------------------------------------------------
+
+ROM_START( tube_80186 )
+ ROM_REGION(0x4000, "bootstrap", 0)
+ ROM_LOAD16_BYTE("M512_LO_IC31.rom", 0x0000, 0x2000, CRC(c0df8707) SHA1(7f6d843d5aea6bdb36cbd4623ae942b16b96069d)) // 2201,287-02
+ ROM_LOAD16_BYTE("M512_HI_IC32.rom", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) // 2201,288-02
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+MACHINE_CONFIG_MEMBER(bbc_tube_80186_device::device_add_mconfig )
+ MCFG_CPU_ADD("i80186", I80186, XTAL_20MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(tube_80186_mem)
+ MCFG_CPU_IO_MAP(tube_80186_io)
+ //MCFG_80186_CHIP_SELECT_CB(WRITE16(bbc_tube_80186_device, chip_select_cb))
+ MCFG_80186_TMROUT0_HANDLER(INPUTLINE("i80186", INPUT_LINE_HALT)) MCFG_DEVCB_INVERT
+ MCFG_80186_TMROUT1_HANDLER(INPUTLINE("i80186", INPUT_LINE_NMI)) MCFG_DEVCB_INVERT
+
+ MCFG_TUBE_ADD("ula")
+ MCFG_TUBE_PIRQ_HANDLER(DEVWRITELINE("i80186", i80186_cpu_device, int0_w))
+ MCFG_TUBE_DRQ_HANDLER(DEVWRITELINE("i80186", i80186_cpu_device, drq0_w))
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("512K")
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_80186_device::device_rom_region() const
+{
+ return ROM_NAME( tube_80186 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_80186_device - constructor
+//-------------------------------------------------
+
+bbc_tube_80186_device::bbc_tube_80186_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_80186, tag, owner, clock),
+ device_bbc_tube_interface(mconfig, *this),
+ m_i80186(*this, "i80186"),
+ m_ula(*this, "ula"),
+ m_ram(*this, "ram"),
+ m_bootstrap(*this, "bootstrap")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_80186_device::device_start()
+{
+ m_slot = dynamic_cast<bbc_tube_slot_device *>(owner());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_80186_device::device_reset()
+{
+ m_ula->reset();
+
+ address_space &program = m_i80186->space(AS_PROGRAM);
+
+ program.install_ram(0x00000, 0x3ffff, m_ram->pointer());
+ program.install_ram(0x40000, 0x7ffff, m_ram->pointer() + 0x40000);
+ program.install_ram(0x80000, 0xbffff, m_ram->pointer() + 0x40000);
+ program.install_rom(0xc0000, 0xc3fff, 0x3c000, m_bootstrap->base());
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_tube_80186_device::host_r)
+{
+ return m_ula->host_r(space, offset);
+}
+
+WRITE8_MEMBER(bbc_tube_80186_device::host_w)
+{
+ m_ula->host_w(space, offset, data);
+}
diff --git a/src/devices/bus/bbc/tube/tube_80186.h b/src/devices/bus/bbc/tube/tube_80186.h
new file mode 100644
index 00000000000..1c258e971df
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_80186.h
@@ -0,0 +1,58 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ADC08 Intel 80186 Co-processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ADC08_80186Copro.html
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_80186_H
+#define MAME_BUS_BBC_TUBE_80186_H
+
+#include "tube.h"
+#include "cpu/i86/i186.h"
+#include "machine/ram.h"
+#include "machine/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_80186_device
+
+class bbc_tube_80186_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_80186_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER( host_r ) override;
+ virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+
+private:
+ required_device<i80186_cpu_device> m_i80186;
+ required_device<tube_device> m_ula;
+ required_device<ram_device> m_ram;
+ required_memory_region m_bootstrap;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_80186, bbc_tube_80186_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_80x86_H */
diff --git a/src/devices/bus/bbc/tube/tube_casper.cpp b/src/devices/bus/bbc/tube/tube_casper.cpp
new file mode 100644
index 00000000000..b93285d6e3b
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_casper.cpp
@@ -0,0 +1,130 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Casper 68000 2nd Processor
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_casper.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_CASPER, bbc_tube_casper_device, "bbc_tube_casper", "Casper 68000 2nd Processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_casper_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_casper_mem, AS_PROGRAM, 16, bbc_tube_casper_device)
+ AM_RANGE(0x00000, 0x03fff) AM_ROM AM_REGION("casper_rom", 0)
+ AM_RANGE(0x10000, 0x1001f) AM_DEVREADWRITE8("via6522_1",via6522_device, read, write, 0xff)
+ AM_RANGE(0x20000, 0x3ffff) AM_RAM
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ROM( tube_casper )
+//-------------------------------------------------
+
+ROM_START( tube_casper )
+ ROM_REGION(0x4000, "casper_rom", 0)
+ ROM_LOAD16_BYTE("casper.ic9", 0x0000, 0x2000, CRC(4105cbf4) SHA1(a3efeb6fb144da55b47c718239967ed0af4fff72))
+ ROM_LOAD16_BYTE("casper.ic10", 0x0001, 0x2000, CRC(f25bc320) SHA1(297db56283bb3164c31c21331837213cea426837))
+
+ ROM_REGION(0x8000, "host_rom", 0)
+ ROM_LOAD("rom1.rom", 0x0000, 0x4000, CRC(602b6a36) SHA1(7b24746dbcacb8772468532e92832d5c7f6648fd))
+ ROM_LOAD("rom2.rom", 0x4000, 0x4000, CRC(7c9efb43) SHA1(4195ce1ed928178fd645a267872a5b4f325d078a))
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+MACHINE_CONFIG_MEMBER(bbc_tube_casper_device::device_add_mconfig )
+ MCFG_CPU_ADD("m68000", M68000, 8000000)
+ MCFG_CPU_PROGRAM_MAP(tube_casper_mem)
+
+ MCFG_DEVICE_ADD("via6522_0", VIA6522, 2000000)
+ MCFG_VIA6522_WRITEPB_HANDLER(DEVWRITE8("via6522_1", via6522_device, write_pa))
+ MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("via6522_1", via6522_device, write_cb1))
+ MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE("via6522_1", via6522_device, write_ca1))
+ MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
+
+ MCFG_DEVICE_ADD("via6522_1", VIA6522, 2000000)
+ MCFG_VIA6522_WRITEPB_HANDLER(DEVWRITE8("via6522_0", via6522_device, write_pa))
+ MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE("via6522_0", via6522_device, write_cb1))
+ MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE("via6522_0", via6522_device, write_ca1))
+ MCFG_VIA6522_IRQ_HANDLER(INPUTLINE("maincpu", M68K_IRQ_1))
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_casper", "bbc_flop_68000")
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_casper_device::device_rom_region() const
+{
+ return ROM_NAME( tube_casper );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_casper_device - constructor
+//-------------------------------------------------
+
+bbc_tube_casper_device::bbc_tube_casper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_CASPER, tag, owner, clock),
+ device_bbc_tube_interface(mconfig, *this),
+ m_m68000(*this, "m68000"),
+ m_via6522_0(*this, "via6522_0"),
+ m_via6522_1(*this, "via6522_1"),
+ m_casper_rom(*this, "casper_rom"),
+ m_host_rom(*this, "host_rom")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_casper_device::device_start()
+{
+ m_slot = dynamic_cast<bbc_tube_slot_device *>(owner());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_casper_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(13, memregion("host_rom")->base() + 0x0000);
+ machine().root_device().membank("bank4")->configure_entry(14, memregion("host_rom")->base() + 0x4000);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_tube_casper_device::host_r)
+{
+ return m_via6522_0->read(space, offset & 0xf);
+}
+
+WRITE8_MEMBER(bbc_tube_casper_device::host_w)
+{
+ m_via6522_0->write(space, offset & 0xf, data);
+}
diff --git a/src/devices/bus/bbc/tube/tube_casper.h b/src/devices/bus/bbc/tube/tube_casper.h
new file mode 100644
index 00000000000..f4245702919
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_casper.h
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Casper 68000 2nd Processor
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_CASPER_H
+#define MAME_BUS_BBC_TUBE_CASPER_H
+
+#include "tube.h"
+#include "cpu/m68000/m68000.h"
+#include "machine/6522via.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_casper_device
+
+class bbc_tube_casper_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_casper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER( host_r ) override;
+ virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+
+private:
+ required_device<cpu_device> m_m68000;
+ required_device<via6522_device> m_via6522_0;
+ required_device<via6522_device> m_via6522_1;
+ required_memory_region m_casper_rom;
+ required_memory_region m_host_rom;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_CASPER, bbc_tube_casper_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_CASPER_H */
diff --git a/src/devices/bus/bbc/tube/tube_z80.cpp b/src/devices/bus/bbc/tube/tube_z80.cpp
new file mode 100644
index 00000000000..7bf10471be2
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_z80.cpp
@@ -0,0 +1,187 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC04 Z80 2nd processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC04_Z802ndproc.html
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "tube_z80.h"
+#include "softlist_dev.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_TUBE_Z80, bbc_tube_z80_device, "bbc_tube_z80", "Acorn Z80 2nd Processor")
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_z80_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_z80_mem, AS_PROGRAM, 8, bbc_tube_z80_device)
+ AM_RANGE(0x0000, 0xffff) AM_READWRITE(mem_r, mem_w)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ADDRESS_MAP( tube_z80_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START(tube_z80_io, AS_IO, 8, bbc_tube_z80_device)
+ AM_RANGE(0x00, 0x07) AM_MIRROR(0xff00) AM_READWRITE(io_r, io_w)
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// ROM( tube_z80 )
+//-------------------------------------------------
+
+ROM_START( tube_z80 )
+ ROM_REGION(0x1000, "rom", 0)
+ ROM_LOAD("Z80_120.rom", 0x0000, 0x1000, CRC(315bfc20) SHA1(069077df498599a9c880d4ec9f4bc53fcc602d82))
+ROM_END
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+MACHINE_CONFIG_MEMBER( bbc_tube_z80_device::device_add_mconfig )
+ MCFG_CPU_ADD("z80", Z80, XTAL_12MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(tube_z80_mem)
+ MCFG_CPU_IO_MAP(tube_z80_io)
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_z80_device, irq_callback)
+
+ MCFG_TUBE_ADD("ula")
+ MCFG_TUBE_HIRQ_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
+ MCFG_TUBE_PNMI_HANDLER(WRITELINE(bbc_tube_z80_device, nmi_w))
+ MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("z80", INPUT_LINE_IRQ0))
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+ MCFG_RAM_DEFAULT_VALUE(0x00)
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *bbc_tube_z80_device::device_rom_region() const
+{
+ return ROM_NAME( tube_z80 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_tube_z80_device - constructor
+//-------------------------------------------------
+
+bbc_tube_z80_device::bbc_tube_z80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_TUBE_Z80, tag, owner, clock),
+ device_bbc_tube_interface(mconfig, *this),
+ m_z80(*this, "z80"),
+ m_ula(*this, "ula"),
+ m_ram(*this, "ram"),
+ m_rom(*this, "rom"),
+ m_rom_enabled(true)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_tube_z80_device::device_start()
+{
+ m_slot = dynamic_cast<bbc_tube_slot_device *>(owner());
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_tube_z80_device::device_reset()
+{
+ m_ula->reset();
+
+ m_rom_enabled = true;
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_tube_z80_device::host_r)
+{
+ return m_ula->host_r(space, offset);
+}
+
+WRITE8_MEMBER(bbc_tube_z80_device::host_w)
+{
+ m_ula->host_w(space, offset, data);
+}
+
+
+READ8_MEMBER(bbc_tube_z80_device::mem_r)
+{
+ uint8_t data;
+
+ //if (!machine().side_effect_disabled() && m_nmiserv && offset == 0x0066) m_rom_enabled = true;
+ if (!machine().side_effect_disabled() && offset == 0x0066) m_rom_enabled = true;
+ if (!machine().side_effect_disabled() && offset >= 0x8000) m_rom_enabled = false;
+
+ if (m_rom_enabled && (offset < 0x1000))
+ data = m_rom->base()[offset & 0xfff];
+ else
+ data = m_ram->pointer()[offset];
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_tube_z80_device::mem_w)
+{
+ m_ram->pointer()[offset] = data;
+}
+
+
+READ8_MEMBER(bbc_tube_z80_device::io_r)
+{
+ if (!machine().side_effect_disabled() && (offset == 2)) m_rom_enabled = true;
+ if (!machine().side_effect_disabled() && (offset == 6)) m_rom_enabled = false;
+
+ return m_ula->parasite_r(space, offset);
+}
+
+WRITE8_MEMBER(bbc_tube_z80_device::io_w)
+{
+ m_ula->parasite_w(space, offset, data);
+}
+
+
+WRITE_LINE_MEMBER(bbc_tube_z80_device::nmi_w)
+{
+ //m_nmiserv = state;
+ m_z80->set_input_line(INPUT_LINE_NMI, state);
+}
+
+
+//-------------------------------------------------
+// irq vector callback
+//-------------------------------------------------
+
+IRQ_CALLBACK_MEMBER(bbc_tube_z80_device::irq_callback)
+{
+ return 0xfe;
+}
diff --git a/src/devices/bus/bbc/tube/tube_z80.h b/src/devices/bus/bbc/tube/tube_z80.h
new file mode 100644
index 00000000000..50841485df7
--- /dev/null
+++ b/src/devices/bus/bbc/tube/tube_z80.h
@@ -0,0 +1,69 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn ANC04 Z80 2nd processor
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Acorn_ANC04_Z802ndproc.html
+
+**********************************************************************/
+
+
+#ifndef MAME_BUS_BBC_TUBE_Z80_H
+#define MAME_BUS_BBC_TUBE_Z80_H
+
+#include "tube.h"
+#include "cpu/z80/z80.h"
+#include "machine/ram.h"
+#include "machine/tube.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_tube_z80_device
+
+class bbc_tube_z80_device :
+ public device_t,
+ public device_bbc_tube_interface
+{
+public:
+ // construction/destruction
+ bbc_tube_z80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_READ8_MEMBER( mem_r );
+ DECLARE_WRITE8_MEMBER( mem_w );
+ DECLARE_READ8_MEMBER( io_r );
+ DECLARE_WRITE8_MEMBER( io_w );
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ virtual DECLARE_READ8_MEMBER( host_r ) override;
+ virtual DECLARE_WRITE8_MEMBER( host_w ) override;
+
+private:
+ IRQ_CALLBACK_MEMBER( irq_callback );
+ DECLARE_WRITE_LINE_MEMBER( nmi_w );
+
+ required_device<cpu_device> m_z80;
+ required_device<tube_device> m_ula;
+ required_device<ram_device> m_ram;
+ required_memory_region m_rom;
+
+ bool m_rom_enabled;
+ int m_nmiserv;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_TUBE_Z80, bbc_tube_z80_device)
+
+
+#endif /* MAME_BUS_BBC_TUBE_Z80_H */
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 7a0afa973bc..12b6d36f370 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -59,6 +59,7 @@
/* Devices */
#include "formats/acorn_dsk.h"
#include "formats/fsd_dsk.h"
+#include "formats/pc_dsk.h"
#include "imagedev/cassette.h"
#include "formats/uef_cas.h"
#include "formats/csw_cas.h"
@@ -189,7 +190,7 @@ static ADDRESS_MAP_START( bbc_base, AS_PROGRAM, 8, bbc_state )
/* fe80-fe9f FDC Floppy disc controller */
AM_RANGE(0xfea0, 0xfebf) AM_DEVREADWRITE("mc6854", mc6854_device, read, write) /* fea0-febf 68B54 ADLC ECONET controller */
AM_RANGE(0xfec0, 0xfedf) AM_DEVREADWRITE("upd7002", upd7002_device, read, write) /* fec0-fedf uPD7002 Analogue to digital converter */
- AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
+ AM_RANGE(0xfee0, 0xfeff) AM_DEVREADWRITE("tube", bbc_tube_slot_device, host_r, host_w) /* fee0-feff Tube ULA Tube system interface */
AM_RANGE(0xff00, 0xffff) AM_ROM AM_REGION("os", 0x3f00) /* ff00-ffff OS ROM (continued) */
ADDRESS_MAP_END
@@ -226,6 +227,7 @@ static ADDRESS_MAP_START( bbcbp_mem, AS_PROGRAM, 8, bbc_state )
/* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_device, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
+ AM_RANGE(0xfee0, 0xfeff) AM_DEVREADWRITE("tube", bbc_tube_slot_device, host_r, host_w) /* fee0-feff Tube ULA Tube system interface */
AM_IMPORT_FROM(bbc_base)
ADDRESS_MAP_END
@@ -239,6 +241,7 @@ static ADDRESS_MAP_START( bbcbp128_mem, AS_PROGRAM, 8, bbc_state )
/* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_WRITE(bbc_wd1770_status_w) /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("wd1770", wd1770_device, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
+ AM_RANGE(0xfee0, 0xfeff) AM_DEVREADWRITE("tube", bbc_tube_slot_device, host_r, host_w) /* fee0-feff Tube ULA Tube system interface */
AM_IMPORT_FROM(bbc_base)
ADDRESS_MAP_END
@@ -252,6 +255,7 @@ static ADDRESS_MAP_START( reutapm_mem, AS_PROGRAM, 8, bbc_state )
/* W: fe30-fe3f 84LS161 Paged ROM selector */
AM_RANGE(0xfe80, 0xfe83) AM_NOP /* fe80-fe83 1770 FDC Drive control register */
AM_RANGE(0xfe84, 0xfe9f) AM_NOP /* fe84-fe9f 1770 FDC Floppy disc controller */
+ AM_RANGE(0xfee0, 0xfeff) AM_READ(bbc_fe_r) /* fee0-feff Tube ULA Tube system interface */
AM_IMPORT_FROM(bbc_base)
ADDRESS_MAP_END
@@ -303,6 +307,9 @@ INPUT_CHANGED_MEMBER(bbc_state::trigger_reset)
if (m_fdc) m_fdc->reset();
if (m_i8271) m_i8271->reset();
if (m_1mhzbus) m_1mhzbus->reset();
+ if (m_tube) m_tube->reset();
+ if (m_intube) m_intube->reset();
+ if (m_extube) m_extube->reset();
}
}
@@ -780,7 +787,8 @@ FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcm )
FLOPPY_OPUS_DDCPM_FORMAT,
FLOPPY_TORCH_CPN_FORMAT,
FLOPPY_ACORN_DOS_FORMAT,
- FLOPPY_FSD_FORMAT
+ FLOPPY_FSD_FORMAT,
+ FLOPPY_PC_FORMAT
FLOPPY_FORMATS_END0
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_bbcmc )
@@ -990,7 +998,8 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(bbc_state, bus_nmi_w))
/* tube port */
- MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_extube_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<4>))
/* user port */
MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
@@ -999,10 +1008,6 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_flop_orig")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_flop_68000")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
MACHINE_CONFIG_END
@@ -1111,13 +1116,9 @@ static MACHINE_CONFIG_DERIVED( torchf, bbcb )
MCFG_FLOPPY_DRIVE_SOUND(true)
/* Add Torch Z80 Communicator co-processor */
-
- /* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_torch", "bbc_flop_torch")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
+ //MCFG_DEVICE_MODIFY("tube")
+ //MCFG_SLOT_DEFAULT_OPTION("zep100")
+ //MCFG_SLOT_FIXED(true)
MACHINE_CONFIG_END
@@ -1151,9 +1152,9 @@ static MACHINE_CONFIG_DERIVED( abc110, bbcbp )
MCFG_DEVICE_REMOVE("wd1770:1")
/* Add Z80 co-processor */
- //MCFG_DEVICE_MODIFY("tube")
- //MCFG_SLOT_DEFAULT_OPTION("z80")
- //MCFG_SLOT_FIXED(true)
+ MCFG_DEVICE_MODIFY("tube")
+ MCFG_SLOT_DEFAULT_OPTION("z80")
+ MCFG_SLOT_FIXED(true)
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
//MCFG_DEVICE_ADD(SCSIBUS_TAG, SCSI_PORT, 0)
@@ -1175,9 +1176,6 @@ static MACHINE_CONFIG_DERIVED( abc110, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1197,13 +1195,11 @@ static MACHINE_CONFIG_DERIVED( acw443, bbcbp )
/* Add 20MB ST-412 Winchester Cambridge */
/* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1224,10 +1220,6 @@ static MACHINE_CONFIG_DERIVED( abc310, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
MACHINE_CONFIG_END
@@ -1260,10 +1252,6 @@ static MACHINE_CONFIG_DERIVED( reutapm, bbcbp )
MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_6502")
/* expansion ports */
MCFG_DEVICE_REMOVE("analogue")
@@ -1382,9 +1370,6 @@ static MACHINE_CONFIG_START( bbcm )
MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass")
MCFG_SOFTWARE_LIST_ADD("flop_ls_m", "bbcm_flop")
MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_68000", "bbc_flop_68000")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
@@ -1453,8 +1438,10 @@ static MACHINE_CONFIG_START( bbcm )
MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(bbc_state, bus_nmi_w))
/* tube ports */
- MCFG_BBC_TUBE_SLOT_ADD("tube_ext", bbc_tube_ext_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_ADD("tube_int", bbc_tube_int_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_ADD("intube", bbc_intube_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<4>))
+ MCFG_BBC_TUBE_SLOT_ADD("extube", bbc_extube_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<5>))
/* user port */
MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
@@ -1463,20 +1450,17 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcmt, bbcm )
/* Add 65C102 co-processor */
- //MCFG_DEVICE_MODIFY("tube_int")
- //MCFG_SLOT_DEFAULT_OPTION("65c102copro")
- //MCFG_SLOT_FIXED(true)
-
- /* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
+ MCFG_DEVICE_MODIFY("intube")
+ MCFG_SLOT_DEFAULT_OPTION("65c102")
+ MCFG_SLOT_FIXED(true)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcmaiv, bbcm )
/* Add 65C102 co-processor */
- //MCFG_DEVICE_MODIFY("intube")
- //MCFG_SLOT_DEFAULT_OPTION("65c102")
- //MCFG_SLOT_FIXED(true)
+ MCFG_DEVICE_MODIFY("intube")
+ MCFG_SLOT_DEFAULT_OPTION("65c102")
+ MCFG_SLOT_FIXED(true)
/* Add Philips VP415 Laserdisc player */
@@ -1499,9 +1483,6 @@ static MACHINE_CONFIG_DERIVED( bbcmet, bbcm )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
/* acia */
MCFG_DEVICE_REMOVE("acia6850")
@@ -1521,19 +1502,14 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcm512, bbcm )
-
/* Add Intel 80186 co-processor */
- //MCFG_DEVICE_MODIFY("tube_int")
- //MCFG_SLOT_DEFAULT_OPTION("80186copro")
- //MCFG_SLOT_FIXED(true)
-
- /* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
+ MCFG_DEVICE_MODIFY("intube")
+ MCFG_SLOT_DEFAULT_OPTION("80186")
+ MCFG_SLOT_FIXED(true)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcmarm, bbcm )
-
/* Add ARM co-processor */
/* software lists */
@@ -1607,9 +1583,6 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_z80")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_32016")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_68000")
MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")
MCFG_SOFTWARE_LIST_ADD("flop_ls_mc", "bbcmc_flop")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_pro128s", "pro128s_flop")
@@ -1617,6 +1590,8 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
/* expansion ports */
MCFG_DEVICE_REMOVE("analogue")
MCFG_COMPACT_JOYPORT_ADD("joyport", bbc_joyport_devices, "joystick")
+ MCFG_DEVICE_REMOVE("intube")
+ MCFG_DEVICE_REMOVE("extube")
MACHINE_CONFIG_END
@@ -2377,7 +2352,7 @@ COMP ( 1985, ltmpbp, bbcbp, 0, ltmpbp, ltmpbp, bbc_state, bbc,
COMP ( 1985, reutapm, bbcbp, 0, reutapm, bbcb, bbc_state, bbc, "Acorn", "Reuters APM", MACHINE_NO_SOUND_HW | MACHINE_NOT_WORKING)
COMP ( 1986, econx25, bbcbp, 0, econx25, bbcbp, bbc_state, bbc, "Acorn", "Econet X25 Gateway", MACHINE_NOT_WORKING)
COMP ( 1986, bbcm, 0, bbcb, bbcm, bbcm, bbc_state, bbc, "Acorn", "BBC Master 128", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbc, "Acorn", "BBC Master Turbo", MACHINE_NOT_WORKING)
+COMP ( 1986, bbcmt, bbcm, 0, bbcmt, bbcm, bbc_state, bbc, "Acorn", "BBC Master Turbo", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1986, bbcmaiv, bbcm, 0, bbcmaiv, bbcm, bbc_state, bbc, "Acorn", "BBC Master AIV", MACHINE_NOT_WORKING)
COMP ( 1986, bbcmet, bbcm, 0, bbcmet, bbcm, bbc_state, bbc, "Acorn", "BBC Master ET", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1986, bbcm512, bbcm, 0, bbcm512, bbcm, bbc_state, bbc, "Acorn", "BBC Master 512", MACHINE_NOT_WORKING)
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index ee44812c609..2a64273754a 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -82,6 +82,9 @@ public:
m_upd7002(*this, "upd7002"),
m_analog(*this, "analogue"),
m_joyport(*this, "joyport"),
+ m_tube(*this, "tube"),
+ m_intube(*this, "intube"),
+ m_extube(*this, "extube"),
m_1mhzbus(*this, "1mhzbus"),
m_rtc(*this, "rtc"),
m_fdc(*this, "fdc"),
@@ -229,6 +232,9 @@ public: // HACK FOR MC6845
optional_device<upd7002_device> m_upd7002;
optional_device<bbc_analogue_slot_device> m_analog;
optional_device<bbc_joyport_slot_device> m_joyport;
+ optional_device<bbc_tube_slot_device> m_tube;
+ optional_device<bbc_tube_slot_device> m_intube;
+ optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
optional_device<mc146818_device> m_rtc;
optional_device<bbc_fdc_slot_device> m_fdc;
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index 9351603e78e..ab69a413c34 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -505,7 +505,7 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((myo>=0x80) && (myo<=0x9f)) return 0xfe;
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xff;
- if ((myo>=0xe0) && (myo<=0xff)) return 0xff;
+ if ((myo>=0xe0) && (myo<=0xff)) return m_intube ? m_intube->host_r(space, myo-0xe0) : 0xff;
}
return 0xfe;
}
@@ -536,7 +536,7 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
//if ((myo>=0x80) && (myo<=0x9f))
if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data);
//if ((myo>=0xc0) && (myo<=0xdf))
- //if ((myo>=0xe0) && (myo<=0xff))
+ if ((myo>=0xe0) && (myo<=0xff) && (m_intube)) m_intube->host_w(space, myo-0xe0, data);
}
}
@@ -1442,6 +1442,8 @@ WRITE8_MEMBER(bbc_state::bbc_wd1770_status_w)
// bit 3: density
m_wd1770->dden_w(BIT(data, 3));
+ // bit 4: interrupt enable
+
// bit 5: reset
if (!BIT(data, 5)) m_wd1770->soft_reset();
}