diff --git a/src/disk/hdc_ide_sff8038i.c b/src/disk/hdc_ide_sff8038i.c
index ffa6a8a0c..bf712bcc8 100644
--- a/src/disk/hdc_ide_sff8038i.c
+++ b/src/disk/hdc_ide_sff8038i.c
@@ -10,13 +10,13 @@
* word 0 - base address
* word 1 - bits 1-15 = byte count, bit 31 = end of transfer
*
- * Version: @(#)hdc_ide_sff8038i.c 1.0.0 2019/05/12
+ * Version: @(#)hdc_ide_sff8038i.c 1.0.1 2019/10/30
*
* Authors: Sarah Walker,
* Miran Grca,
*
- * Copyright 2008-2018 Sarah Walker.
- * Copyright 2016-2018 Miran Grca.
+ * Copyright 2008-2019 Sarah Walker.
+ * Copyright 2016-2019 Miran Grca.
*/
#include
#include
@@ -371,12 +371,12 @@ sff_bus_master_set_irq(int channel, void *priv)
channel &= 0x01;
if (dev->status & 0x04) {
if (channel && pci_use_mirq(0))
- pci_set_mirq(0);
+ pci_set_mirq(0, 0);
else
picint(1 << (14 + channel));
} else {
if ((channel & 1) && pci_use_mirq(0))
- pci_clear_mirq(0);
+ pci_clear_mirq(0, 0);
else
picintc(1 << (14 + channel));
}
diff --git a/src/pci.c b/src/pci.c
index ccfc4d312..b26dc203a 100644
--- a/src/pci.c
+++ b/src/pci.c
@@ -8,15 +8,15 @@
*
* Implementation the PCI bus.
*
- * Version: @(#)pci.c 1.0.1 2018/11/05
+ * Version: @(#)pci.c 1.0.2 2019/10/30
*
* Authors: Miran Grca,
* Fred N. van Kempen,
* Sarah Walker,
*
- * Copyright 2016-2018 Miran Grca.
- * Copyright 2017,2018 Fred N. van Kempen.
- * Copyright 2008-2018 Sarah Walker.
+ * Copyright 2016-2019 Miran Grca.
+ * Copyright 2017-2019 Fred N. van Kempen.
+ * Copyright 2008-2019 Sarah Walker.
*/
#include
#include
@@ -321,10 +321,9 @@ pci_use_mirq(uint8_t mirq)
void
-pci_set_mirq(uint8_t mirq)
+pci_set_mirq(uint8_t mirq, int level)
{
uint8_t irq_line = 0;
- uint8_t level = 0;
if (! pci_mirqs[mirq].enabled) {
pci_log("pci_set_mirq(%02X): MIRQ0 disabled\n", mirq);
@@ -339,20 +338,21 @@ pci_set_mirq(uint8_t mirq)
irq_line = pci_mirqs[mirq].irq_line;
pci_log("pci_set_mirq(%02X): Using IRQ %i\n", mirq, irq_line);
- if (pci_irq_is_level(irq_line) &&
- (pci_irq_hold[irq_line] & (1ULL << (0x1E + mirq)))) {
+ if (level && (pci_irq_hold[irq_line] & (1ULL << (0x1E + mirq)))) {
/* IRQ already held, do nothing. */
pci_log("pci_set_mirq(%02X): MIRQ is already holding the IRQ\n", mirq);
return;
}
pci_log("pci_set_mirq(%02X): MIRQ not yet holding the IRQ\n", mirq);
- level = pci_irq_is_level(irq_line);
if (!level || !pci_irq_hold[irq_line]) {
pci_log("pci_set_mirq(%02X): Issuing %s-triggered IRQ (%sheld)\n", mirq, level ? "level" : "edge", pci_irq_hold[irq_line] ? "" : "not ");
/* Only raise the interrupt if it's edge-triggered or level-triggered and not yet being held. */
- picintlevel(1 << irq_line);
+ if (level)
+ picintlevel(1 << irq_line);
+ else
+ picint(1 << irq_line);
} else if (level && pci_irq_hold[irq_line]) {
pci_log("pci_set_mirq(%02X): IRQ line already being held\n", mirq);
}
@@ -376,7 +376,6 @@ pci_set_irq(uint8_t card, uint8_t pci_int)
uint8_t irq_line = 0;
uint8_t level = 0;
-
if (! last_pci_card) {
pci_log("pci_set_irq(%02X, %02X): No PCI slots (how are we even here?!)\n", card, pci_int);
return;
@@ -418,9 +417,9 @@ pci_set_irq(uint8_t card, uint8_t pci_int)
pci_log("pci_set_irq(%02X, %02X): Card not yet holding the IRQ\n", card, pci_int);
if (pci_type & PCI_NO_IRQ_STEERING)
- level = 0;
+ level = 0; /* PCI without IRQ steering - IRQ always edge. */
else
- level = pci_irq_is_level(irq_line);
+ level = 1; /* PCI with IRQ steering - IRQ always level per the Intel datasheets. */
if (!level || !pci_irq_hold[irq_line]) {
pci_log("pci_set_irq(%02X, %02X): Issuing %s-triggered IRQ (%sheld)\n", card, pci_int, level ? "level" : "edge", pci_irq_hold[irq_line] ? "" : "not ");
@@ -444,10 +443,9 @@ pci_set_irq(uint8_t card, uint8_t pci_int)
void
-pci_clear_mirq(uint8_t mirq)
+pci_clear_mirq(uint8_t mirq, int level)
{
uint8_t irq_line = 0;
- uint8_t level = 0;
if (mirq > 1) {
pci_log("pci_clear_mirq(%02X): Invalid MIRQ\n", mirq);
@@ -467,14 +465,12 @@ pci_clear_mirq(uint8_t mirq)
irq_line = pci_mirqs[mirq].irq_line;
pci_log("pci_clear_mirq(%02X): Using IRQ %i\n", mirq, irq_line);
- if (pci_irq_is_level(irq_line) &&
- !(pci_irq_hold[irq_line] & (1ULL << (0x1E + mirq)))) {
+ if (level && !(pci_irq_hold[irq_line] & (1ULL << (0x1E + mirq)))) {
/* IRQ not held, do nothing. */
pci_log("pci_clear_mirq(%02X): MIRQ is not holding the IRQ\n", mirq);
return;
}
- level = pci_irq_is_level(irq_line);
if (level) {
pci_log("pci_clear_mirq(%02X): Releasing this MIRQ's hold on the IRQ\n", mirq);
pci_irq_hold[irq_line] &= ~(1 << (0x1E + mirq));
@@ -543,9 +539,9 @@ pci_clear_irq(uint8_t card, uint8_t pci_int)
}
if (pci_type & PCI_NO_IRQ_STEERING)
- level = 0;
+ level = 0; /* PCI without IRQ steering - IRQ always edge. */
else
- level = pci_irq_is_level(irq_line);
+ level = 1; /* PCI with IRQ steering - IRQ always level per the Intel datasheets. */
if (level) {
pci_log("pci_clear_irq(%02X, %02X): Releasing this card's hold on the IRQ\n", card, pci_int);
pci_irq_hold[irq_line] &= ~(1 << card);
diff --git a/src/pci.h b/src/pci.h
index 4476a970c..be7347757 100644
--- a/src/pci.h
+++ b/src/pci.h
@@ -8,15 +8,15 @@
*
* Definitions for the PCI handler module.
*
- * Version: @(#)pci.h 1.0.0 2018/10/21
+ * Version: @(#)pci.h 1.0.1 2019/10/30
*
* Authors: Miran Grca,
* Fred N. van Kempen,
* Sarah Walker,
*
- * Copyright 2016-2018 Miran Grca.
- * Copyright 2017,2018 Fred N. van Kempen.
- * Copyright 2008-2018 Sarah Walker.
+ * Copyright 2016-2019 Miran Grca.
+ * Copyright 2017-2019 Fred N. van Kempen.
+ * Copyright 2008-2019 Sarah Walker.
*/
#ifndef EMU_PCI_H
# define EMU_PCI_H
@@ -76,9 +76,9 @@ extern uint8_t pci_use_mirq(uint8_t mirq);
extern int pci_irq_is_level(int irq);
-extern void pci_set_mirq(uint8_t mirq);
+extern void pci_set_mirq(uint8_t mirq, int level);
extern void pci_set_irq(uint8_t card, uint8_t pci_int);
-extern void pci_clear_mirq(uint8_t mirq);
+extern void pci_clear_mirq(uint8_t mirq, int level);
extern void pci_clear_irq(uint8_t card, uint8_t pci_int);
extern void pci_reset(void);