fix various C64 state issues
Main changes here would be with cartridges, as it appears cartridge stating was just broken since 4ffcc9654a
(that's all the way back in 1.13!!!) due to SyncStateInternal not actually getting used
a few other components also had some variables missing from states
disks are not properly savestated yet, it appears it was commented out due to an assumption that disks were write only, but this isn't the case
some other cleanups here, none of them actually affecting state quality here
This commit is contained in:
parent
e4a6d9db67
commit
cd4c3cc353
|
@ -350,23 +350,13 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64
|
|||
Serial.SyncState(ser);
|
||||
ser.EndSection();
|
||||
|
||||
if (TapeDrive != null) // TODO: a tape object is already in a nested class, is it the same reference? do we need this?
|
||||
{
|
||||
ser.BeginSection(nameof(TapeDrive));
|
||||
TapeDrive.SyncState(ser);
|
||||
ser.EndSection();
|
||||
}
|
||||
// TapeDrive is already saved within Cassette if it's around, don't state it here
|
||||
|
||||
ser.BeginSection(nameof(User));
|
||||
User.SyncState(ser);
|
||||
ser.EndSection();
|
||||
|
||||
if (DiskDrive != null) // TODO: a disk object is already in a nested class, is it the same reference? do we need this?
|
||||
{
|
||||
ser.BeginSection(nameof(DiskDrive));
|
||||
DiskDrive.SyncState(ser);
|
||||
ser.EndSection();
|
||||
}
|
||||
// DiskDrive is already saved within Serial if it's around, don't state it here
|
||||
|
||||
ser.Sync(nameof(InputRead), ref InputRead);
|
||||
ser.Sync(nameof(Irq), ref Irq);
|
||||
|
|
|
@ -225,7 +225,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
|
||||
protected abstract void SyncStateInternal(Serializer ser);
|
||||
|
||||
public virtual void SyncState(Serializer ser)
|
||||
public void SyncState(Serializer ser)
|
||||
{
|
||||
ser.Sync(nameof(pinExRom), ref pinExRom);
|
||||
ser.Sync(nameof(pinGame), ref pinGame);
|
||||
|
@ -235,6 +235,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
|
||||
ser.Sync(nameof(_driveLightEnabled), ref _driveLightEnabled);
|
||||
ser.Sync(nameof(_driveLightOn), ref _driveLightOn);
|
||||
|
||||
SyncStateInternal(ser);
|
||||
}
|
||||
|
||||
public bool Valid => validCartridge;
|
||||
|
|
|
@ -115,6 +115,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
ser.Sync("BankMask", ref _bankMask);
|
||||
ser.Sync("BankNumber", ref _bankNumber);
|
||||
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
|
||||
private void BankSet(int index)
|
||||
|
@ -159,14 +164,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
BankSet(val);
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,6 +41,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
ser.Sync("BankNumber", ref _bankNumber);
|
||||
ser.Sync("Disabled", ref _disabled);
|
||||
ser.Sync("Latchedvalue", ref _latchedval);
|
||||
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
|
||||
private void BankSet(int index)
|
||||
|
@ -95,14 +100,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
return _latchedval;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,7 +90,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
ser.Sync("BankMask", ref _bankMask);
|
||||
ser.Sync("BankNumber", ref _bankNumber);
|
||||
ser.Sync("CurrentBank", ref _currentBank, useNull: false);
|
||||
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
|
||||
protected void BankSet(int index)
|
||||
|
@ -130,16 +134,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
BankSet(addr);
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
ser.Sync(nameof(_bankMask), ref _bankMask);
|
||||
ser.Sync(nameof(_bankNumber), ref _bankNumber);
|
||||
base.SyncState(ser);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,8 +56,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
|
||||
protected override void SyncStateInternal(Serializer ser)
|
||||
{
|
||||
ser.Sync("BankHighSelected", ref _bankHighSelected, useNull: false);
|
||||
ser.Sync("BankIndex", ref _bankIndex);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
_bankHighSelected = _bankHigh[_bankIndex];
|
||||
}
|
||||
}
|
||||
|
||||
public override int Peek8000(int addr)
|
||||
|
@ -81,14 +84,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
return _bankHighSelected[addr];
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
_bankHighSelected = _bankHigh[_bankIndex];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -79,6 +79,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
ser.Sync("BankMask", ref _bankMask);
|
||||
ser.Sync("BankNumber", ref _bankNumber);
|
||||
ser.Sync("ROMEnable", ref _romEnable);
|
||||
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber | (_romEnable ? 0x00 : 0x80));
|
||||
}
|
||||
}
|
||||
|
||||
private void BankSet(int index)
|
||||
|
@ -128,14 +133,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
BankSet(val);
|
||||
}
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
if (ser.IsReader)
|
||||
{
|
||||
BankSet(_bankNumber | (_romEnable ? 0x00 : 0x80));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,8 +26,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
private int _bankOffset = 63 << 13;
|
||||
|
||||
private readonly int[] _banksA = new int[64 << 13]; // 8000
|
||||
private readonly int[] _banksB = new int[64 << 13]; // A000
|
||||
private int[] _banksA = new int[64 << 13]; // 8000
|
||||
private int[] _banksB = new int[64 << 13]; // A000
|
||||
|
||||
private readonly int[] _originalMediaA; // 8000
|
||||
private readonly int[] _originalMediaB; // A000
|
||||
|
@ -100,6 +100,9 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
ser.Sync("CommandLatch55", ref _commandLatchAa);
|
||||
ser.Sync("CommandLatchAA", ref _commandLatchAa);
|
||||
ser.Sync("InternalROMState", ref _internalRomState);
|
||||
SaveState.SyncDelta("MediaStateA", ser, _originalMediaA, ref _banksA);
|
||||
SaveState.SyncDelta("MediaStateB", ser, _originalMediaB, ref _banksB);
|
||||
DriveLightOn = _boardLed;
|
||||
}
|
||||
|
||||
private void BankSet(int index)
|
||||
|
@ -306,14 +309,5 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
|||
{
|
||||
_ram[addr] = val & 0xFF;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
// feos: drop 4MB of ROM data from savestates
|
||||
//SaveState.SyncDelta("MediaStateA", ser, _originalMediaA, ref _banksA);
|
||||
//SaveState.SyncDelta("MediaStateB", ser, _originalMediaB, ref _banksB);
|
||||
base.SyncState(ser);
|
||||
DriveLightOn = _boardLed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -559,10 +559,10 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
|
|||
ser.Sync(nameof(_newCra), ref _newCra);
|
||||
ser.Sync(nameof(_newCrb), ref _newCrb);
|
||||
ser.Sync(nameof(_flagLatch), ref _flagLatch);
|
||||
|
||||
ser.Sync(nameof(_todCounter), ref _todCounter);
|
||||
ser.Sync(nameof(_lastCnt), ref _lastCnt);
|
||||
ser.Sync(nameof(_thisCnt), ref _thisCnt);
|
||||
ser.Sync(nameof(_tbCntTaCnt), ref _tbCntTaCnt);
|
||||
ser.Sync(nameof(_todCounter), ref _todCounter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -188,6 +188,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
|
|||
ser.Sync(nameof(_enableIntSpriteCollision), ref _enableIntSpriteCollision);
|
||||
ser.Sync(nameof(_enableIntSpriteDataCollision), ref _enableIntSpriteDataCollision);
|
||||
ser.Sync(nameof(_extraColorMode), ref _extraColorMode);
|
||||
ser.Sync(nameof(_hblank), ref _hblank);
|
||||
ser.Sync(nameof(_idle), ref _idle);
|
||||
ser.Sync(nameof(_intLightPen), ref _intLightPen);
|
||||
ser.Sync(nameof(_intRaster), ref _intRaster);
|
||||
|
@ -214,6 +215,12 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.MOS
|
|||
ser.Sync(nameof(_refreshCounter), ref _refreshCounter);
|
||||
ser.Sync(nameof(_renderEnabled), ref _renderEnabled);
|
||||
ser.Sync(nameof(_rowSelect), ref _rowSelect);
|
||||
ser.Sync(nameof(_srColor0), ref _srColor0);
|
||||
ser.Sync(nameof(_srColor1), ref _srColor1);
|
||||
ser.Sync(nameof(_srColor2), ref _srColor2);
|
||||
ser.Sync(nameof(_srColor3), ref _srColor3);
|
||||
ser.Sync(nameof(_srColorEnable), ref _srColorEnable);
|
||||
ser.Sync(nameof(_srData1), ref _srData1);
|
||||
ser.Sync(nameof(_spriteBackgroundCollisionClearPending), ref _spriteBackgroundCollisionClearPending);
|
||||
ser.Sync(nameof(_spriteSpriteCollisionClearPending), ref _spriteSpriteCollisionClearPending);
|
||||
ser.Sync(nameof(_spriteMulticolor0), ref _spriteMulticolor0);
|
||||
|
|
|
@ -169,6 +169,11 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media
|
|||
{
|
||||
ser.Sync(nameof(WriteProtected), ref WriteProtected);
|
||||
|
||||
// cpp: the below comment is wrong (at least now), writes are implemented (see ExecuteFlux() in Drive1541)
|
||||
// I'm not yet going to uncomment this, due to the noted performance issues
|
||||
// Not sure where performance issues would truly lie, suppose it's probably due to new array spam
|
||||
// Something just a bit smarter would fix such issues
|
||||
|
||||
// Currently nothing actually writes to _tracks and so it is always the same as _originalMedia
|
||||
// So commenting out this (very slow) code for now
|
||||
// If/when disk writing is implemented, Disk.cs should implement ISaveRam as a means of file storage of the new disk state
|
||||
|
|
|
@ -56,9 +56,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Serial
|
|||
|
||||
public void SyncState(Serializer ser)
|
||||
{
|
||||
// feos: this is already saved by DiskDrive.SyncState(ser);
|
||||
//_device?.SyncState(ser);
|
||||
ser.Sync("Connected", ref _connected);
|
||||
_device?.SyncState(ser);
|
||||
}
|
||||
|
||||
public void Connect(SerialPortDevice device)
|
||||
|
|
Loading…
Reference in New Issue