From 5357291c3627c0e48c22db3b6f61d231f53b6600 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sat, 17 Nov 2018 02:01:31 -0200 Subject: [PATCH] Improved GPU command lists decoding (#499) * Better implementation of the DMA pusher, misc fixes * Remove some debug code * Correct RGBX8 format * Add support for linked Texture Sampler Control * Attempt to fix upside down screen issue --- Memory/MemoryManager.cs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Memory/MemoryManager.cs b/Memory/MemoryManager.cs index 308dd17..ef3fb00 100644 --- a/Memory/MemoryManager.cs +++ b/Memory/MemoryManager.cs @@ -409,9 +409,31 @@ namespace ChocolArm64.Memory public void WriteBytes(long position, byte[] data) { - EnsureRangeIsValid(position, (uint)data.Length); + long endAddr = position + data.Length; - Marshal.Copy(data, 0, (IntPtr)TranslateWrite(position), data.Length); + if ((ulong)endAddr < (ulong)position) + { + throw new ArgumentOutOfRangeException(nameof(position)); + } + + int offset = 0; + + while ((ulong)position < (ulong)endAddr) + { + long pageLimit = (position + PageSize) & ~(long)PageMask; + + if ((ulong)pageLimit > (ulong)endAddr) + { + pageLimit = endAddr; + } + + int copySize = (int)(pageLimit - position); + + Marshal.Copy(data, offset, (IntPtr)TranslateWrite(position), copySize); + + position += copySize; + offset += copySize; + } } public void WriteBytes(long position, byte[] data, int startIndex, int size)