示例#1
0
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;
	}
}
示例#2
0
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();
}