aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/State/NativeContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/State/NativeContext.cs')
-rw-r--r--ARMeilleure/State/NativeContext.cs42
1 files changed, 38 insertions, 4 deletions
diff --git a/ARMeilleure/State/NativeContext.cs b/ARMeilleure/State/NativeContext.cs
index 4e6a5302..eb54505c 100644
--- a/ARMeilleure/State/NativeContext.cs
+++ b/ARMeilleure/State/NativeContext.cs
@@ -14,7 +14,8 @@ namespace ARMeilleure.State
private const int TotalSize = RegisterConsts.IntRegsCount * IntSize +
RegisterConsts.VecRegsCount * VecSize +
- RegisterConsts.FlagsCount * FlagSize + ExtraSize;
+ RegisterConsts.FlagsCount * FlagSize +
+ RegisterConsts.FpFlagsCount * FlagSize + ExtraSize;
public IntPtr BasePtr { get; }
@@ -100,6 +101,38 @@ namespace ARMeilleure.State
Marshal.WriteInt32(BasePtr, offset, value ? 1 : 0);
}
+ public bool GetFPStateFlag(FPState flag)
+ {
+ if ((uint)flag >= RegisterConsts.FlagsCount)
+ {
+ throw new ArgumentException($"Invalid flag \"{flag}\" specified.");
+ }
+
+ int offset =
+ RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize + (int)flag * FlagSize;
+
+ int value = Marshal.ReadInt32(BasePtr, offset);
+
+ return value != 0;
+ }
+
+ public void SetFPStateFlag(FPState flag, bool value)
+ {
+ if ((uint)flag >= RegisterConsts.FlagsCount)
+ {
+ throw new ArgumentException($"Invalid flag \"{flag}\" specified.");
+ }
+
+ int offset =
+ RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize + (int)flag * FlagSize;
+
+ Marshal.WriteInt32(BasePtr, offset, value ? 1 : 0);
+ }
+
public int GetCounter()
{
return Marshal.ReadInt32(BasePtr, GetCounterOffset());
@@ -144,9 +177,10 @@ namespace ARMeilleure.State
public static int GetCounterOffset()
{
- return RegisterConsts.IntRegsCount * IntSize +
- RegisterConsts.VecRegsCount * VecSize +
- RegisterConsts.FlagsCount * FlagSize;
+ return RegisterConsts.IntRegsCount * IntSize +
+ RegisterConsts.VecRegsCount * VecSize +
+ RegisterConsts.FlagsCount * FlagSize +
+ RegisterConsts.FpFlagsCount * FlagSize;
}
public void Dispose()