--- np2/io/pic.c 2003/11/12 20:02:54 1.4 +++ np2/io/pic.c 2004/01/30 01:29:13 1.14 @@ -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, 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]; @@ -112,7 +64,7 @@ void pic_irq(void) { int i; BYTE bit; - char pry; + SINT8 pry; BYTE irq; BYTE sirq; BYTE targetbit; @@ -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)))) { // マスターの処理 @@ -130,14 +82,14 @@ void pic_irq(void) { pry = -1; } else { - pry = (char)p->pi[0].pry[p->pi[0].level[p->pi[0].levels - 1]]; + pry = (SINT8)p->pi[0].pry[p->pi[0].level[p->pi[0].levels - 1]]; } 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 ((char)p->pi[0].pry[i] > pry) { + if ((SINT8)p->pi[0].pry[i] > pry) { pry = p->pi[0].pry[i]; irq = (BYTE)i; targetbit = bit; @@ -152,7 +104,7 @@ void pic_irq(void) { sirq = p->pi[1].icw[2] & 7; bit = 1 << sirq; if (!((p->pi[0].imr | p->pi[0].isr) & bit)) { - if ((char)p->pi[0].pry[sirq] > pry) { + if ((SINT8)p->pi[0].pry[sirq] > pry) { irq = sirq; targetbit = bit; } @@ -161,16 +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) || @@ -183,13 +133,13 @@ void pic_irq(void) { pry = -1; } else { - pry = (char)p->pi[1].pry[p->pi[1].level[p->pi[1].levels - 1]]; + 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 ((char)p->pi[1].pry[i] > pry) { + if ((SINT8)p->pi[1].pry[i] > pry) { pry = p->pi[1].pry[i]; irq = (BYTE)i; targetbit = bit; @@ -199,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; @@ -211,8 +158,8 @@ 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)); - i286_interrupt((BYTE)((p->pi[1].icw[1] & 0xf8) | irq)); +// TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | irq)); + CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | irq)); } } } @@ -230,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); @@ -244,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); } @@ -266,7 +213,7 @@ void pic_setirq(BYTE irq) { } } -void pic_resetirq(BYTE irq) { +void pic_resetirq(REG8 irq) { PICITEM pi; @@ -275,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]; @@ -337,14 +275,30 @@ static void IOOUTCALL pic_o00(UINT port, } } -static void IOOUTCALL pic_o02(UINT port, BYTE dat) { +#if defined(TRACE) +extern int piccnt; +#endif + +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 + UINT8 set; + set = 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; @@ -356,7 +310,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; @@ -373,7 +327,7 @@ static BYTE IOINPCALL pic_i00(UINT port) } } -static BYTE IOINPCALL pic_i02(UINT port) { +static REG8 IOINPCALL pic_i02(UINT port) { PICITEM picp;