public void UnregisterAllInterruptSources() { foreach (var source in InterruptSources) { source.NmiInterruptPulse -= (sender, args) => NmiInterruptPending = true; } InterruptSources.Clear(); }
private int AcceptPendingInterrupt() { if (executionContext.IsEiOrDiInstruction) { return(0); } if (NmiInterruptPending) { IsHalted = false; Registers.IFF1 = 0; this.ExecuteCall(NmiServiceRoutine); return(11); } if (!InterruptsEnabled) { return(0); } var activeIntSource = InterruptSources.FirstOrDefault(s => s.IntLineIsActive); if (activeIntSource == null) { return(0); } Registers.IFF1 = 0; Registers.IFF2 = 0; IsHalted = false; switch (InterruptMode) { case 0: var opcode = activeIntSource.ValueOnDataBus.GetValueOrDefault(0xFF); InstructionExecutor.Execute(opcode); return(13); case 1: InstructionExecutor.Execute(RST38h_opcode); return(13); case 2: var pointerAddress = NumberUtils.CreateShort( lowByte: activeIntSource.ValueOnDataBus.GetValueOrDefault(0xFF), highByte: Registers.I); var callAddress = NumberUtils.CreateShort( lowByte: Memory[pointerAddress], highByte: Memory[pointerAddress.Inc()]); this.ExecuteCall(callAddress.ToUShort()); return(19); } return(0); }
public IEnumerable <IZ80InterruptSource> GetRegisteredInterruptSources() { return(InterruptSources.ToArray()); }