Merge remote-tracking branch 'origin/c64-refactor' into c64-refactor

# Conflicts:
#	BizHawk.Emulation.Cores/Computers/Commodore64/MOS/Chip6510.cs
This commit is contained in:
SaxxonPike 2019-07-12 22:10:08 -05:00
commit 85bc92b688
9 changed files with 238 additions and 245 deletions

View File

@ -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()
{
@ -928,19 +924,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 +1192,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 +1210,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502
rdy_freeze = !RDY;
if (RDY)
{
S++;
_link.DummyReadMemory((ushort) (0x100 | S++));
}
}
void JSR()
@ -2256,19 +2256,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);
}
}
@ -2699,7 +2698,6 @@ namespace BizHawk.Emulation.Cores.Components.M6502
mi = 0;
iflag_pending = FlagI;
ExecuteOneRetry();
return;
}
void End_BranchSpecial()
{
@ -2970,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)
{

View File

@ -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++;

View File

@ -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)));
}
}
}

View File

@ -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,14 +90,13 @@ 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();
}
// if (!ReadAec())
// return;
_cpu.IRQ = !ReadIrq();
_pinNmiLast = _thisNmi;
_thisNmi = ReadNmi();
_cpu.NMI |= _pinNmiLast && !_thisNmi;
_cpu.ExecuteOne();
}
internal bool AtInstructionStart()
@ -210,7 +190,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
case 0x0001:
return PortData;
default:
return ReadMemory(addr);
return ReadAec() ? ReadMemory(addr) : 0xFF;
}
}
@ -242,7 +222,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
WriteMemoryPort(addr, val);
break;
default:
WriteMemory(addr, val);
if (ReadAec())
WriteMemory(addr, val);
break;
}
}

View File

@ -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;
@ -42,6 +42,12 @@
private int _parseBa;
private int _parseAct;
private bool _parseIsSprCrunch;
private int _parsePixelData;
private int _parsePixelDataIndex;
private int _parseSrData0;
private int _parseSrData1;
private int _parseSrShift;
private bool _parseSrColorEnable;
private void ParseCycle()
{
@ -80,8 +86,6 @@
_dataC = 0;
_bufferC[_vmli] = _dataC;
}
_srColorSync |= 0x01 << (7 - _xScroll);
break;
case FetchTypeGraphics:
// fetch G
@ -96,14 +100,102 @@
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
_parseSrShift = 7 - _xScroll;
_srData1 &= ~(0xFF << _parseSrShift);
_srActive |= 0xFF << _parseSrShift;
if (_multicolorMode && (_bitmapMode || (_dataC & 0x800) != 0))
{
_parseSrData0 = (_dataG & 0x55) | ((_dataG & 0x55) << 1);
_parseSrData1 = (_dataG & 0xAA) | ((_dataG & 0xAA) >> 1);
}
else
{
_parseSrData0 = _parseSrData1 = _dataG;
}
_srData1 |= _parseSrData1 << _parseSrShift;
if (_bitmapMode && !_multicolorMode)
_parseSrData1 ^= 0xFF;
// graphics color shift register
_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);
switch (_videoMode)
{
case VideoMode000:
case VideoMode001:
if (_parsePixelData == 3)
{
_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:
_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;
_parseSrColorEnable = true;
}
else
{
_pixel = (_dataC & 0xC0) >> 6;
_parseSrColorEnable = false;
}
break;
default:
_parsePixelData = 0;
_pixel = 0;
_parseSrColorEnable = true;
break;
}
_parseSrData0 <<= 1;
_parseSrData1 <<= 1;
_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;
case FetchTypeNone:
// fetch none
@ -221,7 +313,6 @@
if ((_parseAct & PipelineUpdateVc) != 0) // VC/RC rule 2
{
_vc = _vcbase;
_srColorIndexLatch = 0;
_vmli = 0;
if (_badline)
{
@ -245,22 +336,21 @@
}
// perform BA flag manipulation
_pinBa = true;
switch (_parseBa)
{
case BaTypeNone:
_ba = true;
break;
case BaTypeCharacter:
_pinBa = !_badline;
_ba = !_badline;
break;
default:
_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))
_pinBa = false;
(_parseCycleBaSprite2 < 8 && _sprites[_parseCycleBaSprite2].Dma));
break;
}

