UMC HB4 shadow RAM overhaul and SMRAM fixes, slight changes to SiS 85c4xx, a fix for SiS 85c50x, fixed SMBASE on 486 (it should *NOT* zero the most significant 8 bits!), various improvements to mem.c (eg. mem_invalidate_range() is now faster), fixed resetting PCI on soft reset, and made the KBC soft reset again.

This commit is contained in:
OBattler
2021-09-25 15:30:06 +02:00
parent b5f7e9bec3
commit 5ad606a8f2
8 changed files with 304 additions and 252 deletions

View File

@@ -673,6 +673,7 @@ kbd_status(const char *fmt, ...)
}
// #define ENABLE_KEYBOARD_AT_LOG 1
#ifdef ENABLE_KEYBOARD_AT_LOG
int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG;
@@ -1219,13 +1220,14 @@ write_output(atkbd_t *dev, uint8_t val)
/* Do this here to avoid an infinite reset loop. */
dev->p2 = val;
/* 0 holds the CPU in the RESET state, 1 releases it. To simply this,
/* 0 holds the CPU in the RESET state, 1 releases it. To simplify this,
we just do everything on release. */
if ((val & 0x01) && !(old & 0x01)) {
if (val & 0x01) {
/* Pin 0 selected. */
pclog("write_output(): Pulse reset!\n");
hardresetx86(); /*Pulse reset!*/
softresetx86(); /*Pulse reset!*/
cpu_set_edx();
}
}
}
@@ -2936,18 +2938,36 @@ static void
kbd_reset(void *priv)
{
atkbd_t *dev = (atkbd_t *)priv;
int i;
uint8_t kbc_ven;
if (dev == NULL)
return;
kbc_ven = dev->flags & KBC_VEN_MASK;
dev->status &= ~(STAT_IFULL | STAT_OFULL | STAT_CD);
dev->last_irq = 0;
picintc(1 << 1);
picintc(1 << 12);
dev->secr_phase = 0;
dev->kbd_in = 0;
dev->ob = 0xff;
sc_or = 0;
}
static void
kbd_power_on(atkbd_t *dev)
{
int i;
uint8_t kbc_ven = dev->flags & KBC_VEN_MASK;
kbd_reset(dev);
dev->status = STAT_UNLOCKED;
/* Write the value here first, so that we don't hit a pulse reset. */
dev->p2 = 0xcf;
write_output(dev, 0xcf);
dev->mem[0x20] = 0x01;
dev->mem[0x20] |= CCB_TRANSLATE;
dev->ami_mode = !!(dev->flags & KBC_FLAG_PS2);
/* Set up the correct Video Type bits. */
@@ -2960,17 +2980,15 @@ kbd_reset(void *priv)
dev->inhibit = 0x10;
kbd_log("ATkbc: input port = %02x\n", dev->p1);
keyboard_mode = 0x02 | (dev->mem[0x20] & CCB_TRANSLATE);
/* Enable keyboard, disable mouse. */
set_enable_kbd(dev, 1);
keyboard_scan = 1;
set_enable_mouse(dev, 0);
mouse_scan = 0;
dev->ob = 0xff;
dev->mem[0x31] = 0xfe;
sc_or = 0;
keyboard_mode = 0x02 | (dev->mem[0x20] & CCB_TRANSLATE);
for (i = 1; i <= 2; i++)
kbc_queue_reset(i);
@@ -2978,22 +2996,6 @@ kbd_reset(void *priv)
memset(keyboard_set3_flags, 0, 512);
set_scancode_map(dev);
dev->mem[0x31] = 0xfe;
}
static void
kbd_power_on(atkbd_t *dev)
{
kbd_reset(dev);
dev->status = STAT_UNLOCKED;
/* Write the value here first, so that we don't hit a pulse reset. */
dev->p2 = 0xcf;
write_output(dev, 0xcf);
dev->mem[0x20] = 0x01;
dev->mem[0x20] |= CCB_TRANSLATE;
}