diff options
-rw-r--r-- | scripts/src/bus.lua | 21 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/acorn.cpp | 291 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/acorn.h | 95 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/cumana.cpp | 219 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/cumana.h | 81 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/fdc.cpp | 118 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/fdc.h | 89 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/opus.cpp | 246 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/opus.h | 86 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/watford.cpp | 246 | ||||
-rw-r--r-- | src/devices/bus/bbc/fdc/watford.h | 94 | ||||
-rw-r--r-- | src/mame/drivers/bbc.cpp | 150 | ||||
-rw-r--r-- | src/mame/includes/bbc.h | 3 | ||||
-rw-r--r-- | src/mame/mame.lst | 3 |
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 |