summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua21
-rw-r--r--scripts/target/mame/mess.lua1
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp291
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h95
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp219
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h81
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp118
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h89
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp246
-rw-r--r--src/devices/bus/bbc/fdc/opus.h86
-rw-r--r--src/devices/bus/bbc/fdc/watford.cpp246
-rw-r--r--src/devices/bus/bbc/fdc/watford.h94
-rw-r--r--src/mame/drivers/bbc.cpp150
-rw-r--r--src/mame/includes/bbc.h3
-rw-r--r--src/mame/mame.lst3
15 files changed, 1659 insertions, 84 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index c0aaa3f5d5d..e59553bb247 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -219,6 +219,27 @@ end
---------------------------------------------------
--
+--@src/devices/bus/bbc/fds/fds.h,BUSES["BBC_FDC"] = true
+---------------------------------------------------
+
+if (BUSES["BBC_FDC"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/bbc/fdc/fdc.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/fdc.h",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/acorn.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/acorn.h",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/cumana.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/cumana.h",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/opus.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/opus.h",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/watford.cpp",
+ MAME_DIR .. "src/devices/bus/bbc/fdc/watford.h",
+ }
+end
+
+
+---------------------------------------------------
+--
--@src/devices/bus/bbc/analogue/analogue.h,BUSES["BBC_ANALOGUE"] = true
---------------------------------------------------
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 5d4f3e4907d..4ebe81f7e38 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -608,6 +608,7 @@ BUSES["APRICOT_EXPANSION"] = true
BUSES["APRICOT_KEYBOARD"] = true
BUSES["ARCADIA"] = true
BUSES["ASTROCADE"] = true
+BUSES["BBC_FDC"] = true
BUSES["BBC_ANALOGUE"] = true
BUSES["BBC_1MHZBUS"] = true
BUSES["BBC_TUBE"] = true
diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp
new file mode 100644
index 00000000000..1390546f57d
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/acorn.cpp
@@ -0,0 +1,291 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn 8271 and 1770 FDC
+
+**********************************************************************/
+
+
+#include "acorn.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type BBC_ACORN8271 = &device_creator<bbc_acorn8271_device>;
+const device_type BBC_ACORN1770 = &device_creator<bbc_acorn1770_device>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( acorn )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT,
+ FLOPPY_ACORN_CPM_FORMAT,
+ FLOPPY_TORCH_CPN_FORMAT,
+ FLOPPY_FSD_FORMAT
+FLOPPY_FORMATS_END0
+
+static SLOT_INTERFACE_START( bbc_floppies_525 )
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+ SLOT_INTERFACE("525sd", FLOPPY_525_SD)
+ SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("525qd", FLOPPY_525_QD)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( acorn8271 )
+ MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_acorn8271_device, fdc_intrq_w))
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_acorn8271_device, motor_w))
+ MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_acorn8271_device, side_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( acorn1770 )
+ MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_acorn1770_device, fdc_intrq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_acorn1770_device, fdc_drq_w))
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+ROM_START( acorn8271 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("dnfs120")
+ // Acorn
+ ROM_SYSTEM_BIOS(0, "dfs090", "Acorn DFS 0.90")
+ ROMX_LOAD("dfs090.rom", 0x0000, 0x2000, CRC(3ce609cf) SHA1(5cc0f14b8f46855c70eaa653cca4ad079b458732), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "dfs098", "Acorn DFS 0.98")
+ ROMX_LOAD("dfs098.rom", 0x0000, 0x2000, CRC(90852e7d) SHA1(6df3552d5426f3a4625b9a0c7829bdba03f05e84), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "dnfs100", "Acorn DFS 1.00")
+ ROMX_LOAD("dnfs100.rom", 0x0000, 0x4000, CRC(7e367e8c) SHA1(161f585dc45665ea77433c84afd2f95049f7f5a0), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(3, "dnfs120", "Acorn DFS 1.20")
+ ROMX_LOAD("dnfs120.rom", 0x0000, 0x4000, CRC(8ccd2157) SHA1(7e3c536baeae84d6498a14e8405319e01ee78232), ROM_BIOS(4))
+ // Pace/Amcom
+ ROM_SYSTEM_BIOS(4, "amdfs0000", "Amcom DFS 00000")
+ ROMX_LOAD("amcomdfs_00000.rom", 0x0000, 0x2000, CRC(28947e95) SHA1(43eb9bfc70bb710e01c0c9d48703ea812f9266e4), ROM_BIOS(5))
+ ROM_SYSTEM_BIOS(5, "amdfs7259", "Amcom DFS A7259")
+ ROMX_LOAD("amcomdfs_a7259.rom", 0x0000, 0x2000, CRC(a3366a98) SHA1(7b8b08edf5ebf17fcbcfbb2af0c189ac903285c2), ROM_BIOS(6))
+ ROM_SYSTEM_BIOS(6, "amdfs4084", "Amcom DFS B4084")
+ ROMX_LOAD("amcomdfs_b4084.rom", 0x0000, 0x2000, CRC(487b049b) SHA1(559e056fe77ede2c87a314fcd8d3e2cab2b49b09), ROM_BIOS(7))
+ ROM_SYSTEM_BIOS(7, "amdfs4088", "Amcom DFS B4088")
+ ROMX_LOAD("amcomdfs_b4088.rom", 0x0000, 0x2000, CRC(939b63f5) SHA1(f0801e0927c17d09fa4ab69d0b08d256e1551687), ROM_BIOS(8))
+ ROM_SYSTEM_BIOS(8, "amdfs4218", "Amcom DFS B4218")
+ ROMX_LOAD("amcomdfs_b4218.rom", 0x0000, 0x2000, CRC(98248af5) SHA1(17986b029d641047555eedc538d6790f0cf911a9), ROM_BIOS(9))
+ // Watford Electronics
+ ROM_SYSTEM_BIOS(9, "wdfs110", "Watford Electronics DFS 1.10")
+ ROMX_LOAD("wedfs110.rom", 0x0000, 0x4000, CRC(73c47a91) SHA1(658eb78b104806e76a0e51de9eb238a51daf646d), ROM_BIOS(10))
+ ROM_SYSTEM_BIOS(10, "wdfs130", "Watford Electronics DFS 1.30")
+ ROMX_LOAD("wedfs130.rom", 0x0000, 0x4000, CRC(153edf1f) SHA1(01455e8762fe21a5fbb0c383793bcc6e9c34904c), ROM_BIOS(11))
+ ROM_SYSTEM_BIOS(11, "wdfs141", "Watford Electronics DFS 1.41")
+ ROMX_LOAD("wedfs141.rom", 0x0000, 0x4000, CRC(fda3f58d) SHA1(4f3984ebb35709b39369cb516440dd0589920337), ROM_BIOS(12))
+ ROM_SYSTEM_BIOS(12, "wdfs142", "Watford Electronics DFS 1.42")
+ ROMX_LOAD("wedfs142.rom", 0x0000, 0x4000, CRC(aef838de) SHA1(0caee270eddd8feb3fa75f721775e9b80f853358), ROM_BIOS(13))
+ ROM_SYSTEM_BIOS(13, "wdfs143", "Watford Electronics DFS 1.43")
+ ROMX_LOAD("wedfs143.rom", 0x0000, 0x4000, CRC(3755ee18) SHA1(69bc258880b8e163ff85a293a25e5f00931d030b), ROM_BIOS(14))
+ ROM_SYSTEM_BIOS(14, "wdfs144", "Watford Electronics DFS 1.44")
+ ROMX_LOAD("wedfs144.rom", 0x0000, 0x4000, CRC(9fb8d13f) SHA1(387d2468c6e1360f5b531784ce95d5f71a50c2b5), ROM_BIOS(15))
+ // Business Systems
+ ROM_SYSTEM_BIOS(15, "bsdos219", "BS-DOS 2.19")
+ ROMX_LOAD("bs-dos219.rom", 0x0000, 0x4000, CRC(299b17b2) SHA1(175fdcc802a7d94d7c36d6f3fd52a192a7cfbc98), ROM_BIOS(16))
+ ROM_SYSTEM_BIOS(16, "bsdos222", "BS-DOS 2.22")
+ ROMX_LOAD("bs-dos222.rom", 0x0000, 0x4000, CRC(63cf49d1) SHA1(92948e5843b9d9715354e21f14de2453bc250bf4), ROM_BIOS(17))
+ // Others
+ ROM_SYSTEM_BIOS(17, "cucdos", "C.U.C DOS 1.00")
+ ROMX_LOAD("cucdos.rom", 0x0000, 0x2000, CRC(4adf8ecb) SHA1(ca3c1f9e89799459b6fd5197304129441443ca54), ROM_BIOS(18))
+ROM_END
+
+ROM_START( acorn1770 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("dfs223")
+ ROM_SYSTEM_BIOS(0, "dfs210", "Acorn DFS 2.10")
+ ROMX_LOAD("dfs v2.10 (1985)(acorn).bin", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "dfs220", "Acorn DFS 2.20")
+ ROMX_LOAD("dfs v2.20 (1986)(acorn).bin", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "dfs223", "Acorn DFS 2.23")
+ ROMX_LOAD("dfs v2.23 (1986)(acorn).bin", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(3, "dfs225", "Acorn DFS 2.25")
+ ROMX_LOAD("dfs v2.25 (1986)(acorn).bin", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(4))
+ ROM_SYSTEM_BIOS(4, "dfs226", "Acorn DFS 2.26")
+ ROMX_LOAD("dfs v2.26 (1986)(acorn).bin", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(5))
+ROM_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor bbc_acorn8271_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( acorn8271 );
+}
+
+machine_config_constructor bbc_acorn1770_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( acorn1770 );
+}
+
+
+const tiny_rom_entry *bbc_acorn8271_device::device_rom_region() const
+{
+ return ROM_NAME( acorn8271 );
+}
+
+const tiny_rom_entry *bbc_acorn1770_device::device_rom_region() const
+{
+ return ROM_NAME( acorn1770 );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_acornfdc_device - constructor
+//-------------------------------------------------
+
+bbc_acorn8271_device::bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, BBC_ACORN8271, "Acorn 8271 FDC", tag, owner, clock, "bbc_acorn8271", __FILE__),
+ device_bbc_fdc_interface(mconfig, *this),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "i8271"),
+ m_floppy0(*this, "i8271:0"),
+ m_floppy1(*this, "i8271:1")
+{
+}
+
+bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, BBC_ACORN1770, "Acorn 1770 FDC", tag, owner, clock, "bbc_acorn1770", __FILE__),
+ device_bbc_fdc_interface(mconfig, *this),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "wd1770"),
+ m_floppy0(*this, "wd1770:0"),
+ m_floppy1(*this, "wd1770:1")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_acorn8271_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_device(0xfe80, 0xfe83, *m_fdc, &i8271_device::map);
+ space.install_readwrite_handler(0xfe84, 0xfe9f, READ8_DEVICE_DELEGATE(m_fdc, i8271_device, data_r), WRITE8_DEVICE_DELEGATE(m_fdc, i8271_device, data_w));
+}
+
+void bbc_acorn1770_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_acorn1770_device, wd1770l_read), WRITE8_DELEGATE(bbc_acorn1770_device, wd1770l_write));
+ space.install_readwrite_handler(0xfe84, 0xfe9f, READ8_DEVICE_DELEGATE(m_fdc, wd1770_t, read), WRITE8_DEVICE_DELEGATE(m_fdc, wd1770_t, write));
+
+ m_drive_control = 0xfe;
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_acorn8271_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+
+ m_fdc->soft_reset();
+}
+
+void bbc_acorn1770_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+WRITE_LINE_MEMBER(bbc_acorn8271_device::motor_w)
+{
+ for (int i = 0; i != 2; i++) {
+ char devname[8];
+ sprintf(devname, "%d", i);
+ floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
+ if (con) {
+ con->get_device()->mon_w(!state);
+ }
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_acorn8271_device::side_w)
+{
+ for (int i = 0; i != 2; i++) {
+ char devname[8];
+ sprintf(devname, "%d", i);
+ floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
+ if (con) {
+ con->get_device()->ss_w(state);
+ }
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_acorn8271_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+
+READ8_MEMBER(bbc_acorn1770_device::wd1770l_read)
+{
+ return m_drive_control;
+}
+
+WRITE8_MEMBER(bbc_acorn1770_device::wd1770l_write)
+{
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_fdc->subdevice<floppy_connector>("0")->get_device();
+ if (BIT(data, 1)) floppy = m_fdc->subdevice<floppy_connector>("1")->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 2: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 2));
+
+ // bit 3: density
+ m_fdc->dden_w(BIT(data, 3));
+
+ // bit 5: reset
+ if (!BIT(data, 5)) m_fdc->soft_reset();
+}
+
+WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_drq_w)
+{
+ m_slot->drq_w(state);
+}
diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h
new file mode 100644
index 00000000000..19054de50dd
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/acorn.h
@@ -0,0 +1,95 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Acorn 8271 and 1770 FDC
+
+**********************************************************************/
+
+
+#ifndef __BBC_ACORN__
+#define __BBC_ACORN__
+
+#include "emu.h"
+#include "fdc.h"
+#include "machine/i8271.h"
+#include "machine/wd_fdc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/fsd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_acorn8271_device :
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ // construction/destruction
+ bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_WRITE_LINE_MEMBER(side_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<i8271_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+};
+
+class bbc_acorn1770_device :
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ // construction/destruction
+ bbc_acorn1770_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_READ8_MEMBER(wd1770l_read);
+ DECLARE_WRITE8_MEMBER(wd1770l_write);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<wd1770_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+
+// device type definition
+extern const device_type BBC_ACORN8271;
+extern const device_type BBC_ACORN1770;
+
+
+#endif /* __BBC_ACORN__ */
diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp
new file mode 100644
index 00000000000..a41fdf694f0
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/cumana.cpp
@@ -0,0 +1,219 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Cumana QFS 8877A FDC
+
+ http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Cumana_QFS.html
+
+**********************************************************************/
+
+
+#include "cumana.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type BBC_CUMANA1 = &device_creator<bbc_cumana1_device>;
+const device_type BBC_CUMANA2 = &device_creator<bbc_cumana2_device>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( cumana )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT,
+ FLOPPY_FSD_FORMAT
+FLOPPY_FORMATS_END0
+
+static SLOT_INTERFACE_START( bbc_floppies_525 )
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+ SLOT_INTERFACE("525sd", FLOPPY_525_SD)
+ SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("525qd", FLOPPY_525_QD)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( cumana )
+ MCFG_MB8877_ADD("mb8877a", XTAL_16MHz / 16)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_cumanafdc_device, fdc_intrq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_cumanafdc_device, fdc_drq_w))
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_cumanafdc_device, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD("mb8877a:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("mb8877a:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+ROM_START( cumana1 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("qfs102")
+ ROM_SYSTEM_BIOS(0, "qfs102", "QFS 1.02")
+ ROMX_LOAD("qfs102.rom", 0x0000, 0x4000, CRC(083a9285) SHA1(4bf31a420a9d752285b088ee4f08a64563527662), ROM_BIOS(1))
+ROM_END
+
+ROM_START( cumana2 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("qfs200")
+ ROM_SYSTEM_BIOS(0, "qfs200", "QFS 2.00")
+ ROMX_LOAD("qfs200.rom", 0x0000, 0x4000, CRC(5863962a) SHA1(0dced741482321938842746ee47090ae443d7ad5), ROM_BIOS(1))
+ROM_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor bbc_cumana1_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( cumana );
+}
+
+machine_config_constructor bbc_cumana2_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( cumana );
+}
+
+const tiny_rom_entry *bbc_cumana1_device::device_rom_region() const
+{
+ return ROM_NAME( cumana1 );
+}
+
+const tiny_rom_entry *bbc_cumana2_device::device_rom_region() const
+{
+ return ROM_NAME( cumana2 );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_cumanafdc_device - constructor
+//-------------------------------------------------
+
+bbc_cumanafdc_device::bbc_cumanafdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_bbc_fdc_interface(mconfig, *this),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "mb8877a"),
+ m_floppy0(*this, "mb8877a:0"),
+ m_floppy1(*this, "mb8877a:1")
+{
+}
+
+bbc_cumana1_device::bbc_cumana1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ bbc_cumanafdc_device(mconfig, BBC_CUMANA1, "Cumana QFS 8877A FDC", tag, owner, clock, "bbc_cumana1", __FILE__)
+{
+ m_invert = true;
+}
+
+bbc_cumana2_device::bbc_cumana2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ bbc_cumanafdc_device(mconfig, BBC_CUMANA2, "Cumana QFS Issue 2 8877A FDC", tag, owner, clock, "bbc_cumana2", __FILE__)
+{
+ m_invert = false;
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_cumanafdc_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_cumanafdc_device, ctrl_r), WRITE8_DELEGATE(bbc_cumanafdc_device, ctrl_w));
+ space.install_readwrite_handler(0xfe84, 0xfe9f, READ8_DEVICE_DELEGATE(m_fdc, mb8877_t, read), WRITE8_DEVICE_DELEGATE(m_fdc, mb8877_t, write));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_cumanafdc_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+
+ m_fdc->soft_reset();
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_cumanafdc_device::ctrl_r)
+{
+ return m_drive_control;
+}
+
+WRITE8_MEMBER(bbc_cumanafdc_device::ctrl_w)
+{
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0: drive select
+ floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
+ floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
+ floppy = (BIT(data, 0) ? floppy1 : floppy0);
+ m_fdc->set_floppy(floppy);
+
+ // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify
+ if (m_invert)
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(!BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(!BIT(data, 2));
+ }
+ else
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(BIT(data, 2));
+ }
+ // bit 3: reset
+ if (BIT(data, 3)) m_fdc->soft_reset();
+
+ // bit 4: interrupt enable
+ m_fdc_ie = BIT(data, 4);
+}
+
+WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_intrq_w)
+{
+ if (m_fdc_ie)
+ m_slot->intrq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_drq_w)
+{
+ if (m_fdc_ie)
+ m_slot->drq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_cumanafdc_device::motor_w)
+{
+ for (int i = 0; i != 2; i++) {
+ char devname[8];
+ sprintf(devname, "%d", i);
+ floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
+ if (con) {
+ con->get_device()->mon_w(!state);
+ }
+ }
+}
diff --git a/src/devices/bus/bbc/fdc/cumana.h b/src/devices/bus/bbc/fdc/cumana.h
new file mode 100644
index 00000000000..9c3dab2b3c8
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/cumana.h
@@ -0,0 +1,81 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Cumana QFS 8877A FDC
+
+**********************************************************************/
+
+
+#ifndef __BBC_CUMANA__
+#define __BBC_CUMANA__
+
+#include "emu.h"
+#include "fdc.h"
+#include "machine/wd_fdc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/fsd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_cumanafdc_device :
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ // construction/destruction
+ bbc_cumanafdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_READ8_MEMBER(ctrl_r);
+ DECLARE_WRITE8_MEMBER(ctrl_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ bool m_invert;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<mb8877_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+ int m_fdc_ie;
+};
+
+class bbc_cumana1_device : public bbc_cumanafdc_device
+{
+public:
+ bbc_cumana1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bbc_cumana2_device : public bbc_cumanafdc_device
+{
+public:
+ bbc_cumana2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+
+// device type definition
+extern const device_type BBC_CUMANA1;
+extern const device_type BBC_CUMANA2;
+
+
+#endif /* __BBC_CUMANA__ */
diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp
new file mode 100644
index 00000000000..b7f108ef01b
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/fdc.cpp
@@ -0,0 +1,118 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Micro Floppy Disc Controller slot emulation
+
+**********************************************************************/
+
+#include "fdc.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type BBC_FDC_SLOT = &device_creator<bbc_fdc_slot_device>;
+
+
+//**************************************************************************
+// DEVICE BBC_FDC CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_bbc_fdc_interface - constructor
+//-------------------------------------------------
+
+device_bbc_fdc_interface::device_bbc_fdc_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+{
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(device.owner());
+}
+
+
+//-------------------------------------------------
+// ~device_bbc_fdc_interface - destructor
+//-------------------------------------------------
+
+device_bbc_fdc_interface::~device_bbc_fdc_interface()
+{
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_fdc_slot_device - constructor
+//-------------------------------------------------
+
+bbc_fdc_slot_device::bbc_fdc_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, BBC_FDC_SLOT, "BBC Micro FDC slot", tag, owner, clock, "bbc_fdc_slot", __FILE__),
+ device_slot_interface(mconfig, *this),
+ m_card(nullptr),
+ m_intrq_handler(*this),
+ m_drq_handler(*this)
+{
+}
+
+
+//-------------------------------------------------
+// bbc_fdc_slot_device - destructor
+//-------------------------------------------------
+
+bbc_fdc_slot_device::~bbc_fdc_slot_device()
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_fdc_slot_device::device_start()
+{
+ m_card = dynamic_cast<device_bbc_fdc_interface *>(get_card_device());
+
+ // resolve callbacks
+ m_intrq_handler.resolve_safe();
+ m_drq_handler.resolve_safe();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_fdc_slot_device::device_reset()
+{
+ if (get_card_device())
+ {
+ get_card_device()->reset();
+ }
+}
+
+
+//-------------------------------------------------
+// SLOT_INTERFACE( bbc_fdc_devices )
+//-------------------------------------------------
+
+
+// slot devices
+#include "acorn.h"
+#include "cumana.h"
+#include "opus.h"
+#include "watford.h"
+
+
+SLOT_INTERFACE_START( bbc_fdc_devices )
+ SLOT_INTERFACE("acorn8271", BBC_ACORN8271)
+ SLOT_INTERFACE("acorn1770", BBC_ACORN1770)
+ SLOT_INTERFACE("cumana1", BBC_CUMANA1)
+ SLOT_INTERFACE("cumana2", BBC_CUMANA2)
+ SLOT_INTERFACE("opus2791", BBC_OPUS2791)
+ SLOT_INTERFACE("opus2793", BBC_OPUS2793)
+ SLOT_INTERFACE("opus1770", BBC_OPUS1770)
+ SLOT_INTERFACE("weddb2", BBC_WEDDB2)
+ SLOT_INTERFACE("weddb3", BBC_WEDDB3)
+SLOT_INTERFACE_END
diff --git a/src/devices/bus/bbc/fdc/fdc.h b/src/devices/bus/bbc/fdc/fdc.h
new file mode 100644
index 00000000000..c161ce84624
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/fdc.h
@@ -0,0 +1,89 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ BBC Micro Floppy Disc Controller slot emulation
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __BBC_FDC_SLOT__
+#define __BBC_FDC_SLOT__
+
+#include "emu.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_BBC_FDC_SLOT_ADD(_tag, _slot_intf, _def_slot, _fixed) \
+ MCFG_DEVICE_ADD(_tag, BBC_FDC_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _fixed)
+
+#define MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(_devcb) \
+ devcb = &bbc_fdc_slot_device::set_intrq_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_BBC_FDC_SLOT_DRQ_HANDLER(_devcb) \
+ devcb = &bbc_fdc_slot_device::set_drq_handler(*device, DEVCB_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_fdc_slot_device
+
+class device_bbc_fdc_interface;
+
+class bbc_fdc_slot_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ bbc_fdc_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~bbc_fdc_slot_device();
+
+ // callbacks
+ template<class _Object> static devcb_base &set_intrq_handler(device_t &device, _Object object)
+ { return downcast<bbc_fdc_slot_device &>(device).m_intrq_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_drq_handler(device_t &device, _Object object)
+ { return downcast<bbc_fdc_slot_device &>(device).m_drq_handler.set_callback(object); }
+
+ DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_handler(state); }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ device_bbc_fdc_interface *m_card;
+
+private:
+ devcb_write_line m_intrq_handler;
+ devcb_write_line m_drq_handler;
+};
+
+
+// ======================> device_bbc_fdc_interface
+
+class device_bbc_fdc_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_bbc_fdc_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_bbc_fdc_interface();
+
+protected:
+ bbc_fdc_slot_device *m_slot;
+};
+
+
+// device type definition
+extern const device_type BBC_FDC_SLOT;
+
+SLOT_INTERFACE_EXTERN( bbc_fdc_devices );
+
+
+#endif
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
new file mode 100644
index 00000000000..c2d1b7321c3
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -0,0 +1,246 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Opus Floppy Disc Controllers
+
+ EDOS: http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Opus_DiscController.html
+ 2791: http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Opus_DDoss.html
+ 2793:
+ 1770: http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Opus_D-DOS.html
+
+**********************************************************************/
+
+
+#include "opus.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type BBC_OPUS2791 = &device_creator<bbc_opus2791_device>;
+const device_type BBC_OPUS2793 = &device_creator<bbc_opus2793_device>;
+const device_type BBC_OPUS1770 = &device_creator<bbc_opus1770_device>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( opus2791 )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT,
+ FLOPPY_FSD_FORMAT,
+ FLOPPY_OPUS_DDOS_FORMAT
+FLOPPY_FORMATS_END0
+
+static SLOT_INTERFACE_START( bbc_floppies_525 )
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+ SLOT_INTERFACE("525sd", FLOPPY_525_SD)
+ SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("525qd", FLOPPY_525_QD)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( opus2791 )
+ MCFG_WD2791_ADD("fdc", XTAL_16MHz / 16)
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_opusfdc_device, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( opus2793 )
+ MCFG_WD2793_ADD("fdc", XTAL_16MHz / 16)
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_opusfdc_device, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( opus1770 )
+ MCFG_WD1770_ADD("fdc", XTAL_16MHz / 2)
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_opusfdc_device, fdc_drq_w))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+ROM_START( opus2791 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddos315")
+ ROM_SYSTEM_BIOS(0, "ddos315", "Opus DDOS 3.15")
+ ROMX_LOAD("opus-ddos315.rom", 0x0000, 0x4000, CRC(5f06701c) SHA1(9e250dc7ddcde35b19e8f29f2cfe95a79f46d473), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "edos04", "Opus EDOS 0.4")
+ ROMX_LOAD("opus-edos04.rom", 0x0000, 0x4000, CRC(1d8a3860) SHA1(05f461464707b4ca24636c9e726af561f227ccdb), ROM_BIOS(2))
+ROM_END
+
+ROM_START( opus2793 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddos335")
+ ROM_SYSTEM_BIOS(0, "ddos335", "Opus DDOS 3.35")
+ ROMX_LOAD("opus-ddos335.rom", 0x0000, 0x4000, CRC(e33167fb) SHA1(42fbc9932db2087708da41cb1ffa94358683cf7a), ROM_BIOS(1))
+ROM_END
+
+ROM_START( opus1770 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddos346")
+ ROM_SYSTEM_BIOS(0, "ddos345", "Opus DDOS 3.45")
+ ROMX_LOAD("opus-ddos345.rom", 0x0000, 0x4000, CRC(c0163b95) SHA1(1c5a68e08abbb7ffe663151c59088f750d2287a9), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "ddos346", "Opus DDOS 3.46")
+ ROMX_LOAD("opus-ddos346.rom", 0x0000, 0x4000, CRC(bf9c35cf) SHA1(a1ad3e9acbd15400e7da1e50bc6673835cde1fe7), ROM_BIOS(2))
+ROM_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor bbc_opus2791_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( opus2791 );
+}
+
+machine_config_constructor bbc_opus2793_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( opus2793 );
+}
+
+machine_config_constructor bbc_opus1770_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( opus1770 );
+}
+
+
+const tiny_rom_entry *bbc_opus2791_device::device_rom_region() const
+{
+ return ROM_NAME( opus2791 );
+}
+
+const tiny_rom_entry *bbc_opus2793_device::device_rom_region() const
+{
+ return ROM_NAME( opus2793 );
+}
+
+const tiny_rom_entry *bbc_opus1770_device::device_rom_region() const
+{
+ return ROM_NAME( opus1770 );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_opusfdc_device - constructor
+//-------------------------------------------------
+
+bbc_opusfdc_device::bbc_opusfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_bbc_fdc_interface(mconfig, *this),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "fdc"),
+ m_floppy0(*this, "fdc:0"),
+ m_floppy1(*this, "fdc:1")
+{
+}
+
+bbc_opus2791_device::bbc_opus2791_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : bbc_opusfdc_device(mconfig, BBC_OPUS2791, "Opus 2791 FDC", tag, owner, clock, "bbc_opus2791", __FILE__)
+{
+}
+
+bbc_opus2793_device::bbc_opus2793_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : bbc_opusfdc_device(mconfig, BBC_OPUS2793, "Opus 2793 FDC", tag, owner, clock, "bbc_opus2793", __FILE__)
+{
+}
+
+bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : bbc_opusfdc_device(mconfig, BBC_OPUS1770, "Opus D-DOS(B) 1770 FDC", tag, owner, clock, "bbc_opus1770", __FILE__)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_opusfdc_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, read), WRITE8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, write));
+ space.install_readwrite_handler(0xfe84, 0xfe84, READ8_DELEGATE(bbc_opusfdc_device, ctrl_r), WRITE8_DELEGATE(bbc_opusfdc_device, ctrl_w));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_opusfdc_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+
+ m_fdc->soft_reset();
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_opusfdc_device::ctrl_r)
+{
+ return m_drive_control;
+}
+
+WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
+{
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0: drive select
+ floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
+ floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
+ floppy = (BIT(data, 0) ? floppy1 : floppy0);
+ m_fdc->set_floppy(floppy);
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 6: density
+ m_fdc->dden_w(!BIT(data, 6));
+}
+
+WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)
+{
+ m_slot->drq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_opusfdc_device::motor_w)
+{
+ for (int i = 0; i != 2; i++) {
+ char devname[8];
+ sprintf(devname, "%d", i);
+ floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
+ if (con) {
+ con->get_device()->mon_w(!state);
+ }
+ }
+}
diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h
new file mode 100644
index 00000000000..93cedaa8954
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/opus.h
@@ -0,0 +1,86 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Opus Floppy Disc Controllers
+
+**********************************************************************/
+
+
+#ifndef __BBC_OPUSFDC__
+#define __BBC_OPUSFDC__
+
+#include "emu.h"
+#include "fdc.h"
+#include "machine/wd_fdc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/fsd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_opusfdc_device:
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ // construction/destruction
+ bbc_opusfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_READ8_MEMBER(ctrl_r);
+ DECLARE_WRITE8_MEMBER(ctrl_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<wd_fdc_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+class bbc_opus2791_device : public bbc_opusfdc_device
+{
+public:
+ bbc_opus2791_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bbc_opus2793_device : public bbc_opusfdc_device
+{
+public:
+ bbc_opus2793_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+class bbc_opus1770_device : public bbc_opusfdc_device
+{
+public:
+ bbc_opus1770_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+};
+
+// device type definition
+extern const device_type BBC_OPUS2791;
+extern const device_type BBC_OPUS2793;
+extern const device_type BBC_OPUS1770;
+
+#endif /* __BBC_OPUSFDC_ */
diff --git a/src/devices/bus/bbc/fdc/watford.cpp b/src/devices/bus/bbc/fdc/watford.cpp
new file mode 100644
index 00000000000..0cbd2ee16a0
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/watford.cpp
@@ -0,0 +1,246 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Watford Electronics DDB FDC
+
+ DDB : 1770
+ DDB2: 1772
+ DDB3: 1770 (Acorn compatible)
+
+**********************************************************************/
+
+
+#include "watford.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type BBC_WEDDB2 = &device_creator<bbc_weddb2_device>;
+const device_type BBC_WEDDB3 = &device_creator<bbc_weddb3_device>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( watford )
+//-------------------------------------------------
+
+FLOPPY_FORMATS_MEMBER( floppy_formats )
+ FLOPPY_ACORN_SSD_FORMAT,
+ FLOPPY_ACORN_DSD_FORMAT,
+ FLOPPY_FSD_FORMAT
+FLOPPY_FORMATS_END0
+
+static SLOT_INTERFACE_START( bbc_floppies_525 )
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+ SLOT_INTERFACE("525sd", FLOPPY_525_SD)
+ SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("525qd", FLOPPY_525_QD)
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( weddb2 )
+ MCFG_WD1772_ADD("wd1772", XTAL_16MHz / 2)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_weddb2_device, fdc_intrq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_weddb2_device, fdc_drq_w))
+ MCFG_FLOPPY_DRIVE_ADD("wd1772:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( weddb3 )
+ MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_weddb3_device, fdc_intrq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_weddb3_device, fdc_drq_w))
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+MACHINE_CONFIG_END
+
+ROM_START( weddb2 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddfs153")
+ ROM_SYSTEM_BIOS(0, "ddfs140", "Watford Electronics DDFS 1.40")
+ ROMX_LOAD("ddfs140.rom", 0x0000, 0x4000, CRC(6c6eef94) SHA1(d86b26a6fe7b3532e7bd3c6f3e8e503edac3811c), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "ddfs150", "Watford Electronics DDFS 1.50")
+ ROMX_LOAD("ddfs150.rom", 0x0000, 0x4000, CRC(d2fff497) SHA1(7693f14aeed26c34b2342c3487ed4b9ad233e279), ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "ddfs153", "Watford Electronics DDFS 1.53")
+ ROMX_LOAD("ddfs153.rom", 0x0000, 0x4000, CRC(e1be4ee4) SHA1(6719dc958f2631e6dc8f045429797b289bfe649a), ROM_BIOS(3))
+ROM_END
+
+ROM_START( weddb3 )
+ ROM_REGION(0x4000, "dfs_rom", 0)
+ ROM_DEFAULT_BIOS("ddfs154t")
+ ROM_SYSTEM_BIOS(0, "ddfs154t", "Watford Electronics DDFS 1.54T")
+ ROMX_LOAD("ddfs154t.rom", 0x0000, 0x4000, CRC(6504c1ed) SHA1(618b7a1551f91e2b18608428b9e581f3d920d4b5), ROM_BIOS(1))
+ROM_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor bbc_weddb2_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( weddb2 );
+}
+
+machine_config_constructor bbc_weddb3_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( weddb3 );
+}
+
+const tiny_rom_entry *bbc_weddb2_device::device_rom_region() const
+{
+ return ROM_NAME( weddb2 );
+}
+
+const tiny_rom_entry *bbc_weddb3_device::device_rom_region() const
+{
+ return ROM_NAME( weddb3 );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_watfordfdc_device - constructor
+//-------------------------------------------------
+
+bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_bbc_fdc_interface(mconfig, *this)
+{
+}
+
+bbc_weddb2_device::bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, "Watford Electronics DDB2 1772 FDC", tag, owner, clock, "bbc_weddb2", __FILE__),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "wd1772"),
+ m_floppy0(*this, "wd1772:0"),
+ m_floppy1(*this, "wd1772:1")
+{
+}
+
+bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, "Watford Electronics DDB3 1770 FDC", tag, owner, clock, "bbc_weddb3", __FILE__),
+ m_dfs_rom(*this, "dfs_rom"),
+ m_fdc(*this, "wd1770"),
+ m_floppy0(*this, "wd1770:0"),
+ m_floppy1(*this, "wd1770:1")
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_weddb2_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_weddb2_device, wd177xl_read), WRITE8_DELEGATE(bbc_weddb2_device, wd177xl_write));
+ space.install_readwrite_handler(0xfe84, 0xfe8f, READ8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, read), WRITE8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, write));
+}
+
+void bbc_weddb3_device::device_start()
+{
+ device_t* cpu = machine().device("maincpu");
+ address_space& space = cpu->memory().space(AS_PROGRAM);
+ m_slot = dynamic_cast<bbc_fdc_slot_device *>(owner());
+
+ space.install_readwrite_handler(0xfe80, 0xfe83, READ8_DELEGATE(bbc_weddb3_device, wd177xl_read), WRITE8_DELEGATE(bbc_weddb3_device, wd177xl_write));
+ space.install_readwrite_handler(0xfe84, 0xfe8f, READ8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, read), WRITE8_DEVICE_DELEGATE(m_fdc, wd_fdc_t, write));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void bbc_weddb2_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+}
+
+void bbc_weddb3_device::device_reset()
+{
+ machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_weddb2_device::wd177xl_read)
+{
+ return m_drive_control;
+}
+
+WRITE8_MEMBER(bbc_weddb2_device::wd177xl_write)
+{
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 2: drive select
+ floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
+ floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
+ floppy = (BIT(data, 2) ? floppy1 : floppy0);
+ m_fdc->set_floppy(floppy);
+
+ // bit 0: density
+ m_fdc->dden_w(BIT(data, 0));
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 3: reset
+ if (!BIT(data, 3)) m_fdc->soft_reset();
+}
+
+READ8_MEMBER(bbc_weddb3_device::wd177xl_read)
+{
+ return m_drive_control;
+}
+
+WRITE8_MEMBER(bbc_weddb3_device::wd177xl_write)
+{
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_fdc->subdevice<floppy_connector>("0")->get_device();
+ if (BIT(data, 1)) floppy = m_fdc->subdevice<floppy_connector>("1")->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 2: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 2));
+
+ // bit 3: density
+ m_fdc->dden_w(BIT(data, 3));
+
+ // bit 5: reset
+ if (!BIT(data, 5)) m_fdc->soft_reset();
+}
+
+WRITE_LINE_MEMBER(bbc_watfordfdc_device::fdc_intrq_w)
+{
+ m_slot->intrq_w(state);
+}
+
+WRITE_LINE_MEMBER(bbc_watfordfdc_device::fdc_drq_w)
+{
+ m_slot->drq_w(state);
+}
diff --git a/src/devices/bus/bbc/fdc/watford.h b/src/devices/bus/bbc/fdc/watford.h
new file mode 100644
index 00000000000..9b5dd1e947b
--- /dev/null
+++ b/src/devices/bus/bbc/fdc/watford.h
@@ -0,0 +1,94 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/**********************************************************************
+
+ Watford Electronics DDB FDC
+
+**********************************************************************/
+
+
+#ifndef __BBC_WATFORD__
+#define __BBC_WATFORD__
+
+#include "emu.h"
+#include "fdc.h"
+#include "machine/wd_fdc.h"
+#include "formats/acorn_dsk.h"
+#include "formats/fsd_dsk.h"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class bbc_watfordfdc_device :
+ public device_t,
+ public device_bbc_fdc_interface
+
+{
+public:
+ // construction/destruction
+ bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+};
+
+class bbc_weddb2_device : public bbc_watfordfdc_device
+{
+public:
+ bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ DECLARE_READ8_MEMBER(wd177xl_read);
+ DECLARE_WRITE8_MEMBER(wd177xl_write);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<wd_fdc_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+class bbc_weddb3_device : public bbc_watfordfdc_device
+{
+public:
+ bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+
+ DECLARE_READ8_MEMBER(wd177xl_read);
+ DECLARE_WRITE8_MEMBER(wd177xl_write);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_memory_region m_dfs_rom;
+ required_device<wd_fdc_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ optional_device<floppy_connector> m_floppy1;
+
+ int m_drive_control;
+};
+
+
+// device type definition
+extern const device_type BBC_WEDDB2;
+extern const device_type BBC_WEDDB3;
+
+
+#endif /* __BBC_WATFORD__ */
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index 055d7b98c76..1b3c6d0d9ed 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -198,14 +198,13 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state )
ADDRESS_MAP_END
-static ADDRESS_MAP_START(bbcb1770_mem, AS_PROGRAM, 8, bbc_state)
- AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */
- AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
- AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
- AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
- /* 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_t, read, write) /* fe84-fe9f 1770 FDC Floppy disc controller */
+static ADDRESS_MAP_START( bbcb_nofdc_mem, AS_PROGRAM, 8, bbc_state )
+ AM_RANGE(0x0000, 0x3fff) AM_READ_BANK("bank1") AM_WRITE(bbc_memorya1_w) /* 0000-3fff Regular Ram */
+ AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank3") AM_WRITE(bbc_memoryb3_w) /* 4000-7fff Regular Ram */
+ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
+ AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
+ /* W: fe30-fe3f 84LS161 Paged ROM selector */
+ AM_RANGE(0xfe80, 0xfe83) AM_NOP /* fe80-fe9f Floppy disc controller */
AM_IMPORT_FROM(bbc_base)
ADDRESS_MAP_END
@@ -292,6 +291,7 @@ INPUT_CHANGED_MEMBER(bbc_state::trigger_reset)
if (m_via6522_1) m_via6522_1->reset();
if (m_adlc) m_adlc->reset();
if (m_rtc) m_rtc->reset();
+ if (m_fdc) m_fdc->reset();
if (m_i8271) m_i8271->reset();
}
}
@@ -950,7 +950,7 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcb, bbca )
/* basic machine hardware */
MCFG_CPU_MODIFY( "maincpu" )
- MCFG_CPU_PROGRAM_MAP(bbcb_mem)
+ MCFG_CPU_PROGRAM_MAP(bbcb_nofdc_mem)
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb)
@@ -985,14 +985,9 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
/* fdc */
- MCFG_DEVICE_ADD("i8271", I8271, 0)
- MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
- MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
- MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
- MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_BBC_FDC_SLOT_ADD("fdc", bbc_fdc_devices, "acorn8271", false)
+ MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_BBC_FDC_SLOT_DRQ_HANDLER(WRITELINE(bbc_state, fdc_drq_w))
/* econet */
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
@@ -1004,10 +999,10 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
/* expansion ports */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr)
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
+ MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
+ MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_tube_ext_devices, nullptr)
+ MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
/* software lists */
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@@ -1020,54 +1015,76 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED(bbcb1770, bbcb)
+static MACHINE_CONFIG_DERIVED( bbcb_de, bbcb )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_PROGRAM_MAP(bbcb1770_mem)
+ MCFG_CPU_PROGRAM_MAP(bbcb_mem)
/* fdc */
- MCFG_DEVICE_REMOVE("i8271")
-
- MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
- MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
- MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w))
-
- MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
+ MCFG_DEVICE_REMOVE("fdc")
+ MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
+ MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
MCFG_FLOPPY_DRIVE_SOUND(true)
-MACHINE_CONFIG_END
-
-static MACHINE_CONFIG_DERIVED( bbcb_de, bbcb )
/* software lists */
MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( bbcb_us, bbcb )
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(bbcb_mem)
+
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_SIZE(640, 200)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_SCREEN_REFRESH_RATE(60)
+ /* fdc */
+ MCFG_DEVICE_REMOVE("fdc")
+ MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
+ MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+
/* software lists */
MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_flop_us")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( bbcbp, bbcb1770 )
+static MACHINE_CONFIG_DERIVED( bbcbp, bbcb )
/* basic machine hardware */
MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */
MCFG_CPU_PROGRAM_MAP(bbcbp_mem)
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
+
+ /* fdc */
+ MCFG_DEVICE_REMOVE("fdc")
+ MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, fdc_drq_w))
+
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbcm)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( bbcbp128, bbcb1770 )
+static MACHINE_CONFIG_DERIVED( bbcbp128, bbcbp )
/* basic machine hardware */
MCFG_CPU_MODIFY( "maincpu" ) /* M6512 */
MCFG_CPU_PROGRAM_MAP(bbcbp128_mem)
@@ -1086,8 +1103,22 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( torchf, bbcb )
/* basic machine hardware */
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(bbcb_mem)
+
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch)
+ /* fdc */
+ MCFG_DEVICE_REMOVE("fdc")
+ MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, fdc_intrq_w))
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
+ MCFG_I8271_OPT_CALLBACK(WRITELINE(bbc_state, side_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+
/* Add Torch Z80 Communicator co-processor */
/* software lists */
@@ -1647,50 +1678,6 @@ ROM_START(bbcb)
ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
-ROM_END
-
-
-ROM_START(bbcb1770)
- ROM_REGION(0x08000,"maincpu",ROMREGION_ERASEFF) /* RAM */
-
- ROM_REGION(0x44000,"option",0) /* ROM */
- /* rom page 0 00000 */
- /* rom page 1 04000 */
- /* rom page 2 08000 */
- /* rom page 3 0c000 */
- /* rom page 4 10000 */
- /* rom page 5 14000 */
- /* rom page 6 18000 */
- /* rom page 7 1c000 */
- /* rom page 8 20000 */
- /* rom page 9 24000 */
- /* rom page 10 28000 */
- /* rom page 11 2c000 */
- /* rom page 12 30000 IC52 SPARE SOCKET */
- /* rom page 13 34000 IC88 SPARE SOCKET */
- /* rom page 14 38000 IC100 DDFS */
- /* rom page 15 3c000 IC101 BASIC */
- ROM_DEFAULT_BIOS("os12b2")
- ROM_SYSTEM_BIOS( 0, "os12b2", "OS 1.20 / BASIC2" )
- ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(1)) /* os */
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(1)) /* rom page 15 3c000 */
- ROM_SYSTEM_BIOS( 1, "os12b1", "OS 1.20 / BASIC1" )
- ROMX_LOAD("os12.rom", 0x40000, 0x4000, CRC(3c14fc70) SHA1(0d9bcaf6a393c9ce2359ed700ddb53c232c2c45d), ROM_BIOS(2)) /* os */
- ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(2)) /* rom page 15 3c000 */
- ROM_SYSTEM_BIOS( 2, "os10b2", "OS 1.00 / BASIC2" )
- ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(3)) /* os */
- ROMX_LOAD("basic2.rom", 0x3c000, 0x4000, CRC(79434781) SHA1(4a7393f3a45ea309f744441c16723e2ef447a281), ROM_BIOS(3)) /* rom page 15 3c000 */
- ROM_SYSTEM_BIOS( 3, "os10b1", "OS 1.00 / BASIC1" )
- ROMX_LOAD("os10.rom", 0x40000, 0x4000, CRC(9679b8f8) SHA1(d35f6723132aabe3c4d00fc16fd9ecc6768df753), ROM_BIOS(4)) /* os */
- ROMX_LOAD("basic1.rom", 0x3c000, 0x4000, CRC(b3364108) SHA1(890f6e3e7fab3340f75b85e93ff29332bc9ecb2e), ROM_BIOS(4)) /* rom page 15 3c000 */
-
- ROM_LOAD("ddfs223.rom", 0x38000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa))
-
- ROM_REGION(0x4000, "os", 0)
- ROM_COPY("option", 0x40000, 0, 0x4000)
-
- ROM_REGION(0x4000, "vsm", 0) /* system speech PHROM */
- ROM_LOAD("phroma.bin", 0x0000, 0x4000, CRC(98e1bf9e) SHA1(b369809275cb67dfd8a749265e91adb2d2558ae6))
ROM_END
@@ -2221,14 +2208,13 @@ ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/8271 FDC", MACHINE_IMPERFECT_GRAPHICS)
+COMP ( 1981, bbcb, 0, bbca, bbcb, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1981, bbca, bbcb, 0, bbca, bbca, bbc_state, bbc, "Acorn", "BBC Micro Model A", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1982, torchf, bbcb, 0, torchf, torch, bbc_state, bbc, "Torch Computers", "Torch CF240", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
COMP ( 1982, torchh10, bbcb, 0, torchh10, torch, bbc_state, bbc, "Torch Computers", "Torch CH240/10", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
COMP ( 1982, torchh21, bbcb, 0, torchh21, torch, bbc_state, bbc, "Torch Computers", "Torch CH240/21", MACHINE_IMPERFECT_KEYBOARD | MACHINE_NOT_WORKING)
COMP ( 1982, bbcb_de, bbcb, 0, bbcb_de, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (German)", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1983, bbcb_us, bbcb, 0, bbcb_us, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B (US)", MACHINE_IMPERFECT_GRAPHICS)
-COMP ( 1984, bbcb1770, bbcb, 0, bbcb1770, bbcb, bbc_state, bbc, "Acorn", "BBC Micro Model B w/1770 FDC", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, bbcbp, 0, bbcb, bbcbp, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 64K", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, bbcbp128, bbcbp, 0, bbcbp128, bbcbp, bbc_state, bbc, "Acorn", "BBC Micro Model B+ 128K", MACHINE_IMPERFECT_GRAPHICS)
COMP ( 1985, abc110, bbcbp, 0, abc110, abc, bbc_state, bbc, "Acorn", "ABC 110", MACHINE_NOT_WORKING)
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index dcf3e803b2e..e996a94cea6 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -30,6 +30,7 @@
#include "sound/tms5220.h"
#include "imagedev/cassette.h"
+#include "bus/bbc/fdc/fdc.h"
#include "bus/bbc/analogue/analogue.h"
#include "bus/bbc/1mhzbus/1mhzbus.h"
#include "bus/bbc/tube/tube.h"
@@ -78,6 +79,7 @@ public:
m_via6522_1(*this, "via6522_1"),
m_upd7002(*this, "upd7002"),
m_rtc(*this, "rtc"),
+ m_fdc(*this, "fdc"),
m_i8271(*this, "i8271"),
m_wd1770(*this, "wd1770"),
m_wd1772(*this, "wd1772"),
@@ -223,6 +225,7 @@ public: // HACK FOR MC6845
optional_device<via6522_device> m_via6522_1;
optional_device<upd7002_device> m_upd7002;
optional_device<mc146818_device> m_rtc;
+ optional_device<bbc_fdc_slot_device> m_fdc;
optional_device<i8271_device> m_i8271;
optional_device<wd1770_t> m_wd1770;
optional_device<wd1772_t> m_wd1772;
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index ccd76ebd434..b14e8d10793 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -2543,10 +2543,9 @@ abc110 // 1985 ABC 110
abc310 // 1985 ABC 310
acw443 // 1985 ABC 210/Cambridge Workstation
bbca // 1981 BBC Micro Model A
-bbcb // 1981 BBC Micro Model B w/8271 FDC
+bbcb // 1981 BBC Micro Model B
bbcb_de // 1982 BBC Micro Model B (German)
bbcb_us // 1983 BBC Micro Model B (US)
-bbcb1770 // 1984 BBC Micro Model B w/1770 FDC
bbcbp // 1985 BBC Micro Model B+ 64K
bbcbp128 // 1985 BBC Micro Model B+ 128K
bbcm // 1986 BBC Master 128