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

version 1.18, 2004/03/30 07:12:03 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;
           REG8    mir;
           REG8    sir;
           REG8    num;
           REG8    bit;
           REG8    slave;
   
         // スレーヴ許可?          // 割込み許可?
         dat = slave | mis;          if (!CPU_isEI) {
         if (!dat) {  
                 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 315  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.18  
changed lines
  Added in v.1.22


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