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:
CasualPokePlayer 2023-04-01 07:01:36 -07:00
parent e4a6d9db67
commit cd4c3cc353
12 changed files with 49 additions and 77 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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