private void UpdateInterrupts() { for (var i = 0; i < State.Length; ++i) { var externalPin = targetExternalPins[i]; if (!interruptEnable[externalPin]) { continue; } var isEdge = State[i] != previousState[externalPin]; previousState[externalPin] = State[i]; if (isEdge && State[i] == (interruptTriggers[externalPin] == InterruptTrigger.RisingEdge)) { externalInterrupt[externalPin] = true; } //no clear as it must be set manually with InterruptFlagClear } var even = false; var odd = false; for (var i = 0; i < interruptEnable.Length; i += 2) { even |= externalInterrupt[i]; } for (var i = 1; i < interruptEnable.Length; i += 2) { odd |= externalInterrupt[i]; } EvenIRQ.Set(even); OddIRQ.Set(odd); }
private void InnerReset() { registers.Reset(); configurationLocked = false; EvenIRQ.Unset(); OddIRQ.Unset(); for (var i = 0; i < NumberOfExternalInterrupts; ++i) { externalInterrupt[i] = false; interruptEnable[i] = false; interruptTriggers[i] = InterruptTrigger.None; } for (var i = 0; i < targetExternalPins.Length; ++i) { targetExternalPins[i] = 0; } for (var i = 0; i < externalInterruptToPinMapping.Length; ++i) { //both arrays have the same length externalInterruptToPinMapping[i] = i % 4; externalInterruptToPortMapping[i] = 0; } }