change some memory domains to exception out on out of range access instead of silent masking

This commit is contained in:
goyuken 2014-02-26 20:18:48 +00:00
parent d0aec59e55
commit 7a9eb9f6cb
10 changed files with 98 additions and 40 deletions

View File

@ -657,8 +657,8 @@ namespace BizHawk.Emulation.Cores.Calculators
"Main RAM",
ram.Length,
MemoryDomain.Endian.Little,
addr => ram[addr & RamSizeMask],
(addr, value) => ram[addr & RamSizeMask] = value
addr => ram[addr],
(addr, value) => ram[addr] = value
)
};

View File

@ -30,7 +30,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
var domains = new List<MemoryDomain>(1)
{
new MemoryDomain("Main RAM", 128, MemoryDomain.Endian.Little, addr => ram[addr & 127], (addr, value) => ram[addr & 127] = value),
new MemoryDomain("Main RAM", 128, MemoryDomain.Endian.Little, addr => ram[addr], (addr, value) => ram[addr] = value),
new MemoryDomain("TIA", 16, MemoryDomain.Endian.Little, addr => tia.ReadMemory((ushort) addr, true),
(addr, value) => tia.WriteMemory((ushort) addr, value)),
new MemoryDomain("PIA", 1024, MemoryDomain.Endian.Little, addr => m6532.ReadMemory((ushort) addr, true),

View File

@ -257,20 +257,28 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
"RAM1", 0x800, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
return ((Machine7800)theMachine).RAM1[(ushort)addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
((Machine7800)theMachine).RAM1[(ushort)addr] = val;
}));
_MemoryDomains.Add(new MemoryDomain(
"RAM2", 0x800, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
return ((Machine7800)theMachine).RAM2[(ushort)addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
((Machine7800)theMachine).RAM2[(ushort)addr] = val;
}));
_MemoryDomains.Add(new MemoryDomain(
@ -308,10 +316,14 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
"System Bus", 65536, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
if (addr < 0 || addr >= 0x10000)
throw new ArgumentOutOfRangeException();
return theMachine.Mem[(ushort)addr];
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= 0x10000)
throw new ArgumentOutOfRangeException();
theMachine.Mem[(ushort)addr] = val;
}));
}

View File

@ -57,14 +57,24 @@ namespace BizHawk.Emulation.Cores.ColecoVision
{
var domains = new List<MemoryDomain>(3);
var MainMemoryDomain = new MemoryDomain("Main RAM", Ram.Length, MemoryDomain.Endian.Little,
addr => Ram[addr & RamSizeMask],
(addr, value) => Ram[addr & RamSizeMask] = value);
addr => Ram[addr],
(addr, value) => Ram[addr] = value);
var VRamDomain = new MemoryDomain("Video RAM", VDP.VRAM.Length, MemoryDomain.Endian.Little,
addr => VDP.VRAM[addr & 0x3FFF],
(addr, value) => VDP.VRAM[addr & 0x3FFF] = value);
addr => VDP.VRAM[addr],
(addr, value) => VDP.VRAM[addr] = value);
var SystemBusDomain = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
addr => Cpu.ReadMemory((ushort)addr),
(addr, value) => Cpu.WriteMemory((ushort)addr, value));
(addr) =>
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return Cpu.ReadMemory((ushort)addr);
},
(addr, value) =>
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
Cpu.WriteMemory((ushort)addr, value);
});
domains.Add(MainMemoryDomain);
domains.Add(VRamDomain);

View File

