summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/fdc/opus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/fdc/opus.cpp')
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp82
1 files changed, 45 insertions, 37 deletions
diff --git a/src/devices/bus/bbc/fdc/opus.cpp b/src/devices/bus/bbc/fdc/opus.cpp
index c336cd71a24..85eb8f5e7e9 100644
--- a/src/devices/bus/bbc/fdc/opus.cpp
+++ b/src/devices/bus/bbc/fdc/opus.cpp
@@ -94,6 +94,7 @@ void bbc_opus8272_device::device_add_mconfig(machine_config &config)
I8272A(config, m_fdc, 0);
m_fdc->set_ready_line_connected(true);
m_fdc->intrq_wr_callback().set(FUNC(bbc_opus8272_device::fdc_intrq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -103,6 +104,7 @@ void bbc_opus2791_device::device_add_mconfig(machine_config &config)
WD2791(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -112,6 +114,7 @@ void bbc_opus2793_device::device_add_mconfig(machine_config &config)
WD2793(config, m_fdc, 16_MHz_XTAL / 16);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_opusfdc_device::motor_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -120,6 +123,7 @@ void bbc_opus1770_device::device_add_mconfig(machine_config &config)
{
WD1770(config, m_fdc, 16_MHz_XTAL / 2);
m_fdc->drq_wr_callback().set(FUNC(bbc_opusfdc_device::fdc_drq_w));
+
FLOPPY_CONNECTOR(config, m_floppy0, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, m_floppy1, bbc_floppies_525, "525qd", bbc_opusfdc_device::floppy_formats).enable_sound(true);
}
@@ -169,7 +173,8 @@ bbc_opusfdc_device::bbc_opusfdc_device(const machine_config &mconfig, device_typ
m_fdc(*this, "fdc"),
m_floppy0(*this, "fdc:0"),
m_floppy1(*this, "fdc:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -194,21 +199,11 @@ bbc_opus1770_device::bbc_opus1770_device(const machine_config &mconfig, const ch
void bbc_opus8272_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, 0xfe86, READ8_DELEGATE(bbc_opus8272_device, fdc_r), WRITE8_DELEGATE(bbc_opus8272_device, fdc_w));
}
void bbc_opusfdc_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, 0xfe83, read8sm_delegate(FUNC(wd_fdc_device_base::read), m_fdc.target()), write8sm_delegate(FUNC(wd_fdc_device_base::write), m_fdc.target()));
- space.install_readwrite_handler(0xfe84, 0xfe84, READ8_DELEGATE(bbc_opusfdc_device, ctrl_r), WRITE8_DELEGATE(bbc_opusfdc_device, ctrl_w));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -218,15 +213,11 @@ void bbc_opusfdc_device::device_start()
void bbc_opus8272_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
void bbc_opusfdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -234,11 +225,11 @@ void bbc_opusfdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_opus8272_device::fdc_r)
+READ8_MEMBER(bbc_opus8272_device::read)
{
uint8_t data = 0xff;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x02:
m_fdc->tc_w(true);
@@ -262,11 +253,11 @@ READ8_MEMBER(bbc_opus8272_device::fdc_r)
return data;
}
-WRITE8_MEMBER(bbc_opus8272_device::fdc_w)
+WRITE8_MEMBER(bbc_opus8272_device::write)
{
floppy_image_device *floppy = nullptr;
- switch (offset)
+ switch (offset & 0x07)
{
case 0x01:
switch (data & 0x01)
@@ -292,31 +283,48 @@ WRITE_LINE_MEMBER(bbc_opus8272_device::fdc_intrq_w)
}
-READ8_MEMBER(bbc_opusfdc_device::ctrl_r)
+READ8_MEMBER(bbc_opusfdc_device::read)
{
- return m_drive_control;
+ uint8_t data;
+
+ if (offset & 0x04)
+ {
+ data = m_drive_control;
+ }
+ else
+ {
+ data = m_fdc->read(offset & 0x03);
+ }
+ return data;
}
-WRITE8_MEMBER(bbc_opusfdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_opusfdc_device::write)
{
- floppy_image_device *floppy = nullptr;
+ if (offset & 0x04)
+ {
+ floppy_image_device *floppy = nullptr;
- m_drive_control = data;
+ m_drive_control = 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 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 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
- // bit 6: density
- m_fdc->dden_w(!BIT(data, 6));
+ // bit 6: density
+ m_fdc->dden_w(!BIT(data, 6));
+ }
+ else
+ {
+ m_fdc->write(offset & 0x03, data);
+ }
}
WRITE_LINE_MEMBER(bbc_opusfdc_device::fdc_drq_w)