|
|
| version 1.18, 2004/03/30 07:12:03 | version 1.19, 2004/03/30 20:01:30 |
|---|---|
| Line 49 void pic_irq(void) { | Line 49 void pic_irq(void) { |
| } | } |
| p = &pic; | p = &pic; |
| // マスター | mir = p->pi[0].irr & (~p->pi[0].imr); |
| imr = p->pi[0].imr; | sir = p->pi[1].irr & (~p->pi[1].imr); |
| mir = p->pi[0].irr; | if ((mir == 0) && (sir == 0)) { |
| mis = p->pi[0].isr; | return; |
| if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) { | |
| mir &= ~imr; | |
| } | |
| else { | |
| mis &= imr; | |
| } | |
| mir &= ~mis; | |
| slave = p->pi[0].icw[2]; | |
| if (mir) { | |
| dat = mir | mis; | |
| num = p->pi[0].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; | |
| } | |
| } | } |
| // スレーヴ許可? | slave = 1 << (p->pi[1].icw[2] & 7); |
| dat = slave | mis; | dat = mir; |
| if (!dat) { | if (sir) { |
| return; | dat |= slave; |
| } | |
| if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) { | |
| dat |= p->pi[0].isr; | |
| } | } |
| num = p->pi[0].pry; | num = p->pi[0].pry; |
| bit = 1 << num; | bit = 1 << num; |
| Line 92 void pic_irq(void) { | Line 69 void pic_irq(void) { |
| num = (num + 1) & 7; | num = (num + 1) & 7; |
| bit = 1 << num; | bit = 1 << num; |
| } | } |
| if (!(slave & bit)) { | if (p->pi[0].icw[2] & bit) { // スレーヴ |
| return; | dat = sir; |
| } | if (!(p->pi[1].ocw3 & PIC_OCW3_SMM)) { |
| dat |= p->pi[1].isr; | |
| // スレーヴ | } |
| 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; | |
| } | |
| else { | |
| sis &= imr; | |
| } | |
| sir &= ~sis; | |
| if (sir) { | |
| dat = sir | sis; | |
| num = p->pi[1].pry; | num = p->pi[1].pry; |
| bit = 1 << num; | bit = 1 << num; |
| while(!(dat & bit)) { | while(!(dat & bit)) { |
| num = (num + 1) & 7; | num = (num + 1) & 7; |
| bit = 1 << num; | 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].isr |= bit; |
| p->pi[1].irr &= ~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)); | // TRACEOUT(("hardware-int %.2x", (p->pi[1].icw[1] & 0xf8) | num)); |
| CPU_INTERRUPT((REG8)((p->pi[1].icw[1] & 0xf8) | num), 0); | 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", (p->pi[0].icw[1] & 0xf8) | num)); | |
| CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | num), 0); | |
| } | |
| } | } |