--- np2/io/pic.c 2004/03/19 00:30:01 1.17 +++ np2/io/pic.c 2007/11/03 00:00:20 1.22 @@ -29,19 +29,16 @@ static const _PICITEM def_slave = { // ---- +#if 0 // スレーブがおかしい… void pic_irq(void) { PIC p; - REG8 imr; REG8 mir; - REG8 mis; REG8 sir; - REG8 sis; REG8 dat; REG8 num; REG8 bit; REG8 slave; - REG8 master; // 割込み許可? if (!CPU_isEI) { @@ -49,86 +46,124 @@ void pic_irq(void) { } p = &pic; - // マスター - imr = p->pi[0].imr; - mir = p->pi[0].irr; - mis = p->pi[0].isr; + mir = p->pi[0].irr & (~p->pi[0].imr); + sir = p->pi[1].irr & (~p->pi[1].imr); + if ((mir == 0) && (sir == 0)) { + return; + } + + slave = 1 << (p->pi[1].icw[2] & 7); + dat = mir; + if (sir) { + dat |= slave & (~p->pi[0].imr); + } if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) { - mir &= ~imr; + dat |= p->pi[0].isr; } - else { - mis &= imr; + num = p->pi[0].pry; + bit = 1 << num; + while(!(dat & bit)) { + num = (num + 1) & 7; + bit = 1 << num; } - mir &= ~mis; - slave = p->pi[0].icw[2]; - if (mir) { - dat = mir | mis; - num = p->pi[0].pry; + if (p->pi[0].icw[2] & bit) { // スレーヴ + dat = sir; + if (!(p->pi[1].ocw3 & PIC_OCW3_SMM)) { + dat |= p->pi[1].isr; + } + num = p->pi[1].pry; bit = 1 << num; while(!(dat & bit)) { num = (num + 1) & 7; bit = 1 << num; } - if ((mir & bit) && (!(slave & bit))) { - p->pi[0].isr |= bit; - p->pi[0].irr &= ~bit; - if (num == 0) { - nevent_reset(NEVENT_PICMASK); - } -// TRACEOUT(("hardware-int %.2x", (p->pi[0].icw[1] & 0xf8) | num)); - CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | num), 0); - return; + if (!(p->pi[1].isr & bit)) { + p->pi[0].isr |= slave; + p->pi[0].irr &= ~slave; + p->pi[1].isr |= bit; + p->pi[1].irr &= ~bit; + TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | num)); + CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | num), 0); + } + } + else if (!(p->pi[0].isr & bit)) { // マスター + p->pi[0].isr |= bit; + p->pi[0].irr &= ~bit; + if (num == 0) { + nevent_reset(NEVENT_PICMASK); } + TRACEOUT(("hardware-int %.2x [%.4x:%.4x]", (p->pi[0].icw[1] & 0xf8) | num, CPU_CS, CPU_IP)); + CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | num), 0); } +} +#else +void pic_irq(void) { // ver0.78 - // スレーヴ許可? - dat = slave | mis; - if (!dat) { + PIC p; + REG8 mir; + REG8 sir; + REG8 num; + REG8 bit; + REG8 slave; + + // 割込み許可? + if (!CPU_isEI) { return; } - num = p->pi[0].pry; - bit = 1 << num; - while(!(dat & bit)) { - num = (num + 1) & 7; - bit = 1 << num; + p = &pic; + + sir = p->pi[1].irr & (~p->pi[1].imr); + slave = 1 << (p->pi[1].icw[2] & 7); + mir = p->pi[0].irr; + if (sir) { + mir |= slave; } - if (!(slave & bit)) { + mir &= (~p->pi[0].imr); + if (mir == 0) { return; } - - // スレーヴ - imr = p->pi[1].imr; - sir = p->pi[1].irr; - sis = p->pi[1].isr; - if (!(p->pi[1].ocw3 & PIC_OCW3_SMM)) { - sir &= ~imr; + if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) { + mir |= p->pi[0].isr; } - else { - sis &= imr; + num = p->pi[0].pry; + bit = 1 << num; + while(!(mir & bit)) { + num = (num + 1) & 7; + bit = 1 << num; } - sir &= ~sis; - if (sir) { - dat = sir | sis; + if (p->pi[0].icw[2] & bit) { // スレーヴ + if (sir == 0) { + return; + } + if (!(p->pi[1].ocw3 & PIC_OCW3_SMM)) { + sir |= p->pi[1].isr; + } num = p->pi[1].pry; bit = 1 << num; - while(!(dat & bit)) { + while(!(sir & bit)) { num = (num + 1) & 7; bit = 1 << num; } - if (sir & bit) { + if (!(p->pi[1].isr & bit)) { + p->pi[0].isr |= slave; + p->pi[0].irr &= ~slave; p->pi[1].isr |= bit; p->pi[1].irr &= ~bit; - master = 1 << (p->pi[1].icw[2] & 7); - if (!(p->pi[0].isr & master)) { - p->pi[0].isr |= master; - p->pi[0].irr &= ~master; - } // TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | num)); CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | num), 0); - return; } } + else if (!(p->pi[0].isr & bit)) { // マスター + p->pi[0].isr |= bit; + p->pi[0].irr &= ~bit; + if (num == 0) { + nevent_reset(NEVENT_PICMASK); + } +// TRACEOUT(("hardware-int %.2x [%.4x:%.4x]", (p->pi[0].icw[1] & 0xf8) | num, CPU_CS, CPU_IP)); + CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | num), 0); + } } +#endif // 簡易モード(SYSTEM TIMERだけ) @@ -301,21 +336,36 @@ static REG8 IOINPCALL pic_i02(UINT port) // ---- I/F +#if !defined(SUPPORT_PC9821) static const IOOUT pico00[2] = { pic_o00, pic_o02}; static const IOINP pici00[2] = { pic_i00, pic_i02}; +#else +static const IOOUT pico00[4] = { + pic_o00, pic_o02, NULL, NULL}; -void pic_reset(void) { +static const IOINP pici00[4] = { + pic_i00, pic_i02, NULL, NULL}; +#endif + +void pic_reset(const NP2CFG *pConfig) { pic.pi[0] = def_master; pic.pi[1] = def_slave; + + (void)pConfig; } void pic_bind(void) { +#if !defined(SUPPORT_PC9821) iocore_attachsysoutex(0x0000, 0x0cf1, pico00, 2); iocore_attachsysinpex(0x0000, 0x0cf1, pici00, 2); +#else + iocore_attachsysoutex(0x0000, 0x0cf1, pico00, 4); + iocore_attachsysinpex(0x0000, 0x0cf1, pici00, 4); +#endif }