/* 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); }
void pcw16_state::pcw16_keyboard_init() { int i; int b; /* if sum of all bits in the byte is even, then the data has even parity, otherwise it has odd parity */ for (i=0; i<256; i++) { int data; int sum; sum = 0; data = i; for (b=0; b<8; b++) { sum+=data & 0x01; data = data>>1; } m_keyboard_parity_table[i] = sum & 0x01; } /* clear int */ pcw16_keyboard_int(0); /* reset state */ m_keyboard_state = 0; /* reset ready for transmit */ pcw16_keyboard_reset(); }
/* interfaces to a pc-at keyboard */ static READ8_HANDLER(pcw16_keyboard_data_shift_r) { //logerror("keyboard data shift r: %02x\n", pcw16_keyboard_data_shift); pcw16_keyboard_state &= ~(PCW16_KEYBOARD_BUSY_STATUS); pcw16_keyboard_int(0); /* reset for reception */ pcw16_keyboard_reset(); /* read byte */ return pcw16_keyboard_data_shift; }
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(); }