--- np2/io/pic.c 2003/11/12 20:02:54 1.4 +++ np2/io/pic.c 2003/11/30 11:20:55 1.6 @@ -171,6 +171,7 @@ void pic_irq(void) { nevent_reset(NEVENT_PICMASK); } i286_interrupt((BYTE)((p->pi[0].icw[1] & 0xf8) | irq)); +// TRACEOUT(("hardware-int %.2x", (p->pi[0].icw[1] & 0xf8) | irq)); return; } if ((!p->pi[0].levels) || @@ -211,7 +212,7 @@ void pic_irq(void) { p->pi[0].irr &= ~(1 << sirq); p->pi[0].level[p->pi[0].levels++] = sirq; } -// TRACEOUT(("hardware int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); +// TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); i286_interrupt((BYTE)((p->pi[1].icw[1] & 0xf8) | irq)); } } @@ -337,6 +338,10 @@ static void IOOUTCALL pic_o00(UINT port, } } +#if defined(TRACE) +extern int piccnt; +#endif + static void IOOUTCALL pic_o02(UINT port, BYTE dat) { PICITEM picp; @@ -344,7 +349,22 @@ static void IOOUTCALL pic_o02(UINT port, // TRACEOUT(("pic %x %x", port, dat)); picp = &pic.pi[(port >> 3) & 1]; if (!picp->writeicw) { +#if 1 // マスクのセットだけなら nevent_forceexit()をコールしない + if ((isI286DI) || (pic.ext_irq) || + ((picp->imr & dat) == picp->imr)) { + picp->imr = dat; + return; + } + // リセットされたビットは割り込みある? + if (!(picp->irr & (picp->imr & (~dat)))) { + picp->imr = dat; + return; + } +#endif picp->imr = dat; +#if defined(TRACE) + piccnt++; +#endif } else { picp->icw[picp->writeicw] = dat;