KBC reset is now hard reset.

This commit is contained in:
OBattler
2021-09-17 02:55:43 +02:00
parent 626e8e58bb
commit b8a2fdfd0a
3 changed files with 79 additions and 24 deletions

View File

@@ -656,6 +656,7 @@ extern void resetx86(void);
extern void refreshread(void); extern void refreshread(void);
extern void resetreadlookup(void); extern void resetreadlookup(void);
extern void softresetx86(void); extern void softresetx86(void);
extern void hardresetx86(void);
extern void x86_int(int num); extern void x86_int(int num);
extern void x86_int_sw(int num); extern void x86_int_sw(int num);
extern int x86_int_sw_rm(int num); extern int x86_int_sw_rm(int num);

View File

@@ -26,6 +26,8 @@
#include "cpu.h" #include "cpu.h"
#include "x86.h" #include "x86.h"
#include <86box/machine.h> #include <86box/machine.h>
#include <86box/device.h>
#include <86box/dma.h>
#include <86box/io.h> #include <86box/io.h>
#include <86box/mem.h> #include <86box/mem.h>
#include <86box/rom.h> #include <86box/rom.h>
@@ -239,7 +241,7 @@ reset_common(int hard)
leave_smm(); leave_smm();
/* Needed for the ALi M1533. */ /* Needed for the ALi M1533. */
if (soft_reset_pci && !hard) if (is486 && (hard || soft_reset_pci))
pci_reset(); pci_reset();
use32 = 0; use32 = 0;
@@ -275,13 +277,13 @@ reset_common(int hard)
if (is386 || hard) if (is386 || hard)
EAX = EBX = ECX = EDX = ESI = EDI = EBP = ESP = 0; EAX = EBX = ECX = EDX = ESI = EDI = EBP = ESP = 0;
if (hard) { /* if (hard) {
makeznptable(); makeznptable();
resetreadlookup(); resetreadlookup();
makemod1table(); makemod1table();
cpu_set_edx(); cpu_set_edx();
mmu_perm = 4; mmu_perm = 4;
} } */
x86seg_reset(); x86seg_reset();
#ifdef USE_DYNAREC #ifdef USE_DYNAREC
if (hard) if (hard)
@@ -299,8 +301,9 @@ reset_common(int hard)
smi_block = 0; smi_block = 0;
if (hard) { if (hard) {
smbase = is_am486dxl ? 0x00060000 : 0x00030000; if (is486)
ppi_reset(); smbase = is_am486dxl ? 0x00060000 : 0x00030000;
// ppi_reset();
} }
in_sys = 0; in_sys = 0;
@@ -320,6 +323,15 @@ void
resetx86(void) resetx86(void)
{ {
reset_common(1); reset_common(1);
/* ---- */
makeznptable();
resetreadlookup();
makemod1table();
cpu_set_edx();
mmu_perm = 4;
ppi_reset();
/* ---- */
soft_reset_mask = 0; soft_reset_mask = 0;
} }
@@ -334,3 +346,21 @@ softresetx86(void)
reset_common(0); reset_common(0);
} }
/* Actual hard reset. */
void
hardresetx86(void)
{
dma_reset();
device_reset_all();
cpu_alt_reset = 0;
mem_a20_alt = 0;
mem_a20_recalc();
flushmmucache();
resetx86();
}

View File

