diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 3436ee589d4bd..240d5e8f77436 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -5377,6 +5377,8 @@ if BUSES["SPECTRUM"] then MAME_DIR .. "src/devices/bus/spectrum/fuller.h", MAME_DIR .. "src/devices/bus/spectrum/kempjoy.cpp", MAME_DIR .. "src/devices/bus/spectrum/kempjoy.h", + MAME_DIR .. "src/devices/bus/spectrum/kempmouse.cpp", + MAME_DIR .. "src/devices/bus/spectrum/kempmouse.h", MAME_DIR .. "src/devices/bus/spectrum/kempdisc.cpp", MAME_DIR .. "src/devices/bus/spectrum/kempdisc.h", MAME_DIR .. "src/devices/bus/spectrum/logitek.cpp", diff --git a/src/devices/bus/spectrum/exp.cpp b/src/devices/bus/spectrum/exp.cpp index 22d0a5665e5bc..b92d65f111030 100644 --- a/src/devices/bus/spectrum/exp.cpp +++ b/src/devices/bus/spectrum/exp.cpp @@ -159,6 +159,7 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data) #include "floppyone.h" #include "fuller.h" #include "kempjoy.h" +#include "kempmouse.h" #include "kempdisc.h" #include "logitek.h" #include "lprint.h" @@ -200,6 +201,7 @@ void spectrum_expansion_devices(device_slot_interface &device) device.option_add("flpone", SPECTRUM_FLPONE); device.option_add("fuller", SPECTRUM_FULLER); device.option_add("kempjoy", SPECTRUM_KEMPJOY); + device.option_add("kempmouse", SPECTRUM_KEMPMOUSE); device.option_add("kempdisc", SPECTRUM_KEMPDISC); device.option_add("kempcentrs", SPECTRUM_KEMPCENTRS); device.option_add("kempcentref", SPECTRUM_KEMPCENTREF); @@ -242,6 +244,7 @@ void spec128_expansion_devices(device_slot_interface &device) device.option_add("intf1", SPECTRUM_INTF1); device.option_add("intf2", SPECTRUM_INTF2); device.option_add("kempjoy", SPECTRUM_KEMPJOY); + device.option_add("kempmouse", SPECTRUM_KEMPMOUSE); device.option_add("mface128v1", SPECTRUM_MFACE128V1); device.option_add("mface128", SPECTRUM_MFACE128); device.option_add("mikroplus", SPECTRUM_MIKROPLUS); @@ -261,6 +264,7 @@ void spec128_expansion_devices(device_slot_interface &device) void specpls3_expansion_devices(device_slot_interface &device) { device.option_add("kempjoy", SPECTRUM_KEMPJOY); + device.option_add("kempmouse", SPECTRUM_KEMPMOUSE); device.option_add("mface3", SPECTRUM_MFACE3); device.option_add("musicmachine", SPECTRUM_MUSICMACHINE); } diff --git a/src/devices/bus/spectrum/kempmouse.cpp b/src/devices/bus/spectrum/kempmouse.cpp new file mode 100644 index 0000000000000..e3c2128559167 --- /dev/null +++ b/src/devices/bus/spectrum/kempmouse.cpp @@ -0,0 +1,73 @@ +// license:BSD-3-Clause +// copyright-holders: Oleksandr Kovalchuk +/********************************************************************** + + Kempston Mouse Interface (original, 2-buttons) + + Description: + https://k1.spdns.de/Vintage/Sinclair/82/Peripherals/Mouse%20Interfaces/Kempston%20Mouse%20Interface/ + + Mouse interface with two 8bit reverse counters. Readed in ports: + 0xFADF (button bits: 0 - right, 1 - left) + 0xFBDF - X + 0xFFDF - Y + +**********************************************************************/ + +#include "emu.h" +#include "kempmouse.h" + +DEFINE_DEVICE_TYPE(SPECTRUM_KEMPMOUSE, spectrum_kempmouse_device, "spectrum_kempmouse", "Kempston Mouse Interface") + +static INPUT_PORTS_START( kempmouse ) + PORT_START("mouse_x") // 0xFBDF + PORT_BIT(0xff, 0, IPT_MOUSE_X) PORT_SENSITIVITY(30) + + PORT_START("mouse_y") // 0xFFDF + PORT_BIT(0xff, 0, IPT_MOUSE_Y) PORT_REVERSE PORT_SENSITIVITY(30) + + PORT_START("mouse_buttons") // 0xFADF + // The right key was the primary key in most implementations in the 1980s–1990s. + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse Button Right") PORT_CODE(MOUSECODE_BUTTON2) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse Button Left") PORT_CODE(MOUSECODE_BUTTON1) + PORT_BIT(0xfc, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + +ioport_constructor spectrum_kempmouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( kempmouse ); +} + +spectrum_kempmouse_device::spectrum_kempmouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SPECTRUM_KEMPMOUSE, tag, owner, clock) + , device_spectrum_expansion_interface(mconfig, *this) + , m_mouse_x(*this, "mouse_x") + , m_mouse_y(*this, "mouse_y") + , m_mouse_buttons(*this, "mouse_buttons") +{ +} + +void spectrum_kempmouse_device::device_start() +{ +} + +uint8_t spectrum_kempmouse_device::iorq_r(offs_t offset) +{ + uint8_t data = offset & 1 ? m_slot->fb_r() : 0xff; + + switch (offset & 0xffff) + { + case 0xfbdf: + data = m_mouse_x->read() & 0xff; + break; + case 0xffdf: + data = m_mouse_y->read() & 0xff; + break; + case 0xfadf: + data = m_mouse_buttons->read() | (0xff ^ 0x03); + break; + } + + return data; +} diff --git a/src/devices/bus/spectrum/kempmouse.h b/src/devices/bus/spectrum/kempmouse.h new file mode 100644 index 0000000000000..2583366ccfe34 --- /dev/null +++ b/src/devices/bus/spectrum/kempmouse.h @@ -0,0 +1,39 @@ +// license:BSD-3-Clause +// copyright-holders: Oleksandr Kovalchuk +/********************************************************************** + + Kempston Mouse Interface + +**********************************************************************/ + +#ifndef MAME_BUS_SPECTRUM_KEMPMOUSE_H +#define MAME_BUS_SPECTRUM_KEMPMOUSE_H + +#pragma once + +#include "exp.h" + +class spectrum_kempmouse_device : + public device_t, + public device_spectrum_expansion_interface +{ +public: + spectrum_kempmouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + virtual void device_start() override ATTR_COLD; + + virtual ioport_constructor device_input_ports() const override ATTR_COLD; + + virtual uint8_t iorq_r(offs_t offset) override; + +private: + required_ioport m_mouse_x; + required_ioport m_mouse_y; + required_ioport m_mouse_buttons; +}; + + +DECLARE_DEVICE_TYPE(SPECTRUM_KEMPMOUSE, spectrum_kempmouse_device) + +#endif // MAME_BUS_SPECTRUM_KEMPMOUSE_H