diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index dd9ac641c..4c0ea4155 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -2269,7 +2269,9 @@ read_p1(atkbc_t *dev) Compaq: Reserved; NCR: DMA mode. */ - uint8_t ret = machine_get_p1(dev->p1); + uint8_t ret = machine_get_p1(dev->p1) | (dev->p1 & 0x03); + + dev->p1 = ((dev->p1 + 1) & 0x03) | (dev->p1 & 0xfc); return ret; } @@ -2367,14 +2369,7 @@ kbc_at_process_cmd(void *priv) if (machine_has_flags_ex(MACHINE_PS2_KBC)) { if (dev->state != STATE_RESET) { kbc_at_log("ATkbc: self-test reinitialization\n"); - /* - Yes, the firmware has an OR, but we need to make sure - to keep any forcibly lowered bytes lowered. - - TODO: Proper P1 implementation, with OR and AND flags - in the machine table. - */ - dev->p1 = dev->p1 & 0xff; + dev->p1 |= 0xff; write_p2(dev, 0x4b); if (dev->irq[1] != 0xffff) picintc(1 << dev->irq[1]); @@ -2394,14 +2389,7 @@ kbc_at_process_cmd(void *priv) } else { if (dev->state != STATE_RESET) { kbc_at_log("ATkbc: self-test reinitialization\n"); - /* - Yes, the firmware has an OR, but we need to make sure - to keep any forcibly lowered bytes lowered. - - TODO: Proper P1 implementation, with OR and AND flags - in the machine table. - */ - dev->p1 = dev->p1 & 0xff; + dev->p1 |= 0xff; write_p2(dev, 0xcf); if (dev->irq[0] != 0xffff) picintclevel(1 << dev->irq[0], &dev->irq_state); diff --git a/src/machine/machine.c b/src/machine/machine.c index 3e47b1113..50b0bb150 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -140,6 +140,7 @@ machine_init(void) { bios_only = 0; + machine_set_p1_default(machines[machine].kbc_p1); machine_set_ps2(); (void) machine_init_ex(machine); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 064e60aa8..11a5cbade 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -19831,7 +19831,8 @@ machine_generic_p1_handler(void) uint8_t machine_get_p1(uint8_t kbc_p1) { - uint8_t ret = 0xff; + uint8_t low_bits = ((machine_p1 >> 8) + 1) & 0x03; + uint8_t ret = 0xff; if (machines[machine].p1_handler) ret = machines[machine].p1_handler(); @@ -19844,6 +19845,8 @@ machine_get_p1(uint8_t kbc_p1) ret &= kbc_p1; + machine_p1 = (machine_p1 & 0xfffffcff) | (low_bits << 8); + return ret; }