@ -268,10 +268,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
MemoryDomain sb = new MemoryDomain("BUS", 1 << 28, MemoryDomain.Endian.Little,
delegate(int addr)
{
if (addr < 0 || addr >= 0x10000000)
throw new IndexOutOfRangeException();
return LibMeteor.libmeteor_peekbus((uint)addr);
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= 0x10000000)
throw new IndexOutOfRangeException();
LibMeteor.libmeteor_writebus((uint)addr, val);
});
_MemoryDomains.Add(sb);
@ -283,6 +287,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
MemoryDomain cr = new MemoryDomain("Combined WRAM", (256 + 32) * 1024, MemoryDomain.Endian.Little,
delegate(int addr)
{
if (addr < 0 || addr >= (256 + 32) * 1024)
throw new IndexOutOfRangeException();
if (addr >= 256 * 1024)
return iw.PeekByte(addr & 32767);
else
@ -290,6 +296,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= (256 + 32) * 1024)
throw new IndexOutOfRangeException();
if (addr >= 256 * 1024)
iw.PokeByte(addr & 32767, val);
else

View File

@ -604,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
System.Runtime.InteropServices.Marshal.Copy(data, CachedMemory, 0, length);
readneeded = false;
}
return CachedMemory[addr % CachedMemory.Length];
return CachedMemory[addr];
}
public void Poke(int addr, byte val)
{
@ -616,7 +616,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
System.Runtime.InteropServices.Marshal.Copy(data, CachedMemory, 0, length);
readneeded = false;
}
CachedMemory[addr % CachedMemory.Length] = val;
CachedMemory[addr] = val;
writeneeded = true;
}
}
@ -658,10 +658,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
_MemoryDomains.Add(new MemoryDomain("System Bus", 65536, MemoryDomain.Endian.Little,
delegate(int addr)
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return LibGambatte.gambatte_cpuread(GambatteState, (ushort)addr);
},
delegate(int addr, byte val)
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
LibGambatte.gambatte_cpuwrite(GambatteState, (ushort)addr, val);
}));

View File

@ -401,15 +401,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
{
var domains = new List<MemoryDomain>();
var RAM = new MemoryDomain("RAM", 0x800, MemoryDomain.Endian.Little,
addr => ram[addr & 0x07FF], (addr, value) => ram[addr & 0x07FF] = value);
addr => ram[addr], (addr, value) => ram[addr] = value);
var SystemBus = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
addr => ReadMemory((ushort)addr), (addr, value) => ApplySystemBusPoke(addr, value));
var PPUBus = new MemoryDomain("PPU Bus", 0x4000, MemoryDomain.Endian.Little,
addr => ppu.ppubus_peek(addr), (addr, value) => ppu.ppubus_write(addr, value));
var CIRAMdomain = new MemoryDomain("CIRAM (nametables)", 0x800, MemoryDomain.Endian.Little,
addr => CIRAM[addr & 0x07FF], (addr, value) => CIRAM[addr & 0x07FF] = value);
addr => CIRAM[addr], (addr, value) => CIRAM[addr] = value);
var OAMdoman = new MemoryDomain("OAM", 64 * 4, MemoryDomain.Endian.Unknown,
addr => ppu.OAM[addr & (64 * 4 - 1)], (addr, value) => ppu.OAM[addr & (64 * 4 - 1)] = value);
addr => ppu.OAM[addr], (addr, value) => ppu.OAM[addr] = value);
domains.Add(RAM);
domains.Add(SystemBus);

View File

