AT / PS/2 keyboard: It turns out a few other commands also cancel the pending command, fixes #4981.

This commit is contained in:
OBattler
2025-01-10 21:56:04 +01:00
parent a2edcbfbba
commit 78a81b0d7f

View File

@@ -1961,18 +1961,24 @@ keyboard_at_write(void *priv)
} }
} else { } else {
if (dev->flags & FLAG_CTRLDAT) { if (dev->flags & FLAG_CTRLDAT) {
/* Special case - another command during another command that wants input - proceed /*
Special case - another command during another command that wants input - proceed
as normal but do not cancel the command (so keep waiting for input), unless the as normal but do not cancel the command (so keep waiting for input), unless the
command in progress is ED (Set/reset LEDs). */ command in progress is ED (Set/reset LEDs).
if (val == 0xed) {
keyboard_scan = 1; It appears to also apply to command EE (Echo), F4 (Enable), F5 (Diable and Set
Default), and F6 (SetDefault).
*/
if ((val == 0xed) || (val == 0xee) || (val == 0xf4) || (val == 0xf5) || (val == 0xf6))
dev->flags &= ~FLAG_CTRLDAT; dev->flags &= ~FLAG_CTRLDAT;
} else else
dev->state = DEV_STATE_MAIN_WANT_IN; dev->state = DEV_STATE_MAIN_WANT_IN;
} }
switch (val) { switch (val) {
case 0xed: /* set/reset LEDs */ case 0xed: /* set/reset LEDs */
if ((dev->flags & FLAG_CTRLDAT) && (dev->command == 0xed))
keyboard_scan = 1;
dev->command = val; dev->command = val;
keyboard_at_log("%s: set/reset LEDs\n", dev->name); keyboard_at_log("%s: set/reset LEDs\n", dev->name);
dev->flags |= FLAG_CTRLDAT; dev->flags |= FLAG_CTRLDAT;