From 780340b3555e94072de2a1c79713ee33aada0857 Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Mon, 6 Nov 2017 19:17:49 +0000 Subject: [PATCH] bbcb: Added Computer Village 1797 FDC (LVL Dos), not working. --- scripts/src/bus.lua | 2 + src/devices/bus/bbc/fdc/cv1797.cpp | 160 +++++++++++++++++++++++++++++ src/devices/bus/bbc/fdc/cv1797.h | 66 ++++++++++++ src/devices/bus/bbc/fdc/fdc.cpp | 4 +- 4 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 src/devices/bus/bbc/fdc/cv1797.cpp create mode 100644 src/devices/bus/bbc/fdc/cv1797.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 916b4e6f76c..e46db2c99dd 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -232,6 +232,8 @@ if (BUSES["BBC_FDC"]~=null) then MAME_DIR .. "src/devices/bus/bbc/fdc/acorn.h", MAME_DIR .. "src/devices/bus/bbc/fdc/cumana.cpp", MAME_DIR .. "src/devices/bus/bbc/fdc/cumana.h", + MAME_DIR .. "src/devices/bus/bbc/fdc/cv1797.cpp", + MAME_DIR .. "src/devices/bus/bbc/fdc/cv1797.h", MAME_DIR .. "src/devices/bus/bbc/fdc/opus.cpp", MAME_DIR .. "src/devices/bus/bbc/fdc/opus.h", MAME_DIR .. "src/devices/bus/bbc/fdc/watford.cpp", diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp new file mode 100644 index 00000000000..17f0d9130c8 --- /dev/null +++ b/src/devices/bus/bbc/fdc/cv1797.cpp @@ -0,0 +1,160 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Computer Village 1797 FDC + + http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/ComputerVillage_FDC.html + +**********************************************************************/ + + +#include "emu.h" +#include "cv1797.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(BBC_CV1797, bbc_cv1797_device, "bbc_cv1797", "Computer Village 1797 FDC") + + +//------------------------------------------------- +// MACHINE_DRIVER( cv1797 ) +//------------------------------------------------- + +FLOPPY_FORMATS_MEMBER( bbc_cv1797_device::floppy_formats ) + FLOPPY_ACORN_SSD_FORMAT, + FLOPPY_ACORN_DSD_FORMAT, + FLOPPY_FSD_FORMAT +FLOPPY_FORMATS_END0 + +static SLOT_INTERFACE_START( bbc_floppies_525 ) + SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD) + SLOT_INTERFACE("525sd", FLOPPY_525_SD) + SLOT_INTERFACE("525ssdd", FLOPPY_525_SSDD) + SLOT_INTERFACE("525dd", FLOPPY_525_DD) + SLOT_INTERFACE("525qd", FLOPPY_525_QD) +SLOT_INTERFACE_END + +ROM_START( cv1797 ) + ROM_REGION(0x4000, "dfs_rom", 0) + ROM_DEFAULT_BIOS("lvldos") + ROM_SYSTEM_BIOS(0, "lvldos", "LVL Dos 0.91") + ROMX_LOAD("lvldos91.rom", 0x0000, 0x2000, CRC(69d7653a) SHA1(9cd39d011290b97d5ba05b6c745689a8553be5fc), ROM_BIOS(1)) + ROM_RELOAD(0x2000, 0x2000) +ROM_END + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +MACHINE_CONFIG_MEMBER( bbc_cv1797_device::device_add_mconfig ) + MCFG_FD1797_ADD("fd1797", XTAL_8MHz / 8) + MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_cv1797_device, fdc_intrq_w)) + MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_cv1797_device, fdc_drq_w)) + MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(bbc_cv1797_device, motor_w)) + MCFG_FLOPPY_DRIVE_ADD("fd1797:0", bbc_floppies_525, "525qd", floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) + MCFG_FLOPPY_DRIVE_ADD("fd1797:1", bbc_floppies_525, "525qd", floppy_formats) + MCFG_FLOPPY_DRIVE_SOUND(true) +MACHINE_CONFIG_END + +const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const +{ + return ROM_NAME( cv1797 ); +} + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// bbc_cv1797_device - constructor +//------------------------------------------------- + +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_start - device-specific startup +//------------------------------------------------- + +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, read8_delegate(FUNC(fd1797_device::read), (fd1797_device *)m_fdc), write8_delegate(FUNC(fd1797_device::write), (fd1797_device *)m_fdc)); + space.install_readwrite_handler(0xfe84, 0xfe9f, read8_delegate(FUNC(bbc_cv1797_device::fd1797l_read), this), write8_delegate(FUNC(bbc_cv1797_device::fd1797l_write), this)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void bbc_cv1797_device::device_reset() +{ + machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base()); + + m_fdc->soft_reset(); +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ8_MEMBER(bbc_cv1797_device::fd1797l_read) +{ + return m_drive_control; +} + +WRITE8_MEMBER(bbc_cv1797_device::fd1797l_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(); +} + +WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_intrq_w) +{ + m_slot->intrq_w(state); +} + +WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_drq_w) +{ + m_slot->drq_w(state); +} + +WRITE_LINE_MEMBER(bbc_cv1797_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); +} diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h new file mode 100644 index 00000000000..b03385810f2 --- /dev/null +++ b/src/devices/bus/bbc/fdc/cv1797.h @@ -0,0 +1,66 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************** + + Computer Village 1797 FDC + +**********************************************************************/ + + +#ifndef MAME_BUS_BBC_FDC_CV1797_H +#define MAME_BUS_BBC_FDC_CV1797_H + +#pragma once + +#include "fdc.h" +#include "machine/wd_fdc.h" +#include "formats/acorn_dsk.h" +#include "formats/fsd_dsk.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class bbc_cv1797_device : + public device_t, + public device_bbc_fdc_interface + +{ +public: + static constexpr feature_type imperfect_features() { return feature::DISK; } + + // construction/destruction + bbc_cv1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const 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); + + required_memory_region m_dfs_rom; + required_device m_fdc; + required_device m_floppy0; + optional_device m_floppy1; + + int m_drive_control; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(BBC_CV1797, bbc_cv1797_device) + + +#endif /* MAME_BUS_BBC_FDC_CV1797_H */ diff --git a/src/devices/bus/bbc/fdc/fdc.cpp b/src/devices/bus/bbc/fdc/fdc.cpp index 89158ac6cea..35bbdacdebe 100644 --- a/src/devices/bus/bbc/fdc/fdc.cpp +++ b/src/devices/bus/bbc/fdc/fdc.cpp @@ -102,7 +102,7 @@ void bbc_fdc_slot_device::device_reset() // slot devices #include "acorn.h" #include "cumana.h" -//#include "cv1797.h" +#include "cv1797.h" //#include "microware.h" #include "opus.h" //#include "solidisk.h" @@ -115,7 +115,7 @@ SLOT_INTERFACE_START( bbc_fdc_devices ) SLOT_INTERFACE("acorn1770", BBC_ACORN1770) SLOT_INTERFACE("cumana1", BBC_CUMANA1) SLOT_INTERFACE("cumana2", BBC_CUMANA2) - //SLOT_INTERFACE("cv1797", BBC_CV1797) + SLOT_INTERFACE("cv1797", BBC_CV1797) //SLOT_INTERFACE("microware", BBC_MICROWARE) SLOT_INTERFACE("opus8272", BBC_OPUS8272) SLOT_INTERFACE("opus2791", BBC_OPUS2791)