Exemplo n.º 1
0
static void psx_pad( running_machine &machine, int n_port, int n_data )
{
	psx1_state *state = machine.driver_data<psx1_state>();
	pad_t *pad = &state->m_pad[ n_port ];
	int b_sel;
	int b_clock;
	int b_data;
	int b_ack;
	int b_ready;
	static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3" };
	psxcard_device *psxcard = NULL;

	if (n_port == 0)
	{
		psxcard = machine.device<psxcard_device>("card1");
	}
	else
	{
		psxcard = machine.device<psxcard_device>("card2");
	}

	b_sel = ( n_data & PSX_SIO_OUT_DTR ) / PSX_SIO_OUT_DTR;
	b_clock = ( n_data & PSX_SIO_OUT_CLOCK ) / PSX_SIO_OUT_CLOCK;
	b_data = ( n_data & PSX_SIO_OUT_DATA ) / PSX_SIO_OUT_DATA;
	b_ready = 0;
	b_ack = 0;

	if( b_sel )
	{
		pad->n_state = PAD_STATE_IDLE;
	}

	switch( pad->n_state )
	{
	case PAD_STATE_LISTEN:
	case PAD_STATE_ACTIVE:
	case PAD_STATE_READ:
	case PAD_STATE_MEMCARD:
		if( pad->b_lastclock && !b_clock )
		{
			psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( pad->n_shiftout & 1 ) * PSX_SIO_IN_DATA );
			pad->n_shiftout >>= 1;
		}
		if( !pad->b_lastclock && b_clock )
		{
			pad->n_shiftin >>= 1;
			pad->n_shiftin |= b_data << 7;
			pad->n_bits++;

			if( pad->n_bits == 8 )
			{
				pad->n_bits = 0;
				b_ready = 1;
			}
		}
Exemplo n.º 2
0
static void psx_pad_ack( int n_port )
{
	if( m_pad[ n_port ].n_state != PAD_STATE_IDLE )
	{
		psx_sio_input( 0, PSX_SIO_IN_DSR, m_pad[ n_port ].b_ack * PSX_SIO_IN_DSR );
		if( !m_pad[ n_port ].b_ack )
		{
			m_pad[ n_port ].b_ack = 1;
			timer_set( TIME_IN_USEC( 2 ), n_port, psx_pad_ack );
		}
	}
}
Exemplo n.º 3
0
static TIMER_CALLBACK(psx_pad_ack)
{
	psx1_state *state = machine.driver_data<psx1_state>();
	int n_port = param;
	pad_t *pad = &state->m_pad[ n_port ];

	if( pad->n_state != PAD_STATE_IDLE )
	{
		psx_sio_input( machine, 0, PSX_SIO_IN_DSR, pad->b_ack * PSX_SIO_IN_DSR );
		if( !pad->b_ack )
		{
			pad->b_ack = 1;
			machine.scheduler().timer_set(attotime::from_usec( 2 ), FUNC(psx_pad_ack) , n_port);
		}
	}
}
Exemplo n.º 4
0
static void psx_pad( int n_port, int n_data )
{
	int b_sel;
	int b_clock;
	int b_data;
	int b_ack;
	int b_ready;

	b_sel = ( n_data & PSX_SIO_OUT_DTR ) / PSX_SIO_OUT_DTR;
	b_clock = ( n_data & PSX_SIO_OUT_CLOCK ) / PSX_SIO_OUT_CLOCK;
	b_data = ( n_data & PSX_SIO_OUT_DATA ) / PSX_SIO_OUT_DATA;
	b_ready = 0;
	b_ack = 0;

	if( b_sel )
	{
		m_pad[ n_port ].n_state = PAD_STATE_IDLE;
	}

	switch( m_pad[ n_port ].n_state )
	{
	case PAD_STATE_LISTEN:
	case PAD_STATE_ACTIVE:
	case PAD_STATE_READ:
		if( m_pad[ n_port ].b_lastclock && !b_clock )
		{
			psx_sio_input( 0, PSX_SIO_IN_DATA, ( m_pad[ n_port ].n_shiftout & 1 ) * PSX_SIO_IN_DATA );
			m_pad[ n_port ].n_shiftout >>= 1;
		}
		if( !m_pad[ n_port ].b_lastclock && b_clock )
		{
			m_pad[ n_port ].n_shiftin >>= 1;
			m_pad[ n_port ].n_shiftin |= b_data << 7;
			m_pad[ n_port ].n_bits++;

			if( m_pad[ n_port ].n_bits == 8 )
			{
				m_pad[ n_port ].n_bits = 0;
				b_ready = 1;
			}
		}