diff options
Diffstat (limited to 'src/devices/bus/spectrum/opus.cpp')
-rw-r--r-- | src/devices/bus/spectrum/opus.cpp | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/devices/bus/spectrum/opus.cpp b/src/devices/bus/spectrum/opus.cpp index 88eb2deb6a3..fef2107cb72 100644 --- a/src/devices/bus/spectrum/opus.cpp +++ b/src/devices/bus/spectrum/opus.cpp @@ -6,9 +6,11 @@ **********************************************************************/ - #include "emu.h" #include "opus.h" +#include "softlist_dev.h" + +#include "formats/opd_dsk.h" //************************************************************************** @@ -44,9 +46,11 @@ ioport_constructor spectrum_opus_device::device_input_ports() const // MACHINE_DRIVER( opus ) //------------------------------------------------- -FLOPPY_FORMATS_MEMBER( spectrum_opus_device::floppy_formats ) - FLOPPY_OPD_FORMAT -FLOPPY_FORMATS_END +void spectrum_opus_device::floppy_formats(format_registration &fr) +{ + fr.add_mfm_containers(); + fr.add(FLOPPY_OPD_FORMAT); +} static void spectrum_floppies(device_slot_interface &device) { @@ -79,8 +83,8 @@ void spectrum_opus_device::device_add_mconfig(machine_config &config) WD1770(config, m_fdc, 16_MHz_XTAL / 2); m_fdc->drq_wr_callback().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w)); - FLOPPY_CONNECTOR(config, "fdc:0", spectrum_floppies, "35dd", spectrum_opus_device::floppy_formats).enable_sound(true); - FLOPPY_CONNECTOR(config, "fdc:1", spectrum_floppies, "35dd", spectrum_opus_device::floppy_formats).enable_sound(true); + for (auto &floppy : m_floppy) + FLOPPY_CONNECTOR(config, floppy, spectrum_floppies, "35dd", spectrum_opus_device::floppy_formats).enable_sound(true); /* parallel printer port */ CENTRONICS(config, m_centronics, centronics_devices, "printer"); @@ -88,7 +92,7 @@ void spectrum_opus_device::device_add_mconfig(machine_config &config) m_centronics->busy_handler().set(FUNC(spectrum_opus_device::busy_w)); /* pia */ - PIA6821(config, m_pia, 0); + PIA6821(config, m_pia); m_pia->writepa_handler().set(FUNC(spectrum_opus_device::pia_out_a)); m_pia->writepb_handler().set(FUNC(spectrum_opus_device::pia_out_b)); m_pia->cb2_handler().set("centronics", FUNC(centronics_device::write_strobe)); @@ -99,6 +103,7 @@ void spectrum_opus_device::device_add_mconfig(machine_config &config) /* passthru without NMI */ SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr); m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w)); + m_exp->fb_r_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::fb_r)); } const tiny_rom_entry *spectrum_opus_device::device_rom_region() const @@ -122,8 +127,7 @@ spectrum_opus_device::spectrum_opus_device(const machine_config &mconfig, const , m_rom(*this, "rom") , m_pia(*this, "pia") , m_fdc(*this, "fdc") - , m_floppy0(*this, "fdc:0") - , m_floppy1(*this, "fdc:1") + , m_floppy(*this, "fdc:%u", 0U) , m_centronics(*this, "centronics") , m_exp(*this, "exp") { @@ -139,7 +143,6 @@ void spectrum_opus_device::device_start() save_item(NAME(m_romcs)); save_item(NAME(m_ram)); - save_item(NAME(m_last_pc)); } //------------------------------------------------- @@ -149,7 +152,6 @@ void spectrum_opus_device::device_start() void spectrum_opus_device::device_reset() { m_romcs = 0; - m_last_pc = 0x0000; } @@ -157,18 +159,18 @@ void spectrum_opus_device::device_reset() // IMPLEMENTATION //************************************************************************** -READ_LINE_MEMBER(spectrum_opus_device::romcs) +bool spectrum_opus_device::romcs() { - return m_romcs | m_exp->romcs(); + return m_romcs || m_exp->romcs(); } -void spectrum_opus_device::pre_opcode_fetch(offs_t offset) +void spectrum_opus_device::post_opcode_fetch(offs_t offset) { - m_exp->pre_opcode_fetch(offset); + m_exp->post_opcode_fetch(offset); if (!machine().side_effects_disabled()) { - switch (m_last_pc) + switch (offset) { case 0x0008: case 0x0048: case 0x1708: m_romcs = 1; @@ -178,7 +180,6 @@ void spectrum_opus_device::pre_opcode_fetch(offs_t offset) break; } } - m_last_pc = offset; } uint8_t spectrum_opus_device::iorq_r(offs_t offset) @@ -188,16 +189,11 @@ uint8_t spectrum_opus_device::iorq_r(offs_t offset) // PIA bit 7 is enable joystick and selected on A5 only if (!BIT(m_pia->a_output(), 7) && (~offset & 0x20)) { - data &= m_joy->read() & 0x1f; + data = m_joy->read() & 0x1f; } return data; } -void spectrum_opus_device::iorq_w(offs_t offset, uint8_t data) -{ - m_exp->iorq_w(offset, data); -} - uint8_t spectrum_opus_device::mreq_r(offs_t offset) { uint8_t data = 0xff; @@ -255,13 +251,13 @@ void spectrum_opus_device::mreq_w(offs_t offset, uint8_t data) m_exp->mreq_w(offset, data); } -WRITE8_MEMBER(spectrum_opus_device::pia_out_a) +void spectrum_opus_device::pia_out_a(uint8_t data) { floppy_image_device *floppy = nullptr; // bit 0, 1: drive select - if (!BIT(data, 0)) floppy = m_floppy1->get_device(); - if (!BIT(data, 1)) floppy = m_floppy0->get_device(); + if (!BIT(data, 0)) floppy = m_floppy[1]->get_device(); + if (!BIT(data, 1)) floppy = m_floppy[0]->get_device(); m_fdc->set_floppy(floppy); // bit 4: side select @@ -272,8 +268,9 @@ WRITE8_MEMBER(spectrum_opus_device::pia_out_a) m_fdc->dden_w(BIT(data, 5)); } -WRITE8_MEMBER(spectrum_opus_device::pia_out_b) +void spectrum_opus_device::pia_out_b(uint8_t data) { + m_centronics->write_data0(BIT(data, 0)); m_centronics->write_data1(BIT(data, 1)); m_centronics->write_data2(BIT(data, 2)); m_centronics->write_data3(BIT(data, 3)); @@ -283,7 +280,7 @@ WRITE8_MEMBER(spectrum_opus_device::pia_out_b) m_centronics->write_data7(BIT(data, 7)); } -WRITE_LINE_MEMBER(spectrum_opus_device::busy_w) +void spectrum_opus_device::busy_w(int state) { m_pia->set_a_input(state << 6); } |