diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 1a9fb3d0fd8..e1d7b5c192d 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -456,6 +456,21 @@ if (BUSES["BBC_JOYPORT"]~=null) then end +--------------------------------------------------- +-- +--@src/devices/bus/bbc/modem/modem.h,BUSES["BBC_MODEM"] = true +--------------------------------------------------- + +if (BUSES["BBC_MODEM"]~=null) then + files { + MAME_DIR .. "src/devices/bus/bbc/modem/modem.cpp", + MAME_DIR .. "src/devices/bus/bbc/modem/modem.h", + MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.cpp", + MAME_DIR .. "src/devices/bus/bbc/modem/scsiaiv.h", + } +end + + --------------------------------------------------- -- --@src/devices/bus/bbc/1mhzbus/1mhzbus.h,BUSES["BBC_1MHZBUS"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 4e4079127ce..be277585ef1 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -768,6 +768,7 @@ BUSES["BBC_CART"] = true BUSES["BBC_EXP"] = true BUSES["BBC_INTERNAL"] = true BUSES["BBC_JOYPORT"] = true +BUSES["BBC_MODEM"] = true BUSES["BBC_1MHZBUS"] = true BUSES["BBC_TUBE"] = true BUSES["BBC_USERPORT"] = true diff --git a/src/devices/bus/bbc/modem/modem.cpp b/src/devices/bus/bbc/modem/modem.cpp new file mode 100644 index 00000000000..1d5eff6e85c --- /dev/null +++ b/src/devices/bus/bbc/modem/modem.cpp @@ -0,0 +1,102 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + BBC Master Internal Modem port + +**********************************************************************/ + +#include "emu.h" +#include "modem.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device, "bbc_modem_slot", "BBC Master Internal Modem port") + + + +//************************************************************************** +// DEVICE BBC_MODEM PORT INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_bbc_modem_interface - constructor +//------------------------------------------------- + +device_bbc_modem_interface::device_bbc_modem_interface(const machine_config &mconfig, device_t &device) : + device_interface(device, "bbcmodem") +{ + m_slot = dynamic_cast(device.owner()); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_modem_slot_device - constructor +//------------------------------------------------- + +bbc_modem_slot_device::bbc_modem_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, BBC_MODEM_SLOT, tag, owner, clock) + , device_single_card_slot_interface(mconfig, *this) + , m_card(nullptr) + , m_irq_handler(*this) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_modem_slot_device::device_start() +{ + m_card = get_card_device(); + + // resolve callbacks + m_irq_handler.resolve_safe(); +} + + +//------------------------------------------------- +// read +//------------------------------------------------- + +uint8_t bbc_modem_slot_device::read(offs_t offset) +{ + if (m_card) + return m_card->read(offset & 0x0f); + else + return 0xfe; +} + +//------------------------------------------------- +// write +//------------------------------------------------- + +void bbc_modem_slot_device::write(offs_t offset, uint8_t data) +{ + if (m_card) + m_card->write(offset & 0x0f, data); +} + +//------------------------------------------------- +// SLOT_INTERFACE( bbcm_modem_devices ) +//------------------------------------------------- + + +// slot devices +#include "scsiaiv.h" + + +void bbcm_modem_devices(device_slot_interface &device) +{ + //device.option_add("modem", BBC_MODEM); /* Beebug Master Modem */ + device.option_add("scsiaiv", BBC_SCSIAIV); /* Acorn AIV SCSI Host Adaptor */ + //device.option_add("vp415", BBC_VP415); /* Philips VP415 */ +} diff --git a/src/devices/bus/bbc/modem/modem.h b/src/devices/bus/bbc/modem/modem.h new file mode 100644 index 00000000000..6c1e7840637 --- /dev/null +++ b/src/devices/bus/bbc/modem/modem.h @@ -0,0 +1,105 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + BBC Master Internal Modem port + +********************************************************************** + + Pinout: + + 1 NIRQ + 2 NRST + 3 BD0 + 4 BD1 + 5 BD2 + 6 BD3 + 7 BD4 + 8 BD5 + 9 BD6 + 10 BD7 + 11 MODEM + 12 A0 + 13 A1 + 14 A2 + 15 A3 + 16 1MHzE + 17 R/W + 18 +5V + 19 -5V + 20 0V + +**********************************************************************/ + +#ifndef MAME_BUS_BBC_MODEM_MODEM_H +#define MAME_BUS_BBC_MODEM_MODEM_H + +#pragma once + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> bbc_modem_slot_device + +class device_bbc_modem_interface; + +class bbc_modem_slot_device : public device_t, public device_single_card_slot_interface +{ +public: + // construction/destruction + template + bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock, T &&slot_options, const char *default_option) + : bbc_modem_slot_device(mconfig, tag, owner, clock) + { + option_reset(); + slot_options(*this); + set_default_option(default_option); + set_fixed(false); + } + + bbc_modem_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock); + + // callbacks + auto irq_handler() { return m_irq_handler.bind(); } + + virtual uint8_t read(offs_t offset); + virtual void write(offs_t offset, uint8_t data); + + DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); } + +protected: + // device-level overrides + virtual void device_start() override; + + device_bbc_modem_interface *m_card; + +private: + devcb_write_line m_irq_handler; +}; + + +// ======================> device_bbc_modem_interface + +class device_bbc_modem_interface : public device_interface +{ +public: + virtual uint8_t read(offs_t offset) { return 0xff; } + virtual void write(offs_t offset, uint8_t data) { } + +protected: + device_bbc_modem_interface(const machine_config &mconfig, device_t &device); + + bbc_modem_slot_device *m_slot; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_MODEM_SLOT, bbc_modem_slot_device) + +void bbcm_modem_devices(device_slot_interface &device); + + +#endif // MAME_BUS_BBC_MODEM_MODEM_H diff --git a/src/devices/bus/bbc/modem/scsiaiv.cpp b/src/devices/bus/bbc/modem/scsiaiv.cpp new file mode 100644 index 00000000000..f3e1ed19f27 --- /dev/null +++ b/src/devices/bus/bbc/modem/scsiaiv.cpp @@ -0,0 +1,142 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn AIV SCSI Host Adaptor + +**********************************************************************/ + +#include "emu.h" +#include "scsiaiv.h" +#include "machine/nscsi_bus.h" +#include "bus/nscsi/devices.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device, "bbc_scsiaiv", "Acorn AIV SCSI Host Adaptor"); +//DEFINE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device, "bbc_vp415", "BBC Philips VP415"); + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void bbc_scsiaiv_device::device_add_mconfig(machine_config& config) +{ + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7", default_scsi_devices, "scsicb", true) + .option_add_internal("scsicb", NSCSI_CB) + .machine_config([this](device_t* device) { + downcast(*device).bsy_callback().set(*this, FUNC(bbc_scsiaiv_device::bsy_w)); + downcast(*device).req_callback().set(*this, FUNC(bbc_scsiaiv_device::req_w)); + }); +} + +//void bbc_vp415_device::device_add_mconfig(machine_config& config) +//{ +// bbc_scsiaiv_device::device_add_mconfig(config); +// +// /* Philips VP415 */ +// subdevice("scsi:0")->set_default_option("vp415"); +// subdevice("scsi:0")->set_fixed(true); +//} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_scsiaiv_device - constructor +//------------------------------------------------- + +bbc_scsiaiv_device::bbc_scsiaiv_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_modem_interface(mconfig, *this) + , m_scsi(*this, "scsi:7:scsicb") +{ +} + +bbc_scsiaiv_device::bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) + : bbc_scsiaiv_device(mconfig, BBC_SCSIAIV, tag, owner, clock) +{ +} + +//bbc_vp415_device::bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) +// : bbc_scsiaiv_device(mconfig, BBC_VP415, tag, owner, clock) +//{ +//} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_scsiaiv_device::device_start() +{ + /* register for save states */ + save_item(NAME(m_irq_enable)); + save_item(NAME(m_irq_state)); +} + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +uint8_t bbc_scsiaiv_device::read(offs_t offset) +{ + uint8_t data = 0xff; + + switch (offset & 0x07) + { + case 0x00: + data = m_scsi->read(); + m_scsi->ack_w(1); + break; + case 0x01: + data = (m_scsi->msg_r() << 0) + | (m_scsi->bsy_r() << 1) + | (m_scsi->rst_r() << 2) + | (!m_irq_state << 4) + | (m_scsi->req_r() << 5) + | (m_scsi->io_r() << 6) + | (m_scsi->cd_r() << 7); + break; + } + + return data; +} + +void bbc_scsiaiv_device::write(offs_t offset, uint8_t data) +{ + switch (offset & 0x07) + { + case 0x00: + m_scsi->write(~data); + m_scsi->ack_w(1); + break; + case 0x02: + m_scsi->sel_w(1); + break; + case 0x03: + m_irq_enable = BIT(data, 0); + break; + } +} + +WRITE_LINE_MEMBER(bbc_scsiaiv_device::bsy_w) +{ + m_scsi->sel_w(0); +} + +WRITE_LINE_MEMBER(bbc_scsiaiv_device::req_w) +{ + m_scsi->ack_w(0); + + m_irq_state = (m_irq_enable && !state) ? 0 : 1; + m_slot->irq_w(m_irq_state ? CLEAR_LINE : ASSERT_LINE); +} diff --git a/src/devices/bus/bbc/modem/scsiaiv.h b/src/devices/bus/bbc/modem/scsiaiv.h new file mode 100644 index 00000000000..d8f241acd91 --- /dev/null +++ b/src/devices/bus/bbc/modem/scsiaiv.h @@ -0,0 +1,71 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn AIV SCSI Host Adaptor + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_1MHZBUS_SCSIAIV_H +#define MAME_BUS_BBC_1MHZBUS_SCSIAIV_H + +#include "modem.h" +#include "machine/nscsi_cb.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class bbc_scsiaiv_device: + public device_t, + public device_bbc_modem_interface +{ +public: + // construction/destruction + bbc_scsiaiv_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock); + + DECLARE_WRITE_LINE_MEMBER(bsy_w); + DECLARE_WRITE_LINE_MEMBER(req_w); + +protected: + bbc_scsiaiv_device(const machine_config& mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock); + + // device-level overrides + virtual void device_start() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config& config) override; + + virtual uint8_t read(offs_t offset) override; + virtual void write(offs_t offset, uint8_t data) override; + +private: + required_device m_scsi; + + int m_irq_enable; + int m_irq_state; +}; + + +// ======================> bbc_vp415_device + +//class bbc_vp415_device : public bbc_scsiaiv_device +//{ +//public: +// // construction/destruction +// bbc_vp415_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock); +// +//protected: +// // optional information overrides +// virtual void device_add_mconfig(machine_config& config) override; +//}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_SCSIAIV, bbc_scsiaiv_device); +//DECLARE_DEVICE_TYPE(BBC_VP415, bbc_vp415_device); + + +#endif /* MAME_BUS_BBC_1MHZBUS_SCSIAIV_H */ diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 3aff97d4909..9cc300e6306 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -250,7 +250,7 @@ void bbcm_state::bbcm_bankdev(address_map &map) map(0x023c, 0x023f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe3c-fe3f INTON map(0x0240, 0x025f).mirror(0x400).m(m_via6522_0, FUNC(via6522_device::map)); // fe40-fe5f 6522 VIA SYSTEM VIA map(0x0260, 0x027f).mirror(0x400).m(m_via6522_1, FUNC(via6522_device::map)); // fe60-fe7f 6522 VIA USER VIA - map(0x0280, 0x029f).mirror(0x400).r(FUNC(bbc_state::bbc_fe_r)); // fe80-fe9f Int. Modem Int. Modem + map(0x0280, 0x029f).mirror(0x400).rw(m_modem, FUNC(bbc_modem_slot_device::read), FUNC(bbc_modem_slot_device::write)); // fe80-fe9f Int. Modem Int. Modem map(0x02a0, 0x02bf).mirror(0x400).rw(m_adlc, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); // fea0-febf 68B54 ADLC ECONET controller map(0x02e0, 0x02ff).mirror(0x400).rw(FUNC(bbc_state::bbcm_tube_r), FUNC(bbc_state::bbcm_tube_w)); // fee0-feff Tube ULA Tube system interface /* ACCCON TST bit - hardware test */ @@ -1510,6 +1510,10 @@ void bbcm_state::bbcm(machine_config &config) m_internal->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<8>)); m_internal->nmi_handler().set(FUNC(bbc_state::bus_nmi_w)); + /* internal modem port */ + BBC_MODEM_SLOT(config, m_modem, 16_MHz_XTAL / 16, bbcm_modem_devices, nullptr); + m_modem->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<9>)); + /* software lists */ SOFTWARE_LIST(config, "cass_ls_m").set_original("bbcm_cass"); SOFTWARE_LIST(config, "flop_ls_m").set_original("bbcm_flop"); @@ -1538,7 +1542,9 @@ void bbcm_state::bbcmaiv(machine_config &config) m_intube->set_default_option("65c102"); m_intube->set_fixed(true); - /* Add Philips VP415 Laserdisc player */ + /* Philips VP415 Laserdisc player */ + m_modem->set_default_option("scsiaiv"); + m_modem->set_fixed(true); /* Acorn Tracker Ball */ m_userport->set_default_option("tracker"); @@ -1587,6 +1593,7 @@ void bbcm_state::bbcmet(machine_config &config) config.device_remove("extube"); config.device_remove("1mhzbus"); config.device_remove("userport"); + config.device_remove("modem"); } @@ -1765,6 +1772,7 @@ void bbcm_state::bbcmc(machine_config &config) config.device_remove("extube"); config.device_remove("userport"); config.device_remove("internal"); + config.device_remove("modem"); } diff --git a/src/mame/includes/bbc.h b/src/mame/includes/bbc.h index 1d03d70e78a..a5b2be15c1f 100644 --- a/src/mame/includes/bbc.h +++ b/src/mame/includes/bbc.h @@ -42,6 +42,7 @@ #include "bus/bbc/fdc/fdc.h" #include "bus/bbc/analogue/analogue.h" #include "bus/bbc/1mhzbus/1mhzbus.h" +#include "bus/bbc/modem/modem.h" #include "bus/bbc/internal/internal.h" #include "bus/bbc/tube/tube.h" #include "bus/bbc/userport/userport.h" @@ -84,6 +85,7 @@ public: , m_intube(*this, "intube") , m_extube(*this, "extube") , m_1mhzbus(*this, "1mhzbus") + , m_modem(*this, "modem") , m_userport(*this, "userport") , m_internal(*this, "internal") , m_exp(*this, "exp") @@ -243,6 +245,7 @@ protected: optional_device m_intube; optional_device m_extube; optional_device m_1mhzbus; + optional_device m_modem; optional_device m_userport; optional_device m_internal; optional_device m_exp;