Diff for /np2/io/pic.c between versions 1.19 and 1.22

version 1.19, 2004/03/30 20:01:30 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 58  void pic_irq(void) { Line 55  void pic_irq(void) {
         slave = 1 << (p->pi[1].icw[2] & 7);          slave = 1 << (p->pi[1].icw[2] & 7);
         dat = mir;          dat = mir;
         if (sir) {          if (sir) {
                 dat |= slave;                  dat |= slave & (~p->pi[0].imr);
         }          }
         if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) {          if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) {
                 dat |= p->pi[0].isr;                  dat |= p->pi[0].isr;
Line 85  void pic_irq(void) { Line 82  void pic_irq(void) {
                         p->pi[0].irr &= ~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;
                           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
   
           PIC             p;
           REG8    mir;
           REG8    sir;
           REG8    num;
           REG8    bit;
           REG8    slave;
   
           // 割込み許可?
           if (!CPU_isEI) {
                   return;
           }
           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;
           }
           mir &= (~p->pi[0].imr);
           if (mir == 0) {
                   return;
           }
           if (!(p->pi[0].ocw3 & PIC_OCW3_SMM)) {
                   mir |= p->pi[0].isr;
           }
           num = p->pi[0].pry;
           bit = 1 << num;
           while(!(mir & bit)) {
                   num = (num + 1) & 7;
                   bit = 1 << num;
           }
           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(!(sir & bit)) {
                           num = (num + 1) & 7;
                           bit = 1 << num;
                   }
                   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));  //                      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);
                 }                  }
Line 95  void pic_irq(void) { Line 159  void pic_irq(void) {
                 if (num == 0) {                  if (num == 0) {
                         nevent_reset(NEVENT_PICMASK);                          nevent_reset(NEVENT_PICMASK);
                 }                  }
 //              TRACEOUT(("hardware-int %.2x", (p->pi[0].icw[1] & 0xf8) | num));  //              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);                  CPU_INTERRUPT((REG8)((p->pi[0].icw[1] & 0xf8) | num), 0);
         }          }
 }  }
   #endif
   
   
 // 簡易モード(SYSTEM TIMERだけ)  // 簡易モード(SYSTEM TIMERだけ)
Line 285  static const IOINP pici00[4] = { Line 350  static const IOINP pici00[4] = {
                                         pic_i00,        pic_i02,        NULL,   NULL};                                          pic_i00,        pic_i02,        NULL,   NULL};
 #endif  #endif
   
 void pic_reset(void) {  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) {

Removed from v.1.19  
changed lines
  Added in v.1.22


RetroPC.NET-CVS <cvs@retropc.net>