Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions scripts/src/bus.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
4 changes: 4 additions & 0 deletions src/devices/bus/spectrum/exp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down
73 changes: 73 additions & 0 deletions src/devices/bus/spectrum/kempmouse.cpp
Original file line number Diff line number Diff line change
@@ -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;
}
39 changes: 39 additions & 0 deletions src/devices/bus/spectrum/kempmouse.h
Original file line number Diff line number Diff line change
@@ -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