1 // license:BSD-3-Clause
2 // copyright-holders:Carl
3 /* PAD emulation */
4 
5 #include "emu.h"
6 #include "ctlrport.h"
7 #include "analogue.h"
8 #include "multitap.h"
9 
10 DEFINE_DEVICE_TYPE(PSX_CONTROLLER_PORT,     psx_controller_port_device,     "psx_controller_port",     "Playstation Controller Port")
11 DEFINE_DEVICE_TYPE(PSXCONTROLLERPORTS,      psxcontrollerports_device,      "psxcontrollerports",      "Playstation Controller Bus")
12 DEFINE_DEVICE_TYPE(PSX_STANDARD_CONTROLLER, psx_standard_controller_device, "psx_standard_controller", "Playstation Standard Controller")
13 
psx_controller_port_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)14 psx_controller_port_device::psx_controller_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
15 	device_t(mconfig, PSX_CONTROLLER_PORT, tag, owner, clock),
16 	device_single_card_slot_interface<device_psx_controller_interface>(mconfig, *this),
17 	m_tx(false),
18 	m_dev(nullptr),
19 	m_card(*this, "card")
20 {
21 }
22 
device_config_complete()23 void psx_controller_port_device::device_config_complete()
24 {
25 	m_dev = get_card_device();
26 }
27 
device_add_mconfig(machine_config & config)28 void psx_controller_port_device::device_add_mconfig(machine_config &config)
29 {
30 	PSXCARD(config, m_card, 0);
31 }
32 
disable_card(bool state)33 void psx_controller_port_device::disable_card(bool state)
34 {
35 	if(state)
36 		popmessage("Memory card port %s is disabled\n", m_card->brief_instance_name());
37 
38 	m_card->disable(state);
39 }
40 
psxcontrollerports_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)41 psxcontrollerports_device::psxcontrollerports_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
42 	device_t(mconfig, PSXCONTROLLERPORTS, tag, owner, clock),
43 	m_port0(*this, "^port1"),
44 	m_port1(*this, "^port2"),
45 	m_dsr_handler(*this),
46 	m_rxd_handler(*this)
47 {
48 }
49 
device_start()50 void psxcontrollerports_device::device_start()
51 {
52 	m_dsr_handler.resolve_safe();
53 	m_rxd_handler.resolve_safe();
54 
55 	m_port0->setup_ack_cb(psx_controller_port_device::void_cb(&psxcontrollerports_device::ack, this));
56 	m_port1->setup_ack_cb(psx_controller_port_device::void_cb(&psxcontrollerports_device::ack, this));
57 }
58 
59 // add controllers to define so they can be connected to the multitap
60 #define PSX_CONTROLLERS \
61 		device.option_add("digital_pad", PSX_STANDARD_CONTROLLER); \
62 		device.option_add("dualshock_pad", PSX_DUALSHOCK); \
63 		device.option_add("analog_joystick", PSX_ANALOG_JOYSTICK);
64 
psx_controllers(device_slot_interface & device)65 void psx_controllers(device_slot_interface &device)
66 {
67 	PSX_CONTROLLERS
68 	device.option_add("multitap", PSX_MULTITAP);
69 }
70 
psx_controllers_nomulti(device_slot_interface & device)71 void psx_controllers_nomulti(device_slot_interface &device)
72 {
73 	PSX_CONTROLLERS
74 }
75 
WRITE_LINE_MEMBER(psxcontrollerports_device::write_dtr)76 WRITE_LINE_MEMBER(psxcontrollerports_device::write_dtr)
77 {
78 	m_port0->sel_w(!state);
79 	m_port1->sel_w(state);
80 }
81 
WRITE_LINE_MEMBER(psxcontrollerports_device::write_sck)82 WRITE_LINE_MEMBER(psxcontrollerports_device::write_sck)
83 {
84 	m_port0->clock_w(state);
85 	m_port1->clock_w(state);
86 	m_rxd_handler(m_port0->rx_r() && m_port1->rx_r());
87 }
88 
WRITE_LINE_MEMBER(psxcontrollerports_device::write_txd)89 WRITE_LINE_MEMBER(psxcontrollerports_device::write_txd)
90 {
91 	m_port0->tx_w(state);
92 	m_port1->tx_w(state);
93 }
94 
ack()95 void psxcontrollerports_device::ack()
96 {
97 	m_dsr_handler(m_port0->ack_r() && m_port1->ack_r());
98 }
99 
device_psx_controller_interface(const machine_config & mconfig,device_t & device)100 device_psx_controller_interface::device_psx_controller_interface(const machine_config &mconfig, device_t &device) :
101 	device_interface(device, "psxctrl"),
102 	m_odata(0), m_idata(0), m_bit(0), m_count(0), m_memcard(false), m_clock(false), m_sel(false),
103 	m_ack(true), m_rx(false), m_ack_timer(nullptr), m_owner(nullptr)
104 {
105 }
106 
~device_psx_controller_interface()107 device_psx_controller_interface::~device_psx_controller_interface()
108 {
109 }
110 
interface_pre_start()111 void device_psx_controller_interface::interface_pre_start()
112 {
113 	m_owner = dynamic_cast<psx_controller_port_device *>(device().owner());
114 	if (!m_ack_timer)
115 		m_ack_timer = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_psx_controller_interface::ack_timer), this));
116 }
117 
interface_pre_reset()118 void device_psx_controller_interface::interface_pre_reset()
119 {
120 	m_bit = 0;
121 	m_count = 0;
122 	m_idata = 0;
123 	m_memcard = false;
124 
125 	m_clock = true;
126 	m_sel = true;
127 	m_rx = true;
128 	m_ack = true;
129 	m_owner->ack();
130 }
131 
interface_post_stop()132 void device_psx_controller_interface::interface_post_stop()
133 {
134 	m_ack_timer = nullptr;
135 }
136 
ack_timer(void * ptr,int param)137 void device_psx_controller_interface::ack_timer(void *ptr, int param)
138 {
139 	m_ack = param;
140 	m_owner->ack();
141 
142 	if (!param)
143 		m_ack_timer->adjust(attotime::from_usec(2), 1);
144 }
145 
do_pad()146 void device_psx_controller_interface::do_pad()
147 {
148 	if (!m_bit)
149 	{
150 		if(!m_count)
151 			m_odata = 0xff;
152 		m_idata = 0;
153 	}
154 
155 	m_rx = (m_odata & (1 << m_bit)) ? true : false;
156 	m_idata |= (m_owner->tx_r()?1:0) << m_bit;
157 	m_bit = (m_bit + 1) % 8;
158 
159 	if(!m_bit)
160 	{
161 		if((!m_count) && (m_idata & 0xf0))
162 		{
163 				m_memcard = true;
164 				return;
165 		}
166 
167 		if(get_pad(m_count++, &m_odata, m_idata))
168 			m_ack_timer->adjust(attotime::from_usec(10), 0);
169 		else
170 			m_count = 0;
171 	}
172 }
173 
sel_w(bool state)174 void device_psx_controller_interface::sel_w(bool state) {
175 	if(state && !m_sel)
176 		interface_pre_reset(); // don't reset the controller, just the interface
177 	m_sel = state;
178 }
179 
psx_standard_controller_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)180 psx_standard_controller_device::psx_standard_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
181 	device_t(mconfig, PSX_STANDARD_CONTROLLER, tag, owner, clock),
182 	device_psx_controller_interface(mconfig, *this),
183 	m_pad0(*this, "PSXPAD0"),
184 	m_pad1(*this, "PSXPAD1")
185 {
186 }
187 
get_pad(int count,uint8_t * odata,uint8_t idata)188 bool psx_standard_controller_device::get_pad(int count, uint8_t *odata, uint8_t idata)
189 {
190 	switch(count)
191 	{
192 		case 0:
193 			*odata = 0x41;
194 			break;
195 		case 1:
196 			if(idata != QUERY_PAD_STATE)
197 				return false;
198 			*odata = 0x5a;
199 			break;
200 		case 2:
201 			*odata = m_pad0->read();
202 			break;
203 		case 3:
204 			*odata = m_pad1->read();
205 			break;
206 		case 4:
207 			return false;
208 	}
209 	return true;
210 }
211 
212 static INPUT_PORTS_START( psx_standard_controller )
213 	PORT_START("PSXPAD0")
214 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
215 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
216 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
217 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
218 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START )
219 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
220 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
221 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SELECT )
222 
223 	PORT_START("PSXPAD1")
224 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Square")
225 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Cross")
226 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Circle")
227 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Triangle")
228 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("R1")
229 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME("L1")
230 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME("R2")
231 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME("L2")
232 INPUT_PORTS_END
233 
device_input_ports() const234 ioport_constructor psx_standard_controller_device::device_input_ports() const
235 {
236 	return INPUT_PORTS_NAME(psx_standard_controller);
237 }
238