2015-01-15 19:19:43 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
using BizHawk.Emulation.Common;
|
|
|
|
|
|
|
|
|
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|
|
|
|
{
|
|
|
|
|
public partial class NES
|
|
|
|
|
{
|
|
|
|
|
private MemoryDomainList _memoryDomains;
|
|
|
|
|
|
|
|
|
|
private void SetupMemoryDomains()
|
|
|
|
|
{
|
|
|
|
|
var domains = new List<MemoryDomain>();
|
|
|
|
|
var RAM = new MemoryDomain("RAM", 0x800, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => ram[addr], (addr, value) => ram[addr] = value);
|
|
|
|
|
var SystemBus = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
|
2015-01-18 15:25:47 +00:00
|
|
|
|
addr => PeekMemory((ushort)addr), (addr, value) => ApplySystemBusPoke((int)addr, value));
|
2015-01-15 19:19:43 +00:00
|
|
|
|
var PPUBus = new MemoryDomain("PPU Bus", 0x4000, MemoryDomain.Endian.Little,
|
2015-01-18 15:25:47 +00:00
|
|
|
|
addr => ppu.ppubus_peek((int)addr), (addr, value) => ppu.ppubus_write((int)addr, value));
|
2015-01-15 19:19:43 +00:00
|
|
|
|
var CIRAMdomain = new MemoryDomain("CIRAM (nametables)", 0x800, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => CIRAM[addr], (addr, value) => CIRAM[addr] = value);
|
|
|
|
|
var OAMdoman = new MemoryDomain("OAM", 64 * 4, MemoryDomain.Endian.Unknown,
|
|
|
|
|
addr => ppu.OAM[addr], (addr, value) => ppu.OAM[addr] = value);
|
|
|
|
|
|
|
|
|
|
domains.Add(RAM);
|
|
|
|
|
domains.Add(SystemBus);
|
|
|
|
|
domains.Add(PPUBus);
|
|
|
|
|
domains.Add(CIRAMdomain);
|
|
|
|
|
domains.Add(OAMdoman);
|
|
|
|
|
|
2015-01-17 21:02:59 +00:00
|
|
|
|
if (!(Board is FDS) && Board.SaveRam != null)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
2015-01-17 21:02:59 +00:00
|
|
|
|
var BatteryRam = new MemoryDomain("Battery RAM", Board.SaveRam.Length, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => Board.SaveRam[addr], (addr, value) => Board.SaveRam[addr] = value);
|
2015-01-15 19:19:43 +00:00
|
|
|
|
domains.Add(BatteryRam);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-25 16:17:59 +00:00
|
|
|
|
if (Board.ROM != null)
|
|
|
|
|
{
|
|
|
|
|
var PRGROM = new MemoryDomain("PRG ROM", cart.prg_size * 1024, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => Board.ROM[addr], (addr, value) => Board.ROM[addr] = value);
|
|
|
|
|
domains.Add(PRGROM);
|
|
|
|
|
}
|
2015-01-15 19:19:43 +00:00
|
|
|
|
|
2015-01-17 21:02:59 +00:00
|
|
|
|
if (Board.VROM != null)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
|
|
|
|
var CHRROM = new MemoryDomain("CHR VROM", cart.chr_size * 1024, MemoryDomain.Endian.Little,
|
2015-01-17 21:02:59 +00:00
|
|
|
|
addr => Board.VROM[addr], (addr, value) => Board.VROM[addr] = value);
|
2015-01-15 19:19:43 +00:00
|
|
|
|
domains.Add(CHRROM);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-17 21:02:59 +00:00
|
|
|
|
if (Board.VRAM != null)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
2015-01-17 21:02:59 +00:00
|
|
|
|
var VRAM = new MemoryDomain("VRAM", Board.VRAM.Length, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => Board.VRAM[addr], (addr, value) => Board.VRAM[addr] = value);
|
2015-01-15 19:19:43 +00:00
|
|
|
|
domains.Add(VRAM);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-17 21:02:59 +00:00
|
|
|
|
if (Board.WRAM != null)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
2015-01-17 21:02:59 +00:00
|
|
|
|
var WRAM = new MemoryDomain("WRAM", Board.WRAM.Length, MemoryDomain.Endian.Little,
|
|
|
|
|
addr => Board.WRAM[addr], (addr, value) => Board.WRAM[addr] = value);
|
2015-01-15 19:19:43 +00:00
|
|
|
|
domains.Add(WRAM);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if there were more boards with special ram sets, we'd want to do something more general
|
2015-01-17 21:02:59 +00:00
|
|
|
|
if (Board is FDS)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
2015-01-17 21:02:59 +00:00
|
|
|
|
domains.Add((Board as FDS).GetDiskPeeker());
|
2015-01-15 19:19:43 +00:00
|
|
|
|
}
|
2015-01-17 21:02:59 +00:00
|
|
|
|
else if (Board is ExROM)
|
2015-01-15 19:19:43 +00:00
|
|
|
|
{
|
2015-01-17 21:02:59 +00:00
|
|
|
|
domains.Add((Board as ExROM).GetExRAM());
|
2015-01-15 19:19:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_memoryDomains = new MemoryDomainList(domains);
|
|
|
|
|
(ServiceProvider as BasicServiceProvider).Register<IMemoryDomains>(_memoryDomains);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|