2018-02-26 02:14:58 +01:00
|
|
|
using ChocolArm64.Events;
|
2018-02-05 00:08:20 +01:00
|
|
|
using System;
|
|
|
|
|
|
|
|
namespace ChocolArm64.State
|
|
|
|
{
|
2018-02-18 20:28:07 +01:00
|
|
|
public class AThreadState
|
2018-02-05 00:08:20 +01:00
|
|
|
{
|
|
|
|
internal const int LRIndex = 30;
|
|
|
|
internal const int ZRIndex = 31;
|
|
|
|
|
2018-02-06 16:15:08 +01:00
|
|
|
internal const int ErgSizeLog2 = 4;
|
|
|
|
internal const int DczSizeLog2 = 4;
|
|
|
|
|
2018-02-05 00:08:20 +01:00
|
|
|
public ulong X0, X1, X2, X3, X4, X5, X6, X7,
|
|
|
|
X8, X9, X10, X11, X12, X13, X14, X15,
|
|
|
|
X16, X17, X18, X19, X20, X21, X22, X23,
|
|
|
|
X24, X25, X26, X27, X28, X29, X30, X31;
|
|
|
|
|
|
|
|
public AVec V0, V1, V2, V3, V4, V5, V6, V7,
|
|
|
|
V8, V9, V10, V11, V12, V13, V14, V15,
|
|
|
|
V16, V17, V18, V19, V20, V21, V22, V23,
|
|
|
|
V24, V25, V26, V27, V28, V29, V30, V31;
|
|
|
|
|
|
|
|
public bool Overflow;
|
|
|
|
public bool Carry;
|
|
|
|
public bool Zero;
|
|
|
|
public bool Negative;
|
|
|
|
|
2018-02-06 16:15:08 +01:00
|
|
|
public int ProcessId;
|
|
|
|
public int ThreadId;
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-03-12 05:04:52 +01:00
|
|
|
public bool Running { get; set; }
|
|
|
|
|
2018-02-06 16:15:08 +01:00
|
|
|
public long TpidrEl0 { get; set; }
|
|
|
|
public long Tpidr { get; set; }
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-02-06 16:15:08 +01:00
|
|
|
public int Fpcr { get; set; }
|
|
|
|
public int Fpsr { get; set; }
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-02-06 16:15:08 +01:00
|
|
|
public uint CtrEl0 => 0x8444c004;
|
|
|
|
public uint DczidEl0 => 0x00000004;
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-03-11 00:51:55 +01:00
|
|
|
private const ulong TicksPerS = 19_200_000;
|
|
|
|
private const ulong TicksPerMS = TicksPerS / 1_000;
|
2018-02-12 04:37:20 +01:00
|
|
|
|
2018-03-11 00:51:55 +01:00
|
|
|
public ulong CntpctEl0 => (ulong)Environment.TickCount * TicksPerMS;
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-02-26 02:14:58 +01:00
|
|
|
public event EventHandler<AInstExceptionEventArgs> Break;
|
|
|
|
public event EventHandler<AInstExceptionEventArgs> SvcCall;
|
|
|
|
public event EventHandler<AInstUndefinedEventArgs> Undefined;
|
2018-02-10 14:24:16 +01:00
|
|
|
|
2018-02-12 04:37:20 +01:00
|
|
|
internal void OnBreak(int Imm)
|
2018-02-10 14:24:16 +01:00
|
|
|
{
|
2018-02-26 02:14:58 +01:00
|
|
|
Break?.Invoke(this, new AInstExceptionEventArgs(Imm));
|
2018-02-10 14:24:16 +01:00
|
|
|
}
|
2018-02-05 00:08:20 +01:00
|
|
|
|
2018-02-12 04:37:20 +01:00
|
|
|
internal void OnSvcCall(int Imm)
|
2018-02-05 00:08:20 +01:00
|
|
|
{
|
2018-02-26 02:14:58 +01:00
|
|
|
SvcCall?.Invoke(this, new AInstExceptionEventArgs(Imm));
|
2018-02-05 00:08:20 +01:00
|
|
|
}
|
|
|
|
|
2018-02-12 04:37:20 +01:00
|
|
|
internal void OnUndefined(long Position, int RawOpCode)
|
2018-02-05 00:08:20 +01:00
|
|
|
{
|
2018-02-26 02:14:58 +01:00
|
|
|
Undefined?.Invoke(this, new AInstUndefinedEventArgs(Position, RawOpCode));
|
2018-02-05 00:08:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|