From 323a961f22e4fa3537ecf2b1b5966916ce99871b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 21 Jul 2021 16:54:07 +0200 Subject: [PATCH] Fixed some keyboard controller bugs, including making IRQ's on direct transmissions to the front of the controller queue no longer erroneously resulting in stuck IRQ's, fixes the Acer M3A. --- src/device/keyboard_at.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index c3fb5b93e..581f55f30 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -681,16 +681,17 @@ add_to_kbc_queue_front(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_ if (channel == 2) { if (dev->mem[0] & 0x02) picint(0x1000); + dev->last_irq = 0x1000; } else { if (dev->mem[0] & 0x01) picint(2); + dev->last_irq = 2; } dev->out = val; if (channel == 2) dev->status = (dev->status & ~STAT_IFULL) | (STAT_OFULL | STAT_MFULL) | stat_hi; else dev->status = (dev->status & ~(STAT_IFULL | STAT_MFULL)) | STAT_OFULL | stat_hi; - dev->last_irq = 0x0000; } @@ -1055,8 +1056,8 @@ write_output(atkbd_t *dev, uint8_t val) uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->output_port); - if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF)) - val |= ((dev->mem[0] << 4) & 0x30); + if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF)) + val |= ((dev->mem[0] << 4) & 0x10); if ((dev->output_port ^ val) & 0x20) { /*IRQ 12*/ if (val & 0x20) @@ -2070,10 +2071,8 @@ kbd_write(uint16_t port, uint8_t val, void *priv) case 0xd0: /* read output port */ kbd_log("ATkbc: read output port\n"); mask = 0xff; - if (dev->mem[0] & 0x10) + if (((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) && (dev->mem[0] & 0x10)) mask &= 0xbf; - if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) && (dev->mem[0] & 0x20)) - mask &= 0xf7; add_to_kbc_queue_front(dev, dev->output_port & mask, 0, 0x00); break;