mirror of https://github.com/Washi1337/Emux.git
44 lines
1.4 KiB
C#
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
|
|
}
|
|
}
|
|
}
|