/// <summary>
        /// Tries to execute the interrupt.
        /// </summary>
        /// <param name="interrupt">The interrupt.</param>
        /// <param name="address">The address.</param>
        /// <returns></returns>
        private bool TryExecuteInterrupt(InterruptFlag interrupt, ushort address)
        {
            if (!_interruptFlag.HasFlag(interrupt) || !_interruptEnableRegister.InterruptEnabled(interrupt))
            {
                // Interrupt flag is not set or enabled.
                return(false);
            }

            // Do interrupt.
            _interruptManager.Interrupt(address);

            // Clear the interrupt flag.
            _interruptFlag &= ~interrupt;
            return(true);
        }
        /// <summary>
        /// Updates the interrupt flags, setting any new interrupt flags in <see cref="interrupts" />.
        /// </summary>
        /// <param name="interrupts">The interrupts.</param>
        public void UpdateInterrupts(InterruptFlag interrupts)
        {
            // Combine with delayed interrupts.
            _interruptFlag |= interrupts;

            if (_interruptFlag == InterruptFlag.None)
            {
                return;
            }

            if (!_interruptManager.InterruptsEnabled)
            {
                // Interrupts disabled.
                return;
            }

            if (TryExecuteInterrupt(InterruptFlag.VerticalBlank, VerticalBlankAddress))
            {
                return;
            }

            if (TryExecuteInterrupt(InterruptFlag.LcdStatusTriggers, LcdStatusTriggersAddress))
            {
                return;
            }

            if (TryExecuteInterrupt(InterruptFlag.TimerOverflow, TimerOverflowAddress))
            {
                return;
            }

            if (TryExecuteInterrupt(InterruptFlag.SerialLink, SerialLinkAddress))
            {
                return;
            }

            TryExecuteInterrupt(InterruptFlag.JoyPadPress, JoyPadPressAddress);
        }
Beispiel #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="InterruptEnableRegister"/> class.
 /// </summary>
 public InterruptEnableRegister()
 {
     _interruptFlag = InterruptFlag.None;
 }
Beispiel #4
0
 /// <summary>
 /// Gets a value indication whether interrupts are enabled for the specific interrupt flag.
 /// </summary>
 /// <param name="flag">The flag.</param>
 /// <returns></returns>
 public bool InterruptEnabled(InterruptFlag flag) => _interruptFlag.HasFlag(flag);
 /// <summary>
 /// Initializes a new instance of the <see cref="InterruptFlagsRegister"/> class.
 /// </summary>
 /// <param name="interruptManager">The interrupt manager.</param>
 /// <param name="interruptEnableRegister">The interrupt enable register.</param>
 public InterruptFlagsRegister(IInterruptManager interruptManager, IInterruptEnableRegister interruptEnableRegister)
 {
     _interruptManager        = interruptManager;
     _interruptEnableRegister = interruptEnableRegister;
     _interruptFlag           = InterruptFlag.None;
 }