From 3b54cb085eca1ef674604ae10c29cfa3349ecba7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 24 Apr 2023 02:47:17 +0200 Subject: [PATCH] Some minor bugfixes. --- src/chipset/ali1543.c | 13 +++++++++---- src/device/kbc_at.c | 26 ++++++++++++++++++++++++-- src/device/kbc_at_dev.c | 2 +- src/device/mouse_ps2.c | 3 +-- src/sio/sio_ali5123.c | 4 ++++ 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/chipset/ali1543.c b/src/chipset/ali1543.c index 0b5fe5761..f3296bd20 100644 --- a/src/chipset/ali1543.c +++ b/src/chipset/ali1543.c @@ -151,11 +151,13 @@ ali1533_write(int func, int addr, uint8_t val, void *priv) break; case 0x41: - /* TODO: Bit 7 selects keyboard controller type: - 0 = AT, 1 = PS/2 */ pic_kbd_latch(1); - pic_mouse_latch(!!(val & 0x40)); - dev->pci_conf[addr] = val & 0xbf; + // pic_kbd_latch(!!(val & 0x80)); + if (dev->type == 1) + pic_mouse_latch(!!(val & 0x40) || !(dev->pci_conf[0x78] & 0x02)); + else + pic_mouse_latch(!!(val & 0x40)); + dev->pci_conf[addr] = val; break; case 0x42: /* ISA Bus Speed */ @@ -431,6 +433,7 @@ ali1533_write(int func, int addr, uint8_t val, void *priv) if (dev->type == 1) { ali1543_log("PCI78 = %02X\n", val); dev->pci_conf[addr] = val & 0x33; + pic_mouse_latch(!!(dev->pci_conf[0x41] & 0x40) || !(val & 0x02)); } break; @@ -1520,6 +1523,8 @@ ali1543_reset(void *priv) ali1533_write(0, 0x74, 0x00, dev); ali1533_write(0, 0x75, 0x00, dev); ali1533_write(0, 0x76, 0x00, dev); + if (dev->type == 1) + ali1533_write(0, 0x78, 0x00, dev); unmask_a20_in_smm = 1; } diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 2c9433bd9..9b8a3de3d 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -801,12 +801,30 @@ write64_generic(void *priv, uint8_t val) IBM PS/1: xxxxxxxx IBM PS/2 MCA: xxxxx1xx Intel AMI Pentium BIOS'es with AMI MegaKey KB-5 keyboard controller: x1x1xxxx - Acer: xxx0x0xx + Acer: xxxxx0xx Packard Bell PB450: xxxxx1xx P6RP4: xx1xx1xx Epson Action Tower 2600: xxxx01xx TriGem Hawk: xxxx11xx + Machine input based on current code: 11111111 + Everything non-Green: Pull down bit 7 if not PS/2 and keyboard is inhibited. + Pull down bit 6 if primary display is CGA. + Xi8088: Pull down bit 6 if primary display is MDA. + Acer: Pull down bit 6 if primary display is MDA. + Pull down bit 2 always (must be so to enable CMOS Setup). + IBM PS/1: Pull down bit 6 if current floppy drive is 3.5". + Epson Action Tower 2600: Pull down bit 3 always (for Epson logo). + NCR: Pull down bit 5 always (power-on default speed = high). + Pull down bit 3 if there is no FPU. + Pull down bits 1 and 0 always? + Compaq: Pull down bit 6 if Compaq dual-scan display is in use. + Pull down bit 5 if system board DIP switch is ON. + Pull down bit 4 if CPU speed selected is auto. + Pull down bit 3 if CPU speed selected is slow (4 MHz). + Pull down bit 2 if FPU is present. + Pull down bits 1 and 0 always? + Bit 7: AT KBC only - keyboard inhibited (often physical lock): 0 = yes, 1 = no (also Compaq); Bit 6: Mostly, display: 0 = CGA, 1 = MDA, inverted on Xi8088 and Acer KBC's; Intel AMI MegaKey KB-5: Used for green features, SMM handler expects it to be set; @@ -817,7 +835,6 @@ write64_generic(void *priv, uint8_t val) Compaq: System board DIP switch 5: 0 = ON, 1 = OFF. Bit 4: (Which board?): RAM on motherboard: 0 = 512 kB, 1 = 256 kB; NCR: RAM on motherboard: 0 = unsupported, 1 = 512 kB; - Acer: Must be 0; Intel AMI MegaKey KB-5: Must be 1; IBM PS/1: Ignored; Compaq: 0 = Auto speed selected, 1 = High speed selected. @@ -851,6 +868,7 @@ write64_generic(void *priv, uint8_t val) fixed_bits |= 0x40; if (kbc_ven == KBC_VEN_IBM_PS1) { current_drive = fdc_get_current_drive(); + /* (B0 or F0) | (fdd_is_525(current_drive) on bit 6) */ add_to_kbc_queue_front(dev, dev->p1 | fixed_bits | (fdd_is_525(current_drive) ? 0x40 : 0x00), 0, 0x00); } else if (kbc_ven == KBC_VEN_NCR) { @@ -864,6 +882,7 @@ write64_generic(void *priv, uint8_t val) * bit 1: high/auto speed * bit 0: dma mode */ + /* (B0 or F0) | 0x04 | (display on bit 6) | (fpu on bit 3) */ add_to_kbc_queue_front(dev, (dev->p1 | fixed_bits | (video_is_mda() ? 0x40 : 0x00) | (hasfpu ? 0x08 : 0x00)) & 0xdf, 0, 0x00); } else if (kbc_ven == KBC_VEN_TRIGEM_AMI) { @@ -874,10 +893,13 @@ write64_generic(void *priv, uint8_t val) 0, 0: Generic AMI logo. */ if (dev->misc_flags & FLAG_PCI) fixed_bits |= 8; + /* (B0 or F0) | (0x04 or 0x0c) */ add_to_kbc_queue_front(dev, dev->p1 | fixed_bits, 0, 0x00); } else if (((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) && ((dev->flags & KBC_TYPE_MASK) < KBC_TYPE_GREEN)) + /* (B0 or F0) | (0x08 or 0x0c) */ add_to_kbc_queue_front(dev, ((dev->p1 | fixed_bits) & 0xf0) | (((dev->flags & KBC_VEN_MASK) == KBC_VEN_ACER) ? 0x08 : 0x0c), 0, 0x00); else + /* (B0 or F0) | (0x04 or 0x44) */ add_to_kbc_queue_front(dev, dev->p1 | fixed_bits, 0, 0x00); dev->p1 = ((dev->p1 + 1) & 3) | (dev->p1 & 0xfc); return 0; diff --git a/src/device/kbc_at_dev.c b/src/device/kbc_at_dev.c index 87fdd51c6..ca3dc1361 100644 --- a/src/device/kbc_at_dev.c +++ b/src/device/kbc_at_dev.c @@ -119,7 +119,7 @@ kbc_at_dev_poll(void *priv) case DEV_STATE_MAIN_2: /* Output from scan queue if needed and then return to main loop #1. */ if (*dev->scan && (dev->port->out_new == -1) && (dev->queue_start != dev->queue_end)) { - kbc_at_dev_log("%s %1: %02X (DATA) on channel 1\n", dev->name, dev->inst, dev->queue[dev->queue_start]); + kbc_at_dev_log("%s: %02X (DATA) on channel 1\n", dev->name, dev->queue[dev->queue_start]); dev->port->out_new = dev->queue[dev->queue_start]; dev->queue_start = (dev->queue_start + 1) & 0xf; } diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index 4027c6173..5563909ba 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -135,6 +135,7 @@ ps2_set_defaults(atkbc_dev_t *dev) dev->mode = MODE_STREAM; dev->rate = 1; dev->flags &= 0x88; + mouse_scan = 0; } static void @@ -144,8 +145,6 @@ ps2_bat(void *priv) ps2_set_defaults(dev); - mouse_scan = 1; - kbc_at_dev_queue_add(dev, 0xaa, 0); kbc_at_dev_queue_add(dev, 0x00, 0); } diff --git a/src/sio/sio_ali5123.c b/src/sio/sio_ali5123.c index 33e4022c6..54949a125 100644 --- a/src/sio/sio_ali5123.c +++ b/src/sio/sio_ali5123.c @@ -174,6 +174,7 @@ ali5123_reset(ali5123_t *dev) serial_setup(dev->uart[1], 0x03e8, dev->ld_regs[5][0x70]); /* Logical device 7: Keyboard */ + dev->ld_regs[7][0x30] = 1; dev->ld_regs[7][0x70] = 1; /* TODO: Register F0 bit 6: 0 = PS/2, 1 = AT */ @@ -253,6 +254,9 @@ ali5123_write(uint16_t port, uint8_t val, void *priv) case 0x06: case 0x08 ... 0x0a: return; + case 0x07: + if (dev->cur_reg == 0xf0) + val &= 0xbf; } dev->ld_regs[cur_ld][dev->cur_reg] = val; }