@ -596,13 +596,23 @@ namespace BizHawk.Emulation.Cores.PCEngine
var domains = new List<MemoryDomain>(10);
int mainmemorymask = Ram.Length - 1;
var MainMemoryDomain = new MemoryDomain("Main Memory", Ram.Length, MemoryDomain.Endian.Little,
addr => Ram[addr & mainmemorymask],
(addr, value) => Ram[addr & mainmemorymask] = value);
addr => Ram[addr],
(addr, value) => Ram[addr] = value);
domains.Add(MainMemoryDomain);
var SystemBusDomain = new MemoryDomain("System Bus", 0x200000, MemoryDomain.Endian.Little,
addr => Cpu.ReadMemory21(addr),
(addr, value) => Cpu.WriteMemory21(addr, value));
(addr) =>
{
if (addr < 0 || addr >= 0x200000)
throw new ArgumentOutOfRangeException();
return Cpu.ReadMemory21(addr);
},
(addr, value) =>
{
if (addr < 0 || addr >= 0x200000)
throw new ArgumentOutOfRangeException();
Cpu.WriteMemory21(addr, value);
});
domains.Add(SystemBusDomain);
var RomDomain = new MemoryDomain("ROM", RomLength, MemoryDomain.Endian.Little,
@ -614,28 +624,28 @@ namespace BizHawk.Emulation.Cores.PCEngine
if (BRAM != null)
{
var BRAMMemoryDomain = new MemoryDomain("Battery RAM", Ram.Length, MemoryDomain.Endian.Little,
addr => BRAM[addr & 0x7FF],
(addr, value) => BRAM[addr & 0x7FF] = value);
addr => BRAM[addr],
(addr, value) => BRAM[addr] = value);
domains.Add(BRAMMemoryDomain);
}
if (TurboCD)
{
var CDRamMemoryDomain = new MemoryDomain("TurboCD RAM", CDRam.Length, MemoryDomain.Endian.Little,
addr => CDRam[addr & 0xFFFF],
(addr, value) => CDRam[addr & 0xFFFF] = value);
addr => CDRam[addr],
(addr, value) => CDRam[addr] = value);
domains.Add(CDRamMemoryDomain);
var AdpcmMemoryDomain = new MemoryDomain("ADPCM RAM", ADPCM.RAM.Length, MemoryDomain.Endian.Little,
addr => ADPCM.RAM[addr & 0xFFFF],
(addr, value) => ADPCM.RAM[addr & 0xFFFF] = value);
addr => ADPCM.RAM[addr],
(addr, value) => ADPCM.RAM[addr] = value);
domains.Add(AdpcmMemoryDomain);
if (SuperRam != null)
{
var SuperRamMemoryDomain = new MemoryDomain("Super System Card RAM", SuperRam.Length, MemoryDomain.Endian.Little,
addr => SuperRam[addr & 0x3FFFF],
(addr, value) => SuperRam[addr & 0x3FFFF] = value);
addr => SuperRam[addr],
(addr, value) => SuperRam[addr] = value);
domains.Add(SuperRamMemoryDomain);
}
}
@ -643,16 +653,16 @@ namespace BizHawk.Emulation.Cores.PCEngine
if (ArcadeCard)
{
var ArcadeRamMemoryDomain = new MemoryDomain("Arcade Card RAM", ArcadeRam.Length, MemoryDomain.Endian.Little,
addr => ArcadeRam[addr & 0x1FFFFF],
(addr, value) => ArcadeRam[addr & 0x1FFFFF] = value);
addr => ArcadeRam[addr],
(addr, value) => ArcadeRam[addr] = value);
domains.Add(ArcadeRamMemoryDomain);
}
if (PopulousRAM != null)
{
var PopulusRAMDomain = new MemoryDomain("Cart Battery RAM", PopulousRAM.Length, MemoryDomain.Endian.Little,
addr => PopulousRAM[addr & 0x7fff],
(addr, value) => PopulousRAM[addr & 0x7fff] = value);
addr => PopulousRAM[addr],
(addr, value) => PopulousRAM[addr] = value);
domains.Add(PopulusRAMDomain);
}

View File

@ -443,17 +443,27 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem
{
var domains = new List<MemoryDomain>(3);
var MainMemoryDomain = new MemoryDomain("Main RAM", SystemRam.Length, MemoryDomain.Endian.Little,
addr => SystemRam[addr & RamSizeMask],
(addr, value) => SystemRam[addr & RamSizeMask] = value);
addr => SystemRam[addr],
(addr, value) => SystemRam[addr] = value);
var VRamDomain = new MemoryDomain("Video RAM", Vdp.VRAM.Length, MemoryDomain.Endian.Little,
addr => Vdp.VRAM[addr & 0x3FFF],
(addr, value) => Vdp.VRAM[addr & 0x3FFF] = value);
addr => Vdp.VRAM[addr],
(addr, value) => Vdp.VRAM[addr] = value);
var SaveRamDomain = new MemoryDomain("Save RAM", SaveRAM.Length, MemoryDomain.Endian.Little,
addr => SaveRAM[addr % SaveRAM.Length],
(addr, value) => { SaveRAM[addr % SaveRAM.Length] = value; SaveRamModified = true; });
addr => SaveRAM[addr],
(addr, value) => { SaveRAM[addr] = value; SaveRamModified = true; });
var SystemBusDomain = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
addr => Cpu.ReadMemory((ushort)addr),
(addr, value) => Cpu.WriteMemory((ushort)addr, value));
(addr) =>
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return Cpu.ReadMemory((ushort)addr);
},
(addr, value) =>
{
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
Cpu.WriteMemory((ushort)addr, value);
});
domains.Add(MainMemoryDomain);
domains.Add(VRamDomain);

View File

@ -554,11 +554,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx
mm.Add(new MemoryDomain(name, size, MemoryDomain.Endian.Unknown,
delegate(int addr)
{
return p[addr & (size - 1)];
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
return p[addr];
},
delegate(int addr, byte val)
{
p[addr & (size - 1)] = val;
if (addr < 0 || addr >= size)
throw new ArgumentOutOfRangeException();
p[addr] = val;
}));
}