summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2018-09-17 17:18:50 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2018-09-17 17:20:44 +0100
commitf08d30e3ff2745c4c301aec87eb6b27886283275 (patch)
treee5398ba54a58c2cdef45352bf5c4cc2d8ad97a8e
parentc648fb91b1c57ad9a1b5785a02a6dbaea3dfc16f (diff)
bbc: Removed machine().device from bbc_fdc_slot_device and bbc_1mhzbus_slot_device, replaced with read/write handlers (nw)
- Removed MCFG and added devcb3 in 1mhzbus, analogue, fdc, joyport, tube, userport devices.
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp70
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.h58
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.cpp67
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.h6
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp22
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.h5
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.cpp93
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.h10
-rw-r--r--src/devices/bus/bbc/analogue/analogue.cpp28
-rw-r--r--src/devices/bus/bbc/analogue/analogue.h38
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.cpp2
-rw-r--r--src/devices/bus/bbc/analogue/joystick.cpp2
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp158
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h11
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp105
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h8
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp86
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h6
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp52
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h47
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp82
-rw-r--r--src/devices/bus/bbc/fdc/opus.h15
-rw-r--r--src/devices/bus/bbc/fdc/watford.cpp164
-rw-r--r--src/devices/bus/bbc/fdc/watford.h20
-rw-r--r--src/devices/bus/bbc/joyport/joyport.cpp12
-rw-r--r--src/devices/bus/bbc/joyport/joyport.h33
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp44
-rw-r--r--src/devices/bus/bbc/tube/tube.h38
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp21
-rw-r--r--src/devices/bus/bbc/tube/tube_65c102.cpp21
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.cpp29
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp22
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp29
-rw-r--r--src/devices/bus/bbc/userport/userport.h30
-rw-r--r--src/devices/bus/generic/slot.h12
-rw-r--r--src/devices/machine/i8271.cpp18
-rw-r--r--src/devices/machine/i8271.h2
-rw-r--r--src/devices/machine/tube.h27
-rw-r--r--src/mame/drivers/bbc.cpp744
-rw-r--r--src/mame/includes/bbc.h8
-rw-r--r--src/mame/machine/bbc.cpp73
41 files changed, 1223 insertions, 1095 deletions
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
index 6fa2407aae7..06458b4d748 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp
@@ -33,16 +33,6 @@ device_bbc_1mhzbus_interface::device_bbc_1mhzbus_interface(const machine_config
}
-//-------------------------------------------------
-// ~device_bbc_1mhzbus_interface - destructor
-//-------------------------------------------------
-
-device_bbc_1mhzbus_interface::~device_bbc_1mhzbus_interface()
-{
-}
-
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -62,15 +52,6 @@ bbc_1mhzbus_slot_device::bbc_1mhzbus_slot_device(const machine_config &mconfig,
//-------------------------------------------------
-// bbc_1mhzbus_slot_device - destructor
-//-------------------------------------------------
-
-bbc_1mhzbus_slot_device::~bbc_1mhzbus_slot_device()
-{
-}
-
-
-//-------------------------------------------------
// device_validity_check -
//-------------------------------------------------
@@ -107,10 +88,40 @@ void bbc_1mhzbus_slot_device::device_reset()
{
}
-WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w)
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+READ8_MEMBER(bbc_1mhzbus_slot_device::fred_r)
+{
+ if (m_card)
+ return m_card->fred_r(space, offset);
+ else
+ return 0xff;
+}
+
+READ8_MEMBER(bbc_1mhzbus_slot_device::jim_r)
+{
+ if (m_card)
+ return m_card->jim_r(space, offset);
+ else
+ return 0xff;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(bbc_1mhzbus_slot_device::fred_w)
+{
+ if (m_card)
+ m_card->fred_w(space, offset, data);
+}
+
+WRITE8_MEMBER(bbc_1mhzbus_slot_device::jim_w)
{
if (m_card)
- m_card->rst_w(state);
+ m_card->jim_w(space, offset, data);
}
//-------------------------------------------------
@@ -122,6 +133,7 @@ WRITE_LINE_MEMBER(bbc_1mhzbus_slot_device::rst_w)
//#include "teletext.h"
//#include "ieee488.h"
//#include "m5000.h"
+//#include "scsi.h"
//#include "multiform.h"
#include "opus3.h"
//#include "ramdisc.h"
@@ -135,15 +147,17 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
{
// device.option_add("teletext", BBC_TELETEXT); /* Acorn ANE01 Teletext Adapter */
// device.option_add("ieee488", BBC_IEEE488); /* Acorn ANK01 IEEE488 Interface */
-// device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
+ //device.option_add("m500", BBC_M500); /* Acorn ANV02 Music 500 */
+ //device.option_add("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */
+//..device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */
// device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 MIDI Interface */
-// device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
-// device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
-// device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
+ //device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
+ //device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
+ //device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */
-// device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */
-// device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
+ //device.option_add("ramdisc", BBC_RAMDISC); /* Morley Electronics RAM Disc */
+ //device.option_add("graduate", BBC_GRADUATE); /* The Torch Graduate G400/G800 */
device.option_add("beebsid", BBC_BEEBSID); /* BeebSID */
-// device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
+ //device.option_add("prisma3", BBC_PRISMA3); /* PRISMA-3 - Millipede 1989 */
device.option_add("cfa3000opt", CFA3000_OPT); /* Henson CFA 3000 Option Board */
}
diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.h b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
index 15e4721e556..c1229718494 100644
--- a/src/devices/bus/bbc/1mhzbus/1mhzbus.h
+++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.h
@@ -80,33 +80,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_1MHZBUS_SLOT_TAG "1mhzbus"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_1MHZBUS_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_1MHZBUS_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD() \
- MCFG_BBC_1MHZBUS_SLOT_ADD(BBC_1MHZBUS_SLOT_TAG, bbc_1mhzbus_devices, nullptr) \
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, irq_w)) \
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_1mhzbus_slot_device, nmi_w))
-
-#define MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(_devcb) \
- downcast<bbc_1mhzbus_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(_devcb) \
- downcast<bbc_1mhzbus_slot_device &>(*device).set_nmi_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -118,14 +91,27 @@ class bbc_1mhzbus_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_1mhzbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~bbc_1mhzbus_slot_device();
+ template <typename T>
+ bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_1mhzbus_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_1mhzbus_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
+ auto nmi_handler() { return m_nmi_handler.bind(); }
+
+ virtual DECLARE_READ8_MEMBER(fred_r);
+ virtual DECLARE_WRITE8_MEMBER(fred_w);
+ virtual DECLARE_READ8_MEMBER(jim_r);
+ virtual DECLARE_WRITE8_MEMBER(jim_w);
- DECLARE_WRITE_LINE_MEMBER( rst_w );
DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); }
DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); }
@@ -148,10 +134,10 @@ private:
class device_bbc_1mhzbus_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_1mhzbus_interface();
-
- virtual DECLARE_WRITE_LINE_MEMBER(rst_w) { }
+ virtual DECLARE_READ8_MEMBER(fred_r) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(fred_w) { }
+ virtual DECLARE_READ8_MEMBER(jim_r) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(jim_w) { }
protected:
device_bbc_1mhzbus_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.cpp b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
index c2e9509b658..1906914840b 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.cpp
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.cpp
@@ -13,13 +13,6 @@
//**************************************************************************
-// MACROS / CONSTANTS
-//**************************************************************************
-
-#define MOS8580_TAG "mos8580"
-
-
-//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@@ -30,13 +23,16 @@ DEFINE_DEVICE_TYPE(BBC_BEEBSID, bbc_beebsid_device, "beebsid", "BeebSID")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_beebsid_device::device_add_mconfig)
+void bbc_beebsid_device::device_add_mconfig(machine_config &config)
+{
SPEAKER(config, "speaker").front_center();
- MCFG_DEVICE_ADD(MOS8580_TAG, MOS8580, XTAL(16'000'000) / 16)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
+ MOS8580(config, m_sid, 16_MHz_XTAL / 16);
+ m_sid->add_route(ALL_OUTPUTS, "speaker", 1.0);
- MCFG_BBC_PASSTHRU_1MHZBUS_SLOT_ADD()
-MACHINE_CONFIG_END
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::irq_w));
+ m_1mhzbus->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_1mhzbus_slot_device::nmi_w));
+}
//**************************************************************************
@@ -50,7 +46,8 @@ MACHINE_CONFIG_END
bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_BEEBSID, tag, owner, clock),
device_bbc_1mhzbus_interface(mconfig, *this),
- m_sid(*this, MOS8580_TAG)
+ m_1mhzbus(*this, "1mhzbus"),
+ m_sid(*this, "mos8580")
{
}
@@ -61,7 +58,47 @@ bbc_beebsid_device::bbc_beebsid_device(const machine_config &mconfig, const char
void bbc_beebsid_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+READ8_MEMBER(bbc_beebsid_device::fred_r)
+{
+ uint8_t data = 0xff;
- space.install_readwrite_handler(0xfc20, 0xfc3f, read8_delegate(FUNC(mos8580_device::read), (mos8580_device*)m_sid), write8_delegate(FUNC(mos8580_device::write), (mos8580_device*)m_sid));
+ if (offset >= 0x20 && offset < 0x40)
+ {
+ data = m_sid->read(space, offset);
+ }
+
+ data &= m_1mhzbus->fred_r(space, offset);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_beebsid_device::fred_w)
+{
+ if (offset >= 0x20 && offset < 0x40)
+ {
+ m_sid->write(space, offset, data);
+ }
+
+ m_1mhzbus->fred_w(space, offset, data);
+}
+
+READ8_MEMBER(bbc_beebsid_device::jim_r)
+{
+ uint8_t data = 0xff;
+
+ data &= m_1mhzbus->jim_r(space, offset);
+
+ return data;
+}
+
+WRITE8_MEMBER(bbc_beebsid_device::jim_w)
+{
+ m_1mhzbus->jim_w(space, offset, data);
}
diff --git a/src/devices/bus/bbc/1mhzbus/beebsid.h b/src/devices/bus/bbc/1mhzbus/beebsid.h
index 30e20bf07d7..d78d5486c10 100644
--- a/src/devices/bus/bbc/1mhzbus/beebsid.h
+++ b/src/devices/bus/bbc/1mhzbus/beebsid.h
@@ -34,7 +34,13 @@ protected:
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+ virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual DECLARE_READ8_MEMBER(jim_r) override;
+ virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+
private:
+ required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
required_device<mos8580_device> m_sid;
};
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
index 63f2229b27a..0946d9cdf82 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp
@@ -91,26 +91,20 @@ cfa3000_opt_device::cfa3000_opt_device(const machine_config &mconfig, const char
void cfa3000_opt_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner());
-
- space.install_read_handler(0xfcc2, 0xfcc2, read8_delegate(FUNC(cfa3000_opt_device::option_r), this));
}
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void cfa3000_opt_device::device_reset()
-{
-}
-
//**************************************************************************
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(cfa3000_opt_device::option_r)
+READ8_MEMBER(cfa3000_opt_device::fred_r)
{
- return m_opt->read();
+ uint8_t data = 0xff;
+
+ if (offset == 0xc2)
+ {
+ data = m_opt->read();
+ }
+ return data;
}
diff --git a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
index e372a14b51b..5a4e413754b 100644
--- a/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
+++ b/src/devices/bus/bbc/1mhzbus/cfa3000opt.h
@@ -28,16 +28,15 @@ public:
// construction/destruction
cfa3000_opt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(option_r);
-
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
// optional information overrides
virtual ioport_constructor device_input_ports() const override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+
private:
required_ioport m_opt;
};
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.cpp b/src/devices/bus/bbc/1mhzbus/opus3.cpp
index ed204430bbe..0b39d5993ff 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.cpp
+++ b/src/devices/bus/bbc/1mhzbus/opus3.cpp
@@ -70,11 +70,11 @@ ROM_START( opus3 )
ROM_REGION(0x4000, "dfs_rom", 0)
ROM_DEFAULT_BIOS("ch103")
ROM_SYSTEM_BIOS(0, "ch100", "Challenger 1.00")
- ROMX_LOAD("ch100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0))
+ ROMX_LOAD("chal100.rom", 0x0000, 0x4000, CRC(740a8335) SHA1(f3c75c21bcd7d4a4dfff922fd287230dcdb91d0e), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "ch101", "Challenger 1.01")
- ROMX_LOAD("ch101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1))
+ ROMX_LOAD("chal101.rom", 0x0000, 0x4000, CRC(2f64503d) SHA1(37ee3f20bed50555720703b279f62aab0ed28922), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "ch103", "Challenger 1.03")
- ROMX_LOAD("ch103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2))
+ ROMX_LOAD("chal103.rom", 0x0000, 0x4000, CRC(98367cf4) SHA1(eca3631aa420691f96b72bfdf2e9c2b613e1bf33), ROM_BIOS(2))
ROM_END
//-------------------------------------------------
@@ -86,8 +86,9 @@ void bbc_opus3_device::device_add_mconfig(machine_config &config)
/* fdc */
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(bbc_opus3_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies, "525qd", floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, "525qd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies, nullptr, floppy_formats).enable_sound(true);
/* ram disk */
RAM(config, m_ramdisk).set_default_size("512K").set_extra_options("256K").set_default_value(0);
@@ -113,7 +114,8 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta
m_ramdisk(*this, "ramdisk"),
m_fdc(*this, "wd1770"),
m_floppy0(*this, "wd1770:0"),
- m_floppy1(*this, "wd1770:1")
+ m_floppy1(*this, "wd1770:1"),
+ m_ramdisk_page(0)
{
}
@@ -123,13 +125,6 @@ bbc_opus3_device::bbc_opus3_device(const machine_config &mconfig, const char *ta
void bbc_opus3_device::device_start()
{
- address_space& space = machine().device("maincpu")->memory().space(AS_PROGRAM);
- m_slot = dynamic_cast<bbc_1mhzbus_slot_device *>(owner());
-
- space.install_readwrite_handler(0xfcf8, 0xfcfb, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target()));
- space.install_write_handler(0xfcfc, 0xfcfc, WRITE8_DELEGATE(bbc_opus3_device, wd1770l_write));
- space.install_write_handler(0xfcfe, 0xfcff, WRITE8_DELEGATE(bbc_opus3_device, page_w));
- space.install_readwrite_handler(0xfd00, 0xfdff, READ8_DELEGATE(bbc_opus3_device, ramdisk_r), WRITE8_DELEGATE(bbc_opus3_device, ramdisk_w));
}
//-------------------------------------------------
@@ -146,24 +141,57 @@ void bbc_opus3_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-WRITE8_MEMBER(bbc_opus3_device::wd1770l_write)
+READ8_MEMBER(bbc_opus3_device::fred_r)
{
- floppy_image_device *floppy = nullptr;
+ uint8_t data = 0xff;
- // bit 1, 2: drive select
- if (BIT(data, 1)) floppy = m_floppy0->get_device();
- if (BIT(data, 2)) floppy = m_floppy1->get_device();
- m_fdc->set_floppy(floppy);
-
- // bit 0: side select
- if (floppy)
- floppy->ss_w(BIT(data, 0));
+ switch (offset)
+ {
+ case 0xf8:
+ case 0xf9:
+ case 0xfa:
+ case 0xfb:
+ data = m_fdc->read(offset & 0x03);
+ break;
+ }
+ return data;
+}
- // bit 4: interrupt enabled
- m_fdc_ie = BIT(data, 4);
+WRITE8_MEMBER(bbc_opus3_device::fred_w)
+{
+ floppy_image_device *floppy = nullptr;
- // bit 5: density
- m_fdc->dden_w(BIT(data, 5));
+ switch (offset)
+ {
+ case 0xf8:
+ case 0xf9:
+ case 0xfa:
+ case 0xfb:
+ m_fdc->write(offset & 0x03, data);
+ break;
+ case 0xfc:
+ // bit 1, 2: drive select
+ if (BIT(data, 1)) floppy = m_floppy0->get_device();
+ if (BIT(data, 2)) floppy = m_floppy1->get_device();
+ m_fdc->set_floppy(floppy);
+
+ // bit 0: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 0));
+
+ // bit 4: interrupt enabled
+ m_fdc_ie = BIT(data, 4);
+
+ // bit 5: density
+ m_fdc->dden_w(BIT(data, 5));
+ break;
+ case 0xfe:
+ m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8);
+ break;
+ case 0xff:
+ m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0);
+ break;
+ }
}
WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w)
@@ -173,16 +201,7 @@ WRITE_LINE_MEMBER(bbc_opus3_device::fdc_drq_w)
m_slot->nmi_w((m_fdc_drq && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE8_MEMBER(bbc_opus3_device::page_w)
-{
- switch (offset)
- {
- case 0x00: m_ramdisk_page = (m_ramdisk_page & 0x00ff) | (data << 8); break;
- case 0x01: m_ramdisk_page = (m_ramdisk_page & 0xff00) | (data << 0); break;
- }
-}
-
-READ8_MEMBER(bbc_opus3_device::ramdisk_r)
+READ8_MEMBER(bbc_opus3_device::jim_r)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
return m_ramdisk->read((m_ramdisk_page << 8) + offset);
@@ -190,7 +209,7 @@ READ8_MEMBER(bbc_opus3_device::ramdisk_r)
return 0xff;
}
-WRITE8_MEMBER(bbc_opus3_device::ramdisk_w)
+WRITE8_MEMBER(bbc_opus3_device::jim_w)
{
if ((m_ramdisk_page << 8) < m_ramdisk->size())
m_ramdisk->write((m_ramdisk_page << 8) + offset, data);
diff --git a/src/devices/bus/bbc/1mhzbus/opus3.h b/src/devices/bus/bbc/1mhzbus/opus3.h
index 826906a584f..1e3e1a4065d 100644
--- a/src/devices/bus/bbc/1mhzbus/opus3.h
+++ b/src/devices/bus/bbc/1mhzbus/opus3.h
@@ -28,11 +28,6 @@ public:
// construction/destruction
bbc_opus3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_WRITE8_MEMBER(wd1770l_write);
- DECLARE_WRITE8_MEMBER(page_w);
- DECLARE_READ8_MEMBER(ramdisk_r);
- DECLARE_WRITE8_MEMBER(ramdisk_w);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -42,6 +37,11 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(fred_r) override;
+ virtual DECLARE_WRITE8_MEMBER(fred_w) override;
+ virtual DECLARE_READ8_MEMBER(jim_r) override;
+ virtual DECLARE_WRITE8_MEMBER(jim_w) override;
+
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
diff --git a/src/devices/bus/bbc/analogue/analogue.cpp b/src/devices/bus/bbc/analogue/analogue.cpp
index 226bc69bf0f..44a3156f11c 100644
--- a/src/devices/bus/bbc/analogue/analogue.cpp
+++ b/src/devices/bus/bbc/analogue/analogue.cpp
@@ -33,15 +33,6 @@ device_bbc_analogue_interface::device_bbc_analogue_interface(const machine_confi
}
-//-------------------------------------------------
-// ~device_bbc_analogue_interface - destructor
-//-------------------------------------------------
-
-device_bbc_analogue_interface::~device_bbc_analogue_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -52,7 +43,9 @@ device_bbc_analogue_interface::~device_bbc_analogue_interface()
bbc_analogue_slot_device::bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, BBC_ANALOGUE_SLOT, tag, owner, clock),
- device_slot_interface(mconfig, *this)
+ device_slot_interface(mconfig, *this),
+ m_card(nullptr),
+ m_lpstb_handler(*this)
{
}
@@ -71,8 +64,12 @@ void bbc_analogue_slot_device::device_validity_check(validity_checker &valid) co
void bbc_analogue_slot_device::device_start()
{
device_t *const carddev = get_card_device();
- if (carddev && !dynamic_cast<device_bbc_analogue_interface *>(carddev))
+ m_card = dynamic_cast<device_bbc_analogue_interface *>(get_card_device());
+ if (carddev && !m_card)
osd_printf_error("Card device %s (%s) does not implement device_bbc_analogue_interface\n", carddev->tag(), carddev->name());
+
+ // resolve callbacks
+ m_lpstb_handler.resolve_safe();
}
uint8_t bbc_analogue_slot_device::ch_r(int channel)
@@ -107,6 +104,9 @@ void bbc_analogue_slot_device::device_reset()
// slot devices
#include "joystick.h"
+//#include "bitstik.h"
+//#include "lightpen.h"
+//#include "micromike.h"
//#include "quinkey.h"
#include "cfa3000a.h"
@@ -114,7 +114,11 @@ void bbc_analogue_slot_device::device_reset()
void bbc_analogue_devices(device_slot_interface &device)
{
device.option_add("acornjoy", BBC_ACORNJOY); /* Acorn ANH01 Joysticks */
+ //device.option_add("bitstik1", BBC_BITSTIK1); /* Acorn ANF04 Bitstik */
+ //device.option_add("bitstik2", BBC_BITSTIK2); /* Robocom Bitstik 2 */
+ //device.option_add("lightpen", BBC_LIGHTPEN); /* RH Electronics Lightpen */
+ //device.option_add("micromike", BBC_MICROMIKE); /* Micro Mike */
device.option_add("voltmace3b", BBC_VOLTMACE3B); /* Voltmace Delta 3b "Twin" Joysticks */
-// device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */
+ //device.option_add("quinkey", BBC_QUINKEY); /* Microwriter Quinkey */
device.option_add("cfa3000a", CFA3000_ANLG); /* Hanson CFA 3000 Analogue */
}
diff --git a/src/devices/bus/bbc/analogue/analogue.h b/src/devices/bus/bbc/analogue/analogue.h
index 6e9cc8a9eae..d8aec89e012 100644
--- a/src/devices/bus/bbc/analogue/analogue.h
+++ b/src/devices/bus/bbc/analogue/analogue.h
@@ -34,21 +34,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_ANALOGUE_SLOT_TAG "analogue"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_ANALOGUE_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_ANALOGUE_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -60,7 +45,22 @@ class bbc_analogue_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_analogue_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_analogue_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_analogue_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
+
+ // callbacks
+ auto lpstb_handler() { return m_lpstb_handler.bind(); }
+
+ DECLARE_WRITE_LINE_MEMBER(lpstb_w) { m_lpstb_handler(state); }
uint8_t ch_r(int channel);
uint8_t pb_r();
@@ -72,6 +72,9 @@ protected:
virtual void device_reset() override;
device_bbc_analogue_interface *m_card;
+
+private:
+ devcb_write_line m_lpstb_handler;
};
@@ -80,9 +83,6 @@ protected:
class device_bbc_analogue_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_analogue_interface();
-
virtual uint8_t ch_r(int channel) { return 0x00; };
virtual uint8_t pb_r() { return 0x30; };
diff --git a/src/devices/bus/bbc/analogue/cfa3000a.cpp b/src/devices/bus/bbc/analogue/cfa3000a.cpp
index da163200c2c..0dfd692df12 100644
--- a/src/devices/bus/bbc/analogue/cfa3000a.cpp
+++ b/src/devices/bus/bbc/analogue/cfa3000a.cpp
@@ -96,5 +96,5 @@ uint8_t cfa3000_anlg_device::ch_r(int channel)
uint8_t cfa3000_anlg_device::pb_r()
{
- return m_buttons->read();
+ return m_buttons->read() & 0x30;
}
diff --git a/src/devices/bus/bbc/analogue/joystick.cpp b/src/devices/bus/bbc/analogue/joystick.cpp
index e67abff9e22..a6e37ebb3ba 100644
--- a/src/devices/bus/bbc/analogue/joystick.cpp
+++ b/src/devices/bus/bbc/analogue/joystick.cpp
@@ -130,5 +130,5 @@ uint8_t bbc_joystick_device::ch_r(int channel)
uint8_t bbc_joystick_device::pb_r()
{
- return m_buttons->read();
+ return m_buttons->read() & 0x30;
}
diff --git a/src/devices/bus/bbc/fdc/acorn.cpp b/src/devices/bus/bbc/fdc/acorn.cpp
index 21d4f710637..e2ae28fdf0c 100644
--- a/src/devices/bus/bbc/fdc/acorn.cpp
+++ b/src/devices/bus/bbc/fdc/acorn.cpp
@@ -100,15 +100,15 @@ ROM_START( acorn1770 )
ROM_DEFAULT_BIOS("dfs223")
// Acorn
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(0))
+ ROMX_LOAD("dfs v2.10,acorn.rom", 0x0000, 0x4000, CRC(4f828787) SHA1(112a315e1598cb4db2abcfe9d89fcd97444b276d), ROM_BIOS(0))
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(1))
+ ROMX_LOAD("dfs v2.20,acorn.rom", 0x0000, 0x4000, CRC(2844001e) SHA1(d72f11af35756ac648095ba1992211cf6741dd80), ROM_BIOS(1))
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(2))
+ ROMX_LOAD("dfs v2.23,acorn.rom", 0x0000, 0x4000, CRC(7891f9b7) SHA1(0d7ed0b0b3852cb61970ada1993244f2896896aa), ROM_BIOS(2))
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(3))
+ ROMX_LOAD("dfs v2.25,acorn.rom", 0x0000, 0x4000, CRC(f855a75b) SHA1(f11271748e6303c60182955e5fa478624b616fcf), ROM_BIOS(3))
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(4))
+ ROMX_LOAD("dfs v2.26,acorn.rom", 0x0000, 0x4000, CRC(5ae33e94) SHA1(cf2ebc422a8d24ec6f1a0320520c38a0e704109a), ROM_BIOS(4))
// Advanced Computer Products
ROM_SYSTEM_BIOS(5, "acp108", "Advanced 1770 DFS 1.08")
ROMX_LOAD("advanced 1770 dfs 1.08,acp.rom", 0x0000, 0x4000, CRC(eb0eaa34) SHA1(d16ba3c8ed5e5ab6af62aad13a8e567b1c3639c2), ROM_BIOS(5))
@@ -121,21 +121,23 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-void bbc_acorn8271_device::device_add_mconfig(machine_config & config)
+void bbc_acorn8271_device::device_add_mconfig(machine_config &config)
{
- I8271(config, m_fdc, 0);
+ I8271(config, m_fdc, 16_MHz_XTAL / 8);
m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn8271_device::fdc_intrq_w));
m_fdc->hdl_wr_callback().set(FUNC(bbc_acorn8271_device::motor_w));
m_fdc->opt_wr_callback().set(FUNC(bbc_acorn8271_device::side_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
}
-void bbc_acorn1770_device::device_add_mconfig(machine_config & config)
+void bbc_acorn1770_device::device_add_mconfig(machine_config &config)
{
- WD1770(config, m_fdc, XTAL(16'000'000) / 2);
+ WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_acorn1770_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_acorn8271_device::floppy_formats).enable_sound(true);
}
@@ -160,22 +162,23 @@ const tiny_rom_entry *bbc_acorn1770_device::device_rom_region() const
//-------------------------------------------------
bbc_acorn8271_device::bbc_acorn8271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BBC_ACORN8271, tag, owner, clock),
- 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")
+ : device_t(mconfig, BBC_ACORN8271, tag, owner, clock)
+ , 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_t clock)
- : device_t(mconfig, BBC_ACORN1770, tag, owner, clock),
- 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_t(mconfig, BBC_ACORN1770, tag, owner, clock)
+ , 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")
+ , m_drive_control(0)
{
}
@@ -186,24 +189,11 @@ bbc_acorn1770_device::bbc_acorn1770_device(const machine_config &mconfig, const
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, read8sm_delegate(FUNC(wd1770_device::read), m_fdc.target()), write8sm_delegate(FUNC(wd1770_device::write), m_fdc.target()));
-
- m_drive_control = 0xfe;
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -213,13 +203,13 @@ void bbc_acorn1770_device::device_start()
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());
+
+ m_drive_control = 0xfe;
}
@@ -227,10 +217,38 @@ void bbc_acorn1770_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
+READ8_MEMBER(bbc_acorn8271_device::read)
+{
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->data_r(space , 0);
+ }
+ else
+ {
+ data = m_fdc->read(space, offset & 0x03);
+ }
+ return data;
+}
+
+WRITE8_MEMBER(bbc_acorn8271_device::write)
+{
+ if (offset & 0x04)
+ {
+ m_fdc->data_w(space, 0, data);
+ }
+ else
+ {
+ m_fdc->write(space, offset & 0x03, data);
+ }
+}
+
WRITE_LINE_MEMBER(bbc_acorn8271_device::motor_w)
{
if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
+ m_fdc->ready_w(!state);
}
WRITE_LINE_MEMBER(bbc_acorn8271_device::side_w)
@@ -245,39 +263,59 @@ WRITE_LINE_MEMBER(bbc_acorn8271_device::fdc_intrq_w)
}
-READ8_MEMBER(bbc_acorn1770_device::wd1770l_read)
+READ8_MEMBER(bbc_acorn1770_device::read)
{
- return m_drive_control;
+ uint8_t data = 0xff;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_acorn1770_device::wd1770l_write)
+WRITE8_MEMBER(bbc_acorn1770_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 0, 1: drive select
- if (BIT(data, 0)) floppy = m_floppy0->get_device();
- if (BIT(data, 1)) floppy = m_floppy1->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();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->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 4: interrupt enabled
+ m_fdc_ie = !BIT(data, 4);
+
+ // 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);
+ m_slot->intrq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
WRITE_LINE_MEMBER(bbc_acorn1770_device::fdc_drq_w)
{
- m_slot->drq_w(state);
+ m_slot->drq_w((state && m_fdc_ie) ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/devices/bus/bbc/fdc/acorn.h b/src/devices/bus/bbc/fdc/acorn.h
index 85323e1fb6a..4e2993f1016 100644
--- a/src/devices/bus/bbc/fdc/acorn.h
+++ b/src/devices/bus/bbc/fdc/acorn.h
@@ -25,7 +25,6 @@
class bbc_acorn8271_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -42,6 +41,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
@@ -56,7 +58,6 @@ private:
class bbc_acorn1770_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -71,9 +72,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
- DECLARE_READ8_MEMBER(wd1770l_read);
- DECLARE_WRITE8_MEMBER(wd1770l_write);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
@@ -83,6 +85,7 @@ private:
optional_device<floppy_connector> m_floppy1;
int m_drive_control;
+ int m_fdc_ie;
};
diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp
index 5639fef1976..4de4c9df704 100644
--- a/src/devices/bus/bbc/fdc/cumana.cpp
+++ b/src/devices/bus/bbc/fdc/cumana.cpp
@@ -65,6 +65,7 @@ void bbc_cumana1_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -75,6 +76,7 @@ void bbc_cumana2_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -104,7 +106,8 @@ bbc_cumanafdc_device::bbc_cumanafdc_device(const machine_config &mconfig, device
m_fdc(*this, "mb8877a"),
m_floppy0(*this, "mb8877a:0"),
m_floppy1(*this, "mb8877a:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -127,12 +130,7 @@ bbc_cumana2_device::bbc_cumana2_device(const machine_config &mconfig, const char
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, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -142,8 +140,6 @@ void bbc_cumanafdc_device::device_start()
void bbc_cumanafdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -151,47 +147,66 @@ void bbc_cumanafdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cumanafdc_device::ctrl_r)
+READ8_MEMBER(bbc_cumanafdc_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_cumanafdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_cumanafdc_device::write)
{
- 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)
+ if (offset & 0x04)
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(!BIT(data, 1));
-
- // bit 2: density
- m_fdc->dden_w(!BIT(data, 2));
+ m_fdc->write(offset & 0x03, data);
}
else
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ floppy_image_device *floppy = nullptr;
- // bit 2: density
- m_fdc->dden_w(BIT(data, 2));
- }
- // bit 3: reset
- if (BIT(data, 3)) m_fdc->soft_reset();
+ m_drive_control = data;
+
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ 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 4: interrupt enable
- m_fdc_ie = BIT(data, 4);
+ // 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)
@@ -208,12 +223,6 @@ WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_drq_w)
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);
- }
- }
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
}
diff --git a/src/devices/bus/bbc/fdc/cumana.h b/src/devices/bus/bbc/fdc/cumana.h
index 9b0c90c0630..71048da3b1a 100644
--- a/src/devices/bus/bbc/fdc/cumana.h
+++ b/src/devices/bus/bbc/fdc/cumana.h
@@ -23,7 +23,6 @@
class bbc_cumanafdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
DECLARE_FLOPPY_FORMATS(floppy_formats);
@@ -31,8 +30,6 @@ public:
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:
// construction/destruction
@@ -42,12 +39,15 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- bool m_invert;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
required_device<mb8877_device> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
+ bool m_invert;
+
private:
required_memory_region m_dfs_rom;
diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp
index d1baf8204d9..689d9a23777 100644
--- a/src/devices/bus/bbc/fdc/cv1797.cpp
+++ b/src/devices/bus/bbc/fdc/cv1797.cpp
@@ -58,6 +58,7 @@ void bbc_cv1797_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cv1797_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -76,12 +77,13 @@ const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const
//-------------------------------------------------
bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BBC_CV1797, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "fd1797"),
- m_floppy0(*this, "fd1797:0"),
- m_floppy1(*this, "fd1797:1")
+ : device_t(mconfig, BBC_CV1797, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "fd1797")
+ , m_floppy0(*this, "fd1797:0")
+ , m_floppy1(*this, "fd1797:1")
+ , m_drive_control(0)
{
}
@@ -91,12 +93,7 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
void bbc_cv1797_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, 0xfe80, read8sm_delegate(FUNC(fd1797_device::read), m_fdc.target()), write8sm_delegate(FUNC(fd1797_device::write), m_fdc.target()));
- space.install_readwrite_handler(0xfe84, 0xfe9f, read8_delegate(FUNC(bbc_cv1797_device::fd1797l_read), this), write8_delegate(FUNC(bbc_cv1797_device::fd1797l_write), this));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -106,8 +103,6 @@ void bbc_cv1797_device::device_start()
void bbc_cv1797_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -115,32 +110,51 @@ void bbc_cv1797_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cv1797_device::fd1797l_read)
+READ8_MEMBER(bbc_cv1797_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_cv1797_device::fd1797l_write)
+WRITE8_MEMBER(bbc_cv1797_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
- logerror("fdc: Drive control %02x\n", data);
- // bit 0: drive select
- floppy_image_device *floppy0 = m_floppy0->get_device();
- floppy_image_device *floppy1 = m_floppy1->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 2: density
- m_fdc->dden_w(BIT(data, 2));
-
- // bit 6: reset
- //if (BIT(data, 6)) m_fdc->soft_reset();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+ logerror("fdc: Drive control %02x\n", data);
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
+
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(!BIT(data, 2));
+
+ // bit 6: reset
+ //if (BIT(data, 6)) m_fdc->soft_reset();
+ }
}
WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_intrq_w)
diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h
index b03385810f2..b6a2f3c9a44 100644
--- a/src/devices/bus/bbc/fdc/cv1797.h
+++ b/src/devices/bus/bbc/fdc/cv1797.h
@@ -24,7 +24,6 @@
class bbc_cv1797_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
static constexpr feature_type imperfect_features() { return feature::DISK; }
@@ -41,11 +40,12 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_READ8_MEMBER(fd1797l_read);
- DECLARE_WRITE8_MEMBER(fd1797l_write);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
DECLARE_WRITE_LINE_MEMBER(motor_w);
diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp
index 5db09a3903e..d3588ea9f6f 100644
--- a/src/devices/bus/bbc/fdc/fdc.cpp
+++ b/src/devices/bus/bbc/fdc/fdc.cpp
@@ -32,15 +32,6 @@ device_bbc_fdc_interface::device_bbc_fdc_interface(const machine_config &mconfig
}
-//-------------------------------------------------
-// ~device_bbc_fdc_interface - destructor
-//-------------------------------------------------
-
-device_bbc_fdc_interface::~device_bbc_fdc_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -53,17 +44,8 @@ bbc_fdc_slot_device::bbc_fdc_slot_device(const machine_config &mconfig, const ch
device_t(mconfig, BBC_FDC_SLOT, tag, owner, clock),
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()
+ m_intrq_cb(*this),
+ m_drq_cb(*this)
{
}
@@ -86,12 +68,13 @@ void bbc_fdc_slot_device::device_validity_check(validity_checker &valid) const
void bbc_fdc_slot_device::device_start()
{
device_t *const carddev = get_card_device();
- if (carddev && !dynamic_cast<device_bbc_fdc_interface *>(carddev))
+ m_card = dynamic_cast<device_bbc_fdc_interface *>(get_card_device());
+ if (carddev && !m_card)
osd_printf_error("Card device %s (%s) does not implement device_bbc_fdc_interface\n", carddev->tag(), carddev->name());
// resolve callbacks
- m_intrq_handler.resolve_safe();
- m_drq_handler.resolve_safe();
+ m_intrq_cb.resolve_safe();
+ m_drq_cb.resolve_safe();
}
//-------------------------------------------------
@@ -102,6 +85,27 @@ void bbc_fdc_slot_device::device_reset()
{
}
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+READ8_MEMBER(bbc_fdc_slot_device::read)
+{
+ if (m_card)
+ return m_card->read(space, offset);
+ else
+ return 0xff;
+}
+
+//-------------------------------------------------
+// write
+//-------------------------------------------------
+
+WRITE8_MEMBER(bbc_fdc_slot_device::write)
+{
+ if (m_card)
+ m_card->write(space, offset, data);
+}
//-------------------------------------------------
// SLOT_INTERFACE( bbc_fdc_devices )
@@ -110,6 +114,7 @@ void bbc_fdc_slot_device::device_reset()
// slot devices
#include "acorn.h"
+//#include "ams.h"
#include "cumana.h"
#include "cv1797.h"
//#include "microware.h"
@@ -123,6 +128,7 @@ void bbc_fdc_devices(device_slot_interface &device)
{
device.option_add("acorn8271", BBC_ACORN8271);
device.option_add("acorn1770", BBC_ACORN1770);
+ //device.option_add("ams3", BBC_AMS3);
device.option_add("cumana1", BBC_CUMANA1);
device.option_add("cumana2", BBC_CUMANA2);
device.option_add("cv1797", BBC_CV1797);
diff --git a/src/devices/bus/bbc/fdc/fdc.h b/src/devices/bus/bbc/fdc/fdc.h
index 892db41fe1d..2b61b881e1a 100644
--- a/src/devices/bus/bbc/fdc/fdc.h
+++ b/src/devices/bus/bbc/fdc/fdc.h
@@ -14,21 +14,6 @@
//**************************************************************************
-// 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) \
- downcast<bbc_fdc_slot_device &>(*device).set_intrq_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_FDC_SLOT_DRQ_HANDLER(_devcb) \
- downcast<bbc_fdc_slot_device &>(*device).set_drq_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -40,15 +25,27 @@ 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_t clock);
- virtual ~bbc_fdc_slot_device();
+ template <typename T>
+ bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_fdc_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_fdc_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_intrq_handler(Object &&cb) { return m_intrq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
+ auto intrq_wr_callback() { return m_intrq_cb.bind(); }
+ auto drq_wr_callback() { return m_drq_cb.bind(); }
- DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_handler(state); }
- DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_handler(state); }
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_WRITE_LINE_MEMBER( intrq_w ) { m_intrq_cb(state); }
+ DECLARE_WRITE_LINE_MEMBER( drq_w) { m_drq_cb(state); }
protected:
// device-level overrides
@@ -59,8 +56,8 @@ protected:
device_bbc_fdc_interface *m_card;
private:
- devcb_write_line m_intrq_handler;
- devcb_write_line m_drq_handler;
+ devcb_write_line m_intrq_cb;
+ devcb_write_line m_drq_cb;
};
@@ -69,8 +66,8 @@ private:
class device_bbc_fdc_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_fdc_interface();
+ virtual DECLARE_READ8_MEMBER(read) { return 0xff; }
+ virtual DECLARE_WRITE8_MEMBER(write) { }
protected:
device_bbc_fdc_interface(const machine_config &mconfig, device_t &device);
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
index c336cd71a24..85eb8f5e7e9 100644
--- a/src/devices/bus/bbc/fdc/opus.cpp
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -94,6 +94,7 @@ void bbc_opus8272_device::device_add_mconfig(machine_config &config)
I8272A(config, m_fdc, 0);
m_fdc->set_ready_line_connected(true);
m_fdc->intrq_wr_callback().set(FUNC(bbc_opus8272_device::fdc_intrq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -103,6 +104,7 @@ void bbc_opus2791_device::device_add_mconfig(machine_config &config)
WD2791(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -112,6 +114,7 @@ void bbc_opus2793_device::device_add_mconfig(machine_config &config)
WD2793(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -120,6 +123,7 @@ void bbc_opus1770_device::device_add_mconfig(machine_config &config)
{
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -169,7 +173,8 @@ bbc_opusfdc_device::bbc_opusfdc_device(const machine_config &mconfig, device_typ
m_fdc(*this, "fdc"),
m_floppy0(*this, "fdc:0"),
m_floppy1(*this, "fdc:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -194,21 +199,11 @@ bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const ch
void bbc_opus8272_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, 0xfe86, READ8_DELEGATE(bbc_opus8272_device, fdc_r), WRITE8_DELEGATE(bbc_opus8272_device, fdc_w));
}
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, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
- space.install_readwrite_handler(0xfe84, 0xfe84, READ8_DELEGATE(bbc_opusfdc_device, ctrl_r), WRITE8_DELEGATE(bbc_opusfdc_device, ctrl_w));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -218,15 +213,11 @@ void bbc_opusfdc_device::device_start()
void bbc_opus8272_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
void bbc_opusfdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -234,11 +225,11 @@ void bbc_opusfdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_opus8272_device::fdc_r)
+READ8_MEMBER(bbc_opus8272_device::read)
{
uint8_t data = 0xff;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x02:
m_fdc->tc_w(true);
@@ -262,11 +253,11 @@ READ8_MEMBER(bbc_opus8272_device::fdc_r)
return data;
}
-WRITE8_MEMBER(bbc_opus8272_device::fdc_w)
+WRITE8_MEMBER(bbc_opus8272_device::write)
{
floppy_image_device *floppy = nullptr;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x01:
switch (data & 0x01)
@@ -292,31 +283,48 @@ WRITE_LINE_MEMBER(bbc_opus8272_device::fdc_intrq_w)
}
-READ8_MEMBER(bbc_opusfdc_device::ctrl_r)
+READ8_MEMBER(bbc_opusfdc_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_drive_control;
+ }
+ else
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_opusfdc_device::write)
{
- floppy_image_device *floppy = nullptr;
+ if (offset & 0x04)
+ {
+ floppy_image_device *floppy = nullptr;
- m_drive_control = data;
+ m_drive_control = data;
- // bit 0: drive select
- switch (BIT(data, 0))
- {
- case 0: floppy = m_floppy0->get_device(); break;
- case 1: floppy = m_floppy1->get_device(); break;
- }
- m_fdc->set_floppy(floppy);
+ // bit 0: drive select
+ switch (BIT(data, 0))
+ {
+ case 0: floppy = m_floppy0->get_device(); break;
+ case 1: floppy = m_floppy1->get_device(); break;
+ }
+ m_fdc->set_floppy(floppy);
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
- // bit 6: density
- m_fdc->dden_w(!BIT(data, 6));
+ // bit 6: density
+ m_fdc->dden_w(!BIT(data, 6));
+ }
+ else
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
}
WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)
diff --git a/src/devices/bus/bbc/fdc/opus.h b/src/devices/bus/bbc/fdc/opus.h
index 64ed0c61fe6..86af3dfe370 100644
--- a/src/devices/bus/bbc/fdc/opus.h
+++ b/src/devices/bus/bbc/fdc/opus.h
@@ -22,7 +22,6 @@
class bbc_opus8272_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
// construction/destruction
@@ -37,9 +36,10 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
- DECLARE_READ8_MEMBER(fdc_r);
- DECLARE_WRITE8_MEMBER(fdc_w);
DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
required_memory_region m_dfs_rom;
@@ -49,19 +49,15 @@ private:
};
-class bbc_opusfdc_device:
+class bbc_opusfdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
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:
// construction/destruction
@@ -71,6 +67,9 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
required_device<wd_fdc_device_base> m_fdc;
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
diff --git a/src/devices/bus/bbc/fdc/watford.cpp b/src/devices/bus/bbc/fdc/watford.cpp
index 10c56e9cfce..be7f17dea80 100644
--- a/src/devices/bus/bbc/fdc/watford.cpp
+++ b/src/devices/bus/bbc/fdc/watford.cpp
@@ -70,6 +70,7 @@ void bbc_weddb2_device::device_add_mconfig(machine_config &config)
WD1772(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_weddb2_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -79,6 +80,7 @@ void bbc_weddb3_device::device_add_mconfig(machine_config &config)
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->intrq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_weddb3_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
@@ -102,27 +104,29 @@ const tiny_rom_entry *bbc_weddb3_device::device_rom_region() const
// bbc_watfordfdc_device - constructor
//-------------------------------------------------
-bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, type, tag, owner, clock),
- device_bbc_fdc_interface(mconfig, *this)
+bbc_watfordfdc_device::bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_bbc_fdc_interface(mconfig, *this)
{
}
bbc_weddb2_device::bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "wd1772"),
- m_floppy0(*this, "wd1772:0"),
- m_floppy1(*this, "wd1772:1")
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB2, tag, owner, clock)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd1772")
+ , m_floppy0(*this, "wd1772:0")
+ , m_floppy1(*this, "wd1772:1")
+ , m_drive_control(0)
{
}
bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock),
- m_dfs_rom(*this, "dfs_rom"),
- m_fdc(*this, "wd1770"),
- m_floppy0(*this, "wd1770:0"),
- m_floppy1(*this, "wd1770:1")
+ : bbc_watfordfdc_device(mconfig, BBC_WEDDB3, tag, owner, clock)
+ , m_dfs_rom(*this, "dfs_rom")
+ , m_fdc(*this, "wd1770")
+ , m_floppy0(*this, "wd1770:0")
+ , m_floppy1(*this, "wd1770:1")
+ , m_drive_control(0)
{
}
@@ -132,22 +136,12 @@ bbc_weddb3_device::bbc_weddb3_device(const machine_config &mconfig, const char *
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(FUNC(bbc_weddb2_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb2_device::wd177xl_write), this));
- space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
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(FUNC(bbc_weddb3_device::wd177xl_read), this), write8_delegate(FUNC(bbc_weddb3_device::wd177xl_write), this));
- space.install_readwrite_handler(0xfe84, 0xfe8f, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -169,59 +163,93 @@ void bbc_weddb3_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_weddb2_device::wd177xl_read)
+READ8_MEMBER(bbc_weddb2_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_weddb2_device::wd177xl_write)
+WRITE8_MEMBER(bbc_weddb2_device::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();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 2: drive select
+ floppy_image_device *floppy0 = m_floppy0->get_device();
+ floppy_image_device *floppy1 = m_floppy1->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)
+READ8_MEMBER(bbc_weddb3_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ else
+ {
+ data = m_drive_control;
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_weddb3_device::wd177xl_write)
+WRITE8_MEMBER(bbc_weddb3_device::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();
+ if (offset & 0x04)
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+ else
+ {
+ floppy_image_device *floppy = nullptr;
+
+ m_drive_control = data;
+
+ // bit 0, 1: drive select
+ if (BIT(data, 0)) floppy = m_floppy0->get_device();
+ if (BIT(data, 1)) floppy = m_floppy1->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)
diff --git a/src/devices/bus/bbc/fdc/watford.h b/src/devices/bus/bbc/fdc/watford.h
index ddc266d83ed..2f03f24eb0f 100644
--- a/src/devices/bus/bbc/fdc/watford.h
+++ b/src/devices/bus/bbc/fdc/watford.h
@@ -23,18 +23,16 @@
class bbc_watfordfdc_device :
public device_t,
public device_bbc_fdc_interface
-
{
public:
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
protected:
// construction/destruction
bbc_watfordfdc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- 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
@@ -42,9 +40,6 @@ class bbc_weddb2_device : public bbc_watfordfdc_device
public:
bbc_weddb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(wd177xl_read);
- DECLARE_WRITE8_MEMBER(wd177xl_write);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -53,6 +48,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
required_memory_region m_dfs_rom;
required_device<wd_fdc_device_base> m_fdc;
@@ -67,9 +65,6 @@ class bbc_weddb3_device : public bbc_watfordfdc_device
public:
bbc_weddb3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(wd177xl_read);
- DECLARE_WRITE8_MEMBER(wd177xl_write);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -78,6 +73,9 @@ protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
private:
required_memory_region m_dfs_rom;
required_device<wd_fdc_device_base> m_fdc;
diff --git a/src/devices/bus/bbc/joyport/joyport.cpp b/src/devices/bus/bbc/joyport/joyport.cpp
index b45b804a76c..5ed3f8d2fff 100644
--- a/src/devices/bus/bbc/joyport/joyport.cpp
+++ b/src/devices/bus/bbc/joyport/joyport.cpp
@@ -32,15 +32,6 @@ device_bbc_joyport_interface::device_bbc_joyport_interface(const machine_config
}
-//-------------------------------------------------
-// ~device_bbc_joyport_interface - destructor
-//-------------------------------------------------
-
-device_bbc_joyport_interface::~device_bbc_joyport_interface()
-{
-}
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -102,8 +93,9 @@ void bbc_joyport_slot_device::device_reset()
READ8_MEMBER(bbc_joyport_slot_device::pb_r)
{
+ // TODO: Joyport connected to PB0-PB4 only. PB5-PB7 are expansion port.
if (m_device)
- return m_device->pb_r(space, 0);
+ return 0xe0 | m_device->pb_r(space, 0);
else
return 0xff;
}
diff --git a/src/devices/bus/bbc/joyport/joyport.h b/src/devices/bus/bbc/joyport/joyport.h
index a11e39a38ec..572e41f7612 100644
--- a/src/devices/bus/bbc/joyport/joyport.h
+++ b/src/devices/bus/bbc/joyport/joyport.h
@@ -34,20 +34,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_JOYPORT_ADD( _tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_JOYPORT_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_JOYPORT_CB1_HANDLER(_devcb) \
- downcast<bbc_joyport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_JOYPORT_CB2_HANDLER(_devcb) \
- downcast<bbc_joyport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -59,11 +45,21 @@ class bbc_joyport_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_joyport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_joyport_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_joyport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); }
+ auto cb1_handler() { return m_cb1_handler.bind(); }
+ auto cb2_handler() { return m_cb2_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
@@ -90,9 +86,6 @@ private:
class device_bbc_joyport_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_joyport_interface();
-
virtual DECLARE_READ8_MEMBER(pb_r) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(pb_w) { }
diff --git a/src/devices/bus/bbc/tube/tube.cpp b/src/devices/bus/bbc/tube/tube.cpp
index f3824e872cf..c69b57cd45f 100644
--- a/src/devices/bus/bbc/tube/tube.cpp
+++ b/src/devices/bus/bbc/tube/tube.cpp
@@ -34,16 +34,6 @@ device_bbc_tube_interface::device_bbc_tube_interface(const machine_config &mconf
}
-//-------------------------------------------------
-// ~device_bbc_tube_interface - destructor
-//-------------------------------------------------
-
-device_bbc_tube_interface::~device_bbc_tube_interface()
-{
-}
-
-
-
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -62,15 +52,6 @@ bbc_tube_slot_device::bbc_tube_slot_device(const machine_config &mconfig, const
//-------------------------------------------------
-// bbc_tube_slot_device - destructor
-//-------------------------------------------------
-
-bbc_tube_slot_device::~bbc_tube_slot_device()
-{
-}
-
-
-//-------------------------------------------------
// device_validity_check -
//-------------------------------------------------
@@ -135,8 +116,10 @@ WRITE8_MEMBER(bbc_tube_slot_device::host_w)
#include "tube_65c102.h"
#include "tube_80186.h"
#include "tube_80286.h"
+//#include "tube_a500.h"
#include "tube_arm.h"
#include "tube_casper.h"
+//#include "tube_pmsb2p.h"
//#include "tube_x25.h"
#include "tube_z80.h"
#include "tube_zep100.h"
@@ -151,12 +134,16 @@ void bbc_extube_devices(device_slot_interface &device)
device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
// device.option_add("32016", BBC_TUBE_32016); /* Acorn ANC05 32016 2nd processor */
-// device.option_add("camb", BBC_TUBE_CAMB); /* Acorn ANC06 Cambridge Co-Processor */
device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
device.option_add("80286", BBC_TUBE_80286); /* Acorn 80286 2nd Processor */
-// device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
+ //device.option_add("a500", BBC_TUBE_A500); /* Acorn A500 2nd Processor */
device.option_add("casper", BBC_TUBE_CASPER); /* Casper 68000 2nd Processor */
- device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) */
+ //device.option_add("pmsb2p", BBC_TUBE_PMSB2P); /* PMS B2P-6502 */
+ //device.option_add("hdp68k", BBC_TUBE_HDP68K); /* Torch Unicorn (HDP68K) */
+ device.option_add("zep100", BBC_TUBE_ZEP100); /* Torch Z80 Communicator (ZEP100) (Torch) */
+ //device.option_add("zep100l", BBC_TUBE_ZEP100L); /* Torch Z80 Communicator (ZEP100) (Acorn 8271) */
+ //device.option_add("zep100w", BBC_TUBE_ZEP100W); /* Torch Z80 Communicator (ZEP100) (Acorn 1770) */
+ //device.option_add("zep100m", BBC_TUBE_ZEP100M); /* Torch Z80 Communicator (ZEP100) (Master) */
/* Acorn ANC21 Universal 2nd Processor Unit */
device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
@@ -176,6 +163,19 @@ void bbc_intube_devices(device_slot_interface &device)
//-------------------------------------------------
+// SLOT_INTERFACE( electron_tube_devices )
+//-------------------------------------------------
+
+void electron_tube_devices(device_slot_interface &device)
+{
+ device.option_add("6502", BBC_TUBE_6502); /* Acorn ANC01 6502 2nd processor */
+ device.option_add("z80", BBC_TUBE_Z80); /* Acorn ANC04 Z80 2nd processor */
+ device.option_add("arm", BBC_TUBE_ARM); /* Acorn ANC13 ARM Evaluation System */
+ device.option_add("65c102", BBC_TUBE_65C102); /* Acorn ADC06 65C102 co-processor */
+ device.option_add("80186", BBC_TUBE_80186); /* Acorn ADC08 80186 co-processor */
+}
+
+//-------------------------------------------------
// SLOT_INTERFACE( bbc_x25tube_devices )
//-------------------------------------------------
diff --git a/src/devices/bus/bbc/tube/tube.h b/src/devices/bus/bbc/tube/tube.h
index 722207d8d93..1bcc413c8ac 100644
--- a/src/devices/bus/bbc/tube/tube.h
+++ b/src/devices/bus/bbc/tube/tube.h
@@ -39,25 +39,6 @@
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-#define BBC_TUBE_SLOT_TAG "tube"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_TUBE_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_TUBE_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(_devcb) \
- downcast<bbc_tube_slot_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -70,11 +51,20 @@ class bbc_tube_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_tube_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~bbc_tube_slot_device();
+ template <typename T>
+ bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_tube_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_tube_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
+ auto irq_handler() { return m_irq_handler.bind(); }
DECLARE_READ8_MEMBER( host_r );
DECLARE_WRITE8_MEMBER( host_w );
@@ -99,9 +89,6 @@ private:
class device_bbc_tube_interface : public device_slot_card_interface
{
public:
- // construction/destruction
- virtual ~device_bbc_tube_interface();
-
// reading and writing
virtual DECLARE_READ8_MEMBER(host_r) { return 0xfe; }
virtual DECLARE_WRITE8_MEMBER(host_w) { }
@@ -118,6 +105,7 @@ DECLARE_DEVICE_TYPE(BBC_TUBE_SLOT, bbc_tube_slot_device)
void bbc_extube_devices(device_slot_interface &device);
void bbc_intube_devices(device_slot_interface &device);
+void electron_tube_devices(device_slot_interface &device);
//void bbc_x25tube_devices(device_slot_interface &device);
diff --git a/src/devices/bus/bbc/tube/tube_6502.cpp b/src/devices/bus/bbc/tube/tube_6502.cpp
index beecb3a3019..3aa3c6a1175 100644
--- a/src/devices/bus/bbc/tube/tube_6502.cpp
+++ b/src/devices/bus/bbc/tube/tube_6502.cpp
@@ -43,21 +43,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_6502_device::device_add_mconfig)
- MCFG_DEVICE_ADD("m6502", M65C02, XTAL(12'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem)
+void bbc_tube_6502_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_m6502, 12_MHz_XTAL / 4);
+ m_m6502->set_addrmap(AS_PROGRAM, &bbc_tube_6502_device::tube_6502_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("m6502", M65C02_NMI_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("m6502", M65C02_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_m6502, M65C02_NMI_LINE);
+ m_ula->pirq_handler().set_inputline(m_m6502, M65C02_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502");
+ SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_65c102.cpp b/src/devices/bus/bbc/tube/tube_65c102.cpp
index 56668f8c830..1ef92732526 100644
--- a/src/devices/bus/bbc/tube/tube_65c102.cpp
+++ b/src/devices/bus/bbc/tube/tube_65c102.cpp
@@ -43,21 +43,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_65c102_device::device_add_mconfig)
- MCFG_DEVICE_ADD("maincpu", M65C02, XTAL(16'000'000) / 4)
- MCFG_DEVICE_PROGRAM_MAP(tube_6502_mem)
+void bbc_tube_65c102_device::device_add_mconfig(machine_config &config)
+{
+ M65C02(config, m_maincpu, 16_MHz_XTAL / 4);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_tube_65c102_device::tube_6502_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("maincpu", M65C02_NMI_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("maincpu", M65C02_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_maincpu, M65C02_NMI_LINE);
+ m_ula->pirq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_6502", "bbc_flop_6502")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_65c102", "bbc_flop_65c102")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_6502").set_original("bbc_flop_6502");
+ SOFTWARE_LIST(config, "flop_ls_65c102").set_original("bbc_flop_65c102");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_80286.cpp b/src/devices/bus/bbc/tube/tube_80286.cpp
index bf0bc1404ca..f38761341f5 100644
--- a/src/devices/bus/bbc/tube/tube_80286.cpp
+++ b/src/devices/bus/bbc/tube/tube_80286.cpp
@@ -47,7 +47,7 @@ void bbc_tube_80286_device::tube_80286_io(address_map &map)
// ROM( tube_80286 )
//-------------------------------------------------
-ROM_START( tube_80286 )
+ROM_START(tube_80286)
ROM_REGION(0x4000, "bootstrap", 0)
ROM_LOAD16_BYTE("m512_lo.ic31", 0x0000, 0x2000, CRC(c0df8707) SHA1(7f6d843d5aea6bdb36cbd4623ae942b16b96069d)) // 2201,287-02
ROM_LOAD16_BYTE("m512_hi.ic32", 0x0001, 0x2000, CRC(e47f10b2) SHA1(45dc8d7e7936afbec6de423569d9005a1c350316)) // 2201,288-02
@@ -57,22 +57,23 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_80286_device::device_add_mconfig)
- MCFG_DEVICE_ADD("i80286", I80286, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tube_80286_mem)
- MCFG_DEVICE_IO_MAP(tube_80286_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_80286_device, irq_callback)
+void bbc_tube_80286_device::device_add_mconfig(machine_config &config)
+{
+ I80286(config, m_i80286, 12_MHz_XTAL / 2);
+ m_i80286->set_addrmap(AS_PROGRAM, &bbc_tube_80286_device::tube_80286_mem);
+ m_i80286->set_addrmap(AS_IO, &bbc_tube_80286_device::tube_80286_io);
+ m_i80286->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_80286_device::irq_callback), this));
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("i80286", INPUT_LINE_NMI))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("i80286", INPUT_LINE_INT0))
+ TUBE(config, m_ula);
+ m_ula->pnmi_handler().set_inputline(m_i80286, INPUT_LINE_NMI);
+ m_ula->pirq_handler().set_inputline(m_i80286, INPUT_LINE_INT0);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("1M");
+ RAM(config, m_ram).set_default_size("1M");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_80186", "bbc_flop_80186")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_80186").set_original("bbc_flop_80186");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
@@ -117,6 +118,10 @@ void bbc_tube_80286_device::device_start()
void bbc_tube_80286_device::device_reset()
{
m_ula->reset();
+
+ address_space &program = m_i80286->space(AS_PROGRAM);
+
+ program.install_rom(0xc0000, 0xc3fff, 0x3c000, m_bootstrap->base());
}
diff --git a/src/devices/bus/bbc/tube/tube_arm.cpp b/src/devices/bus/bbc/tube/tube_arm.cpp
index 27879f79119..444e188a657 100644
--- a/src/devices/bus/bbc/tube/tube_arm.cpp
+++ b/src/devices/bus/bbc/tube/tube_arm.cpp
@@ -27,6 +27,7 @@ void bbc_tube_arm_device::tube_arm_mem(address_map &map)
{
map.unmap_value_high();
map(0x0000000, 0x03fffff).rw(FUNC(bbc_tube_arm_device::ram_r), FUNC(bbc_tube_arm_device::ram_w));
+ map(0x0400000, 0x0ffffff).noprw();
map(0x1000000, 0x100001f).rw("ula", FUNC(tube_device::parasite_r), FUNC(tube_device::parasite_w)).umask32(0x000000ff);
map(0x3000000, 0x3003fff).rom().region("bootstrap", 0).mirror(0xc000);
}
@@ -50,21 +51,22 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_arm_device::device_add_mconfig)
- MCFG_DEVICE_ADD("arm", ARM, XTAL(20'000'000) / 3)
- MCFG_DEVICE_PROGRAM_MAP(tube_arm_mem)
+void bbc_tube_arm_device::device_add_mconfig(machine_config &config)
+{
+ ARM(config, m_arm, 20_MHz_XTAL / 3);
+ m_arm->set_addrmap(AS_PROGRAM, &bbc_tube_arm_device::tube_arm_mem);
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
- MCFG_TUBE_PNMI_HANDLER(INPUTLINE("arm", ARM_FIRQ_LINE))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("arm", ARM_IRQ_LINE))
+ TUBE(config, m_ula);
+ m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w));
+ m_ula->pnmi_handler().set_inputline(m_arm, ARM_FIRQ_LINE);
+ m_ula->pirq_handler().set_inputline(m_arm, ARM_IRQ_LINE);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("4M").set_default_value(0);
+ RAM(config, m_ram).set_default_size("4M").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_arm", "bbc_flop_arm")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_arm").set_original("bbc_flop_arm");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/tube/tube_z80.cpp b/src/devices/bus/bbc/tube/tube_z80.cpp
index b759fe05898..cc6f87527bf 100644
--- a/src/devices/bus/bbc/tube/tube_z80.cpp
+++ b/src/devices/bus/bbc/tube/tube_z80.cpp
@@ -61,24 +61,25 @@ ROM_END
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(bbc_tube_z80_device::device_add_mconfig)
- MCFG_DEVICE_ADD("z80", Z80, XTAL(12'000'000) / 2)
- MCFG_DEVICE_PROGRAM_MAP(tube_z80_mem)
- MCFG_DEVICE_OPCODES_MAP(tube_z80_fetch)
- MCFG_DEVICE_IO_MAP(tube_z80_io)
- MCFG_DEVICE_IRQ_ACKNOWLEDGE_DEVICE(DEVICE_SELF, bbc_tube_z80_device, irq_callback)
-
- MCFG_TUBE_ADD("ula")
- MCFG_TUBE_HIRQ_HANDLER(WRITELINE(DEVICE_SELF_OWNER, bbc_tube_slot_device, irq_w))
- MCFG_TUBE_PNMI_HANDLER(WRITELINE(*this, bbc_tube_z80_device, nmi_w))
- MCFG_TUBE_PIRQ_HANDLER(INPUTLINE("z80", INPUT_LINE_IRQ0))
+void bbc_tube_z80_device::device_add_mconfig(machine_config &config)
+{
+ Z80(config, m_z80, 12_MHz_XTAL / 2);
+ m_z80->set_addrmap(AS_PROGRAM, &bbc_tube_z80_device::tube_z80_mem);
+ m_z80->set_addrmap(AS_OPCODES, &bbc_tube_z80_device::tube_z80_fetch);
+ m_z80->set_addrmap(AS_IO, &bbc_tube_z80_device::tube_z80_io);
+ m_z80->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(bbc_tube_z80_device::irq_callback), this));
+
+ TUBE(config, m_ula);
+ m_ula->hirq_handler().set(DEVICE_SELF_OWNER, FUNC(bbc_tube_slot_device::irq_w));
+ m_ula->pnmi_handler().set(FUNC(bbc_tube_z80_device::nmi_w));
+ m_ula->pirq_handler().set_inputline(m_z80, INPUT_LINE_IRQ0);
/* internal ram */
- RAM(config, RAM_TAG).set_default_size("64K").set_default_value(0);
+ RAM(config, m_ram).set_default_size("64K").set_default_value(0);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_z80", "bbc_flop_z80")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_z80").set_original("bbc_flop_z80");
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/bbc/userport/userport.h b/src/devices/bus/bbc/userport/userport.h
index 22003968ee9..e2807146efe 100644
--- a/src/devices/bus/bbc/userport/userport.h
+++ b/src/devices/bus/bbc/userport/userport.h
@@ -33,20 +33,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_BBC_USERPORT_SLOT_ADD(_tag, _slot_intf, _def_slot) \
- MCFG_DEVICE_ADD(_tag, BBC_USERPORT_SLOT, 0) \
- MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false)
-
-#define MCFG_BBC_USERPORT_CB1_HANDLER(_devcb) \
- downcast<bbc_userport_slot_device &>(*device).set_cb1_handler(DEVCB_##_devcb);
-
-#define MCFG_BBC_USERPORT_CB2_HANDLER(_devcb) \
- downcast<bbc_userport_slot_device &>(*device).set_cb2_handler(DEVCB_##_devcb);
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -59,11 +45,21 @@ class bbc_userport_slot_device : public device_t, public device_slot_interface
{
public:
// construction/destruction
- bbc_userport_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&slot_options, const char *default_option)
+ : bbc_userport_slot_device(mconfig, tag, owner)
+ {
+ option_reset();
+ slot_options(*this);
+ set_default_option(default_option);
+ set_fixed(false);
+ }
+
+ bbc_userport_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward<Object>(cb)); }
+ auto cb1_handler() { return m_cb1_handler.bind(); }
+ auto cb2_handler() { return m_cb2_handler.bind(); }
DECLARE_WRITE_LINE_MEMBER(cb1_w) { m_cb1_handler(state); }
DECLARE_WRITE_LINE_MEMBER(cb2_w) { m_cb2_handler(state); }
diff --git a/src/devices/bus/generic/slot.h b/src/devices/bus/generic/slot.h
index 6c60a58be0a..d0f76b2ea78 100644
--- a/src/devices/bus/generic/slot.h
+++ b/src/devices/bus/generic/slot.h
@@ -189,7 +189,17 @@ protected:
class generic_socket_device : public generic_slot_device
{
public:
- generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template <typename T>
+ generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, T &&opts, const char *intf, const char *exts)
+ : generic_socket_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ opts(*this);
+ set_fixed(false);
+ set_interface(intf);
+ set_extensions(exts);
+ }
+
+ generic_socket_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
virtual iodevice_t image_type() const override { return IO_ROM; }
};
diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp
index 243a73b3c6e..bd374a6da6c 100644
--- a/src/devices/machine/i8271.cpp
+++ b/src/devices/machine/i8271.cpp
@@ -163,6 +163,24 @@ void i8271_device::set_rate(int rate)
cur_rate = rate;
}
+READ8_MEMBER(i8271_device::read)
+{
+ switch(offset & 0x03) {
+ case 0x00: return sr_r(space, 0);
+ case 0x01: return rr_r(space, 0);
+ }
+ return 0xff;
+}
+
+WRITE8_MEMBER(i8271_device::write)
+{
+ switch(offset & 0x03) {
+ case 0x00: cmd_w(space, 0, data); break;
+ case 0x01: param_w(space, 0, data); break;
+ case 0x02: reset_w(space, 0, data); break;
+ }
+}
+
READ8_MEMBER(i8271_device::data_r)
{
set_drq(false);
diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h
index 86a32365fc0..00342f38e4d 100644
--- a/src/devices/machine/i8271.h
+++ b/src/devices/machine/i8271.h
@@ -23,6 +23,8 @@ public:
auto hdl_wr_callback() { return hdl_cb.bind(); }
auto opt_wr_callback() { return opt_cb.bind(); }
+ DECLARE_READ8_MEMBER(read);
+ DECLARE_WRITE8_MEMBER(write);
DECLARE_READ8_MEMBER (data_r);
DECLARE_WRITE8_MEMBER(data_w);
diff --git a/src/devices/machine/tube.h b/src/devices/machine/tube.h
index 17223d22f84..c8d94b1c7a7 100644
--- a/src/devices/machine/tube.h
+++ b/src/devices/machine/tube.h
@@ -14,27 +14,6 @@
//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_TUBE_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, TUBE, 0);
-
-#define MCFG_TUBE_HIRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_hirq_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_PNMI_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_pnmi_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_PIRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_pirq_handler(DEVCB_##_devcb);
-
-#define MCFG_TUBE_DRQ_HANDLER(_devcb) \
- downcast<tube_device &>(*device).set_drq_handler(DEVCB_##_devcb);
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -45,13 +24,9 @@ class tube_device : public device_t
{
public:
// construction/destruction
- tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tube_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// callbacks
- template <class Object> devcb_base &set_hirq_handler(Object &&cb) { return m_hirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pnmi_handler(Object &&cb) { return m_pnmi_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_pirq_handler(Object &&cb) { return m_pirq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward<Object>(cb)); }
auto hirq_handler() { return m_hirq_handler.bind(); }
auto pnmi_handler() { return m_pnmi_handler.bind(); }
auto pirq_handler() { return m_pirq_handler.bind(); }
diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp
index af78c26ebe6..f9647cb0c2a 100644
--- a/src/mame/drivers/bbc.cpp
+++ b/src/mame/drivers/bbc.cpp
@@ -150,14 +150,14 @@ void bbc_state::bbca_mem(address_map &map)
map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM
map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM
map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages
- // fe00-feff SHEILA Address Page
+ map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w));
map(0xfe08, 0xfe09).mirror(0x06).rw(m_acia, FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // fe08-fe0f 6850 ACIA Serial controller
map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip
map(0xfe18, 0xfe1f).noprw(); // fe18-fe1f INTOFF/STATID # ECONET Interrupt Off / ID No.
map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON # ECONET Interrupt On
- // W: fe20-fe2f Video ULA Video system chip
+ // W: fe20-fe2f Video ULA Video system chip
map(0xfe30, 0xfe3f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::page_selecta_w)); // W: fe30-fe3f 74LS161 Paged ROM selector
map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0xfe60, 0xfe7f).noprw(); // fe60-fe7f 6522 VIA # USER VIA
@@ -173,7 +173,8 @@ void bbc_state::bbc_base(address_map &map)
{
map.unmap_value_high();
map(0xc000, 0xfbff).bankr("bank7"); // c000-fbff OS ROM
- map(0xfc00, 0xfdff).noprw(); // fc00-fdff FRED & JIM Pages
+ map(0xfc00, 0xfcff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::fred_r), FUNC(bbc_1mhzbus_slot_device::fred_w)); // fc00-fcff FRED Address Page
+ map(0xfd00, 0xfdff).rw(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::jim_r), FUNC(bbc_1mhzbus_slot_device::jim_w)); // fd00-fdff JIM Address Page
map(0xfe00, 0xfeff).r(FUNC(bbc_state::bbc_fe_r)); // fe00-feff SHEILA Address Page
map(0xfe00, 0xfe00).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::status_r), FUNC(hd6845_device::address_w)); // fe00-fe07 6845 CRTC Video controller
map(0xfe01, 0xfe01).mirror(0x06).rw(m_hd6845, FUNC(hd6845_device::register_r), FUNC(hd6845_device::register_w));
@@ -181,10 +182,10 @@ void bbc_state::bbc_base(address_map &map)
map(0xfe10, 0xfe17).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_SerialULA_w)); // fe10-fe17 Serial ULA Serial system chip
map(0xfe18, 0xfe1f).portr("STATID"); // fe18-fe1f INTOFF/STATID ECONET Interrupt Off / ID No.
map(0xfe20, 0xfe2f).rw(FUNC(bbc_state::bbc_fe_r), FUNC(bbc_state::bbc_videoULA_w)); // R: fe20-fe2f INTON ECONET Interrupt On
- // W: fe20-fe2f Video ULA Video system chip
+ // W: fe20-fe2f Video ULA Video system chip
map(0xfe40, 0xfe5f).rw(m_via6522_0, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe40-fe5f 6522 VIA SYSTEM VIA
map(0xfe60, 0xfe7f).rw(m_via6522_1, FUNC(via6522_device::read), FUNC(via6522_device::write)); // fe60-fe7f 6522 VIA USER VIA
- // fe80-fe9f FDC Floppy disc controller
+ // fe80-fe9f FDC Floppy disc controller
map(0xfea0, 0xfebf).r(FUNC(bbc_state::bbc_fe_r)); // fea0-febf 68B54 ADLC ECONET controller
map(0xfec0, 0xfedf).rw(m_upd7002, FUNC(upd7002_device::read), FUNC(upd7002_device::write)); // fec0-fedf uPD7002 Analogue to digital converter
map(0xfee0, 0xfeff).rw(m_tube, FUNC(bbc_tube_slot_device::host_r), FUNC(bbc_tube_slot_device::host_w)); // fee0-feff Tube ULA Tube system interface
@@ -211,6 +212,7 @@ void bbc_state::bbcb_nofdc_mem(address_map &map)
map(0x4000, 0x7fff).bankrw("bank3"); // 4000-7fff Regular RAM
map(0x8000, 0xbfff).bankr("bank4").w(FUNC(bbc_state::bbc_memoryb4_w)); // 8000-bfff Paged ROM/RAM
map(0xfe30, 0xfe3f).w(FUNC(bbc_state::page_selectb_w)); // W: fe30-fe3f 84LS161 Paged ROM selector
+ map(0xfe80, 0xfe9f).rw(m_fdc, FUNC(bbc_fdc_slot_device::read), FUNC(bbc_fdc_slot_device::write)); // fe84-fe9f 8271 FDC Floppy disc controller
}
@@ -796,30 +798,21 @@ WRITE_LINE_MEMBER(bbc_state::adlc_irq_w)
}
-WRITE_LINE_MEMBER(bbc_state::econet_clk_w)
+// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
+void bbc_state::bbc_eprom_sockets(machine_config &config)
{
- m_adlc->rxc_w(state);
- m_adlc->txc_w(state);
-}
+ GENERIC_SOCKET(config, m_exp1, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp1_load, this));
-// 4 x EPROM sockets (16K) in BBC-A, these should grow to 16 for BBC-B and later...
-MACHINE_CONFIG_START(bbc_state::bbc_eprom_sockets)
- MCFG_GENERIC_SOCKET_ADD("exp_rom1", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp1_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom2", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp2_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom3", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp3_load)
-
- MCFG_GENERIC_SOCKET_ADD("exp_rom4", generic_linear_slot, "bbc_cart")
- MCFG_GENERIC_EXTENSIONS("bin,rom")
- MCFG_GENERIC_LOAD(bbc_state, exp4_load)
-MACHINE_CONFIG_END
+ GENERIC_SOCKET(config, m_exp2, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp2_load, this));
+
+ GENERIC_SOCKET(config, m_exp3, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp3->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp3_load, this));
+
+ GENERIC_SOCKET(config, m_exp4, generic_linear_slot, "bbc_rom", "bin,rom");
+ m_exp4->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_exp4_load, this));
+}
/***************************************************************************
@@ -831,13 +824,12 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbca)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M6502, 16_MHz_XTAL/8) /* 2.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bbca_mem)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M6502(config, m_maincpu, 16_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbca_mem);
+ m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
/* internal ram */
RAM(config, m_ram).set_default_size("16K").set_extra_options("32K").set_default_value(0x00);
@@ -846,24 +838,25 @@ MACHINE_CONFIG_START(bbc_state::bbca)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbca)
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256);
+ m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_PALETTE_INIT_OWNER(bbc_state,bbc)
+ palette_device &palette(PALETTE(config, "palette", 16));
+ palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this));
- MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL/2)
- MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
+ SAA5050(config, m_trom, 12_MHz_XTAL / 2);
+ m_trom->set_screen_size(40, 25, 40);
/* crtc */
- MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(12)
- MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
- MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed))
- MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed))
- MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed))
+ HD6845(config, m_hd6845, 16_MHz_XTAL / 8);
+ m_hd6845->set_screen("screen");
+ m_hd6845->set_show_border_area(false);
+ m_hd6845->set_char_width(12);
+ m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this);
+ m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed));
+ m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed));
+ m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed));
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
@@ -871,23 +864,23 @@ MACHINE_CONFIG_START(bbc_state::bbca)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, m_sn, 16_MHz_XTAL / 4);
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette relay */
- MCFG_DEVICE_ADD("samples", SAMPLES)
- MCFG_SAMPLES_CHANNELS(1)
- MCFG_SAMPLES_NAMES(bbc_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SAMPLES(config, m_samples);
+ m_samples->set_channels(1);
+ m_samples->set_samples_names(bbc_sample_names);
+ m_samples->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(bbc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("bbc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(bbc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED);
+ m_cassette->set_interface("bbc_cass");
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_a", "bbca_cass")
+ SOFTWARE_LIST(config, "cass_ls_a").set_original("bbca_cass");
/* acia */
ACIA6850(config, m_acia, 0);
@@ -895,13 +888,13 @@ MACHINE_CONFIG_START(bbc_state::bbca)
m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w));
m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial))
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+ m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial));
+ m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial));
+ m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock))
+ CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13);
+ m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock));
/* system via */
VIA6522(config, m_via6522_0, 16_MHz_XTAL / 16);
@@ -919,8 +912,7 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcb)
bbca(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_nofdc_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_nofdc_mem);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcb)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcb)
@@ -929,10 +921,10 @@ MACHINE_CONFIG_START(bbc_state::bbcb)
m_ram->set_default_size("32K").set_default_value(0x00);
/* speech hardware */
- MCFG_DEVICE_ADD("vsm", SPEECHROM, 0)
- MCFG_DEVICE_ADD("tms5220", TMS5220, 640000)
- MCFG_TMS52XX_SPEECHROM("vsm")
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SPEECHROM(config, "vsm", 0).set_reverse_bit_order(true);
+ TMS5220(config, m_tms, 640000);
+ m_tms->set_speechrom_tag("vsm");
+ m_tms->add_route(ALL_OUTPUTS, "mono", 1.0);
/* user via */
VIA6522(config, m_via6522_1, 16_MHz_XTAL / 16);
@@ -950,126 +942,123 @@ MACHINE_CONFIG_START(bbc_state::bbcb)
/* printer */
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted?
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
/* fdc */
- MCFG_BBC_FDC_SLOT_ADD("fdc", bbc_fdc_devices, "acorn8271", false)
- MCFG_BBC_FDC_SLOT_INTRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_intrq_w))
- MCFG_BBC_FDC_SLOT_DRQ_HANDLER(WRITELINE(*this, bbc_state, fdc_drq_w))
+ BBC_FDC_SLOT(config, m_fdc, bbc_fdc_devices, "acorn8271");
+ m_fdc->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
+ m_fdc->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
/* econet */
MC6854(config, m_adlc);
m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w));
m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w));
- MCFG_ECONET_ADD()
- MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w))
- MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx))
- MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
+
+ econet_device &econet(ECONET(config, "econet", 0));
+ econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w));
+ econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w));
+ econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx));
+
+ econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0));
+ econet_devices(econet_slot);
+ econet_slot.set_slot(254);
/* analogue port */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr);
+ m_analog->lpstb_handler().set(FUNC(bbc_state::lpstb_w));
/* 1mhz bus port */
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>))
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w))
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>));
+ m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* tube port */
- MCFG_BBC_TUBE_SLOT_ADD("tube", bbc_extube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>))
+ BBC_TUBE_SLOT(config, m_tube, bbc_extube_devices, nullptr);
+ m_tube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>));
/* user port */
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
- MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_orig", "bbcb_flop_orig")
+ SOFTWARE_LIST(config, "cass_ls_b").set_original("bbcb_cass");
+ SOFTWARE_LIST(config, "flop_ls_b").set_original("bbcb_flop");
+ SOFTWARE_LIST(config, "flop_ls_b_orig").set_original("bbcb_flop_orig");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::bbcb_de)
+void bbc_state::bbcb_de(machine_config &config)
+{
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcb_mem);
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(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)
+
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_de", "bbcb_cass_de")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_b_de").set_original("bbcb_cass_de");
+}
-MACHINE_CONFIG_START(bbc_state::bbcb_us)
+void bbc_state::bbcb_us(machine_config &config)
+{
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(bbcb_mem)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::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)
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 262, 0, 200);
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(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)
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_b_us", "bbcb_flop_us")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_b_us").set_original("bbcb_cass_us");
+}
MACHINE_CONFIG_START(bbc_state::bbcbp)
bbcb(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(bbcbp_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
+ config.device_remove("fdc");
WD1770(config, m_wd1770, 16_MHz_XTAL / 2);
m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("wd1770: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_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcbp128)
bbcbp(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(bbcbp128_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcbp128_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcbp)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcbp)
@@ -1092,42 +1081,41 @@ MACHINE_CONFIG_START(torch_state::torchf)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, torch)
/* fdc */
- MCFG_DEVICE_REMOVE("fdc")
- I8271(config, m_i8271, 0);
+ config.device_remove("fdc");
+ I8271(config, m_i8271, 16_MHz_XTAL / 8);
m_i8271->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_i8271->hdl_wr_callback().set(FUNC(bbc_state::motor_w));
m_i8271->opt_wr_callback().set(FUNC(bbc_state::side_w));
- MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD_FIXED("i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "i8271:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc, true).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "i8271:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* Add Torch Z80 Communicator co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("zep100")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("zep100");
+ m_tube->set_fixed(true);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(torch_state::torchh10)
+void torch_state::torchh10(machine_config &config)
+{
torchf(config);
/* fdc */
- MCFG_DEVICE_REMOVE("i8271:1")
+ config.device_remove("i8271:1");
/* Add 10MB HDD */
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(torch_state::torchh21)
+void torch_state::torchh21(machine_config &config)
+{
torchf(config);
/* fdc */
- MCFG_DEVICE_REMOVE("i8271:1")
+ config.device_remove("i8271:1");
/* Add 21MB HDD */
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -1137,94 +1125,74 @@ MACHINE_CONFIG_END
****************************************************************************/
-MACHINE_CONFIG_START(bbc_state::abc110)
+void bbc_state::abc110(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Acorn Z80 co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("z80")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("z80");
+ m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
- //scsi_port_device &scsibus(SCSI_PORT(config, SCSIBUS_TAG));
- //scsibus.set_data_input_buffer("scsi_data_in");
- //scsibus.msg_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit0));
- //scsibus.bsy_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_bsy_w))
- //scsibus.req_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::scsi_req_w))
- //scsibus.io_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit6));
- //scsibus.cd_handler().set("scsi_ctrl_in", FUNC(input_buffer_device::write_bit7));
- //scsibus.set_slot_device(1, "harddisk", ACB4070, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_0));
-
- //output_latch_device &scsiout(OUTPUT_LATCH(config, "scsi_data_out"));
- //scsibus.set_output_latch(scsiout);
- //scsiout.bit_handler<0>().set("scsi", FUNC(scsi_port_device::write_data0));
- //scsiout.bit_handler<1>().set("scsi", FUNC(scsi_port_device::write_data1));
- //scsiout.bit_handler<2>().set("scsi", FUNC(scsi_port_device::write_data2));
- //scsiout.bit_handler<3>().set("scsi", FUNC(scsi_port_device::write_data3));
- //scsiout.bit_handler<4>().set("scsi", FUNC(scsi_port_device::write_data4));
- //scsiout.bit_handler<5>().set("scsi", FUNC(scsi_port_device::write_data5));
- //scsiout.bit_handler<6>().set("scsi", FUNC(scsi_port_device::write_data6));
- //scsiout.bit_handler<7>().set("scsi", FUNC(scsi_port_device::write_data7));
-
- //INPUT_BUFFER(config, "scsi_ctrl_in");
- //INPUT_BUFFER(config, "scsi_data_in");
/* Add 10MB ST-412 Winchester */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::acw443)
+void bbc_state::acw443(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Add 32016 co-processor */
- //MCFG_DEVICE_MODIFY("tube")
- //MCFG_SLOT_DEFAULT_OPTION("32016")
- //MCFG_SLOT_FIXED(true)
+ //m_tube->set_default_option("32016");
+ //m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
+ //m_1mhzbus->set_default_option("awdd");
+ //m_1mhzbus->set_fixed(true);
/* Add 10MB ST-412 Winchester ABC210 */
/* Add 20MB ST-412 Winchester Cambridge */
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("flop_ls_32016", "bbc_flop_32016")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::abc310)
+void bbc_state::abc310(machine_config &config)
+{
bbcbp(config);
/* fdc */
- MCFG_DEVICE_REMOVE("wd1770:1")
+ config.device_remove("wd1770:1");
/* Acorn 80286 co-processor */
- MCFG_DEVICE_MODIFY("tube")
- MCFG_SLOT_DEFAULT_OPTION("80286")
- MCFG_SLOT_FIXED(true)
+ m_tube->set_default_option("80286");
+ m_tube->set_fixed(true);
/* Add ADAPTEC ACB-4000 Winchester Disc Controller */
/* Add 10MB ST-412 Winchester */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+}
/***************************************************************************
@@ -1234,35 +1202,35 @@ MACHINE_CONFIG_END
****************************************************************************/
-MACHINE_CONFIG_START(bbc_state::reutapm)
+void bbc_state::reutapm(machine_config &config)
+{
bbcbp(config);
/* basic machine hardware */
- MCFG_DEVICE_MODIFY("maincpu") /* M6512 */
- MCFG_DEVICE_PROGRAM_MAP(reutapm_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcbp_fetch)
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::reutapm_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcbp_fetch);
/* sound hardware */
- MCFG_DEVICE_REMOVE("mono")
- MCFG_DEVICE_REMOVE("sn76489")
- MCFG_DEVICE_REMOVE("samples")
- MCFG_DEVICE_REMOVE("vsm")
- MCFG_DEVICE_REMOVE("tms5220")
+ config.device_remove("mono");
+ config.device_remove("sn76489");
+ config.device_remove("samples");
+ config.device_remove("vsm");
+ config.device_remove("tms5220");
/* cassette */
- MCFG_DEVICE_REMOVE( "cassette" )
+ config.device_remove("cassette");
/* fdc */
config.device_remove("wd1770");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
/* expansion ports */
- MCFG_DEVICE_REMOVE("analogue")
-MACHINE_CONFIG_END
+ config.device_remove("analogue");
+}
/***************************************************************************
@@ -1280,11 +1248,12 @@ void bbc_state::econx25(machine_config &config)
config.device_remove("tms5220");
/* fdc */
- //config.device_remove("wd1770");
+ //config.device_remove("wd1770")
/* Add Econet X25 Gateway co-processor */
- //MCFG_DEVICE_MODIFY("tube")
- //MCFG_DEVICE_SLOT_INTERFACE(bbc_x25tube_devices, "x25", true)
+ //m_tube->option_list(bbc_x25tube_devices);
+ //m_tube->set_default_option("x25");
+ //m_tube->set_fixed(true);
/* software lists */
config.device_remove("cass_ls_a");
@@ -1303,14 +1272,13 @@ void bbc_state::econx25(machine_config &config)
MACHINE_CONFIG_START(bbc_state::bbcm)
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", M65SC02, 16_MHz_XTAL/8) /* 2.00 MHz */
- MCFG_DEVICE_PROGRAM_MAP(bbcm_mem)
- MCFG_DEVICE_OPCODES_MAP(bbcm_fetch)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(bbc_state, bbcb_keyscan, 1000) /* scan keyboard */
- MCFG_QUANTUM_TIME(attotime::from_hz(60))
+ M65SC02(config, m_maincpu, 16_MHz_XTAL / 8);
+ m_maincpu->set_addrmap(AS_PROGRAM, &bbc_state::bbcm_mem);
+ m_maincpu->set_addrmap(AS_OPCODES, &bbc_state::bbcm_fetch);
+ m_maincpu->set_periodic_int(FUNC(bbc_state::bbcb_keyscan), attotime::from_hz(1000)); /* scan keyboard */
+ config.m_minimum_quantum = attotime::from_hz(60);
- MCFG_INPUT_MERGER_ANY_HIGH("irqs")
- MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6502_IRQ_LINE))
+ INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("32K").set_default_value(0x00);
@@ -1321,67 +1289,69 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
config.set_default_layout(layout_bbcm);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DEVICE("hd6845", hd6845_device, screen_update)
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(16_MHz_XTAL, 1024, 0, 640, 312, 0, 256);
+ m_screen->set_screen_update("hd6845", FUNC(hd6845_device::screen_update));
- MCFG_PALETTE_ADD("palette", 16)
- MCFG_PALETTE_INIT_OWNER(bbc_state, bbc)
+ palette_device &palette(PALETTE(config, "palette", 16));
+ palette.set_init(palette_init_delegate(FUNC(bbc_state::palette_init_bbc), this));
- MCFG_DEVICE_ADD("saa5050", SAA5050, 12_MHz_XTAL / 2)
- MCFG_SAA5050_SCREEN_SIZE(40, 25, 40)
+ SAA5050(config, m_trom, 12_MHz_XTAL / 2);
+ m_trom->set_screen_size(40, 25, 40);
/* crtc */
- MCFG_MC6845_ADD("hd6845", HD6845, "screen", 16_MHz_XTAL / 8)
- MCFG_MC6845_SHOW_BORDER_AREA(false)
- MCFG_MC6845_CHAR_WIDTH(12)
- MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
- MCFG_MC6845_OUT_DE_CB(WRITELINE(*this, bbc_state, bbc_de_changed))
- MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(*this, bbc_state, bbc_hsync_changed))
- MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(*this, bbc_state, bbc_vsync_changed))
+ HD6845(config, m_hd6845, 16_MHz_XTAL / 8);
+ m_hd6845->set_screen("screen");
+ m_hd6845->set_show_border_area(false);
+ m_hd6845->set_char_width(12);
+ m_hd6845->set_update_row_callback(FUNC(bbc_state::crtc_update_row), this);
+ m_hd6845->out_de_callback().set(FUNC(bbc_state::bbc_de_changed));
+ m_hd6845->out_hsync_callback().set(FUNC(bbc_state::bbc_hsync_changed));
+ m_hd6845->out_vsync_callback().set(FUNC(bbc_state::bbc_vsync_changed));
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbc)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- MCFG_DEVICE_ADD("sn76489", SN76489, 16_MHz_XTAL/4) /* 4 MHz */
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SN76489(config, m_sn, 16_MHz_XTAL / 4);
+ m_sn->add_route(ALL_OUTPUTS, "mono", 1.0);
/* cassette relay */
- MCFG_DEVICE_ADD("samples", SAMPLES)
- MCFG_SAMPLES_CHANNELS(1)
- MCFG_SAMPLES_NAMES(bbc_sample_names)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ SAMPLES(config, m_samples);
+ m_samples->set_channels(1);
+ m_samples->set_samples_names(bbc_sample_names);
+ m_samples->add_route(ALL_OUTPUTS, "mono", 1.0);
/* rtc and cmos */
- MCFG_DEVICE_ADD("rtc", MC146818, 32.768_kHz_XTAL)
+ MC146818(config, m_rtc, 32.768_kHz_XTAL);
/* printer */
centronics_device &centronics(CENTRONICS(config, "centronics", centronics_devices, "printer"));
centronics.ack_handler().set("via6522_1", FUNC(via6522_device::write_ca1)).invert(); // ack seems to be inverted?
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ output_latch_device &latch(OUTPUT_LATCH(config, "cent_data_out"));
+ centronics.set_output_latch(latch);
/* cassette */
- MCFG_CASSETTE_ADD( "cassette" )
- MCFG_CASSETTE_FORMATS(bbc_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED)
- MCFG_CASSETTE_INTERFACE("bbc_cass")
+ CASSETTE(config, m_cassette);
+ m_cassette->set_formats(bbc_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY | CASSETTE_MOTOR_DISABLED);
+ m_cassette->set_interface("bbc_cass");
// 2 x cartridge sockets in BBC-Master
- MCFG_GENERIC_CARTSLOT_ADD("exp_rom1", generic_plain_slot, "bbcm_cart")
- MCFG_GENERIC_LOAD(bbc_state, bbcm_exp1_load)
+ GENERIC_CARTSLOT(config, m_exp1, generic_linear_slot, "bbcm_cart", "bin,rom");
+ m_exp1->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart1_load, this));
- MCFG_GENERIC_CARTSLOT_ADD("exp_rom2", generic_plain_slot, "bbcm_cart")
- MCFG_GENERIC_LOAD(bbc_state, bbcm_exp2_load)
+ GENERIC_CARTSLOT(config, m_exp2, generic_linear_slot, "bbcm_cart", "bin,rom");
+ m_exp2->set_device_load(device_image_load_delegate(&bbc_state::device_image_load_bbcm_cart2_load, this));
/* software lists */
- MCFG_SOFTWARE_LIST_ADD("cass_ls_m", "bbcm_cass")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_m", "bbcm_flop")
- MCFG_SOFTWARE_LIST_ADD("cart_ls_m", "bbcm_cart")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_a", "bbca_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("cass_ls_b", "bbcb_cass")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b", "bbcb_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_b_orig", "bbcb_flop_orig")
+ SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass");
+ SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop");
+ SOFTWARE_LIST(config, "cart_ls_m").set_original("bbcm_cart");
+ SOFTWARE_LIST(config, "cass_ls_a").set_compatible("bbca_cass");
+ SOFTWARE_LIST(config, "cass_ls_b").set_compatible("bbcb_cass");
+ SOFTWARE_LIST(config, "flop_ls_b").set_compatible("bbcb_flop");
+ SOFTWARE_LIST(config, "flop_ls_b_orig").set_compatible("bbcb_flop_orig");
/* acia */
ACIA6850(config, m_acia, 0);
@@ -1389,13 +1359,13 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
m_acia->rts_handler().set(FUNC(bbc_state::bbc_rts_w));
m_acia->irq_handler().set("irqs", FUNC(input_merger_device::in_w<0>));
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(*this, bbc_state, write_rxd_serial))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, bbc_state, write_dcd_serial))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, bbc_state, write_cts_serial))
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
+ m_rs232->rxd_handler().set(FUNC(bbc_state::write_rxd_serial));
+ m_rs232->dcd_handler().set(FUNC(bbc_state::write_dcd_serial));
+ m_rs232->cts_handler().set(FUNC(bbc_state::write_cts_serial));
- MCFG_DEVICE_ADD("acia_clock", CLOCK, 16_MHz_XTAL / 13)
- MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(*this, bbc_state, write_acia_clock))
+ CLOCK(config, m_acia_clock, 16_MHz_XTAL / 13);
+ m_acia_clock->signal_handler().set(FUNC(bbc_state::write_acia_clock));
/* adc */
MCFG_DEVICE_ADD("upd7002", UPD7002, 0)
@@ -1423,152 +1393,156 @@ MACHINE_CONFIG_START(bbc_state::bbcm)
m_wd1770->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
m_wd1770->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD("wd1770: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_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1770:0", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1770:1", bbc_floppies_525, "525qd", bbc_state::floppy_formats_bbc).enable_sound(true);
/* econet */
MC6854(config, m_adlc);
m_adlc->out_txd_cb().set(ECONET_TAG, FUNC(econet_device::host_data_w));
m_adlc->out_irq_cb().set(FUNC(bbc_state::adlc_irq_w));
- MCFG_ECONET_ADD()
- MCFG_ECONET_CLK_CALLBACK(WRITELINE(*this, bbc_state, econet_clk_w))
- MCFG_ECONET_DATA_CALLBACK(WRITELINE("mc6854", mc6854_device, set_rx))
- MCFG_ECONET_SLOT_ADD("econet254", 254, econet_devices, nullptr)
+
+ econet_device &econet(ECONET(config, "econet", 0));
+ econet.clk_wr_callback().set(m_adlc, FUNC(mc6854_device::txc_w));
+ econet.clk_wr_callback().append(m_adlc, FUNC(mc6854_device::rxc_w));
+ econet.data_wr_callback().set(m_adlc, FUNC(mc6854_device::set_rx));
+
+ econet_slot_device &econet_slot(ECONET_SLOT(config, "econet254", 0));
+ econet_devices(econet_slot);
+ econet_slot.set_slot(254);
/* analogue port */
- MCFG_BBC_ANALOGUE_SLOT_ADD("analogue", bbc_analogue_devices, nullptr)
+ BBC_ANALOGUE_SLOT(config, m_analog, bbc_analogue_devices, nullptr);
/* 1mhz bus port */
- MCFG_BBC_1MHZBUS_SLOT_ADD("1mhzbus", bbc_1mhzbus_devices, nullptr)
- MCFG_BBC_1MHZBUS_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<3>))
- MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(WRITELINE(*this, bbc_state, bus_nmi_w))
+ BBC_1MHZBUS_SLOT(config, m_1mhzbus, bbc_1mhzbus_devices, nullptr);
+ m_1mhzbus->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<3>));
+ m_1mhzbus->nmi_handler().set(FUNC(bbc_state::bus_nmi_w));
/* tube ports */
- MCFG_BBC_TUBE_SLOT_ADD("intube", bbc_intube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<4>))
- MCFG_BBC_TUBE_SLOT_ADD("extube", bbc_extube_devices, nullptr)
- MCFG_BBC_TUBE_SLOT_IRQ_HANDLER(WRITELINE("irqs", input_merger_device, in_w<5>))
+ BBC_TUBE_SLOT(config, m_intube, bbc_intube_devices, nullptr);
+ m_intube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<4>));
+ BBC_TUBE_SLOT(config, m_extube, bbc_extube_devices, nullptr);
+ m_extube->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<5>));
/* user port */
- MCFG_BBC_USERPORT_SLOT_ADD("userport", bbc_userport_devices, nullptr)
- MCFG_BBC_USERPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_USERPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_USERPORT_SLOT(config, m_userport, bbc_userport_devices, nullptr);
+ m_userport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_userport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::bbcmt)
+void bbc_state::bbcmt(machine_config &config)
+{
bbcm(config);
/* Acorn 65C102 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("65c102")
- MCFG_SLOT_FIXED(true)
-MACHINE_CONFIG_END
+ m_intube->set_default_option("65c102");
+ m_intube->set_fixed(true);
+}
-MACHINE_CONFIG_START(bbc_state::bbcmaiv)
+void bbc_state::bbcmaiv(machine_config &config)
+{
bbcm(config);
/* Acorn 65C102 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("65c102")
- MCFG_SLOT_FIXED(true)
+ m_intube->set_default_option("65c102");
+ m_intube->set_fixed(true);
/* Add Philips VP415 Laserdisc player */
/* Acorn Tracker Ball */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("tracker")
-MACHINE_CONFIG_END
+ m_userport->set_default_option("tracker");
+}
-MACHINE_CONFIG_START(bbc_state::bbcmet)
+void bbc_state::bbcmet(machine_config &config)
+{
bbcm(config);
/* printer */
- MCFG_DEVICE_REMOVE("centronics")
- MCFG_DEVICE_REMOVE("cent_data_out")
+ config.device_remove("centronics");
+ config.device_remove("cent_data_out");
/* cassette */
- MCFG_DEVICE_REMOVE("cassette")
+ config.device_remove("cassette");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
/* acia */
- MCFG_DEVICE_REMOVE("acia6850")
- MCFG_DEVICE_REMOVE(RS232_TAG)
- MCFG_DEVICE_REMOVE("acia_clock")
+ config.device_remove("acia6850");
+ config.device_remove(RS232_TAG);
+ config.device_remove("acia_clock");
/* devices */
- MCFG_DEVICE_REMOVE("upd7002")
- MCFG_DEVICE_REMOVE("via6522_1")
+ config.device_remove("upd7002");
+ config.device_remove("via6522_1");
/* fdc */
config.device_remove("wd1770");
- /* expansion ports */
- MCFG_DEVICE_REMOVE("analogue")
- MCFG_DEVICE_REMOVE("extube")
- MCFG_DEVICE_REMOVE("1mhzbus")
- MCFG_DEVICE_REMOVE("userport")
-MACHINE_CONFIG_END
+ /* expansion ports (not fitted) */
+ config.device_remove("analogue");
+ config.device_remove("extube");
+ config.device_remove("1mhzbus");
+ config.device_remove("userport");
+}
-MACHINE_CONFIG_START(bbc_state::bbcm512)
+void bbc_state::bbcm512(machine_config &config)
+{
bbcm(config);
/* Acorn Intel 80186 co-processor */
- MCFG_DEVICE_MODIFY("intube")
- MCFG_SLOT_DEFAULT_OPTION("80186")
- MCFG_SLOT_FIXED(true)
+ m_intube->set_default_option("80186");
+ m_intube->set_fixed(true);
/* Acorn Mouse */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("m512mouse")
-MACHINE_CONFIG_END
+ m_userport->set_default_option("m512mouse");
+}
-MACHINE_CONFIG_START(bbc_state::bbcmarm)
+void bbc_state::bbcmarm(machine_config &config)
+{
bbcm(config);
/* Acorn ARM co-processor */
- MCFG_DEVICE_MODIFY("extube")
- MCFG_SLOT_DEFAULT_OPTION("arm")
- MCFG_SLOT_FIXED(true)
-MACHINE_CONFIG_END
+ m_extube->set_default_option("arm");
+ m_extube->set_fixed(true);
+}
-MACHINE_CONFIG_START(bbc_state::discmon)
+void bbc_state::discmon(machine_config &config)
+{
bbcm(config);
/* Add coin slot */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
-MACHINE_CONFIG_START(bbc_state::discmate)
+void bbc_state::discmate(machine_config &config)
+{
bbcm(config);
/* Add Sony CDK-3000PII Auto Disc Loader */
/* Add interface boards connected to cassette and RS423 */
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
-MACHINE_CONFIG_END
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+}
MACHINE_CONFIG_START(bbc_state::cfa3000)
@@ -1582,24 +1556,21 @@ MACHINE_CONFIG_START(bbc_state::cfa3000)
MCFG_DEVICE_SLOT_INTERFACE(bbc_floppies_525, nullptr, false)
/* keyboard */
- MCFG_DEVICE_MODIFY("userport")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000kbd")
+ m_userport->set_default_option("cfa3000kbd");
/* option board */
- MCFG_DEVICE_MODIFY("1mhzbus")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000opt")
+ m_1mhzbus->set_default_option("cfa3000opt");
/* analogue dials/sensors */
- MCFG_DEVICE_MODIFY("analogue")
- MCFG_SLOT_DEFAULT_OPTION("cfa3000a")
+ m_analog->set_default_option("cfa3000a");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
MACHINE_CONFIG_END
@@ -1613,22 +1584,20 @@ MACHINE_CONFIG_END
MACHINE_CONFIG_START(bbc_state::bbcmc)
bbcm(config);
/* cassette */
- MCFG_DEVICE_REMOVE("cassette")
+ config.device_remove("cassette");
/* fdc */
config.device_remove("wd1770");
- wd1772_device& wd1772(WD1772(config, "wd1772", 16_MHz_XTAL / 2));
- wd1772.intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
- wd1772.drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
+ WD1772(config, m_wd1772, 16_MHz_XTAL / 2);
+ m_wd1772->intrq_wr_callback().set(FUNC(bbc_state::fdc_intrq_w));
+ m_wd1772->drq_wr_callback().set(FUNC(bbc_state::fdc_drq_w));
- MCFG_FLOPPY_DRIVE_ADD_FIXED("wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "wd1772:0", bbc_floppies_35, "35dd", bbc_state::floppy_formats_bbc, true).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "wd1772:1", bbc_floppies_35, nullptr, bbc_state::floppy_formats_bbc).enable_sound(true);
/* eeprom pcd8572 */
- //MCFG_DEVICE_REMOVE("rtc")
+ //config.device_remove("rtc");
MCFG_MACHINE_START_OVERRIDE(bbc_state, bbcmc)
MCFG_MACHINE_RESET_OVERRIDE(bbc_state, bbcmc)
@@ -1639,39 +1608,40 @@ MACHINE_CONFIG_START(bbc_state::bbcmc)
m_via6522_1->writepb_handler().set("joyport", FUNC(bbc_joyport_slot_device::pb_w));
/* cartridge sockets */
- MCFG_DEVICE_REMOVE("exp_rom1")
- MCFG_DEVICE_REMOVE("exp_rom2")
+ config.device_remove("exp_rom1");
+ config.device_remove("exp_rom2");
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_a")
- MCFG_SOFTWARE_LIST_REMOVE("cass_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_m")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_b_orig")
- MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_mc", "bbcmc_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_pro128s", "pro128s_flop")
+ config.device_remove("cass_ls_m");
+ config.device_remove("cass_ls_a");
+ config.device_remove("cass_ls_b");
+ config.device_remove("flop_ls_m");
+ config.device_remove("flop_ls_b");
+ config.device_remove("flop_ls_b_orig");
+ config.device_remove("cart_ls_m");
+ SOFTWARE_LIST(config, "flop_ls_mc").set_original("bbcmc_flop");
+ SOFTWARE_LIST(config, "flop_ls_pro128s").set_compatible("pro128s_flop");
/* expansion ports */
- MCFG_BBC_JOYPORT_ADD("joyport", bbc_joyport_devices, "joystick")
- MCFG_BBC_JOYPORT_CB1_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb1))
- MCFG_BBC_JOYPORT_CB2_HANDLER(WRITELINE("via6522_1", via6522_device, write_cb2))
+ BBC_JOYPORT_SLOT(config, m_joyport, bbc_joyport_devices, "joystick");
+ m_joyport->cb1_handler().set(m_via6522_1, FUNC(via6522_device::write_cb1));
+ m_joyport->cb2_handler().set(m_via6522_1, FUNC(via6522_device::write_cb2));
- MCFG_DEVICE_REMOVE("analogue")
- MCFG_DEVICE_REMOVE("intube")
- MCFG_DEVICE_REMOVE("extube")
+ config.device_remove("analogue");
+ config.device_remove("intube");
+ config.device_remove("extube");
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(bbc_state::pro128s)
+void bbc_state::pro128s(machine_config &config)
+{
bbcmc(config);
/* software lists */
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_mc")
- MCFG_SOFTWARE_LIST_REMOVE("flop_ls_pro128s")
- MCFG_SOFTWARE_LIST_ADD("flop_ls_pro128s", "pro128s_flop")
- MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("flop_ls_mc", "bbcmc_flop")
-MACHINE_CONFIG_END
+ config.device_remove("flop_ls_mc");
+ config.device_remove("flop_ls_pro128s");
+ SOFTWARE_LIST(config, "flop_ls_pro128s").set_original("pro128s_flop");
+ SOFTWARE_LIST(config, "flop_ls_mc").set_compatible("bbcmc_flop");
+}
/***************************************************************************
diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h
index c907323c1c7..a4e4d6b3e77 100644
--- a/src/mame/includes/bbc.h
+++ b/src/mame/includes/bbc.h
@@ -75,6 +75,7 @@ public:
m_intube(*this, "intube"),
m_extube(*this, "extube"),
m_1mhzbus(*this, "1mhzbus"),
+ m_userport(*this, "userport"),
m_rtc(*this, "rtc"),
m_fdc(*this, "fdc"),
m_i8271(*this, "i8271"),
@@ -168,12 +169,12 @@ public:
TIMER_CALLBACK_MEMBER(bbc_tape_timer_cb);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_WRITE_LINE_MEMBER(adlc_irq_w);
- DECLARE_WRITE_LINE_MEMBER(econet_clk_w);
DECLARE_WRITE_LINE_MEMBER(bus_nmi_w);
DECLARE_WRITE8_MEMBER(bbcb_via_system_write_porta);
DECLARE_WRITE8_MEMBER(bbcb_via_system_write_portb);
DECLARE_READ8_MEMBER(bbcb_via_system_read_porta);
DECLARE_READ8_MEMBER(bbcb_via_system_read_portb);
+ DECLARE_WRITE_LINE_MEMBER(lpstb_w);
DECLARE_WRITE_LINE_MEMBER(bbc_hsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_vsync_changed);
DECLARE_WRITE_LINE_MEMBER(bbc_de_changed);
@@ -205,8 +206,8 @@ public:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(exp4_load) { return bbc_load_rom(image, m_exp4); }
image_init_result bbcm_load_cart(device_image_interface &image, generic_slot_device *slot);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp1_load) { return bbcm_load_cart(image, m_exp1); }
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_exp2_load) { return bbcm_load_cart(image, m_exp2); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart1_load) { return bbcm_load_cart(image, m_exp1); }
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(bbcm_cart2_load) { return bbcm_load_cart(image, m_exp2); }
MC6845_UPDATE_ROW(crtc_update_row);
@@ -271,6 +272,7 @@ public: // HACK FOR MC6845
optional_device<bbc_tube_slot_device> m_intube;
optional_device<bbc_tube_slot_device> m_extube;
optional_device<bbc_1mhzbus_slot_device> m_1mhzbus;
+ optional_device<bbc_userport_slot_device> m_userport;
optional_device<mc146818_device> m_rtc;
optional_device<bbc_fdc_slot_device> m_fdc;
optional_device<i8271_device> m_i8271;
diff --git a/src/mame/machine/bbc.cpp b/src/mame/machine/bbc.cpp
index cea8152afd2..6dbc57335a9 100644
--- a/src/mame/machine/bbc.cpp
+++ b/src/mame/machine/bbc.cpp
@@ -298,7 +298,7 @@ WRITE8_MEMBER(bbc_state::bbcm_acccon_w)
}
else
{
- space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r),this));
+ space.install_read_handler(0xfc00, 0xfeff, read8_delegate(FUNC(bbc_state::bbcm_r), this));
}
}
@@ -403,21 +403,22 @@ WRITE8_MEMBER(bbc_state::bbc_memorybm7_w)
READ8_MEMBER(bbc_state::bbcm_r)
{
- long myo;
+ uint8_t data = 0xff;
+ uint8_t myo;
- if (offset<=0x0ff) /* FRED */
+ switch (offset >> 8)
{
- return 0xff;
- };
+ case 0x00: /* FRED */
+ if (m_1mhzbus) return m_1mhzbus->fred_r(space, offset & 0xff);
+ break;
- if ((offset>=0x100) && (offset<=0x1ff)) /* JIM */
- {
- return 0xff;
- };
+ case 0x01: /* JIM */
+ if (m_1mhzbus) return m_1mhzbus->jim_r(space, offset & 0xff);
+ break;
- if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
- {
- myo = offset-0x200;
+ case 0x02: /* SHEILA */
+ data = 0xfe;
+ myo = offset & 0xff;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) return m_hd6845->status_r(space, myo-0x00); /* Video controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) return m_hd6845->register_r(space, myo-0x01);
if ((myo>=0x08) && (myo<=0x0f)) return m_acia ? m_acia->read(space, myo & 0x01) : 0xfe; /* Serial controller */
@@ -425,15 +426,11 @@ READ8_MEMBER(bbc_state::bbcm_r)
if ((myo>=0x18) && (myo<=0x1f)) return m_upd7002 ? m_upd7002->read(space, myo-0x18) : 0xfe; /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) return 0xfe; /* VideoULA */
if ((myo>=0x24) && (myo<=0x27)) return bbcm_wd177xl_read(space, myo-0x24); /* 177x Control Latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */
- if ((myo>=0x28) && (myo<=0x2f)) return 0xfe; /* No Controller */
- if ((myo>=0x30) && (myo<=0x33)) return 0xfe;
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) return m_wd1770->read(myo-0x28); /* 1770 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) return m_wd1772->read(myo-0x28); /* 1772 Controller */
if ((myo>=0x34) && (myo<=0x37)) return bbcm_acccon_r(space, myo-0x34); /* ACCCON */
- if ((myo>=0x38) && (myo<=0x3f)) return 0xfe; /* NC ?? */
if ((myo>=0x40) && (myo<=0x5f)) return m_via6522_0->read(myo-0x40);
if ((myo>=0x60) && (myo<=0x7f)) return m_via6522_1 ? m_via6522_1->read(myo-0x60) : 0xfe;
- if ((myo>=0x80) && (myo<=0x9f)) return 0xfe;
if ((myo>=0xa0) && (myo<=0xbf)) return m_adlc ? m_adlc->read(space, myo & 0x03) : 0xfe;
if ((myo>=0xc0) && (myo<=0xdf)) return 0xff;
if ((myo>=0xe0) && (myo<=0xff))
@@ -441,17 +438,27 @@ READ8_MEMBER(bbc_state::bbcm_r)
if (m_intube && m_acccon_itu) return m_intube->host_r(space, myo-0xe0); /* Internal TUBE */
if (m_extube && !m_acccon_itu) return m_extube->host_r(space, myo-0xe0); /* External TUBE */
}
+ break;
}
- return 0xfe;
+ return data;
}
WRITE8_MEMBER(bbc_state::bbcm_w)
{
- long myo;
+ uint8_t myo;
- if ((offset>=0x200) && (offset<=0x2ff)) /* SHEILA */
+ switch (offset >> 8)
{
- myo=offset-0x200;
+ case 0x00: /* FRED */
+ if (m_1mhzbus) m_1mhzbus->fred_w(space, offset & 0xff, data);
+ break;
+
+ case 0x01: /* JIM */
+ if (m_1mhzbus) m_1mhzbus->jim_w(space, offset & 0xff, data);
+ break;
+
+ case 0x02: /* SHEILA */
+ myo = offset & 0xff;
if ((myo>=0x00) && (myo<=0x06) && (myo+0x01) & 1) m_hd6845->address_w(space, myo-0x00, data); /* Video Controller */
if ((myo>=0x01) && (myo<=0x07) && (myo & 1)) m_hd6845->register_w(space, myo-0x01, data);
if ((myo>=0x08) && (myo<=0x0f)) if (m_acia) m_acia->write(space, myo & 0x01, data); /* Serial controller */
@@ -459,22 +466,20 @@ WRITE8_MEMBER(bbc_state::bbcm_w)
if ((myo>=0x18) && (myo<=0x1f) && (m_upd7002)) m_upd7002->write(space, myo-0x18, data); /* A to D converter */
if ((myo>=0x20) && (myo<=0x23)) bbc_videoULA_w(space, myo-0x20, data); /* VideoULA */
if ((myo>=0x24) && (myo<=0x27) && (m_wd1770)) bbcm_wd1770l_write(space, myo-0x24, data); /* disc control latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1770)) m_wd1770->write(myo-0x28, data); /* 1770 Controller */
if ((myo>=0x24) && (myo<=0x27) && (m_wd1772)) bbcm_wd1772l_write(space, myo-0x24, data); /* disc control latch */
- if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */
+ if ((myo>=0x28) && (myo<=0x2f) && (m_wd1772)) m_wd1772->write(myo-0x28, data); /* 1772 Controller */
if ((myo>=0x30) && (myo<=0x33)) page_selectbm_w(space, myo-0x30, data); /* ROMSEL */
if ((myo>=0x34) && (myo<=0x37)) bbcm_acccon_w(space, myo-0x34, data); /* ACCCON */
- //if ((myo>=0x38) && (myo<=0x3f)) /* NC ?? */
if ((myo>=0x40) && (myo<=0x5f)) m_via6522_0->write(myo-0x40, data);
if ((myo>=0x60) && (myo<=0x7f) && (m_via6522_1)) m_via6522_1->write(myo-0x60, data);
- //if ((myo>=0x80) && (myo<=0x9f))
if ((myo>=0xa0) && (myo<=0xbf) && (m_adlc)) m_adlc->write(space, myo & 0x03, data);
- //if ((myo>=0xc0) && (myo<=0xdf))
if ((myo>=0xe0) && (myo<=0xff))
{
if (m_intube && m_acccon_itu) m_intube->host_w(space, myo-0xe0, data); /* Internal TUBE */
if (m_extube && !m_acccon_itu) m_extube->host_w(space, myo-0xe0, data); /* External TUBE */
}
+ break;
}
}
@@ -952,6 +957,13 @@ READ8_MEMBER(bbc_state::bbcb_via_system_read_portb)
}
+WRITE_LINE_MEMBER(bbc_state::lpstb_w)
+{
+ m_via6522_0->write_cb2(state);
+ if (!state)
+ m_hd6845->assert_light_pen_input();
+}
+
/**************************************
BBC Joystick Support
**************************************/
@@ -1270,6 +1282,7 @@ WRITE_LINE_MEMBER(bbc_state::motor_w)
con->get_device()->mon_w(!state);
}
}
+ m_i8271->ready_w(!state);
}
WRITE_LINE_MEMBER(bbc_state::side_w)
@@ -1482,9 +1495,9 @@ image_init_result bbc_state::bbcm_load_cart(device_image_interface &image, gener
return image_init_result::FAIL;
}
- slot->rom_alloc(size_lo + size_hi, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
- memcpy(slot->get_rom_base() + 0, image.get_software_region("uprom"), size_hi);
- memcpy(slot->get_rom_base() + size_hi, image.get_software_region("lorom"), size_lo);
+ slot->rom_alloc(0x8000, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
+ memcpy(slot->get_rom_base() + 0x0000, image.get_software_region("lorom"), size_lo);
+ memcpy(slot->get_rom_base() + 0x4000, image.get_software_region("uprom"), size_hi);
}
return image_init_result::PASS;