From 979977b4305302f444dd61a46f3eb7517a98b3ac Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 28 Aug 2017 22:55:10 +0200 Subject: [PATCH] SIO/PIIX/PIIX3 turbo reset control as well as emulator hard reset now also reset the PCI interrupt hold status in addition to the ELCR. --- src/pci.c | 19 ++++++++++++++++++- src/pci.h | 1 + src/sio.c | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/pci.c b/src/pci.c index a51ecd835..547de2efb 100644 --- a/src/pci.c +++ b/src/pci.c @@ -282,13 +282,30 @@ void pci_clear_irq(int card, int pci_int) } } +void pci_reset(void) +{ + int i = 0; + + for (i = 0; i < 16; i++) + { + if (pci_irq_hold[i]) + { + pci_irq_hold[i] = 0; + + picintc(1 << i); + } + } + + elcr_reset(); +} + void pci_init(int type) { int c; PCI = 1; - elcr_reset(); + pci_reset(); io_sethandler(0x04d0, 0x0002, elcr_read, NULL, NULL, elcr_write, NULL, NULL, NULL); diff --git a/src/pci.h b/src/pci.h index ece5f0b66..4ef145fd0 100644 --- a/src/pci.h +++ b/src/pci.h @@ -11,6 +11,7 @@ void pci_set_irq(int card, int pci_int); void pci_ide_clear_irq(int ide_board, int irq); void pci_clear_irq(int card, int pci_int); int pci_irq_is_level(int irq); +void pci_reset(void); #define PCI_REG_COMMAND 0x04 diff --git a/src/sio.c b/src/sio.c index 9f263cf8e..37112936b 100644 --- a/src/sio.c +++ b/src/sio.c @@ -173,7 +173,7 @@ void trc_reset(uint8_t val) port_92_reset(); keyboard_at_reset(); - elcr_reset(); + pci_reset(); } resetx86(); }