void at_keyboard_write(UINT8 data) { if (LOG_KEYBOARD) logerror("keyboard write %.2x\n",data); switch (keyboard.input_state) { case 0: switch (data) { case 0xed: // leds schalten /* acknowledge */ at_keyboard_queue_insert(0x0fa); /* now waiting for code... */ keyboard.input_state=1; break; case 0xee: // echo /* echo code with no acknowledge */ at_keyboard_queue_insert(0xee); break; case 0xf0: // scancodes adjust /* acknowledge */ at_clear_buffer_and_acknowledge(); /* waiting for data */ keyboard.input_state=2; break; case 0xf2: // identify keyboard /* ack and two byte keyboard id */ at_keyboard_queue_insert(0xfa); /* send keyboard code */ if (keyboard.type == AT_KEYBOARD_TYPE_MF2) { at_keyboard_queue_insert(0xab); at_keyboard_queue_insert(0x41); } else { /* from help-pc docs */ at_keyboard_queue_insert(0x0ab); at_keyboard_queue_insert(0x083); } break; case 0xf3: // adjust rates /* acknowledge */ at_keyboard_queue_insert(0x0fa); keyboard.input_state=3; break; case 0xf4: // activate at_clear_buffer_and_acknowledge(); keyboard.on=1; break; case 0xf5: /* acknowledge */ at_clear_buffer_and_acknowledge(); // standardvalues keyboard.on=0; break; case 0xf6: at_clear_buffer_and_acknowledge(); // standardvalues keyboard.on=1; break; case 0xfe: // resend // should not happen, for now send 0 at_keyboard_queue_insert(0); //keyboard.last_code); break; case 0xff: // reset /* it doesn't state this in the docs I have read, but I assume that the keyboard input buffer is cleared. The PCW16 sends &ff, and requires that 0x0fa is the first byte to be read */ at_clear_buffer_and_acknowledge(); // /* acknowledge */ // at_keyboard_queue_insert(0xfa); /* BAT completion code */ at_keyboard_queue_insert(0xaa); break; } break; case 1: /* code received */ keyboard.input_state=0; /* command? */ if (data & 0x080) { /* command received instead of code - execute command */ at_keyboard_write(data); } else { /* send acknowledge */ at_keyboard_queue_insert(0x0fa); /* led bits */ /* bits: 0 scroll lock, 1 num lock, 2 capslock */ /* led's in same order as my keyboard leds. */ /* num lock, caps lock, scroll lock */ set_led_status(2, (data & 0x01)); set_led_status(0, ((data & 0x02)>>1)); set_led_status(1, ((data & 0x04)>>2)); } break; case 2: keyboard.input_state=0; /* command? */ if (data & 0x080) { /* command received instead of code - execute command */ at_keyboard_write(data); } else { /* 00 return byte indicating scan code set in use 01 select scan code set 1 (used on PC & XT) 02 select scan code set 2 03 select scan code set 3 */ if (data == 0x00) { at_keyboard_queue_insert(keyboard.scan_code_set); } else { keyboard.scan_code_set = data; } } break; case 3: /* 6,5: 250ms, 500ms, 750ms, 1s */ /* 4..0: 30 26.7 .... 2 chars/s*/ /* command? */ keyboard.input_state=0; if (data & 0x080) { /* command received instead of code - execute command */ at_keyboard_write(data); } else { /* received keyboard repeat */ } break; } }
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(); }