From a12f31867c6200e318b3946ee10df73a0700eaad Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 26 Jun 2018 01:09:32 -0300 Subject: [PATCH] Implement SvcGetThreadContext3 --- Events/AInstExceptionEventArgs.cs | 8 +++++--- Instruction/AInstEmitException.cs | 1 + State/AThreadState.cs | 19 +++++++++++++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Events/AInstExceptionEventArgs.cs b/Events/AInstExceptionEventArgs.cs index 34f90c8..a6853ea 100644 --- a/Events/AInstExceptionEventArgs.cs +++ b/Events/AInstExceptionEventArgs.cs @@ -4,11 +4,13 @@ namespace ChocolArm64.Events { public class AInstExceptionEventArgs : EventArgs { - public int Id { get; private set; } + public long Position { get; private set; } + public int Id { get; private set; } - public AInstExceptionEventArgs(int Id) + public AInstExceptionEventArgs(long Position, int Id) { - this.Id = Id; + this.Position = Position; + this.Id = Id; } } } \ No newline at end of file diff --git a/Instruction/AInstEmitException.cs b/Instruction/AInstEmitException.cs index 3e444c7..73d2096 100644 --- a/Instruction/AInstEmitException.cs +++ b/Instruction/AInstEmitException.cs @@ -25,6 +25,7 @@ namespace ChocolArm64.Instruction Context.EmitLdarg(ATranslatedSub.StateArgIdx); + Context.EmitLdc_I8(Op.Position); Context.EmitLdc_I4(Op.Id); Context.EmitPrivateCall(typeof(AThreadState), MthdName); diff --git a/State/AThreadState.cs b/State/AThreadState.cs index a93e4cf..a84e324 100644 --- a/State/AThreadState.cs +++ b/State/AThreadState.cs @@ -51,6 +51,17 @@ namespace ChocolArm64.State public int Fpcr { get; set; } public int Fpsr { get; set; } + public int Psr + { + get + { + return (Negative ? (int)APState.N : 0) | + (Zero ? (int)APState.Z : 0) | + (Carry ? (int)APState.C : 0) | + (Overflow ? (int)APState.V : 0); + } + } + public uint CtrEl0 => 0x8444c004; public uint DczidEl0 => 0x00000004; @@ -89,14 +100,14 @@ namespace ChocolArm64.State TickCounter.Start(); } - internal void OnBreak(int Imm) + internal void OnBreak(long Position, int Imm) { - Break?.Invoke(this, new AInstExceptionEventArgs(Imm)); + Break?.Invoke(this, new AInstExceptionEventArgs(Position, Imm)); } - internal void OnSvcCall(int Imm) + internal void OnSvcCall(long Position, int Imm) { - SvcCall?.Invoke(this, new AInstExceptionEventArgs(Imm)); + SvcCall?.Invoke(this, new AInstExceptionEventArgs(Position, Imm)); } internal void OnUndefined(long Position, int RawOpCode)