diff options
| author | gdk <gab.dark.100@gmail.com> | 2019-10-26 14:50:52 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | 8cba252b238ee6cf6599ad2fc57793e6f76c5e2e (patch) | |
| tree | 5ee98eb374a46e210d4a960f5e1d58b42b3f27eb /ARMeilleure/Memory | |
| parent | 1b7d95519569639135a68e7ebda5148f3263217c (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.cs | 20 |
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 { |
