Emux/Emux.GameBoy/Cartridge/RomOnlyBankController.cs

44 lines
1.4 KiB
C#

using System;
namespace Emux.GameBoy.Cartridge
{
public class RomOnlyBankController : IMemoryBankController
{
private readonly IFullyAccessibleCartridge _cartridge;
private readonly byte[] _ramBank;
private bool _ramEnabled = false;
public RomOnlyBankController(IFullyAccessibleCartridge cartridge)
{
if (cartridge == null)
throw new ArgumentNullException(nameof(cartridge));
_cartridge = cartridge;
if (cartridge.CartridgeType.HasRam())
_ramBank = new byte[0x2000];
}
public byte ReadByte(ushort address)
{
if (address < 0x8000)
return _cartridge.ReadFromAbsoluteAddress(address);
if (_ramEnabled && address >= 0xA000 && address <= 0xBFFF)
return _ramBank[address - 0xA000];
return 0;
}
public void ReadBytes(ushort address, byte[] buffer, int bufferOffset, int length)
{
if (address < 0x8000)
_cartridge.ReadFromAbsoluteAddress(address, buffer, bufferOffset, length);
if (_ramEnabled && address >= 0xA000 && address <= 0xBFFF)
Buffer.BlockCopy(_ramBank, address - 0xA000, buffer, bufferOffset, length);
}
public void WriteByte(ushort address, byte value)
{
// TODO: ram enable
}
}
}