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_t bitsleft = param >> 16; uint8_t data = param; // if we have bits, process if (bitsleft != 0) { // assert the line and set a timer for deassertion m_laserdisc->control_w(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: m_laserdisc->control_w(CLEAR_LINE); break; // others to the parent class default: ldplayer_state::device_timer(timer, id, param, ptr); break; } }