BizHawk/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/Mapper0008.cs

109 lines
2.1 KiB
C#
Raw Normal View History

2017-05-30 17:09:46 +00:00
using System.Collections.Generic;
2017-05-18 20:18:49 +00:00
using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
{
internal sealed class Mapper0008 : CartridgeDevice
{
2017-05-30 17:09:46 +00:00
private readonly int[,] _banks = new int[4, 0x4000];
2017-05-18 20:18:49 +00:00
private int _bankMask;
private int _bankNumber;
private bool _disabled;
private int _latchedval;
// SuperGame mapper
// bank switching is done from DF00
public Mapper0008(IList<int[]> newData)
{
pinGame = false;
pinExRom = false;
_bankMask = 0x03;
_disabled = false;
_latchedval = 0;
// load data into the banks from the list
for (var j = 0; j < 4; j++)
{
for (var i = 0; i < 0x4000; i++)
{
2017-05-30 17:09:46 +00:00
_banks[j, i] = newData[j][i];
2017-05-18 20:18:49 +00:00
}
}
2017-05-30 17:09:46 +00:00
2017-05-18 20:18:49 +00:00
BankSet(0);
}
protected override void SyncStateInternal(Serializer ser)
{
ser.Sync("BankMask", ref _bankMask);
ser.Sync("BankNumber", ref _bankNumber);
ser.Sync("Disabled", ref _disabled);
ser.Sync("Latchedvalue", ref _latchedval);
}
2017-05-30 17:09:46 +00:00
private void BankSet(int index)
2017-05-18 20:18:49 +00:00
{
if (!_disabled)
{
_bankNumber = index & _bankMask;
pinExRom = (index & 0x4) > 0;
pinGame = (index & 0x4) > 0;
_disabled = (index & 0x8) > 0;
_latchedval = index;
}
}
public override int Peek8000(int addr)
{
return _banks[_bankNumber, addr];
}
public override int PeekA000(int addr)
{
return _banks[_bankNumber, addr + 0x2000];
}
public override void PokeDF00(int addr, int val)
{
if (addr == 0)
2017-05-30 17:09:46 +00:00
{
2017-05-18 20:18:49 +00:00
BankSet(val);
2017-05-30 17:09:46 +00:00
}
2017-05-18 20:18:49 +00:00
}
public override int Read8000(int addr)
{
return _banks[_bankNumber, addr];
}
public override int ReadA000(int addr)
{
return _banks[_bankNumber, addr + 0x2000];
}
public override void WriteDF00(int addr, int val)
{
if (addr == 0)
2017-05-30 17:09:46 +00:00
{
2017-05-18 20:18:49 +00:00
BankSet(val);
2017-05-30 17:09:46 +00:00
}
2017-05-18 20:18:49 +00:00
}
public override int ReadDF00(int addr)
{
return _latchedval;
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
if (ser.IsReader)
2017-05-30 17:09:46 +00:00
{
2017-05-18 20:18:49 +00:00
BankSet(_bankNumber);
2017-05-30 17:09:46 +00:00
}
2017-05-18 20:18:49 +00:00
}
}
}