From 3b1f24dd829d3f9a07d77f70ee3fa1c82a6d33b9 Mon Sep 17 00:00:00 2001 From: etabeta78 Date: Sat, 23 Apr 2016 19:07:33 +0200 Subject: [PATCH] saturn.cpp: converted controllers to work through slot devices, cleaning up the related code. [Fabio Priuli] saturn.cpp: added emulation of the SegaTap adapter (4 controllers) and Sega Multitap adapter (6 controllers). Saturn Bomberman can now be played as intended. [Fabio Priuli] --- scripts/src/bus.lua | 29 +++ scripts/target/mame/arcade.lua | 1 + scripts/target/mame/mess.lua | 1 + src/devices/bus/sat_ctrl/analog.cpp | 123 +++++++++ src/devices/bus/sat_ctrl/analog.h | 56 ++++ src/devices/bus/sat_ctrl/ctrl.cpp | 143 ++++++++++ src/devices/bus/sat_ctrl/ctrl.h | 82 ++++++ src/devices/bus/sat_ctrl/joy.cpp | 111 ++++++++ src/devices/bus/sat_ctrl/joy.h | 54 ++++ src/devices/bus/sat_ctrl/joy_md.cpp | 122 +++++++++ src/devices/bus/sat_ctrl/joy_md.h | 81 ++++++ src/devices/bus/sat_ctrl/keybd.cpp | 332 +++++++++++++++++++++++ src/devices/bus/sat_ctrl/keybd.h | 62 +++++ src/devices/bus/sat_ctrl/mouse.cpp | 120 +++++++++ src/devices/bus/sat_ctrl/mouse.h | 55 ++++ src/devices/bus/sat_ctrl/multitap.cpp | 139 ++++++++++ src/devices/bus/sat_ctrl/multitap.h | 60 +++++ src/devices/bus/sat_ctrl/pointer.cpp | 120 +++++++++ src/devices/bus/sat_ctrl/pointer.h | 55 ++++ src/devices/bus/sat_ctrl/racing.cpp | 109 ++++++++ src/devices/bus/sat_ctrl/racing.h | 54 ++++ src/devices/bus/sat_ctrl/segatap.cpp | 121 +++++++++ src/devices/bus/sat_ctrl/segatap.h | 58 +++++ src/devices/machine/smpc.cpp | 271 ++++++------------- src/mame/drivers/saturn.cpp | 362 +------------------------- src/mame/includes/stv.h | 10 +- 26 files changed, 2175 insertions(+), 556 deletions(-) create mode 100644 src/devices/bus/sat_ctrl/analog.cpp create mode 100644 src/devices/bus/sat_ctrl/analog.h create mode 100644 src/devices/bus/sat_ctrl/ctrl.cpp create mode 100644 src/devices/bus/sat_ctrl/ctrl.h create mode 100644 src/devices/bus/sat_ctrl/joy.cpp create mode 100644 src/devices/bus/sat_ctrl/joy.h create mode 100644 src/devices/bus/sat_ctrl/joy_md.cpp create mode 100644 src/devices/bus/sat_ctrl/joy_md.h create mode 100644 src/devices/bus/sat_ctrl/keybd.cpp create mode 100644 src/devices/bus/sat_ctrl/keybd.h create mode 100644 src/devices/bus/sat_ctrl/mouse.cpp create mode 100644 src/devices/bus/sat_ctrl/mouse.h create mode 100644 src/devices/bus/sat_ctrl/multitap.cpp create mode 100644 src/devices/bus/sat_ctrl/multitap.h create mode 100644 src/devices/bus/sat_ctrl/pointer.cpp create mode 100644 src/devices/bus/sat_ctrl/pointer.h create mode 100644 src/devices/bus/sat_ctrl/racing.cpp create mode 100644 src/devices/bus/sat_ctrl/racing.h create mode 100644 src/devices/bus/sat_ctrl/segatap.cpp create mode 100644 src/devices/bus/sat_ctrl/segatap.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index cd9923ea1fc..960177c5eb9 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1971,6 +1971,35 @@ if (BUSES["NEOGEO_CTRL"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/bus/sat_ctrl/ctrl.h,BUSES["SAT_CTRL"] = true +--------------------------------------------------- + +if (BUSES["SAT_CTRL"]~=null) then + files { + MAME_DIR .. "src/devices/bus/sat_ctrl/ctrl.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/ctrl.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/analog.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/analog.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/joy.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/joy.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/joy_md.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/joy_md.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/keybd.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/keybd.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/mouse.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/mouse.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/multitap.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/multitap.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/pointer.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/pointer.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/racing.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/racing.h", + MAME_DIR .. "src/devices/bus/sat_ctrl/segatap.cpp", + MAME_DIR .. "src/devices/bus/sat_ctrl/segatap.h", + } +end --------------------------------------------------- -- diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 252cf594be1..65d6838f2d0 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -632,6 +632,7 @@ BUSES["PC_KBD"] = true --BUSES["QL"] = true BUSES["RS232"] = true --BUSES["S100"] = true +--BUSES["SAT_CTRL"] = true --BUSES["SATURN"] = true BUSES["SCSI"] = true --BUSES["SCV"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 93039ee80bd..f8fe1450856 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -648,6 +648,7 @@ BUSES["PSX_CONTROLLER"] = true BUSES["QL"] = true BUSES["RS232"] = true BUSES["S100"] = true +BUSES["SAT_CTRL"] = true BUSES["SATURN"] = true BUSES["SCSI"] = true BUSES["SCV"] = true diff --git a/src/devices/bus/sat_ctrl/analog.cpp b/src/devices/bus/sat_ctrl/analog.cpp new file mode 100644 index 00000000000..ab1d75292fd --- /dev/null +++ b/src/devices/bus/sat_ctrl/analog.cpp @@ -0,0 +1,123 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Analog Controller emulation + +**********************************************************************/ + +#include "analog.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_ANALOG = &device_creator; + + +static INPUT_PORTS_START( saturn_analog ) + PORT_START("JOY") + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) + PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) + PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_START) + PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A") + PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("C") + PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("B") + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_NAME("R") + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("X") + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Y") + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_NAME("Z") + PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_NAME("L") + // Note: unused bits must stay high, Bug 2 relies on this. + PORT_BIT(0x0007, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("ANALOG_X") + PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick X") + + PORT_START("ANALOG_Y") + PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Y") + + PORT_START("ANALOG_Z") + PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("AD Stick Z") +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_analog_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_analog ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_analog_device - constructor +//------------------------------------------------- + +saturn_analog_device::saturn_analog_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_ANALOG, "Sega Saturn Analog Controller", tag, owner, clock, "saturn_analog", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_joy(*this, "JOY"), + m_anx(*this, "ANALOG_X"), + m_any(*this, "ANALOG_Y"), + m_anz(*this, "ANALOG_Z") +{ + m_ctrl_id = 0x15; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_analog_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_analog_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_analog_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + case 0: + default: + res = m_joy->read() >> 8; + break; + case 1: + res = m_joy->read() & 0xff; + break; + case 2: + res = m_anx->read(); + break; + case 3: + res = m_any->read(); + break; + case 4: + res = m_anz->read(); + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/analog.h b/src/devices/bus/sat_ctrl/analog.h new file mode 100644 index 00000000000..2688f58aca9 --- /dev/null +++ b/src/devices/bus/sat_ctrl/analog.h @@ -0,0 +1,56 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Analog Controller emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_ANALOG__ +#define __SATURN_ANALOG__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_analog_device + +class saturn_analog_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_analog_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_joy; + required_ioport m_anx; + required_ioport m_any; + required_ioport m_anz; +}; + + +// device type definition +extern const device_type SATURN_ANALOG; + + +#endif diff --git a/src/devices/bus/sat_ctrl/ctrl.cpp b/src/devices/bus/sat_ctrl/ctrl.cpp new file mode 100644 index 00000000000..55a324cbd7f --- /dev/null +++ b/src/devices/bus/sat_ctrl/ctrl.cpp @@ -0,0 +1,143 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Controller Port emulation + +**********************************************************************/ + +#include "ctrl.h" +// slot devices +#include "analog.h" +#include "joy.h" +#include "joy_md.h" +#include "keybd.h" +#include "mouse.h" +#include "multitap.h" +#include "pointer.h" +#include "racing.h" +#include "segatap.h" + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +const device_type SATURN_CONTROL_PORT = &device_creator; + + +//************************************************************************** +// CARD INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_saturn_control_port_interface - constructor +//------------------------------------------------- + +device_saturn_control_port_interface::device_saturn_control_port_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig,device) +{ + m_port = dynamic_cast(device.owner()); +} + + +//------------------------------------------------- +// ~device_saturn_control_port_interface - destructor +//------------------------------------------------- + +device_saturn_control_port_interface::~device_saturn_control_port_interface() +{ +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_control_port_device - constructor +//------------------------------------------------- + +saturn_control_port_device::saturn_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_CONTROL_PORT, "Sega Saturn control port", tag, owner, clock, "saturn_control_port", __FILE__), + device_slot_interface(mconfig, *this), m_device(nullptr) +{ +} + + +//------------------------------------------------- +// ~saturn_control_port_device - destructor +//------------------------------------------------- + +saturn_control_port_device::~saturn_control_port_device() +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_control_port_device::device_start() +{ + m_device = dynamic_cast(get_card_device()); +} + + +UINT8 saturn_control_port_device::read_status() +{ + UINT8 data = 0; + if (m_device) + data |= m_device->read_status(); + return data; +} + +// Notice that the variable idx is only used by the multitap / segatap adapters +// Otherwise, any value is ignored and the unique controller ID is returned +UINT8 saturn_control_port_device::read_id(int idx) +{ + UINT8 data = 0; + if (m_device) + data |= m_device->read_id(idx); + return data; +} + +UINT8 saturn_control_port_device::read_ctrl(UINT8 offset) +{ + UINT8 data = 0; + if (m_device) + data |= m_device->read_ctrl(offset); + return data; +} + +UINT16 saturn_control_port_device::read_direct() +{ + UINT16 data = 0; + if (m_device) + data |= m_device->read_direct(); + return data; +} + + +//------------------------------------------------- +// SLOT_INTERFACE( saturn_controls ) +//------------------------------------------------- + +SLOT_INTERFACE_START( saturn_controls ) + SLOT_INTERFACE("joypad", SATURN_JOY) + SLOT_INTERFACE("racing", SATURN_WHEEL) + SLOT_INTERFACE("analog", SATURN_ANALOG) +// SLOT_INTERFACE("lightgun", SATURN_LIGHTGUN) + SLOT_INTERFACE("trackball", SATURN_TRACK) + SLOT_INTERFACE("keyboard", SATURN_KEYBD) + SLOT_INTERFACE("joy_md3", SATURN_JOYMD3B) + SLOT_INTERFACE("joy_md6", SATURN_JOYMD6B) + SLOT_INTERFACE("mouse", SATURN_MOUSE) + SLOT_INTERFACE("multitap", SATURN_MULTITAP) + SLOT_INTERFACE("segatap", SATURN_SEGATAP) +SLOT_INTERFACE_END + +SLOT_INTERFACE_START( saturn_joys ) + SLOT_INTERFACE("joypad", SATURN_JOY) +SLOT_INTERFACE_END + diff --git a/src/devices/bus/sat_ctrl/ctrl.h b/src/devices/bus/sat_ctrl/ctrl.h new file mode 100644 index 00000000000..346a181780c --- /dev/null +++ b/src/devices/bus/sat_ctrl/ctrl.h @@ -0,0 +1,82 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn controller port emulation + +**********************************************************************/ + + +#pragma once + +#ifndef __SATURN_CONTROL_PORT__ +#define __SATURN_CONTROL_PORT__ + +#include "emu.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class saturn_control_port_device; + +// ======================> device_saturn_control_port_interface + +class device_saturn_control_port_interface : public device_slot_card_interface +{ +public: + // construction/destruction + device_saturn_control_port_interface(const machine_config &mconfig, device_t &device); + virtual ~device_saturn_control_port_interface(); + + virtual UINT16 read_direct() { return 0; }; + virtual UINT8 read_ctrl(UINT8 offset) { return 0; }; + virtual UINT8 read_status() { return 0xf0; }; + virtual UINT8 read_id(int idx) { return 0xff; }; + +protected: + UINT8 m_ctrl_id; + saturn_control_port_device *m_port; +}; + +// ======================> saturn_control_port_device + +class saturn_control_port_device : public device_t, + public device_slot_interface +{ +public: + // construction/destruction + saturn_control_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~saturn_control_port_device(); + + UINT16 read_direct(); + UINT8 read_ctrl(UINT8 offset); + UINT8 read_status(); + UINT8 read_id(int idx); + + // device-level overrides + virtual void device_start() override; + +protected: + device_saturn_control_port_interface *m_device; +}; + + +// device type definition +extern const device_type SATURN_CONTROL_PORT; + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_SATURN_CONTROL_PORT_ADD(_tag, _slot_intf, _def_slot) \ + MCFG_DEVICE_ADD(_tag, SATURN_CONTROL_PORT, 0) \ + MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) + + +SLOT_INTERFACE_EXTERN( saturn_controls ); +SLOT_INTERFACE_EXTERN( saturn_joys ); + + +#endif diff --git a/src/devices/bus/sat_ctrl/joy.cpp b/src/devices/bus/sat_ctrl/joy.cpp new file mode 100644 index 00000000000..e8fbc90a1b1 --- /dev/null +++ b/src/devices/bus/sat_ctrl/joy.cpp @@ -0,0 +1,111 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Joypad emulation + +**********************************************************************/ + +#include "joy.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_JOY = &device_creator; + + +static INPUT_PORTS_START( saturn_joy ) + PORT_START("JOY") + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) + PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) + PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_START) + PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A") + PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("C") + PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("B") + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_NAME("R") + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("X") + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Y") + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_NAME("Z") + PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_NAME("L") + // Note: unused bits must stay high, Bug 2 relies on this. + PORT_BIT(0x0007, IP_ACTIVE_LOW, IPT_UNUSED) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_joy_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_joy ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_joy_device - constructor +//------------------------------------------------- + +saturn_joy_device::saturn_joy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_JOY, "Sega Saturn Joypad", tag, owner, clock, "saturn_joy", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_joy(*this, "JOY") +{ + m_ctrl_id = 0x02; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_joy_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_joy_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_joy_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + case 0: + default: + res = m_joy->read() >> 8; + break; + case 1: + res = m_joy->read() & 0xff; + break; + } + return res; +} + +//------------------------------------------------- +// read_direct +//------------------------------------------------- + +UINT16 saturn_joy_device::read_direct() +{ + return m_joy->read(); +} + diff --git a/src/devices/bus/sat_ctrl/joy.h b/src/devices/bus/sat_ctrl/joy.h new file mode 100644 index 00000000000..786c50949a5 --- /dev/null +++ b/src/devices/bus/sat_ctrl/joy.h @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Joypad emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_JOY__ +#define __SATURN_JOY__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_joy_device + +class saturn_joy_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_joy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT16 read_direct() override; + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_joy; +}; + + +// device type definition +extern const device_type SATURN_JOY; + + +#endif diff --git a/src/devices/bus/sat_ctrl/joy_md.cpp b/src/devices/bus/sat_ctrl/joy_md.cpp new file mode 100644 index 00000000000..4f2fc0fdf91 --- /dev/null +++ b/src/devices/bus/sat_ctrl/joy_md.cpp @@ -0,0 +1,122 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn MD Joypad (3 buttons & 6 buttons) emulation + +**********************************************************************/ + +#include "joy_md.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_JOYMD3B = &device_creator; +const device_type SATURN_JOYMD6B = &device_creator; + +static INPUT_PORTS_START( saturn_md3b ) + PORT_START("JOY") + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("A") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("C") + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("B") + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) //reads '1' when direct mode is polled +INPUT_PORTS_END + +static INPUT_PORTS_START( saturn_md6b ) + PORT_START("JOY") + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("A") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("C") + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("B") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("Mode") + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("X") + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("Y") + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("Z") + PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) //reads '1' when direct mode is polled +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_joymd3b_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_md3b ); +} + +ioport_constructor saturn_joymd6b_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_md6b ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// constructors +//------------------------------------------------- + +saturn_joymd3b_device::saturn_joymd3b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_JOYMD3B, "Sega Saturn Joypad MD 3buttons", tag, owner, clock, "saturn_md3b", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_joy(*this, "JOY") +{ + m_ctrl_id = 0xe1; +} + + +saturn_joymd6b_device::saturn_joymd6b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_JOYMD6B, "Sega Saturn Joypad MD 6buttons", tag, owner, clock, "saturn_md6b", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_joy(*this, "JOY") +{ + m_ctrl_id = 0xe2; +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_joymd3b_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + case 0: + default: + res = m_joy->read() >> 8; + break; + } + return res; +} + +UINT8 saturn_joymd6b_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + case 0: + default: + res = m_joy->read() >> 8; + break; + case 1: + res = m_joy->read() & 0xff; + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/joy_md.h b/src/devices/bus/sat_ctrl/joy_md.h new file mode 100644 index 00000000000..2f178a413de --- /dev/null +++ b/src/devices/bus/sat_ctrl/joy_md.h @@ -0,0 +1,81 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn MD Joypad (3 buttons & 6 buttons) emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_MDJOY__ +#define __SATURN_MDJOY__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_joymd3b_device + +class saturn_joymd3b_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_joymd3b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override {}; + virtual void device_reset() override {}; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_joy; +}; + + +// ======================> saturn_joymd6b_device + +class saturn_joymd6b_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_joymd6b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override {}; + virtual void device_reset() override {}; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_joy; +}; + + +// device type definition +extern const device_type SATURN_JOYMD3B; +extern const device_type SATURN_JOYMD6B; + + +#endif diff --git a/src/devices/bus/sat_ctrl/keybd.cpp b/src/devices/bus/sat_ctrl/keybd.cpp new file mode 100644 index 00000000000..5c0f30f9948 --- /dev/null +++ b/src/devices/bus/sat_ctrl/keybd.cpp @@ -0,0 +1,332 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Keyboard emulation + +**********************************************************************/ + +#include "keybd.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_KEYBD = &device_creator; + + +static INPUT_PORTS_START( saturn_joy ) + // TODO: there's no info about the keycode used on Saturn keyboard, the following is trial & error with Game Basic software + PORT_START("KEY.0") // 0x00 - 0x07 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_UNUSED) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F1") /*PORT_CODE(KEYCODE_F1)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x01) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x02) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F2") /*PORT_CODE(KEYCODE_F2)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x03) // RUN + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F3") /*PORT_CODE(KEYCODE_F3)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x04) // LIST + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F4") /*PORT_CODE(KEYCODE_F4)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x05) // EDIT + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F5") /*PORT_CODE(KEYCODE_F5)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x06) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CLR SCR") PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x07) + + PORT_START("KEY.1") // 0x08 - 0x0f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x08) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F6") /*PORT_CODE(KEYCODE_F6)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x09) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F7") /*PORT_CODE(KEYCODE_F7)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F8") /*PORT_CODE(KEYCODE_F8)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F9") /*PORT_CODE(KEYCODE_F9)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0c) // LIST again + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR('5')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x0f) + + PORT_START("KEY.2") // 0x10 - 0x17 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x10) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x11) +/* TODO: break codes! */ + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SHIFT") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x12) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("KANA SHIFT") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x13) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(special keys)") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x14) + + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x15) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x16) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x17) + + PORT_START("KEY.3") // 0x18 - 0x1f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x18) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x19) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x1f) + + PORT_START("KEY.4") // 0x20 - 0x27 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x20) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x21) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x22) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x23) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x24) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x25) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x26) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x27) + + PORT_START("KEY.5") // 0x28 - 0x2f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5-1") /*PORT_CODE(KEYCODE_F) PORT_CHAR('F')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x28) // another F? + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x29) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x2f) + + PORT_START("KEY.6") // 0x30 - 0x37 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x30) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x31) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x32) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x33) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x34) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x35) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x36) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x37) + + PORT_START("KEY.7") // 0x38 - 0x3f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x38) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x39) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x3f) + + PORT_START("KEY.8") // 0x40 - 0x47 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x40) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(",") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x41) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x42) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x43) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x44) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x45) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x46) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x47) + + PORT_START("KEY.9") // 0x48 - 0x4f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x48) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(".") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x49) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("/") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(";") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- / =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x4f) + + PORT_START("KEY.10") // 0x50 - 0x57 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x50) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xC2\xA5") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x51) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(":") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x52) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x53) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x54) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x55) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x56) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x57) + + PORT_START("KEY.11") // 0x58 - 0x5f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x58) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x59) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0d) PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5b) // { + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("]") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5d) // } + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x5f) + + PORT_START("KEY.12") // 0x60 - 0x67 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x60) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x61) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x62) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x63) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x64) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x65) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BACKSPACE") PORT_CODE(KEYCODE_BACKSPACE) /* PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x66) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x67) + + PORT_START("KEY.13") // 0x68 - 0x6f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x68) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x69) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x6f) + + PORT_START("KEY.14") // 0x70 - 0x77 + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x70) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x71) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x72) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x73) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x74) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x75) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x76) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x77) + + PORT_START("KEY.15") // 0x78 - 0x7f + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x78) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x79) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7b) + PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7c) + PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7d) + PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7e) + PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7f) //SYSTEM CONFIGURATION + + PORT_START("KEYS_1") // special keys + PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) /*PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x78) + PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) /*PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x79) + PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_LEFT) /*PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7a) + PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) /*PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, saturn_keybd_device, key_stroke, 0x7b) +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_keybd_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_joy ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_keybd_device - constructor +//------------------------------------------------- + +saturn_keybd_device::saturn_keybd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_KEYBD, "Sega Saturn Keyboard", tag, owner, clock, "saturn_keybd", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_key(*this, "KEY"), + m_key_s1(*this, "KEYS_1") +{ + m_ctrl_id = 0x34; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_keybd_device::device_start() +{ + save_item(NAME(m_status)); + save_item(NAME(m_data)); + save_item(NAME(m_prev_data)); + save_item(NAME(m_repeat_count)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_keybd_device::device_reset() +{ + m_status = 0; + m_data = 0; + m_prev_data = 0; + m_repeat_count = 0; +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +/* TODO: needs a proper keycode table */ +INPUT_CHANGED_MEMBER(saturn_keybd_device::key_stroke) +{ + if (newval && !oldval) + { + m_data = ((UINT8)(FPTR)(param) & 0xff); + m_status |= 8; + } + + if(oldval && !newval) + { + //m_status &= ~8; + m_data = 0; + } +} + +UINT16 saturn_keybd_device::get_game_key() +{ + UINT16 game_key = 0xffff; + + game_key ^= ((m_key_s1->read() & 0x80) << 8); // right + game_key ^= ((m_key_s1->read() & 0x40) << 8); // left + game_key ^= ((m_key_s1->read() & 0x20) << 8); // down + game_key ^= ((m_key_s1->read() & 0x10) << 8); // up + game_key ^= ((m_key[0xf]->read() & 0x80) << 4); // ESC -> START + game_key ^= ((m_key[0x3]->read() & 0x04) << 8); // Z / A trigger + game_key ^= ((m_key[0x4]->read() & 0x02) << 8); // C / C trigger + game_key ^= ((m_key[0x6]->read() & 0x04) << 6); // X / B trigger + game_key ^= ((m_key[0x2]->read() & 0x20) << 2); // Q / R trigger + game_key ^= ((m_key[0x3]->read() & 0x10) << 2); // A / X trigger + game_key ^= ((m_key[0x3]->read() & 0x08) << 2); // S / Y trigger + game_key ^= ((m_key[0x4]->read() & 0x08) << 1); // D / Z trigger + game_key ^= ((m_key[0x4]->read() & 0x10) >> 1); // E / L trigger + + return game_key; +} + +UINT8 saturn_keybd_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + + /* + Keyboard Status hook-up + TODO: how shift key actually works? EGWord uses it in order to switch between hiragana and katakana modes. + x--- ---- 0 + -x-- ---- caps lock + --x- ---- num lock + ---x ---- scroll lock + ---- x--- data ok + ---- -x-- 1 + ---- --x- 1 + ---- ---x Break key + */ + + switch (offset) + { + case 0: + default: + res = get_game_key() >> 8; + break; + case 1: + res = get_game_key() & 0xff; + break; + case 3: + res = m_status | 6; + break; + case 4: + if (m_prev_data != m_data) + { + res = m_data; + m_repeat_count = 0; + m_prev_data = m_data; + } + else + { + /* Very crude repeat support */ + m_repeat_count++; + m_repeat_count = m_repeat_count > 32 ? 32 : m_repeat_count; + res = (m_repeat_count == 32) ? m_data : 0; + } + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/keybd.h b/src/devices/bus/sat_ctrl/keybd.h new file mode 100644 index 00000000000..f2cb5d14ba2 --- /dev/null +++ b/src/devices/bus/sat_ctrl/keybd.h @@ -0,0 +1,62 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Keyboard emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_KEYBD__ +#define __SATURN_KEYBD__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_keybd_device + +class saturn_keybd_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_keybd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + + DECLARE_INPUT_CHANGED_MEMBER(key_stroke); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + UINT8 m_status; + UINT8 m_data; + UINT8 m_prev_data; + UINT16 m_repeat_count; + + UINT16 get_game_key(); + + required_ioport_array<16> m_key; + required_ioport m_key_s1; +}; + +// device type definition +extern const device_type SATURN_KEYBD; + + +#endif diff --git a/src/devices/bus/sat_ctrl/mouse.cpp b/src/devices/bus/sat_ctrl/mouse.cpp new file mode 100644 index 00000000000..a0ef74824b9 --- /dev/null +++ b/src/devices/bus/sat_ctrl/mouse.cpp @@ -0,0 +1,120 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Mouse emulation + + This is basically the same as a pointing controller, but it uses a different ID + +**********************************************************************/ + +#include "mouse.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_MOUSE = &device_creator; + + +static INPUT_PORTS_START( saturn_mouse ) + PORT_START("MOUSE_X") + PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("Mouse X") + + PORT_START("MOUSE_Y") + PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("Mouse Y") + + PORT_START("BUTTONS") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Button") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Button") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Middle Button") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start Button") +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_mouse_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_mouse ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_mouse_device - constructor +//------------------------------------------------- + +saturn_mouse_device::saturn_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_MOUSE, "Sega Saturn Mouse", tag, owner, clock, "saturn_mouse", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_pointx(*this, "MOUSE_X"), + m_pointy(*this, "MOUSE_Y"), + m_buttons(*this, "BUTTONS") +{ + m_ctrl_id = 0xe3; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_mouse_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_mouse_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_mouse_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + UINT8 mouse_ctrl = m_buttons->read(); + INT16 mouse_x = m_pointx->read(); + INT16 mouse_y = m_pointy->read(); + + if (mouse_x < 0) + mouse_ctrl |= 0x10; + + if (mouse_y < 0) + mouse_ctrl |= 0x20; + + if ((mouse_x & 0xff00) != 0xff00 && (mouse_x & 0xff00) != 0x0000) + mouse_ctrl |= 0x40; + + if ((mouse_y & 0xff00) != 0xff00 && (mouse_y & 0xff00) != 0x0000) + mouse_ctrl |= 0x80; + + switch (offset) + { + case 0: + default: + res = mouse_ctrl; + break; + case 1: + res = mouse_x & 0xff; + break; + case 2: + res = mouse_y & 0xff; + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/mouse.h b/src/devices/bus/sat_ctrl/mouse.h new file mode 100644 index 00000000000..f0ea613f8e3 --- /dev/null +++ b/src/devices/bus/sat_ctrl/mouse.h @@ -0,0 +1,55 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Mouse emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_MOUSE__ +#define __SATURN_MOUSE__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_mouse_device + +class saturn_mouse_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_pointx; + required_ioport m_pointy; + required_ioport m_buttons; +}; + + +// device type definition +extern const device_type SATURN_MOUSE; + + +#endif diff --git a/src/devices/bus/sat_ctrl/multitap.cpp b/src/devices/bus/sat_ctrl/multitap.cpp new file mode 100644 index 00000000000..4de26acb070 --- /dev/null +++ b/src/devices/bus/sat_ctrl/multitap.cpp @@ -0,0 +1,139 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn multitap emulation + +**********************************************************************/ + +#include "multitap.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_MULTITAP = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_multitap_device - constructor +//------------------------------------------------- + +saturn_multitap_device::saturn_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_MULTITAP, "Sega Saturn Multitap", tag, owner, clock, "saturn_multitap", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_subctrl1_port(*this, "ctrl1"), + m_subctrl2_port(*this, "ctrl2"), + m_subctrl3_port(*this, "ctrl3"), + m_subctrl4_port(*this, "ctrl4"), + m_subctrl5_port(*this, "ctrl5"), + m_subctrl6_port(*this, "ctrl6") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_multitap_device::device_start() +{ + m_subctrl1_port->device_start(); + m_subctrl2_port->device_start(); + m_subctrl3_port->device_start(); + m_subctrl4_port->device_start(); + m_subctrl5_port->device_start(); + m_subctrl6_port->device_start(); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_multitap_device::device_reset() +{ +} + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_multitap_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + default: + case 0: + case 1: + res = m_subctrl1_port->read_ctrl(offset & 1); + break; + case 2: + case 3: + res = m_subctrl2_port->read_ctrl(offset & 1); + break; + case 4: + case 5: + res = m_subctrl3_port->read_ctrl(offset & 1); + break; + case 6: + case 7: + res = m_subctrl4_port->read_ctrl(offset & 1); + break; + case 8: + case 9: + res = m_subctrl5_port->read_ctrl(offset & 1); + break; + case 10: + case 11: + res = m_subctrl6_port->read_ctrl(offset & 1); + break; + } + return res; +} + +//------------------------------------------------- +// read_id +//------------------------------------------------- + +UINT8 saturn_multitap_device::read_id(int idx) +{ + switch (idx) + { + case 0: + default: + return m_subctrl1_port->read_id(0); + case 1: + return m_subctrl2_port->read_id(0); + case 2: + return m_subctrl3_port->read_id(0); + case 3: + return m_subctrl4_port->read_id(0); + case 4: + return m_subctrl5_port->read_id(0); + case 5: + return m_subctrl6_port->read_id(0); + } +} + + +static MACHINE_CONFIG_FRAGMENT( multitap_slot ) + MCFG_SATURN_CONTROL_PORT_ADD("ctrl1", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl2", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl3", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl4", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl5", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl6", saturn_joys, "joypad") +MACHINE_CONFIG_END + + +machine_config_constructor saturn_multitap_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( multitap_slot ); +} diff --git a/src/devices/bus/sat_ctrl/multitap.h b/src/devices/bus/sat_ctrl/multitap.h new file mode 100644 index 00000000000..2d48ff478c8 --- /dev/null +++ b/src/devices/bus/sat_ctrl/multitap.h @@ -0,0 +1,60 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn multitap emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_MULTITAP__ +#define __SATURN_MULTITAP__ + + +#include "emu.h" +#include "ctrl.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_multitap_device + +class saturn_multitap_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0x16; } + virtual UINT8 read_id(int idx) override; + +private: + required_device m_subctrl1_port; + required_device m_subctrl2_port; + required_device m_subctrl3_port; + required_device m_subctrl4_port; + required_device m_subctrl5_port; + required_device m_subctrl6_port; +}; + + +// device type definition +extern const device_type SATURN_MULTITAP; + + +#endif diff --git a/src/devices/bus/sat_ctrl/pointer.cpp b/src/devices/bus/sat_ctrl/pointer.cpp new file mode 100644 index 00000000000..cfc2bbfc3b2 --- /dev/null +++ b/src/devices/bus/sat_ctrl/pointer.cpp @@ -0,0 +1,120 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Pointing Controller / Trackball emulation + + This is basically the same as a mouse, but it uses a different ID + +**********************************************************************/ + +#include "pointer.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_TRACK = &device_creator; + + +static INPUT_PORTS_START( saturn_track ) + PORT_START("POINT_X") + PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("Pointer X") + + PORT_START("POINT_Y") + PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("Pointer Y") + + PORT_START("BUTTONS") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Left Button") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Right Button") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Middle Button") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("Start Button") +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_track_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_track ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_track_device - constructor +//------------------------------------------------- + +saturn_track_device::saturn_track_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_TRACK, "Sega Saturn Pointing Controller / Trackball", tag, owner, clock, "saturn_track", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_pointx(*this, "POINT_X"), + m_pointy(*this, "POINT_Y"), + m_buttons(*this, "BUTTONS") +{ + m_ctrl_id = 0x23; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_track_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_track_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_track_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + UINT8 mouse_ctrl = m_buttons->read(); + INT16 mouse_x = m_pointx->read(); + INT16 mouse_y = m_pointy->read(); + + if (mouse_x < 0) + mouse_ctrl |= 0x10; + + if (mouse_y < 0) + mouse_ctrl |= 0x20; + + if ((mouse_x & 0xff00) != 0xff00 && (mouse_x & 0xff00) != 0x0000) + mouse_ctrl |= 0x40; + + if ((mouse_y & 0xff00) != 0xff00 && (mouse_y & 0xff00) != 0x0000) + mouse_ctrl |= 0x80; + + switch (offset) + { + case 0: + default: + res = mouse_ctrl; + break; + case 1: + res = mouse_x & 0xff; + break; + case 2: + res = mouse_y & 0xff; + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/pointer.h b/src/devices/bus/sat_ctrl/pointer.h new file mode 100644 index 00000000000..e71cc9c898c --- /dev/null +++ b/src/devices/bus/sat_ctrl/pointer.h @@ -0,0 +1,55 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Pointing Controller / Trackball emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_TRACK__ +#define __SATURN_TRACK__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_track_device + +class saturn_track_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_track_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_pointx; + required_ioport m_pointy; + required_ioport m_buttons; +}; + + +// device type definition +extern const device_type SATURN_TRACK; + + +#endif diff --git a/src/devices/bus/sat_ctrl/racing.cpp b/src/devices/bus/sat_ctrl/racing.cpp new file mode 100644 index 00000000000..9e7a3e89f2f --- /dev/null +++ b/src/devices/bus/sat_ctrl/racing.cpp @@ -0,0 +1,109 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Racing Wheel emulation + +**********************************************************************/ + +#include "racing.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_WHEEL = &device_creator; + + +static INPUT_PORTS_START( saturn_racing ) + PORT_START("JOY") + PORT_BIT(0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) + PORT_BIT(0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) + PORT_BIT(0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) + PORT_BIT(0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) + PORT_BIT(0x0800, IP_ACTIVE_LOW, IPT_START) + PORT_BIT(0x0400, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("A") + PORT_BIT(0x0200, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("C") + PORT_BIT(0x0100, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("B") + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_BUTTON8) PORT_NAME("R") + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("X") + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Y") + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_NAME("Z") + PORT_BIT(0x0008, IP_ACTIVE_LOW, IPT_BUTTON7) PORT_NAME("L") + // Note: unused bits must stay high, Bug 2 relies on this. + PORT_BIT(0x0007, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("ANALOG_X") + PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_NAME("Racing Stick X") +INPUT_PORTS_END + + +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +ioport_constructor saturn_wheel_device::device_input_ports() const +{ + return INPUT_PORTS_NAME( saturn_racing ); +} + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_wheel_device - constructor +//------------------------------------------------- + +saturn_wheel_device::saturn_wheel_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_WHEEL, "Sega Saturn Racing Wheel", tag, owner, clock, "saturn_racing", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_joy(*this, "JOY"), + m_anx(*this, "ANALOG_X") +{ + m_ctrl_id = 0x13; +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_wheel_device::device_start() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_wheel_device::device_reset() +{ +} + + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_wheel_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + case 0: + default: + res = m_joy->read() >> 8; + break; + case 1: + res = m_joy->read() & 0xff; + break; + case 2: + res = m_anx->read(); + break; + } + return res; +} + diff --git a/src/devices/bus/sat_ctrl/racing.h b/src/devices/bus/sat_ctrl/racing.h new file mode 100644 index 00000000000..cc1e8019b1d --- /dev/null +++ b/src/devices/bus/sat_ctrl/racing.h @@ -0,0 +1,54 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn Racing Wheel emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_RACING__ +#define __SATURN_RACING__ + + +#include "emu.h" +#include "ctrl.h" + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_wheel_device + +class saturn_wheel_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_wheel_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual ioport_constructor device_input_ports() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0xf1; } + virtual UINT8 read_id(int idx) override { return m_ctrl_id; } + +private: + required_ioport m_joy; + required_ioport m_anx; +}; + + +// device type definition +extern const device_type SATURN_WHEEL; + + +#endif diff --git a/src/devices/bus/sat_ctrl/segatap.cpp b/src/devices/bus/sat_ctrl/segatap.cpp new file mode 100644 index 00000000000..7b759902cd7 --- /dev/null +++ b/src/devices/bus/sat_ctrl/segatap.cpp @@ -0,0 +1,121 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn SegaTap / Team Player emulation + +**********************************************************************/ + +#include "segatap.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type SATURN_SEGATAP = &device_creator; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// saturn_segatap_device - constructor +//------------------------------------------------- + +saturn_segatap_device::saturn_segatap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, SATURN_SEGATAP, "Sega Saturn SegaTap", tag, owner, clock, "saturn_segatap", __FILE__), + device_saturn_control_port_interface(mconfig, *this), + m_subctrl1_port(*this, "ctrl1"), + m_subctrl2_port(*this, "ctrl2"), + m_subctrl3_port(*this, "ctrl3"), + m_subctrl4_port(*this, "ctrl4") +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void saturn_segatap_device::device_start() +{ + m_subctrl1_port->device_start(); + m_subctrl2_port->device_start(); + m_subctrl3_port->device_start(); + m_subctrl4_port->device_start(); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void saturn_segatap_device::device_reset() +{ +} + +//------------------------------------------------- +// read_ctrl +//------------------------------------------------- + +UINT8 saturn_segatap_device::read_ctrl(UINT8 offset) +{ + UINT8 res = 0; + switch (offset) + { + default: + case 0: + case 1: + res = m_subctrl1_port->read_ctrl(offset & 1); + break; + case 2: + case 3: + res = m_subctrl2_port->read_ctrl(offset & 1); + break; + case 4: + case 5: + res = m_subctrl3_port->read_ctrl(offset & 1); + break; + case 6: + case 7: + res = m_subctrl4_port->read_ctrl(offset & 1); + break; + } + return res; +} + +//------------------------------------------------- +// read_id +//------------------------------------------------- + +UINT8 saturn_segatap_device::read_id(int idx) +{ + switch (idx) + { + case 0: + default: + return m_subctrl1_port->read_id(0); + case 1: + return m_subctrl2_port->read_id(0); + case 2: + return m_subctrl3_port->read_id(0); + case 3: + return m_subctrl4_port->read_id(0); + } +} + + +static MACHINE_CONFIG_FRAGMENT( segatap_slot ) + MCFG_SATURN_CONTROL_PORT_ADD("ctrl1", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl2", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl3", saturn_joys, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl4", saturn_joys, "joypad") +MACHINE_CONFIG_END + + +machine_config_constructor saturn_segatap_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME( segatap_slot ); +} diff --git a/src/devices/bus/sat_ctrl/segatap.h b/src/devices/bus/sat_ctrl/segatap.h new file mode 100644 index 00000000000..443175ebc33 --- /dev/null +++ b/src/devices/bus/sat_ctrl/segatap.h @@ -0,0 +1,58 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/********************************************************************** + + Sega Saturn SegaTap / Team Play emulation + +**********************************************************************/ + +#pragma once + +#ifndef __SATURN_SEGATAP__ +#define __SATURN_SEGATAP__ + + +#include "emu.h" +#include "ctrl.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> saturn_segatap_device + +class saturn_segatap_device : public device_t, + public device_saturn_control_port_interface +{ +public: + // construction/destruction + saturn_segatap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // optional information overrides + virtual machine_config_constructor device_mconfig_additions() const override; + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + // device_saturn_control_port_interface overrides + virtual UINT8 read_ctrl(UINT8 offset) override; + virtual UINT8 read_status() override { return 0x04; } + virtual UINT8 read_id(int idx) override; + +private: + required_device m_subctrl1_port; + required_device m_subctrl2_port; + required_device m_subctrl3_port; + required_device m_subctrl4_port; +}; + + +// device type definition +extern const device_type SATURN_SEGATAP; + + +#endif diff --git a/src/devices/machine/smpc.cpp b/src/devices/machine/smpc.cpp index 34a7cb87f05..6b7e0225dfa 100644 --- a/src/devices/machine/smpc.cpp +++ b/src/devices/machine/smpc.cpp @@ -344,188 +344,63 @@ TIMER_CALLBACK_MEMBER( saturn_state::stv_smpc_intback ) } } - /* - [0] port status: - 0x04 Sega-tap - 0x16 Multi-tap - 0x2x clock serial peripheral - 0xf0 peripheral isn't connected - 0xf1 peripheral is connected - [1] Peripheral ID (note: lowest four bits determines the size of the input packet) - 0x02 digital pad - 0x25 (tested by Game Basic?) - 0x34 keyboard + [0] port status: + 0x04 Sega-tap + 0x16 Multi-tap + 0x2x clock serial peripheral + 0xf0 peripheral isn't connected + 0xf1 peripheral is connected + [1] Peripheral ID (note: lowest four bits determines the size of the input packet) + 0x02 digital pad + 0x25 (tested by Game Basic?) + 0x34 keyboard + + Lower 4 bits of the port status tell the number of controllers to check for the port + Lower 4 bits of the peripheral ID tell the number of registers used by each controller + For multitap / segatap, we have implemented the following logic: + SMPC reads in sequence + - status for port 1 + - ID first controller, followed by the number of reads needed by the plugged controller + - ID second controller, followed by the number of reads needed by the plugged controller + - and so on... until the 4th (for SegaTap) or 6th (for Multitap) controller is read */ -void saturn_state::smpc_digital_pad(UINT8 pad_num, UINT8 offset) -{ - static const char *const padnames[] = { "JOY1", "JOY2" }; - UINT16 pad_data; - - pad_data = ioport(padnames[pad_num])->read(); - m_smpc.OREG[0+pad_num*offset] = 0xf1; - m_smpc.OREG[1+pad_num*offset] = 0x02; - m_smpc.OREG[2+pad_num*offset] = pad_data>>8; - m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff; -} - -void saturn_state::smpc_analog_pad( UINT8 pad_num, UINT8 offset, UINT8 id) -{ - static const char *const padnames[] = { "AN_JOY1", "AN_JOY2" }; - static const char *const annames[2][3] = { { "AN_X1", "AN_Y1", "AN_Z1" }, - { "AN_X2", "AN_Y2", "AN_Z2" }}; - UINT16 pad_data; - - pad_data = ioport(padnames[pad_num])->read(); - m_smpc.OREG[0+pad_num*offset] = 0xf1; - m_smpc.OREG[1+pad_num*offset] = id; - m_smpc.OREG[2+pad_num*offset] = pad_data>>8; - m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff; - m_smpc.OREG[4+pad_num*offset] = ioport(annames[pad_num][0])->read(); - if(id == 0x15) - { - m_smpc.OREG[5+pad_num*offset] = ioport(annames[pad_num][1])->read(); - m_smpc.OREG[6+pad_num*offset] = ioport(annames[pad_num][2])->read(); - } -} - -void saturn_state::smpc_keyboard(UINT8 pad_num, UINT8 offset) -{ - UINT16 game_key; - - game_key = 0xffff; - - game_key ^= ((ioport("KEYS_1")->read() & 0x80) << 8); // right - game_key ^= ((ioport("KEYS_1")->read() & 0x40) << 8); // left - game_key ^= ((ioport("KEYS_1")->read() & 0x20) << 8); // down - game_key ^= ((ioport("KEYS_1")->read() & 0x10) << 8); // up - game_key ^= ((ioport("KEYF")->read() & 0x80) << 4); // ESC -> START - game_key ^= ((ioport("KEY3")->read() & 0x04) << 8); // Z / A trigger - game_key ^= ((ioport("KEY4")->read() & 0x02) << 8); // C / C trigger - game_key ^= ((ioport("KEY6")->read() & 0x04) << 6); // X / B trigger - game_key ^= ((ioport("KEY2")->read() & 0x20) << 2); // Q / R trigger - game_key ^= ((ioport("KEY3")->read() & 0x10) << 2); // A / X trigger - game_key ^= ((ioport("KEY3")->read() & 0x08) << 2); // S / Y trigger - game_key ^= ((ioport("KEY4")->read() & 0x08) << 1); // D / Z trigger - game_key ^= ((ioport("KEY4")->read() & 0x10) >> 1); // E / L trigger - - m_smpc.OREG[0+pad_num*offset] = 0xf1; - m_smpc.OREG[1+pad_num*offset] = 0x34; - m_smpc.OREG[2+pad_num*offset] = game_key>>8; // game buttons, TODO - m_smpc.OREG[3+pad_num*offset] = game_key & 0xff; - /* - Keyboard Status hook-up - TODO: how shift key actually works? EGWord uses it in order to switch between hiragana and katakana modes. - x--- ---- 0 - -x-- ---- caps lock - --x- ---- num lock - ---x ---- scroll lock - ---- x--- data ok - ---- -x-- 1 - ---- --x- 1 - ---- ---x Break key - */ - m_smpc.OREG[4+pad_num*offset] = m_keyb.status | 6; - if(m_keyb.prev_data != m_keyb.data) - { - m_smpc.OREG[5+pad_num*offset] = m_keyb.data; - m_keyb.repeat_count = 0; - m_keyb.prev_data = m_keyb.data; - } - else - { - /* Very crude repeat support */ - m_keyb.repeat_count ++; - m_keyb.repeat_count = m_keyb.repeat_count > 32 ? 32 : m_keyb.repeat_count; - m_smpc.OREG[5+pad_num*offset] = (m_keyb.repeat_count == 32) ? m_keyb.data : 0; - } -} - -void saturn_state::smpc_mouse(UINT8 pad_num, UINT8 offset, UINT8 id) -{ - static const char *const mousenames[2][3] = { { "MOUSEB1", "MOUSEX1", "MOUSEY1" }, - { "MOUSEB2", "MOUSEX2", "MOUSEY2" }}; - UINT8 mouse_ctrl; - INT16 mouse_x, mouse_y; - - mouse_ctrl = ioport(mousenames[pad_num][0])->read(); - mouse_x = ioport(mousenames[pad_num][1])->read(); - mouse_y = ioport(mousenames[pad_num][2])->read(); - - if(mouse_x < 0) - mouse_ctrl |= 0x10; - - if(mouse_y < 0) - mouse_ctrl |= 0x20; - - if((mouse_x & 0xff00) != 0xff00 && (mouse_x & 0xff00) != 0x0000) - mouse_ctrl |= 0x40; - - if((mouse_y & 0xff00) != 0xff00 && (mouse_y & 0xff00) != 0x0000) - mouse_ctrl |= 0x80; - - m_smpc.OREG[0+pad_num*offset] = 0xf1; - m_smpc.OREG[1+pad_num*offset] = id; // 0x23 / 0xe3 - m_smpc.OREG[2+pad_num*offset] = mouse_ctrl; - m_smpc.OREG[3+pad_num*offset] = mouse_x & 0xff; - m_smpc.OREG[4+pad_num*offset] = mouse_y & 0xff; -} - -/* TODO: is there ANY game on which the MD pad works? */ -void saturn_state::smpc_md_pad(UINT8 pad_num, UINT8 offset, UINT8 id) -{ - static const char *const padnames[] = { "MD_JOY1", "MD_JOY2" }; - UINT16 pad_data; - - pad_data = ioport(padnames[pad_num])->read(); - m_smpc.OREG[0+pad_num*offset] = 0xf1; - m_smpc.OREG[1+pad_num*offset] = id; - m_smpc.OREG[2+pad_num*offset] = pad_data>>8; - if(id == 0xe2) // MD 6 Button PAD - m_smpc.OREG[3+pad_num*offset] = pad_data & 0xff; -} - -void saturn_state::smpc_unconnected(UINT8 pad_num, UINT8 offset) -{ - m_smpc.OREG[0+pad_num*offset] = 0xf0; -} - TIMER_CALLBACK_MEMBER( saturn_state::intback_peripheral ) { - int pad_num; - static const UINT8 peri_id[10] = { 0x02, 0x13, 0x15, 0x23, 0x23, 0x34, 0xe1, 0xe2, 0xe3, 0xff }; - UINT8 read_id[2]; - UINT8 offset; - -// if (LOG_SMPC) logerror("SMPC: providing PAD data for intback, pad %d\n", intback_stage-2); - - read_id[0] = (ioport("INPUT_TYPE")->read()) & 0x0f; - read_id[1] = (ioport("INPUT_TYPE")->read()) >> 4; - - /* doesn't work? */ + // if (LOG_SMPC) logerror("SMPC: providing PAD data for intback, pad %d\n", intback_stage-2); + + // doesn't work? //pad_num = m_smpc.intback_stage - 1; + + if(LOG_PAD_CMD) printf("%d %d %d\n", m_smpc.intback_stage - 1, machine().first_screen()->vpos(), (int)machine().first_screen()->frame_number()); - if(LOG_PAD_CMD) printf("%d %d %d\n",m_smpc.intback_stage - 1,machine().first_screen()->vpos(),(int)machine().first_screen()->frame_number()); + UINT8 status1 = m_ctrl1 ? m_ctrl1->read_status() : 0xf0; + UINT8 status2 = m_ctrl2 ? m_ctrl2->read_status() : 0xf0; - offset = 0; + UINT8 reg_offset = 0; + UINT8 ctrl1_offset = 0; // this is used when there is segatap or multitap connected + UINT8 ctrl2_offset = 0; // this is used when there is segatap or multitap connected - for(pad_num=0;pad_num<2;pad_num++) + m_smpc.OREG[reg_offset++] = status1; + // read ctrl1 + for (int i = 0; i < (status1 & 0xf); i++) { - switch(read_id[pad_num]) - { - case 0: smpc_digital_pad(pad_num,offset); break; - case 1: smpc_analog_pad(pad_num,offset,peri_id[read_id[pad_num]]); break; /* Steering Wheel */ - case 2: smpc_analog_pad(pad_num,offset,peri_id[read_id[pad_num]]); break; /* Analog Pad */ - case 4: smpc_mouse(pad_num,offset,peri_id[read_id[pad_num]]); break; /* Pointing Device */ - case 5: smpc_keyboard(pad_num,offset); break; - case 6: smpc_md_pad(pad_num,offset,peri_id[read_id[pad_num]]); break; /* MD 3B PAD */ - case 7: smpc_md_pad(pad_num,offset,peri_id[read_id[pad_num]]); break; /* MD 6B PAD */ - case 8: smpc_mouse(pad_num,offset,peri_id[read_id[pad_num]]); break; /* Saturn Mouse */ - case 9: smpc_unconnected(pad_num,offset); break; - } - - offset += (peri_id[read_id[pad_num]] & 0xf) + 2; /* offset for port 2 */ + UINT8 id = m_ctrl1->read_id(i); + m_smpc.OREG[reg_offset++] = id; + for (int j = 0; j < (id & 0xf); j++) + m_smpc.OREG[reg_offset++] = m_ctrl1->read_ctrl(j + ctrl1_offset); + ctrl1_offset += (id & 0xf); + } + m_smpc.OREG[reg_offset++] = status2; + // read ctrl2 + for (int i = 0; i < (status2 & 0xf); i++) + { + UINT8 id = m_ctrl2->read_id(i); + m_smpc.OREG[reg_offset++] = id; + for (int j = 0; j < (id & 0xf); j++) + m_smpc.OREG[reg_offset++] = m_ctrl2->read_ctrl(j + ctrl2_offset); + ctrl2_offset += (id & 0xf); } if (m_smpc.intback_stage == 2) @@ -906,41 +781,44 @@ WRITE8_MEMBER( saturn_state::stv_SMPC_w ) UINT8 saturn_state::smpc_th_control_mode(UINT8 pad_n) { - int th; - const char *const padnames[] = { "JOY1", "JOY2" }; UINT8 res = 0; + int th = (pad_n == 0) ? ((m_smpc.PDR1 >> 5) & 3) : ((m_smpc.PDR2 >> 5) & 3); - th = (pad_n == 0) ? ((m_smpc.PDR1>>5) & 3) : ((m_smpc.PDR2>>5) & 3); + UINT16 ctrl_read = 0; + if (m_ctrl1 && pad_n == 0) + ctrl_read = m_ctrl1->read_direct(); + if (m_ctrl2 && pad_n == 1) + ctrl_read = m_ctrl2->read_direct(); - if (LOG_SMPC) printf("SMPC: SH-2 TH control mode, returning pad data %d for phase %d\n",pad_n+1, th); + if (LOG_SMPC) printf("SMPC: SH-2 TH control mode, returning pad data %d for phase %d\n", pad_n + 1, th); - switch(th) + switch (th) { /* TODO: 3D Lemmings bogusly enables TH Control mode, wants this to return the ID, needs HW tests. */ case 3: - res = th<<6; + res = th << 6; res |= 0x14; - res |= machine().root_device().ioport(padnames[pad_n])->read() & 8; // L + res |= (ctrl_read & 8); // L break; case 2: - res = th<<6; + res = th << 6; // 1 C B Right Left Down Up // WHP actually has a very specific code at 0x6015f30, doesn't like bits 0-1 active here ... - res|= (((machine().root_device().ioport(padnames[pad_n])->read()>>4)) & 0x30); // C & B - res|= (((machine().root_device().ioport(padnames[pad_n])->read()>>12)) & 0xc); + res|= ((ctrl_read >> 4) & 0x30); // C & B + res|= ((ctrl_read >> 12) & 0xc); break; case 1: - res = th<<6; + res = th << 6; res |= 0x10; - res |= (machine().root_device().ioport(padnames[pad_n])->read()>>4) & 0xf; // R, X, Y, Z + res |= ((ctrl_read >> 4) & 0xf); // R, X, Y, Z break; case 0: - res = th<<6; + res = th << 6; // 0 Start A 0 0 Down Up - res|= (((machine().root_device().ioport(padnames[pad_n])->read()>>6)) & 0x30); // Start & A - res|= (((machine().root_device().ioport(padnames[pad_n])->read()>>12)) & 0x3); - // ... and actually wants bits 2 - 3 active here. - res|= 0xc; + res |= ((ctrl_read >> 6) & 0x30); // Start & A + res |= ((ctrl_read >> 12) & 0x03); + // ... and it actually wants bits 2 - 3 active here. + res |= 0xc; break; } @@ -949,15 +827,18 @@ UINT8 saturn_state::smpc_th_control_mode(UINT8 pad_n) UINT8 saturn_state::smpc_direct_mode(UINT8 pad_n) { - int hshake; + int hshake = (pad_n == 0) ? ((m_smpc.PDR1 >> 5) & 3) : ((m_smpc.PDR2 >> 5) & 3); const int shift_bit[4] = { 4, 12, 8, 0 }; - const char *const padnames[] = { "JOY1", "JOY2" }; - - hshake = (pad_n == 0) ? ((m_smpc.PDR1>>5) & 3) : ((m_smpc.PDR2>>5) & 3); + + UINT16 ctrl_read = 0; + if (m_ctrl1 && pad_n == 0) + ctrl_read = m_ctrl1->read_direct(); + if (m_ctrl2 && pad_n == 1) + ctrl_read = m_ctrl2->read_direct(); if (LOG_SMPC) logerror("SMPC: SH-2 direct mode, returning data for phase %d\n", hshake); - return 0x80 | 0x10 | ((machine().root_device().ioport(padnames[pad_n])->read()>>shift_bit[hshake]) & 0xf); + return 0x80 | 0x10 | ((ctrl_read >> shift_bit[hshake]) & 0xf); } READ8_MEMBER( saturn_state::saturn_SMPC_r ) @@ -985,7 +866,7 @@ READ8_MEMBER( saturn_state::saturn_SMPC_r ) { UINT8 cur_ddr; - if(machine().root_device().ioport("INPUT_TYPE")->read() && !(space.debugger_access())) + if (((m_ctrl1 && m_ctrl1->read_id(0) != 0x02) || (m_ctrl2 && m_ctrl2->read_id(0) != 0x02)) && !(space.debugger_access())) { popmessage("Warning: read with SH-2 direct mode with a non-pad device"); return 0; diff --git a/src/mame/drivers/saturn.cpp b/src/mame/drivers/saturn.cpp index 13dec46c418..a72fcc785c7 100644 --- a/src/mame/drivers/saturn.cpp +++ b/src/mame/drivers/saturn.cpp @@ -451,7 +451,6 @@ public: , m_smpc_nv(*this, "smpc_nv") { } - DECLARE_INPUT_CHANGED_MEMBER(key_stroke); DECLARE_INPUT_CHANGED_MEMBER(nmi_reset); DECLARE_INPUT_CHANGED_MEMBER(tray_open); DECLARE_INPUT_CHANGED_MEMBER(tray_close); @@ -460,7 +459,7 @@ public: DECLARE_MACHINE_RESET(saturn); DECLARE_READ8_MEMBER(saturn_cart_type_r); - DECLARE_READ32_MEMBER( abus_dummy_r ); + DECLARE_READ32_MEMBER(abus_dummy_r); DECLARE_READ32_MEMBER(saturn_null_ram_r); DECLARE_WRITE32_MEMBER(saturn_null_ram_w); @@ -539,87 +538,6 @@ static ADDRESS_MAP_START( scudsp_data, AS_DATA, 32, sat_console_state ) ADDRESS_MAP_END -/* keyboard code */ -/* TODO: needs a proper keycode table */ -INPUT_CHANGED_MEMBER(sat_console_state::key_stroke) -{ - if(newval && !oldval) - { - m_keyb.data = ((UINT8)(FPTR)(param) & 0xff); - m_keyb.status |= 8; - } - - if(oldval && !newval) - { - //m_keyb.status &= ~8; - m_keyb.data = 0; - } -} - -/* Note: unused bits must stay high, Bug 2 relies on this. */ -#define SATURN_PAD_P1(_mask_, _val_) \ - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 R") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P1 L") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) - -#define SATURN_PAD_P2(_mask_, _val_) \ - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P2 R") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 X") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Y") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P2 Z") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("P2 L") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0007, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) - -#define MD_PAD_P1(_mask_, _val_) \ - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P1 A") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P1 C") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 B") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P1 Mode") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P1 X") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P1 Y") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P1 Z") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) //read '1' when direct mode is polled - -#define MD_PAD_P2(_mask_, _val_) \ - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_START ) PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("P2 A") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("P2 C") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P2 B") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("P2 Mode") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("P2 X") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("P2 Y") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("P2 Z") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) \ - PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CONDITION("INPUT_TYPE", _mask_, EQUALS, _val_) //read '1' when direct mode is polled - -#define SATURN_KEYBOARD PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x05) INPUT_CHANGED_MEMBER(sat_console_state::nmi_reset) { @@ -650,281 +568,6 @@ static INPUT_PORTS_START( saturn ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, tray_open,0) PORT_NAME("Tray Open Button") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, tray_close,0) PORT_NAME("Tray Close") - PORT_START("JOY1") - SATURN_PAD_P1(0x0f, 0) - - PORT_START("JOY2") - SATURN_PAD_P2(0xf0, 0) - - /* TODO: there's no info about the keycode used on Saturn keyboard, following is trial & error with Game Basic software */ - PORT_START("KEY0") // 0x00 - 0x07 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_UNUSED) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F1") /*PORT_CODE(KEYCODE_F1)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x01) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x02) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F2") /*PORT_CODE(KEYCODE_F2)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x03) PORT_PLAYER(1) SATURN_KEYBOARD // RUN - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F3") /*PORT_CODE(KEYCODE_F3)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x04) PORT_PLAYER(1) SATURN_KEYBOARD // LIST - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F4") /*PORT_CODE(KEYCODE_F4)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x05) PORT_PLAYER(1) SATURN_KEYBOARD // EDIT - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F5") /*PORT_CODE(KEYCODE_F5)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x06) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("CLR SCR") PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x07) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY1") // 0x08 - 0x0f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x08) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F6") /*PORT_CODE(KEYCODE_F6)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x09) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F7") /*PORT_CODE(KEYCODE_F7)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F8") /*PORT_CODE(KEYCODE_F8)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F9") /*PORT_CODE(KEYCODE_F9)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0c) PORT_PLAYER(1) SATURN_KEYBOARD // LIST again - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR('5')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x0f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY2") // 0x10 - 0x17 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x10) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x11) PORT_PLAYER(1) SATURN_KEYBOARD - /* TODO: break codes! */ - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SHIFT") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x12) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("KANA SHIFT") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x13) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("(special keys)") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x14) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x15) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x16) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x17) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY3") // 0x18 - 0x1f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x18) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x19) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x1f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY4") // 0x20 - 0x27 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x20) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x21) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x22) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x23) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x24) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x25) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x26) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x27) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY5") // 0x28 - 0x2f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5-1") /*PORT_CODE(KEYCODE_F) PORT_CHAR('F')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x28) PORT_PLAYER(1) SATURN_KEYBOARD // another F? - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x29) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x2f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY6") // 0x30 - 0x37 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x30) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x31) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x32) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x33) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x34) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x35) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x36) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x37) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY7") // 0x38 - 0x3f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x38) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x39) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x3f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY8") // 0x40 - 0x47 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x40) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(",") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x41) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x42) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x43) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x44) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x45) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x46) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x47) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEY9") // 0x48 - 0x4f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x48) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(".") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x49) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("/") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(";") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("- / =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x4f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYA") // 0x50 - 0x57 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x50) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xC2\xA5") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x51) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(":") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x52) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x53) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x54) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x55) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x56) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x57) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYB") // 0x58 - 0x5f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x58) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x59) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(0x0d) PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5b) PORT_PLAYER(1) SATURN_KEYBOARD // { - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("]") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5d) PORT_PLAYER(1) SATURN_KEYBOARD // } - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x5f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYC") // 0x60 - 0x67 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x60) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x61) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x62) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x63) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x64) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x65) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("BACKSPACE") PORT_CODE(KEYCODE_BACKSPACE) /* PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x66) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x67) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYD") // 0x68 - 0x6f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x68) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x69) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x6f) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYE") // 0x70 - 0x77 - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x70) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x71) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x72) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x73) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x74) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x75) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x76) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E-8") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x77) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("KEYF") // 0x78 - 0x7f - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-1") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x78) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-2") /*PORT_CODE(KEYCODE_1) PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x79) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-3") /*PORT_CODE(KEYCODE_2) PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-4") /*PORT_CODE(KEYCODE_3) PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7b) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x10,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-5") /*PORT_CODE(KEYCODE_4) PORT_CHAR('4')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7c) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x20,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-6") /*PORT_CODE(KEYCODE_5) PORT_CHAR(0xd)*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7d) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x40,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F-7") /*PORT_CODE(KEYCODE_6) PORT_CHAR('6')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7e) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x80,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC") /*PORT_CODE(KEYCODE_7) PORT_CHAR('7')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7f) PORT_PLAYER(1) SATURN_KEYBOARD //SYSTEM CONFIGURATION - - PORT_START("KEYS_1") // special keys - PORT_BIT(0x01,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_UP) /*PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x78) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x02,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_DOWN) /*PORT_CHAR('1')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x79) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x04,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_LEFT) /*PORT_CHAR('2')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7a) PORT_PLAYER(1) SATURN_KEYBOARD - PORT_BIT(0x08,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) /*PORT_CHAR('3')*/ PORT_CHANGED_MEMBER(DEVICE_SELF, sat_console_state, key_stroke, 0x7b) PORT_PLAYER(1) SATURN_KEYBOARD - - PORT_START("MOUSEB1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Pointer Left Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pointer Right Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Pointer Middle Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Pointer Start Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Mouse Left Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Mouse Right Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Mouse Middle Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Mouse Start Button") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - - PORT_START("MOUSEX1") - PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P1 Pointer X") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P1 Mouse X") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - - PORT_START("MOUSEY1") - PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P1 Pointer Y") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x04) - PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P1 Mouse Y") PORT_PLAYER(1) PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x08) - - PORT_START("MOUSEB2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Pointer Left Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Pointer Right Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Pointer Middle Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P2 Pointer Start Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Mouse Left Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Mouse Right Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Mouse Middle Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P2 Mouse Start Button") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - - PORT_START("MOUSEX2") - PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P2 Pointer X") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0xffff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_NAME("P2 Mouse X") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - - PORT_START("MOUSEY2") - PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P2 Pointer Y") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x40) - PORT_BIT(0xffff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_MINMAX(0x000, 0xffff) PORT_KEYDELTA(2) PORT_RESET PORT_REVERSE PORT_NAME("P2 Mouse Y") PORT_PLAYER(2) PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x80) - - PORT_START("AN_JOY1") - SATURN_PAD_P1(0x0f, 0x01) // racing device - SATURN_PAD_P1(0x0f, 0x02) // analog controller - - PORT_START("AN_JOY2") - SATURN_PAD_P2(0xf0, 0x10) // racing device - SATURN_PAD_P2(0xf0, 0x20) // analog controller - - PORT_START("AN_X1") - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 Racing Stick X") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x01) - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick X") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x02) - - PORT_START("AN_Y1") - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 Racing Stick Y") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x01) - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick Y") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x02) - - PORT_START("AN_Z1") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 Racing Stick Z") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x01) - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(1) PORT_NAME("P1 AD Stick Z") PORT_CONDITION("INPUT_TYPE", 0x0f, EQUALS, 0x02) - - PORT_START("AN_X2") - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 Racing Stick X") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x10) - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick X") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x20) - - PORT_START("AN_Y2") - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 Racing Stick Y") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x10) - PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick Y") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x20) - - PORT_START("AN_Z2") - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 Racing Stick Z") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x10) - PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Z ) PORT_MINMAX(0x00, 0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(200) PORT_PLAYER(2) PORT_NAME("P2 AD Stick Z") PORT_CONDITION("INPUT_TYPE", 0xf0, EQUALS, 0x20) - - PORT_START("MD_JOY1") - MD_PAD_P1(0x0f, 0x06) // MD 3 buttons pad - MD_PAD_P1(0x0f, 0x07) // MD 6 buttons pad - - PORT_START("MD_JOY2") - MD_PAD_P2(0xf0, 0x60) // MD 3 buttons pad - MD_PAD_P2(0xf0, 0x70) // MD 6 buttons pad - - PORT_START("INPUT_TYPE") - PORT_CONFNAME(0x0f,0x00,"Controller Port 1") - PORT_CONFSETTING(0x00,"Digital Device (standard Saturn pad)") - PORT_CONFSETTING(0x01,"Racing Device") /* steering wheel only */ - PORT_CONFSETTING(0x02,"Analog Device") //Nights pad? -// PORT_CONFSETTING(0x03,"Lightgun Device") - PORT_CONFSETTING(0x04,"Trackball") // TODO: according to the docs this ID is labeled "Pointing Device" - PORT_CONFSETTING(0x05,"Keyboard Device") - PORT_CONFSETTING(0x06,"Megadrive 3B Pad") - PORT_CONFSETTING(0x07,"Megadrive 6B Pad") - PORT_CONFSETTING(0x08,"Saturn Mouse") -// PORT_CONFSETTING(0x09,"") - PORT_CONFNAME(0xf0,0x00,"Controller Port 2") - PORT_CONFSETTING(0x00,"Digital Device (standard Saturn pad)") - PORT_CONFSETTING(0x10,"Racing Device") - PORT_CONFSETTING(0x20,"Analog Device") //Nights pad? -// PORT_CONFSETTING(0x30,"Lightgun Device") - PORT_CONFSETTING(0x40,"Pointing Device") -// PORT_CONFSETTING(0x50,"Keyboard Device") - PORT_CONFSETTING(0x60,"Megadrive 3B Pad") - PORT_CONFSETTING(0x70,"Megadrive 6B Pad") - PORT_CONFSETTING(0x80,"Saturn Mouse") - PORT_CONFSETTING(0x90,"") - PORT_START("fake") PORT_CONFNAME(0x01,0x00,"Master-Slave Comms") PORT_CONFSETTING(0x00,"Normal (400 cycles)") @@ -1140,6 +783,9 @@ static MACHINE_CONFIG_START( saturn, sat_console_state ) MCFG_SOUND_ADD("cdda", CDDA, 0) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) + + MCFG_SATURN_CONTROL_PORT_ADD("ctrl1", saturn_controls, "joypad") + MCFG_SATURN_CONTROL_PORT_ADD("ctrl2", saturn_controls, "joypad") MACHINE_CONFIG_END static SLOT_INTERFACE_START(saturn_cart) diff --git a/src/mame/includes/stv.h b/src/mame/includes/stv.h index db8329f9ecc..fa11adbceb9 100644 --- a/src/mame/includes/stv.h +++ b/src/mame/includes/stv.h @@ -8,6 +8,8 @@ #include "cpu/scudsp/scudsp.h" #include "cpu/sh2/sh2.h" +#include "bus/sat_ctrl/ctrl.h" + #include "bus/generic/slot.h" #include "bus/generic/carts.h" @@ -38,7 +40,9 @@ public: m_cart3(*this, "stv_slot3"), m_cart4(*this, "stv_slot4"), m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_ctrl1(*this, "ctrl1"), + m_ctrl2(*this, "ctrl2") { } @@ -173,8 +177,8 @@ public: optional_device m_cart4; required_device m_gfxdecode; required_device m_palette; - - + optional_device m_ctrl1; + optional_device m_ctrl2; bitmap_rgb32 m_tmpbitmap; DECLARE_VIDEO_START(stv_vdp2);