diff --git a/src/keyboard_at.c b/src/keyboard_at.c index fafd51249..7738cd7a8 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -8,7 +8,7 @@ * * Intel 8042 (AT keyboard controller) emulation. * - * Version: @(#)keyboard_at.c 1.0.17 2018/01/06 + * Version: @(#)keyboard_at.c 1.0.18 2018/01/06 * * Authors: Sarah Walker, * Miran Grca, @@ -656,7 +656,7 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val) static void kbd_output_write(atkbd_t *kbd, uint8_t val) { - kbdlog("Write output port: %02X\n", val); + kbdlog("Write output port: %02X (old: %02X)\n", val, kbd->output_port); if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/ if (val & 0x20) picint(1 << 12); @@ -688,9 +688,11 @@ kbd_output_write(atkbd_t *kbd, uint8_t val) static void kbd_output_pulse(atkbd_t *kbd, uint8_t mask) { - kbd_output_write(kbd, kbd->output_port & (0xF0 | mask)); - kbd->old_output_port = kbd->output_port & ~(0xF0 | mask); - kbd->pulse_cb = 6LL * TIMER_USEC; + if (mask != 0xF) { + kbd->old_output_port = kbd->output_port & ~(0xF0 | mask); + kbd_output_write(kbd, kbd->output_port & (0xF0 | mask)); + kbd->pulse_cb = 6LL * TIMER_USEC; + } } @@ -745,7 +747,7 @@ kbd_write64_generic(void *p, uint8_t val) case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbdlog("ATkbd: pulse\n"); + kbdlog("ATkbd: pulse %01X\n", val & 0x0f); kbd_output_pulse(kbd, val & 0x0f); return 0; } @@ -867,8 +869,8 @@ kbd_write64_ibm_mca(void *p, uint8_t val) case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbdlog("ATkbd: pulse\n"); - kbd_output_pulse(kbd, val & 0x03); + kbdlog("ATkbd: pulse: %01X\n", (val & 0x03) | 0x0c); + kbd_output_pulse(kbd, (val & 0x03) | 0x0c); return 0; } @@ -1355,19 +1357,6 @@ write_register: kbd_adddata(0x00); break; - 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: - kbdlog("ATkbd: pulse\n"); - if (! (val & 1)) { - /* Pin 0 selected. */ - /* trc_reset(2); */ - softresetx86(); /*Pulse reset!*/ - cpu_set_edx(); - } - break; - default: /* Run the vendor-specific command handler, if present, otherwise (or if the former returns 1), assume bad command. */