Beispiel #1
0
        public void OnInterruptRequested()
        {
            if (StatusRegister.HasFlag(NESCpuFlags.DisableInterrupts))
            {
                return;
            }

            WriteToDataBus(
                (ushort)(Constants.InterruptStackPointerBase + StackPointer--),
                (byte)((ProgramCounter >> 8) & Constants.Masks.LowByte));
            WriteToDataBus(
                (ushort)(Constants.InterruptStackPointerBase + StackPointer--),
                (byte)(ProgramCounter & Constants.Masks.LowByte));

            SetStatusFlag(NESCpuFlags.Break, false);
            SetStatusFlag(NESCpuFlags.Unused, true);
            SetStatusFlag(NESCpuFlags.DisableInterrupts, true);

            WriteToDataBus(
                (ushort)(Constants.InterruptStackPointerBase + StackPointer--),
                (byte)StatusRegister);

            AbsoluteAddress = Constants.InterruptRequestPCAddress;
            var pcLowBits  = ReadFromDataBus(AbsoluteAddress);
            var pcHighBits = ReadFromDataBus((ushort)(AbsoluteAddress + 1));

            ProgramCounter = (ushort)((pcHighBits << 8) | pcLowBits);

            ClockCyclesRemaining = 7;
        }
Beispiel #2
0
 public bool GetFlag(CpuFlag cpuFlag) => StatusRegister.HasFlag(cpuFlag);