diff options
Diffstat (limited to 'src/devices/bus/spectrum')
24 files changed, 654 insertions, 178 deletions
diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp index 09ad184f475..e888e5bb01b 100644 --- a/src/devices/bus/spectrum/exp.cpp +++ b/src/devices/bus/spectrum/exp.cpp @@ -43,7 +43,6 @@ device_spectrum_expansion_interface::device_spectrum_expansion_interface(const m spectrum_expansion_slot_device::spectrum_expansion_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SPECTRUM_EXPANSION_SLOT, tag, owner, clock), device_slot_interface(mconfig, *this), - m_io(*this, finder_base::DUMMY_TAG, -1), m_card(nullptr), m_irq_handler(*this), m_nmi_handler(*this) @@ -52,23 +51,6 @@ spectrum_expansion_slot_device::spectrum_expansion_slot_device(const machine_con //------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void spectrum_expansion_slot_device::device_config_complete() -{ - // for passthrough connectors, use the parent slot's I/O space - if (m_io.finder_tag() == finder_base::DUMMY_TAG && dynamic_cast<device_spectrum_expansion_interface *>(owner()) != nullptr) - { - auto parent = dynamic_cast<spectrum_expansion_slot_device *>(owner()->owner()); - if (parent != nullptr) - m_io.set_tag(parent->m_io, parent->m_io.spacenum()); - } -} - -//------------------------------------------------- // device_validity_check - device-specific checks //------------------------------------------------- @@ -104,27 +86,47 @@ void spectrum_expansion_slot_device::device_reset() } //------------------------------------------------- -// port_fe_r +// romcs //------------------------------------------------- -uint8_t spectrum_expansion_slot_device::port_fe_r(offs_t offset) +READ_LINE_MEMBER(spectrum_expansion_slot_device::romcs) { if (m_card) - return m_card->port_fe_r(offset); + return m_card->romcs(); else - return 0xff; + return 0; } //------------------------------------------------- -// romcs +// fetch_r //------------------------------------------------- -READ_LINE_MEMBER(spectrum_expansion_slot_device::romcs) +void spectrum_expansion_slot_device::opcode_fetch(offs_t offset) { if (m_card) - return m_card->romcs(); + m_card->opcode_fetch(offset); +} + +//------------------------------------------------- +// iorq_r +//------------------------------------------------- + +uint8_t spectrum_expansion_slot_device::iorq_r(offs_t offset) +{ + if (m_card) + return m_card->iorq_r(offset); else - return 0; + return 0xff; +} + +//------------------------------------------------- +// iorq_w +//------------------------------------------------- + +void spectrum_expansion_slot_device::iorq_w(offs_t offset, uint8_t data) +{ + if (m_card) + m_card->iorq_w(offset, data); } //------------------------------------------------- @@ -156,13 +158,18 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data) // slot devices +//#include "beta.h" +//#include "disciple.h" #include "intf1.h" #include "intf2.h" #include "fuller.h" #include "kempjoy.h" #include "melodik.h" +#include "mface.h" #include "mikroplus.h" +//#include "opus.h" #include "plus2test.h" +//#include "plusd.h" #include "protek.h" #include "uslot.h" #include "usource.h" @@ -171,12 +178,20 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data) void spectrum_expansion_devices(device_slot_interface &device) { + //device.option_add("beta", SPECTRUM_BETA); + //device.option_add("betaplus", SPECTRUM_BETAPLUS); + //device.option_add("disciple", SPECTRUM_DISCIPLE); device.option_add("intf1", SPECTRUM_INTF1); device.option_add("intf2", SPECTRUM_INTF2); device.option_add("fuller", SPECTRUM_FULLER); device.option_add("kempjoy", SPECTRUM_KEMPJOY); device.option_add("melodik", SPECTRUM_MELODIK); + device.option_add("mface1", SPECTRUM_MFACE1); + device.option_add("mface128", SPECTRUM_MFACE128); device.option_add("mikroplus", SPECTRUM_MIKROPLUS); + device.option_add("mprint", SPECTRUM_MPRINT); + //device.option_add("opus", SPECTRUM_OPUS); + //device.option_add("plusd", SPECTRUM_PLUSD); device.option_add("protek", SPECTRUM_PROTEK); device.option_add("uslot", SPECTRUM_USLOT); device.option_add("usource", SPECTRUM_USOURCE); @@ -185,15 +200,20 @@ void spectrum_expansion_devices(device_slot_interface &device) void spec128_expansion_devices(device_slot_interface &device) { + //device.option_add("beta128", SPECTRUM_BETA128); + //device.option_add("disciple", SPECTRUM_DISCIPLE); device.option_add("intf1", SPECTRUM_INTF1); device.option_add("intf2", SPECTRUM_INTF2); device.option_add("kempjoy", SPECTRUM_KEMPJOY); + device.option_add("mface128", SPECTRUM_MFACE128); device.option_add("mikroplus", SPECTRUM_MIKROPLUS); + device.option_add("mprint", SPECTRUM_MPRINT); device.option_add("plus2test", SPECTRUM_PLUS2TEST); device.option_add("protek", SPECTRUM_PROTEK); } void specpls3_expansion_devices(device_slot_interface &device) { + device.option_add("mface3", SPECTRUM_MFACE3); } diff --git a/src/devices/bus/spectrum/exp.h b/src/devices/bus/spectrum/exp.h index 81e654a9867..aee398d1ab4 100644 --- a/src/devices/bus/spectrum/exp.h +++ b/src/devices/bus/spectrum/exp.h @@ -69,25 +69,22 @@ public: spectrum_expansion_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock = 0); - template <typename T> void set_io_space(T &&tag, int spacenum) { m_io.set_tag(std::forward<T>(tag), spacenum); } - // callbacks auto irq_handler() { return m_irq_handler.bind(); } auto nmi_handler() { return m_nmi_handler.bind(); } + void opcode_fetch(offs_t offset); uint8_t mreq_r(offs_t offset); void mreq_w(offs_t offset, uint8_t data); - uint8_t port_fe_r(offs_t offset); + uint8_t iorq_r(offs_t offset); + void iorq_w(offs_t offset, uint8_t data); DECLARE_READ_LINE_MEMBER( romcs ); DECLARE_WRITE_LINE_MEMBER( irq_w ) { m_irq_handler(state); } DECLARE_WRITE_LINE_MEMBER( nmi_w ) { m_nmi_handler(state); } - required_address_space m_io; - protected: // device-level overrides - virtual void device_config_complete() override; virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override; virtual void device_reset() override; @@ -109,14 +106,14 @@ public: device_spectrum_expansion_interface(const machine_config &mconfig, device_t &device); // reading and writing + virtual void opcode_fetch(offs_t offset) { }; virtual uint8_t mreq_r(offs_t offset) { return 0xff; } virtual void mreq_w(offs_t offset, uint8_t data) { } - virtual uint8_t port_fe_r(offs_t offset) { return 0xff; } + virtual uint8_t iorq_r(offs_t offset) { return 0xff; } + virtual void iorq_w(offs_t offset, uint8_t data) { } virtual DECLARE_READ_LINE_MEMBER(romcs) { return 0; } protected: - address_space &io_space() { return *m_slot->m_io; } - spectrum_expansion_slot_device *m_slot; }; diff --git a/src/devices/bus/spectrum/fuller.cpp b/src/devices/bus/spectrum/fuller.cpp index 4a1e70905c2..636967cbdd6 100644 --- a/src/devices/bus/spectrum/fuller.cpp +++ b/src/devices/bus/spectrum/fuller.cpp @@ -84,35 +84,28 @@ void spectrum_fuller_device::device_start() } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void spectrum_fuller_device::device_reset() -{ - io_space().install_write_handler(0x3f, 0x3f, 0, 0xff00, 0, write8smo_delegate(FUNC(ay8910_device::address_w), m_psg.target())); - io_space().install_readwrite_handler(0x5f, 0x5f, 0, 0xff00, 0, read8smo_delegate(FUNC(ay8910_device::data_r), m_psg.target()), write8smo_delegate(FUNC(ay8910_device::data_w), m_psg.target())); - io_space().install_read_handler(0x7f, 0x7f, 0, 0xff00, 0, read8smo_delegate(FUNC(spectrum_fuller_device::joystick_r), this)); -} - - //************************************************************************** // IMPLEMENTATION //************************************************************************** -uint8_t spectrum_fuller_device::joystick_r() +READ_LINE_MEMBER(spectrum_fuller_device::romcs) { - return m_joy->read() | (0xff ^ 0x8f); + return m_exp->romcs(); } -READ_LINE_MEMBER(spectrum_fuller_device::romcs) +void spectrum_fuller_device::opcode_fetch(offs_t offset) { - return m_exp->romcs(); + m_exp->opcode_fetch(offset); } uint8_t spectrum_fuller_device::mreq_r(offs_t offset) { - return m_exp->mreq_r(offset); + uint8_t data = 0xff; + + if (m_exp->romcs()) + data &= m_exp->mreq_r(offset); + + return data; } void spectrum_fuller_device::mreq_w(offs_t offset, uint8_t data) @@ -121,12 +114,32 @@ void spectrum_fuller_device::mreq_w(offs_t offset, uint8_t data) m_exp->mreq_w(offset, data); } -uint8_t spectrum_fuller_device::port_fe_r(offs_t offset) +uint8_t spectrum_fuller_device::iorq_r(offs_t offset) { - uint8_t data = 0xff; - - if (m_exp->romcs()) - data &= m_exp->port_fe_r(offset); - + uint8_t data = m_exp->iorq_r(offset); + + switch (offset & 0xff) + { + case 0x5f: + data &= m_psg->data_r(); + break; + case 0x7f: + data &= m_joy->read() | (0xff ^ 0x8f); + break; + } return data; } + +void spectrum_fuller_device::iorq_w(offs_t offset, uint8_t data) +{ + switch (offset & 0xff) + { + case 0x3f: + m_psg->address_w(data); + break; + case 0x5f: + m_psg->data_w(data); + break; + } + m_exp->iorq_w(offset, data); +} diff --git a/src/devices/bus/spectrum/fuller.h b/src/devices/bus/spectrum/fuller.h index a071333f04b..12f7805eff0 100644 --- a/src/devices/bus/spectrum/fuller.h +++ b/src/devices/bus/spectrum/fuller.h @@ -32,20 +32,19 @@ public: protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; // optional information overrides virtual void device_add_mconfig(machine_config &config) override; virtual ioport_constructor device_input_ports() const override; + virtual void opcode_fetch(offs_t offset) override; virtual uint8_t mreq_r(offs_t offset) override; virtual void mreq_w(offs_t offset, uint8_t data) override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; private: - uint8_t joystick_r(); - required_device<spectrum_expansion_slot_device> m_exp; required_device<ay8910_device> m_psg; required_ioport m_joy; diff --git a/src/devices/bus/spectrum/intf1.cpp b/src/devices/bus/spectrum/intf1.cpp index d39d529e87f..344aaf61841 100644 --- a/src/devices/bus/spectrum/intf1.cpp +++ b/src/devices/bus/spectrum/intf1.cpp @@ -85,6 +85,7 @@ spectrum_intf1_device::spectrum_intf1_device(const machine_config &mconfig, cons void spectrum_intf1_device::device_start() { + save_item(NAME(m_romcs)); } //------------------------------------------------- @@ -105,29 +106,33 @@ READ_LINE_MEMBER(spectrum_intf1_device::romcs) return m_romcs | m_exp->romcs(); } -uint8_t spectrum_intf1_device::mreq_r(offs_t offset) +void spectrum_intf1_device::opcode_fetch(offs_t offset) { - uint8_t temp; - uint8_t data = 0xff; + m_exp->opcode_fetch(offset); if (!machine().side_effects_disabled()) { - if (offset == 0x0008 || offset == 0x1708) + switch (offset) + { + case 0x0008: case 0x1708: m_romcs = 1; + break; + case 0x0700: + m_romcs = 0; + break; + } } +} - temp = m_exp->mreq_r(offset); - if (m_exp->romcs()) - data &= temp; +uint8_t spectrum_intf1_device::mreq_r(offs_t offset) +{ + uint8_t data = 0xff; if (m_romcs) data &= m_rom->base()[offset & 0x1fff]; - if (!machine().side_effects_disabled()) - { - if (offset == 0x0700) - m_romcs = 0; - } + if (m_exp->romcs()) + data &= m_exp->mreq_r(offset); return data; } @@ -138,12 +143,12 @@ void spectrum_intf1_device::mreq_w(offs_t offset, uint8_t data) m_exp->mreq_w(offset, data); } -uint8_t spectrum_intf1_device::port_fe_r(offs_t offset) +uint8_t spectrum_intf1_device::iorq_r(offs_t offset) { - uint8_t data = 0xff; - - if (m_exp->romcs()) - data &= m_exp->port_fe_r(offset); + return m_exp->iorq_r(offset); +} - return data; +void spectrum_intf1_device::iorq_w(offs_t offset, uint8_t data) +{ + m_exp->iorq_w(offset, data); } diff --git a/src/devices/bus/spectrum/intf1.h b/src/devices/bus/spectrum/intf1.h index fc3c3116231..6b0ddb32804 100644 --- a/src/devices/bus/spectrum/intf1.h +++ b/src/devices/bus/spectrum/intf1.h @@ -36,9 +36,11 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + virtual void opcode_fetch(offs_t offset) override; virtual uint8_t mreq_r(offs_t offset) override; virtual void mreq_w(offs_t offset, uint8_t data) override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; private: diff --git a/src/devices/bus/spectrum/intf2.cpp b/src/devices/bus/spectrum/intf2.cpp index fb10aaef309..789be29717d 100644 --- a/src/devices/bus/spectrum/intf2.cpp +++ b/src/devices/bus/spectrum/intf2.cpp @@ -125,17 +125,20 @@ uint8_t spectrum_intf2_device::mreq_r(offs_t offset) return 0xff; } -uint8_t spectrum_intf2_device::port_fe_r(offs_t offset) +uint8_t spectrum_intf2_device::iorq_r(offs_t offset) { uint8_t data = 0xff; - uint8_t lines = offset >> 8; - - if ((lines & 8) == 0) - data = m_exp_line3->read() | (0xff ^ 0x1f); + switch (offset & 0xff) + { + case 0xfe: + if (((offset >> 8) & 8) == 0) + data = m_exp_line3->read() | (0xff ^ 0x1f); - if ((lines & 16) == 0) - data = m_exp_line4->read() | (0xff ^ 0x1f); + if (((offset >> 8) & 16) == 0) + data = m_exp_line4->read() | (0xff ^ 0x1f); + break; + } return data; } diff --git a/src/devices/bus/spectrum/intf2.h b/src/devices/bus/spectrum/intf2.h index d5a8cc54142..fd131112a3c 100644 --- a/src/devices/bus/spectrum/intf2.h +++ b/src/devices/bus/spectrum/intf2.h @@ -36,7 +36,7 @@ protected: virtual DECLARE_READ_LINE_MEMBER(romcs) override; virtual uint8_t mreq_r(offs_t offset) override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; private: image_init_result load_cart(device_image_interface &image, generic_slot_device *slot); diff --git a/src/devices/bus/spectrum/kempjoy.cpp b/src/devices/bus/spectrum/kempjoy.cpp index 79cf4d83eb3..a433d615e8c 100644 --- a/src/devices/bus/spectrum/kempjoy.cpp +++ b/src/devices/bus/spectrum/kempjoy.cpp @@ -65,21 +65,17 @@ void spectrum_kempjoy_device::device_start() } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void spectrum_kempjoy_device::device_reset() -{ - io_space().install_read_handler(0x1f, 0x1f, 0, 0xff00, 0, read8smo_delegate(FUNC(spectrum_kempjoy_device::joystick_r), this)); -} - - //************************************************************************** // IMPLEMENTATION //************************************************************************** -uint8_t spectrum_kempjoy_device::joystick_r() +uint8_t spectrum_kempjoy_device::iorq_r(offs_t offset) { - return m_joy->read() & 0x1f; + uint8_t data = 0xff; + + if (offset == 0x1f) + { + data = m_joy->read() & 0x1f; + } + return data; } diff --git a/src/devices/bus/spectrum/kempjoy.h b/src/devices/bus/spectrum/kempjoy.h index 78cd549b537..466dceb7517 100644 --- a/src/devices/bus/spectrum/kempjoy.h +++ b/src/devices/bus/spectrum/kempjoy.h @@ -31,14 +31,13 @@ public: protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; // optional information overrides virtual ioport_constructor device_input_ports() const override; -private: - uint8_t joystick_r(); + virtual uint8_t iorq_r(offs_t offset) override; +private: required_ioport m_joy; }; diff --git a/src/devices/bus/spectrum/melodik.cpp b/src/devices/bus/spectrum/melodik.cpp index 3b5eba9f343..f6001bac35c 100644 --- a/src/devices/bus/spectrum/melodik.cpp +++ b/src/devices/bus/spectrum/melodik.cpp @@ -60,16 +60,6 @@ void spectrum_melodik_device::device_start() } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void spectrum_melodik_device::device_reset() -{ - io_space().install_write_handler(0x8000, 0x8000, 0, 0x3ffd, 0, write8smo_delegate(FUNC(ay8910_device::address_w), m_psg.target())); - io_space().install_readwrite_handler(0xc000, 0xc000, 0, 0x3ffd, 0, read8smo_delegate(FUNC(ay8910_device::data_r), m_psg.target()), write8smo_delegate(FUNC(ay8910_device::data_w), m_psg.target())); -} - //************************************************************************** // IMPLEMENTATION //************************************************************************** @@ -79,9 +69,19 @@ READ_LINE_MEMBER(spectrum_melodik_device::romcs) return m_exp->romcs(); } +void spectrum_melodik_device::opcode_fetch(offs_t offset) +{ + m_exp->opcode_fetch(offset); +} + uint8_t spectrum_melodik_device::mreq_r(offs_t offset) { - return m_exp->mreq_r(offset); + uint8_t data = 0xff; + + if (m_exp->romcs()) + data &= m_exp->mreq_r(offset); + + return data; } void spectrum_melodik_device::mreq_w(offs_t offset, uint8_t data) @@ -90,12 +90,29 @@ void spectrum_melodik_device::mreq_w(offs_t offset, uint8_t data) m_exp->mreq_w(offset, data); } -uint8_t spectrum_melodik_device::port_fe_r(offs_t offset) +uint8_t spectrum_melodik_device::iorq_r(offs_t offset) { - uint8_t data = 0xff; - - if (m_exp->romcs()) - data &= m_exp->port_fe_r(offset); - + uint8_t data = m_exp->iorq_r(offset); + + switch (offset & 0xc002) + { + case 0xc000: + data &= m_psg->data_r(); + break; + } return data; } + +void spectrum_melodik_device::iorq_w(offs_t offset, uint8_t data) +{ + switch (offset & 0xc002) + { + case 0x8000: + m_psg->address_w(data); + break; + case 0xc000: + m_psg->data_w(data); + break; + } + m_exp->iorq_w(offset, data); +}
\ No newline at end of file diff --git a/src/devices/bus/spectrum/melodik.h b/src/devices/bus/spectrum/melodik.h index ea8603a3355..4300d946cd4 100644 --- a/src/devices/bus/spectrum/melodik.h +++ b/src/devices/bus/spectrum/melodik.h @@ -32,14 +32,15 @@ public: protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; // optional information overrides virtual void device_add_mconfig(machine_config &config) override; + virtual void opcode_fetch(offs_t offset) override; virtual uint8_t mreq_r(offs_t offset) override; virtual void mreq_w(offs_t offset, uint8_t data) override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; private: diff --git a/src/devices/bus/spectrum/mface.cpp b/src/devices/bus/spectrum/mface.cpp new file mode 100644 index 00000000000..526e3a475d0 --- /dev/null +++ b/src/devices/bus/spectrum/mface.cpp @@ -0,0 +1,321 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************* + + Romantic Robot Multiface One/128/3 + +*********************************************************************/ + +#include "emu.h" +#include "mface.h" + + +/*************************************************************************** + DEVICE DEFINITIONS +***************************************************************************/ + +DEFINE_DEVICE_TYPE(SPECTRUM_MFACE1, spectrum_mface1_device, "spectrum_mface1", "Multiface One") +DEFINE_DEVICE_TYPE(SPECTRUM_MFACE128, spectrum_mface128_device, "spectrum_mface128", "Multiface 128") +DEFINE_DEVICE_TYPE(SPECTRUM_MFACE3, spectrum_mface3_device, "spectrum_mface3", "Multiface 3") +DEFINE_DEVICE_TYPE(SPECTRUM_MPRINT, spectrum_mprint_device, "spectrum_mprint", "MultiPrint") + + +//------------------------------------------------- +// INPUT_PORTS( mface ) +//------------------------------------------------- + +INPUT_PORTS_START(mface) + PORT_START("BUTTON") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Multiface") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, spectrum_mface1_device, magic_button, nullptr) +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor spectrum_mface1_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(mface); +} + +//------------------------------------------------- +// ROM( mface1 ) +//------------------------------------------------- + +ROM_START(mface1) + ROM_REGION(0x2000, "rom", 0) + ROM_DEFAULT_BIOS("mu21e7") + ROM_SYSTEM_BIOS(0, "mu20fe", "MU 2.0 FE") + ROMX_LOAD("mf1_20_fe.rom", 0x0000, 0x2000, CRC(fa1b8b0d) SHA1(20cd508b0143166558a7238c7a9ccfbe37b90b0d), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "mu2167", "MU 2.1 67") + ROMX_LOAD("mf1_21_67.rom", 0x0000, 0x2000, CRC(d720ec1b) SHA1(91a40d8f503ef825df3e2ed712897dbf4ca3671d), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "mu21e4", "MU 2.1 E4") + ROMX_LOAD("mf1_21_e4.rom", 0x0000, 0x2000, CRC(4b31a971) SHA1(ba28754a3cc31a4ca579829ed4310c313409cf5d), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "mu21e7", "MU 2.1 E7") + ROMX_LOAD("mf1_21_e7.rom", 0x0000, 0x2000, CRC(670f0ec2) SHA1(50fba2d628f3a2e9219f72980e4efd62fc9ec1f8), ROM_BIOS(3)) +ROM_END + +ROM_START(mface128) + ROM_REGION(0x2000, "rom", 0) + ROM_DEFAULT_BIOS("v36") + ROM_SYSTEM_BIOS(0, "v36", "v36") + ROMX_LOAD("mf128_36_3c.rom", 0x0000, 0x2000, CRC(78ec8cfd) SHA1(8df204ab490b87c389971ce0c7fb5f9cbd281f14), ROM_BIOS(0)) +ROM_END + +ROM_START(mface3) + ROM_REGION(0x2000, "rom", 0) + ROM_DEFAULT_BIOS("v50fe") + ROM_SYSTEM_BIOS(0, "v5013", "v50.13") + ROMX_LOAD("mf3_50_13.rom", 0x0000, 0x2000, CRC(2d594640) SHA1(5d74d2e2e5a537639da92ff120f8a6d86f474495), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v50fe", "v50.fe") + ROMX_LOAD("mf3_50_fe.rom", 0x0000, 0x2000, CRC(b5c00f28) SHA1(983699a07665186f498f5827f9b35c442c2178ba), ROM_BIOS(1)) +ROM_END + +ROM_START(mprint) + ROM_REGION(0x2000, "rom", 0) + ROM_DEFAULT_BIOS("mpa8") + ROM_SYSTEM_BIOS(0, "mp5a", "5A") + ROMX_LOAD("mprint_5a.rom", 0x0000, 0x2000, CRC(3a26e84b) SHA1(4714469bf25f69291f61188f52bfb11fbb8d0b33), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "mpa8", "A8") + ROMX_LOAD("mprint_a8.rom", 0x0000, 0x2000, CRC(a5c58022) SHA1(1356bfae3264b952f83a33e25af536c0f13f50e7), ROM_BIOS(1)) +ROM_END + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void spectrum_mface1_device::device_add_mconfig(machine_config &config) +{ + /* passthru */ + 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->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w)); +} + +const tiny_rom_entry *spectrum_mface1_device::device_rom_region() const +{ + return ROM_NAME(mface1); +} + +const tiny_rom_entry *spectrum_mface128_device::device_rom_region() const +{ + return ROM_NAME(mface128); +} + +const tiny_rom_entry *spectrum_mface3_device::device_rom_region() const +{ + return ROM_NAME(mface3); +} + +const tiny_rom_entry *spectrum_mprint_device::device_rom_region() const +{ + return ROM_NAME(mprint); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// spectrum_opus_device - constructor +//------------------------------------------------- + +spectrum_mface1_device::spectrum_mface1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , device_spectrum_expansion_interface(mconfig, *this) + , m_rom(*this, "rom") + , m_exp(*this, "exp") +{ +} + +spectrum_mface1_device::spectrum_mface1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_mface1_device(mconfig, SPECTRUM_MFACE1, tag, owner, clock) +{ +} + +spectrum_mface128_device::spectrum_mface128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_mface1_device(mconfig, SPECTRUM_MFACE128, tag, owner, clock) +{ +} + +spectrum_mface3_device::spectrum_mface3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_mface1_device(mconfig, SPECTRUM_MFACE3, tag, owner, clock) +{ +} + +spectrum_mprint_device::spectrum_mprint_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : spectrum_mface1_device(mconfig, SPECTRUM_MPRINT, tag, owner, clock) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void spectrum_mface1_device::device_start() +{ + save_item(NAME(m_romcs)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void spectrum_mface1_device::device_reset() +{ + m_romcs = 0; +} + + +//************************************************************************** +// IMPLEMENTATION +//************************************************************************** + +READ_LINE_MEMBER(spectrum_mface1_device::romcs) +{ + return m_romcs | m_exp->romcs(); +} + +void spectrum_mface1_device::opcode_fetch(offs_t offset) +{ + m_exp->opcode_fetch(offset); + + if (!machine().side_effects_disabled()) + { + if (offset == 0x0066) + m_romcs = 1; + } +} + +uint8_t spectrum_mface1_device::iorq_r(offs_t offset) +{ + uint8_t data = m_exp->iorq_r(offset); + + if (!machine().side_effects_disabled()) + { + switch (offset & 0xff) + { + case 0x1f: + m_romcs = 0; + break; + case 0x9f: + m_romcs = 1; + break; + } + } + return data; +} + +uint8_t spectrum_mface128_device::iorq_r(offs_t offset) +{ + uint8_t data = m_exp->iorq_r(offset); + + if (!machine().side_effects_disabled()) + { + switch (offset & 0xff) + { + case 0xbf: + m_romcs = 1; + break; + case 0x3f: + m_romcs = 0; + break; + } + } + return data; +} + +uint8_t spectrum_mface3_device::iorq_r(offs_t offset) +{ + uint8_t data = m_exp->iorq_r(offset); + + if (!machine().side_effects_disabled()) + { + switch (offset & 0xff) + { + case 0x3f: + m_romcs = 1; + break; + case 0xbf: + m_romcs = 0; + break; + } + } + return data; +} + +uint8_t spectrum_mprint_device::iorq_r(offs_t offset) +{ + uint8_t data = m_exp->iorq_r(offset); + + if (!machine().side_effects_disabled()) + { + switch (offset & 0xff) + { + case 0xbb: + m_romcs = 1; + break; + case 0xbf: + m_romcs = 0; + break; + } + } + return data; +} + +void spectrum_mface1_device::iorq_w(offs_t offset, uint8_t data) +{ + m_exp->iorq_w(offset, data); +} + +uint8_t spectrum_mface1_device::mreq_r(offs_t offset) +{ + uint8_t data = 0xff; + + if (m_romcs) + { + switch (offset & 0xe000) + { + case 0x0000: + data = m_rom->base()[offset & 0x1fff]; + break; + case 0x2000: + data = m_ram[offset & 0x1fff]; + break; + } + } + + if (m_exp->romcs()) + data &= m_exp->mreq_r(offset); + + return data; +} + +void spectrum_mface1_device::mreq_w(offs_t offset, uint8_t data) +{ + if (m_romcs) + { + switch (offset & 0xe000) + { + case 0x2000: + m_ram[offset & 0x1fff] = data; + break; + } + } + + if (m_exp->romcs()) + m_exp->mreq_w(offset, data); +} + +INPUT_CHANGED_MEMBER(spectrum_mface1_device::magic_button) +{ + if (newval && !oldval) + { + m_slot->nmi_w(ASSERT_LINE); + } + else + { + m_slot->nmi_w(CLEAR_LINE); + } +} diff --git a/src/devices/bus/spectrum/mface.h b/src/devices/bus/spectrum/mface.h new file mode 100644 index 00000000000..bbe8311808c --- /dev/null +++ b/src/devices/bus/spectrum/mface.h @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders:Nigel Barnes +/********************************************************************* + + Romantic Robot Multiface One/128/3 + +*********************************************************************/ +#ifndef MAME_BUS_SPECTRUM_MFACE_H +#define MAME_BUS_SPECTRUM_MFACE_H + +#include "exp.h" + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class spectrum_mface1_device : + public device_t, + public device_spectrum_expansion_interface + +{ +public: + // construction/destruction + spectrum_mface1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_INPUT_CHANGED_MEMBER(magic_button); + +protected: + spectrum_mface1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // optional information overrides + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + virtual ioport_constructor device_input_ports() const override; + + virtual void opcode_fetch(offs_t offset) override; + virtual uint8_t mreq_r(offs_t offset) override; + virtual void mreq_w(offs_t offset, uint8_t data) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; + virtual DECLARE_READ_LINE_MEMBER(romcs) override; + + required_memory_region m_rom; + required_device<spectrum_expansion_slot_device> m_exp; + + uint8_t m_ram[8 * 1024]; + int m_romcs; +}; + +class spectrum_mface128_device : public spectrum_mface1_device +{ +public: + spectrum_mface128_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // optional information overrides + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual uint8_t iorq_r(offs_t offset) override; +}; + +class spectrum_mface3_device : public spectrum_mface1_device +{ +public: + spectrum_mface3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // optional information overrides + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual uint8_t iorq_r(offs_t offset) override; +}; + +class spectrum_mprint_device : public spectrum_mface1_device +{ +public: + spectrum_mprint_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // optional information overrides + virtual const tiny_rom_entry *device_rom_region() const override; + + virtual uint8_t iorq_r(offs_t offset) override; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(SPECTRUM_MFACE1, spectrum_mface1_device) +DECLARE_DEVICE_TYPE(SPECTRUM_MFACE128, spectrum_mface128_device) +DECLARE_DEVICE_TYPE(SPECTRUM_MFACE3, spectrum_mface3_device) +DECLARE_DEVICE_TYPE(SPECTRUM_MPRINT, spectrum_mprint_device) + + + +#endif // MAME_BUS_SPECTRUM_MFACE_H diff --git a/src/devices/bus/spectrum/mikroplus.cpp b/src/devices/bus/spectrum/mikroplus.cpp index 83500b856e9..87552f79bf3 100644 --- a/src/devices/bus/spectrum/mikroplus.cpp +++ b/src/devices/bus/spectrum/mikroplus.cpp @@ -85,23 +85,19 @@ void spectrum_mikroplus_device::device_start() } -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void spectrum_mikroplus_device::device_reset() -{ - io_space().install_read_handler(0xdf, 0xdf, 0, 0xff00, 0, read8smo_delegate(FUNC(spectrum_mikroplus_device::joystick_r), this)); -} - - //************************************************************************** // IMPLEMENTATION //************************************************************************** -uint8_t spectrum_mikroplus_device::joystick_r() +uint8_t spectrum_mikroplus_device::iorq_r(offs_t offset) { - return m_joy->read() | (0xff ^ 0x1f); + uint8_t data = 0xff; + + if (offset == 0xdf) + { + data = m_joy->read() | (0xff ^ 0x1f); + } + return data; } READ_LINE_MEMBER(spectrum_mikroplus_device::romcs) diff --git a/src/devices/bus/spectrum/mikroplus.h b/src/devices/bus/spectrum/mikroplus.h index 7daee5ba595..e06cb38bb2c 100644 --- a/src/devices/bus/spectrum/mikroplus.h +++ b/src/devices/bus/spectrum/mikroplus.h @@ -31,7 +31,6 @@ public: protected: // device-level overrides virtual void device_start() override; - virtual void device_reset() override; // optional information overrides virtual const tiny_rom_entry *device_rom_region() const override; @@ -39,10 +38,9 @@ protected: virtual DECLARE_READ_LINE_MEMBER(romcs) override; virtual uint8_t mreq_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; private: - uint8_t joystick_r(); - required_memory_region m_rom; required_ioport m_joy; }; diff --git a/src/devices/bus/spectrum/protek.cpp b/src/devices/bus/spectrum/protek.cpp index eafee4ea393..d1e122d8dbb 100644 --- a/src/devices/bus/spectrum/protek.cpp +++ b/src/devices/bus/spectrum/protek.cpp @@ -72,17 +72,20 @@ void spectrum_protek_device::device_start() // IMPLEMENTATION //************************************************************************** -uint8_t spectrum_protek_device::port_fe_r(offs_t offset) +uint8_t spectrum_protek_device::iorq_r(offs_t offset) { uint8_t data = 0xff; - uint8_t lines = offset >> 8; + switch (offset & 0xff) + { + case 0xfe: + if (((offset >> 8) & 8) == 0) + data = m_exp_line3->read() | (0xff ^ 0x10); - if ((lines & 8) == 0) - data = m_exp_line3->read() | (0xff ^ 0x10); - - if ((lines & 16) == 0) - data = m_exp_line4->read() | (0xff ^ 0x1d); + if (((offset >> 8) & 16) == 0) + data = m_exp_line4->read() | (0xff ^ 0x1d); + break; + } return data; } diff --git a/src/devices/bus/spectrum/protek.h b/src/devices/bus/spectrum/protek.h index 8f16d66ecf4..9edd5a82f29 100644 --- a/src/devices/bus/spectrum/protek.h +++ b/src/devices/bus/spectrum/protek.h @@ -35,7 +35,7 @@ protected: // optional information overrides virtual ioport_constructor device_input_ports() const override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; private: required_ioport m_exp_line3; diff --git a/src/devices/bus/spectrum/uslot.cpp b/src/devices/bus/spectrum/uslot.cpp index e075f423382..d27f1ec572d 100644 --- a/src/devices/bus/spectrum/uslot.cpp +++ b/src/devices/bus/spectrum/uslot.cpp @@ -76,19 +76,21 @@ READ_LINE_MEMBER(spectrum_uslot_device::romcs) return m_exp1->romcs() | m_exp2->romcs(); } +void spectrum_uslot_device::opcode_fetch(offs_t offset) +{ + m_exp1->opcode_fetch(offset); + m_exp2->opcode_fetch(offset); +} uint8_t spectrum_uslot_device::mreq_r(offs_t offset) { - uint8_t temp; uint8_t data = 0xff; - temp = m_exp1->mreq_r(offset); if (m_exp1->romcs()) - data &= temp; + data &= m_exp1->mreq_r(offset); - temp = m_exp2->mreq_r(offset); if (m_exp2->romcs()) - data &= temp; + data &= m_exp2->mreq_r(offset); return data; } @@ -102,15 +104,13 @@ void spectrum_uslot_device::mreq_w(offs_t offset, uint8_t data) m_exp2->mreq_w(offset, data); } -uint8_t spectrum_uslot_device::port_fe_r(offs_t offset) +uint8_t spectrum_uslot_device::iorq_r(offs_t offset) { - uint8_t data = 0xff; - - if (m_exp1->romcs()) - data &= m_exp1->port_fe_r(offset); - - if (m_exp2->romcs()) - data &= m_exp2->port_fe_r(offset); + return m_exp1->iorq_r(offset) & m_exp2->iorq_r(offset); +} - return data; +void spectrum_uslot_device::iorq_w(offs_t offset, uint8_t data) +{ + m_exp1->iorq_w(offset, data); + m_exp2->iorq_w(offset, data); } diff --git a/src/devices/bus/spectrum/uslot.h b/src/devices/bus/spectrum/uslot.h index 7a55b63befe..6cfa90c45e9 100644 --- a/src/devices/bus/spectrum/uslot.h +++ b/src/devices/bus/spectrum/uslot.h @@ -36,9 +36,11 @@ protected: // optional information overrides virtual void device_add_mconfig(machine_config &config) override; + virtual void opcode_fetch(offs_t offset) override; virtual uint8_t mreq_r(offs_t offset) override; virtual void mreq_w(offs_t offset, uint8_t data) override; - virtual uint8_t port_fe_r(offs_t offset) override; + virtual uint8_t iorq_r(offs_t offset) override; + virtual void iorq_w(offs_t offset, uint8_t data) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; private: diff --git a/src/devices/bus/spectrum/usource.cpp b/src/devices/bus/spectrum/usource.cpp index 7ec405857c9..13f302b14c5 100644 --- a/src/devices/bus/spectrum/usource.cpp +++ b/src/devices/bus/spectrum/usource.cpp @@ -60,6 +60,7 @@ spectrum_usource_device::spectrum_usource_device(const machine_config &mconfig, void spectrum_usource_device::device_start() { + save_item(NAME(m_romcs)); } @@ -82,17 +83,15 @@ READ_LINE_MEMBER(spectrum_usource_device::romcs) return m_romcs; } - -uint8_t spectrum_usource_device::mreq_r(offs_t offset) +void spectrum_usource_device::opcode_fetch(offs_t offset) { - uint8_t data; - if (!machine().side_effects_disabled() && (offset == 0x2bae)) { m_romcs = !m_romcs; } +} - data = m_rom->base()[offset & 0x1fff]; - - return data; +uint8_t spectrum_usource_device::mreq_r(offs_t offset) +{ + return m_rom->base()[offset & 0x1fff]; } diff --git a/src/devices/bus/spectrum/usource.h b/src/devices/bus/spectrum/usource.h index 0cec9ec0647..daf792f076f 100644 --- a/src/devices/bus/spectrum/usource.h +++ b/src/devices/bus/spectrum/usource.h @@ -38,6 +38,7 @@ protected: // optional information overrides virtual const tiny_rom_entry *device_rom_region() const override; + virtual void opcode_fetch(offs_t offset) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; virtual uint8_t mreq_r(offs_t offset) override; diff --git a/src/devices/bus/spectrum/uspeech.cpp b/src/devices/bus/spectrum/uspeech.cpp index 0de1f5ff946..e3d5fca54d2 100644 --- a/src/devices/bus/spectrum/uspeech.cpp +++ b/src/devices/bus/spectrum/uspeech.cpp @@ -76,6 +76,7 @@ spectrum_uspeech_device::spectrum_uspeech_device(const machine_config &mconfig, void spectrum_uspeech_device::device_start() { + save_item(NAME(m_romcs)); } @@ -98,24 +99,26 @@ READ_LINE_MEMBER(spectrum_uspeech_device::romcs) return m_romcs; } - -uint8_t spectrum_uspeech_device::mreq_r(offs_t offset) +void spectrum_uspeech_device::opcode_fetch(offs_t offset) { - uint8_t data; - - if (!machine().side_effects_disabled() && (offset == 0x38)) + if (!machine().side_effects_disabled() && (offset == 0x0038)) { m_romcs = !m_romcs; } +} - switch (offset) +uint8_t spectrum_uspeech_device::mreq_r(offs_t offset) +{ + uint8_t data = 0xff; + + switch (offset & 0xf000) { + case 0x0000: + data = m_rom->base()[offset & 0x7ff]; + break; case 0x1000: data = !m_nsp->lrq_r(); // (m_nsp->lrq_r() && (m_nsp->sby_r() != 0)) ? 0x00 : 0x01; break; - default: - data = m_rom->base()[offset & 0x7ff]; - break; } return data; @@ -123,7 +126,7 @@ uint8_t spectrum_uspeech_device::mreq_r(offs_t offset) void spectrum_uspeech_device::mreq_w(offs_t offset, uint8_t data) { - switch (offset) + switch (offset & 0xf001) { case 0x1000: // allophone diff --git a/src/devices/bus/spectrum/uspeech.h b/src/devices/bus/spectrum/uspeech.h index affa92a9901..31fe8c65b85 100644 --- a/src/devices/bus/spectrum/uspeech.h +++ b/src/devices/bus/spectrum/uspeech.h @@ -40,6 +40,7 @@ protected: virtual const tiny_rom_entry *device_rom_region() const override; virtual void device_add_mconfig(machine_config &config) override; + virtual void opcode_fetch(offs_t offset) override; virtual DECLARE_READ_LINE_MEMBER(romcs) override; virtual uint8_t mreq_r(offs_t offset) override; virtual void mreq_w(offs_t offset, uint8_t data) override; |