예제 #1
0
        public void UnregisterAllInterruptSources()
        {
            foreach (var source in InterruptSources)
            {
                source.NmiInterruptPulse -= (sender, args) => NmiInterruptPending = true;
            }

            InterruptSources.Clear();
        }
예제 #2
0
        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);
        }
예제 #3
0
 public IEnumerable <IZ80InterruptSource> GetRegisteredInterruptSources()
 {
     return(InterruptSources.ToArray());
 }