diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 21cda09c5..584d5a497 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -107,12 +107,6 @@ typedef struct { uint8_t (*write64_ven)(void *p, uint8_t val); pc_timer_t send_delay_timer; -#ifdef USE_NEW_STUFF - /* Custom machine-dependent keyboard stuff. */ - uint8_t (*read_func)(void *priv); - void (*write_func)(void *priv, uint8_t val); - void *func_priv; -#endif } atkbd_t; @@ -769,9 +763,7 @@ kbd_poll(void *priv) static void add_data(atkbd_t *dev, uint8_t val) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: add to queue\n"); -#endif if (channel_queue_pos[0] < 16) { kbd_log("ATkbc: channel_queue[0][channel_queue_pos[0]] = %02X;\n", (uint32_t) val); @@ -833,18 +825,14 @@ add_data_kbd(uint16_t val) /* Allow for scan code translation. */ if (translate && (val == 0xf0)) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: translate is on, F0 prefix detected\n"); -#endif sc_or = 0x80; return; } /* Skip break code if translated make code has bit 7 set. */ if (translate && (sc_or == 0x80) && (val & 0x80)) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); -#endif sc_or = 0; return; } @@ -869,19 +857,13 @@ add_data_kbd(uint16_t val) case 0x4D: t3100e_notify_set(0x0f); break; /* Right */ } -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: translate is %s, ", translate ? "on" : "off"); -#endif switch(val) { case FAKE_LSHIFT_ON: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("fake left shift on, scan code: "); -#endif if (num_lock) { if (shift_states) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (one or both shifts on)\n"); -#endif break; } else { /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ @@ -897,9 +879,7 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } @@ -918,9 +898,7 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } @@ -938,28 +916,19 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } -#ifdef ENABLE_KEYBOARD_AT_LOG - if (!shift_states) - kbd_log("N/A (both shifts off)\n"); -#endif + kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); } break; case FAKE_LSHIFT_OFF: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("fake left shift on, scan code: "); -#endif if (num_lock) { if (shift_states) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (one or both shifts on)\n"); -#endif break; } else { /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ @@ -975,9 +944,7 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } @@ -996,9 +963,7 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } @@ -1016,16 +981,11 @@ add_data_kbd(uint16_t val) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); -#endif break; } } -#ifdef ENABLE_KEYBOARD_AT_LOG - if (!shift_states) - kbd_log("N/A (both shifts off)\n"); -#endif + kbd_log(shift_states ? "" : "N/A (both shifts off)\n"); } break; @@ -1053,9 +1013,7 @@ add_data_kbd(uint16_t val) static void write_output(atkbd_t *dev, uint8_t val) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->output_port); -#endif if ((dev->output_port ^ val) & 0x20) { /*IRQ 12*/ if (val & 0x20) @@ -1089,9 +1047,7 @@ write_output(atkbd_t *dev, uint8_t val) static void write_cmd(atkbd_t *dev, uint8_t val) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write command byte: %02X (old: %02X)\n", val, dev->mem[0]); -#endif if ((val & 1) && (dev->status & STAT_OFULL)) dev->wantirq = 1; @@ -1108,20 +1064,16 @@ write_cmd(atkbd_t *dev, uint8_t val) keyboard_mode &= 0x93; keyboard_mode |= (val & MODE_MASK); -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); -#endif /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); - PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. */ + PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. + The AMIKEY firmware apparently uses this bit for something else. */ if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_AMI) || - ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) { keyboard_mode &= ~CCB_PCMODE; -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); -#endif } kbd_log("Command byte now: %02X (%02X)\n", dev->mem[0], val); @@ -1173,74 +1125,43 @@ write64_generic(void *priv, uint8_t val) switch (val) { case 0xa4: /* check if password installed */ if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: check if password installed\n"); -#endif add_data(dev, 0xf1); return 0; } -#ifdef ENABLE_KEYBOARD_AT_LOG - else - kbd_log("ATkbc: bad command A4\n"); -#endif break; case 0xa7: /* disable mouse port */ if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: disable mouse port\n"); -#endif set_enable_mouse(dev, 0); return 0; } -#ifdef ENABLE_KEYBOARD_AT_LOG - else - kbd_log("ATkbc: bad command A7\n"); -#endif break; case 0xa8: /*Enable mouse port*/ if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: enable mouse port\n"); -#endif set_enable_mouse(dev, 1); return 0; } -#ifdef ENABLE_KEYBOARD_AT_LOG - else - kbd_log("ATkbc: bad command A8\n"); -#endif break; case 0xa9: /*Test mouse port*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: test mouse port\n"); -#endif if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { - if (mouse_write) - add_data(dev, 0x00); /* no error */ - else - add_data(dev, 0xff); /* no mouse */ + add_data(dev, 0x00); /* no error, this is testing the channel 2 interface */ return 0; } -#ifdef ENABLE_KEYBOARD_AT_LOG - else - kbd_log("ATkbc: bad command A9\n"); -#endif break; case 0xaf: /* read keyboard version */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: read keyboard version\n"); -#endif add_data(dev, 0x00); return 0; case 0xc0: /* read input port */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: read input port\n"); -#endif fixed_bits = 4; /* The SMM handlers of Intel AMI Pentium BIOS'es expect bit 6 to be set. */ if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI) @@ -1264,39 +1185,27 @@ write64_generic(void *priv, uint8_t val) case 0xd3: /* write mouse output buffer */ if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write mouse output buffer\n"); -#endif dev->want60 = 1; return 0; } break; case 0xd4: /* write to mouse */ -#if 0 - if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { -#endif -#ifdef ENABLE_KEYBOARD_AT_LOG - kbd_log("ATkbc: write to mouse\n"); -#endif - dev->want60 = 1; - return 0; -#if 0 - } - break; -#endif + kbd_log("ATkbc: write to mouse\n"); + dev->want60 = 1; + return 0; case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: pulse %01X\n", val & 0x0f); -#endif pulse_output(dev, val & 0x0f); return 0; } + kbd_log("ATkbc: bad command %02X\n", val); return 1; } @@ -1323,9 +1232,7 @@ write60_ami(void *priv, uint8_t val) return 0; case 0xaf: /* set extended controller RAM */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - set extended controller RAM\n"); -#endif if (dev->secr_phase == 1) { dev->mem_addr = val; dev->want60 = 1; @@ -1337,9 +1244,7 @@ write60_ami(void *priv, uint8_t val) return 0; case 0xcb: /* set keyboard mode */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - set keyboard mode\n"); -#endif return 0; } @@ -1378,16 +1283,12 @@ write64_ami(void *priv, uint8_t val) return 0; case 0xa1: /* get controller version */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - get controller version\n"); -#endif return 0; case 0xa2: /* clear keyboard controller lines P22/P23 */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - clear KBC lines P22 and P23\n"); -#endif write_output(dev, dev->output_port & 0xf3); add_data(dev, 0x00); return 0; @@ -1396,9 +1297,7 @@ write64_ami(void *priv, uint8_t val) case 0xa3: /* set keyboard controller lines P22/P23 */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - set KBC lines P22 and P23\n"); -#endif write_output(dev, dev->output_port | 0x0c); add_data(dev, 0x00); return 0; @@ -1407,9 +1306,7 @@ write64_ami(void *priv, uint8_t val) case 0xa4: /* write clock = low */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - write clock = low\n"); -#endif dev->ami_stat &= 0xfe; return 0; } @@ -1417,9 +1314,7 @@ write64_ami(void *priv, uint8_t val) case 0xa5: /* write clock = high */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - write clock = high\n"); -#endif dev->ami_stat |= 0x01; return 0; } @@ -1427,9 +1322,7 @@ write64_ami(void *priv, uint8_t val) case 0xa6: /* read clock */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - read clock\n"); -#endif add_data(dev, !!(dev->ami_stat & 1)); return 0; } @@ -1437,9 +1330,7 @@ write64_ami(void *priv, uint8_t val) case 0xa7: /* write cache bad */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - write cache bad\n"); -#endif dev->ami_stat &= 0xfd; return 0; } @@ -1447,9 +1338,7 @@ write64_ami(void *priv, uint8_t val) case 0xa8: /* write cache good */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - write cache good\n"); -#endif dev->ami_stat |= 0x02; return 0; } @@ -1457,18 +1346,14 @@ write64_ami(void *priv, uint8_t val) case 0xa9: /* read cache */ if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - read cache\n"); -#endif add_data(dev, !!(dev->ami_stat & 2)); return 0; } break; case 0xaf: /* set extended controller RAM */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: set extended controller RAM\n"); -#endif dev->want60 = 1; dev->secr_phase = 1; return 0; @@ -1511,9 +1396,7 @@ write64_ami(void *priv, uint8_t val) * unblock KBC lines P22/P23 * (allow command D1 to change bits 2/3 of the output port) */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - unblock KBC lines P22 and P23\n"); -#endif dev->output_locked = 1; return 0; @@ -1522,16 +1405,12 @@ write64_ami(void *priv, uint8_t val) * block KBC lines P22/P23 * (disallow command D1 from changing bits 2/3 of the port) */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - block KBC lines P22 and P23\n"); -#endif dev->output_locked = 1; return 0; case 0xef: /* ??? - sent by AMI486 */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: ??? - sent by AMI486\n"); -#endif return 0; } @@ -1546,25 +1425,19 @@ write64_ibm_mca(void *priv, uint8_t val) switch (val) { case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: copy bits 0 to 3 of input port to status bits 4 to 7\n"); -#endif dev->status &= 0x0f; dev->status |= ((((dev->input_port & 0xfc) | 0x84) & 0x0f) << 4); return 0; case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: copy bits 4 to 7 of input port to status bits 4 to 7\n"); -#endif dev->status &= 0x0f; dev->status |= (((dev->input_port & 0xfc) | 0x84) & 0xf0); return 0; case 0xaf: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: bad KBC command AF\n"); -#endif return 1; case 0xf0: case 0xf1: case 0xf2: case 0xf3: @@ -1587,9 +1460,7 @@ write60_quadtel(void *priv, uint8_t val) switch(dev->command) { case 0xcf: /*??? - sent by MegaPC BIOS*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); -#endif return 0; } @@ -1604,15 +1475,11 @@ write64_quadtel(void *priv, uint8_t val) switch (val) { case 0xaf: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: bad KBC command AF\n"); -#endif return 1; case 0xcf: /*??? - sent by MegaPC BIOS*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: ??? - sent by MegaPC BIOS\n"); -#endif dev->want60 = 1; return 0; } @@ -1628,9 +1495,7 @@ write60_toshiba(void *priv, uint8_t val) switch(dev->command) { case 0xb6: /* T3100e - set color/mono switch */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e - set color/mono switch\n"); -#endif t3100e_mono_set(val); return 0; } @@ -1646,57 +1511,41 @@ write64_toshiba(void *priv, uint8_t val) switch (val) { case 0xaf: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: bad KBC command AF\n"); -#endif return 1; case 0xb0: /* T3100e: Turbo on */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Turbo on\n"); -#endif t3100e_turbo_set(1); return 0; case 0xb1: /* T3100e: Turbo off */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Turbo off\n"); -#endif t3100e_turbo_set(0); return 0; case 0xb2: /* T3100e: Select external display */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Select external display\n"); -#endif t3100e_display_set(0x00); return 0; case 0xb3: /* T3100e: Select internal display */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Select internal display\n"); -#endif t3100e_display_set(0x01); return 0; case 0xb4: /* T3100e: Get configuration / status */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Get configuration / status\n"); -#endif add_data(dev, t3100e_config_get()); return 0; case 0xb5: /* T3100e: Get colour / mono byte */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Get colour / mono byte\n"); -#endif add_data(dev, t3100e_mono_get()); return 0; case 0xb6: /* T3100e: Set colour / mono byte */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Set colour / mono byte\n"); -#endif dev->want60 = 1; return 0; @@ -1704,14 +1553,10 @@ write64_toshiba(void *priv, uint8_t val) case 0xb8: /* T3100e: Emulate AT keyboard */ dev->flags &= ~KBC_TYPE_MASK; if (val == 0xb7) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Emulate PS/2 keyboard\n"); -#endif dev->flags |= KBC_TYPE_PS2_NOREF; } else { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Emulate AT keyboard\n"); -#endif dev->flags |= KBC_TYPE_ISA; } return 0; @@ -1720,9 +1565,7 @@ write64_toshiba(void *priv, uint8_t val) Return it for right Ctrl and right Alt; on the real T3100e, these keystrokes could only be generated using 'Fn'. */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Read 'Fn' key\n"); -#endif if (keyboard_recv(0xb8) || /* Right Alt */ keyboard_recv(0x9d)) /* Right Ctrl */ add_data(dev, 0x04); @@ -1730,16 +1573,12 @@ write64_toshiba(void *priv, uint8_t val) return 0; case 0xbc: /* T3100e: Reset Fn+Key notification */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: T3100e: Reset Fn+Key notification\n"); -#endif t3100e_notify_set(0x00); return 0; case 0xc0: /*Read input port*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: read input port\n"); -#endif /* The T3100e returns all bits set except bit 6 which * is set by t3100e_mono_set() */ @@ -1764,13 +1603,11 @@ kbd_write(uint16_t port, uint8_t val, void *priv) if (((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) && (port == 0x63)) port = 0x61; -#ifdef ENABLE_KEYBOARD_AT_LOG - if (port != 0x61) - kbd_log("ATkbc: write(%04X, %02X)\n", port, val); -#endif + kbd_log((port == 0x61) ? "" : "ATkbc: write(%04X, %02X)\n", port, val); switch (port) { case 0x60: + dev->status &= ~STAT_CD; if (dev->want60) { /* Write data to controller. */ dev->want60 = 0; @@ -1790,9 +1627,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xd1: /* write output port */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write output port\n"); -#endif if (dev->output_locked) { /*If keyboard controller lines P22-P23 are blocked, we force them to remain unchanged.*/ @@ -1803,16 +1638,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xd2: /* write to keyboard output buffer */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write to keyboard output buffer\n"); -#endif add_data_kbd_direct(dev, val); break; case 0xd3: /* write to mouse output buffer */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write to mouse output buffer\n"); -#endif if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) keyboard_at_adddata_mouse(val); break; @@ -1823,13 +1654,13 @@ kbd_write(uint16_t port, uint8_t val, void *priv) if (val == 0xbb) break; - set_enable_mouse(dev, 1); - if (mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) - mouse_write(val, mouse_p); - else if (!mouse_write && ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && - (((dev->flags & KBC_VEN_MASK) == KBC_VEN_AMI) || - ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI))) - keyboard_at_adddata_mouse(0xff); + if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) { + set_enable_mouse(dev, 1); + if (mouse_write) + mouse_write(val, mouse_p); + else + keyboard_at_adddata_mouse(0xfe); + } break; default: @@ -1859,20 +1690,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv) * mess up with this, and repeat the command * code many times. Fun! */ -/* Sure, but it is perfectly valid for a command parameter to be identical - to the command itself, and this would mess with that. */ -#if 1 if (val == dev->key_command) { -#if 1 /* Respond NAK and ignore it. */ add_data_kbd(0xfe); dev->key_command = 0x00; break; -#else - goto do_command; -#endif } -#endif switch (dev->key_command) { case 0xed: /* set/reset LEDs */ @@ -1900,9 +1723,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; default: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, dev->key_command); -#endif add_data_kbd_direct(dev, 0xfe); break; } @@ -1910,9 +1731,6 @@ kbd_write(uint16_t port, uint8_t val, void *priv) /* Keyboard command is now done. */ dev->key_command = 0x00; } else { -#if 0 -do_command: -#endif /* No keyboard command in progress. */ dev->key_command = 0x00; @@ -1920,16 +1738,12 @@ do_command: switch (val) { case 0x00: -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: command 00\n"); -#endif add_data_kbd_direct(dev, 0xfa); break; case 0x05: /*??? - sent by NT 4.0*/ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: command 05 (NT 4.0)\n"); -#endif add_data_kbd_direct(dev, 0xfe); break; @@ -1939,40 +1753,30 @@ do_command: break; case 0xed: /* set/reset LEDs */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set/reset leds\n"); -#endif add_data_kbd_direct(dev, 0xfa); dev->key_wantdata = 1; break; case 0xee: /* diagnostic echo */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: ECHO\n"); -#endif add_data_kbd_direct(dev, 0xee); break; case 0xef: /* NOP (reserved for future use) */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: NOP\n"); -#endif break; case 0xf0: /* get/set scan code set */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: scan code set\n"); -#endif add_data_kbd_direct(dev, 0xfa); dev->key_wantdata = 1; break; case 0xf2: /* read ID */ /* Fixed as translation will be done in add_data_kbd(). */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: read keyboard id\n"); -#endif /* TODO: After keyboard type selection is implemented, make this return the correct keyboard ID for the selected type. */ add_data_kbd_direct(dev, 0xfa); @@ -1981,29 +1785,20 @@ do_command: break; case 0xf3: /* set typematic rate/delay */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set typematic rate/delay\n"); -#endif add_data_kbd_direct(dev, 0xfa); dev->key_wantdata = 1; break; case 0xf4: /* enable keyboard */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: enable keyboard\n"); -#endif add_data_kbd_direct(dev, 0xfa); keyboard_scan = 1; break; case 0xf5: /* set defaults and disable keyboard */ case 0xf6: /* set defaults */ -#ifdef ENABLE_KEYBOARD_AT_LOG - if (val == 0xf6) - kbd_log("ATkbd: set defaults\n"); - else - kbd_log("ATkbd: set defaults and disable keyboard\n"); -#endif + kbd_log("ATkbd: set defaults%s\n", (val == 0xf6) ? "" : " and disable keyboard"); keyboard_scan = (val == 0xf6); kbc_queue_reset(1); kbd_log("val = %02X, keyboard_scan = %i, dev->mem[0] = %02X\n", @@ -2018,49 +1813,37 @@ do_command: break; case 0xf7: /* set all keys to repeat */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set all keys to repeat\n"); -#endif add_data_kbd_direct(dev, 0xfa); keyboard_set3_all_break = 1; break; case 0xf8: /* set all keys to give make/break codes */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set all keys to give make/break codes\n"); -#endif add_data_kbd_direct(dev, 0xfa); keyboard_set3_all_break = 1; break; case 0xf9: /* set all keys to give make codes only */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set all keys to give make codes only\n"); -#endif add_data_kbd_direct(dev, 0xfa); keyboard_set3_all_break = 0; break; case 0xfa: /* set all keys to repeat and give make/break codes */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); -#endif add_data_kbd_direct(dev, 0xfa); keyboard_set3_all_repeat = 1; keyboard_set3_all_break = 1; break; case 0xfe: /* resend last scan code */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: reset last scan code\n"); -#endif add_data_kbd_raw(dev, kbd_last_scan_code); break; case 0xff: /* reset */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbd: kbd reset\n"); -#endif kbc_queue_reset(1); kbd_last_scan_code = 0x00; add_data_kbd_direct(dev, 0xfa); @@ -2095,16 +1878,13 @@ do_command: pit_ctr_set_gate(&pit->counters[2], val & 1); if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) -#ifdef USE_NEW_STUFF - dev->write_func(dev->func_priv, !!(val & 0x04)); -#else xi8088_turbo_set(!!(val & 0x04)); -#endif break; case 0x64: /* Controller command. */ dev->want60 = 0; + dev->status |= STAT_CD; switch (val) { /* Read data from KBC memory. */ @@ -2132,15 +1912,11 @@ do_command: break; case 0xaa: /* self-test */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: self-test\n"); -#endif if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) dev->status |= STAT_IFULL; if (! dev->initialized) { -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: self-test reinitialization\n"); -#endif dev->initialized = 1; memset(kbc_queue, 0x00, 48 * sizeof(uint16_t)); kbc_queue_pos = 0; @@ -2161,16 +1937,12 @@ do_command: break; case 0xab: /* interface test */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: interface test\n"); -#endif add_data(dev, 0x00); /*no error*/ break; case 0xac: /* diagnostic dump */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: diagnostic dump\n"); -#endif for (i = 0; i < 16; i++) add_data(dev, dev->mem[i]); add_data(dev, (dev->input_port & 0xf0) | 0x80); @@ -2179,37 +1951,27 @@ do_command: break; case 0xad: /* disable keyboard */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: disable keyboard\n"); -#endif set_enable_kbd(dev, 0); break; case 0xae: /* enable keyboard */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: enable keyboard\n"); -#endif set_enable_kbd(dev, 1); break; case 0xca: /* read keyboard mode */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - read keyboard mode\n"); -#endif add_data(dev, ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) ? 0x01 : 0x00); /*ISA mode*/ break; case 0xcb: /* set keyboard mode */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: AMI - set keyboard mode\n"); -#endif dev->want60 = 1; break; case 0xd0: /* read output port */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: read output port\n"); -#endif mask = 0xff; if (dev->mem[0] & 0x10) mask &= 0xbf; @@ -2219,43 +1981,23 @@ do_command: break; case 0xd1: /* write output port */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write output port\n"); -#endif dev->want60 = 1; break; case 0xd2: /* write keyboard output buffer */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: write keyboard output buffer\n"); -#endif dev->want60 = 1; break; -#if 0 - case 0xd4: /* dunno, but OS/2 2.00LA sends it */ - dev->want60 = 1; - break; -#endif - case 0xdd: /* disable A20 address line */ -#ifdef ENABLE_KEYBOARD_AT_LOG - kbd_log("ATkbc: disable A20\n"); -#endif - write_output(dev, dev->output_port & 0xfd); - break; - case 0xdf: /* enable A20 address line */ -#ifdef ENABLE_KEYBOARD_AT_LOG - kbd_log("ATkbc: enable A20\n"); -#endif - write_output(dev, dev->output_port | 0x02); + kbd_log("ATkbc: %sable A20\n", (val == 0xdd) ? "dis": "en"); + write_output(dev, (dev->output_port & 0xfd) | (val & 0x02)); break; case 0xe0: /* read test inputs */ -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: read test inputs\n"); -#endif add_data(dev, 0x00); break; @@ -2270,10 +2012,7 @@ do_command: if (dev->write64_ven) bad = dev->write64_ven(dev, val); -#ifdef ENABLE_KEYBOARD_AT_LOG - if (bad) - kbd_log("ATkbc: bad controller command %02X\n", val); -#endif + kbd_log(bad ? "ATkbc: bad controller command %02X\n" : "", val); } /* If the command needs data, remember the command. */ @@ -2316,11 +2055,7 @@ kbd_read(uint16_t port, void *priv) ret &= ~0x10; } if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_XI8088) { -#ifdef USE_NEW_STUFF - if (dev->read_func(dev->func_priv)) -#else if (xi8088_turbo_get()) -#endif ret |= 0x04; else ret &= ~0x04; @@ -2328,12 +2063,14 @@ kbd_read(uint16_t port, void *priv) break; case 0x64: - ret = (dev->status & 0xFB); + ret = (dev->status & 0xfb); if (dev->mem[0] & STAT_SYSFLAG) ret |= STAT_SYSFLAG; - /* The transmit timeout (TTIMEOUT) flag should *NOT* be cleared, otherwise - the IBM PS/2 Model 80's BIOS gives error 8601 (mouse error). */ - dev->status &= ~(STAT_RTIMEOUT/* | STAT_TTIMEOUT*/); + /* Only clear the transmit timeout flag on non-PS/2 controllers, as on + PS/2 controller, it is the keyboard/mouse output source bit. */ + dev->status &= ~STAT_RTIMEOUT; + if ((dev->flags & KBC_TYPE_MASK) > KBC_TYPE_PS2_NOREF) + dev->status &= ~STAT_TTIMEOUT; break; default: @@ -2341,10 +2078,7 @@ kbd_read(uint16_t port, void *priv) break; } -#ifdef ENABLE_KEYBOARD_AT_LOG - if (port != 0x61) - kbd_log("ATkbc: read(%04X) = %02X\n", port, ret); -#endif + kbd_log((port == 0x61) ? "" : "ATkbc: read(%04X) = %02X\n", port, ret); return(ret); } @@ -2368,7 +2102,8 @@ kbd_reset(void *priv) dev->initialized = 0; dev->first_write = 1; - dev->status = STAT_UNLOCKED | STAT_CD; + // dev->status = STAT_UNLOCKED | STAT_CD; + dev->status = STAT_UNLOCKED; dev->mem[0] = 0x01; dev->mem[0] |= CCB_TRANSLATE; dev->wantirq = 0; @@ -2627,7 +2362,7 @@ const device_t keyboard_ps2_pci_device = { kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL + NULL, NULL, NULL, NULL }; const device_t keyboard_ps2_ami_pci_device = { @@ -2637,7 +2372,7 @@ const device_t keyboard_ps2_ami_pci_device = { kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL + NULL, NULL, NULL, NULL }; const device_t keyboard_ps2_intel_ami_pci_device = { @@ -2647,7 +2382,7 @@ const device_t keyboard_ps2_intel_ami_pci_device = { kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL + NULL, NULL, NULL, NULL }; const device_t keyboard_ps2_acer_pci_device = { @@ -2657,7 +2392,7 @@ const device_t keyboard_ps2_acer_pci_device = { kbd_init, kbd_close, kbd_reset, - NULL, NULL, NULL + NULL, NULL, NULL, NULL }; @@ -2703,33 +2438,18 @@ keyboard_at_mouse_pos(void) } -#ifdef USE_NEW_STUFF -/* Set custom machine-dependent keyboard stuff. */ -void -keyboard_at_set_funcs(void *arg, uint8_t (*readfunc)(void *), void (*writefunc)(void *, uint8_t), void *priv) -{ - atkbd_t *dev = (atkbd_t *)arg; - - dev->read_func = readfunc; - dev->write_func = writefunc; - dev->func_priv = priv; -} -#endif - - void keyboard_at_set_mouse_scan(uint8_t val) { atkbd_t *dev = SavedKbd; uint8_t temp_mouse_scan = val ? 1 : 0; - if (temp_mouse_scan == !(dev->mem[0] & 0x20)) return; + if (temp_mouse_scan == !(dev->mem[0] & 0x20)) + return; set_enable_mouse(dev, val ? 1 : 0); -#ifdef ENABLE_KEYBOARD_AT_LOG kbd_log("ATkbc: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); -#endif }