Fully cleaned up the AT keyboard controller add data mess.

This commit is contained in:
OBattler
2023-03-30 23:50:14 +02:00
parent 1cf4f95836
commit 542f8477e7

View File

@@ -634,17 +634,6 @@ kbc_queue_reset(uint8_t channel)
static void
kbc_queue_add(atkbd_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi)
{
uint8_t kbc_ven = dev->flags & KBC_VEN_MASK;
if (channel == 0) {
if ((kbc_ven == KBC_VEN_AMI) || ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF))
stat_hi |= ((dev->input_port & 0x80) ? 0x10 : 0x00);
else
stat_hi |= 0x10;
dev->status = (dev->status & 0x0f) | stat_hi;
}
if (channel == 2) {
kbd_log("ATkbc: mouse_queue[%02X] = %02X;\n", mouse_queue_end, val);
mouse_queue[mouse_queue_end] = val;
@@ -1231,7 +1220,7 @@ write64_generic(void *priv, uint8_t val)
case 0xa4: /* check if password installed */
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
kbd_log("ATkbc: check if password installed\n");
add_data(dev, 0xf1);
add_to_kbc_queue_front(dev, 0xf1, 0, 0x00);
return 0;
}
break;
@@ -1255,14 +1244,14 @@ write64_generic(void *priv, uint8_t val)
case 0xa9: /*Test mouse port*/
kbd_log("ATkbc: test mouse port\n");
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
add_data(dev, 0x00); /* no error, this is testing the channel 2 interface */
add_to_kbc_queue_front(dev, 0x00, 0, 0x00); /* no error, this is testing the channel 2 interface */
return 0;
}
break;
case 0xaf: /* read keyboard version */
kbd_log("ATkbc: read keyboard version\n");
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x42, 0, 0x00);
return 0;
case 0xc0: /* read input port */
@@ -1452,7 +1441,7 @@ write64_ami(void *priv, uint8_t val)
case 0x1e:
case 0x1f:
kbd_log("ATkbc: AMI - alias read from %08X\n", val);
add_data(dev, dev->mem[val]);
add_to_kbc_queue_front(dev, dev->mem[val], 0, 0x00);
return 0;
case 0x40:
@@ -1500,20 +1489,26 @@ write64_ami(void *priv, uint8_t val)
kbd_log("ATkbc: AMI - get controller version\n");
if ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_NOREF) {
if (kbc_ven == KBC_VEN_ALI)
add_data(dev, 'F');
add_to_kbc_queue_front(dev, 'F', 0, 0x00);
else if ((dev->flags & KBC_VEN_MASK) == KBC_VEN_INTEL_AMI)
add_data(dev, '5');
add_to_kbc_queue_front(dev, '5', 0, 0x00);
else if (is_pentium)
add_to_kbc_queue_front(dev, 'R', 0, 0x00);
else
add_data(dev, 'H');
} else
add_data(dev, 'F');
add_to_kbc_queue_front(dev, 'H', 0, 0x00);
} else if (is386 && !is486)
add_to_kbc_queue_front(dev, 'B', 0, 0x00);
else if (!is386)
add_to_kbc_queue_front(dev, '8', 0, 0x00);
else
add_to_kbc_queue_front(dev, 'F', 0, 0x00);
return 0;
case 0xa2: /* clear keyboard controller lines P22/P23 */
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
kbd_log("ATkbc: AMI - clear KBC lines P22 and P23\n");
write_output(dev, dev->output_port & 0xf3);
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
}
break;
@@ -1522,7 +1517,7 @@ write64_ami(void *priv, uint8_t val)
if ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_NOREF) {
kbd_log("ATkbc: AMI - set KBC lines P22 and P23\n");
write_output(dev, dev->output_port | 0x0c);
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
}
break;
@@ -1594,7 +1589,7 @@ write64_ami(void *priv, uint8_t val)
kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) low\n");
if (!(dev->flags & DEVICE_PCI) || (val > 0xb1))
dev->input_port &= ~(1 << (val & 0x03));
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xb4:
@@ -1603,7 +1598,7 @@ write64_ami(void *priv, uint8_t val)
kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) low\n");
if (!(dev->flags & DEVICE_PCI))
write_output(dev, dev->output_port & ~(4 << (val & 0x01)));
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xb8:
@@ -1614,7 +1609,7 @@ write64_ami(void *priv, uint8_t val)
kbd_log("ATkbc: set KBC lines P10-P13 (input port bits 0-3) high\n");
if (!(dev->flags & DEVICE_PCI) || (val > 0xb9)) {
dev->input_port |= (1 << (val & 0x03));
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
}
return 0;
@@ -1624,7 +1619,7 @@ write64_ami(void *priv, uint8_t val)
kbd_log("ATkbc: set KBC lines P22-P23 (output port bits 2-3) high\n");
if (!(dev->flags & DEVICE_PCI))
write_output(dev, dev->output_port | (4 << (val & 0x01)));
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xc1: /* write input port */
@@ -1636,13 +1631,13 @@ write64_ami(void *priv, uint8_t val)
/* set KBC line P14 low */
kbd_log("ATkbc: set KBC line P14 (input port bit 4) low\n");
dev->input_port &= 0xef;
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xc5:
/* set KBC line P15 low */
kbd_log("ATkbc: set KBC line P15 (input port bit 5) low\n");
dev->input_port &= 0xdf;
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xc8:
@@ -1667,13 +1662,13 @@ write64_ami(void *priv, uint8_t val)
/* set KBC line P14 high */
kbd_log("ATkbc: set KBC line P14 (input port bit 4) high\n");
dev->input_port |= 0x10;
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xcd:
/* set KBC line P15 high */
kbd_log("ATkbc: set KBC line P15 (input port bit 5) high\n");
dev->input_port |= 0x20;
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xef: /* ??? - sent by AMI486 */
@@ -1832,12 +1827,12 @@ write64_toshiba(void *priv, uint8_t val)
case 0xb4: /* T3100e: Get configuration / status */
kbd_log("ATkbc: T3100e: Get configuration / status\n");
add_data(dev, t3100e_config_get());
add_to_kbc_queue_front(dev, t3100e_config_get(), 0, 0x00);
return 0;
case 0xb5: /* T3100e: Get colour / mono byte */
kbd_log("ATkbc: T3100e: Get colour / mono byte\n");
add_data(dev, t3100e_mono_get());
add_to_kbc_queue_front(dev, t3100e_mono_get(), 0, 0x00);
return 0;
case 0xb6: /* T3100e: Set colour / mono byte */
@@ -1864,9 +1859,9 @@ write64_toshiba(void *priv, uint8_t val)
kbd_log("ATkbc: T3100e: Read 'Fn' key\n");
if (keyboard_recv(0xb8) || /* Right Alt */
keyboard_recv(0x9d)) /* Right Ctrl */
add_data(dev, 0x04);
add_to_kbc_queue_front(dev, 0x04, 0, 0x00);
else
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
return 0;
case 0xbc: /* T3100e: Reset Fn+Key notification */
@@ -1880,7 +1875,7 @@ write64_toshiba(void *priv, uint8_t val)
/* The T3100e returns all bits set except bit 6 which
* is set by t3100e_mono_set() */
dev->input_port = (t3100e_mono_get() & 1) ? 0xff : 0xbf;
add_data(dev, dev->input_port);
add_to_kbc_queue_front(dev, dev->input_port, 0, 0x00);
return 0;
}
@@ -2221,7 +2216,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
case 0x3d:
case 0x3e:
case 0x3f:
add_data(dev, dev->mem[val & 0x1f]);
add_to_kbc_queue_front(dev, dev->mem[val & 0x1f], 0, 0x00);
break;
/* Write data to KBC memory. */
@@ -2280,12 +2275,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
write_cmd(dev, 0x30 | STAT_SYSFLAG);
else
write_cmd(dev, 0x10 | STAT_SYSFLAG);
add_data(dev, 0x55);
add_to_kbc_queue_front(dev, 0x55, 0, 0x00);
break;
case 0xab: /* interface test */
kbd_log("ATkbc: interface test\n");
add_data(dev, 0x00); /*no error*/
add_to_kbc_queue_front(dev, 0x00, 0, 0x00); /*no error*/
break;
case 0xac: /* diagnostic dump */
@@ -2309,7 +2304,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
case 0xca: /* read keyboard mode */
kbd_log("ATkbc: AMI - read keyboard mode\n");
add_data(dev, dev->ami_flags);
add_to_kbc_queue_front(dev, dev->ami_flags, 0, 0x00);
break;
case 0xcb: /* set keyboard mode */
@@ -2343,7 +2338,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv)
case 0xe0: /* read test inputs */
kbd_log("ATkbc: read test inputs\n");
add_data(dev, 0x00);
add_to_kbc_queue_front(dev, 0x00, 0, 0x00);
break;
default: