Fixed the output port bit pulse commands, fixes KBC reset (and with it, PS/2 model 80 hanging).
This commit is contained in:
@@ -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, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user