(MESS) sms.c: Added support for Sega Graphic Board input. (nw)
This commit is contained in:
parent
781bdc9af7
commit
67482b30dd
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1517,6 +1517,8 @@ src/emu/bus/sega8/rom.c svneol=native#text/plain
|
|||||||
src/emu/bus/sega8/rom.h svneol=native#text/plain
|
src/emu/bus/sega8/rom.h svneol=native#text/plain
|
||||||
src/emu/bus/sega8/sega8_slot.c svneol=native#text/plain
|
src/emu/bus/sega8/sega8_slot.c svneol=native#text/plain
|
||||||
src/emu/bus/sega8/sega8_slot.h svneol=native#text/plain
|
src/emu/bus/sega8/sega8_slot.h svneol=native#text/plain
|
||||||
|
src/emu/bus/sms_ctrl/graphic.c svneol=native#text/plain
|
||||||
|
src/emu/bus/sms_ctrl/graphic.h svneol=native#text/plain
|
||||||
src/emu/bus/sms_ctrl/joypad.c svneol=native#text/plain
|
src/emu/bus/sms_ctrl/joypad.c svneol=native#text/plain
|
||||||
src/emu/bus/sms_ctrl/joypad.h svneol=native#text/plain
|
src/emu/bus/sms_ctrl/joypad.h svneol=native#text/plain
|
||||||
src/emu/bus/sms_ctrl/lphaser.c svneol=native#text/plain
|
src/emu/bus/sms_ctrl/lphaser.c svneol=native#text/plain
|
||||||
|
158
src/emu/bus/sms_ctrl/graphic.c
Normal file
158
src/emu/bus/sms_ctrl/graphic.c
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
|
||||||
|
Sega Master System "Graphic Board" emulation
|
||||||
|
|
||||||
|
Copyright MESS Team.
|
||||||
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
|
|
||||||
|
I/O 3f write | this method
|
||||||
|
0x20 | 0x7f
|
||||||
|
0x00 | 0x3f
|
||||||
|
0x30 | 0xff
|
||||||
|
|
||||||
|
Typical sequence:
|
||||||
|
- 3f write 0x20
|
||||||
|
- read dc
|
||||||
|
- 3f write 0x00
|
||||||
|
- read dc
|
||||||
|
- 3f write 0x20
|
||||||
|
- read dc
|
||||||
|
- 3f write 0x30
|
||||||
|
Suspect from kind of counter that is reset by a 0x30 write to I/O port 0x3f.
|
||||||
|
Once reset reads from i/O port dc expect to see 0xE0.
|
||||||
|
And then any write with differing bits goes through several internal I/O ports
|
||||||
|
with the first port being the one with the buttons
|
||||||
|
|
||||||
|
In the reset/start state the lower four/five bits are 0.
|
||||||
|
Then a nibble is read containing the buttons (active low)
|
||||||
|
Then 2 nibbles are read to form a byte (first high nibble, then low nibble) indicating
|
||||||
|
whether the pen is on the graphic board, a value of FD, FE, or FF used for this. For
|
||||||
|
any other value the following 2 bytes are not read.
|
||||||
|
Then 2 nibbles are read to form a byte containing the absolute X coordinate.
|
||||||
|
THen 2 nibbles are read to form a byte containing the absolute Y coordiante.
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#include "graphic.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// DEVICE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
const device_type SMS_GRAPHIC = &device_creator<sms_graphic_device>;
|
||||||
|
|
||||||
|
|
||||||
|
static INPUT_PORTS_START( sms_graphic )
|
||||||
|
PORT_START("BUTTONS")
|
||||||
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // MENU
|
||||||
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) // DO
|
||||||
|
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) // PEN
|
||||||
|
PORT_BIT( 0xf8, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||||
|
|
||||||
|
PORT_START("X")
|
||||||
|
PORT_BIT( 0xff, 0x00, IPT_LIGHTGUN_X) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(15)
|
||||||
|
|
||||||
|
PORT_START("Y")
|
||||||
|
PORT_BIT( 0xff, 0x00, IPT_LIGHTGUN_Y) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_SENSITIVITY(50) PORT_KEYDELTA(15)
|
||||||
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// input_ports - device-specific input ports
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
ioport_constructor sms_graphic_device::device_input_ports() const
|
||||||
|
{
|
||||||
|
return INPUT_PORTS_NAME( sms_graphic );
|
||||||
|
}
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// LIVE DEVICE
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// sms_graphic_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
sms_graphic_device::sms_graphic_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: device_t(mconfig, SMS_GRAPHIC, "Graphic Board", tag, owner, clock, "sms_joypad", __FILE__)
|
||||||
|
, device_sms_control_port_interface(mconfig, *this)
|
||||||
|
, m_buttons(*this, "BUTTONS")
|
||||||
|
, m_x(*this, "X")
|
||||||
|
, m_y(*this, "Y")
|
||||||
|
, m_index(0)
|
||||||
|
, m_previous_write(0xff)
|
||||||
|
, m_pressure(0xfd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// device_start - device-specific startup
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
void sms_graphic_device::device_start()
|
||||||
|
{
|
||||||
|
save_item(NAME(m_index));
|
||||||
|
save_item(NAME(m_previous_write));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// sms_peripheral_r - joypad read
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
UINT8 sms_graphic_device::peripheral_r()
|
||||||
|
{
|
||||||
|
switch (m_index)
|
||||||
|
{
|
||||||
|
case 0: // Initial state / "I am a board"
|
||||||
|
// If any regular button is pressed raise/lower TL ?
|
||||||
|
// if ((m_buttons->read() & 0x07) != 0x07)
|
||||||
|
// return 0xf0;
|
||||||
|
return 0xd0;
|
||||||
|
|
||||||
|
case 1: // Read buttons (active low)
|
||||||
|
return m_buttons->read();
|
||||||
|
|
||||||
|
case 2: // Some thing only FD, FE, and FF cause the other values to be read
|
||||||
|
return m_pressure >> 4;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
return m_pressure & 0x0f;
|
||||||
|
|
||||||
|
case 4: // High nibble X?
|
||||||
|
return m_x->read() >> 4;
|
||||||
|
|
||||||
|
case 5: // Low nibble X?
|
||||||
|
return m_x->read() & 0x0f;
|
||||||
|
|
||||||
|
case 6: // High nibble Y?
|
||||||
|
return m_y->read() >> 4;
|
||||||
|
|
||||||
|
case 7: // Low Nibble Y?
|
||||||
|
return m_y->read() & 0x0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sms_graphic_device::peripheral_w(UINT8 data)
|
||||||
|
{
|
||||||
|
// Check for toggle on TH/TL
|
||||||
|
if ((data ^ m_previous_write) & 0xc0)
|
||||||
|
{
|
||||||
|
m_index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If TR is high, restart
|
||||||
|
if (data & 0x80)
|
||||||
|
{
|
||||||
|
m_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_previous_write = data;
|
||||||
|
}
|
||||||
|
|
60
src/emu/bus/sms_ctrl/graphic.h
Normal file
60
src/emu/bus/sms_ctrl/graphic.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/**********************************************************************
|
||||||
|
|
||||||
|
Sega Master System "Graphic Board" emulation
|
||||||
|
|
||||||
|
Copyright MESS Team.
|
||||||
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
|
|
||||||
|
**********************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __SMS_GRAPHIC__
|
||||||
|
#define __SMS_GRAPHIC__
|
||||||
|
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "smsctrl.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
// ======================> sms_graphic_device
|
||||||
|
|
||||||
|
class sms_graphic_device : public device_t,
|
||||||
|
public device_sms_control_port_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
sms_graphic_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
// optional information overrides
|
||||||
|
virtual ioport_constructor device_input_ports() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
|
|
||||||
|
// device_sms_control_port_interface overrides
|
||||||
|
virtual UINT8 peripheral_r();
|
||||||
|
virtual void peripheral_w(UINT8 data);
|
||||||
|
|
||||||
|
private:
|
||||||
|
required_ioport m_buttons;
|
||||||
|
required_ioport m_x;
|
||||||
|
required_ioport m_y;
|
||||||
|
|
||||||
|
int m_index;
|
||||||
|
UINT8 m_previous_write;
|
||||||
|
UINT8 m_pressure;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type SMS_GRAPHIC;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -16,6 +16,7 @@
|
|||||||
#include "sportsjp.h"
|
#include "sportsjp.h"
|
||||||
#include "rfu.h"
|
#include "rfu.h"
|
||||||
#include "multitap.h"
|
#include "multitap.h"
|
||||||
|
#include "graphic.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -129,4 +130,5 @@ SLOT_INTERFACE_START( sms_control_port_devices )
|
|||||||
SLOT_INTERFACE("sportspadjp", SMS_SPORTS_PAD_JP)
|
SLOT_INTERFACE("sportspadjp", SMS_SPORTS_PAD_JP)
|
||||||
SLOT_INTERFACE("rapidfire", SMS_RAPID_FIRE)
|
SLOT_INTERFACE("rapidfire", SMS_RAPID_FIRE)
|
||||||
SLOT_INTERFACE("multitap", SMS_MULTITAP)
|
SLOT_INTERFACE("multitap", SMS_MULTITAP)
|
||||||
|
SLOT_INTERFACE("graphic", SMS_GRAPHIC)
|
||||||
SLOT_INTERFACE_END
|
SLOT_INTERFACE_END
|
||||||
|
Loading…
Reference in New Issue
Block a user