From f08d30e3ff2745c4c301aec87eb6b27886283275 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 17 Sep 2018 17:18:50 +0100 Subject: 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. --- src/devices/bus/bbc/1mhzbus/1mhzbus.cpp | 70 +-- src/devices/bus/bbc/1mhzbus/1mhzbus.h | 58 +-- src/devices/bus/bbc/1mhzbus/beebsid.cpp | 67 ++- src/devices/bus/bbc/1mhzbus/beebsid.h | 6 + src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp | 22 +- src/devices/bus/bbc/1mhzbus/cfa3000opt.h | 5 +- src/devices/bus/bbc/1mhzbus/opus3.cpp | 93 ++-- src/devices/bus/bbc/1mhzbus/opus3.h | 10 +- src/devices/bus/bbc/analogue/analogue.cpp | 28 +- src/devices/bus/bbc/analogue/analogue.h | 38 +- src/devices/bus/bbc/analogue/cfa3000a.cpp | 2 +- src/devices/bus/bbc/analogue/joystick.cpp | 2 +- src/devices/bus/bbc/fdc/acorn.cpp | 158 +++--- src/devices/bus/bbc/fdc/acorn.h | 11 +- src/devices/bus/bbc/fdc/cumana.cpp | 105 ++-- src/devices/bus/bbc/fdc/cumana.h | 8 +- src/devices/bus/bbc/fdc/cv1797.cpp | 86 ++-- src/devices/bus/bbc/fdc/cv1797.h | 6 +- src/devices/bus/bbc/fdc/fdc.cpp | 52 +- src/devices/bus/bbc/fdc/fdc.h | 47 +- src/devices/bus/bbc/fdc/opus.cpp | 82 ++-- src/devices/bus/bbc/fdc/opus.h | 15 +- src/devices/bus/bbc/fdc/watford.cpp | 164 ++++--- src/devices/bus/bbc/fdc/watford.h | 20 +- src/devices/bus/bbc/joyport/joyport.cpp | 12 +- src/devices/bus/bbc/joyport/joyport.h | 33 +- src/devices/bus/bbc/tube/tube.cpp | 44 +- src/devices/bus/bbc/tube/tube.h | 38 +- src/devices/bus/bbc/tube/tube_6502.cpp | 21 +- src/devices/bus/bbc/tube/tube_65c102.cpp | 21 +- src/devices/bus/bbc/tube/tube_80286.cpp | 29 +- src/devices/bus/bbc/tube/tube_arm.cpp | 22 +- src/devices/bus/bbc/tube/tube_z80.cpp | 29 +- src/devices/bus/bbc/userport/userport.h | 30 +- src/devices/bus/generic/slot.h | 12 +- src/devices/machine/i8271.cpp | 18 + src/devices/machine/i8271.h | 2 + src/devices/machine/tube.h | 27 +- src/mame/drivers/bbc.cpp | 744 ++++++++++++++--------------- src/mame/includes/bbc.h | 8 +- src/mame/machine/bbc.cpp | 73 +-- 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 //************************************************************************** @@ -61,15 +51,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 @@ -79,33 +79,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(*device).set_irq_handler(DEVCB_##_devcb); - -#define MCFG_BBC_1MHZBUS_SLOT_NMI_HANDLER(_devcb) \ - downcast(*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 + 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 devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward(cb)); } - template devcb_base &set_nmi_handler(Object &&cb) { return m_nmi_handler.set_callback(std::forward(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 @@ -12,13 +12,6 @@ #include "speaker.h" -//************************************************************************** -// 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 m_1mhzbus; required_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(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(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(carddev)) + m_card = dynamic_cast(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 @@ -33,21 +33,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 + 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(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(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 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(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("0")->get_device(); - floppy_image_device *floppy1 = m_fdc->subdevice("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(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 m_fdc; required_device m_floppy0; optional_device 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(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(carddev)) + m_card = dynamic_cast(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 @@ -13,21 +13,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(*device).set_intrq_handler(DEVCB_##_devcb); - -#define MCFG_BBC_FDC_SLOT_DRQ_HANDLER(_devcb) \ - downcast(*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 + 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 devcb_base &set_intrq_handler(Object &&cb) { return m_intrq_handler.set_callback(std::forward(cb)); } - template devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward(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(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(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 m_fdc; required_device m_floppy0; optional_device 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(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(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("0")->get_device(); - floppy_image_device *floppy1 = m_fdc->subdevice("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("0")->get_device(); - if (BIT(data, 1)) floppy = m_fdc->subdevice("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 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 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 @@ -33,20 +33,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(*device).set_cb1_handler(DEVCB_##_devcb); - -#define MCFG_BBC_JOYPORT_CB2_HANDLER(_devcb) \ - downcast(*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 + 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 devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward(cb)); } - template devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward(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 //************************************************************************** @@ -61,15 +51,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 */ @@ -175,6 +162,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 @@ -38,25 +38,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(*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 + 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 devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward(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 @@ -32,20 +32,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(*device).set_cb1_handler(DEVCB_##_devcb); - -#define MCFG_BBC_USERPORT_CB2_HANDLER(_devcb) \ - downcast(*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 + 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 devcb_base &set_cb1_handler(Object &&cb) { return m_cb1_handler.set_callback(std::forward(cb)); } - template devcb_base &set_cb2_handler(Object &&cb) { return m_cb2_handler.set_callback(std::forward(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 + 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 @@ -13,27 +13,6 @@ -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_TUBE_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, TUBE, 0); - -#define MCFG_TUBE_HIRQ_HANDLER(_devcb) \ - downcast(*device).set_hirq_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_PNMI_HANDLER(_devcb) \ - downcast(*device).set_pnmi_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_PIRQ_HANDLER(_devcb) \ - downcast(*device).set_pirq_handler(DEVCB_##_devcb); - -#define MCFG_TUBE_DRQ_HANDLER(_devcb) \ - downcast(*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 devcb_base &set_hirq_handler(Object &&cb) { return m_hirq_handler.set_callback(std::forward(cb)); } - template devcb_base &set_pnmi_handler(Object &&cb) { return m_pnmi_handler.set_callback(std::forward(cb)); } - template devcb_base &set_pirq_handler(Object &&cb) { return m_pirq_handler.set_callback(std::forward(cb)); } - template devcb_base &set_drq_handler(Object &&cb) { return m_drq_handler.set_callback(std::forward(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 ¢ronics(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 ¢ronics(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 m_intube; optional_device m_extube; optional_device m_1mhzbus; + optional_device m_userport; optional_device m_rtc; optional_device m_fdc; optional_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; -- cgit v1.2.3