@@ -1181,6 +1181,8 @@ static void
write_output(atkbd_t *dev, uint8_t val) write_output(atkbd_t *dev, uint8_t val)
{ {
uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; uint8_t kbc_ven = dev->flags & KBC_VEN_MASK;
uint8_t old = dev->p2;
kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->p2); kbd_log("ATkbc: write output port: %02X (old: %02X)\n", val, dev->p2);
if (!(dev->flags & KBC_FLAG_PS2)) if (!(dev->flags & KBC_FLAG_PS2))
@@ -1189,36 +1191,43 @@ write_output(atkbd_t *dev, uint8_t val)
dev->kbd_inhibit = (val & 0x40); dev->kbd_inhibit = (val & 0x40);
dev->mouse_inhibit = (val & 0x08); dev->mouse_inhibit = (val & 0x08);
if ((dev->p2 ^ val) & 0x20) { /*IRQ 12*/ /* IRQ 12 */
if ((old ^ val) & 0x20) {
if (val & 0x20) { if (val & 0x20) {
kbd_log("ATkbc: write_output(): IRQ 12\n"); kbd_log("ATkbc: write_output(): IRQ 12\n");
picint(1 << 12); picint(1 << 12);
} else } else
picintc(1 << 12); picintc(1 << 12);
} }
if ((dev->p2 ^ val) & 0x10) { /*IRQ 1*/
/* IRQ 1 */
if ((old ^ val) & 0x10) {
if (val & 0x10) { if (val & 0x10) {
kbd_log("ATkbc: write_output(): IRQ 1\n"); kbd_log("ATkbc: write_output(): IRQ 1\n");
picint(1 << 1); picint(1 << 1);
} else } else
picintc(1 << 1); picintc(1 << 1);
} }
if ((dev->p2 ^ val) & 0x02) { /*A20 enable change*/
/* A20 enable change */
if ((old ^ val) & 0x02) {
mem_a20_key = val & 0x02; mem_a20_key = val & 0x02;
mem_a20_recalc(); mem_a20_recalc();
flushmmucache(); flushmmucache();
} }
if ((dev->p2 ^ val) & 0x01) { /*Reset*/
if (! (val & 0x01)) { /* 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,
we just do everything on release. */
if ((val & 0x01) && !(old & 0x01)) {
if (val & 0x01) {
/* Pin 0 selected. */ /* Pin 0 selected. */
pclog("write_output(): Pulse reset!\n"); pclog("write_output(): Pulse reset!\n");
softresetx86(); /*Pulse reset!*/ hardresetx86(); /*Pulse reset!*/
cpu_set_edx();
smbase = is_am486dxl ? 0x00060000 : 0x00030000;
} }
} }
/* Mask off the A20 stuff because we use mem_a20_key directly for that. */
dev->p2 = val;
} }
@@ -2315,8 +2324,8 @@ write64_ami(void *priv, uint8_t val)
case 0xa1: /* get controller version */ case 0xa1: /* get controller version */
kbd_log("ATkbc: AMI - get controller version\n"); kbd_log("ATkbc: AMI - get controller version\n");
// kbc_transmit(dev, 'H'); kbc_transmit(dev, 'H');
kbc_transmit(dev, 'Z'); // kbc_transmit(dev, 'Z');
return 0; return 0;
case 0xa2: /* clear keyboard controller lines P22/P23 */ case 0xa2: /* clear keyboard controller lines P22/P23 */
@@ -2928,13 +2937,14 @@ kbd_reset(void *priv)
{ {
atkbd_t *dev = (atkbd_t *)priv; atkbd_t *dev = (atkbd_t *)priv;
int i; int i;
uint8_t kbc_ven = 0x0; uint8_t kbc_ven;
kbc_ven = dev->flags & KBC_VEN_MASK;
dev->status = STAT_UNLOCKED; if (dev == NULL)
dev->mem[0x20] = 0x01; return;
dev->mem[0x20] |= CCB_TRANSLATE;
write_output(dev, 0xcf); kbc_ven = dev->flags & KBC_VEN_MASK;
dev->status &= ~(STAT_IFULL | STAT_OFULL | STAT_CD);
dev->last_irq = 0; dev->last_irq = 0;
dev->secr_phase = 0; dev->secr_phase = 0;
dev->kbd_in = 0; dev->kbd_in = 0;
@@ -2973,6 +2983,20 @@ kbd_reset(void *priv)
} }
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;
}
/* Reset the AT keyboard - this is needed for the PCI TRC and is done /* Reset the AT keyboard - this is needed for the PCI TRC and is done
until a better solution is found. */ until a better solution is found. */
void void
@@ -3064,7 +3088,7 @@ kbd_init(const device_t *info)
break; break;
} }
kbd_reset(dev); kbd_power_on(dev);
/* We need this, sadly. */ /* We need this, sadly. */
SavedKbd = dev; SavedKbd = dev;