--- np2/io/pic.c 2004/01/13 05:30:58 1.10 +++ np2/io/pic.c 2004/03/10 23:01:08 1.16 @@ -6,7 +6,6 @@ static const _PICITEM def_master = { 0, {0, 0, 0, 0, 0, 0, 0, 0}, - 0, {0, 0, 0, 0, 0, 0, 0, 0}, {7, 6, 5, 4, 3, 2, 1, 0}, {0, 0x08, 0x00, 0}, 0x7d, 0, 0, 0, @@ -14,60 +13,13 @@ static const _PICITEM def_master = { static const _PICITEM def_slave = { 0, {0, 0, 0, 0, 0, 0, 0, 0}, - 0, {0, 0, 0, 0, 0, 0, 0, 0}, {7, 6, 5, 4, 3, 2, 1, 0}, {0, 0x10, 0x07, 0}, - 0x70, 0, 0, 0, + 0x71, 0, 0, 0, 0, 0, 0, 0}; -// ------------------------------------------------------------ ext. interrupt - -// 外部でISRを待避する割り込み対策 - -void extirq_push(void) { - - PIC p; - - p = &pic; - if (!p->ext_irq) { - p->ext_irq = 1; - - p->pi[0].levelsbak = p->pi[0].levels; - *(UINT32 *)(p->pi[0].levelbak+0) = *(UINT32 *)(p->pi[0].level+0); - *(UINT32 *)(p->pi[0].levelbak+4) = *(UINT32 *)(p->pi[0].level+4); - p->pi[0].isrbak = p->pi[0].isr; - - p->pi[1].levelsbak = p->pi[1].levels; - *(UINT32 *)(p->pi[1].levelbak+0) = *(UINT32 *)(p->pi[1].level+0); - *(UINT32 *)(p->pi[1].levelbak+4) = *(UINT32 *)(p->pi[1].level+4); - p->pi[1].isrbak = p->pi[1].isr; - } -} - - -void extirq_pop(void) { - - PIC p; - - p = &pic; - if (p->ext_irq) { - p->ext_irq = 0; - - p->pi[0].levels = p->pi[0].levelsbak; - *(UINT32 *)(p->pi[0].level+0) = *(UINT32 *)(p->pi[0].levelbak+0); - *(UINT32 *)(p->pi[0].level+4) = *(UINT32 *)(p->pi[0].levelbak+4); - p->pi[0].isr = p->pi[0].isrbak; - - p->pi[1].levels = p->pi[1].levelsbak; - *(UINT32 *)(p->pi[1].level+0) = *(UINT32 *)(p->pi[1].levelbak+0); - *(UINT32 *)(p->pi[1].level+4) = *(UINT32 *)(p->pi[1].levelbak+4); - p->pi[1].isr = p->pi[1].isrbak; - } -} - - -// --------------------------- +// ---- static void pic_rolpry(PICITEM pi) { @@ -121,8 +73,8 @@ void pic_irq(void) { p = &pic; // 割込み許可で 要求あり? - if ((CPU_isEI) && (!p->ext_irq) && - ((p->pi[0].irr & (~p->pi[0].imr)) || + if ((CPU_isEI) && + ((p->pi[0].irr & (~p->pi[0].imr)) || (p->pi[1].irr & (~p->pi[1].imr)))) { // マスターの処理 @@ -161,9 +113,6 @@ void pic_irq(void) { // マスタの割込 if (irq != sirq) { if (targetbit) { - if (p->pi[0].ext & targetbit) { // ver0.30 - extirq_push(); - } p->pi[0].isr |= targetbit; p->pi[0].irr &= ~targetbit; p->pi[0].level[p->pi[0].levels++] = irq; @@ -171,7 +120,7 @@ void pic_irq(void) { nevent_reset(NEVENT_PICMASK); } // TRACEOUT(("hardware-int %.2x", (p->pi[0].icw[1] & 0xf8) | irq)); - CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | irq)); + CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | irq), 0); return; } if ((!p->pi[0].levels) || @@ -200,9 +149,6 @@ void pic_irq(void) { // スレーヴの割込 if (targetbit) { if (!(p->pi[0].icw[2] & targetbit)) { - if (p->pi[1].ext & targetbit) { // ver0.30 - extirq_push(); - } p->pi[1].isr |= targetbit; p->pi[1].irr &= ~targetbit; p->pi[1].level[p->pi[1].levels++] = irq; @@ -213,7 +159,7 @@ void pic_irq(void) { p->pi[0].level[p->pi[0].levels++] = sirq; } // TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); - CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | irq)); + CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | irq), 0); } } } @@ -275,14 +221,6 @@ void pic_resetirq(REG8 irq) { pi->irr &= ~(1 << (irq & 7)); } -void pic_registext(REG8 irq) { - - PICITEM pi; - - pi = pic.pi + ((irq >> 3) & 1); - pi->ext |= (1 << (irq & 7)); -} - // ---- I/O @@ -337,10 +275,6 @@ static void IOOUTCALL pic_o00(UINT port, } } -#if defined(TRACE) -extern int piccnt; -#endif - static void IOOUTCALL pic_o02(UINT port, REG8 dat) { PICITEM picp; @@ -348,22 +282,16 @@ 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 ((CPU_isDI) || (pic.ext_irq) || - ((picp->imr & dat) == picp->imr)) { - picp->imr = dat; - return; - } +#if 1 + UINT8 set; + set = picp->imr & (~dat); // リセットされたビットは割り込みある? - if (!(picp->irr & (picp->imr & (~dat)))) { + if ((CPU_isDI) || (!(picp->irr & set))) { picp->imr = dat; return; } #endif picp->imr = dat; -#if defined(TRACE) - piccnt++; -#endif } else { picp->icw[picp->writeicw] = dat; @@ -413,7 +341,6 @@ void pic_reset(void) { pic.pi[0] = def_master; pic.pi[1] = def_slave; - pic.ext_irq = 0; } void pic_bind(void) {