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