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]
This commit is contained in:
etabeta78 2016-04-23 19:07:33 +02:00
parent d80b977719
commit 3b1f24dd82
26 changed files with 2175 additions and 556 deletions

View File

@ -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
---------------------------------------------------
--

View File

@ -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

View File

@ -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

View File

@ -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<saturn_analog_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_control_port_device>;
//**************************************************************************
// 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<saturn_control_port_device *>(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<device_saturn_control_port_interface *>(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

View File

@ -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

View File

@ -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<saturn_joy_device>;
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();
}

View File

@ -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

View File

@ -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<saturn_joymd3b_device>;
const device_type SATURN_JOYMD6B = &device_creator<saturn_joymd6b_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_keybd_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_mouse_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_multitap_device>;
//**************************************************************************
// 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 );
}

View File

@ -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<saturn_control_port_device> m_subctrl1_port;
required_device<saturn_control_port_device> m_subctrl2_port;
required_device<saturn_control_port_device> m_subctrl3_port;
required_device<saturn_control_port_device> m_subctrl4_port;
required_device<saturn_control_port_device> m_subctrl5_port;
required_device<saturn_control_port_device> m_subctrl6_port;
};
// device type definition
extern const device_type SATURN_MULTITAP;
#endif

View File

@ -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<saturn_track_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_wheel_device>;
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;
}

View File

@ -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

View File

@ -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<saturn_segatap_device>;
//**************************************************************************
// 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 );
}

View File

@ -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<saturn_control_port_device> m_subctrl1_port;
required_device<saturn_control_port_device> m_subctrl2_port;
required_device<saturn_control_port_device> m_subctrl3_port;
required_device<saturn_control_port_device> m_subctrl4_port;
};
// device type definition
extern const device_type SATURN_SEGATAP;
#endif

View File

@ -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;

View File

@ -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,"<unconnected>")
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,"<unconnected>")
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)

View File

@ -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<generic_slot_device> m_cart4;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
optional_device<saturn_control_port_device> m_ctrl1;
optional_device<saturn_control_port_device> m_ctrl2;
bitmap_rgb32 m_tmpbitmap;
DECLARE_VIDEO_START(stv_vdp2);