--- np2/io/pic.c 2003/11/30 12:32:04 1.7 +++ np2/io/pic.c 2004/03/05 04:39:59 1.15 @@ -1,12 +1,11 @@ #include "compiler.h" -#include "i286.h" +#include "cpucore.h" #include "pccore.h" #include "iocore.h" 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) { @@ -79,7 +31,7 @@ static void pic_rolpry(PICITEM pi) { } -static void pic_downbylevel(PICITEM picp, BYTE level) { +static void pic_downbylevel(PICITEM picp, UINT level) { int i; @@ -93,13 +45,13 @@ static void pic_downbylevel(PICITEM picp // eoi処理 -static void pic_forceeoibylevel(PICITEM picp, BYTE level) { +static void pic_forceeoibylevel(PICITEM picp, UINT level) { int i; if (picp->isr & (1 << level)) { picp->isr &= ~(1 << level); - (picp->levels)--; + picp->levels--; for (i=0; (ilevels) && (picp->level[i] != level); i++) { } for (; ilevels; i++) { picp->level[i] = picp->level[i+1]; @@ -121,8 +73,8 @@ void pic_irq(void) { p = &pic; // 割込み許可で 要求あり? - if ((isI286EI) && (!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)))) { // マスターの処理 @@ -134,7 +86,7 @@ void pic_irq(void) { } irq = 0xff; targetbit = 0; - for (bit=1, i=0; bit; bit<<=1, i++) { + for (bit=1, i=0; i<8; bit<<=1, i++) { if ((p->pi[0].irr & bit) && (!((p->pi[0].imr | p->pi[0].isr) & bit))) { if ((SINT8)p->pi[0].pry[i] > pry) { @@ -161,17 +113,14 @@ 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; if (irq == 0) { // ver0.28 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)); + CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | irq)); return; } if ((!p->pi[0].levels) || @@ -187,7 +136,7 @@ void pic_irq(void) { pry = (SINT8)p->pi[1].pry[p->pi[1].level[p->pi[1].levels - 1]]; } targetbit = 0; - for (bit=1, i=0; bit; bit<<=1, i++) { + for (bit=1, i=0; i<8; bit<<=1, i++) { if ((p->pi[1].irr & bit) && (!((p->pi[1].imr | p->pi[1].isr) & bit))) { if ((SINT8)p->pi[1].pry[i] > pry) { @@ -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)); - i286_interrupt((BYTE)((p->pi[1].icw[1] & 0xf8) | irq)); + CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | irq)); } } } @@ -231,10 +177,10 @@ void picmask(NEVENTITEM item) { } } -void pic_setirq(BYTE irq) { +void pic_setirq(REG8 irq) { PICITEM pi; - BYTE bit; + REG8 bit; pi = pic.pi; bit = 1 << (irq & 7); @@ -245,11 +191,11 @@ void pic_setirq(BYTE irq) { if ((pit.mode[0] & 0x0c) == 0x04) { SINT32 cnt; // ver0.29 if (pit.value[0] > 8) { - cnt = pc.multiple * pit.value[0]; + cnt = pccore.multiple * pit.value[0]; cnt >>= 2; } else { - cnt = pc.multiple << (16 - 2); + cnt = pccore.multiple << (16 - 2); } nevent_set(NEVENT_PICMASK, cnt, picmask, NEVENT_ABSOLUTE); } @@ -267,7 +213,7 @@ void pic_setirq(BYTE irq) { } } -void pic_resetirq(BYTE irq) { +void pic_resetirq(REG8 irq) { PICITEM pi; @@ -276,21 +222,12 @@ void pic_resetirq(BYTE irq) { } -void pic_registext(BYTE irq) { - - PICITEM pi; - - pi = pic.pi + ((irq >> 3) & 1); - pi->ext |= (1 << (irq & 7)); -} - - // ---- I/O -static void IOOUTCALL pic_o00(UINT port, BYTE dat) { +static void IOOUTCALL pic_o00(UINT port, REG8 dat) { PICITEM picp; - BYTE level; + UINT level; // TRACEOUT(("pic %x %x", port, dat)); picp = &pic.pi[(port >> 3) & 1]; @@ -338,33 +275,23 @@ static void IOOUTCALL pic_o00(UINT port, } } -#if defined(TRACE) -extern int piccnt; -#endif - -static void IOOUTCALL pic_o02(UINT port, BYTE dat) { +static void IOOUTCALL pic_o02(UINT port, REG8 dat) { PICITEM picp; // 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 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; @@ -376,7 +303,7 @@ static void IOOUTCALL pic_o02(UINT port, nevent_forceexit(); } -static BYTE IOINPCALL pic_i00(UINT port) { +static REG8 IOINPCALL pic_i00(UINT port) { PICITEM picp; @@ -393,7 +320,7 @@ static BYTE IOINPCALL pic_i00(UINT port) } } -static BYTE IOINPCALL pic_i02(UINT port) { +static REG8 IOINPCALL pic_i02(UINT port) { PICITEM picp;