245 lines
8.1 KiB
C#
245 lines
8.1 KiB
C#
using BizHawk.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
|
|
{
|
|
public sealed partial class Vic
|
|
{
|
|
private int _backgroundColor0;
|
|
private int _backgroundColor1;
|
|
private int _backgroundColor2;
|
|
private int _backgroundColor3;
|
|
private bool _ba;
|
|
private int _baCount;
|
|
private bool _badline;
|
|
private bool _badlineEnable;
|
|
private bool _bitmapMode;
|
|
private int _borderB;
|
|
private bool _borderCheckLEnable;
|
|
private bool _borderCheckREnable;
|
|
private int _borderColor;
|
|
private int _borderL;
|
|
private bool _borderOnMain;
|
|
private bool _borderOnVertical;
|
|
private int _borderR;
|
|
private int _borderT;
|
|
private int[] _bufferC;
|
|
private int _cycle;
|
|
private int _cycleIndex;
|
|
private bool _columnSelect;
|
|
private int _dataC;
|
|
private int _dataG;
|
|
private bool _displayEnable;
|
|
private bool _enableIntLightPen;
|
|
private bool _enableIntRaster;
|
|
private bool _enableIntSpriteCollision;
|
|
private bool _enableIntSpriteDataCollision;
|
|
private bool _extraColorMode;
|
|
private bool _hblank;
|
|
private bool _idle;
|
|
private bool _intLightPen;
|
|
private bool _intRaster;
|
|
private bool _intSpriteCollision;
|
|
private bool _intSpriteDataCollision;
|
|
private int _lightPenX;
|
|
private int _lightPenY;
|
|
private bool _multicolorMode;
|
|
private bool _pinAec = true;
|
|
private bool _pinBa = true;
|
|
private int _pointerCb;
|
|
private int _pointerVm;
|
|
private int _rasterInterruptLine;
|
|
private int _rasterLine;
|
|
private int _rasterX;
|
|
private bool _rasterXHold;
|
|
private int _rc;
|
|
private int _refreshCounter;
|
|
private bool _renderEnabled;
|
|
private bool _rowSelect;
|
|
private bool _spriteBackgroundCollisionClearPending;
|
|
private bool _spriteSpriteCollisionClearPending;
|
|
private int _spriteMulticolor0;
|
|
private int _spriteMulticolor1;
|
|
private readonly Sprite _sprite0;
|
|
private readonly Sprite _sprite1;
|
|
private readonly Sprite _sprite2;
|
|
private readonly Sprite _sprite3;
|
|
private readonly Sprite _sprite4;
|
|
private readonly Sprite _sprite5;
|
|
private readonly Sprite _sprite6;
|
|
private readonly Sprite _sprite7;
|
|
private readonly Sprite[] _sprites;
|
|
private bool _vblank;
|
|
private int _vblankEnd;
|
|
private int _vblankStart;
|
|
private int _vc;
|
|
private int _vcbase;
|
|
private bool _vcEnable;
|
|
private int _vmli;
|
|
private int _xScroll;
|
|
private int _yScroll;
|
|
|
|
public void HardReset()
|
|
{
|
|
_backgroundColor0 = 0;
|
|
_backgroundColor1 = 0;
|
|
_backgroundColor2 = 0;
|
|
_backgroundColor3 = 0;
|
|
_ba = true;
|
|
_baCount = BaResetCounter;
|
|
_badline = false;
|
|
_badlineEnable = false;
|
|
_bitmapMode = false;
|
|
_borderCheckLEnable = false;
|
|
_borderCheckREnable = false;
|
|
_borderColor = 0;
|
|
_borderOnMain = true;
|
|
_borderOnVertical = true;
|
|
_bufOffset = 0;
|
|
_columnSelect = false;
|
|
_cycle = 0;
|
|
_cycleIndex = 0;
|
|
_dataC = 0;
|
|
_dataG = 0;
|
|
_displayEnable = false;
|
|
_enableIntLightPen = false;
|
|
_enableIntRaster = false;
|
|
_enableIntSpriteCollision = false;
|
|
_enableIntSpriteDataCollision = false;
|
|
_extraColorMode = false;
|
|
_idle = true;
|
|
_intLightPen = false;
|
|
_intRaster = false;
|
|
_intSpriteCollision = false;
|
|
_intSpriteDataCollision = false;
|
|
_irqBuffer = 0;
|
|
_lightPenX = 0;
|
|
_lightPenY = 0;
|
|
_multicolorMode = false;
|
|
_pinAec = true;
|
|
_pinBa = true;
|
|
_pointerCb = 0;
|
|
_pointerVm = 0;
|
|
_rasterInterruptLine = 0;
|
|
_rasterLine = 0;
|
|
_rasterX = 0;
|
|
_rasterXHold = false;
|
|
_rc = 7;
|
|
_refreshCounter = 0xFF;
|
|
_rowSelect = false;
|
|
_spriteBackgroundCollisionClearPending = false;
|
|
_spriteSpriteCollisionClearPending = false;
|
|
_spriteMulticolor0 = 0;
|
|
_spriteMulticolor1 = 0;
|
|
_vc = 0;
|
|
_vcbase = 0;
|
|
_vcEnable = false;
|
|
_vmli = 0;
|
|
_xScroll = 0;
|
|
_yScroll = 0;
|
|
|
|
// reset sprites
|
|
for (var i = 0; i < 8; i++)
|
|
{
|
|
_sprites[i].HardReset();
|
|
}
|
|
|
|
// clear C buffer
|
|
for (var i = 0; i < 40; i++)
|
|
{
|
|
_bufferC[i] = 0;
|
|
}
|
|
|
|
_pixBufferIndex = 0;
|
|
_pixBufferBorderIndex = 0;
|
|
UpdateBorder();
|
|
}
|
|
|
|
public void SyncState(Serializer ser)
|
|
{
|
|
ser.Sync(nameof(_ba), ref _ba);
|
|
ser.Sync(nameof(_backgroundColor0), ref _backgroundColor0);
|
|
ser.Sync(nameof(_backgroundColor1), ref _backgroundColor1);
|
|
ser.Sync(nameof(_backgroundColor2), ref _backgroundColor2);
|
|
ser.Sync(nameof(_backgroundColor3), ref _backgroundColor3);
|
|
ser.Sync(nameof(_baCount), ref _baCount);
|
|
ser.Sync(nameof(_badline), ref _badline);
|
|
ser.Sync(nameof(_badlineEnable), ref _badlineEnable);
|
|
ser.Sync(nameof(_bitmapMode), ref _bitmapMode);
|
|
ser.Sync(nameof(_borderB), ref _borderB);
|
|
ser.Sync(nameof(_borderCheckLEnable), ref _borderCheckLEnable);
|
|
ser.Sync(nameof(_borderCheckREnable), ref _borderCheckREnable);
|
|
ser.Sync(nameof(_borderColor), ref _borderColor);
|
|
ser.Sync(nameof(_borderL), ref _borderL);
|
|
ser.Sync(nameof(_borderOnMain), ref _borderOnMain);
|
|
ser.Sync(nameof(_borderOnShiftReg), ref _borderOnShiftReg);
|
|
ser.Sync(nameof(_borderOnVertical), ref _borderOnVertical);
|
|
ser.Sync(nameof(_borderR), ref _borderR);
|
|
ser.Sync(nameof(_borderT), ref _borderT);
|
|
ser.Sync(nameof(_bufferC), ref _bufferC, useNull: false);
|
|
ser.Sync(nameof(_bufOffset), ref _bufOffset);
|
|
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(_enableIntLightPen), ref _enableIntLightPen);
|
|
ser.Sync(nameof(_enableIntRaster), ref _enableIntRaster);
|
|
ser.Sync(nameof(_enableIntSpriteCollision), ref _enableIntSpriteCollision);
|
|
ser.Sync(nameof(_enableIntSpriteDataCollision), ref _enableIntSpriteDataCollision);
|
|
ser.Sync(nameof(_extraColorMode), ref _extraColorMode);
|
|
ser.Sync(nameof(_idle), ref _idle);
|
|
ser.Sync(nameof(_intLightPen), ref _intLightPen);
|
|
ser.Sync(nameof(_intRaster), ref _intRaster);
|
|
ser.Sync(nameof(_intSpriteCollision), ref _intSpriteCollision);
|
|
ser.Sync(nameof(_intSpriteDataCollision), ref _intSpriteDataCollision);
|
|
ser.Sync(nameof(_irqBuffer), ref _irqBuffer);
|
|
ser.Sync(nameof(_lightPenX), ref _lightPenX);
|
|
ser.Sync(nameof(_lightPenY), ref _lightPenY);
|
|
ser.Sync(nameof(_multicolorMode), ref _multicolorMode);
|
|
ser.Sync(nameof(_pinAec), ref _pinAec);
|
|
ser.Sync(nameof(_pinBa), ref _pinBa);
|
|
ser.Sync(nameof(_parseIsSprCrunch), ref _parseIsSprCrunch);
|
|
ser.Sync(nameof(_pixBorderBuffer), ref _pixBorderBuffer, useNull: false);
|
|
ser.Sync(nameof(_pixBufferBorderIndex), ref _pixBufferBorderIndex);
|
|
ser.Sync(nameof(_pixBuffer), ref _pixBuffer, useNull: false);
|
|
ser.Sync(nameof(_pixBufferIndex), ref _pixBufferIndex);
|
|
ser.Sync(nameof(_pointerCb), ref _pointerCb);
|
|
ser.Sync(nameof(_pointerVm), ref _pointerVm);
|
|
ser.Sync(nameof(_rasterInterruptLine), ref _rasterInterruptLine);
|
|
ser.Sync(nameof(_rasterLine), ref _rasterLine);
|
|
ser.Sync(nameof(_rasterX), ref _rasterX);
|
|
ser.Sync(nameof(_rasterXHold), ref _rasterXHold);
|
|
ser.Sync(nameof(_rc), ref _rc);
|
|
ser.Sync(nameof(_refreshCounter), ref _refreshCounter);
|
|
ser.Sync(nameof(_renderEnabled), ref _renderEnabled);
|
|
ser.Sync(nameof(_rowSelect), ref _rowSelect);
|
|
ser.Sync(nameof(_spriteBackgroundCollisionClearPending), ref _spriteBackgroundCollisionClearPending);
|
|
ser.Sync(nameof(_spriteSpriteCollisionClearPending), ref _spriteSpriteCollisionClearPending);
|
|
ser.Sync(nameof(_spriteMulticolor0), ref _spriteMulticolor0);
|
|
ser.Sync(nameof(_spriteMulticolor1), ref _spriteMulticolor1);
|
|
|
|
foreach (var sprite in _sprites)
|
|
{
|
|
ser.BeginSection($"Sprite{sprite.Index}");
|
|
sprite.SyncState(ser);
|
|
ser.EndSection();
|
|
}
|
|
|
|
ser.Sync(nameof(_vc), ref _vc);
|
|
ser.Sync(nameof(_vcbase), ref _vcbase);
|
|
ser.Sync(nameof(_vcEnable), ref _vcEnable);
|
|
ser.Sync(nameof(_videoMode), ref _videoMode);
|
|
ser.Sync(nameof(_vmli), ref _vmli);
|
|
ser.Sync(nameof(_xScroll), ref _xScroll);
|
|
ser.Sync(nameof(_yScroll), ref _yScroll);
|
|
|
|
if (ser.IsReader)
|
|
{
|
|
UpdateBorder();
|
|
UpdateVideoMode();
|
|
}
|
|
}
|
|
}
|
|
}
|