public byte[] ReadRam(UIntPtr address, int length, EndiannessType endianness, bool absoluteAddress = false) { byte[] readBytes = new byte[length]; // Get local address uint localAddress; if (absoluteAddress) { localAddress = _io?.GetRelativeAddress(address, length) ?? 0; } else { localAddress = address.ToUInt32(); } localAddress &= ~0x80000000; if (EndiannessUtilities.DataIsMisaligned(address, length, EndiannessType.Big)) { return(readBytes); } /// Fix endianness switch (endianness) { case EndiannessType.Little: // Address is not little endian, fix: localAddress = EndiannessUtilities.SwapAddressEndianness(localAddress, length); if (localAddress + length > _ram.Length) { break; } Buffer.BlockCopy(_ram, (int)localAddress, readBytes, 0, length); break; case EndiannessType.Big: // Read padded if misaligned address byte[] swapBytes; uint alignedAddress = EndiannessUtilities.AlignedAddressFloor(localAddress); int alignedReadByteCount = (readBytes.Length / 4) * 4 + 8; swapBytes = new byte[alignedReadByteCount]; // Read memory Buffer.BlockCopy(_ram, (int)alignedAddress, swapBytes, 0, swapBytes.Length); swapBytes = EndiannessUtilities.SwapByteEndianness(swapBytes); // Copy memory Buffer.BlockCopy(swapBytes, (int)(localAddress - alignedAddress), readBytes, 0, readBytes.Length); break; } return(readBytes); }
public bool WriteRam(byte[] buffer, UIntPtr address, EndiannessType endianness, bool absoluteAddress = false, int bufferStart = 0, int?length = null, bool safeWrite = true) { if (length == null) { length = buffer.Length - bufferStart; } if (CheckReadonlyOff()) { return(false); } byte[] writeBytes = new byte[length.Value]; Array.Copy(buffer, bufferStart, writeBytes, 0, length.Value); // Attempt to pause the game before writing bool preSuspended = _io?.IsSuspended ?? false; if (safeWrite) { _io?.Suspend(); } if (EndiannessUtilities.DataIsMisaligned(address, length.Value, EndiannessType.Big)) { throw new Exception("Misaligned data"); } // Write memory to game/process bool result; if (absoluteAddress) { result = _io?.WriteAbsolute(address, writeBytes, endianness) ?? false; } else { result = _io?.WriteRelative(address.ToUInt32(), writeBytes, endianness) ?? false; } // Resume stream if (safeWrite && !preSuspended) { _io?.Resume(); } //FocusOnEmulator(); return(result); }