Fixed the BCM SQ-588 with a kludged, fixes #4431.

This commit is contained in:
OBattler
2024-05-08 00:34:51 +02:00
parent 509305f2f1
commit c89e92fafd
3 changed files with 27 additions and 20 deletions

View File

@@ -39,6 +39,7 @@
#include <86box/spd.h> #include <86box/spd.h>
#include <86box/hdc.h> #include <86box/hdc.h>
#include <86box/hdc_ide.h> #include <86box/hdc_ide.h>
#include <86box/keyboard.h>
#include <86box/chipset.h> #include <86box/chipset.h>
#ifdef ENABLE_SIS_85C50X_LOG #ifdef ENABLE_SIS_85C50X_LOG
@@ -257,6 +258,7 @@ sis_85c50x_write(int func, int addr, uint8_t val, void *priv)
break; break;
case 0x5b: case 0x5b:
dev->pci_conf[addr] = val; dev->pci_conf[addr] = val;
kbc_at_set_fast_reset(!!(val & 0x40));
break; break;
case 0x60: /* SMI */ case 0x60: /* SMI */
if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) { if ((dev->pci_conf[0x68] & 0x01) && !(dev->pci_conf[addr] & 0x02) && (val & 0x02)) {

View File

@@ -202,6 +202,14 @@ static const uint8_t nont_to_t[256] = {
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
}; };
static uint8_t fast_reset = 0x00;
void
kbc_at_set_fast_reset(const uint8_t new_fast_reset)
{
fast_reset = new_fast_reset;
}
#ifdef ENABLE_KBC_AT_LOG #ifdef ENABLE_KBC_AT_LOG
int kbc_at_do_log = ENABLE_KBC_AT_LOG; int kbc_at_do_log = ENABLE_KBC_AT_LOG;
@@ -748,7 +756,10 @@ write_p2(atkbc_t *dev, uint8_t val)
/* AT, PS/2: Handle reset. */ /* AT, PS/2: Handle reset. */
/* 0 holds the CPU in the RESET state, 1 releases it. To simplify this, /* 0 holds the CPU in the RESET state, 1 releases it. To simplify this,
we just do everything on release. */ we just do everything on release. */
if (!cpu_cpurst_on_sr && ((old ^ val) & 0x01)) { /*Reset*/ /* TODO: The fast reset flag's condition should be reversed - the BCM SQ-588
enables the flag and the CPURST on soft reset flag but expects this
to still soft reset instead. */
if ((fast_reset || !cpu_cpurst_on_sr) && ((old ^ val) & 0x01)) { /*Reset*/
if (!(val & 0x01)) { /* Pin 0 selected. */ if (!(val & 0x01)) { /* Pin 0 selected. */
/* Pin 0 selected. */ /* Pin 0 selected. */
kbc_at_log("write_p2(): Pulse reset!\n"); kbc_at_log("write_p2(): Pulse reset!\n");
@@ -765,11 +776,12 @@ write_p2(atkbc_t *dev, uint8_t val)
flushmmucache(); flushmmucache();
if (kbc_ven == KBC_VEN_ALI) if (kbc_ven == KBC_VEN_ALI)
smbase = 0x00030000; smbase = 0x00030000;
/* Yes, this is a hack, but until someone gets ahold of the real PCD-2L /* Yes, this is a hack, but until someone gets ahold of the real PCD-2L
and can find out what they actually did to make it boot from FFFFF0 and can find out what they actually did to make it boot from FFFFF0
correctly despite A20 being gated when the CPU is reset, this will correctly despite A20 being gated when the CPU is reset, this will
have to do. */ have to do. */
else if (kbc_ven == KBC_VEN_SIEMENS) if (kbc_ven == KBC_VEN_SIEMENS)
is486 ? loadcs(0xf000) : loadcs_2386(0xf000); is486 ? loadcs(0xf000) : loadcs_2386(0xf000);
} }
} }
@@ -778,10 +790,10 @@ write_p2(atkbc_t *dev, uint8_t val)
/* Do this here to avoid an infinite reset loop. */ /* Do this here to avoid an infinite reset loop. */
dev->p2 = val; dev->p2 = val;
if (cpu_cpurst_on_sr && ((old ^ val) & 0x01)) { /*Reset*/ if (!fast_reset && cpu_cpurst_on_sr && ((old ^ val) & 0x01)) { /*Reset*/
if (!(val & 0x01)) { /* Pin 0 selected. */ if (!(val & 0x01)) { /* Pin 0 selected. */
/* Pin 0 selected. */ /* Pin 0 selected. */
pclog("write_p2(): Pulse reset!\n"); kbc_at_log("write_p2(): Pulse reset!\n");
dma_reset(); dma_reset();
dma_set_at(1); dma_set_at(1);
@@ -1833,24 +1845,8 @@ kbc_at_write(uint16_t port, uint8_t val, void *priv)
if (fast_a20 && dev->wantdata && (dev->command == 0xd1)) { if (fast_a20 && dev->wantdata && (dev->command == 0xd1)) {
kbc_at_log("ATkbc: write P2\n"); kbc_at_log("ATkbc: write P2\n");
#if 0
/* Fast A20 - ignore all other bits. */
val = (val & 0x02) | (dev->p2 & 0xfd);
/* Bit 2 of AMI flags is P22-P23 blocked (1 = yes, 0 = no),
discovered by reverse-engineering the AOpeN Vi15G BIOS. */
if (dev->ami_flags & 0x04) {
/* If keyboard controller lines P22-P23 are blocked,
we force them to remain unchanged. */
val &= ~0x0c;
val |= (dev->p2 & 0x0c);
}
write_p2_fast_a20(dev, val | 0x01);
#else
/* Fast A20 - ignore all other bits. */ /* Fast A20 - ignore all other bits. */
write_p2_fast_a20(dev, (dev->p2 & 0xfd) | (val & 0x02)); write_p2_fast_a20(dev, (dev->p2 & 0xfd) | (val & 0x02));
#endif
dev->wantdata = 0; dev->wantdata = 0;
dev->state = STATE_MAIN_IBF; dev->state = STATE_MAIN_IBF;
@@ -1866,6 +1862,11 @@ kbc_at_write(uint16_t port, uint8_t val, void *priv)
dev->state = STATE_KBC_PARAM; dev->state = STATE_KBC_PARAM;
dev->command = 0xd1; dev->command = 0xd1;
return; return;
} else if (fast_reset && ((val & 0xf0) == 0xf0)) {
pulse_output(dev, val & 0x0f);
dev->state = STATE_MAIN_IBF;
return;
} }
break; break;
@@ -2113,6 +2114,8 @@ kbc_at_init(const device_t *info)
/* The actual keyboard. */ /* The actual keyboard. */
device_add(&keyboard_at_generic_device); device_add(&keyboard_at_generic_device);
fast_reset = 0x00;
return dev; return dev;
} }

View File

@@ -276,7 +276,9 @@ extern int keyboard_isfsexit_up(void);
extern int keyboard_ismsexit(void); extern int keyboard_ismsexit(void);
extern void keyboard_set_is_amstrad(int ams); extern void keyboard_set_is_amstrad(int ams);
extern void kbc_at_set_fast_reset(uint8_t new_fast_reset);
extern void kbc_at_handler(int set, void *priv); extern void kbc_at_handler(int set, void *priv);
extern uint8_t kbc_at_dev_queue_pos(atkbc_dev_t *dev, uint8_t main); extern uint8_t kbc_at_dev_queue_pos(atkbc_dev_t *dev, uint8_t main);
extern void kbc_at_dev_queue_add(atkbc_dev_t *dev, uint8_t val, uint8_t main); extern void kbc_at_dev_queue_add(atkbc_dev_t *dev, uint8_t val, uint8_t main);
extern void kbc_at_dev_reset(atkbc_dev_t *dev, int do_fa); extern void kbc_at_dev_reset(atkbc_dev_t *dev, int do_fa);