summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/fdc/cv1797.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/fdc/cv1797.cpp')
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp86
1 files changed, 50 insertions, 36 deletions
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<bbc_fdc_slot_device *>(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)