aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Memory
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-10-26 14:50:52 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit8cba252b238ee6cf6599ad2fc57793e6f76c5e2e (patch)
tree5ee98eb374a46e210d4a960f5e1d58b42b3f27eb /ARMeilleure/Memory
parent1b7d95519569639135a68e7ebda5148f3263217c (diff)
Add per-source type memory change tracking, simplified state change tracking, other fixes
Diffstat (limited to 'ARMeilleure/Memory')
-rw-r--r--ARMeilleure/Memory/MemoryManager.cs20
1 files changed, 11 insertions, 9 deletions
diff --git a/ARMeilleure/Memory/MemoryManager.cs b/ARMeilleure/Memory/MemoryManager.cs
index 2bdbc309..c3f586aa 100644
--- a/ARMeilleure/Memory/MemoryManager.cs
+++ b/ARMeilleure/Memory/MemoryManager.cs
@@ -14,8 +14,6 @@ namespace ARMeilleure.Memory
public const int PageSize = 1 << PageBits;
public const int PageMask = PageSize - 1;
- private const long PteFlagNotModified = 1;
-
internal const long PteFlagsMask = 7;
public IntPtr Ram { get; private set; }
@@ -106,6 +104,11 @@ namespace ARMeilleure.Memory
ptr = (byte*)ptrUlong;
}
+ if (ptr == null)
+ {
+ return IntPtr.Zero;
+ }
+
return new IntPtr(ptr + (position & PageMask));
}
@@ -122,10 +125,7 @@ namespace ARMeilleure.Memory
if ((ptrUlong & PteFlagsMask) != 0)
{
- if ((ptrUlong & PteFlagNotModified) != 0)
- {
- ClearPtEntryFlag(position, PteFlagNotModified);
- }
+ ClearPtEntryFlag(position, PteFlagsMask);
ptrUlong &= ~(ulong)PteFlagsMask;
@@ -253,8 +253,10 @@ namespace ARMeilleure.Memory
return ptePtr;
}
- public unsafe (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size)
+ public unsafe (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, int id)
{
+ ulong idMask = 1UL << id;
+
List<(ulong, ulong)> ranges = new List<(ulong, ulong)>();
ulong endAddress = (address + size + PageMask) & ~(ulong)PageMask;
@@ -272,12 +274,12 @@ namespace ARMeilleure.Memory
ulong ptrUlong = (ulong)ptr;
- if ((ptrUlong & PteFlagNotModified) == 0)
+ if ((ptrUlong & idMask) == 0)
{
// Modified.
currSize += PageSize;
- SetPtEntryFlag((long)address, PteFlagNotModified);
+ SetPtEntryFlag((long)address, (long)idMask);
}
else
{