static TIMER_CALLBACK( pr8210_bit_callback ) { attotime duration = ATTOTIME_IN_MSEC(30); const device_config *laserdisc = ptr; UINT8 bitsleft = param >> 16; UINT8 data = param; /* if we have bits, process */ if (bitsleft != 0) { /* assert the line and set a timer for deassertion */ laserdisc_line_w(laserdisc, LASERDISC_LINE_CONTROL, ASSERT_LINE); timer_set(machine, ATTOTIME_IN_USEC(250), ptr, 0, pr8210_bit_off_callback); /* space 0 bits apart by 1msec, and 1 bits by 2msec */ duration = attotime_mul(ATTOTIME_IN_MSEC(1), (data & 0x80) ? 2 : 1); data <<= 1; bitsleft--; } /* if we're out of bits, queue up the next command */ else if (bitsleft == 0 && pr8210_command_buffer_in != pr8210_command_buffer_out) { data = pr8210_command_buffer[pr8210_command_buffer_out++ % ARRAY_LENGTH(pr8210_command_buffer)]; bitsleft = 12; } timer_adjust_oneshot(pr8210_bit_timer, duration, (bitsleft << 16) | data); }
static WRITE8_HANDLER( dleuro_misc_w ) { dlair_state *state = space->machine->driver_data<dlair_state>(); /* D0 = CHAR GEN ON+ D1 = KILL VIDEO+ D2 = SEL CHAR GEN VIDEO+ D3 = counter 2 D4 = coin counter D5 = OUT DISC DATA D6 = ENTER D7 = INT/EXT */ UINT8 diff = data ^ state->last_misc; state->last_misc = data; coin_counter_w(space->machine, 1, (~data >> 3) & 1); coin_counter_w(space->machine, 0, (~data >> 4) & 1); /* on bit 5 going low, push the data out to the laserdisc player */ if ((diff & 0x20) && !(data & 0x20)) laserdisc_data_w(state->laserdisc, state->laserdisc_data); /* on bit 6 going low, we need to signal enter */ laserdisc_line_w(state->laserdisc, LASERDISC_LINE_ENTER, (data & 0x40) ? CLEAR_LINE : ASSERT_LINE); }
static TIMER_CALLBACK( pr8210_bit_off_callback ) { const device_config *laserdisc = ptr; /* deassert the control line */ laserdisc_line_w(laserdisc, LASERDISC_LINE_CONTROL, CLEAR_LINE); }
void pr8210_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { switch (id) { case TIMER_ID_BIT: { attotime duration = attotime::from_msec(30); UINT8 bitsleft = param >> 16; UINT8 data = param; // if we have bits, process if (bitsleft != 0) { // assert the line and set a timer for deassertion laserdisc_line_w(m_laserdisc, LASERDISC_LINE_CONTROL, ASSERT_LINE); timer_set(attotime::from_usec(250), TIMER_ID_BIT_OFF); // space 0 bits apart by 1msec, and 1 bits by 2msec duration = attotime::from_msec((data & 0x80) ? 2 : 1); data <<= 1; bitsleft--; } // if we're out of bits, queue up the next command else if (bitsleft == 0 && m_command_buffer_in != m_command_buffer_out) { data = m_command_buffer[m_command_buffer_out++ % ARRAY_LENGTH(m_command_buffer)]; bitsleft = 12; } m_bit_timer->adjust(duration, (bitsleft << 16) | data); break; } // deassert the control line case TIMER_ID_BIT_OFF: laserdisc_line_w(m_laserdisc, LASERDISC_LINE_CONTROL, CLEAR_LINE); break; // others to the parent class default: ldplayer_state::device_timer(timer, id, param, ptr); break; } }
static WRITE8_HANDLER( cliff_ldwire_w ) { laserdisc_line_w(laserdisc, LASERDISC_LINE_CONTROL, (data & 1) ? ASSERT_LINE : CLEAR_LINE); }