示例#1
0
        public override void StepVideo(int scanLine, int cycle, bool showBackground, bool showSprites)
        {
            cpuClock++;
            cpuClock %= 3;

            // using priming variable synchronises IRQ timing and prevents jitter
            if (irqPrimed && cycle == 0)
            {
                TriggerInterruptRequest?.Invoke();
                irqPrimed = false;
            }

            if (!irqCounterEnabled || cpuClock != 0)
            {
                return;
            }

            ushort fixedBits = (ushort)(irqCounter & irqFixedMask);

            ushort counterbits = (ushort)(irqCounter & irqCounterMask);

            if (counterbits == 0)
            {
                irqPrimed = true;
            }

            --counterbits;

            irqCounter = (ushort)(fixedBits | (counterbits & irqCounterMask));
        }
        public override void StepVideo(int scanLine, int cycle, bool showBackground, bool showSprites)
        {
            if (cycle != 332)
                return;

            if (irqReloadPrimed)
            {
                irqCounter = irqReload;
                irqReloadPrimed = false;
            }

            if (scanLine > 239 && scanLine < 261)
                return;

            if (!showBackground && !showSprites)
                return;

            if (irqCounter == 0)
            {
                irqCounter = irqReload;
            }
            else
            {
                --irqCounter;
                if (irqCounter == 0 && irqEnabled)
                    TriggerInterruptRequest?.Invoke();
            }
        }
示例#3
0
        public override void StepVideo(int scanLine, int cycle, bool showBackground, bool showSprites)
        {
            ppuRendering = scanLine >= 0 && scanLine < 240 && (showBackground || showSprites);

            if (cycle != 0)
            {
                return;
            }

            if (ppuRendering)
            {
                if (!inFrame)
                {
                    inFrame    = true;
                    irqCounter = 0;
                    CancelInterruptRequest?.Invoke();
                }
                else
                {
                    ++irqCounter;
                    if (irqCounter == irqLatch)
                    {
                        irqPending = true;
                        if (irqEnabled)
                        {
                            TriggerInterruptRequest?.Invoke();
                        }
                    }
                }
            }
            else
            {
                inFrame = false;
            }
        }
示例#4
0
        public override void StepVideo(int scanLine, int cycle, bool showBackground, bool showSprites)
        {
            cpuClock++;
            cpuClock %= 3;

            if (cpuClock != 0)
            {
                return;
            }

            if (irqCounter < 0x7FFF)
            {
                ++irqCounter;
            }
            else if (irqEnabled)
            {
                if (!irqTriggered)
                {
                    TriggerInterruptRequest?.Invoke();
                    irqTriggered = true;
                }
            }

            if (isNamco129Or163)
            {
                soundChip.Update(1);
            }

            /*
             * int output = soundChip.Output;
             * Debug.WriteLineIf(output != 0, "Sound Output = " + output);
             * WriteAudioSample(output * 0.1f);
             */
        }
示例#5
0
 private void HandleScanLine()
 {
     if (irqCounter == 0)
     {
         irqCounter = irqReload;
     }
     else
     {
         --irqCounter;
         if (irqCounter == 0 && irqEnable)
         {
             TriggerInterruptRequest?.Invoke();
         }
     }
 }
 private void UpdateIrqCounter()
 {
     if (irqCounter == 0xFF)
     {
         irqCounter = irqReloadValue;
         Debug.WriteLine("IRQ counter reloaded to " + irqReloadValue);
         if (!irqTriggered)
         {
             TriggerInterruptRequest?.Invoke();
             irqTriggered = true;
         }
     }
     else
     {
         ++irqCounter;
     }
 }
示例#7
0
        public override void StepVideo(int scanLine, int cycle, bool showBackground, bool showSprites)
        {
            ++cpuClock;
            cpuClock %= 3;

            if (cpuClock != 0)
            {
                return;
            }

            if (irqEnabled)
            {
                ++irqCounter;
                if (irqCounter >= 4096)
                {
                    TriggerInterruptRequest?.Invoke();
                }
            }
        }
示例#8
0
文件: Apu.cs 项目: wensioness/EmuNes
        private void StepFrameCounter()
        {
            if (framePeriod == 4)
            {
                ++frameValue;
                frameValue %= 4;

                StepEnvelope();

                if (frameValue == 1)
                {
                    StepSweep();
                    StepLength();
                }
                else if (frameValue == 3)
                {
                    StepSweep();
                    StepLength();
                    if (frameIrq)
                    {
                        TriggerInterruptRequest?.Invoke();
                    }
                }
            }
            else if (framePeriod == 5)
            {
                ++frameValue;
                frameValue %= 5;

                if (frameValue != 4)
                {
                    StepEnvelope();
                }

                if (frameValue == 0 || frameValue == 2)
                {
                    StepSweep();
                    StepLength();
                }
            }
        }