From 967092ccb945791cc1650377005bbee9c71360e0 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Wed, 22 Jan 2020 18:26:47 +0000 Subject: bus/bbc/1mhzbus: Added Acorn Winchester Disc. --- scripts/src/bus.lua | 2 + src/devices/bus/bbc/1mhzbus/1mhzbus.cpp | 8 +- src/devices/bus/bbc/1mhzbus/scsi.cpp | 201 ++++++++++++++++++++++++++++++++ src/devices/bus/bbc/1mhzbus/scsi.h | 81 +++++++++++++ src/mame/drivers/bbc.cpp | 25 ++-- 5 files changed, 299 insertions(+), 18 deletions(-) create mode 100644 src/devices/bus/bbc/1mhzbus/scsi.cpp create mode 100644 src/devices/bus/bbc/1mhzbus/scsi.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index e1d7b5c192d..b443021f745 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -500,6 +500,8 @@ if (BUSES["BBC_1MHZBUS"]~=null) then MAME_DIR .. "src/devices/bus/bbc/1mhzbus/pms64k.h", MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ramdisc.cpp", MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ramdisc.h", + MAME_DIR .. "src/devices/bus/bbc/1mhzbus/scsi.cpp", + MAME_DIR .. "src/devices/bus/bbc/1mhzbus/scsi.h", MAME_DIR .. "src/devices/bus/bbc/1mhzbus/sprite.cpp", MAME_DIR .. "src/devices/bus/bbc/1mhzbus/sprite.h", MAME_DIR .. "src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp", diff --git a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp index 6eb6c623769..ca3a5e5f0af 100644 --- a/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp +++ b/src/devices/bus/bbc/1mhzbus/1mhzbus.cpp @@ -116,7 +116,7 @@ void bbc_1mhzbus_slot_device::jim_w(offs_t offset, uint8_t data) #include "ieee488.h" #include "m2000.h" //#include "m5000.h" -//#include "scsi.h" +#include "scsi.h" //#include "multiform.h" #include "opus3.h" #include "pms64k.h" @@ -134,7 +134,7 @@ 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("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */ + device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */ device.option_add("autoprom", BBC_AUTOPROM); /* ATPL AutoPrommer */ device.option_add("beebide", BBC_BEEBIDE); /* Sprow BeebIDE 16-bit */ device.option_add("ide8", BBC_IDE8); /* RetroClinic BBC 8-bit IDE */ @@ -143,7 +143,6 @@ void bbc_1mhzbus_devices(device_slot_interface &device) //device.option_add("videodig", BBC_VIDEODIG); /* Video Digitiser (RH Electronics) */ device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */ //device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */ - //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */ //device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */ device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */ device.option_add("pms64k", BBC_PMS64K); /* PMS 64K Non-Volatile Ram Module */ @@ -160,14 +159,13 @@ void bbcm_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("awdd", BBC_AWDD); /* Acorn Winchester 110/130 */ + device.option_add("awhd", BBC_AWHD); /* Acorn Winchester Disc */ device.option_add("beebide", BBC_BEEBIDE); /* Sprow BeebIDE 16-bit */ device.option_add("ide8", BBC_IDE8); /* RetroClinic BBC 8-bit IDE */ device.option_add("b488", BBC_B488); /* Aries B488 */ //device.option_add("videodig", BBC_VIDEODIG); /* Video Digitiser (RH Electronics) */ device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */ //device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */ - //device.option_add("twdd", BBC_TWDD); /* Technomatic Winchester (Akhter Host Adaptor + ABD4070 */ device.option_add("m2000", BBC_M2000); /* Hybrid Music 2000 Interface */ //device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */ //device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */ diff --git a/src/devices/bus/bbc/1mhzbus/scsi.cpp b/src/devices/bus/bbc/1mhzbus/scsi.cpp new file mode 100644 index 00000000000..26c640467b3 --- /dev/null +++ b/src/devices/bus/bbc/1mhzbus/scsi.cpp @@ -0,0 +1,201 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn SCSI Host Adaptor + + Known SCSI controller boards used: + Adaptec ACB-4000A + + Known SCSI devices using adaptor: + SCSI ID 0 - Acorn Winchester 110: Seagate ST412 + Adaptec ACB-4000A + Acorn Winchester 120: NEC D5126 + Adaptec ACB-4000A + Acorn Winchester 130: Rodime R0203E + Adaptec ACB-4000A + SCSI ID 1 - Digistore Tape Streamer: Archive 2060S + + Compatible 3rd party Winchesters using Akhter Host Adaptor: + Technomatic 20MB: Seagate ST225 + Adaptec ACB-4070 + Technomatic 30MB: + Technomatic 40MB: + + Additional notes: + The Digistore used a modified Acorn Host Adaptor, it re-mapped + the device to &FC44-47, from &FC40-43. This allows both the + Digistore and Winchester to co-exist. + + Useful CHD parameters: + 10MB -chs 306,4,33 -ss=256 + 20MB -chs 612,4,33 -ss=256 + 30MB -chs 640,6,33 -ss=256 + 512MB -chs 3971,16,33 -ss 256 + + TODO: + - test formatting, may require specific ACB-4000A commands. + +**********************************************************************/ + +#include "emu.h" +#include "scsi.h" +#include "machine/nscsi_bus.h" +#include "bus/nscsi/devices.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_SCSI, bbc_scsi_device, "bbc_scsi", "Acorn SCSI Host Adaptor"); +DEFINE_DEVICE_TYPE(BBC_AWHD, bbc_awhd_device, "bbc_awhd", "Acorn Winchester Disc"); + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void bbc_scsi_device::device_add_mconfig(machine_config& config) +{ + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:1", 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_scsi_device::bsy_w)); + downcast(*device).req_callback().set(*this, FUNC(bbc_scsi_device::req_w)); + }); +} + +void bbc_awhd_device::device_add_mconfig(machine_config &config) +{ + bbc_scsi_device::device_add_mconfig(config); + + /* Adaptec ACB-4000A */ + subdevice("scsi:0")->set_default_option("harddisk"); + subdevice("scsi:0")->set_fixed(true); + + BBC_1MHZBUS_SLOT(config, m_1mhzbus, DERIVED_CLOCK(1, 1), bbc_1mhzbus_devices, nullptr); + m_1mhzbus->irq_handler().set(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::irq_w)); + m_1mhzbus->nmi_handler().set(m_1mhzbus, FUNC(bbc_1mhzbus_slot_device::nmi_w)); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_scsi_device - constructor +//------------------------------------------------- + +bbc_scsi_device::bbc_scsi_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_1mhzbus_interface(mconfig, *this) + , m_scsi(*this, "scsi:7:scsicb") +{ +} + +bbc_scsi_device::bbc_scsi_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) + : bbc_scsi_device(mconfig, BBC_SCSI, tag, owner, clock) +{ +} + +bbc_awhd_device::bbc_awhd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bbc_scsi_device(mconfig, BBC_AWHD, tag, owner, clock) + , m_1mhzbus(*this, "1mhzbus") +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void bbc_scsi_device::device_start() +{ + /* register for save states */ + save_item(NAME(m_irq_enable)); + save_item(NAME(m_irq_state)); +} + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +uint8_t bbc_scsi_device::fred_r(offs_t offset) +{ + uint8_t data = 0xff; + + switch (offset) + { + case 0x40: + data = m_scsi->read(); + m_scsi->ack_w(1); + break; + case 0x41: + data = (m_scsi->msg_r() << 0) + | (m_scsi->bsy_r() << 1) + | (m_irq_state << 4) + | (m_scsi->req_r() << 5) + | (m_scsi->io_r() << 6) + | (m_scsi->cd_r() << 7); + break; + } + + return data; +} + +void bbc_scsi_device::fred_w(offs_t offset, uint8_t data) +{ + switch (offset) + { + case 0x40: + m_scsi->write(data); + m_scsi->ack_w(1); + break; + case 0x42: + m_scsi->sel_w(1); + break; + case 0x43: + m_irq_enable = BIT(data, 0); + break; + } +} + +WRITE_LINE_MEMBER(bbc_scsi_device::bsy_w) +{ + m_scsi->sel_w(0); +} + +WRITE_LINE_MEMBER(bbc_scsi_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); +} + + +uint8_t bbc_awhd_device::fred_r(offs_t offset) +{ + uint8_t data = 0xff; + + data &= bbc_scsi_device::fred_r(offset); + data &= m_1mhzbus->fred_r(offset); + + return data; +} + +void bbc_awhd_device::fred_w(offs_t offset, uint8_t data) +{ + bbc_scsi_device::fred_w(offset, data); + m_1mhzbus->fred_w(offset, data); +} + +uint8_t bbc_awhd_device::jim_r(offs_t offset) +{ + return m_1mhzbus->jim_r(offset); +} + +void bbc_awhd_device::jim_w(offs_t offset, uint8_t data) +{ + m_1mhzbus->jim_w(offset, data); +} diff --git a/src/devices/bus/bbc/1mhzbus/scsi.h b/src/devices/bus/bbc/1mhzbus/scsi.h new file mode 100644 index 00000000000..8a4dabbe113 --- /dev/null +++ b/src/devices/bus/bbc/1mhzbus/scsi.h @@ -0,0 +1,81 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Acorn SCSI Host Adaptor + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_1MHZBUS_SCSI_H +#define MAME_BUS_BBC_1MHZBUS_SCSI_H + +#include "1mhzbus.h" +#include "machine/nscsi_cb.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class bbc_scsi_device: + public device_t, + public device_bbc_1mhzbus_interface +{ +public: + // construction/destruction + bbc_scsi_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_scsi_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 fred_r(offs_t offset) override; + virtual void fred_w(offs_t offset, uint8_t data) override; + +private: + required_device m_scsi; + + int m_irq_enable; + int m_irq_state; +}; + + +// ======================> bbc_awhd_device + +class bbc_awhd_device : public bbc_scsi_device +{ +public: + static constexpr feature_type imperfect_features() { return feature::DISK; } + + // construction/destruction + bbc_awhd_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; + + virtual uint8_t fred_r(offs_t offset) override; + virtual void fred_w(offs_t offset, uint8_t data) override; + virtual uint8_t jim_r(offs_t offset) override; + virtual void jim_w(offs_t offset, uint8_t data) override; + +private: + required_device m_1mhzbus; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_SCSI, bbc_scsi_device); +DECLARE_DEVICE_TYPE(BBC_AWHD, bbc_awhd_device); + + +#endif /* MAME_BUS_BBC_1MHZBUS_SCSI_H */ diff --git a/src/mame/drivers/bbc.cpp b/src/mame/drivers/bbc.cpp index 9cc300e6306..c747161e3be 100644 --- a/src/mame/drivers/bbc.cpp +++ b/src/mame/drivers/bbc.cpp @@ -1201,9 +1201,9 @@ void bbcbp_state::abc110(machine_config &config) m_tube->set_default_option("z80"); m_tube->set_fixed(true); - /* Adaptec ACB-4000 Winchester Disc Controller */ - - /* 10MB ST-412 Winchester */ + /* Acorn Winchester Disc 10MB */ + m_1mhzbus->set_default_option("awhd"); + m_1mhzbus->set_fixed(true); /* software lists */ config.device_remove("cass_ls_a"); @@ -1223,13 +1223,9 @@ void bbcbp_state::acw443(machine_config &config) //m_tube->set_default_option("32016"); //m_tube->set_fixed(true); - /* Adaptec ACB-4000 Winchester Disc Controller */ - //m_1mhzbus->set_default_option("awdd"); - //m_1mhzbus->set_fixed(true); - - /* 10MB ST-412 Winchester ABC210 */ - - /* 20MB ST-412 Winchester Cambridge */ + /* Acorn Winchester Disc 20MB */ + m_1mhzbus->set_default_option("awhd"); + m_1mhzbus->set_fixed(true); /* software lists */ SOFTWARE_LIST(config, "flop_ls_32016").set_original("bbc_flop_32016"); @@ -1250,9 +1246,9 @@ void bbcbp_state::abc310(machine_config &config) m_tube->set_default_option("80286"); m_tube->set_fixed(true); - /* Adaptec ACB-4000 Winchester Disc Controller */ - - /* 10MB ST-412 Winchester */ + /* Acorn Winchester Disc 10MB */ + m_1mhzbus->set_default_option("awhd"); + m_1mhzbus->set_fixed(true); /* software lists */ config.device_remove("cass_ls_a"); @@ -1615,6 +1611,9 @@ void bbcm_state::bbcmarm(machine_config &config) /* Acorn ARM co-processor */ m_extube->set_default_option("arm"); m_extube->set_fixed(true); + + /* Acorn Winchester Disc */ + m_1mhzbus->set_default_option("awhd"); } -- cgit v1.2.3