C64: Raster IRQ is edge triggered, how'd I miss this?

This commit is contained in:
SaxxonPike 2019-07-26 01:40:31 -05:00
parent 92eb569b12
commit ac52d0e5f6
3 changed files with 13 additions and 11 deletions

View File

@ -85,11 +85,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
public void ExecutePhase() public void ExecutePhase()
{ {
_cpu.RDY = ReadRdy();
_irqDelay >>= 1; _irqDelay >>= 1;
_nmiDelay >>= 1; _nmiDelay >>= 1;
_irqDelay |= ReadIrq() ? 0x0 : 0x2; _irqDelay |= ReadIrq() ? 0x0 : 0x2;
_nmiDelay |= ReadNmi() ? 0x0 : 0x2; _nmiDelay |= ReadNmi() ? 0x0 : 0x2;
_cpu.RDY = ReadRdy();
_cpu.IRQ = (_irqDelay & 1) != 0; _cpu.IRQ = (_irqDelay & 1) != 0;
_cpu.NMI |= (_nmiDelay & 3) == 2; _cpu.NMI |= (_nmiDelay & 3) == 2;
_cpu.ExecuteOne(); _cpu.ExecuteOne();

View File

@ -50,6 +50,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
private int _pointerCb; private int _pointerCb;
private int _pointerVm; private int _pointerVm;
private int _rasterInterruptLine; private int _rasterInterruptLine;
private bool _rasterInterruptTriggered;
private int _rasterLine; private int _rasterLine;
private int _rasterX; private int _rasterX;
private bool _rasterXHold; private bool _rasterXHold;

View File

@ -220,6 +220,9 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
_vc = 0; _vc = 0;
_refreshCounter = 0xFF; _refreshCounter = 0xFF;
} }
if (_rasterLine == BadLineDisableRaster)
_badlineEnable = false;
} }
// bg collision clear // bg collision clear
@ -242,17 +245,15 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
_spriteSpriteCollisionClearPending = false; _spriteSpriteCollisionClearPending = false;
} }
// start of rasterline // raster IRQ is edge triggered
if ((_cycle == RasterIrqLineXCycle && _rasterLine > 0) || (_cycle == RasterIrqLine0Cycle && _rasterLine == 0)) if (_rasterInterruptLine != _rasterLine)
{ {
if (_rasterLine == BadLineDisableRaster) _rasterInterruptTriggered = false;
_badlineEnable = false; }
else if (!_rasterInterruptTriggered)
// raster compares are done here {
if (_rasterLine == _rasterInterruptLine) _intRaster = true;
{ _rasterInterruptTriggered = true;
_intRaster = true;
}
} }
// render // render