Essgee.Unity/Assets/Plugins/Essgee/Emulation/Cartridges/Sega/SegaSGCartridge.cs
2025-01-02 17:55:16 +08:00

96 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Essgee.Utilities;
namespace Essgee.Emulation.Cartridges.Sega
{
public class SegaSGCartridge : ICartridge
{
byte[] romData;
[StateRequired]
byte[] ramData;
[StateRequired]
readonly int romMask, ramMask;
public SegaSGCartridge(int romSize, int ramSize)
{
romData = new byte[romSize];
ramData = new byte[ramSize];
romMask = 1;
while (romMask < romSize) romMask <<= 1;
romMask -= 1;
ramMask = (ramSize - 1);
}
public void LoadRom(byte[] data)
{
Buffer.BlockCopy(data, 0, romData, 0, Math.Min(data.Length, romData.Length));
}
public void LoadRam(byte[] data)
{
Buffer.BlockCopy(data, 0, ramData, 0, Math.Min(data.Length, ramData.Length));
}
public byte[] GetRomData()
{
return romData;
}
public byte[] GetRamData()
{
return ramData;
}
public bool IsRamSaveNeeded()
{
return false;
}
public ushort GetLowerBound()
{
return 0x0000;
}
public ushort GetUpperBound()
{
return (ushort)((romData.Length + ramData.Length) - 1);
}
public void Step(int clockCyclesInStep)
{
/* Nothing to do */
}
public byte Read(ushort address)
{
if (ramData.Length > 0)
{
if (address < (romMask + 1))
return romData[address & romMask];
else
return ramData[address & ramMask];
}
else
{
return romData[address & romMask];
}
}
public void Write(ushort address, byte value)
{
if (ramData.Length > 0 && address >= (romMask + 1))
ramData[address & ramMask] = value;
}
}
}