diff --git a/.gitignore b/.gitignore
index 2c346b0..1addfc4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,5 @@ packages/
Thumbs.db
Desktop.ini
ehthumbs.db
+
+.vs/
diff --git a/global.json b/global.json
index 363e974..abe5820 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "10.0.103",
- "rollForward": "disable"
+ "rollForward": "latestFeature"
}
}
diff --git a/src/SharpEmu.CLI/SharpEmu.CLI.csproj b/src/SharpEmu.CLI/SharpEmu.CLI.csproj
index 67e373c..30864ab 100644
--- a/src/SharpEmu.CLI/SharpEmu.CLI.csproj
+++ b/src/SharpEmu.CLI/SharpEmu.CLI.csproj
@@ -38,6 +38,10 @@ SPDX-License-Identifier: GPL-2.0-or-later
..\..\assets\images\SharpEmu.ico
+
+ $(NoWarn);1591
+
+
Always
diff --git a/src/SharpEmu.CLI/packages.lock.json b/src/SharpEmu.CLI/packages.lock.json
index 1020cc1..7fda4d1 100644
--- a/src/SharpEmu.CLI/packages.lock.json
+++ b/src/SharpEmu.CLI/packages.lock.json
@@ -4,9 +4,9 @@
"net10.0": {
"Microsoft.NET.ILLink.Tasks": {
"type": "Direct",
- "requested": "[10.0.3, )",
- "resolved": "10.0.3",
- "contentHash": "0B6nZyCHWXnvmlB559oduOspVdNOnpNXPjhpWVMovLPAsDVG7A4jJR9rzECf67JUzxP8/ee/wA8clwIzJcWNFA=="
+ "requested": "[10.0.9, )",
+ "resolved": "10.0.9",
+ "contentHash": "4Iw41e2h7I4t70SJcX2GCmbyKJIlA273Cfm9RJMM050/3VBejGAG1KcthP5Z2L6SQcbfbf6BhNWO26+ZG+GzMg=="
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
diff --git a/src/SharpEmu.Core/Cpu/CpuDispatcher.cs b/src/SharpEmu.Core/Cpu/CpuDispatcher.cs
index 11d85cf..0fd08c5 100644
--- a/src/SharpEmu.Core/Cpu/CpuDispatcher.cs
+++ b/src/SharpEmu.Core/Cpu/CpuDispatcher.cs
@@ -415,8 +415,8 @@ public sealed class CpuDispatcher : ICpuDispatcher, IDisposable
const ulong entryParamsSize = 0x20;
var entryParamsAddress = AlignDown(argv0Address - entryParamsSize, 16);
- if (!TryWriteUInt32(context, entryParamsAddress + 0x00, 1) ||
- !TryWriteUInt32(context, entryParamsAddress + 0x04, 0) ||
+ if (!context.TryWriteUInt32(entryParamsAddress + 0x00, 1) ||
+ !context.TryWriteUInt32(entryParamsAddress + 0x04, 0) ||
!context.TryWriteUInt64(entryParamsAddress + 0x08, argv0Address) ||
!context.TryWriteUInt64(entryParamsAddress + 0x10, 0) ||
!context.TryWriteUInt64(entryParamsAddress + 0x18, 0))
@@ -456,13 +456,6 @@ public sealed class CpuDispatcher : ICpuDispatcher, IDisposable
return value & ~(alignment - 1);
}
- private static bool TryWriteUInt32(CpuContext context, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return context.Memory.TryWrite(address, buffer);
- }
-
private static string BuildEntryFrameDiagnostic(
ulong entryPoint,
CpuContext context,
diff --git a/src/SharpEmu.Core/SharpEmu.Core.csproj b/src/SharpEmu.Core/SharpEmu.Core.csproj
index 024ce13..ff67632 100644
--- a/src/SharpEmu.Core/SharpEmu.Core.csproj
+++ b/src/SharpEmu.Core/SharpEmu.Core.csproj
@@ -1,4 +1,4 @@
-
@@ -14,6 +14,10 @@ SPDX-License-Identifier: GPL-2.0-or-later
+
+ $(NoWarn);1591
+
+
true
diff --git a/src/SharpEmu.HLE/CpuContext.cs b/src/SharpEmu.HLE/CpuContext.cs
index 70f71c7..b65546a 100644
--- a/src/SharpEmu.HLE/CpuContext.cs
+++ b/src/SharpEmu.HLE/CpuContext.cs
@@ -2,25 +2,20 @@
// SPDX-License-Identifier: GPL-2.0-or-later
using System.Buffers.Binary;
+using System.Text;
namespace SharpEmu.HLE;
-public sealed class CpuContext
+public sealed class CpuContext(ICpuMemory memory, Generation generation)
{
private readonly ulong[] _registers = new ulong[16];
private readonly ulong[] _xmmRegisters = new ulong[32];
private readonly ulong[] _ymmUpperRegisters = new ulong[32];
private bool _raxWritten;
- public CpuContext(ICpuMemory memory, Generation generation)
- {
- Memory = memory ?? throw new ArgumentNullException(nameof(memory));
- TargetGeneration = generation;
- }
+ public ICpuMemory Memory { get; } = memory ?? throw new ArgumentNullException(nameof(memory));
- public ICpuMemory Memory { get; }
-
- public Generation TargetGeneration { get; }
+ public Generation TargetGeneration { get; } = generation;
public ulong Rip { get; set; }
@@ -130,6 +125,39 @@ public sealed class CpuContext
SetYmmUpper(registerIndex, highLow, highHigh);
}
+ public bool TryReadByte(ulong address, out byte value)
+ {
+ Span buffer = stackalloc byte[1];
+ if (!Memory.TryRead(address, buffer))
+ {
+ value = 0;
+ return false;
+ }
+
+ value = buffer[0];
+ return true;
+ }
+
+ public bool TryReadUInt32(ulong address, out uint value)
+ {
+ Span buffer = stackalloc byte[sizeof(uint)];
+ if (!Memory.TryRead(address, buffer))
+ {
+ value = 0;
+ return false;
+ }
+
+ value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
+ return true;
+ }
+
+ public bool TryWriteUInt32(ulong address, uint value)
+ {
+ Span buffer = stackalloc byte[sizeof(uint)];
+ BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
+ return Memory.TryWrite(address, buffer);
+ }
+
public bool TryReadUInt64(ulong address, out ulong value)
{
Span buffer = stackalloc byte[sizeof(ulong)];
@@ -150,6 +178,33 @@ public sealed class CpuContext
return Memory.TryWrite(address, buffer);
}
+ public bool TryReadNullTerminatedUtf8(ulong address, int capacity, out string value)
+ {
+ value = string.Empty;
+ if (address == 0 || capacity <= 0)
+ {
+ return false;
+ }
+
+ var bytes = new byte[capacity];
+ for (var index = 0; index < bytes.Length; index++)
+ {
+ if (!Memory.TryRead(address + (ulong)index, bytes.AsSpan(index, 1)))
+ {
+ return false;
+ }
+
+ if (bytes[index] == 0)
+ {
+ value = Encoding.UTF8.GetString(bytes, 0, index);
+ return true;
+ }
+ }
+
+ value = Encoding.UTF8.GetString(bytes);
+ return true;
+ }
+
public bool PushUInt64(ulong value)
{
var rsp = this[CpuRegister.Rsp];
diff --git a/src/SharpEmu.HLE/SharpEmu.HLE.csproj b/src/SharpEmu.HLE/SharpEmu.HLE.csproj
index 9693cb6..96cfce3 100644
--- a/src/SharpEmu.HLE/SharpEmu.HLE.csproj
+++ b/src/SharpEmu.HLE/SharpEmu.HLE.csproj
@@ -8,6 +8,10 @@ SPDX-License-Identifier: GPL-2.0-or-later
true
+
+ $(NoWarn);1591
+
+
diff --git a/src/SharpEmu.Libs/Agc/AgcExports.cs b/src/SharpEmu.Libs/Agc/AgcExports.cs
index b466e72..1ce98b6 100644
--- a/src/SharpEmu.Libs/Agc/AgcExports.cs
+++ b/src/SharpEmu.Libs/Agc/AgcExports.cs
@@ -442,8 +442,8 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadUInt32(ctx, headerAddress, out var fileHeader) ||
- !TryReadUInt32(ctx, headerAddress + sizeof(uint), out var version))
+ if (!ctx.TryReadUInt32(headerAddress, out var fileHeader) ||
+ !ctx.TryReadUInt32(headerAddress + sizeof(uint), out var version))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -465,7 +465,7 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
- if (!TryReadUInt64(ctx, headerAddress + ShaderUserDataOffset, out var userDataAddress))
+ if (!ctx.TryReadUInt64(headerAddress + ShaderUserDataOffset, out var userDataAddress))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -567,8 +567,8 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadByte(ctx, geometryShaderAddress + ShaderTypeOffset, out var shaderType) || !IsEsGeometryShaderType(shaderType) ||
- !TryReadUInt64(ctx, geometryShaderAddress + ShaderSpecialsOffset, out var specialsAddress) ||
+ if (!ctx.TryReadByte(geometryShaderAddress + ShaderTypeOffset, out var shaderType) || !IsEsGeometryShaderType(shaderType) ||
+ !ctx.TryReadUInt64(geometryShaderAddress + ShaderSpecialsOffset, out var specialsAddress) ||
specialsAddress == 0)
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
@@ -578,8 +578,8 @@ public static class AgcExports
!CopyShaderRegister(ctx, specialsAddress + ShaderSpecialVgtGsOutPrimTypeOffset, cxRegistersAddress + 8) ||
!CopyShaderRegister(ctx, specialsAddress + ShaderSpecialGeCntlOffset, ucRegistersAddress) ||
!CopyShaderRegister(ctx, specialsAddress + ShaderSpecialGeUserVgprEnOffset, ucRegistersAddress + 8) ||
- !TryWriteUInt32(ctx, ucRegistersAddress + 16, VgtPrimitiveType) ||
- !TryWriteUInt32(ctx, ucRegistersAddress + 20, primitiveType))
+ !ctx.TryWriteUInt32(ucRegistersAddress + 16, VgtPrimitiveType) ||
+ !ctx.TryWriteUInt32(ucRegistersAddress + 20, primitiveType))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -605,16 +605,16 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadUInt64(ctx, geometryShaderAddress + ShaderOutputSemanticsOffset, out var outputSemanticsAddress) ||
- !TryReadUInt32(ctx, geometryShaderAddress + ShaderNumOutputSemanticsOffset, out var outputSemanticsCount))
+ if (!ctx.TryReadUInt64(geometryShaderAddress + ShaderOutputSemanticsOffset, out var outputSemanticsAddress) ||
+ !ctx.TryReadUInt32(geometryShaderAddress + ShaderNumOutputSemanticsOffset, out var outputSemanticsCount))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
ulong inputSemanticsAddress = 0;
if (pixelShaderAddress != 0 &&
- (!TryReadUInt64(ctx, pixelShaderAddress + ShaderInputSemanticsOffset, out inputSemanticsAddress) ||
- !TryReadUInt32(ctx, pixelShaderAddress + ShaderNumInputSemanticsOffset, out _)))
+ (!ctx.TryReadUInt64(pixelShaderAddress + ShaderInputSemanticsOffset, out inputSemanticsAddress) ||
+ !ctx.TryReadUInt32(pixelShaderAddress + ShaderNumInputSemanticsOffset, out _)))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -626,7 +626,7 @@ public static class AgcExports
{
var flat = false;
if (pixelShaderAddress != 0 && inputSemanticsAddress != 0 &&
- TryReadUInt32(ctx, inputSemanticsAddress + (i * sizeof(uint)), out var inputSemantic))
+ ctx.TryReadUInt32(inputSemanticsAddress + (i * sizeof(uint)), out var inputSemantic))
{
flat = ((inputSemantic >> 22) & 0x1) != 0;
}
@@ -635,8 +635,8 @@ public static class AgcExports
}
var destination = registersAddress + (i * 8);
- if (!TryWriteUInt32(ctx, destination, SpiPsInputCntl0 + i) ||
- !TryWriteUInt32(ctx, destination + sizeof(uint), value))
+ if (!ctx.TryWriteUInt32(destination, SpiPsInputCntl0 + i) ||
+ !ctx.TryWriteUInt32(destination + sizeof(uint), value))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -665,7 +665,7 @@ public static class AgcExports
var payloadAddress = commandAddress + 8;
if (type == 0)
{
- if (!TryReadUInt32(ctx, commandAddress, out var header))
+ if (!ctx.TryReadUInt32(commandAddress, out var header))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -706,14 +706,14 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, dwordCount, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(dwordCount, ItNop, RZero)))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(dwordCount, ItNop, RZero)))
{
return ReturnPointer(ctx, 0);
}
for (uint index = 1; index < dwordCount; index++)
{
- if (!TryWriteUInt32(ctx, commandAddress + ((ulong)index * sizeof(uint)), 0))
+ if (!ctx.TryWriteUInt32(commandAddress + ((ulong)index * sizeof(uint)), 0))
{
return ReturnPointer(ctx, 0);
}
@@ -736,11 +736,11 @@ public static class AgcExports
var modifier = (uint)ctx[CpuRegister.R8];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(5, ItDispatchDirect, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, groupCountX) ||
- !TryWriteUInt32(ctx, commandAddress + 8, groupCountY) ||
- !TryWriteUInt32(ctx, commandAddress + 12, groupCountZ) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (modifier & 0xA038u) | 0x41u))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(5, ItDispatchDirect, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, groupCountX) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, groupCountY) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, groupCountZ) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (modifier & 0xA038u) | 0x41u))
{
return ReturnPointer(ctx, 0);
}
@@ -772,8 +772,8 @@ public static class AgcExports
for (uint index = 0; index < registerCount; index++)
{
var entryAddress = registersAddress + ((ulong)index * 8);
- if (!TryReadUInt32(ctx, entryAddress, out var offset) ||
- !TryReadUInt32(ctx, entryAddress + sizeof(uint), out var value))
+ if (!ctx.TryReadUInt32(entryAddress, out var offset) ||
+ !ctx.TryReadUInt32(entryAddress + sizeof(uint), out var value))
{
return ReturnPointer(ctx, 0);
}
@@ -796,8 +796,8 @@ public static class AgcExports
var valueCount = (uint)(endIndex - startIndex);
var packetDwords = valueCount + 2;
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, packetDwords, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItSetShReg, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, registers[startIndex].Offset & 0xFFFFu))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItSetShReg, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, registers[startIndex].Offset & 0xFFFFu))
{
return ReturnPointer(ctx, 0);
}
@@ -805,8 +805,7 @@ public static class AgcExports
firstCommandAddress = firstCommandAddress == 0 ? commandAddress : firstCommandAddress;
for (var index = startIndex; index < endIndex; index++)
{
- if (!TryWriteUInt32(
- ctx,
+ if (!ctx.TryWriteUInt32(
commandAddress + 8 + ((ulong)(index - startIndex) * sizeof(uint)),
registers[index].Value))
{
@@ -830,8 +829,8 @@ public static class AgcExports
var commandBufferAddress = ctx[CpuRegister.Rdi];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItNop, RAcbReset)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, 0))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItNop, RAcbReset)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -857,15 +856,15 @@ public static class AgcExports
var hasAddress = (eventType & ~1u) == 0x38;
var packetDwords = hasAddress ? 4u : 2u;
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, packetDwords, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItEventWrite, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, hasAddress ? eventType | 0x100u : eventType & 0x3Fu))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItEventWrite, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, hasAddress ? eventType | 0x100u : eventType & 0x3Fu))
{
return ReturnPointer(ctx, 0);
}
if (hasAddress &&
- (!TryWriteUInt32(ctx, commandAddress + 8, (uint)eventAddress & ~7u) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(eventAddress >> 32))))
+ (!ctx.TryWriteUInt32(commandAddress + 8, (uint)eventAddress & ~7u) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(eventAddress >> 32))))
{
return ReturnPointer(ctx, 0);
}
@@ -896,14 +895,14 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 8, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(8, ItNop, RAcquireMem)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, 0x8000_0000u) ||
- !TryWriteUInt32(ctx, commandAddress + 8, noSize ? 0 : (uint)(sizeBytes >> 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (uint)(baseAddress >> 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 24, pollCycles / 40) ||
- !TryWriteUInt32(ctx, commandAddress + 28, gcrControl))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(8, ItNop, RAcquireMem)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, 0x8000_0000u) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, noSize ? 0 : (uint)(sizeBytes >> 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (uint)(baseAddress >> 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, pollCycles / 40) ||
+ !ctx.TryWriteUInt32(commandAddress + 28, gcrControl))
{
return ReturnPointer(ctx, 0);
}
@@ -925,8 +924,8 @@ public static class AgcExports
var address = ctx[CpuRegister.R8];
var reference = ctx[CpuRegister.R9];
var stackAddress = ctx[CpuRegister.Rsp];
- if (!TryReadUInt64(ctx, stackAddress + sizeof(ulong), out var mask) ||
- !TryReadUInt32(ctx, stackAddress + (2 * sizeof(ulong)), out var pollCycles) ||
+ if (!ctx.TryReadUInt64(stackAddress + sizeof(ulong), out var mask) ||
+ !ctx.TryReadUInt32(stackAddress + (2 * sizeof(ulong)), out var pollCycles) ||
commandBufferAddress == 0 ||
size > 1 ||
compareFunction > 7 ||
@@ -938,27 +937,27 @@ public static class AgcExports
var packetDwords = size == 0 ? 6u : 9u;
var packetRegister = size == 0 ? RWaitMem32 : RWaitMem64;
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, packetDwords, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItNop, packetRegister)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, (uint)address) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)(address >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)mask))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItNop, packetRegister)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, (uint)address) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)(address >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)mask))
{
return ReturnPointer(ctx, 0);
}
if (size == 0)
{
- if (!TryWriteUInt32(ctx, commandAddress + 16, compareFunction) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)reference))
+ if (!ctx.TryWriteUInt32(commandAddress + 16, compareFunction) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)reference))
{
return ReturnPointer(ctx, 0);
}
}
- else if (!TryWriteUInt32(ctx, commandAddress + 16, (uint)(mask >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)reference) ||
- !TryWriteUInt32(ctx, commandAddress + 24, (uint)(reference >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 28, compareFunction) ||
- !TryWriteUInt32(ctx, commandAddress + 32, pollCycles / 40))
+ else if (!ctx.TryWriteUInt32(commandAddress + 16, (uint)(mask >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)reference) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, (uint)(reference >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 28, compareFunction) ||
+ !ctx.TryWriteUInt32(commandAddress + 32, pollCycles / 40))
{
return ReturnPointer(ctx, 0);
}
@@ -986,10 +985,10 @@ public static class AgcExports
var modifier = (uint)ctx[CpuRegister.Rdx];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 4, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(4, ItDispatchIndirect, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, (uint)argumentsAddress) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)(argumentsAddress >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (modifier & 0xA038u) | 0x41u))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(4, ItDispatchIndirect, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, (uint)argumentsAddress) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)(argumentsAddress >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (modifier & 0xA038u) | 0x41u))
{
return ReturnPointer(ctx, 0);
}
@@ -1014,11 +1013,11 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var markerAddress) ||
- !TryWriteUInt32(ctx, markerAddress, Pm4(2, ItNop, RZero)) ||
- !TryWriteUInt32(ctx, markerAddress + 4, CbSetShRegisterRangeMarker) ||
+ !ctx.TryWriteUInt32(markerAddress, Pm4(2, ItNop, RZero)) ||
+ !ctx.TryWriteUInt32(markerAddress + 4, CbSetShRegisterRangeMarker) ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, valueCount + 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(valueCount + 2, ItSetShReg, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, offset))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(valueCount + 2, ItSetShReg, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, offset))
{
return ReturnPointer(ctx, 0);
}
@@ -1027,12 +1026,12 @@ public static class AgcExports
{
var value = 0u;
if (valuesAddress != 0 &&
- !TryReadUInt32(ctx, valuesAddress + (i * sizeof(uint)), out value))
+ !ctx.TryReadUInt32(valuesAddress + (i * sizeof(uint)), out value))
{
return ReturnPointer(ctx, 0);
}
- if (!TryWriteUInt32(ctx, commandAddress + 8 + (i * sizeof(uint)), value))
+ if (!ctx.TryWriteUInt32(commandAddress + 8 + (i * sizeof(uint)), value))
{
return ReturnPointer(ctx, 0);
}
@@ -1056,12 +1055,12 @@ public static class AgcExports
var cachePolicy = (uint)(ctx[CpuRegister.R8] & 0xFF);
var destinationAddress = ctx[CpuRegister.R9];
var stackAddress = ctx[CpuRegister.Rsp];
- if (!TryReadUInt64(ctx, stackAddress + 8, out var dataSelectionRaw) ||
- !TryReadUInt64(ctx, stackAddress + 16, out var data) ||
- !TryReadUInt64(ctx, stackAddress + 24, out var gdsOffsetRaw) ||
- !TryReadUInt64(ctx, stackAddress + 32, out var gdsSizeRaw) ||
- !TryReadUInt64(ctx, stackAddress + 40, out var interruptRaw) ||
- !TryReadUInt64(ctx, stackAddress + 48, out var interruptContextIdRaw))
+ if (!ctx.TryReadUInt64(stackAddress + 8, out var dataSelectionRaw) ||
+ !ctx.TryReadUInt64(stackAddress + 16, out var data) ||
+ !ctx.TryReadUInt64(stackAddress + 24, out var gdsOffsetRaw) ||
+ !ctx.TryReadUInt64(stackAddress + 32, out var gdsSizeRaw) ||
+ !ctx.TryReadUInt64(stackAddress + 40, out var interruptRaw) ||
+ !ctx.TryReadUInt64(stackAddress + 48, out var interruptContextIdRaw))
{
return ReturnPointer(ctx, 0);
}
@@ -1082,17 +1081,16 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 8, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(8, ItNop, RReleaseMem)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, action | (cachePolicy << 8)) ||
- !TryWriteUInt32(
- ctx,
+ !ctx.TryWriteUInt32(commandAddress, Pm4(8, ItNop, RReleaseMem)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, action | (cachePolicy << 8)) ||
+ !ctx.TryWriteUInt32(
commandAddress + 8,
gcrControl | (dataSelection << 16) | (interrupt << 24)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)destinationAddress) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (uint)(destinationAddress >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)data) ||
- !TryWriteUInt32(ctx, commandAddress + 24, (uint)(data >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 28, interruptContextId))
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)destinationAddress) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (uint)(destinationAddress >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)data) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, (uint)(data >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 28, interruptContextId))
{
return ReturnPointer(ctx, 0);
}
@@ -1119,8 +1117,8 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItNop, RDrawReset)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, 0))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItNop, RDrawReset)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -1169,8 +1167,8 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItIndexType, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, indexSize))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItIndexType, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, indexSize))
{
return ReturnPointer(ctx, 0);
}
@@ -1194,8 +1192,8 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItNumInstances, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, instanceCount))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItNumInstances, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, instanceCount))
{
return ReturnPointer(ctx, 0);
}
@@ -1222,21 +1220,21 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var baseCommand) ||
- !TryWriteUInt32(ctx, baseCommand, Pm4(3, ItIndexBase, 0)) ||
- !TryWriteUInt32(ctx, baseCommand + 4, (uint)indexAddress) ||
- !TryWriteUInt32(ctx, baseCommand + 8, (uint)(indexAddress >> 32)) ||
- !TryWriteUInt32(ctx, baseCommand + 12, Pm4(2, ItIndexBufferSize, 0)) ||
- !TryWriteUInt32(ctx, baseCommand + 16, indexCount))
+ !ctx.TryWriteUInt32(baseCommand, Pm4(3, ItIndexBase, 0)) ||
+ !ctx.TryWriteUInt32(baseCommand + 4, (uint)indexAddress) ||
+ !ctx.TryWriteUInt32(baseCommand + 8, (uint)(indexAddress >> 32)) ||
+ !ctx.TryWriteUInt32(baseCommand + 12, Pm4(2, ItIndexBufferSize, 0)) ||
+ !ctx.TryWriteUInt32(baseCommand + 16, indexCount))
{
return ReturnPointer(ctx, 0);
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var drawCommand) ||
- !TryWriteUInt32(ctx, drawCommand, Pm4(5, ItDrawIndex2, 0)) ||
- !TryWriteUInt32(ctx, drawCommand + 4, indexCount) ||
- !TryWriteUInt32(ctx, drawCommand + 8, 0) ||
- !TryWriteUInt32(ctx, drawCommand + 12, 0) ||
- !TryWriteUInt32(ctx, drawCommand + 16, 0))
+ !ctx.TryWriteUInt32(drawCommand, Pm4(5, ItDrawIndex2, 0)) ||
+ !ctx.TryWriteUInt32(drawCommand + 4, indexCount) ||
+ !ctx.TryWriteUInt32(drawCommand + 8, 0) ||
+ !ctx.TryWriteUInt32(drawCommand + 12, 0) ||
+ !ctx.TryWriteUInt32(drawCommand + 16, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -1265,13 +1263,13 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 7, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(7, ItNop, RDrawIndexAuto)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, indexCount) ||
- !TryWriteUInt32(ctx, commandAddress + 8, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 12, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 16, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 20, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 24, 0))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(7, ItNop, RDrawIndexAuto)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, indexCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -1305,8 +1303,8 @@ public static class AgcExports
var control = (uint)ctx[CpuRegister.Rcx];
var counterMask = (uint)ctx[CpuRegister.R8] & 0xFFu;
var resetCounters = (uint)ctx[CpuRegister.R9] & 0x1u;
- if (!TryReadUInt64(ctx, ctx[CpuRegister.Rsp] + sizeof(ulong), out var enableRaw) ||
- !TryReadUInt64(ctx, ctx[CpuRegister.Rsp] + (2 * sizeof(ulong)), out var counterSelectRaw) ||
+ if (!ctx.TryReadUInt64(ctx[CpuRegister.Rsp] + sizeof(ulong), out var enableRaw) ||
+ !ctx.TryReadUInt64(ctx[CpuRegister.Rsp] + (2 * sizeof(ulong)), out var counterSelectRaw) ||
commandBufferAddress == 0)
{
return ReturnPointer(ctx, 0);
@@ -1321,11 +1319,11 @@ public static class AgcExports
(counterMask << 10) |
(counterSelect << 2);
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(5, ItGetLodStats, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, control) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)destinationAddress & ~0x3Fu) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(destinationAddress >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 16, packetControl))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(5, ItGetLodStats, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, control) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)destinationAddress & ~0x3Fu) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(destinationAddress >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, packetControl))
{
return ReturnPointer(ctx, 0);
}
@@ -1352,8 +1350,8 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItEventWrite, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, eventType))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItEventWrite, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, eventType))
{
return ReturnPointer(ctx, 0);
}
@@ -1375,7 +1373,7 @@ public static class AgcExports
var gcrControl = (uint)ctx[CpuRegister.Rcx];
var baseAddress = ctx[CpuRegister.R8];
var sizeBytes = ctx[CpuRegister.R9];
- if (!TryReadUInt32(ctx, ctx[CpuRegister.Rsp] + sizeof(ulong), out var pollCycles))
+ if (!ctx.TryReadUInt32(ctx[CpuRegister.Rsp] + sizeof(ulong), out var pollCycles))
{
return ReturnPointer(ctx, 0);
}
@@ -1392,14 +1390,14 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 8, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(8, ItNop, RAcquireMem)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, (engine << 31) | cbDbOp) ||
- !TryWriteUInt32(ctx, commandAddress + 8, noSize ? 0 : (uint)(sizeBytes >> 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (uint)(baseAddress >> 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 24, pollCycles / 40) ||
- !TryWriteUInt32(ctx, commandAddress + 28, gcrControl))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(8, ItNop, RAcquireMem)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, (engine << 31) | cbDbOp) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, noSize ? 0 : (uint)(sizeBytes >> 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (uint)(baseAddress >> 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, pollCycles / 40) ||
+ !ctx.TryWriteUInt32(commandAddress + 28, gcrControl))
{
return ReturnPointer(ctx, 0);
}
@@ -1424,8 +1422,8 @@ public static class AgcExports
var dataAddress = ctx[CpuRegister.R8];
var dwordCount = (uint)ctx[CpuRegister.R9];
var stackAddress = ctx[CpuRegister.Rsp];
- if (!TryReadUInt64(ctx, stackAddress + sizeof(ulong), out var incrementRaw) ||
- !TryReadUInt64(ctx, stackAddress + (2 * sizeof(ulong)), out var writeConfirmRaw))
+ if (!ctx.TryReadUInt64(stackAddress + sizeof(ulong), out var incrementRaw) ||
+ !ctx.TryReadUInt64(stackAddress + (2 * sizeof(ulong)), out var writeConfirmRaw))
{
return ReturnPointer(ctx, 0);
}
@@ -1442,21 +1440,20 @@ public static class AgcExports
var packetDwords = dwordCount + 4;
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, packetDwords, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItNop, RWriteData)) ||
- !TryWriteUInt32(
- ctx,
+ !ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItNop, RWriteData)) ||
+ !ctx.TryWriteUInt32(
commandAddress + 4,
destination | (cachePolicy << 8) | (increment << 16) | (writeConfirm << 24)) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)destinationAddress) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(destinationAddress >> 32)))
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)destinationAddress) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(destinationAddress >> 32)))
{
return ReturnPointer(ctx, 0);
}
for (uint index = 0; index < dwordCount; index++)
{
- if (!TryReadUInt32(ctx, dataAddress + ((ulong)index * sizeof(uint)), out var value) ||
- !TryWriteUInt32(ctx, commandAddress + 16 + ((ulong)index * sizeof(uint)), value))
+ if (!ctx.TryReadUInt32(dataAddress + ((ulong)index * sizeof(uint)), out var value) ||
+ !ctx.TryWriteUInt32(commandAddress + 16 + ((ulong)index * sizeof(uint)), value))
{
return ReturnPointer(ctx, 0);
}
@@ -1487,9 +1484,9 @@ public static class AgcExports
var cachePolicy = (uint)(ctx[CpuRegister.R8] & 0xFF);
var address = ctx[CpuRegister.R9];
var stackAddress = ctx[CpuRegister.Rsp];
- if (!TryReadUInt64(ctx, stackAddress + sizeof(ulong), out var reference) ||
- !TryReadUInt64(ctx, stackAddress + (2 * sizeof(ulong)), out var mask) ||
- !TryReadUInt32(ctx, stackAddress + (3 * sizeof(ulong)), out var pollCycles))
+ if (!ctx.TryReadUInt64(stackAddress + sizeof(ulong), out var reference) ||
+ !ctx.TryReadUInt64(stackAddress + (2 * sizeof(ulong)), out var mask) ||
+ !ctx.TryReadUInt32(stackAddress + (3 * sizeof(ulong)), out var pollCycles))
{
return ReturnPointer(ctx, 0);
}
@@ -1513,37 +1510,37 @@ public static class AgcExports
if (standardWait)
{
- if (!TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItWaitRegMem, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, compareFunction | ((operation & 1) << 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)address) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(address >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (uint)reference) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)mask) ||
- !TryWriteUInt32(ctx, commandAddress + 24, pollCycles / 40))
+ if (!ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItWaitRegMem, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, compareFunction | ((operation & 1) << 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)address) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(address >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (uint)reference) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)mask) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, pollCycles / 40))
{
return ReturnPointer(ctx, 0);
}
}
- else if (!TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItNop, packetRegister)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, (uint)address) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)(address >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)mask))
+ else if (!ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItNop, packetRegister)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, (uint)address) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)(address >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)mask))
{
return ReturnPointer(ctx, 0);
}
else if (size == 0)
{
- if (!TryWriteUInt32(ctx, commandAddress + 16, compareFunction | (operation << 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)reference))
+ if (!ctx.TryWriteUInt32(commandAddress + 16, compareFunction | (operation << 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)reference))
{
return ReturnPointer(ctx, 0);
}
}
- else if (!TryWriteUInt32(ctx, commandAddress + 16, (uint)(mask >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)reference) ||
- !TryWriteUInt32(ctx, commandAddress + 24, (uint)(reference >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 28, compareFunction | (operation << 8)) ||
- !TryWriteUInt32(ctx, commandAddress + 32, pollCycles / 40))
+ else if (!ctx.TryWriteUInt32(commandAddress + 16, (uint)(mask >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)reference) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, (uint)(reference >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 28, compareFunction | (operation << 8)) ||
+ !ctx.TryWriteUInt32(commandAddress + 32, pollCycles / 40))
{
return ReturnPointer(ctx, 0);
}
@@ -1573,12 +1570,12 @@ public static class AgcExports
var destinationAddress = ctx[CpuRegister.R8];
var sourceCachePolicy = (uint)(ctx[CpuRegister.R9] & 0xFF);
var stackAddress = ctx[CpuRegister.Rsp];
- if (!TryReadUInt64(ctx, stackAddress + sizeof(ulong), out var control4Raw) ||
- !TryReadUInt64(ctx, stackAddress + (2 * sizeof(ulong)), out var sourceAddress) ||
- !TryReadUInt32(ctx, stackAddress + (3 * sizeof(ulong)), out var byteCount) ||
- !TryReadUInt64(ctx, stackAddress + (4 * sizeof(ulong)), out var control7Raw) ||
- !TryReadUInt64(ctx, stackAddress + (5 * sizeof(ulong)), out var control8Raw) ||
- !TryReadUInt64(ctx, stackAddress + (6 * sizeof(ulong)), out var control9Raw))
+ if (!ctx.TryReadUInt64(stackAddress + sizeof(ulong), out var control4Raw) ||
+ !ctx.TryReadUInt64(stackAddress + (2 * sizeof(ulong)), out var sourceAddress) ||
+ !ctx.TryReadUInt32(stackAddress + (3 * sizeof(ulong)), out var byteCount) ||
+ !ctx.TryReadUInt64(stackAddress + (4 * sizeof(ulong)), out var control7Raw) ||
+ !ctx.TryReadUInt64(stackAddress + (5 * sizeof(ulong)), out var control8Raw) ||
+ !ctx.TryReadUInt64(stackAddress + (6 * sizeof(ulong)), out var control9Raw))
{
return ReturnPointer(ctx, 0);
}
@@ -1593,19 +1590,17 @@ public static class AgcExports
var control8 = (uint)(control8Raw & 0xFF);
var control9 = (uint)(control9Raw & 0xFF);
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 8, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(8, ItNop, RDmaData)) ||
- !TryWriteUInt32(
- ctx,
+ !ctx.TryWriteUInt32(commandAddress, Pm4(8, ItNop, RDmaData)) ||
+ !ctx.TryWriteUInt32(
commandAddress + 4,
destination |
(destinationCachePolicy << 8) |
(source << 16) |
(sourceCachePolicy << 24)) ||
- !TryWriteUInt32(
- ctx,
+ !ctx.TryWriteUInt32(
commandAddress + 8,
control4 | (control7 << 8) | (control8 << 16) | (control9 << 24)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, byteCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, byteCount) ||
!ctx.TryWriteUInt64(commandAddress + 16, destinationAddress) ||
!ctx.TryWriteUInt64(commandAddress + 24, sourceAddress))
{
@@ -1631,10 +1626,10 @@ public static class AgcExports
var address = ctx[CpuRegister.Rdx];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 4, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(4, ItSetBase, 0) | (baseIndex << 1)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, 1) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)address & ~7u) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(address >> 32)))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(4, ItSetBase, 0) | (baseIndex << 1)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, 1) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)address & ~7u) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(address >> 32)))
{
return ReturnPointer(ctx, 0);
}
@@ -1654,9 +1649,9 @@ public static class AgcExports
var modifier = (uint)ctx[CpuRegister.Rdx];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 3, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(3, ItDispatchIndirect, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, dataOffset) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (modifier & 0xA038u) | 0x41u))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(3, ItDispatchIndirect, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, dataOffset) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (modifier & 0xA038u) | 0x41u))
{
return ReturnPointer(ctx, 0);
}
@@ -1682,7 +1677,7 @@ public static class AgcExports
var payloadDwords = Math.Max(((uint)marker.Length + 4) / 4, 1);
var packetDwords = payloadDwords + 1;
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, packetDwords, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(packetDwords, ItNop, RPushMarker)))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(packetDwords, ItNop, RPushMarker)))
{
return ReturnPointer(ctx, 0);
}
@@ -1699,7 +1694,7 @@ public static class AgcExports
}
}
- if (!TryWriteUInt32(ctx, commandAddress + 4 + ((ulong)index * sizeof(uint)), value))
+ if (!ctx.TryWriteUInt32(commandAddress + 4 + ((ulong)index * sizeof(uint)), value))
{
return ReturnPointer(ctx, 0);
}
@@ -1718,8 +1713,8 @@ public static class AgcExports
var commandBufferAddress = ctx[CpuRegister.Rdi];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 2, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(2, ItNop, RPopMarker)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, 0))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(2, ItNop, RPopMarker)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -1814,11 +1809,11 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(3, ItIndexBase, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, (uint)(indexBufferAddress & 0xFFFF_FFFFUL)) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)(indexBufferAddress >> 32)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, Pm4(2, ItIndexBufferSize, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 16, indexCount))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(3, ItIndexBase, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, (uint)(indexBufferAddress & 0xFFFF_FFFFUL)) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)(indexBufferAddress >> 32)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, Pm4(2, ItIndexBufferSize, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, indexCount))
{
return ReturnPointer(ctx, 0);
}
@@ -1844,11 +1839,11 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 5, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(5, ItDrawIndexOffset2, 0)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, indexCount) ||
- !TryWriteUInt32(ctx, commandAddress + 8, indexOffset) ||
- !TryWriteUInt32(ctx, commandAddress + 12, indexCount) ||
- !TryWriteUInt32(ctx, commandAddress + 16, flags & 0xE000_0001u))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(5, ItDrawIndexOffset2, 0)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, indexCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, indexOffset) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, indexCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, flags & 0xE000_0001u))
{
return ReturnPointer(ctx, 0);
}
@@ -1873,13 +1868,13 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 7, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(7, ItNop, RWaitFlipDone)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, videoOutHandle) ||
- !TryWriteUInt32(ctx, commandAddress + 8, displayBufferIndex) ||
- !TryWriteUInt32(ctx, commandAddress + 12, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 16, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 20, 0) ||
- !TryWriteUInt32(ctx, commandAddress + 24, 0))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(7, ItNop, RWaitFlipDone)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, videoOutHandle) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, displayBufferIndex) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, 0) ||
+ !ctx.TryWriteUInt32(commandAddress + 24, 0))
{
return ReturnPointer(ctx, 0);
}
@@ -1906,12 +1901,12 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 6, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(6, ItNop, RFlip)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, videoOutHandle) ||
- !TryWriteUInt32(ctx, commandAddress + 8, unchecked((uint)displayBufferIndex)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, flipMode) ||
- !TryWriteUInt32(ctx, commandAddress + 16, (uint)(flipArg & 0xFFFF_FFFFUL)) ||
- !TryWriteUInt32(ctx, commandAddress + 20, (uint)(flipArg >> 32)))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(6, ItNop, RFlip)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, videoOutHandle) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, unchecked((uint)displayBufferIndex)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, flipMode) ||
+ !ctx.TryWriteUInt32(commandAddress + 16, (uint)(flipArg & 0xFFFF_FFFFUL)) ||
+ !ctx.TryWriteUInt32(commandAddress + 20, (uint)(flipArg >> 32)))
{
return ReturnPointer(ctx, 0);
}
@@ -1973,8 +1968,8 @@ public static class AgcExports
{
var packetAddress = ctx[CpuRegister.Rdi];
if (packetAddress == 0 ||
- !TryReadUInt64(ctx, packetAddress, out var commandAddress) ||
- !TryReadUInt32(ctx, packetAddress + 8, out var dwordCount))
+ !ctx.TryReadUInt64(packetAddress, out var commandAddress) ||
+ !ctx.TryReadUInt32(packetAddress + 8, out var dwordCount))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
@@ -2013,8 +2008,8 @@ public static class AgcExports
var ownerHandle = (uint)ctx[CpuRegister.Rdi];
var packetAddress = ctx[CpuRegister.Rsi];
if (packetAddress == 0 ||
- !TryReadUInt64(ctx, packetAddress, out var commandAddress) ||
- !TryReadUInt32(ctx, packetAddress + 8, out var dwordCount))
+ !ctx.TryReadUInt64(packetAddress, out var commandAddress) ||
+ !ctx.TryReadUInt32(packetAddress + 8, out var dwordCount))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
@@ -2065,7 +2060,7 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryWriteUInt32(ctx, outAddress, 256))
+ if (!ctx.TryWriteUInt32(outAddress, 256))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -2089,7 +2084,7 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryWriteUInt32(ctx, ownerAddress, DefaultAgcOwner))
+ if (!ctx.TryWriteUInt32(ownerAddress, DefaultAgcOwner))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -2155,7 +2150,7 @@ public static class AgcExports
var commandBufferAddress = ctx[CpuRegister.Rdi];
if (commandBufferAddress == 0 ||
!TryAllocateCommandDwords(ctx, commandBufferAddress, 1, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, 0x8000_0000))
+ !ctx.TryWriteUInt32(commandAddress, 0x8000_0000))
{
return ReturnPointer(ctx, 0);
}
@@ -2183,7 +2178,7 @@ public static class AgcExports
while (offset < dwordCount)
{
var currentAddress = commandAddress + ((ulong)offset * sizeof(uint));
- if (!TryReadUInt32(ctx, currentAddress, out var header))
+ if (!ctx.TryReadUInt32(currentAddress, out var header))
{
return;
}
@@ -2230,16 +2225,16 @@ public static class AgcExports
if (op == ItSetBase &&
length >= 4 &&
- TryReadUInt32(ctx, currentAddress + 4, out var baseSelector) &&
+ ctx.TryReadUInt32(currentAddress + 4, out var baseSelector) &&
baseSelector == 1 &&
- TryReadUInt64(ctx, currentAddress + 8, out var indirectArgsAddress))
+ ctx.TryReadUInt64(currentAddress + 8, out var indirectArgsAddress))
{
state.IndirectArgsAddress = indirectArgsAddress;
}
if (op == ItEventWrite &&
length >= 2 &&
- TryReadUInt32(ctx, currentAddress + sizeof(uint), out var eventTypeRaw))
+ ctx.TryReadUInt32(currentAddress + sizeof(uint), out var eventTypeRaw))
{
var eventType = eventTypeRaw & 0x3Fu;
var triggered = KernelEventQueueCompatExports.TriggerRegisteredEvents(
@@ -2279,8 +2274,8 @@ public static class AgcExports
if (op == ItIndexBase &&
length >= 3 &&
- TryReadUInt32(ctx, currentAddress + 4, out var indexBaseLo) &&
- TryReadUInt32(ctx, currentAddress + 8, out var indexBaseHi))
+ ctx.TryReadUInt32(currentAddress + 4, out var indexBaseLo) &&
+ ctx.TryReadUInt32(currentAddress + 8, out var indexBaseHi))
{
state.IndexBufferAddress =
indexBaseLo | ((ulong)indexBaseHi << 32);
@@ -2288,21 +2283,21 @@ public static class AgcExports
if (op == ItIndexBufferSize &&
length >= 2 &&
- TryReadUInt32(ctx, currentAddress + 4, out var indexBufferCount))
+ ctx.TryReadUInt32(currentAddress + 4, out var indexBufferCount))
{
state.IndexBufferCount = indexBufferCount;
}
if (op == ItIndexType &&
length >= 2 &&
- TryReadUInt32(ctx, currentAddress + 4, out var indexSize))
+ ctx.TryReadUInt32(currentAddress + 4, out var indexSize))
{
state.IndexSize = indexSize & 0x3;
}
if (op == ItNumInstances &&
length >= 2 &&
- TryReadUInt32(ctx, currentAddress + 4, out var instanceCount))
+ ctx.TryReadUInt32(currentAddress + 4, out var instanceCount))
{
state.InstanceCount = Math.Max(instanceCount, 1);
}
@@ -2348,7 +2343,7 @@ public static class AgcExports
if (op == ItNop &&
register == RDrawIndexAuto &&
length >= 2 &&
- TryReadUInt32(ctx, currentAddress + 4, out var autoIndexCount) &&
+ ctx.TryReadUInt32(currentAddress + 4, out var autoIndexCount) &&
autoIndexCount != 0)
{
TryTranslateGuestDraw(
@@ -2373,11 +2368,11 @@ public static class AgcExports
if (op == ItNop && register == RFlip && length >= 6)
{
- if (!TryReadUInt32(ctx, currentAddress + 4, out var videoOutHandle) ||
- !TryReadUInt32(ctx, currentAddress + 8, out var displayBufferIndexRaw) ||
- !TryReadUInt32(ctx, currentAddress + 12, out var flipMode) ||
- !TryReadUInt32(ctx, currentAddress + 16, out var flipArgLo) ||
- !TryReadUInt32(ctx, currentAddress + 20, out var flipArgHi))
+ if (!ctx.TryReadUInt32(currentAddress + 4, out var videoOutHandle) ||
+ !ctx.TryReadUInt32(currentAddress + 8, out var displayBufferIndexRaw) ||
+ !ctx.TryReadUInt32(currentAddress + 12, out var flipMode) ||
+ !ctx.TryReadUInt32(currentAddress + 16, out var flipArgLo) ||
+ !ctx.TryReadUInt32(currentAddress + 20, out var flipArgHi))
{
return;
}
@@ -2502,9 +2497,9 @@ public static class AgcExports
ulong packetAddress,
bool tracePacket)
{
- if (!TryReadUInt32(ctx, packetAddress + 12, out var byteCount) ||
- !TryReadUInt64(ctx, packetAddress + 16, out var destinationAddress) ||
- !TryReadUInt64(ctx, packetAddress + 24, out var sourceAddress))
+ if (!ctx.TryReadUInt32(packetAddress + 12, out var byteCount) ||
+ !ctx.TryReadUInt64(packetAddress + 16, out var destinationAddress) ||
+ !ctx.TryReadUInt64(packetAddress + 24, out var sourceAddress))
{
return;
}
@@ -2527,12 +2522,12 @@ public static class AgcExports
CpuContext ctx,
ulong packetAddress)
{
- if (!TryReadUInt32(ctx, packetAddress + 4, out var control) ||
- !TryReadUInt32(ctx, packetAddress + 8, out var sourceLow) ||
- !TryReadUInt32(ctx, packetAddress + 12, out var sourceHigh) ||
- !TryReadUInt32(ctx, packetAddress + 16, out var destinationLow) ||
- !TryReadUInt32(ctx, packetAddress + 20, out var destinationHigh) ||
- !TryReadUInt32(ctx, packetAddress + 24, out var command))
+ if (!ctx.TryReadUInt32(packetAddress + 4, out var control) ||
+ !ctx.TryReadUInt32(packetAddress + 8, out var sourceLow) ||
+ !ctx.TryReadUInt32(packetAddress + 12, out var sourceHigh) ||
+ !ctx.TryReadUInt32(packetAddress + 16, out var destinationLow) ||
+ !ctx.TryReadUInt32(packetAddress + 20, out var destinationHigh) ||
+ !ctx.TryReadUInt32(packetAddress + 24, out var command))
{
return;
}
@@ -2563,7 +2558,7 @@ public static class AgcExports
if (sourceAddressIncrement != 0)
{
copied =
- TryReadUInt32(ctx, sourceAddress, out var fillValue) &&
+ ctx.TryReadUInt32(sourceAddress, out var fillValue) &&
TryFillGuestMemory(
ctx,
fillValue,
@@ -2609,8 +2604,8 @@ public static class AgcExports
uint packetLength,
bool tracePacket)
{
- if (!TryReadUInt32(ctx, packetAddress + 4, out var control) ||
- !TryReadUInt64(ctx, packetAddress + 8, out var destinationAddress))
+ if (!ctx.TryReadUInt32(packetAddress + 4, out var control) ||
+ !ctx.TryReadUInt64(packetAddress + 8, out var destinationAddress))
{
return;
}
@@ -2625,8 +2620,8 @@ public static class AgcExports
var targetAddress = destinationAddress +
(increment == 0 ? (ulong)index * sizeof(uint) : 0);
wroteData =
- TryReadUInt32(ctx, sourceAddress, out var value) &&
- TryWriteUInt32(ctx, targetAddress, value);
+ ctx.TryReadUInt32(sourceAddress, out var value) &&
+ ctx.TryWriteUInt32(targetAddress, value);
}
if (tracePacket)
@@ -2643,8 +2638,8 @@ public static class AgcExports
bool is64Bit,
bool tracePacket)
{
- if (!TryReadUInt64(ctx, packetAddress + 4, out var address) ||
- !TryReadUInt32(ctx, packetAddress + (is64Bit ? 28u : 16u), out var control))
+ if (!ctx.TryReadUInt64(packetAddress + 4, out var address) ||
+ !ctx.TryReadUInt32(packetAddress + (is64Bit ? 28u : 16u), out var control))
{
return;
}
@@ -2654,18 +2649,18 @@ public static class AgcExports
ulong value;
if (is64Bit)
{
- if (!TryReadUInt64(ctx, packetAddress + 12, out mask) ||
- !TryReadUInt64(ctx, packetAddress + 20, out reference) ||
- !TryReadUInt64(ctx, address, out value))
+ if (!ctx.TryReadUInt64(packetAddress + 12, out mask) ||
+ !ctx.TryReadUInt64(packetAddress + 20, out reference) ||
+ !ctx.TryReadUInt64(address, out value))
{
return;
}
}
else
{
- if (!TryReadUInt32(ctx, packetAddress + 12, out var mask32) ||
- !TryReadUInt32(ctx, packetAddress + 20, out var reference32) ||
- !TryReadUInt32(ctx, address, out var value32))
+ if (!ctx.TryReadUInt32(packetAddress + 12, out var mask32) ||
+ !ctx.TryReadUInt32(packetAddress + 20, out var reference32) ||
+ !ctx.TryReadUInt32(address, out var value32))
{
return;
}
@@ -2691,11 +2686,11 @@ public static class AgcExports
ulong packetAddress,
bool tracePacket)
{
- if (!TryReadUInt32(ctx, packetAddress + 4, out var control) ||
- !TryReadUInt64(ctx, packetAddress + 8, out var address) ||
- !TryReadUInt32(ctx, packetAddress + 16, out var reference) ||
- !TryReadUInt32(ctx, packetAddress + 20, out var mask) ||
- !TryReadUInt32(ctx, address, out var value))
+ if (!ctx.TryReadUInt32(packetAddress + 4, out var control) ||
+ !ctx.TryReadUInt64(packetAddress + 8, out var address) ||
+ !ctx.TryReadUInt32(packetAddress + 16, out var reference) ||
+ !ctx.TryReadUInt32(packetAddress + 20, out var mask) ||
+ !ctx.TryReadUInt32(address, out var value))
{
return;
}
@@ -2740,11 +2735,11 @@ public static class AgcExports
ulong packetAddress,
bool tracePacket)
{
- if (!TryReadUInt32(ctx, packetAddress + 8, out var control) ||
- !TryReadUInt32(ctx, packetAddress + 12, out var destinationLo) ||
- !TryReadUInt32(ctx, packetAddress + 16, out var destinationHi) ||
- !TryReadUInt32(ctx, packetAddress + 20, out var dataLo) ||
- !TryReadUInt32(ctx, packetAddress + 24, out var dataHi))
+ if (!ctx.TryReadUInt32(packetAddress + 8, out var control) ||
+ !ctx.TryReadUInt32(packetAddress + 12, out var destinationLo) ||
+ !ctx.TryReadUInt32(packetAddress + 16, out var destinationHi) ||
+ !ctx.TryReadUInt32(packetAddress + 20, out var dataLo) ||
+ !ctx.TryReadUInt32(packetAddress + 24, out var dataHi))
{
return;
}
@@ -2754,7 +2749,7 @@ public static class AgcExports
var data = ((ulong)dataHi << 32) | dataLo;
var wroteData = dataSelection switch
{
- 1 or 2 => TryWriteUInt32(ctx, destinationAddress, dataLo),
+ 1 or 2 => ctx.TryWriteUInt32(destinationAddress, dataLo),
3 => ctx.TryWriteUInt64(destinationAddress, data),
_ => false,
};
@@ -2778,7 +2773,7 @@ public static class AgcExports
if (op is ItSetShReg or ItSetContextReg or ItSetUconfigReg)
{
if (packetLength < 3 ||
- !TryReadUInt32(ctx, packetAddress + sizeof(uint), out var startRegister))
+ !ctx.TryReadUInt32(packetAddress + sizeof(uint), out var startRegister))
{
return;
}
@@ -2791,8 +2786,7 @@ public static class AgcExports
};
for (uint index = 0; index < packetLength - 2; index++)
{
- if (!TryReadUInt32(
- ctx,
+ if (!ctx.TryReadUInt32(
packetAddress + 8 + ((ulong)index * sizeof(uint)),
out var value))
{
@@ -2808,8 +2802,8 @@ public static class AgcExports
if (op != ItNop ||
register is not (RCxRegsIndirect or RShRegsIndirect or RUcRegsIndirect) ||
packetLength < 4 ||
- !TryReadUInt32(ctx, packetAddress + sizeof(uint), out var registerCount) ||
- !TryReadUInt64(ctx, packetAddress + 8, out var registersAddress))
+ !ctx.TryReadUInt32(packetAddress + sizeof(uint), out var registerCount) ||
+ !ctx.TryReadUInt64(packetAddress + 8, out var registersAddress))
{
return;
}
@@ -2823,8 +2817,8 @@ public static class AgcExports
for (uint index = 0; index < registerCount; index++)
{
var entryAddress = registersAddress + ((ulong)index * 8);
- if (!TryReadUInt32(ctx, entryAddress, out var registerOffset) ||
- !TryReadUInt32(ctx, entryAddress + sizeof(uint), out var value))
+ if (!ctx.TryReadUInt32(entryAddress, out var registerOffset) ||
+ !ctx.TryReadUInt32(entryAddress + sizeof(uint), out var value))
{
return;
}
@@ -2848,20 +2842,20 @@ public static class AgcExports
switch (op)
{
case ItDrawIndexAuto when packetLength >= 3:
- return TryReadUInt32(ctx, packetAddress + 4, out drawCount);
+ return ctx.TryReadUInt32(packetAddress + 4, out drawCount);
case ItDrawIndex2 when packetLength >= 6:
state.DrawIndexOffset = 0;
- return TryReadUInt32(ctx, packetAddress + 16, out drawCount);
+ return ctx.TryReadUInt32(packetAddress + 16, out drawCount);
case ItDrawIndexOffset2 when packetLength >= 5:
- if (!TryReadUInt32(ctx, packetAddress + 8, out var indexOffset))
+ if (!ctx.TryReadUInt32(packetAddress + 8, out var indexOffset))
{
return false;
}
state.DrawIndexOffset = indexOffset;
- return TryReadUInt32(ctx, packetAddress + 12, out drawCount);
+ return ctx.TryReadUInt32(packetAddress + 12, out drawCount);
case ItDrawIndexMultiAuto when packetLength >= 4:
- if (!TryReadUInt32(ctx, packetAddress + 12, out var control))
+ if (!ctx.TryReadUInt32(packetAddress + 12, out var control))
{
return false;
}
@@ -2870,13 +2864,12 @@ public static class AgcExports
return true;
case ItDrawIndirect or ItDrawIndexIndirect
when packetLength >= 5 && state.IndirectArgsAddress != 0:
- if (!TryReadUInt32(ctx, packetAddress + 4, out var dataOffset))
+ if (!ctx.TryReadUInt32(packetAddress + 4, out var dataOffset))
{
return false;
}
- return TryReadUInt32(
- ctx,
+ return ctx.TryReadUInt32(
state.IndirectArgsAddress + dataOffset,
out drawCount);
default:
@@ -3939,7 +3932,7 @@ public static class AgcExports
if (opcode == ItDispatchDirect)
{
if (packetLength < 5 ||
- !TryReadUInt32(ctx, packetAddress + 16, out initiator))
+ !ctx.TryReadUInt32(packetAddress + 16, out initiator))
{
return false;
}
@@ -3948,8 +3941,8 @@ public static class AgcExports
}
else if (packetLength >= 4)
{
- if (!TryReadUInt64(ctx, packetAddress + 4, out dimensionsAddress) ||
- !TryReadUInt32(ctx, packetAddress + 12, out initiator))
+ if (!ctx.TryReadUInt64(packetAddress + 4, out dimensionsAddress) ||
+ !ctx.TryReadUInt32(packetAddress + 12, out initiator))
{
return false;
}
@@ -3958,8 +3951,8 @@ public static class AgcExports
{
if (packetLength < 3 ||
state.IndirectArgsAddress == 0 ||
- !TryReadUInt32(ctx, packetAddress + 4, out var dataOffset) ||
- !TryReadUInt32(ctx, packetAddress + 8, out initiator))
+ !ctx.TryReadUInt32(packetAddress + 4, out var dataOffset) ||
+ !ctx.TryReadUInt32(packetAddress + 8, out initiator))
{
return false;
}
@@ -3968,9 +3961,9 @@ public static class AgcExports
}
if ((initiator & 1) == 0 ||
- !TryReadUInt32(ctx, dimensionsAddress, out var groupCountX) ||
- !TryReadUInt32(ctx, dimensionsAddress + 4, out var groupCountY) ||
- !TryReadUInt32(ctx, dimensionsAddress + 8, out var groupCountZ) ||
+ !ctx.TryReadUInt32(dimensionsAddress, out var groupCountX) ||
+ !ctx.TryReadUInt32(dimensionsAddress + 4, out var groupCountY) ||
+ !ctx.TryReadUInt32(dimensionsAddress + 8, out var groupCountZ) ||
groupCountX == 0 ||
groupCountY == 0 ||
groupCountZ == 0)
@@ -4746,8 +4739,7 @@ public static class AgcExports
.Take(16)
.Select(candidate =>
{
- var type = TryReadByte(
- ctx,
+ var type = ctx.TryReadByte(
candidate.Header + ShaderTypeOffset,
out var shaderType)
? shaderType.ToString()
@@ -4783,7 +4775,7 @@ public static class AgcExports
{
descriptor = default;
if (packetLength < 10 ||
- !TryReadUInt32(ctx, packetAddress + 4, out var startRegister))
+ !ctx.TryReadUInt32(packetAddress + 4, out var startRegister))
{
return false;
}
@@ -4802,7 +4794,7 @@ public static class AgcExports
Span fields = stackalloc uint[4];
for (var i = 0; i < fields.Length; i++)
{
- if (!TryReadUInt32(ctx, descriptorAddress + ((ulong)i * sizeof(uint)), out fields[i]))
+ if (!ctx.TryReadUInt32(descriptorAddress + ((ulong)i * sizeof(uint)), out fields[i]))
{
return false;
}
@@ -5025,7 +5017,7 @@ public static class AgcExports
var payloadCount = Math.Min(length - 1, 32u);
for (uint i = 0; i < payloadCount; i++)
{
- if (!TryReadUInt32(ctx, packetAddress + ((ulong)(i + 1) * sizeof(uint)), out var value))
+ if (!ctx.TryReadUInt32(packetAddress + ((ulong)(i + 1) * sizeof(uint)), out var value))
{
return;
}
@@ -5036,8 +5028,8 @@ public static class AgcExports
if (op != ItNop ||
register is not (RCxRegsIndirect or RShRegsIndirect or RUcRegsIndirect) ||
length < 4 ||
- !TryReadUInt32(ctx, packetAddress + 4, out var registerCount) ||
- !TryReadUInt64(ctx, packetAddress + 8, out var registersAddress))
+ !ctx.TryReadUInt32(packetAddress + 4, out var registerCount) ||
+ !ctx.TryReadUInt64(packetAddress + 8, out var registersAddress))
{
return;
}
@@ -5048,8 +5040,8 @@ public static class AgcExports
for (uint i = 0; i < tracedCount; i++)
{
var entryAddress = registersAddress + ((ulong)i * 8);
- if (!TryReadUInt32(ctx, entryAddress, out var registerOffset) ||
- !TryReadUInt32(ctx, entryAddress + 4, out var value))
+ if (!ctx.TryReadUInt32(entryAddress, out var registerOffset) ||
+ !ctx.TryReadUInt32(entryAddress + 4, out var value))
{
TraceAgc($"agc.dcb.indirect_read_failed space={registerSpace} index={i} addr=0x{entryAddress:X16}");
return;
@@ -5066,9 +5058,9 @@ public static class AgcExports
private static bool PatchShaderProgramRegisters(CpuContext ctx, ulong headerAddress, ulong codeAddress)
{
- if (!TryReadUInt64(ctx, headerAddress + ShaderShRegistersOffset, out var shRegistersAddress) ||
- !TryReadByte(ctx, headerAddress + ShaderTypeOffset, out var shaderType) ||
- !TryReadByte(ctx, headerAddress + ShaderNumShRegistersOffset, out var registerCount))
+ if (!ctx.TryReadUInt64(headerAddress + ShaderShRegistersOffset, out var shRegistersAddress) ||
+ !ctx.TryReadByte(headerAddress + ShaderTypeOffset, out var shaderType) ||
+ !ctx.TryReadByte(headerAddress + ShaderNumShRegistersOffset, out var registerCount))
{
return false;
}
@@ -5078,8 +5070,8 @@ public static class AgcExports
return false;
}
- if (!TryReadUInt32(ctx, shRegistersAddress, out var loRegister) ||
- !TryReadUInt32(ctx, shRegistersAddress + 8, out var hiRegister))
+ if (!ctx.TryReadUInt32(shRegistersAddress, out var loRegister) ||
+ !ctx.TryReadUInt32(shRegistersAddress + 8, out var hiRegister))
{
return false;
}
@@ -5108,8 +5100,8 @@ public static class AgcExports
var loValue = (uint)((codeAddress >> 8) & 0xFFFF_FFFFUL);
var hiValue = (uint)((codeAddress >> 40) & 0xFFUL);
- return TryWriteUInt32(ctx, shRegistersAddress + sizeof(uint), loValue) &&
- TryWriteUInt32(ctx, shRegistersAddress + 8 + sizeof(uint), hiValue);
+ return ctx.TryWriteUInt32(shRegistersAddress + sizeof(uint), loValue) &&
+ ctx.TryWriteUInt32(shRegistersAddress + 8 + sizeof(uint), hiValue);
}
private static bool IsEsGeometryShaderType(byte shaderType) =>
@@ -5124,8 +5116,8 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryWriteUInt32(ctx, commandAddress + 8, (uint)(registersAddress & 0xFFFF_FFFFUL)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(registersAddress >> 32)))
+ if (!ctx.TryWriteUInt32(commandAddress + 8, (uint)(registersAddress & 0xFFFF_FFFFUL)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(registersAddress >> 32)))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -5144,8 +5136,8 @@ public static class AgcExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadUInt32(ctx, commandAddress + 4, out var currentCount) ||
- !TryWriteUInt32(ctx, commandAddress + 4, currentCount + registerCount))
+ if (!ctx.TryReadUInt32(commandAddress + 4, out var currentCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, currentCount + registerCount))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -5166,10 +5158,10 @@ public static class AgcExports
}
if (!TryAllocateCommandDwords(ctx, commandBufferAddress, 4, out var commandAddress) ||
- !TryWriteUInt32(ctx, commandAddress, Pm4(4, ItNop, packetRegister)) ||
- !TryWriteUInt32(ctx, commandAddress + 4, registerCount) ||
- !TryWriteUInt32(ctx, commandAddress + 8, (uint)(registersAddress & 0xFFFF_FFFFUL)) ||
- !TryWriteUInt32(ctx, commandAddress + 12, (uint)(registersAddress >> 32)))
+ !ctx.TryWriteUInt32(commandAddress, Pm4(4, ItNop, packetRegister)) ||
+ !ctx.TryWriteUInt32(commandAddress + 4, registerCount) ||
+ !ctx.TryWriteUInt32(commandAddress + 8, (uint)(registersAddress & 0xFFFF_FFFFUL)) ||
+ !ctx.TryWriteUInt32(commandAddress + 12, (uint)(registersAddress >> 32)))
{
return ReturnPointer(ctx, 0);
}
@@ -5182,10 +5174,10 @@ public static class AgcExports
{
commandAddress = 0;
if (sizeDwords == 0 ||
- !TryReadUInt64(ctx, commandBufferAddress + CommandBufferCursorUpOffset, out var cursorUp) ||
- !TryReadUInt64(ctx, commandBufferAddress + CommandBufferCursorDownOffset, out var cursorDown) ||
- !TryReadUInt64(ctx, commandBufferAddress + CommandBufferCallbackOffset, out var callback) ||
- !TryReadUInt32(ctx, commandBufferAddress + CommandBufferReservedDwOffset, out var reservedDwords))
+ !ctx.TryReadUInt64(commandBufferAddress + CommandBufferCursorUpOffset, out var cursorUp) ||
+ !ctx.TryReadUInt64(commandBufferAddress + CommandBufferCursorDownOffset, out var cursorDown) ||
+ !ctx.TryReadUInt64(commandBufferAddress + CommandBufferCallbackOffset, out var callback) ||
+ !ctx.TryReadUInt32(commandBufferAddress + CommandBufferReservedDwOffset, out var reservedDwords))
{
return false;
}
@@ -5212,19 +5204,19 @@ public static class AgcExports
private static bool CopyShaderRegister(CpuContext ctx, ulong sourceAddress, ulong destinationAddress)
{
- if (!TryReadUInt32(ctx, sourceAddress, out var offset) ||
- !TryReadUInt32(ctx, sourceAddress + sizeof(uint), out var value))
+ if (!ctx.TryReadUInt32(sourceAddress, out var offset) ||
+ !ctx.TryReadUInt32(sourceAddress + sizeof(uint), out var value))
{
return false;
}
- return TryWriteUInt32(ctx, destinationAddress, offset) &&
- TryWriteUInt32(ctx, destinationAddress + sizeof(uint), value);
+ return ctx.TryWriteUInt32(destinationAddress, offset) &&
+ ctx.TryWriteUInt32(destinationAddress + sizeof(uint), value);
}
private static bool RelocatePointerField(CpuContext ctx, ulong fieldAddress)
{
- if (!TryReadUInt64(ctx, fieldAddress, out var relativeAddress))
+ if (!ctx.TryReadUInt64(fieldAddress, out var relativeAddress))
{
return false;
}
@@ -5405,52 +5397,6 @@ public static class AgcExports
private static uint Pm4Length(uint header) =>
((header >> 16) & 0x3FFFu) + 2u;
- private static bool TryReadByte(CpuContext ctx, ulong address, out byte value)
- {
- Span buffer = stackalloc byte[1];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = buffer[0];
- return true;
- }
-
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
- private static bool TryReadUInt64(CpuContext ctx, ulong address, out ulong value)
- {
- Span buffer = stackalloc byte[sizeof(ulong)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt64LittleEndian(buffer);
- return true;
- }
-
private static bool TryReadGuestCString(
CpuContext ctx,
ulong address,
@@ -5466,7 +5412,7 @@ public static class AgcExports
var values = new List(Math.Min(maximumLength, 128));
for (var index = 0; index < maximumLength; index++)
{
- if (!TryReadByte(ctx, address + (ulong)index, out var value))
+ if (!ctx.TryReadByte(address + (ulong)index, out var value))
{
bytes = [];
return false;
@@ -5493,7 +5439,7 @@ public static class AgcExports
{
op = 0;
register = 0;
- if (commandAddress == 0 || !TryReadUInt32(ctx, commandAddress, out var header))
+ if (commandAddress == 0 || !ctx.TryReadUInt32(commandAddress, out var header))
{
return false;
}
diff --git a/src/SharpEmu.Libs/Agc/Gen5ShaderMetadataReader.cs b/src/SharpEmu.Libs/Agc/Gen5ShaderMetadataReader.cs
index d51b58c..7f70830 100644
--- a/src/SharpEmu.Libs/Agc/Gen5ShaderMetadataReader.cs
+++ b/src/SharpEmu.Libs/Agc/Gen5ShaderMetadataReader.cs
@@ -18,9 +18,9 @@ internal static class Gen5ShaderMetadataReader
out Gen5ShaderMetadata metadata)
{
metadata = default!;
- if (!TryReadUInt64(ctx, shaderHeaderAddress + ShaderUserDataOffset, out var userDataAddress) ||
+ if (!ctx.TryReadUInt64(shaderHeaderAddress + ShaderUserDataOffset, out var userDataAddress) ||
userDataAddress == 0 ||
- !TryReadUInt64(ctx, userDataAddress, out var directResourceOffsetsAddress))
+ !ctx.TryReadUInt64(userDataAddress, out var directResourceOffsetsAddress))
{
return false;
}
@@ -28,8 +28,7 @@ internal static class Gen5ShaderMetadataReader
var resourceOffsets = new ulong[ResourceClassCount];
for (var resourceClass = 0; resourceClass < ResourceClassCount; resourceClass++)
{
- if (!TryReadUInt64(
- ctx,
+ if (!ctx.TryReadUInt64(
userDataAddress + 0x08 + (ulong)(resourceClass * sizeof(ulong)),
out resourceOffsets[resourceClass]))
{
@@ -138,17 +137,4 @@ internal static class Gen5ShaderMetadataReader
value = BinaryPrimitives.ReadUInt16LittleEndian(bytes);
return true;
}
-
- private static bool TryReadUInt64(CpuContext ctx, ulong address, out ulong value)
- {
- Span bytes = stackalloc byte[sizeof(ulong)];
- if (!ctx.Memory.TryRead(address, bytes))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt64LittleEndian(bytes);
- return true;
- }
}
diff --git a/src/SharpEmu.Libs/Agc/Gen5ShaderScalarEvaluator.cs b/src/SharpEmu.Libs/Agc/Gen5ShaderScalarEvaluator.cs
index 990591e..adc5701 100644
--- a/src/SharpEmu.Libs/Agc/Gen5ShaderScalarEvaluator.cs
+++ b/src/SharpEmu.Libs/Agc/Gen5ShaderScalarEvaluator.cs
@@ -3,7 +3,6 @@
using SharpEmu.HLE;
using SharpEmu.Libs.Kernel;
-using System.Buffers.Binary;
using System.Numerics;
namespace SharpEmu.Libs.Agc;
@@ -1405,8 +1404,7 @@ internal static class Gen5ShaderScalarEvaluator
continue;
}
- if (!TryReadUInt32(
- ctx,
+ if (!ctx.TryReadUInt32(
address + (ulong)(index * sizeof(uint)),
out var value) &&
!TryReadUserDataScalarLoad(
@@ -1727,16 +1725,4 @@ internal static class Gen5ShaderScalarEvaluator
opcode.StartsWith("ImageSample", StringComparison.Ordinal) ||
opcode.StartsWith("ImageGather", StringComparison.Ordinal);
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span bytes = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, bytes))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(bytes);
- return true;
- }
}
diff --git a/src/SharpEmu.Libs/Agc/Gen5ShaderTranslator.cs b/src/SharpEmu.Libs/Agc/Gen5ShaderTranslator.cs
index 5111814..d52cad2 100644
--- a/src/SharpEmu.Libs/Agc/Gen5ShaderTranslator.cs
+++ b/src/SharpEmu.Libs/Agc/Gen5ShaderTranslator.cs
@@ -294,7 +294,7 @@ internal static class Gen5ShaderTranslator
var instructionCount = 0;
for (uint pc = 0; instructionCount < MaxInstructions;)
{
- if (!TryReadUInt32(ctx, address + pc, out var word))
+ if (!ctx.TryReadUInt32(address + pc, out var word))
{
error = $"read-failed pc=0x{pc:X}";
return false;
@@ -317,7 +317,7 @@ internal static class Gen5ShaderTranslator
words[0] = word;
for (uint wordIndex = 1; wordIndex < sizeDwords; wordIndex++)
{
- if (!TryReadUInt32(ctx, address + pc + wordIndex * sizeof(uint), out words[wordIndex]))
+ if (!ctx.TryReadUInt32(address + pc + wordIndex * sizeof(uint), out words[wordIndex]))
{
error = $"read-failed pc=0x{pc + wordIndex * sizeof(uint):X}";
return false;
@@ -397,7 +397,7 @@ internal static class Gen5ShaderTranslator
case 0x34:
case 0x35:
encoding = Gen5ShaderEncoding.Vop3;
- if (!TryReadUInt32(ctx, baseAddress + pc + sizeof(uint), out var vop3Extra))
+ if (!ctx.TryReadUInt32(baseAddress + pc + sizeof(uint), out var vop3Extra))
{
error = $"vop3-extra-read-failed pc=0x{pc:X}";
return false;
@@ -418,7 +418,7 @@ internal static class Gen5ShaderTranslator
return DecodeFlat(word, out name, out sizeDwords, out error);
case 0x38:
encoding = Gen5ShaderEncoding.Mubuf;
- if (!TryReadUInt32(ctx, baseAddress + pc + sizeof(uint), out var mubufExtra))
+ if (!ctx.TryReadUInt32(baseAddress + pc + sizeof(uint), out var mubufExtra))
{
error = $"mubuf-extra-read-failed pc=0x{pc:X}";
return false;
@@ -427,7 +427,7 @@ internal static class Gen5ShaderTranslator
return DecodeMubuf(word, mubufExtra, out name, out sizeDwords, out error);
case 0x3A:
encoding = Gen5ShaderEncoding.Mtbuf;
- if (!TryReadUInt32(ctx, baseAddress + pc + sizeof(uint), out var mtbufExtra))
+ if (!ctx.TryReadUInt32(baseAddress + pc + sizeof(uint), out var mtbufExtra))
{
error = $"mtbuf-extra-read-failed pc=0x{pc:X}";
return false;
@@ -1741,19 +1741,6 @@ internal static class Gen5ShaderTranslator
counts[key] = count + 1;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span bytes = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, bytes))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(bytes);
- return true;
- }
-
private readonly record struct ShaderDecodeInfo(
int InstructionCount,
Dictionary Counts,
diff --git a/src/SharpEmu.Libs/Ampr/AmprExports.cs b/src/SharpEmu.Libs/Ampr/AmprExports.cs
index 0d13c51..96f468e 100644
--- a/src/SharpEmu.Libs/Ampr/AmprExports.cs
+++ b/src/SharpEmu.Libs/Ampr/AmprExports.cs
@@ -453,7 +453,7 @@ public static class AmprExports
var offset = 0UL;
while (offset < writeOffset)
{
- if (!TryReadUInt32(ctx, buffer + offset, out var recordType))
+ if (!ctx.TryReadUInt32(buffer + offset, out var recordType))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -883,19 +883,6 @@ public static class AmprExports
return true;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
private static void TraceAmpr(CpuContext ctx, string operation, ulong commandBuffer, ulong arg0, ulong arg1)
{
if (!_traceAmpr)
diff --git a/src/SharpEmu.Libs/Audio/AudioOut2Exports.cs b/src/SharpEmu.Libs/Audio/AudioOut2Exports.cs
index b0cf163..e1f99a2 100644
--- a/src/SharpEmu.Libs/Audio/AudioOut2Exports.cs
+++ b/src/SharpEmu.Libs/Audio/AudioOut2Exports.cs
@@ -95,7 +95,7 @@ public static class AudioOut2Exports
}
var handle = (ulong)Interlocked.Increment(ref _nextContextHandle);
- return TryWriteUInt64(ctx, outContextAddress, handle)
+ return ctx.TryWriteUInt64(outContextAddress, handle)
? SetReturn(ctx, 0)
: SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -125,7 +125,7 @@ public static class AudioOut2Exports
var portId = unchecked((uint)Interlocked.Increment(ref _nextPortId)) & 0xFF;
var handle = 0x2000_0000UL | ((ulong)(uint)type << 16) | portId;
- return TryWriteUInt64(ctx, outPortAddress, handle)
+ return ctx.TryWriteUInt64(outPortAddress, handle)
? SetReturn(ctx, 0)
: SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -211,18 +211,11 @@ public static class AudioOut2Exports
}
var handle = (ulong)Interlocked.Increment(ref _nextUserHandle);
- return TryWriteUInt64(ctx, outUserAddress, handle)
+ return ctx.TryWriteUInt64(outUserAddress, handle)
? SetReturn(ctx, 0)
: SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
- private static bool TryWriteUInt64(CpuContext ctx, ulong address, ulong value)
- {
- Span buffer = stackalloc byte[sizeof(ulong)];
- BinaryPrimitives.WriteUInt64LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
private static int SetReturn(CpuContext ctx, int result)
{
ctx[CpuRegister.Rax] = unchecked((ulong)result);
diff --git a/src/SharpEmu.Libs/Fiber/FiberExports.cs b/src/SharpEmu.Libs/Fiber/FiberExports.cs
index 5a35b83..10d6fc9 100644
--- a/src/SharpEmu.Libs/Fiber/FiberExports.cs
+++ b/src/SharpEmu.Libs/Fiber/FiberExports.cs
@@ -112,7 +112,7 @@ public static class FiberExports
return SetReturn(ctx, FiberErrorAlignment);
}
- return TryWriteUInt32(ctx, optParam, FiberOptSignature)
+ return ctx.TryWriteUInt32(optParam, FiberOptSignature)
? SetReturn(ctx, 0)
: SetReturn(ctx, FiberErrorInvalid);
}
@@ -130,7 +130,7 @@ public static class FiberExports
return SetReturn(ctx, error);
}
- if (!TryReadUInt32(ctx, fiber + FiberStateOffset, out var state))
+ if (!ctx.TryReadUInt32(fiber + FiberStateOffset, out var state))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -143,7 +143,7 @@ public static class FiberExports
_continuations.TryRemove(fiber, out _);
_returnTargets.TryRemove(fiber, out _);
_stackRanges.TryRemove(fiber, out _);
- _ = TryWriteUInt32(ctx, fiber + FiberStateOffset, FiberStateTerminated);
+ _ = ctx.TryWriteUInt32(fiber + FiberStateOffset, FiberStateTerminated);
return SetReturn(ctx, 0);
}
@@ -240,7 +240,7 @@ public static class FiberExports
var returnArgument = ctx[CpuRegister.Rdi];
var argOnRunAddress = ctx[CpuRegister.Rsi];
- if (argOnRunAddress != 0 && !TryWriteUInt64(ctx, argOnRunAddress, 0))
+ if (argOnRunAddress != 0 && !ctx.TryWriteUInt64(argOnRunAddress, 0))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -264,7 +264,7 @@ public static class FiberExports
{
if (!_continuations.TryRemove(previousFiber, out var previousContinuation) ||
!TryWriteResumeArgument(ctx, previousContinuation, returnArgument) ||
- !TryWriteUInt32(ctx, previousFiber + FiberStateOffset, FiberStateRun))
+ !ctx.TryWriteUInt32(previousFiber + FiberStateOffset, FiberStateRun))
{
_continuations.TryRemove(fiberAddress, out _);
return SetReturn(ctx, FiberErrorState);
@@ -284,7 +284,7 @@ public static class FiberExports
transferTarget = returnTarget.ThreadContinuation.Value.Context with { Rax = 0 };
}
- if (!TryWriteUInt32(ctx, fiberAddress + FiberStateOffset, FiberStateIdle))
+ if (!ctx.TryWriteUInt32(fiberAddress + FiberStateOffset, FiberStateIdle))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -318,7 +318,7 @@ public static class FiberExports
return SetReturn(ctx, FiberErrorPermission);
}
- return TryWriteUInt64(ctx, outAddress, fiberAddress)
+ return ctx.TryWriteUInt64(outAddress, fiberAddress)
? SetReturn(ctx, 0)
: SetReturn(ctx, FiberErrorInvalid);
}
@@ -342,7 +342,7 @@ public static class FiberExports
return SetReturn(ctx, error);
}
- if (!TryReadUInt64(ctx, info, out var size) || size != FiberInfoSize)
+ if (!ctx.TryReadUInt64(info, out var size) || size != FiberInfoSize)
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -352,12 +352,12 @@ public static class FiberExports
return SetReturn(ctx, FiberErrorInvalid);
}
- if (!TryWriteUInt64(ctx, info + 8, fields.Entry) ||
- !TryWriteUInt64(ctx, info + 16, fields.ArgOnInitialize) ||
- !TryWriteUInt64(ctx, info + 24, fields.ContextAddress) ||
- !TryWriteUInt64(ctx, info + 32, fields.ContextSize) ||
+ if (!ctx.TryWriteUInt64(info + 8, fields.Entry) ||
+ !ctx.TryWriteUInt64(info + 16, fields.ArgOnInitialize) ||
+ !ctx.TryWriteUInt64(info + 24, fields.ContextAddress) ||
+ !ctx.TryWriteUInt64(info + 32, fields.ContextSize) ||
!TryWriteName(ctx, info + 40, fields.Name) ||
- !TryWriteUInt64(ctx, info + 72, ulong.MaxValue))
+ !ctx.TryWriteUInt64(info + 72, ulong.MaxValue))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -384,7 +384,7 @@ public static class FiberExports
return SetReturn(ctx, FiberErrorNull);
}
- if (!TryReadNullTerminatedUtf8(ctx, nameAddress, MaxNameLength + 1, out var name))
+ if (!ctx.TryReadNullTerminatedUtf8(nameAddress, MaxNameLength + 1, out var name))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -441,7 +441,7 @@ public static class FiberExports
return SetReturn(ctx, FiberErrorPermission);
}
- return TryWriteUInt64(ctx, outAddress, ctx[CpuRegister.Rbp])
+ return ctx.TryWriteUInt64(outAddress, ctx[CpuRegister.Rbp])
? SetReturn(ctx, 0)
: SetReturn(ctx, FiberErrorInvalid);
}
@@ -482,12 +482,12 @@ public static class FiberExports
}
if (optParam != 0 &&
- (!TryReadUInt32(ctx, optParam, out var optMagic) || optMagic != FiberOptSignature))
+ (!ctx.TryReadUInt32(optParam, out var optMagic) || optMagic != FiberOptSignature))
{
return SetReturn(ctx, FiberErrorInvalid);
}
- if (!TryReadNullTerminatedUtf8(ctx, nameAddress, MaxNameLength + 1, out var name))
+ if (!ctx.TryReadNullTerminatedUtf8(nameAddress, MaxNameLength + 1, out var name))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -497,25 +497,25 @@ public static class FiberExports
flags |= FiberFlagContextSizeCheck;
}
- if (!TryWriteUInt32(ctx, fiber + FiberMagicStartOffset, FiberSignature0) ||
- !TryWriteUInt32(ctx, fiber + FiberStateOffset, FiberStateIdle) ||
- !TryWriteUInt64(ctx, fiber + FiberEntryOffset, entry) ||
- !TryWriteUInt64(ctx, fiber + FiberArgOnInitializeOffset, argOnInitialize) ||
- !TryWriteUInt64(ctx, fiber + FiberContextAddressOffset, contextAddress) ||
- !TryWriteUInt64(ctx, fiber + FiberContextSizeOffset, contextSize) ||
+ if (!ctx.TryWriteUInt32(fiber + FiberMagicStartOffset, FiberSignature0) ||
+ !ctx.TryWriteUInt32(fiber + FiberStateOffset, FiberStateIdle) ||
+ !ctx.TryWriteUInt64(fiber + FiberEntryOffset, entry) ||
+ !ctx.TryWriteUInt64(fiber + FiberArgOnInitializeOffset, argOnInitialize) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextAddressOffset, contextAddress) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextSizeOffset, contextSize) ||
!TryWriteName(ctx, fiber + FiberNameOffset, name) ||
- !TryWriteUInt64(ctx, fiber + FiberContextPointerOffset, 0) ||
- !TryWriteUInt32(ctx, fiber + FiberFlagsOffset, flags) ||
- !TryWriteUInt64(ctx, fiber + FiberContextStartOffset, contextAddress) ||
- !TryWriteUInt64(ctx, fiber + FiberContextEndOffset, contextAddress == 0 ? 0 : contextAddress + contextSize) ||
- !TryWriteUInt32(ctx, fiber + FiberMagicEndOffset, FiberSignature1))
+ !ctx.TryWriteUInt64(fiber + FiberContextPointerOffset, 0) ||
+ !ctx.TryWriteUInt32(fiber + FiberFlagsOffset, flags) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextStartOffset, contextAddress) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextEndOffset, contextAddress == 0 ? 0 : contextAddress + contextSize) ||
+ !ctx.TryWriteUInt32(fiber + FiberMagicEndOffset, FiberSignature1))
{
return SetReturn(ctx, FiberErrorInvalid);
}
if (contextAddress != 0)
{
- if (!TryWriteUInt64(ctx, contextAddress, FiberStackSignature))
+ if (!ctx.TryWriteUInt64(contextAddress, FiberStackSignature))
{
return SetReturn(ctx, FiberErrorInvalid);
}
@@ -616,9 +616,9 @@ public static class FiberExports
if (previousFiber != 0)
{
- if (!TryReadUInt32(ctx, previousFiber + FiberStateOffset, out var previousState) ||
+ if (!ctx.TryReadUInt32(previousFiber + FiberStateOffset, out var previousState) ||
previousState != FiberStateRun ||
- !TryWriteUInt32(ctx, previousFiber + FiberStateOffset, FiberStateIdle))
+ !ctx.TryWriteUInt32(previousFiber + FiberStateOffset, FiberStateIdle))
{
return SetReturn(ctx, FiberErrorState);
}
@@ -631,12 +631,12 @@ public static class FiberExports
_returnTargets[fiber] = new FiberReturnTarget(0, callerContinuation);
}
- if (!TryWriteUInt32(ctx, fiber + FiberStateOffset, FiberStateRun))
+ if (!ctx.TryWriteUInt32(fiber + FiberStateOffset, FiberStateRun))
{
if (previousFiber != 0)
{
_continuations.TryRemove(previousFiber, out _);
- _ = TryWriteUInt32(ctx, previousFiber + FiberStateOffset, FiberStateRun);
+ _ = ctx.TryWriteUInt32(previousFiber + FiberStateOffset, FiberStateRun);
}
_returnTargets.TryRemove(fiber, out _);
return SetReturn(ctx, FiberErrorInvalid);
@@ -673,7 +673,7 @@ public static class FiberExports
var stackEnd = fields.ContextAddress + fields.ContextSize;
var entryRsp = (stackEnd & ~15UL) - sizeof(ulong);
- if (!TryWriteUInt64(ctx, entryRsp, 0))
+ if (!ctx.TryWriteUInt64(entryRsp, 0))
{
return false;
}
@@ -708,7 +708,7 @@ public static class FiberExports
FiberContinuation continuation,
ulong argument) =>
continuation.ArgOnRunAddress == 0 ||
- TryWriteUInt64(ctx, continuation.ArgOnRunAddress, argument);
+ ctx.TryWriteUInt64(continuation.ArgOnRunAddress, argument);
private static GuestCpuContinuation CaptureContinuation(
CpuContext ctx,
@@ -779,11 +779,11 @@ public static class FiberExports
return FiberErrorInvalid;
}
- if (!TryWriteUInt64(ctx, fiber + FiberContextAddressOffset, contextAddress) ||
- !TryWriteUInt64(ctx, fiber + FiberContextSizeOffset, contextSize) ||
- !TryWriteUInt64(ctx, fiber + FiberContextStartOffset, contextAddress) ||
- !TryWriteUInt64(ctx, fiber + FiberContextEndOffset, contextAddress + contextSize) ||
- !TryWriteUInt64(ctx, contextAddress, FiberStackSignature))
+ if (!ctx.TryWriteUInt64(fiber + FiberContextAddressOffset, contextAddress) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextSizeOffset, contextSize) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextStartOffset, contextAddress) ||
+ !ctx.TryWriteUInt64(fiber + FiberContextEndOffset, contextAddress + contextSize) ||
+ !ctx.TryWriteUInt64(contextAddress, FiberStackSignature))
{
return FiberErrorInvalid;
}
@@ -839,8 +839,8 @@ public static class FiberExports
return false;
}
- if (!TryReadUInt32(ctx, fiber + FiberMagicStartOffset, out var magicStart) ||
- !TryReadUInt32(ctx, fiber + FiberMagicEndOffset, out var magicEnd) ||
+ if (!ctx.TryReadUInt32(fiber + FiberMagicStartOffset, out var magicStart) ||
+ !ctx.TryReadUInt32(fiber + FiberMagicEndOffset, out var magicEnd) ||
magicStart != FiberSignature0 ||
magicEnd != FiberSignature1)
{
@@ -855,12 +855,12 @@ public static class FiberExports
private static bool TryReadFiberFields(CpuContext ctx, ulong fiber, out FiberFields fields)
{
fields = default;
- if (!TryReadUInt32(ctx, fiber + FiberStateOffset, out var state) ||
- !TryReadUInt64(ctx, fiber + FiberEntryOffset, out var entry) ||
- !TryReadUInt64(ctx, fiber + FiberArgOnInitializeOffset, out var argOnInitialize) ||
- !TryReadUInt64(ctx, fiber + FiberContextAddressOffset, out var contextAddress) ||
- !TryReadUInt64(ctx, fiber + FiberContextSizeOffset, out var contextSize) ||
- !TryReadUInt32(ctx, fiber + FiberFlagsOffset, out var flags) ||
+ if (!ctx.TryReadUInt32(fiber + FiberStateOffset, out var state) ||
+ !ctx.TryReadUInt64(fiber + FiberEntryOffset, out var entry) ||
+ !ctx.TryReadUInt64(fiber + FiberArgOnInitializeOffset, out var argOnInitialize) ||
+ !ctx.TryReadUInt64(fiber + FiberContextAddressOffset, out var contextAddress) ||
+ !ctx.TryReadUInt64(fiber + FiberContextSizeOffset, out var contextSize) ||
+ !ctx.TryReadUInt32(fiber + FiberFlagsOffset, out var flags) ||
!TryReadInlineName(ctx, fiber + FiberNameOffset, out var name))
{
return false;
@@ -898,46 +898,6 @@ public static class FiberExports
return 0;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
- private static bool TryReadUInt64(CpuContext ctx, ulong address, out ulong value)
- {
- Span buffer = stackalloc byte[sizeof(ulong)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt64LittleEndian(buffer);
- return true;
- }
-
- private static bool TryWriteUInt64(CpuContext ctx, ulong address, ulong value)
- {
- Span buffer = stackalloc byte[sizeof(ulong)];
- BinaryPrimitives.WriteUInt64LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
private static bool TryWriteName(CpuContext ctx, ulong address, string name)
{
Span buffer = stackalloc byte[MaxNameLength + 1];
@@ -965,31 +925,6 @@ public static class FiberExports
return true;
}
- private static bool TryReadNullTerminatedUtf8(CpuContext ctx, ulong address, int capacity, out string value)
- {
- var bytes = new byte[capacity];
- for (var index = 0; index < bytes.Length; index++)
- {
- Span current = stackalloc byte[1];
- if (!ctx.Memory.TryRead(address + (ulong)index, current))
- {
- value = string.Empty;
- return false;
- }
-
- if (current[0] == 0)
- {
- value = Encoding.UTF8.GetString(bytes, 0, index);
- return true;
- }
-
- bytes[index] = current[0];
- }
-
- value = Encoding.UTF8.GetString(bytes);
- return true;
- }
-
private static int SetReturn(CpuContext ctx, int result)
{
ctx[CpuRegister.Rax] = unchecked((ulong)result);
diff --git a/src/SharpEmu.Libs/Kernel/KernelAprCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelAprCompatExports.cs
index a4bd50d..d1e30bc 100644
--- a/src/SharpEmu.Libs/Kernel/KernelAprCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelAprCompatExports.cs
@@ -3,7 +3,6 @@
using SharpEmu.HLE;
using SharpEmu.Libs.Ampr;
-using System.Buffers.Binary;
using System.Collections.Concurrent;
using System.Threading;
@@ -50,7 +49,7 @@ public static class KernelAprCompatExports
return completionResult;
}
- if (outSubmissionId != 0 && !TryWriteUInt32(ctx, outSubmissionId, submissionId))
+ if (outSubmissionId != 0 && !ctx.TryWriteUInt32(outSubmissionId, submissionId))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -141,7 +140,7 @@ public static class KernelAprCompatExports
return completionResult;
}
- if (!TryWriteUInt32(ctx, outSubmissionId, submissionId))
+ if (!ctx.TryWriteUInt32(outSubmissionId, submissionId))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -178,13 +177,6 @@ public static class KernelAprCompatExports
return tag is 0x0C or 0x10;
}
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
private static void TraceApr(
CpuContext ctx,
string operation,
diff --git a/src/SharpEmu.Libs/Kernel/KernelEventFlagCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelEventFlagCompatExports.cs
index f1455e9..3fa7706 100644
--- a/src/SharpEmu.Libs/Kernel/KernelEventFlagCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelEventFlagCompatExports.cs
@@ -1,7 +1,6 @@
// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-using System.Buffers.Binary;
using System.Collections.Concurrent;
using System.Text;
using SharpEmu.HLE;
@@ -55,7 +54,7 @@ public static class KernelEventFlagCompatExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadNullTerminatedUtf8(ctx, nameAddress, MaxEventFlagNameLength + 1, out var name))
+ if (!ctx.TryReadNullTerminatedUtf8(nameAddress, MaxEventFlagNameLength + 1, out var name))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -219,7 +218,7 @@ public static class KernelEventFlagCompatExports
}
uint timeoutUsec = 0;
- if (timeoutAddress != 0 && !TryReadUInt32(ctx, timeoutAddress, out timeoutUsec))
+ if (timeoutAddress != 0 && !ctx.TryReadUInt32(timeoutAddress, out timeoutUsec))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -234,7 +233,7 @@ public static class KernelEventFlagCompatExports
if (timeoutAddress != 0)
{
- _ = TryWriteUInt32(ctx, timeoutAddress, 0);
+ _ = ctx.TryWriteUInt32(timeoutAddress, 0);
_ = TryWriteResultPattern(ctx, resultAddress, state.Bits);
TraceEventFlag($"wait-timeout handle=0x{handle:X16} pattern=0x{pattern:X16} timeout={timeoutUsec} ret=0x{returnRip:X16}");
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_TIMED_OUT);
@@ -340,7 +339,7 @@ public static class KernelEventFlagCompatExports
lock (state.Gate)
{
if (waiterCountAddress != 0 &&
- !TryWriteUInt32(ctx, waiterCountAddress, unchecked((uint)state.WaitingThreads)))
+ !ctx.TryWriteUInt32(waiterCountAddress, unchecked((uint)state.WaitingThreads)))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -453,77 +452,6 @@ public static class KernelEventFlagCompatExports
private static bool TryWriteResultPattern(CpuContext ctx, ulong address, ulong bits) =>
address == 0 || ctx.TryWriteUInt64(address, bits);
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
- private static bool TryReadUInt64(CpuContext ctx, ulong address, out ulong value)
- {
- Span buffer = stackalloc byte[sizeof(ulong)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt64LittleEndian(buffer);
- return true;
- }
-
- private static bool TryReadByte(CpuContext ctx, ulong address, out byte value)
- {
- Span buffer = stackalloc byte[1];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = buffer[0];
- return true;
- }
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
- private static bool TryReadNullTerminatedUtf8(CpuContext ctx, ulong address, int capacity, out string value)
- {
- var bytes = new byte[capacity];
- for (var index = 0; index < bytes.Length; index++)
- {
- Span current = stackalloc byte[1];
- if (!ctx.Memory.TryRead(address + (ulong)index, current))
- {
- value = string.Empty;
- return false;
- }
-
- if (current[0] == 0)
- {
- value = Encoding.UTF8.GetString(bytes, 0, index);
- return true;
- }
-
- bytes[index] = current[0];
- }
-
- value = Encoding.UTF8.GetString(bytes);
- return true;
- }
-
private static int SetReturn(CpuContext ctx, OrbisGen2Result result)
{
var value = (int)result;
@@ -614,7 +542,7 @@ public static class KernelEventFlagCompatExports
private static void AppendByte(StringBuilder builder, CpuContext ctx, ulong address, string name)
{
- if (TryReadByte(ctx, address, out var value))
+ if (ctx.TryReadByte(address, out var value))
{
builder.Append($" {name}=0x{value:X2}");
}
@@ -622,7 +550,7 @@ public static class KernelEventFlagCompatExports
private static void AppendUInt32(StringBuilder builder, CpuContext ctx, ulong address, string name)
{
- if (TryReadUInt32(ctx, address, out var value))
+ if (ctx.TryReadUInt32(address, out var value))
{
builder.Append($" {name}=0x{value:X8}");
}
@@ -630,7 +558,7 @@ public static class KernelEventFlagCompatExports
private static void AppendUInt64(StringBuilder builder, CpuContext ctx, ulong address, string name)
{
- if (TryReadUInt64(ctx, address, out var value))
+ if (ctx.TryReadUInt64(address, out var value))
{
builder.Append($" {name}=0x{value:X16}");
}
diff --git a/src/SharpEmu.Libs/Kernel/KernelEventQueueCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelEventQueueCompatExports.cs
index b23d0d6..f2d03e9 100644
--- a/src/SharpEmu.Libs/Kernel/KernelEventQueueCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelEventQueueCompatExports.cs
@@ -287,13 +287,13 @@ public static class KernelEventQueueCompatExports
}
uint timeoutUsec = 0;
- if (timeoutAddress != 0 && !TryReadUInt32(ctx, timeoutAddress, out timeoutUsec))
+ if (timeoutAddress != 0 && !ctx.TryReadUInt32(timeoutAddress, out timeoutUsec))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
var deliveredCount = DequeueEvents(ctx, handle, eventsAddress, eventCapacity);
- if (outCountAddress != 0 && !TryWriteUInt32(ctx, outCountAddress, (uint)deliveredCount))
+ if (outCountAddress != 0 && !ctx.TryWriteUInt32(outCountAddress, (uint)deliveredCount))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -336,7 +336,7 @@ public static class KernelEventQueueCompatExports
}
deliveredCount = DequeueEvents(ctx, handle, eventsAddress, eventCapacity);
- if (outCountAddress != 0 && !TryWriteUInt32(ctx, outCountAddress, (uint)deliveredCount))
+ if (outCountAddress != 0 && !ctx.TryWriteUInt32(outCountAddress, (uint)deliveredCount))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -541,7 +541,7 @@ public static class KernelEventQueueCompatExports
ulong outCountAddress)
{
var deliveredCount = DequeueEvents(ctx, handle, eventsAddress, eventCapacity);
- if (outCountAddress != 0 && !TryWriteUInt32(ctx, outCountAddress, (uint)deliveredCount))
+ if (outCountAddress != 0 && !ctx.TryWriteUInt32(outCountAddress, (uint)deliveredCount))
{
return (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -654,29 +654,8 @@ public static class KernelEventQueueCompatExports
return;
}
- var returnRip = 0UL;
- _ = ctx.TryReadUInt64(ctx[CpuRegister.Rsp], out returnRip);
+ _ = ctx.TryReadUInt64(ctx[CpuRegister.Rsp], out ulong returnRip);
Console.Error.WriteLine(
$"[LOADER][TRACE] equeue.{operation}: handle=0x{handle:X16} rsi=0x{ctx[CpuRegister.Rsi]:X16} rdx=0x{ctx[CpuRegister.Rdx]:X16} ret=0x{returnRip:X16}");
}
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
}
diff --git a/src/SharpEmu.Libs/Kernel/KernelMemoryCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelMemoryCompatExports.cs
index c549505..8f0c7b0 100644
--- a/src/SharpEmu.Libs/Kernel/KernelMemoryCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelMemoryCompatExports.cs
@@ -7,9 +7,7 @@ using System.Buffers;
using System.Buffers.Binary;
using System.Collections.Concurrent;
using System.Text;
-using System.Threading;
using System.Runtime.InteropServices;
-using System.Linq;
using System.Globalization;
namespace SharpEmu.Libs.Kernel;
@@ -4527,7 +4525,7 @@ public static class KernelMemoryCompatExports
continue;
}
- Span one = stackalloc byte[1];
+ var one = chunk.AsSpan(0, 1);
if (!TryReadCompat(ctx, current, one))
{
return false;
diff --git a/src/SharpEmu.Libs/Kernel/KernelPthreadCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelPthreadCompatExports.cs
index c2f82b6..12f1089 100644
--- a/src/SharpEmu.Libs/Kernel/KernelPthreadCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelPthreadCompatExports.cs
@@ -1018,19 +1018,12 @@ public static class KernelPthreadCompatExports
}
private static bool InitializeMutexObject(CpuContext ctx, ulong address, PthreadMutexState state) =>
- TryWriteUInt32(ctx, address + 0x20, unchecked((uint)state.Type)) &&
- TryWriteUInt32(ctx, address + 0x3C, unchecked((uint)state.Protocol));
+ ctx.TryWriteUInt32(address + 0x20, unchecked((uint)state.Type)) &&
+ ctx.TryWriteUInt32(address + 0x3C, unchecked((uint)state.Protocol));
private static bool WriteMutexAttrObject(CpuContext ctx, ulong address, PthreadMutexAttrState state) =>
- TryWriteUInt32(ctx, address, unchecked((uint)state.Type)) &&
- TryWriteUInt32(ctx, address + 4, unchecked((uint)state.Protocol));
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span bytes = stackalloc byte[sizeof(uint)];
- BitConverter.TryWriteBytes(bytes, value);
- return ctx.Memory.TryWrite(address, bytes);
- }
+ ctx.TryWriteUInt32(address, unchecked((uint)state.Type)) &&
+ ctx.TryWriteUInt32(address + 4, unchecked((uint)state.Protocol));
private static int PthreadCondInitCore(CpuContext ctx, ulong condAddress)
{
diff --git a/src/SharpEmu.Libs/Kernel/KernelSemaphoreCompatExports.cs b/src/SharpEmu.Libs/Kernel/KernelSemaphoreCompatExports.cs
index 23de3a9..5c64814 100644
--- a/src/SharpEmu.Libs/Kernel/KernelSemaphoreCompatExports.cs
+++ b/src/SharpEmu.Libs/Kernel/KernelSemaphoreCompatExports.cs
@@ -1,9 +1,7 @@
// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
-using System.Buffers.Binary;
using System.Collections.Concurrent;
-using System.Text;
using SharpEmu.HLE;
namespace SharpEmu.Libs.Kernel;
@@ -49,7 +47,7 @@ public static class KernelSemaphoreCompatExports
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_INVALID_ARGUMENT);
}
- if (!TryReadNullTerminatedUtf8(ctx, nameAddress, MaxSemaphoreNameLength, out var name))
+ if (!ctx.TryReadNullTerminatedUtf8(nameAddress, MaxSemaphoreNameLength, out var name))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -68,7 +66,7 @@ public static class KernelSemaphoreCompatExports
Count = initialCount,
};
- if (!TryWriteUInt32(ctx, semaphoreAddress, handle))
+ if (!ctx.TryWriteUInt32(semaphoreAddress, handle))
{
_semaphores.TryRemove(handle, out _);
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
@@ -110,12 +108,12 @@ public static class KernelSemaphoreCompatExports
if (timeoutAddress != 0)
{
- if (!TryReadUInt32(ctx, timeoutAddress, out _))
+ if (!ctx.TryReadUInt32(timeoutAddress, out _))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
- _ = TryWriteUInt32(ctx, timeoutAddress, 0);
+ _ = ctx.TryWriteUInt32(timeoutAddress, 0);
TraceSemaphore($"wait-timeout handle=0x{handle:X8} name='{semaphore.Name}' need={needCount} count={semaphore.Count}");
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_TIMED_OUT);
}
@@ -222,7 +220,7 @@ public static class KernelSemaphoreCompatExports
lock (semaphore.Gate)
{
- if (waitingThreadsAddress != 0 && !TryWriteUInt32(ctx, waitingThreadsAddress, unchecked((uint)semaphore.WaitingThreads)))
+ if (waitingThreadsAddress != 0 && !ctx.TryWriteUInt32(waitingThreadsAddress, unchecked((uint)semaphore.WaitingThreads)))
{
return SetReturn(ctx, OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -258,56 +256,6 @@ public static class KernelSemaphoreCompatExports
return value;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
- private static bool TryReadNullTerminatedUtf8(CpuContext ctx, ulong address, int maxLength, out string value)
- {
- value = string.Empty;
- if (address == 0 || maxLength <= 0)
- {
- return false;
- }
-
- var bytes = new byte[Math.Min(maxLength, 4096)];
- for (var i = 0; i < bytes.Length; i++)
- {
- Span current = stackalloc byte[1];
- if (!ctx.Memory.TryRead(address + (ulong)i, current))
- {
- return false;
- }
-
- if (current[0] == 0)
- {
- value = Encoding.UTF8.GetString(bytes, 0, i);
- return true;
- }
-
- bytes[i] = current[0];
- }
-
- value = Encoding.UTF8.GetString(bytes);
- return true;
- }
-
private static void TraceSemaphore(string message)
{
if (string.Equals(Environment.GetEnvironmentVariable("SHARPEMU_LOG_SEMA"), "1", StringComparison.Ordinal))
diff --git a/src/SharpEmu.Libs/PlayGo/PlayGoExports.cs b/src/SharpEmu.Libs/PlayGo/PlayGoExports.cs
index c51771c..e3bdc2e 100644
--- a/src/SharpEmu.Libs/PlayGo/PlayGoExports.cs
+++ b/src/SharpEmu.Libs/PlayGo/PlayGoExports.cs
@@ -234,7 +234,7 @@ public static class PlayGoExports
if (outChunkIdList == 0)
{
TracePlayGo($"get_chunk_id count_only entries={availableEntries} out_entries=0x{outEntries:X16}");
- return TryWriteUInt32(ctx, outEntries, availableEntries)
+ return ctx.TryWriteUInt32(outEntries, availableEntries)
? (int)OrbisGen2Result.ORBIS_GEN2_OK
: (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -256,7 +256,7 @@ public static class PlayGoExports
}
TracePlayGo($"get_chunk_id write requested={numberOfEntries} wrote={entriesToWrite} available={availableEntries}");
- return TryWriteUInt32(ctx, outEntries, entriesToWrite)
+ return ctx.TryWriteUInt32(outEntries, entriesToWrite)
? (int)OrbisGen2Result.ORBIS_GEN2_OK
: (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -503,7 +503,7 @@ public static class PlayGoExports
}
TracePlayGo($"get_todo requested={numberOfEntries} wrote=0");
- return TryWriteUInt32(ctx, outEntries, 0)
+ return ctx.TryWriteUInt32(outEntries, 0)
? (int)OrbisGen2Result.ORBIS_GEN2_OK
: (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT;
}
@@ -748,13 +748,6 @@ public static class PlayGoExports
return ctx.Memory.TryWrite(address, buffer);
}
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(buffer, value);
- return ctx.Memory.TryWrite(address, buffer);
- }
-
private static bool TryWriteInt32(CpuContext ctx, ulong address, int value)
{
Span buffer = stackalloc byte[sizeof(int)];
diff --git a/src/SharpEmu.Libs/SaveData/SaveDataDialogExports.cs b/src/SharpEmu.Libs/SaveData/SaveDataDialogExports.cs
index 2944ee6..9858f82 100644
--- a/src/SharpEmu.Libs/SaveData/SaveDataDialogExports.cs
+++ b/src/SharpEmu.Libs/SaveData/SaveDataDialogExports.cs
@@ -60,7 +60,7 @@ public static class SaveDataDialogExports
}
_lastMode = TryReadInt32(ctx, paramAddress, out var mode) ? mode : 0;
- _lastUserData = TryReadUInt64(ctx, paramAddress + 0xC8, out var userData) ? userData : 0;
+ _lastUserData = ctx.TryReadUInt64(paramAddress + 0xC8, out var userData) ? userData : 0;
// There is no host save dialog yet. Complete immediately with OK so
// guest polling sees a finished dialog instead of spinning forever.
@@ -182,19 +182,6 @@ public static class SaveDataDialogExports
return true;
}
- private static bool TryReadUInt64(CpuContext ctx, ulong address, out ulong value)
- {
- value = 0;
- Span bytes = stackalloc byte[sizeof(ulong)];
- if (!ctx.Memory.TryRead(address, bytes))
- {
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt64LittleEndian(bytes);
- return true;
- }
-
private static int SetReturn(CpuContext ctx, int result)
{
ctx[CpuRegister.Rax] = unchecked((ulong)result);
diff --git a/src/SharpEmu.Libs/SaveData/SaveDataExports.cs b/src/SharpEmu.Libs/SaveData/SaveDataExports.cs
index 8b448ac..6ec166f 100644
--- a/src/SharpEmu.Libs/SaveData/SaveDataExports.cs
+++ b/src/SharpEmu.Libs/SaveData/SaveDataExports.cs
@@ -108,8 +108,8 @@ public static class SaveDataExports
var setNum = result.DirNamesNum == 0
? 0
: Math.Min(result.DirNamesNum, entries.Count);
- if (!TryWriteUInt32(ctx, resultAddress + ResultHitNumOffset, checked((uint)entries.Count)) ||
- !TryWriteUInt32(ctx, resultAddress + ResultSetNumOffset, checked((uint)setNum)))
+ if (!ctx.TryWriteUInt32(resultAddress + ResultHitNumOffset, checked((uint)entries.Count)) ||
+ !ctx.TryWriteUInt32(resultAddress + ResultSetNumOffset, checked((uint)setNum)))
{
return SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -173,9 +173,9 @@ public static class SaveDataExports
!ctx.TryReadUInt64(mountAddress + 0x08, out var dirNameAddress) ||
!ctx.TryReadUInt64(mountAddress + 0x10, out var blocks) ||
!ctx.TryReadUInt64(mountAddress + 0x18, out var systemBlocks) ||
- !TryReadUInt32(ctx, mountAddress + 0x20, out var mountMode) ||
- !TryReadUInt32(ctx, mountAddress + 0x24, out var resource) ||
- !TryReadUInt32(ctx, mountAddress + 0x28, out var mode) ||
+ !ctx.TryReadUInt32(mountAddress + 0x20, out var mountMode) ||
+ !ctx.TryReadUInt32(mountAddress + 0x24, out var resource) ||
+ !ctx.TryReadUInt32(mountAddress + 0x28, out var mode) ||
dirNameAddress == 0 ||
!TryReadFixedAscii(ctx, dirNameAddress, SaveDataDirNameSize, out var dirName))
{
@@ -263,7 +263,7 @@ public static class SaveDataExports
var id = (uint)Interlocked.Increment(ref _nextTransactionResource);
- if (!TryWriteUInt32(ctx, resourceAddress, id))
+ if (!ctx.TryWriteUInt32(resourceAddress, id))
{
return SetReturn(ctx, (int)OrbisGen2Result.ORBIS_GEN2_ERROR_MEMORY_FAULT);
}
@@ -280,8 +280,8 @@ public static class SaveDataExports
if (!TryReadInt32(ctx, address, out var userId) ||
!ctx.TryReadUInt64(address + 0x08, out var titleIdAddress) ||
!ctx.TryReadUInt64(address + 0x10, out var dirNameAddress) ||
- !TryReadUInt32(ctx, address + 0x18, out var sortKey) ||
- !TryReadUInt32(ctx, address + 0x1C, out var sortOrder))
+ !ctx.TryReadUInt32(address + 0x18, out var sortKey) ||
+ !ctx.TryReadUInt32(address + 0x1C, out var sortOrder))
{
return false;
}
@@ -304,7 +304,7 @@ public static class SaveDataExports
{
result = default;
if (!ctx.TryReadUInt64(address + ResultDirNamesOffset, out var dirNamesAddress) ||
- !TryReadUInt32(ctx, address + ResultDirNamesNumOffset, out var dirNamesNum) ||
+ !ctx.TryReadUInt32(address + ResultDirNamesNumOffset, out var dirNamesNum) ||
!ctx.TryReadUInt64(address + ResultParamsOffset, out var paramsAddress) ||
!ctx.TryReadUInt64(address + ResultInfosOffset, out var infosAddress))
{
@@ -518,26 +518,6 @@ public static class SaveDataExports
return true;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span bytes = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, bytes))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(bytes);
- return true;
- }
-
- private static bool TryWriteUInt32(CpuContext ctx, ulong address, uint value)
- {
- Span bytes = stackalloc byte[sizeof(uint)];
- BinaryPrimitives.WriteUInt32LittleEndian(bytes, value);
- return ctx.Memory.TryWrite(address, bytes);
- }
-
private static int SetReturn(CpuContext ctx, int result)
{
ctx[CpuRegister.Rax] = unchecked((ulong)result);
diff --git a/src/SharpEmu.Libs/SharpEmu.Libs.csproj b/src/SharpEmu.Libs/SharpEmu.Libs.csproj
index 773ba5c..df6de17 100644
--- a/src/SharpEmu.Libs/SharpEmu.Libs.csproj
+++ b/src/SharpEmu.Libs/SharpEmu.Libs.csproj
@@ -15,6 +15,10 @@ SPDX-License-Identifier: GPL-2.0-or-later
+
+ $(NoWarn);1591
+
+
true
diff --git a/src/SharpEmu.Libs/VideoOut/VideoOutExports.cs b/src/SharpEmu.Libs/VideoOut/VideoOutExports.cs
index dcd984c..0933e8c 100644
--- a/src/SharpEmu.Libs/VideoOut/VideoOutExports.cs
+++ b/src/SharpEmu.Libs/VideoOut/VideoOutExports.cs
@@ -922,9 +922,9 @@ public static class VideoOutExports
private static bool TryReadBufferAttribute(CpuContext ctx, ulong attributeAddress, bool attribute2, out BufferAttribute attribute)
{
attribute = default;
- if (!TryReadUInt32(ctx, attributeAddress + 0x04, out var tilingMode) ||
- !TryReadUInt32(ctx, attributeAddress + 0x0C, out var width) ||
- !TryReadUInt32(ctx, attributeAddress + 0x10, out var height))
+ if (!ctx.TryReadUInt32(attributeAddress + 0x04, out var tilingMode) ||
+ !ctx.TryReadUInt32(attributeAddress + 0x0C, out var width) ||
+ !ctx.TryReadUInt32(attributeAddress + 0x10, out var height))
{
return false;
}
@@ -941,10 +941,10 @@ public static class VideoOutExports
return true;
}
- if (!TryReadUInt32(ctx, attributeAddress + 0x00, out var pixelFormat32) ||
- !TryReadUInt32(ctx, attributeAddress + 0x08, out var aspectRatio) ||
- !TryReadUInt32(ctx, attributeAddress + 0x14, out var pitchInPixel) ||
- !TryReadUInt32(ctx, attributeAddress + 0x18, out var option32))
+ if (!ctx.TryReadUInt32(attributeAddress + 0x00, out var pixelFormat32) ||
+ !ctx.TryReadUInt32(attributeAddress + 0x08, out var aspectRatio) ||
+ !ctx.TryReadUInt32(attributeAddress + 0x14, out var pitchInPixel) ||
+ !ctx.TryReadUInt32(attributeAddress + 0x18, out var option32))
{
return false;
}
@@ -1291,19 +1291,6 @@ public static class VideoOutExports
return true;
}
- private static bool TryReadUInt32(CpuContext ctx, ulong address, out uint value)
- {
- Span buffer = stackalloc byte[sizeof(uint)];
- if (!ctx.Memory.TryRead(address, buffer))
- {
- value = 0;
- return false;
- }
-
- value = BinaryPrimitives.ReadUInt32LittleEndian(buffer);
- return true;
- }
-
private static bool TryReadInt16(CpuContext ctx, ulong address, out short value)
{
Span buffer = stackalloc byte[sizeof(short)];
diff --git a/src/SharpEmu.Logging/SharpEmu.Logging.csproj b/src/SharpEmu.Logging/SharpEmu.Logging.csproj
index d56fbd4..5f834d8 100644
--- a/src/SharpEmu.Logging/SharpEmu.Logging.csproj
+++ b/src/SharpEmu.Logging/SharpEmu.Logging.csproj
@@ -4,4 +4,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
-->
+
+ $(NoWarn);1591
+