mirror of
https://github.com/ZuneDev/ZuneUIXTools.git
synced 2026-07-27 13:11:59 -07:00
51 lines
1.8 KiB
C#
51 lines
1.8 KiB
C#
using Microsoft.Iris.Markup;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
|
|
namespace Microsoft.Iris.Asm.Models;
|
|
|
|
[DebuggerDisplay("{ToString()} " + DebuggerDisplay)]
|
|
public record Instruction(string Mnemonic, IEnumerable<Operand> Operands, uint Offset) : CodeItem
|
|
{
|
|
public Instruction(OpCode opCode, OperationType? operationType, IEnumerable<Operand> operands, uint offset)
|
|
: this(InstructionSet.GetMnemonic(opCode, operationType), operands, offset)
|
|
{
|
|
}
|
|
|
|
public OpCode OpCode => InstructionSet.MnemonicToOpCode(Mnemonic);
|
|
|
|
public OperationType? OperationType => InstructionSet.TryOperationMnemonicToType(Mnemonic);
|
|
|
|
public override string ToString() => ToString(true);
|
|
|
|
public string ToString(bool uppercase)
|
|
{
|
|
var mnemonic = uppercase ? Mnemonic.ToUpperInvariant() : Mnemonic.ToLowerInvariant();
|
|
return Operands.Any()
|
|
? $"{mnemonic} {string.Join(", ", Operands)}"
|
|
: mnemonic;
|
|
}
|
|
|
|
public static Instruction Create(OpCode opCode, IEnumerable<Operand> operands, uint offset)
|
|
{
|
|
OperationType? operationType = null;
|
|
|
|
if (opCode is OpCode.Operation)
|
|
{
|
|
var operandsList = operands.ToList();
|
|
if (operandsList.Count != 2)
|
|
throw new System.ArgumentException("Operation instructions must have exactly two operands: the operation host index and the operation type.", nameof(operands));
|
|
|
|
var operandOperationValue = operandsList[1].Value;
|
|
if (operandOperationValue is byte or Markup.OperationType)
|
|
operationType = (OperationType?)(int?)(byte?)operandOperationValue;
|
|
|
|
operandsList.RemoveAt(1);
|
|
operands = operandsList;
|
|
}
|
|
|
|
return new(opCode, operationType, operands, offset);
|
|
}
|
|
}
|