示例#1
0
      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);
      }
示例#2
0
      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);
      }