From 3efea1503892470f1157a5b7976e62757058c429 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 05:24:47 -0500 Subject: [PATCH 01/11] 6502X: When !RDY is asserted, still do other operations. Plus, do dummy reads on stack ops --- .../CPUs/MOS 6502X/Execute.cs | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs index 8efa5c3fb0..db65556c49 100644 --- a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs @@ -928,19 +928,19 @@ namespace BizHawk.Emulation.Cores.Components.M6502 } void IndIdx_READ_Stage5() { - rdy_freeze = !RDY; - if (RDY) + if (!alu_temp.Bit(8)) { - if (!alu_temp.Bit(8)) + mi++; + ExecuteOneRetry(); + return; + } + else + { + rdy_freeze = !RDY; + if (RDY) { - mi++; - ExecuteOneRetry(); - return; - } - else - { - _link.ReadMemory((ushort)ea); - ea = (ushort)(ea + 0x100); + _link.ReadMemory((ushort) ea); + ea = (ushort) (ea + 0x100); } } } @@ -1196,13 +1196,17 @@ namespace BizHawk.Emulation.Cores.Components.M6502 void NOP() { rdy_freeze = !RDY; + if (RDY) + { + FetchDummy(); + } } void DecS() { rdy_freeze = !RDY; if (RDY) { - S--; + _link.DummyReadMemory((ushort) (0x100 | --S)); } } void IncS() @@ -1210,7 +1214,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 rdy_freeze = !RDY; if (RDY) { - S++; + _link.DummyReadMemory((ushort) (0x100 | S++)); } } void JSR() @@ -2256,19 +2260,18 @@ namespace BizHawk.Emulation.Cores.Components.M6502 } void AbsIdx_READ_Stage4() { - rdy_freeze = !RDY; - if (RDY) + if (!alu_temp.Bit(8)) { - if (!alu_temp.Bit(8)) + mi++; + ExecuteOneRetry(); + } + else + { + rdy_freeze = !RDY; + if (RDY) { - mi++; - ExecuteOneRetry(); - return; - } - else - { - alu_temp = _link.ReadMemory((ushort)ea); - ea = (ushort)(ea + 0x100); + alu_temp = _link.ReadMemory((ushort) ea); + ea = (ushort) (ea + 0x100); } } From 9f733d3e7a3650a10a13091d6c3ba654354a6db7 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 05:26:26 -0500 Subject: [PATCH 02/11] VIC: More accurate pixel pipeline --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 113 +++++++++++++- .../Computers/Commodore64/MOS/Vic.Render.cs | 141 +++--------------- .../Computers/Commodore64/MOS/Vic.State.cs | 14 +- .../Computers/Commodore64/MOS/Vic.cs | 5 - 4 files changed, 131 insertions(+), 142 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index 7e33d1eae8..c2aa36b04b 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -42,6 +42,10 @@ private int _parseBa; private int _parseAct; private bool _parseIsSprCrunch; + private int _parsePixelData; + private int _parsePixelDataIndex; + private int _parseSrData0; + private int _parseSrData1; private void ParseCycle() { @@ -80,8 +84,6 @@ _dataC = 0; _bufferC[_vmli] = _dataC; } - - _srColorSync |= 0x01 << (7 - _xScroll); break; case FetchTypeGraphics: // fetch G @@ -96,14 +98,114 @@ if (_extraColorModeBuffer) _parseAddr &= AddressMaskEc; _dataG = ReadMemory(_parseAddr); - _sr |= _dataG << (7 - _xScroll); - _srSync |= 0xAA << (7 - _xScroll); + if (!_idle) { - _bufferG[_vmli] = _dataG; _vmli = (_vmli + 1) & 0x3F; _vc = (_vc + 1) & 0x3FF; } + + // graphics data shift register + _srData1 &= ~(0xFF << (7 - _xScroll)); + _srActive |= 0xFF << (7 - _xScroll); + + if (_multicolorMode && (_bitmapMode || (_dataC & 0x800) != 0)) + { + _parseSrData0 = (_dataG & 0x55) | ((_dataG & 0x55) << 1); + _parseSrData1 = (_dataG & 0xAA) | ((_dataG & 0xAA) >> 1); + } + else + { + _parseSrData0 = _bitmapMode ? 0 : _dataG; + _parseSrData1 = _dataG; + } + _srData1 |= _parseSrData1 << (7 - _xScroll); + + // graphics color shift register + _srColor0 &= ~(0xFF << (7 - _xScroll)); + _srColor1 &= ~(0xFF << (7 - _xScroll)); + _srColor2 &= ~(0xFF << (7 - _xScroll)); + _srColor3 &= ~(0xFF << (7 - _xScroll)); + for (_parsePixelDataIndex = 7; _parsePixelDataIndex >= 0; _parsePixelDataIndex--) + { + _parsePixelData = ((_parseSrData0 & 0x80) >> 7) | ((_parseSrData1 & 0x80) >> 6); + switch (_videoMode) + { + case VideoMode000: + case VideoMode001: + switch (_parsePixelData) + { + case 0: + _pixel = _backgroundColor0; + break; + case 1: + _pixel = _idle ? 0 : _backgroundColor1; + break; + case 2: + _pixel = _idle ? 0 :_backgroundColor2; + break; + default: + _pixel = _idle ? 0 : (_multicolorMode ? _dataC & 0x700 : _dataC) >> 8; + break; + } + break; + case VideoMode010: + case VideoMode011: + switch (_parsePixelData) + { + case 0: + _pixel = _backgroundColor0; + break; + case 1: + _pixel = _idle ? 0 : _dataC >> 4; + break; + case 2: + _pixel = _idle ? 0 : _dataC; + break; + default: + _pixel = _idle ? 0 : _dataC >> 8; + break; + } + break; + case VideoMode100: + if (_parsePixelData != 0) + { + _pixel = _idle ? 0 : _dataC >> 8; + } + else + { + _pixel = (_dataC & 0xC0) >> 6; + switch (_pixel) + { + case 0: + _pixel = _backgroundColor0; + break; + case 1: + _pixel = _idle ? 0 : _backgroundColor1; + break; + case 2: + _pixel = _idle ? 0 : _backgroundColor2; + break; + default: + _pixel = _idle ? 0 : _backgroundColor3; + break; + } + } + break; + default: + _parsePixelData = 0; + _pixel = 0; + break; + } + + _parseSrData0 <<= 1; + _parseSrData1 <<= 1; + _srColor0 |= (_pixel & 1) << (7 - _xScroll + _parsePixelDataIndex); + _srColor1 |= ((_pixel >> 1) & 1) << (7 - _xScroll + _parsePixelDataIndex); + _srColor2 |= ((_pixel >> 2) & 1) << (7 - _xScroll + _parsePixelDataIndex); + _srColor3 |= ((_pixel >> 3) & 1) << (7 - _xScroll + _parsePixelDataIndex); + } + break; case FetchTypeNone: // fetch none @@ -221,7 +323,6 @@ if ((_parseAct & PipelineUpdateVc) != 0) // VC/RC rule 2 { _vc = _vcbase; - _srColorIndexLatch = 0; _vmli = 0; if (_badline) { diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs index 8636bf799d..b1f2b12b38 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs @@ -4,18 +4,19 @@ { private int _borderPixel; private int _bufferPixel; - private int _ecmPixel; private int _pixel; private int _pixelCounter; - private int _pixelData; private int _pixelOwner; private Sprite _spr; private int _sprData; private int _sprIndex; private int _sprPixel; - private int _srSync; - private int _srColorSync; - private int _srColorIndexLatch; + private int _srColor0; + private int _srColor1; + private int _srColor2; + private int _srColor3; + private int _srData1; + private int _srActive; private int _videoMode; private int _borderOnShiftReg; @@ -26,10 +27,7 @@ private const int VideoMode100 = 4; private const int VideoModeInvalid = -1; - private const int SrMask1 = 0x20000; - private const int SrMask2 = SrMask1 << 1; - private const int SrMask3 = SrMask1 | SrMask2; - private const int SrColorMask = 0x8000; + private const int SrMask1 = 0x40000; private const int SrSpriteMask = SrSpriteMask2; private const int SrSpriteMask1 = 0x400000; private const int SrSpriteMask2 = SrSpriteMask1 << 1; @@ -47,13 +45,6 @@ _pixelCounter = 4; while (--_pixelCounter >= 0) { - - if ((_srColorSync & SrColorMask) != 0) - { - _displayC = _bufferC[_srColorIndexLatch]; - _srColorIndexLatch = (_srColorIndexLatch + 1) & 0x3F; - } - #region PRE-RENDER BORDER // check left border @@ -73,105 +64,14 @@ #endregion - #region CHARACTER GRAPHICS - switch (_videoMode) - { - case VideoMode000: - _pixelData = _sr & SrMask2; - _pixel = _pixelData != 0 ? _displayC >> 8 : _backgroundColor0; - break; - case VideoMode001: - if ((_displayC & 0x800) != 0) - { - // multicolor 001 - if ((_srSync & SrMask2) != 0) - _pixelData = _sr & SrMask3; + // render graphics + _pixel = (_srActive & SrMask1) != 0 + ? ((_srColor0 & SrMask1) >> 18) | + ((_srColor1 & SrMask1) >> 17) | + ((_srColor2 & SrMask1) >> 16) | + ((_srColor3 & SrMask1) >> 15) + : _backgroundColor0; - switch (_pixelData) - { - case 0: - _pixel = _backgroundColor0; - break; - case SrMask1: - _pixel = _idle ? 0 : _backgroundColor1; - break; - case SrMask2: - _pixel = _idle ? 0 :_backgroundColor2; - break; - default: - _pixel = _idle ? 0 : (_displayC & 0x700) >> 8; - break; - } - } - else - { - // standard 001 - _pixelData = _sr & SrMask2; - _pixel = _pixelData != 0 ? (_idle ? 0 : _displayC >> 8) : _backgroundColor0; - } - break; - case VideoMode010: - _pixelData = _sr & SrMask2; - _pixel = _idle ? 0 : _pixelData != 0 ? _displayC >> 4 : _displayC; - break; - case VideoMode011: - if ((_srSync & SrMask2) != 0) - _pixelData = _sr & SrMask3; - - switch (_pixelData) - { - case 0: - _pixel = _backgroundColor0; - break; - case SrMask1: - _pixel = _idle ? 0 : _displayC >> 4; - break; - case SrMask2: - _pixel = _idle ? 0 : _displayC; - break; - default: - _pixel = _idle ? 0 : _displayC >> 8; - break; - } - break; - case VideoMode100: - _pixelData = _sr & SrMask2; - if (_pixelData != 0) - { - _pixel = _idle ? 0 : _displayC >> 8; - } - else - { - _ecmPixel = (_displayC & 0xC0) >> 6; - switch (_ecmPixel) - { - case 0: - _pixel = _backgroundColor0; - break; - case 1: - _pixel = _idle ? 0 : _backgroundColor1; - break; - case 2: - _pixel = _idle ? 0 : _backgroundColor2; - break; - default: - _pixel = _idle ? 0 : _backgroundColor3; - break; - } - } - break; - default: - _pixelData = 0; - _pixel = 0; - break; - } - _pixel &= 0xF; - _sr <<= 1; - _srSync <<= 1; - _srColorSync <<= 1; - #endregion - - #region SPRITES // render sprites _pixelOwner = -1; for (_sprIndex = 0; _sprIndex < 8; _sprIndex++) @@ -252,7 +152,7 @@ } // sprite-data collision - if (!_borderOnVertical && (_pixelData >= SrMask2)) + if (!_borderOnVertical && (_srData1 & SrMask1) != 0) { _spr.CollideData = true; _intSpriteDataCollision = true; @@ -261,7 +161,7 @@ // sprite priority logic if (_spr.Priority) { - _pixel = _pixelData >= SrMask2 ? _pixel : _sprPixel; + _pixel = (_srData1 & SrMask1) != 0 ? _pixel : _sprPixel; } else { @@ -271,8 +171,6 @@ } } - #endregion - #region POST-RENDER BORDER // border doesn't work with the background buffer @@ -298,6 +196,13 @@ if (!_rasterXHold) _rasterX++; + + _srColor0 <<= 1; + _srColor1 <<= 1; + _srColor2 <<= 1; + _srColor3 <<= 1; + _srData1 <<= 1; + _srActive <<= 1; } if (_pixBufferBorderIndex >= PixBorderBufferSize) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs index aa6976c443..adda9d09ae 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs @@ -22,14 +22,12 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private int _borderR; private int _borderT; private int[] _bufferC; - private int[] _bufferG; private int _cycle; private int _cycleIndex; private bool _columnSelect; private int _dataC; private int _dataG; private bool _displayEnable; - private int _displayC; private bool _enableIntLightPen; private bool _enableIntRaster; private bool _enableIntSpriteCollision; @@ -72,7 +70,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private readonly Sprite _sprite6; private readonly Sprite _sprite7; private readonly Sprite[] _sprites; - private int _sr; private bool _vblank; private int _vblankEnd; private int _vblankStart; @@ -130,7 +127,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS _spriteSpriteCollisionClearPending = false; _spriteMulticolor0 = 0; _spriteMulticolor1 = 0; - _sr = 0; _vc = 0; _vcbase = 0; _vmli = 0; @@ -149,7 +145,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS for (var i = 0; i < 40; i++) { _bufferC[i] = 0; - _bufferG[i] = 0; } _pixBuffer = new int[PixBufferSize]; @@ -161,11 +156,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS public void SyncState(Serializer ser) { - ser.Sync(nameof(_cyclesExecuted), ref _cyclesExecuted); ser.Sync(nameof(_parseIsSprCrunch), ref _parseIsSprCrunch); - ser.Sync(nameof(_srSync), ref _srSync); - ser.Sync(nameof(_srColorSync), ref _srColorSync); - ser.Sync(nameof(_srColorIndexLatch), ref _srColorIndexLatch); ser.Sync(nameof(_videoMode), ref _videoMode); ser.Sync(nameof(_borderOnShiftReg), ref _borderOnShiftReg); ser.Sync(nameof(_backgroundColor0), ref _backgroundColor0); @@ -186,14 +177,12 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.Sync(nameof(_borderR), ref _borderR); ser.Sync(nameof(_borderT), ref _borderT); ser.Sync(nameof(_bufferC), ref _bufferC, useNull: false); - ser.Sync(nameof(_bufferG), ref _bufferG, useNull: false); ser.Sync(nameof(_cycle), ref _cycle); ser.Sync(nameof(_cycleIndex), ref _cycleIndex); ser.Sync(nameof(_columnSelect), ref _columnSelect); ser.Sync(nameof(_dataC), ref _dataC); ser.Sync(nameof(_dataG), ref _dataG); ser.Sync(nameof(_displayEnable), ref _displayEnable); - ser.Sync(nameof(_displayC), ref _displayC); ser.Sync(nameof(_enableIntLightPen), ref _enableIntLightPen); ser.Sync(nameof(_enableIntRaster), ref _enableIntRaster); ser.Sync(nameof(_enableIntSpriteCollision), ref _enableIntSpriteCollision); @@ -234,7 +223,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.EndSection(); } - ser.Sync(nameof(_sr), ref _sr); ser.Sync(nameof(_vc), ref _vc); ser.Sync(nameof(_vcbase), ref _vcbase); ser.Sync(nameof(_vmli), ref _vmli); @@ -245,7 +233,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.Sync(nameof(_pixBufferIndex), ref _pixBufferIndex); ser.Sync(nameof(_pixBorderBuffer), ref _pixBorderBuffer, useNull: false); ser.Sync(nameof(_pixBufferBorderIndex), ref _pixBufferBorderIndex); - + if (ser.IsReader) { UpdateBorder(); diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs index 621a0ea59b..fa0a8ec95c 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs @@ -36,7 +36,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private readonly int _totalCycles; private readonly int _totalLines; - private int _cyclesExecuted; private int _hblankStartCheckXRaster; private int _hblankEndCheckXRaster; @@ -81,7 +80,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS _sprite7 = _sprites[7]; _bufferC = new int[40]; - _bufferG = new int[40]; } private void ConfigureBlanking(int lines, int hblankStart, int hblankEnd, int vblankStart, int vblankEnd, @@ -228,7 +226,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS _vc = 0; _badlineEnable = false; _refreshCounter = 0xFF; - _cyclesExecuted = 0; } } @@ -327,8 +324,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS // must always come last UpdatePins(); - - _cyclesExecuted++; } private void UpdateBorder() From 89fa1534771cfa35830df50f9c1d29cdfb7a3ab5 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 06:55:55 -0500 Subject: [PATCH 03/11] VIC: Resolve background color registers separately to color matrix memory --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 67 ++++++++----------- .../Computers/Commodore64/MOS/Vic.Render.cs | 33 +++++++-- .../Computers/Commodore64/MOS/Vic.State.cs | 1 + 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index c2aa36b04b..fc83f9257c 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -46,6 +46,8 @@ private int _parsePixelDataIndex; private int _parseSrData0; private int _parseSrData1; + private int _parseSrShift; + private bool _parseSrColorEnable; private void ParseCycle() { @@ -106,8 +108,9 @@ } // graphics data shift register - _srData1 &= ~(0xFF << (7 - _xScroll)); - _srActive |= 0xFF << (7 - _xScroll); + _parseSrShift = 7 - _xScroll; + _srData1 &= ~(0xFF << _parseSrShift); + _srActive |= 0xFF << _parseSrShift; if (_multicolorMode && (_bitmapMode || (_dataC & 0x800) != 0)) { @@ -119,13 +122,13 @@ _parseSrData0 = _bitmapMode ? 0 : _dataG; _parseSrData1 = _dataG; } - _srData1 |= _parseSrData1 << (7 - _xScroll); - + _srData1 |= _parseSrData1 << _parseSrShift; + // graphics color shift register - _srColor0 &= ~(0xFF << (7 - _xScroll)); - _srColor1 &= ~(0xFF << (7 - _xScroll)); - _srColor2 &= ~(0xFF << (7 - _xScroll)); - _srColor3 &= ~(0xFF << (7 - _xScroll)); + _srColor0 &= ~(0xFF << _parseSrShift); + _srColor1 &= ~(0xFF << _parseSrShift); + _srColor2 &= ~(0xFF << _parseSrShift); + _srColor3 &= ~(0xFF << _parseSrShift); for (_parsePixelDataIndex = 7; _parsePixelDataIndex >= 0; _parsePixelDataIndex--) { _parsePixelData = ((_parseSrData0 & 0x80) >> 7) | ((_parseSrData1 & 0x80) >> 6); @@ -133,24 +136,20 @@ { case VideoMode000: case VideoMode001: - switch (_parsePixelData) + if (_parsePixelData == 3) { - case 0: - _pixel = _backgroundColor0; - break; - case 1: - _pixel = _idle ? 0 : _backgroundColor1; - break; - case 2: - _pixel = _idle ? 0 :_backgroundColor2; - break; - default: - _pixel = _idle ? 0 : (_multicolorMode ? _dataC & 0x700 : _dataC) >> 8; - break; + _pixel = _idle ? 0 : (_multicolorMode ? _dataC & 0x700 : _dataC) >> 8; + _parseSrColorEnable = true; + } + else + { + _pixel = _parsePixelData; + _parseSrColorEnable = false; } break; case VideoMode010: case VideoMode011: + _parseSrColorEnable = _parsePixelData != 0; switch (_parsePixelData) { case 0: @@ -171,25 +170,12 @@ if (_parsePixelData != 0) { _pixel = _idle ? 0 : _dataC >> 8; + _parseSrColorEnable = true; } else { _pixel = (_dataC & 0xC0) >> 6; - switch (_pixel) - { - case 0: - _pixel = _backgroundColor0; - break; - case 1: - _pixel = _idle ? 0 : _backgroundColor1; - break; - case 2: - _pixel = _idle ? 0 : _backgroundColor2; - break; - default: - _pixel = _idle ? 0 : _backgroundColor3; - break; - } + _parseSrColorEnable = false; } break; default: @@ -200,10 +186,11 @@ _parseSrData0 <<= 1; _parseSrData1 <<= 1; - _srColor0 |= (_pixel & 1) << (7 - _xScroll + _parsePixelDataIndex); - _srColor1 |= ((_pixel >> 1) & 1) << (7 - _xScroll + _parsePixelDataIndex); - _srColor2 |= ((_pixel >> 2) & 1) << (7 - _xScroll + _parsePixelDataIndex); - _srColor3 |= ((_pixel >> 3) & 1) << (7 - _xScroll + _parsePixelDataIndex); + _srColor0 |= (_pixel & 1) << (_parseSrShift + _parsePixelDataIndex); + _srColor1 |= ((_pixel >> 1) & 1) << (_parseSrShift + _parsePixelDataIndex); + _srColor2 |= ((_pixel >> 2) & 1) << (_parseSrShift + _parsePixelDataIndex); + _srColor3 |= ((_pixel >> 3) & 1) << (_parseSrShift + _parsePixelDataIndex); + _srColorEnable |= (_parseSrColorEnable ? 1 : 0) << (_parseSrShift + _parsePixelDataIndex); } break; diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs index b1f2b12b38..57b911f1a6 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs @@ -17,6 +17,7 @@ private int _srColor3; private int _srData1; private int _srActive; + private int _srColorEnable; private int _videoMode; private int _borderOnShiftReg; @@ -65,12 +66,31 @@ #endregion // render graphics - _pixel = (_srActive & SrMask1) != 0 - ? ((_srColor0 & SrMask1) >> 18) | - ((_srColor1 & SrMask1) >> 17) | - ((_srColor2 & SrMask1) >> 16) | - ((_srColor3 & SrMask1) >> 15) - : _backgroundColor0; + if ((_srColorEnable & SrMask1) != 0) + { + _pixel = ((_srColor0 & SrMask1) >> 18) | + ((_srColor1 & SrMask1) >> 17) | + ((_srColor2 & SrMask1) >> 16) | + ((_srColor3 & SrMask1) >> 15); + } + else + { + switch (((_srColor0 & SrMask1) >> 18) | ((_srColor1 & SrMask1) >> 17)) + { + case 1: + _pixel = _backgroundColor1; + break; + case 2: + _pixel = _backgroundColor2; + break; + case 3: + _pixel = _backgroundColor3; + break; + default: + _pixel = _backgroundColor0; + break; + } + } // render sprites _pixelOwner = -1; @@ -203,6 +223,7 @@ _srColor3 <<= 1; _srData1 <<= 1; _srActive <<= 1; + _srColorEnable <<= 1; } if (_pixBufferBorderIndex >= PixBorderBufferSize) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs index adda9d09ae..ecef548c29 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs @@ -51,6 +51,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private int _rasterInterruptLine; private bool _rasterInterruptTriggered; private int _rasterLine; + private int _rasterLineInterruptCompare; private int _rasterX; private bool _rasterXHold; private int _rc; From 83b6553749f1bcc7ddb89e9beb649146c5b343d1 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 06:58:13 -0500 Subject: [PATCH 04/11] VIC: Respect idle state background color registers, plus black in undocumented gfx mode --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 1 + .../Computers/Commodore64/MOS/Vic.Render.cs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index fc83f9257c..af86811337 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -181,6 +181,7 @@ default: _parsePixelData = 0; _pixel = 0; + _parseSrColorEnable = true; break; } diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs index 57b911f1a6..8c7f07d927 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Render.cs @@ -78,13 +78,13 @@ switch (((_srColor0 & SrMask1) >> 18) | ((_srColor1 & SrMask1) >> 17)) { case 1: - _pixel = _backgroundColor1; + _pixel = _idle ? 0 : _backgroundColor1; break; case 2: - _pixel = _backgroundColor2; + _pixel = _idle ? 0 : _backgroundColor2; break; case 3: - _pixel = _backgroundColor3; + _pixel = _idle ? 0 : _backgroundColor3; break; default: _pixel = _backgroundColor0; From a8fd85157c2df9d71ee5a70ef9b30fba0a0980cb Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 08:02:55 -0500 Subject: [PATCH 05/11] VIC: Use correct color mapping for non-multicolor bitmap mode --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index af86811337..68639f8f10 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -119,11 +119,13 @@ } else { - _parseSrData0 = _bitmapMode ? 0 : _dataG; - _parseSrData1 = _dataG; + _parseSrData0 = _parseSrData1 = _dataG; } _srData1 |= _parseSrData1 << _parseSrShift; + if (_bitmapMode && !_multicolorMode) + _parseSrData1 ^= 0xFF; + // graphics color shift register _srColor0 &= ~(0xFF << _parseSrShift); _srColor1 &= ~(0xFF << _parseSrShift); From 9758efe604337f3612910d607f1d850efa33d11c Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 19:46:33 -0500 Subject: [PATCH 06/11] 6502X: CPU does a read or write regardless if the result is trashed, even during reset and dummy pushes --- .../CPUs/MOS 6502X/Execute.cs | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs index db65556c49..859ebc7ef5 100644 --- a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs @@ -524,13 +524,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 bool interrupt_pending; bool branch_irq_hack; //see Uop.RelBranch_Stage3 for more details - bool Interrupted - { - get - { - return RDY && (NMI || (IRQ && !FlagI)); - } - } + bool Interrupted => RDY && (NMI || (IRQ && !FlagI)); void FetchDummy() { @@ -560,10 +554,6 @@ namespace BizHawk.Emulation.Cores.Components.M6502 void Fetch1() { - rdy_freeze = !RDY; - if (!RDY) - return; - my_iflag = FlagI; FlagI = iflag_pending; if (!branch_irq_hack) @@ -672,15 +662,21 @@ namespace BizHawk.Emulation.Cores.Components.M6502 } void PushP_Reset() { - ea = ResetVector; - S--; - FlagI = true; - + rdy_freeze = !RDY; + if (RDY) + { + ea = ResetVector; + _link.DummyReadMemory((ushort)(S-- + 0x100)); + FlagI = true; + } } void PushDummy() { - S--; - + rdy_freeze = !RDY; + if (RDY) + { + _link.DummyReadMemory((ushort)(S-- + 0x100)); + } } void FetchPCLVector() { @@ -2702,7 +2698,6 @@ namespace BizHawk.Emulation.Cores.Components.M6502 mi = 0; iflag_pending = FlagI; ExecuteOneRetry(); - return; } void End_BranchSpecial() { @@ -2973,7 +2968,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 public void ExecuteOne() { - // total cycles now incraments every time a cycle is called to accurately count during RDY + // total cycles now increments every time a cycle is called to accurately count during RDY TotalExecutedCycles++; if (!rdy_freeze) { From 2abe832289dbea29593ada13ed94ab8f229160b8 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 20:52:51 -0500 Subject: [PATCH 07/11] C64: AEC does not prohibit the CPU from functioning, only BA (RDY) does --- .../Computers/Commodore64/C64.cs | 1 - .../Commodore64/MOS/Chip6510.IDebuggable.cs | 6 +-- .../MOS/Chip6510.IDisassemblable.cs | 2 +- .../Computers/Commodore64/MOS/Chip6510.cs | 46 ++++--------------- 4 files changed, 14 insertions(+), 41 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/C64.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/C64.cs index 926942bbe4..1592c35a51 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/C64.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/C64.cs @@ -207,7 +207,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64 { _board.InputRead = false; _board.PollInput(); - _board.Cpu.LagCycles = 0; } _board.Execute(); diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDebuggable.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDebuggable.cs index 67ba9a45c1..7dbe83fd05 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDebuggable.cs @@ -97,7 +97,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private void StepOver() { - var instruction = CpuPeek(_cpu.PC); + var instruction = Peek(_cpu.PC); if (instruction == Jsr) { @@ -116,13 +116,13 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private void StepOut() { var instructionsBeforeBailout = 1000000; - var instr = CpuPeek(_cpu.PC); + var instr = Peek(_cpu.PC); _jsrCount = instr == Jsr ? 1 : 0; while (--instructionsBeforeBailout > 0) { StepInto(); - instr = CpuPeek(_cpu.PC); + instr = Peek(_cpu.PC); if (instr == Jsr) { _jsrCount++; diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDisassemblable.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDisassemblable.cs index e5a9459c25..ccacc83988 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDisassemblable.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.IDisassemblable.cs @@ -27,7 +27,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS public string Disassemble(MemoryDomain m, uint addr, out int length) { - return MOS6502X.Disassemble((ushort)addr, out length, CpuPeek); + return MOS6502X.Disassemble((ushort) addr, out length, a => unchecked((byte) Peek(a))); } } } diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.cs index ba2ba3bf53..5d01e5edcf 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.cs @@ -67,25 +67,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS set { _cpu.TraceCallback = value; } } - public void SetOverflow() - { - } - - private byte CpuPeek(ushort addr) - { - return unchecked((byte)Peek(addr)); - } - - private byte CpuRead(ushort addr) - { - return unchecked((byte)Read(addr)); - } - - private void CpuWrite(ushort addr, byte val) - { - Write(addr, val); - } - public void HardReset() { _cpu.NESSoftReset(); @@ -109,22 +90,15 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS { _cpu.RDY = ReadRdy(); - if (ReadAec()) - { - _cpu.IRQ = !ReadIrq(); - _pinNmiLast = _thisNmi; - _thisNmi = ReadNmi(); - _cpu.NMI |= _pinNmiLast && !_thisNmi; - _cpu.ExecuteOne(); - } - else - { - LagCycles++; - } +// if (!ReadAec()) +// return; + _cpu.IRQ = !ReadIrq(); + _pinNmiLast = _thisNmi; + _thisNmi = ReadNmi(); + _cpu.NMI |= _pinNmiLast && !_thisNmi; + _cpu.ExecuteOne(); } - public int LagCycles; - internal bool AtInstructionStart() { return _cpu.AtInstructionStart(); @@ -216,7 +190,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS case 0x0001: return PortData; default: - return ReadMemory(addr); + return ReadAec() ? ReadMemory(addr) : 0xFF; } } @@ -233,7 +207,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.EndSection(); ser.Sync(nameof(_thisNmi), ref _thisNmi); - ser.Sync(nameof(LagCycles), ref LagCycles); } public void Write(int addr, int val) @@ -249,7 +222,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS WriteMemoryPort(addr, val); break; default: - WriteMemory(addr, val); + if (ReadAec()) + WriteMemory(addr, val); break; } } From b471fdc6926ee79c02a1c20fff6bc37fcd9f22da Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 20:53:54 -0500 Subject: [PATCH 08/11] C64: The CPU can trigger VIC badlines on its own (needed for VSP) --- .../Commodore64/MOS/Vic.Registers.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs index 0e63f4c16f..be8b1293af 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs @@ -292,6 +292,27 @@ _extraColorMode = (val & 0x40) != 0; _rasterInterruptLine &= 0xFF; _rasterInterruptLine |= (val & 0x80) << 1; + + if (_rasterLine == FirstDmaLine) + _badlineEnable |= _displayEnable; + + if (_badlineEnable) + { + if ((_rasterLine & 0x7) == _yScroll) + { + _badline = true; + _idle = false; + } + else + { + _badline = false; + } + } + else + { + _badline = false; + } + UpdateBorder(); UpdateVideoMode(); break; From e63d10b608cdea5c0bf2a330220b7e81848bee0f Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 20:55:14 -0500 Subject: [PATCH 09/11] C64: Interrupts generated in phase 2 by the VIC won't trigger for the CPU until next cycle, also buffer BA --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 8 ++++---- .../Computers/Commodore64/MOS/Vic.State.cs | 3 +++ .../Computers/Commodore64/MOS/Vic.cs | 17 ++++++++++------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index 68639f8f10..33c5f29a48 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -2,7 +2,7 @@ { public sealed partial class Vic { - private const int BaResetCounter = 4; + private const int BaResetCounter = 6; private const int PipelineUpdateVc = 0x00000001; // vc/rc rule 2 private const int PipelineSpriteCrunch = 0x00000002; private const int PipelineUpdateMcBase = 0x00000004; @@ -336,13 +336,13 @@ } // perform BA flag manipulation - _pinBa = true; + _ba = true; switch (_parseBa) { case BaTypeNone: break; case BaTypeCharacter: - _pinBa = !_badline; + _ba = !_badline; break; default: _parseCycleBaSprite0 = _parseBa & BaTypeMaskSprite0; @@ -351,7 +351,7 @@ if ((_parseCycleBaSprite0 < 8 && _sprites[_parseCycleBaSprite0].Dma) || (_parseCycleBaSprite1 < 8 && _sprites[_parseCycleBaSprite1].Dma) || (_parseCycleBaSprite2 < 8 && _sprites[_parseCycleBaSprite2].Dma)) - _pinBa = false; + _ba = false; break; } diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs index ecef548c29..f30bde782b 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs @@ -8,6 +8,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS private int _backgroundColor1; private int _backgroundColor2; private int _backgroundColor3; + private bool _ba; private int _baCount; private bool _badline; private bool _badlineEnable; @@ -85,6 +86,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS _pinAec = true; _pinBa = true; _pinIrq = true; + _ba = true; _bufOffset = 0; @@ -160,6 +162,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.Sync(nameof(_parseIsSprCrunch), ref _parseIsSprCrunch); ser.Sync(nameof(_videoMode), ref _videoMode); ser.Sync(nameof(_borderOnShiftReg), ref _borderOnShiftReg); + ser.Sync(nameof(_ba), ref _ba); ser.Sync(nameof(_backgroundColor0), ref _backgroundColor0); ser.Sync(nameof(_backgroundColor1), ref _backgroundColor1); ser.Sync(nameof(_backgroundColor2), ref _backgroundColor2); diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs index fa0a8ec95c..0096a75089 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs @@ -310,20 +310,21 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS // render ParseCycle(); + UpdateBa(); Render(); ParseCycle(); + UpdateBa(); + UpdatePins(); Render(); _extraColorModeBuffer = _extraColorMode; + } - // if the BA counter is nonzero, allow CPU bus access - if (_pinBa) + private void UpdateBa() + { + if (_ba) _baCount = BaResetCounter; - else if (_baCount > 0) + else if (_baCount >= 0) _baCount--; - _pinAec = _pinBa || _baCount > 0; - - // must always come last - UpdatePins(); } private void UpdateBorder() @@ -343,6 +344,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS (_enableIntLightPen & _intLightPen)); _pinIrq = irqTemp; + _pinAec = _ba || _baCount >= 0; + _pinBa = _ba; } private void UpdateVideoMode() From 3a135c7c2646e567f5ea0042445e0f252f87290a Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 21:40:03 -0500 Subject: [PATCH 10/11] C64: Raster interrupt bit can be set even if not enabled, just won't actually assert IRQ --- .../Computers/Commodore64/MOS/Vic.Registers.cs | 6 +----- .../Computers/Commodore64/MOS/Vic.State.cs | 1 - BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs | 8 +------- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs index be8b1293af..f8b8d78508 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Registers.cs @@ -99,7 +99,7 @@ return 0x01 | ((_pointerVm & 0x3C00) >> 6) | ((_pointerCb & 0x7) << 1); case 0x19: - return 0x70 | (_rasterInterruptTriggered ? 0x01 : 0x00) | + return 0x70 | (_intRaster ? 0x01 : 0x00) | (_intSpriteDataCollision ? 0x02 : 0x00) | (_intSpriteCollision ? 0x04 : 0x00) | (_intLightPen ? 0x08 : 0x00) | @@ -207,11 +207,7 @@ case 0x19: // interrupts are cleared by writing a 1 if ((val & 0x01) != 0) - { _intRaster = false; - _rasterInterruptTriggered = false; - } - if ((val & 0x02) != 0) _intSpriteDataCollision = false; if ((val & 0x04) != 0) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs index f30bde782b..69509feb91 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.State.cs @@ -207,7 +207,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS ser.Sync(nameof(_pointerCb), ref _pointerCb); ser.Sync(nameof(_pointerVm), ref _pointerVm); ser.Sync(nameof(_rasterInterruptLine), ref _rasterInterruptLine); - ser.Sync(nameof(_rasterInterruptTriggered), ref _rasterInterruptTriggered); ser.Sync(nameof(_rasterLine), ref _rasterLine); ser.Sync(nameof(_rasterX), ref _rasterX); ser.Sync(nameof(_rasterXHold), ref _rasterXHold); diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs index 0096a75089..18c2ab846d 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs @@ -262,13 +262,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS // IRQ compares are done here if (_rasterLine == _rasterInterruptLine) { - _rasterInterruptTriggered = true; - - // interrupt needs to be enabled to be set to true - if (_enableIntRaster) - { - _intRaster = true; - } + _intRaster = true; } } From 0a7dc52aa08f10ec47dc2a25865835088af36846 Mon Sep 17 00:00:00 2001 From: SaxxonPike Date: Tue, 9 Jul 2019 22:41:12 -0500 Subject: [PATCH 11/11] C64: BA and raster IRQ cleanup --- .../Computers/Commodore64/MOS/Vic.Parse.cs | 7 +++---- BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs | 4 +--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs index 33c5f29a48..6337dc022f 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.Parse.cs @@ -336,10 +336,10 @@ } // perform BA flag manipulation - _ba = true; switch (_parseBa) { case BaTypeNone: + _ba = true; break; case BaTypeCharacter: _ba = !_badline; @@ -348,10 +348,9 @@ _parseCycleBaSprite0 = _parseBa & BaTypeMaskSprite0; _parseCycleBaSprite1 = (_parseBa & BaTypeMaskSprite1) >> 4; _parseCycleBaSprite2 = (_parseBa & BaTypeMaskSprite2) >> 8; - if ((_parseCycleBaSprite0 < 8 && _sprites[_parseCycleBaSprite0].Dma) || + _ba = !((_parseCycleBaSprite0 < 8 && _sprites[_parseCycleBaSprite0].Dma) || (_parseCycleBaSprite1 < 8 && _sprites[_parseCycleBaSprite1].Dma) || - (_parseCycleBaSprite2 < 8 && _sprites[_parseCycleBaSprite2].Dma)) - _ba = false; + (_parseCycleBaSprite2 < 8 && _sprites[_parseCycleBaSprite2].Dma)); break; } diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs index 18c2ab846d..b1a27fe757 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Vic.cs @@ -254,12 +254,10 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS // start of rasterline if ((_cycle == RasterIrqLineXCycle && _rasterLine > 0) || (_cycle == RasterIrqLine0Cycle && _rasterLine == 0)) { - //_rasterInterruptTriggered = false; - if (_rasterLine == LastDmaLine) _badlineEnable = false; - // IRQ compares are done here + // raster compares are done here if (_rasterLine == _rasterInterruptLine) { _intRaster = true;