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; } }
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 ); } } }
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); } } }
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; } }