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.

This commit is contained in:
OBattler
2021-07-21 16:54:07 +02:00
parent 706ad0e896
commit 323a961f22

View File

@@ -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;