summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/bbc/fdc/cumana.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/bbc/fdc/cumana.cpp')
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp105
1 files changed, 57 insertions, 48 deletions
diff --git a/src/devices/bus/bbc/fdc/cumana.cpp b/src/devices/bus/bbc/fdc/cumana.cpp
index 5639fef1976..4de4c9df704 100644
--- a/src/devices/bus/bbc/fdc/cumana.cpp
+++ b/src/devices/bus/bbc/fdc/cumana.cpp
@@ -65,6 +65,7 @@ void bbc_cumana1_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_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);
}
@@ -75,6 +76,7 @@ void bbc_cumana2_device::device_add_mconfig(machine_config &config)
m_fdc->intrq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_intrq_w));
m_fdc->drq_wr_callback().set(FUNC(bbc_cumanafdc_device::fdc_drq_w));
m_fdc->hld_wr_callback().set(FUNC(bbc_cumanafdc_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);
}
@@ -104,7 +106,8 @@ bbc_cumanafdc_device::bbc_cumanafdc_device(const machine_config &mconfig, device
m_fdc(*this, "mb8877a"),
m_floppy0(*this, "mb8877a:0"),
m_floppy1(*this, "mb8877a:1"),
- m_dfs_rom(*this, "dfs_rom")
+ m_dfs_rom(*this, "dfs_rom"),
+ m_drive_control(0)
{
}
@@ -127,12 +130,7 @@ bbc_cumana2_device::bbc_cumana2_device(const machine_config &mconfig, const char
void bbc_cumanafdc_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, READ8_DELEGATE(bbc_cumanafdc_device, ctrl_r), WRITE8_DELEGATE(bbc_cumanafdc_device, ctrl_w));
- space.install_readwrite_handler(0xfe84, 0xfe9f, read8sm_delegate(FUNC(mb8877_device::read), m_fdc.target()), write8sm_delegate(FUNC(mb8877_device::write), m_fdc.target()));
+ save_item(NAME(m_drive_control));
}
//-------------------------------------------------
@@ -142,8 +140,6 @@ void bbc_cumanafdc_device::device_start()
void bbc_cumanafdc_device::device_reset()
{
machine().root_device().membank("bank4")->configure_entry(12, memregion("dfs_rom")->base());
-
- m_fdc->soft_reset();
}
@@ -151,47 +147,66 @@ void bbc_cumanafdc_device::device_reset()
// IMPLEMENTATION
//**************************************************************************
-READ8_MEMBER(bbc_cumanafdc_device::ctrl_r)
+READ8_MEMBER(bbc_cumanafdc_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_cumanafdc_device::ctrl_w)
+WRITE8_MEMBER(bbc_cumanafdc_device::write)
{
- floppy_image_device *floppy = nullptr;
-
- m_drive_control = data;
-
- // bit 0: drive select
- floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
- floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
- floppy = (BIT(data, 0) ? floppy1 : floppy0);
- m_fdc->set_floppy(floppy);
-
- // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify
- if (m_invert)
+ if (offset & 0x04)
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(!BIT(data, 1));
-
- // bit 2: density
- m_fdc->dden_w(!BIT(data, 2));
+ m_fdc->write(offset & 0x03, data);
}
else
{
- // bit 1: side select
- if (floppy)
- floppy->ss_w(BIT(data, 1));
+ floppy_image_device *floppy = nullptr;
- // bit 2: density
- m_fdc->dden_w(BIT(data, 2));
- }
- // bit 3: reset
- if (BIT(data, 3)) m_fdc->soft_reset();
+ 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);
+
+ // Not sure why QFS 1.02 inverts these two bits, need to see an original board to verify
+ if (m_invert)
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(!BIT(data, 1));
- // bit 4: interrupt enable
- m_fdc_ie = BIT(data, 4);
+ // bit 2: density
+ m_fdc->dden_w(!BIT(data, 2));
+ }
+ else
+ {
+ // bit 1: side select
+ if (floppy)
+ floppy->ss_w(BIT(data, 1));
+
+ // bit 2: density
+ m_fdc->dden_w(BIT(data, 2));
+ }
+ // bit 3: reset
+ if (BIT(data, 3)) m_fdc->soft_reset();
+
+ // bit 4: interrupt enable
+ m_fdc_ie = BIT(data, 4);
+ }
}
WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_intrq_w)
@@ -208,12 +223,6 @@ WRITE_LINE_MEMBER(bbc_cumanafdc_device::fdc_drq_w)
WRITE_LINE_MEMBER(bbc_cumanafdc_device::motor_w)
{
- for (int i = 0; i != 2; i++) {
- char devname[8];
- sprintf(devname, "%d", i);
- floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
- if (con) {
- con->get_device()->mon_w(!state);
- }
- }
+ if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(!state);
+ if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(!state);
}