summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/fdc
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2020-06-17 15:40:54 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2020-06-17 15:48:26 +0100
commitc6d5c5e7d276579e2598db677ac56bc636f545d3 (patch)
treef3f9af9bb25c1f1724b8cd99bebd23b4fb879bb7 /src/devices/bus/bbc/fdc
parentfb3758b6675450a12767c1ab6b621bff5b727836 (diff)
bbc_cv1797: Implemented side and motor control, and now works.
Diffstat (limited to 'src/devices/bus/bbc/fdc')
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp60
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h11
2 files changed, 32 insertions, 39 deletions
diff --git a/src/devices/bus/bbc/fdc/cv1797.cpp b/src/devices/bus/bbc/fdc/cv1797.cpp
index cc29926e692..752b8d80128 100644
--- a/src/devices/bus/bbc/fdc/cv1797.cpp
+++ b/src/devices/bus/bbc/fdc/cv1797.cpp
@@ -6,6 +6,10 @@
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/ComputerVillage_FDC.html
+ Notes:
+ Everything seems to work, but schematic required to confirm implementation
+ of side and motor control.
+
**********************************************************************/
@@ -59,12 +63,12 @@ ROM_END
void bbc_cv1797_device::device_add_mconfig(machine_config &config)
{
FD1797(config, m_fdc, 8_MHz_XTAL / 8);
- m_fdc->intrq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::intrq_w));
m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(bbc_fdc_slot_device::drq_w));
- m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::motor_w));
+ m_fdc->sso_wr_callback().set(FUNC(bbc_cv1797_device::fdc_sso_w));
+ m_fdc->hld_wr_callback().set(FUNC(bbc_cv1797_device::fdc_hld_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);
+ FLOPPY_CONNECTOR(config, m_floppies[0], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppies[1], bbc_floppies_525, "525qd", floppy_formats).enable_sound(true);
}
const tiny_rom_entry *bbc_cv1797_device::device_rom_region() const
@@ -84,9 +88,8 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
: device_t(mconfig, BBC_CV1797, tag, owner, clock)
, device_bbc_fdc_interface(mconfig, *this)
, m_fdc(*this, "fd1797")
- , m_floppy0(*this, "fd1797:0")
- , m_floppy1(*this, "fd1797:1")
- , m_drive_control(0)
+ , m_floppies(*this, "fd1797:%u", 0)
+ , m_floppy(nullptr)
{
}
@@ -96,7 +99,6 @@ bbc_cv1797_device::bbc_cv1797_device(const machine_config &mconfig, const char *
void bbc_cv1797_device::device_start()
{
- save_item(NAME(m_drive_control));
}
@@ -110,11 +112,11 @@ uint8_t bbc_cv1797_device::read(offs_t offset)
if (offset & 0x04)
{
- data = m_fdc->read(offset & 0x03);
+ data = 0xfe;
}
else
{
- data = m_drive_control;
+ data = m_fdc->read(offset & 0x03);
}
return data;
}
@@ -123,36 +125,30 @@ void bbc_cv1797_device::write(offs_t offset, uint8_t data)
{
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);
+ m_floppy = m_floppies[BIT(data, 0)]->get_device();
+ m_fdc->set_floppy(m_floppy);
// bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ if (m_floppy)
+ m_floppy->ss_w(BIT(data, 1));
// bit 2: density
m_fdc->dden_w(!BIT(data, 2));
-
- // bit 6: reset
- //m_fdc->mr_w(!BIT(data, 6));
}
+ else
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
+}
+
+WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_sso_w)
+{
+ // TODO: schematic required to confirm usage.
}
-WRITE_LINE_MEMBER(bbc_cv1797_device::motor_w)
+WRITE_LINE_MEMBER(bbc_cv1797_device::fdc_hld_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);
+ if (m_floppy)
+ m_floppy->mon_w(!state);
}
diff --git a/src/devices/bus/bbc/fdc/cv1797.h b/src/devices/bus/bbc/fdc/cv1797.h
index 86207c8fcd0..8f0b272be86 100644
--- a/src/devices/bus/bbc/fdc/cv1797.h
+++ b/src/devices/bus/bbc/fdc/cv1797.h
@@ -27,8 +27,6 @@ class bbc_cv1797_device :
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);
@@ -46,13 +44,12 @@ protected:
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_sso_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
required_device<fd1797_device> m_fdc;
- required_device<floppy_connector> m_floppy0;
- optional_device<floppy_connector> m_floppy1;
-
- int m_drive_control;
+ required_device_array<floppy_connector, 2> m_floppies;
+ floppy_image_device* m_floppy;
};