diff options
Diffstat (limited to 'src/devices/bus/bbc/fdc/opus.cpp')
-rw-r--r-- | src/devices/bus/bbc/fdc/opus.cpp | 82 |
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) |