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(); } }
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; } }
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); */ }
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; } }
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(); } } }
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(); } } }