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