summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/spectrum/opus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/spectrum/opus.cpp')
-rw-r--r--src/devices/bus/spectrum/opus.cpp53
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);
}