/* signal a code has been received */ void pcw16_state::pcw16_keyboard_signal_byte_received(int data) { /* clear clock */ pcw16_keyboard_set_clock_state(0); /* set code in shift register */ m_keyboard_data_shift = data; /* busy */ m_keyboard_state |= PCW16_KEYBOARD_BUSY_STATUS; /* initialise start, stop and parity bits */ m_keyboard_state &= ~PCW16_KEYBOARD_START_BIT_MASK; m_keyboard_state |=PCW16_KEYBOARD_STOP_BIT_MASK; /* "Keyboard data has odd parity, so the parity bit in the status register should only be set when the shift register data itself has even parity. */ m_keyboard_state &= ~PCW16_KEYBOARD_PARITY_MASK; /* if data has even parity, set parity bit */ if ((m_keyboard_parity_table[data])==0) m_keyboard_state |= PCW16_KEYBOARD_PARITY_MASK; pcw16_keyboard_int(1); }
static WRITE8_HANDLER(pcw16_keyboard_control_w) { //logerror("Keyboard control w: %02x\n",data); pcw16_keyboard_previous_state = pcw16_keyboard_state; /* if set, set parity */ if (data & 0x080) { pcw16_keyboard_state |= PCW16_KEYBOARD_PARITY_MASK; } /* clear read/write bits */ pcw16_keyboard_state &= ~(PCW16_KEYBOARD_FORCE_KEYBOARD_CLOCK | PCW16_KEYBOARD_TRANSMIT_MODE); /* set read/write bits from data */ pcw16_keyboard_state |= (data & 0x03); if (data & PCW16_KEYBOARD_RESET_INTERFACE) { pcw16_keyboard_reset(); } if (data & PCW16_KEYBOARD_TRANSMIT_MODE) { /* force clock changed */ if (((pcw16_keyboard_state^pcw16_keyboard_previous_state) & PCW16_KEYBOARD_FORCE_KEYBOARD_CLOCK)!=0) { /* just cleared? */ if ((pcw16_keyboard_state & PCW16_KEYBOARD_FORCE_KEYBOARD_CLOCK)==0) { /* write */ /* busy */ pcw16_keyboard_state |= PCW16_KEYBOARD_BUSY_STATUS; /* keyboard takes data */ at_keyboard_write(pcw16_keyboard_data_shift); /* set clock low - no furthur transmissions */ pcw16_keyboard_set_clock_state(0); /* set int */ pcw16_keyboard_int(1); } } } if (((pcw16_keyboard_state^pcw16_keyboard_previous_state) & PCW16_KEYBOARD_TRANSMIT_MODE)!=0) { if ((pcw16_keyboard_state & PCW16_KEYBOARD_TRANSMIT_MODE)==0) { if ((pcw16_system_status & (1<<1))!=0) { pcw16_keyboard_int(0); } } } pcw16_keyboard_refresh_outputs(); }
void pcw16_state::pcw16_keyboard_reset() { /* clock set to high */ pcw16_keyboard_set_clock_state(1); }
static void pcw16_keyboard_reset(void) { /* clock set to high */ pcw16_keyboard_set_clock_state(1); }