// Check for interrupts STATIC_INLINE void m68ki_check_interrupts(void) { #if 0 if(CPU_INT_LEVEL > FLAG_INT_MASK) m68ki_exception_interrupt(CPU_INT_LEVEL>>8); #else if (regs.intLevel > regs.intmask) m68ki_exception_interrupt(regs.intLevel); #endif }
/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ void m68k_set_irq(unsigned int intLevel) { #if 0 uint old_level = CPU_INT_LEVEL; CPU_INT_LEVEL = int_level << 8; /* A transition from < 7 to 7 always interrupts (NMI) */ /* Note: Level 7 can also level trigger like a normal IRQ */ if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */ else m68ki_check_interrupts(); /* Level triggered (IRQ) */ #else int oldLevel = regs.intLevel; regs.intLevel = intLevel; // A transition from < 7 to 7 always interrupts (NMI) // Note: Level 7 can also level trigger like a normal IRQ if (oldLevel != 0x07 && regs.intLevel == 0x07) m68ki_exception_interrupt(7); // Edge triggered level 7 (NMI) else m68ki_check_interrupts(); // Level triggered (IRQ) #endif }
/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */ void m68k_set_irq2(unsigned int intLevel) { // pthread_mutex_lock(&executionLock); // printf("m68k_set_irq: Could not get the lock!!!\n"); int oldLevel = regs.intLevel; regs.intLevel = intLevel; // A transition from < 7 to 7 always interrupts (NMI) // Note: Level 7 can also level trigger like a normal IRQ if (oldLevel != 0x07 && regs.intLevel == 0x07) m68ki_exception_interrupt(7); // Edge triggered level 7 (NMI) else m68ki_check_interrupts(); // Level triggered (IRQ) // pthread_mutex_unlock(&executionLock); }