149 lines
3.0 KiB
C#
149 lines
3.0 KiB
C#
using System.Collections.Generic;
|
|
using BizHawk.Emulation.Common;
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.GBHawk
|
|
{
|
|
public partial class GBHawk
|
|
{
|
|
private IMemoryDomains MemoryDomains;
|
|
|
|
public void SetupMemoryDomains()
|
|
{
|
|
var domains = new List<MemoryDomain>
|
|
{
|
|
new MemoryDomainDelegate(
|
|
"WRAM",
|
|
RAM.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekRAM(addr),
|
|
(addr, value) => RAM[addr] = value,
|
|
1),
|
|
new MemoryDomainDelegate(
|
|
"ROM",
|
|
_rom.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => _rom[addr],
|
|
(addr, value) => _rom[addr] = value,
|
|
1),
|
|
new MemoryDomainDelegate(
|
|
"VRAM",
|
|
VRAM.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekVRAM(addr),
|
|
(addr, value) => VRAM[addr] = value,
|
|
1),
|
|
new MemoryDomainDelegate(
|
|
"OAM",
|
|
OAM.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekOAM(addr),
|
|
(addr, value) => OAM[addr] = value,
|
|
1),
|
|
new MemoryDomainDelegate(
|
|
"HRAM",
|
|
ZP_RAM.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekHRAM(addr),
|
|
(addr, value) => ZP_RAM[addr] = value,
|
|
1),
|
|
new MemoryDomainDelegate(
|
|
"System Bus",
|
|
0X10000,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekSystemBus(addr),
|
|
(addr, value) => PokeSystemBus(addr, value),
|
|
1),
|
|
};
|
|
|
|
if (cart_RAM != null)
|
|
{
|
|
var CartRam = new MemoryDomainDelegate(
|
|
"CartRAM",
|
|
cart_RAM.Length,
|
|
MemoryDomain.Endian.Little,
|
|
addr => PeekCART(addr),
|
|
(addr, value) => cart_RAM[addr] = value,
|
|
1);
|
|
domains.Add(CartRam);
|
|
}
|
|
|
|
MemoryDomains = new MemoryDomainList(domains);
|
|
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(MemoryDomains);
|
|
}
|
|
|
|
private byte PeekRAM(long addr)
|
|
{
|
|
ushort addr2 = (ushort)(addr & 0x7FFF);
|
|
if (_settings.VBL_sync)
|
|
{
|
|
return RAM_vbls[addr2];
|
|
}
|
|
return RAM[addr2];
|
|
}
|
|
|
|
private byte PeekVRAM(long addr)
|
|
{
|
|
ushort addr2 = (ushort)(addr & 0x3FFF);
|
|
if (_settings.VBL_sync)
|
|
{
|
|
return VRAM_vbls[addr2];
|
|
}
|
|
return VRAM[addr2];
|
|
}
|
|
|
|
private byte PeekHRAM(long addr)
|
|
{
|
|
ushort addr2 = (ushort)(addr & 0x7F);
|
|
if (_settings.VBL_sync)
|
|
{
|
|
return ZP_RAM_vbls[addr2];
|
|
}
|
|
return ZP_RAM[addr2];
|
|
}
|
|
|
|
private byte PeekOAM(long addr)
|
|
{
|
|
if (addr < 0xA0)
|
|
{
|
|
if (_settings.VBL_sync)
|
|
{
|
|
return OAM_vbls[addr];
|
|
}
|
|
return OAM[addr];
|
|
}
|
|
return 0xFF;
|
|
}
|
|
|
|
private byte PeekCART(long addr)
|
|
{
|
|
if (cart_RAM != null)
|
|
{
|
|
if (addr < cart_RAM.Length)
|
|
{
|
|
if (_settings.VBL_sync)
|
|
{
|
|
return cart_RAM_vbls[addr];
|
|
}
|
|
return cart_RAM[addr];
|
|
}
|
|
|
|
return 0xFF;
|
|
}
|
|
|
|
return 0xFF;
|
|
}
|
|
|
|
private byte PeekSystemBus(long addr)
|
|
{
|
|
ushort addr2 = (ushort)(addr & 0xFFFF);
|
|
return PeekMemory(addr2);
|
|
}
|
|
|
|
private void PokeSystemBus(long addr, byte value)
|
|
{
|
|
ushort addr2 = (ushort)(addr & 0xFFFF);
|
|
WriteMemory(addr2, value);
|
|
}
|
|
}
|
|
}
|