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", "Main RAM",
ram.Length, ram.Length,
MemoryDomain.Endian.Little, MemoryDomain.Endian.Little,
addr => ram[addr & RamSizeMask], addr => ram[addr],
(addr, value) => ram[addr & RamSizeMask] = value (addr, value) => ram[addr] = value
) )
}; };

View File

@ -30,7 +30,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
var domains = new List<MemoryDomain>(1) 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), new MemoryDomain("TIA", 16, MemoryDomain.Endian.Little, addr => tia.ReadMemory((ushort) addr, true),
(addr, value) => tia.WriteMemory((ushort) addr, value)), (addr, value) => tia.WriteMemory((ushort) addr, value)),
new MemoryDomain("PIA", 1024, MemoryDomain.Endian.Little, addr => m6532.ReadMemory((ushort) addr, true), 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, "RAM1", 0x800, MemoryDomain.Endian.Unknown,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
return ((Machine7800)theMachine).RAM1[(ushort)addr]; return ((Machine7800)theMachine).RAM1[(ushort)addr];
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
((Machine7800)theMachine).RAM1[(ushort)addr] = val; ((Machine7800)theMachine).RAM1[(ushort)addr] = val;
})); }));
_MemoryDomains.Add(new MemoryDomain( _MemoryDomains.Add(new MemoryDomain(
"RAM2", 0x800, MemoryDomain.Endian.Unknown, "RAM2", 0x800, MemoryDomain.Endian.Unknown,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
return ((Machine7800)theMachine).RAM2[(ushort)addr]; return ((Machine7800)theMachine).RAM2[(ushort)addr];
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= 0x800)
throw new ArgumentOutOfRangeException();
((Machine7800)theMachine).RAM2[(ushort)addr] = val; ((Machine7800)theMachine).RAM2[(ushort)addr] = val;
})); }));
_MemoryDomains.Add(new MemoryDomain( _MemoryDomains.Add(new MemoryDomain(
@ -308,10 +316,14 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800
"System Bus", 65536, MemoryDomain.Endian.Unknown, "System Bus", 65536, MemoryDomain.Endian.Unknown,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= 0x10000)
throw new ArgumentOutOfRangeException();
return theMachine.Mem[(ushort)addr]; return theMachine.Mem[(ushort)addr];
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= 0x10000)
throw new ArgumentOutOfRangeException();
theMachine.Mem[(ushort)addr] = val; theMachine.Mem[(ushort)addr] = val;
})); }));
} }

View File

@ -57,14 +57,24 @@ namespace BizHawk.Emulation.Cores.ColecoVision
{ {
var domains = new List<MemoryDomain>(3); var domains = new List<MemoryDomain>(3);
var MainMemoryDomain = new MemoryDomain("Main RAM", Ram.Length, MemoryDomain.Endian.Little, var MainMemoryDomain = new MemoryDomain("Main RAM", Ram.Length, MemoryDomain.Endian.Little,
addr => Ram[addr & RamSizeMask], addr => Ram[addr],
(addr, value) => Ram[addr & RamSizeMask] = value); (addr, value) => Ram[addr] = value);
var VRamDomain = new MemoryDomain("Video RAM", VDP.VRAM.Length, MemoryDomain.Endian.Little, var VRamDomain = new MemoryDomain("Video RAM", VDP.VRAM.Length, MemoryDomain.Endian.Little,
addr => VDP.VRAM[addr & 0x3FFF], addr => VDP.VRAM[addr],
(addr, value) => VDP.VRAM[addr & 0x3FFF] = value); (addr, value) => VDP.VRAM[addr] = value);
var SystemBusDomain = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little, var SystemBusDomain = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
addr => Cpu.ReadMemory((ushort)addr), (addr) =>
(addr, value) => Cpu.WriteMemory((ushort)addr, value)); {
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(MainMemoryDomain);
domains.Add(VRamDomain); 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, MemoryDomain sb = new MemoryDomain("BUS", 1 << 28, MemoryDomain.Endian.Little,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= 0x10000000)
throw new IndexOutOfRangeException();
return LibMeteor.libmeteor_peekbus((uint)addr); return LibMeteor.libmeteor_peekbus((uint)addr);
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= 0x10000000)
throw new IndexOutOfRangeException();
LibMeteor.libmeteor_writebus((uint)addr, val); LibMeteor.libmeteor_writebus((uint)addr, val);
}); });
_MemoryDomains.Add(sb); _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, MemoryDomain cr = new MemoryDomain("Combined WRAM", (256 + 32) * 1024, MemoryDomain.Endian.Little,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= (256 + 32) * 1024)
throw new IndexOutOfRangeException();
if (addr >= 256 * 1024) if (addr >= 256 * 1024)
return iw.PeekByte(addr & 32767); return iw.PeekByte(addr & 32767);
else else
@ -290,6 +296,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= (256 + 32) * 1024)
throw new IndexOutOfRangeException();
if (addr >= 256 * 1024) if (addr >= 256 * 1024)
iw.PokeByte(addr & 32767, val); iw.PokeByte(addr & 32767, val);
else else

View File

@ -604,7 +604,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
System.Runtime.InteropServices.Marshal.Copy(data, CachedMemory, 0, length); System.Runtime.InteropServices.Marshal.Copy(data, CachedMemory, 0, length);
readneeded = false; readneeded = false;
} }
return CachedMemory[addr % CachedMemory.Length]; return CachedMemory[addr];
} }
public void Poke(int addr, byte val) 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); System.Runtime.InteropServices.Marshal.Copy(data, CachedMemory, 0, length);
readneeded = false; readneeded = false;
} }
CachedMemory[addr % CachedMemory.Length] = val; CachedMemory[addr] = val;
writeneeded = true; writeneeded = true;
} }
} }
@ -658,10 +658,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy
_MemoryDomains.Add(new MemoryDomain("System Bus", 65536, MemoryDomain.Endian.Little, _MemoryDomains.Add(new MemoryDomain("System Bus", 65536, MemoryDomain.Endian.Little,
delegate(int addr) delegate(int addr)
{ {
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
return LibGambatte.gambatte_cpuread(GambatteState, (ushort)addr); return LibGambatte.gambatte_cpuread(GambatteState, (ushort)addr);
}, },
delegate(int addr, byte val) delegate(int addr, byte val)
{ {
if (addr < 0 || addr >= 65536)
throw new ArgumentOutOfRangeException();
LibGambatte.gambatte_cpuwrite(GambatteState, (ushort)addr, val); 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 domains = new List<MemoryDomain>();
var RAM = new MemoryDomain("RAM", 0x800, MemoryDomain.Endian.Little, 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, var SystemBus = new MemoryDomain("System Bus", 0x10000, MemoryDomain.Endian.Little,
addr => ReadMemory((ushort)addr), (addr, value) => ApplySystemBusPoke(addr, value)); addr => ReadMemory((ushort)addr), (addr, value) => ApplySystemBusPoke(addr, value));
var PPUBus = new MemoryDomain("PPU Bus", 0x4000, MemoryDomain.Endian.Little, var PPUBus = new MemoryDomain("PPU Bus", 0x4000, MemoryDomain.Endian.Little,
addr => ppu.ppubus_peek(addr), (addr, value) => ppu.ppubus_write(addr, value)); addr => ppu.ppubus_peek(addr), (addr, value) => ppu.ppubus_write(addr, value));
var CIRAMdomain = new MemoryDomain("CIRAM (nametables)", 0x800, MemoryDomain.Endian.Little, 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, 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(RAM);
domains.Add(SystemBus); domains.Add(SystemBus);

View File

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

View File

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