From d2bb458b51bbcbc097f8f53ac2a3b8b15a723a45 Mon Sep 17 00:00:00 2001 From: gdkchan <gab.dark.100@gmail.com> Date: Sat, 17 Nov 2018 02:01:31 -0200 Subject: 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 --- ChocolArm64/Memory/MemoryManager.cs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'ChocolArm64/Memory/MemoryManager.cs') diff --git a/ChocolArm64/Memory/MemoryManager.cs b/ChocolArm64/Memory/MemoryManager.cs index 308dd17e..ef3fb006 100644 --- a/ChocolArm64/Memory/MemoryManager.cs +++ b/ChocolArm64/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) -- cgit v1.2.3-70-g09d2