diff --git a/src/fdc37c665.c b/src/fdc37c665.c index 62d8b0e28..15a181ec9 100644 --- a/src/fdc37c665.c +++ b/src/fdc37c665.c @@ -278,7 +278,7 @@ void fdc37c665_reset(void) memset(fdc37c665_lock, 0, 2); memset(fdc37c665_regs, 0, 16); - fdc37c665_regs[0x0] = 0x3b; + fdc37c665_regs[0x0] = 0x3a; fdc37c665_regs[0x1] = 0x9f; fdc37c665_regs[0x2] = 0xdc; fdc37c665_regs[0x3] = 0x78; diff --git a/src/fdc37c932fr.c b/src/fdc37c932fr.c index f85fff22f..8aeee18ff 100644 --- a/src/fdc37c932fr.c +++ b/src/fdc37c932fr.c @@ -199,8 +199,6 @@ void fdc37c932fr_write(uint16_t port, uint8_t val, void *priv) valxor = val ^ fdc37c932fr_ld_regs[fdc37c932fr_regs[7]][fdc37c932fr_curreg]; if (((fdc37c932fr_curreg & 0xF0) == 0x70) && (fdc37c932fr_regs[7] < 4)) return; /* Block writes to IDE configuration. */ - if (fdc37c932fr_regs[7] == 1) return; - if (fdc37c932fr_regs[7] == 2) return; if (fdc37c932fr_regs[7] > 5) return; fdc37c932fr_ld_regs[fdc37c932fr_regs[7]][fdc37c932fr_curreg] = val; goto process_value; @@ -419,7 +417,7 @@ void fdc37c932fr_reset(void) fdc37c932fr_ld_regs[0][0xF2] = 0xFF; /* Logical device 1: IDE1 */ - fdc37c932fr_ld_regs[1][0x30] = 1; + fdc37c932fr_ld_regs[1][0x30] = 0; fdc37c932fr_ld_regs[1][0x60] = 1; fdc37c932fr_ld_regs[1][0x61] = 0xF0; fdc37c932fr_ld_regs[1][0x62] = 3; @@ -428,7 +426,7 @@ void fdc37c932fr_reset(void) fdc37c932fr_ld_regs[1][0xF0] = 0xC; /* Logical device 2: IDE2 */ - fdc37c932fr_ld_regs[2][0x30] = 1; + fdc37c932fr_ld_regs[2][0x30] = 0; fdc37c932fr_ld_regs[2][0x60] = 1; fdc37c932fr_ld_regs[2][0x61] = 0x70; fdc37c932fr_ld_regs[2][0x62] = 3; diff --git a/src/hdd/hdd_ide_at.c b/src/hdd/hdd_ide_at.c index 0ee4ff513..a93ac3aa2 100644 --- a/src/hdd/hdd_ide_at.c +++ b/src/hdd/hdd_ide_at.c @@ -160,6 +160,8 @@ int ide_irq[5] = { 14, 15, 10, 11, 0 }; void ide_irq_raise(IDE *ide) { + /* pclog("Attempting to raise IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); */ + if ((ide->board > 3) || ide->irqstat) { ide->irqstat=1; @@ -172,9 +174,9 @@ void ide_irq_raise(IDE *ide) if (!(ide->fdisk&2)) { - if (PCI && (ide->board < 2) && ide_bus_master_set_irq) + if (pci_use_mirq(0) && (ide->board < 2)) { - pci_ide_set_irq(ide->board, ide_irq[ide->board]); + pci_set_mirq(0, ide->board); } else { @@ -185,7 +187,7 @@ void ide_irq_raise(IDE *ide) { if (ide_bus_master_set_irq) { - ide_bus_master_set_irq(ide->board); + ide_bus_master_set_irq(ide->board | 0x40); } } } @@ -204,14 +206,19 @@ void ide_irq_lower(IDE *ide) ide_log("Lowering IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); - if (PCI && (ide->board < 2) && ide_bus_master_set_irq) + if (pci_use_mirq(0) && (ide->board < 2)) { - pci_ide_clear_irq(ide->board, ide_irq[ide->board]); + pci_clear_mirq(0, ide->board); } else { picintc(1 << ide_irq[ide->board]); } + + if (ide_bus_master_set_irq) + { + ide_bus_master_set_irq(ide->board); + } ide->irqstat=0; } @@ -225,6 +232,8 @@ void ide_irq_update(IDE *ide) return; } + ide_log("Updating IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); + mask = ide_irq[ide->board]; mask &= 7; @@ -233,25 +242,41 @@ void ide_irq_update(IDE *ide) if (ide->irqstat && !pending && !(ide->fdisk & 2)) { - if (PCI && (ide->board < 2) && ide_bus_master_set_irq) + if (pci_use_mirq(0) && (ide->board < 2)) { - pci_ide_set_irq(ide->board, ide_irq[ide->board]); + pci_set_mirq(0, ide->board); } else { picint(1 << ide_irq[ide->board]); } + + if (ide->board < 2) + { + if (ide_bus_master_set_irq) + { + ide_bus_master_set_irq(ide->board | 0x40); + } + } } else if (pending) { - if (PCI && (ide->board < 2) && ide_bus_master_set_irq) + if (pci_use_mirq(0) && (ide->board < 2)) { - pci_ide_clear_irq(ide->board, ide_irq[ide->board]); + pci_clear_mirq(0, ide->board); } else { picintc(1 << ide_irq[ide->board]); } + + if (ide->board < 2) + { + if (ide_bus_master_set_irq) + { + ide_bus_master_set_irq(ide->board); + } + } } } /** @@ -1410,7 +1435,7 @@ uint8_t readide(int ide_board, uint16_t addr) ide_irq_lower(ide); if (ide->type == IDE_NONE) { - return 0; + temp = 0; } if (ide_drive_is_cdrom(ide)) { @@ -1425,7 +1450,7 @@ uint8_t readide(int ide_board, uint16_t addr) case 0x3F6: /* Alternate Status */ if (ide->type == IDE_NONE) { - return 0; + temp = 0; } if (ide_drive_is_cdrom(ide)) { @@ -1438,7 +1463,8 @@ uint8_t readide(int ide_board, uint16_t addr) break; default: - return 0xff; + temp = 0xff; + break; } /* if (ide_board) */ ide_log("Read IDEb %04X %02X %02X %02X %i %04X:%04X %i\n", addr, temp, ide->atastat,(ide->atastat & ~DSC_STAT) | (ide->service ? SERVICE_STAT : 0),cur_ide[ide_board],CS,cpu_state.pc,ide_board); return temp; diff --git a/src/keyboard_at.c b/src/keyboard_at.c index 99727bcc9..97f77d17f 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -96,6 +96,8 @@ static int key_queue_start = 0, key_queue_end = 0; static uint8_t mouse_queue[16]; int mouse_queue_start = 0, mouse_queue_end = 0; +static uint8_t mouse_enabled; + int first_write = 1; int dtrans = 0; @@ -151,7 +153,7 @@ static void keyboard_at_poll(void) keyboard_at.wantirq = 0; if (keyboard_at.out_new & 0x100) { - if (keyboard_at.mem[0] & 0x02) + if ((keyboard_at.mem[0] & 0x02) && mouse_enabled) picint(0x1000); keyboard_at.out = keyboard_at.out_new & 0xff; keyboard_at.out_new = -1; @@ -731,6 +733,12 @@ bad_command: } } +void keyboard_at_mouse_set_enabled(uint8_t enabled) +{ + /* pclog("Keyboard AT mouse: %i\n", enabled); */ + mouse_enabled = enabled; +} + uint8_t keyboard_at_read(uint16_t port, void *priv) { uint8_t temp = 0xff; @@ -743,7 +751,10 @@ uint8_t keyboard_at_read(uint16_t port, void *priv) { /* The PIIX/PIIX3 datasheet mandates that both of these interrupts are cleared on any read of port 0x60. */ picintc(1 << 1); - picintc(1 << 12); + if (mouse_enabled) + { + picintc(1 << 12); + } } else { diff --git a/src/keyboard_at.h b/src/keyboard_at.h index c8d9c7a15..2550b3f8c 100644 --- a/src/keyboard_at.h +++ b/src/keyboard_at.h @@ -27,3 +27,4 @@ extern void keyboard_at_reset(void); extern void keyboard_at_adddata_keyboard_raw(uint8_t val); extern void keyboard_at_adddata_mouse(uint8_t val); extern void keyboard_at_set_mouse(void (*mouse_write)(uint8_t val, void *p), void *p); +extern void keyboard_at_mouse_set_enabled(uint8_t enabled); diff --git a/src/machine/machine_at_430fx.c b/src/machine/machine_at_430fx.c index 17cf33c28..1854872bd 100644 --- a/src/machine/machine_at_430fx.c +++ b/src/machine/machine_at_430fx.c @@ -211,7 +211,7 @@ void machine_at_p54tp4xe_init(void) pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SPECIAL, 0, 0, 0, 0); i430fx_init(); - piix_init(7); + piix3_init(7); fdc37c665_init(); device_add(&intel_flash_bxt_device); } diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index ecf507583..ae547fe95 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -239,9 +239,9 @@ nic_interrupt(nic_t *dev, int set) { if (PCI && dev->is_pci) { if (set) - pci_set_irq(dev->card, PCI_INTC); + pci_set_irq(dev->card, PCI_INTA); else - pci_clear_irq(dev->card, PCI_INTC); + pci_clear_irq(dev->card, PCI_INTA); } else { if (set) picint(1<base_irq); @@ -1981,7 +1981,7 @@ nic_init(int board) dev->pci_regs[0x2E] = (PCI_DEVID&0xff); dev->pci_regs[0x2F] = (PCI_DEVID>>8); - dev->pci_regs[0x3D] = PCI_INTC; /* PCI_IPR */ + dev->pci_regs[0x3D] = PCI_INTA; /* PCI_IPR */ /* Enable our address space in PCI. */ dev->pci_bar[0].addr_regs[0] = 0x01; diff --git a/src/pc87306.c b/src/pc87306.c index 6ac7ffb54..83f141c01 100644 --- a/src/pc87306.c +++ b/src/pc87306.c @@ -438,7 +438,8 @@ void pc87306_reset(void) { memset(pc87306_regs, 0, 29); - pc87306_regs[0] = 0x4B; + /* pc87306_regs[0] = 0x4B; */ + pc87306_regs[0] = 0x0B; pc87306_regs[1] = 0x01; pc87306_regs[3] = 0x01; pc87306_regs[5] = 0x0D; diff --git a/src/pci.c b/src/pci.c index 7a3b22c87..ed169df95 100644 --- a/src/pci.c +++ b/src/pci.c @@ -33,6 +33,14 @@ static uint8_t elcr[2] = { 0, 0 }; static uint8_t pci_irqs[4]; +typedef struct +{ + uint8_t enabled; + uint8_t irq_line; +} pci_mirq_t; + +static pci_mirq_t pci_mirqs[2]; + static int pci_index, pci_func, pci_card, pci_bus, pci_enable, pci_key; int pci_burst_time, pci_nonburst_time; @@ -220,6 +228,16 @@ void pci_set_irq_routing(int pci_int, int irq) pci_irqs[pci_int - 1] = irq; } +void pci_enable_mirq(int mirq) +{ + pci_mirqs[mirq].enabled = 1; +} + +void pci_set_mirq_routing(int mirq, int irq) +{ + pci_mirqs[mirq].irq_line = irq; +} + static int pci_irq_is_level(int irq) { int real_irq = irq & 7; @@ -234,7 +252,7 @@ static int pci_irq_is_level(int irq) } } -void pci_issue_irq(int irq) +static void pci_issue_irq(int irq) { /* pci_log("Issuing PCI IRQ %i: ", irq); */ if (pci_irq_is_level(irq)) @@ -249,24 +267,85 @@ void pci_issue_irq(int irq) } } -void pci_ide_set_irq(int ide_board, int irq) +uint8_t pci_use_mirq(uint8_t mirq) { - if (pci_irq_is_level(irq) && (pci_irq_hold[irq] & (1LL << (0x20LL + ide_board)))) + if (!PCI || !pci_mirqs[0].enabled) { - /* IRQ already held, do nothing. */ + return 0; + } + + if (pci_mirqs[mirq].irq_line & 0x80) + { + return 0; + } + + return 1; +} + +#define pci_mirq_log pci_log + +void pci_set_mirq(uint8_t mirq, uint8_t channel) +{ + uint8_t irq_line = 0; + uint8_t level = 0; + + if (channel > 1) + { + pci_mirq_log("pci_set_mirq(%02X, %02X): Invalid MIRQ\n", mirq, channel); return; } - if (!pci_irq_is_level(irq) || !pci_irq_hold[irq]) + if (!pci_mirqs[mirq].enabled) { - /* Only raise the interrupt if it's edge-triggered or level-triggered and not yet being held. */ - pci_issue_irq(irq); + pci_mirq_log("pci_set_mirq(%02X, %02X): MIRQ0 disabled\n", mirq, channel); + return; } - /* If the IRQ is level-triggered, mark that this card is holding it. */ - if (pci_irq_is_level(irq)) + if (pci_mirqs[mirq].irq_line > 0x0F) { - pci_irq_hold[irq] |= (1LL << (0x20LL + ide_board)); + pci_mirq_log("pci_set_mirq(%02X, %02X): IRQ line is disabled\n", mirq, channel); + return; + } + else + { + irq_line = pci_mirqs[mirq].irq_line ^ (channel ^ 1); + pci_mirq_log("pci_set_mirq(%02X, %02X): Using IRQ %i\n", mirq, channel, irq_line); + } + + if (pci_irq_is_level(irq_line) && (pci_irq_hold[irq_line] & (1 << (0x1C + (mirq << 1) + channel)))) + { + /* IRQ already held, do nothing. */ + pci_mirq_log("pci_set_mirq(%02X, %02X): MIRQ is already holding the IRQ\n", mirq, channel); + return; + } + else + { + pci_mirq_log("pci_set_mirq(%02X, %02X): MIRQ not yet holding the IRQ\n", mirq, channel); + } + + level = pci_irq_is_level(irq_line); + + if (!level || !pci_irq_hold[irq_line]) + { + pci_mirq_log("pci_set_mirq(%02X, %02X): Issuing %s-triggered IRQ (%sheld)\n", mirq, channel, 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. */ + pci_issue_irq(irq_line); + } + else if (level && pci_irq_hold[irq_line]) + { + pci_mirq_log("pci_set_mirq(%02X, %02X): IRQ line already being held\n", mirq, channel); + } + + /* If the IRQ is level-triggered, mark that this MIRQ is holding it. */ + if (level) + { + pci_mirq_log("pci_set_mirq(%02X, %02X): Marking that this card is holding the IRQ\n", mirq, channel); + pci_irq_hold[irq_line] |= (1 << (0x1C + (mirq << 1) + channel)); + } + else + { + pci_mirq_log("pci_set_mirq(%02X, %02X): Edge-triggered interrupt, not marking\n", mirq, channel); } } @@ -359,19 +438,64 @@ void pci_set_irq(uint8_t card, uint8_t pci_int) } } -void pci_ide_clear_irq(int ide_board, int irq) +void pci_clear_mirq(uint8_t mirq, uint8_t channel) { - if (pci_irq_is_level(irq)) + uint8_t irq_line = 0; + uint8_t level = 0; + + mirq = 0; + + if (mirq > 1) { - pci_irq_hold[irq] &= ~(1LL << (0x20LL + ide_board)); - if (!pci_irq_hold[irq]) + pci_mirq_log("pci_clear_mirq(%02X %02X): Invalid MIRQ\n", mirq, channel); + return; + } + + if (!pci_mirqs[mirq].enabled) + { + pci_mirq_log("pci_clear_mirq(%02X %02X): MIRQ0 disabled\n", mirq, channel); + return; + } + + if (pci_mirqs[mirq].irq_line > 0x0F) + { + pci_mirq_log("pci_clear_mirq(%02X %02X): IRQ line is disabled\n", mirq, channel); + return; + } + else + { + irq_line = pci_mirqs[mirq].irq_line ^ (channel ^ 1); + pci_mirq_log("pci_clear_mirq(%02X %02X): Using IRQ %i\n", mirq, channel, irq_line); + } + + if (pci_irq_is_level(irq_line) && !(pci_irq_hold[irq_line] & (1 << (0x1C + (mirq << 1) + channel)))) + { + /* IRQ not held, do nothing. */ + pci_mirq_log("pci_clear_mirq(%02X %02X): MIRQ is not holding the IRQ\n", mirq, channel); + return; + } + + level = pci_irq_is_level(irq_line); + + if (level) + { + pci_mirq_log("pci_clear_mirq(%02X %02X): Releasing this MIRQ's hold on the IRQ\n", mirq, channel); + pci_irq_hold[irq_line] &= ~(1 << (0x1C + (mirq << 1) + channel)); + + if (!pci_irq_hold[irq_line]) { - picintc(1 << irq); + pci_mirq_log("pci_clear_mirq(%02X %02X): IRQ no longer held by any card, clearing it\n", mirq, channel); + picintc(1 << irq_line); + } + else + { + pci_mirq_log("pci_clear_mirq(%02X %02X): IRQ is still being held\n", mirq, channel); } } else { - picintc(1 << irq); + pci_mirq_log("pci_clear_mirq(%02X %02X): Clearing edge-triggered interrupt\n", mirq, channel); + picintc(1 << irq_line); } } @@ -592,6 +716,12 @@ void pci_init(int type) pci_irqs[c] = PCI_IRQ_DISABLED; } + for (c = 0; c < 2; c++) + { + pci_mirqs[c].enabled = 0; + pci_mirqs[c].irq_line = PCI_IRQ_DISABLED; + } + pci_reset_handler.pci_master_reset = NULL; pci_reset_handler.pci_set_reset = NULL; pci_reset_handler.super_io_reset = NULL; diff --git a/src/pci.h b/src/pci.h index f5f1b993e..6541ffee1 100644 --- a/src/pci.h +++ b/src/pci.h @@ -1,8 +1,13 @@ void pci_set_irq_routing(int pci_int, int irq); -void pci_ide_set_irq(int ide_board, int irq); +void pci_enable_mirq(int mirq); +void pci_set_mirq_routing(int mirq, int irq); + +uint8_t pci_use_mirq(uint8_t mirq); + +void pci_set_mirq(uint8_t mirq, uint8_t channel); void pci_set_irq(uint8_t card, uint8_t pci_int); -void pci_ide_clear_irq(int ide_board, int irq); +void pci_clear_mirq(uint8_t mirq, uint8_t channel); void pci_clear_irq(uint8_t card, uint8_t pci_int); void pci_reset(void); @@ -23,6 +28,9 @@ uint8_t pci_add_card(uint8_t add_type, uint8_t (*read)(int func, int addr, void #define PCI_INTC 3 #define PCI_INTD 4 +#define PCI_MIRQ0 0 +#define PCI_MIRQ1 1 + #define PCI_IRQ_DISABLED -1 enum diff --git a/src/piix.c b/src/piix.c index 87788110b..7ebb8b6e9 100644 --- a/src/piix.c +++ b/src/piix.c @@ -26,6 +26,7 @@ #include "ibm.h" #include "dma.h" #include "io.h" +#include "keyboard_at.h" #include "mem.h" #include "pci.h" #include "hdd/hdd_ide_at.h" @@ -50,6 +51,8 @@ void piix_write(int func, int addr, uint8_t val, void *priv) if (func == 1) /*IDE*/ { + /* pclog("PIIX IDE write: %02X %02X\n", addr, val); */ + switch (addr) { case 0x04: @@ -148,6 +151,27 @@ void piix_write(int func, int addr, uint8_t val, void *priv) else pci_set_irq_routing(PCI_INTD, val & 0xf); break; + case 0x70: + pclog("Set MIRQ routing: MIRQ0 -> %02X\n", val); + if (val & 0x80) + pci_set_mirq_routing(PCI_MIRQ0, PCI_IRQ_DISABLED); + else + pci_set_mirq_routing(PCI_MIRQ0, val & 0xf); + break; + case 0x71: + if (piix_type == 1) + { + pclog("Set MIRQ routing: MIRQ1 -> %02X\n", val); + if (val & 0x80) + pci_set_mirq_routing(PCI_MIRQ1, PCI_IRQ_DISABLED); + else + pci_set_mirq_routing(PCI_MIRQ1, val & 0xf); + } + else + { + pclog("Set unused MIRQ routing: MIRQ1 -> %02X\n", val); + } + break; } if (addr == 0x4C) { @@ -174,6 +198,14 @@ void piix_write(int func, int addr, uint8_t val, void *priv) dma_alias_set(); } } + else if (addr == 0x4E) + { + if ((val ^ card_piix[addr]) & 0x10) + { + keyboard_at_mouse_set_enabled((val & 0x10) ? 1 : 0); + } + card_piix[addr] = val; + } else if (addr == 0x6A) { if (piix_type == 1) @@ -384,6 +416,7 @@ static void piix_bus_master_next_addr(int channel) void piix_bus_master_write(uint16_t port, uint8_t val, void *priv) { + /* pclog("PIIX Bus master write: %04X %02X\n", port, val); */ int channel = (port & 8) ? 1 : 0; switch (port & 7) { @@ -424,6 +457,7 @@ void piix_bus_master_write(uint16_t port, uint8_t val, void *priv) uint8_t piix_bus_master_read(uint16_t port, void *priv) { + /* pclog("PIIX Bus master read: %04X\n", port); */ int channel = (port & 8) ? 1 : 0; switch (port & 7) { @@ -570,7 +604,9 @@ int piix_bus_master_dma_write(int channel, uint8_t *data, int transfer_length) void piix_bus_master_set_irq(int channel) { - piix_busmaster[channel].status |= 4; + // piix_busmaster[channel].status |= 4; + piix_busmaster[channel & 0x0F].status &= ~4; + piix_busmaster[channel & 0x0F].status |= (channel >> 4); } /* static int reset_reg = 0; @@ -619,7 +655,7 @@ void piix_reset(void) card_piix[0x4e] = 0x03; card_piix[0x60] = card_piix[0x61] = card_piix[0x62] = card_piix[0x63] = 0x80; card_piix[0x69] = 0x02; - card_piix[0x70] = card_piix[0x71] = 0x80; + card_piix[0x70] = card_piix[0x71] = 0xc0; card_piix[0x76] = card_piix[0x77] = 0x0c; card_piix[0x78] = 0x02; card_piix[0x79] = 0x00; card_piix[0xa0] = 0x08; @@ -639,8 +675,11 @@ void piix_reset(void) card_piix_ide[0x0d] = 0x00; card_piix_ide[0x0e] = 0x00; card_piix_ide[0x20] = 0x01; card_piix_ide[0x21] = card_piix_ide[0x22] = card_piix_ide[0x23] = 0x00; /*Bus master interface base address*/ - card_piix_ide[0x40] = card_piix_ide[0x41] = 0x00; - card_piix_ide[0x42] = card_piix_ide[0x43] = 0x00; + card_piix_ide[0x40] = card_piix_ide[0x42] = 0x00; + card_piix_ide[0x41] = card_piix_ide[0x43] = 0x80; + + pci_set_mirq_routing(PCI_MIRQ0, PCI_IRQ_DISABLED); + pci_set_mirq_routing(PCI_MIRQ1, PCI_IRQ_DISABLED); } void piix3_reset(void) @@ -657,7 +696,7 @@ void piix3_reset(void) card_piix[0x4e] = card_piix[0x4f] = 0x03; card_piix[0x60] = card_piix[0x61] = card_piix[0x62] = card_piix[0x63] = 0x80; card_piix[0x69] = 0x02; - card_piix[0x70] = 0x80; + card_piix[0x70] = 0xc0; card_piix[0x76] = card_piix[0x77] = 0x0c; card_piix[0x78] = 0x02; card_piix[0x79] = 0x00; card_piix[0x80] = card_piix[0x82] = 0x00; @@ -678,9 +717,11 @@ void piix3_reset(void) card_piix_ide[0x0d] = 0x00; card_piix_ide[0x0e] = 0x00; card_piix_ide[0x20] = 0x01; card_piix_ide[0x21] = card_piix_ide[0x22] = card_piix_ide[0x23] = 0x00; /*Bus master interface base address*/ - card_piix_ide[0x40] = card_piix_ide[0x41] = 0x00; - card_piix_ide[0x42] = card_piix_ide[0x43] = 0x00; + card_piix_ide[0x40] = card_piix_ide[0x42] = 0x00; + card_piix_ide[0x41] = card_piix_ide[0x43] = 0x80; card_piix_ide[0x44] = 0x00; + + pci_set_mirq_routing(PCI_MIRQ0, PCI_IRQ_DISABLED); } void piix_init(int card) @@ -700,6 +741,9 @@ void piix_init(int card) dma_alias_set(); pci_reset_handler.pci_set_reset = piix_reset; + + pci_enable_mirq(0); + pci_enable_mirq(1); } void piix3_init(int card) @@ -719,4 +763,6 @@ void piix3_init(int card) dma_alias_set(); pci_reset_handler.pci_set_reset = piix3_reset; + + pci_enable_mirq(0); } diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index 4a25d2420..e8a637427 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -552,11 +552,11 @@ BuslogicInterrupt(Buslogic_t *bl, int set) { if (set) { - pci_set_irq(bl->Card, PCI_INTB); + pci_set_irq(bl->Card, PCI_INTA); } else { - pci_clear_irq(bl->Card, PCI_INTB); + pci_clear_irq(bl->Card, PCI_INTA); } } else @@ -713,7 +713,7 @@ BuslogicAutoSCSIRamSetDefaults(Buslogic_t *bl, uint8_t safe) HALR->structured.autoSCSIData.u16FastPermittedMask = 0xffff; HALR->structured.autoSCSIData.u16DisconnectPermittedMask = 0xffff; - HALR->structured.autoSCSIData.uPCIInterruptPin = PCI_INTB; + HALR->structured.autoSCSIData.uPCIInterruptPin = PCI_INTA; HALR->structured.autoSCSIData.fVesaBusSpeedGreaterThan33MHz = 1; HALR->structured.autoSCSIData.uAutoSCSIMaximumLUN = 7; @@ -2702,7 +2702,7 @@ BuslogicPCIRead(int func, int addr, void *p) case 0x3C: return bl->Irq; case 0x3D: - return PCI_INTB; + return PCI_INTA; } return(0);