View File

@ -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)
@ -292,6 +288,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;

View File

@ -4,18 +4,20 @@
{
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 _srColorEnable;
private int _videoMode;
private int _borderOnShiftReg;
@ -26,10 +28,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 +46,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 +65,33 @@
#endregion
#region CHARACTER GRAPHICS
switch (_videoMode)
// render graphics
if ((_srColorEnable & SrMask1) != 0)
{
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;
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 = ((_srColor0 & SrMask1) >> 18) |
((_srColor1 & SrMask1) >> 17) |
((_srColor2 & SrMask1) >> 16) |
((_srColor3 & SrMask1) >> 15);
}
else
{
switch (((_srColor0 & SrMask1) >> 18) | ((_srColor1 & SrMask1) >> 17))
{
case 1:
_pixel = _idle ? 0 : _backgroundColor1;
break;
case 2:
_pixel = _idle ? 0 : _backgroundColor2;
break;
case 3:
_pixel = _idle ? 0 : _backgroundColor3;
break;
default:
_pixel = _backgroundColor0;
break;
}
}
_pixel &= 0xF;
_sr <<= 1;
_srSync <<= 1;
_srColorSync <<= 1;
#endregion
#region SPRITES
// render sprites
_pixelOwner = -1;
for (_sprIndex = 0; _sprIndex < 8; _sprIndex++)
@ -252,7 +172,7 @@
}
// sprite-data collision
if (!_borderOnVertical && (_pixelData >= SrMask2))
if (!_borderOnVertical && (_srData1 & SrMask1) != 0)
{
_spr.CollideData = true;
_intSpriteDataCollision = true;
@ -261,7 +181,7 @@
// sprite priority logic
if (_spr.Priority)
{
_pixel = _pixelData >= SrMask2 ? _pixel : _sprPixel;
_pixel = (_srData1 & SrMask1) != 0 ? _pixel : _sprPixel;
}
else
{
@ -271,8 +191,6 @@
}
}
#endregion
#region POST-RENDER BORDER
// border doesn't work with the background buffer
@ -298,6 +216,14 @@
if (!_rasterXHold)
_rasterX++;
_srColor0 <<= 1;
_srColor1 <<= 1;
_srColor2 <<= 1;
_srColor3 <<= 1;
_srData1 <<= 1;
_srActive <<= 1;
_srColorEnable <<= 1;
}
if (_pixBufferBorderIndex >= PixBorderBufferSize)

View File

@ -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;
@ -22,14 +23,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;
@ -53,6 +52,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;
@ -72,7 +72,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;
@ -87,6 +86,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
_pinAec = true;
_pinBa = true;
_pinIrq = true;
_ba = true;
_bufOffset = 0;
@ -130,7 +130,6 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
_spriteSpriteCollisionClearPending = false;
_spriteMulticolor0 = 0;
_spriteMulticolor1 = 0;
_sr = 0;
_vc = 0;
_vcbase = 0;
_vmli = 0;
@ -149,7 +148,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,13 +159,10 @@ 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(_ba), ref _ba);
ser.Sync(nameof(_backgroundColor0), ref _backgroundColor0);
ser.Sync(nameof(_backgroundColor1), ref _backgroundColor1);
ser.Sync(nameof(_backgroundColor2), ref _backgroundColor2);
@ -186,14 +181,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);
@ -214,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);
@ -234,7 +226,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 +236,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();

View File

@ -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;
}
}
@ -257,21 +254,13 @@ 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)
{
_rasterInterruptTriggered = true;
// interrupt needs to be enabled to be set to true
if (_enableIntRaster)
{
_intRaster = true;
}
_intRaster = true;
}
}
@ -313,22 +302,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();
_cyclesExecuted++;
}
private void UpdateBorder()
@ -348,6 +336,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
(_enableIntLightPen & _intLightPen));
_pinIrq = irqTemp;
_pinAec = _ba || _baCount >= 0;
_pinBa = _ba;
}
private void UpdateVideoMode()