--- np2/io/pic.c 2004/01/13 05:30:58 1.10 +++ np2/io/pic.c 2004/01/29 00:27:29 1.12 @@ -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, 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; @@ -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; @@ -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 @@ -349,8 +287,7 @@ static void IOOUTCALL pic_o02(UINT port, picp = &pic.pi[(port >> 3) & 1]; if (!picp->writeicw) { #if 1 // マスクのセットだけなら nevent_forceexit()をコールしない - if ((CPU_isDI) || (pic.ext_irq) || - ((picp->imr & dat) == picp->imr)) { + if ((CPU_isDI) || ((picp->imr & dat) == picp->imr)) { picp->imr = dat; return; } @@ -413,7 +350,6 @@ void pic_reset(void) { pic.pi[0] = def_master; pic.pi[1] = def_slave; - pic.ext_irq = 0; } void pic_bind(void) {