From be99821cedafde2823c005a631c492f00b295287 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Thu, 24 Jul 2025 23:09:01 +1000 Subject: [PATCH] Added Register Naming support in ISADefinition. --- src/SVM.Assembler.Core/Assembler.cs | 18 +++++++++++++ src/SVM.Assembler.Core/ISADefinition.cs | 31 ++++++++++++++++++++++ src/SVM.Assembler.Core/Linker.cs | 34 +++++++++++++++++++++++++ src/SVM.Assembler/ISA.xml | 4 +++ 4 files changed, 87 insertions(+) diff --git a/src/SVM.Assembler.Core/Assembler.cs b/src/SVM.Assembler.Core/Assembler.cs index 5d80859..fb102c0 100644 --- a/src/SVM.Assembler.Core/Assembler.cs +++ b/src/SVM.Assembler.Core/Assembler.cs @@ -239,6 +239,24 @@ LabelConstant InternalLbl public Dictionary data = new Dictionary(); public Dictionary consts = new Dictionary(); public List instructions = new List(); + public bool TryGetConst(string str, out string value) + { + return consts.TryGetValue(str, out value); + } + public bool TryGetLabelPC(string label, out int PC) + { + for (int i = 0; i < instructions.Count; i++) + { + IntermediateInstruction? item = instructions[i]; + if (item.Label != null && item.Label.Content == label) + { + PC = i; + return true; + } + } + PC = -1; + return false; + } } [Serializable] public class IntermediateInstruction diff --git a/src/SVM.Assembler.Core/ISADefinition.cs b/src/SVM.Assembler.Core/ISADefinition.cs index 312e843..2b7a667 100644 --- a/src/SVM.Assembler.Core/ISADefinition.cs +++ b/src/SVM.Assembler.Core/ISADefinition.cs @@ -12,6 +12,7 @@ namespace SVM.Assembler.Core [Serializable] public class ISADefinition { + public Dictionary RegisterNames = new Dictionary(); public Dictionary> Enums = new Dictionary>(); public Dictionary InstructionDefinitions = new Dictionary(); [NonSerialized] @@ -240,6 +241,36 @@ namespace SVM.Assembler.Core } } break; + case "Registers": + { + foreach (XmlNode enumNode in item.ChildNodes) + { + if (enumNode.Name == "Item") + { + + var keyAttr = enumNode.Attributes.GetNamedItem("Key"); + var valueAttr = enumNode.Attributes.GetNamedItem("Value"); + if (keyAttr == null || valueAttr == null) + { + definition = null; + return false; + } + if (!byte.TryParse(valueAttr.InnerText, out var RegID)) + { + definition = null; + return false; + } + isaDefinition.RegisterNames.Add(keyAttr.InnerText, RegID); + } + else + { + definition = null; + return false; + } + + } + } + break; case "Definitions": if (ParseDefinitions(item, ref isaDefinition) == false) { diff --git a/src/SVM.Assembler.Core/Linker.cs b/src/SVM.Assembler.Core/Linker.cs index 34402e3..ee44fc0 100644 --- a/src/SVM.Assembler.Core/Linker.cs +++ b/src/SVM.Assembler.Core/Linker.cs @@ -37,10 +37,44 @@ namespace SVM.Assembler.Core } return operationResult; } + public bool TryParseRegister(string input, IntermediateObject obj, LinkingContext context, out byte registerID) + { + if (input.StartsWith("$")) + { + + } + registerID = byte.MaxValue; + return false; + } public static OperationResult translate(InstructionDefinition def, LinkingContext context, IntermediateInstruction iinstruction) { OperationResult result = new OperationResult(); + for (int i = 0; i < iinstruction.Parameters.Count; i++) + { + var para = iinstruction.Parameters[i]; + var paraDef = def.ParameterPattern[i]; + string converter = paraDef.ExpectdValue.Converter; + if (converter.StartsWith("InternalEnum:")) + { + var enumName = converter["InternalEnum:".Length..]; + switch (enumName) + { + default: + break; + } + } + else + { + switch (converter) + { + case "Register": + break; + default: + break; + } + } + } return result; } public unsafe static OperationResult Finialize(ISADefinition definition, IntermediateObject Obj) diff --git a/src/SVM.Assembler/ISA.xml b/src/SVM.Assembler/ISA.xml index 0b8e82e..e504207 100644 --- a/src/SVM.Assembler/ISA.xml +++ b/src/SVM.Assembler/ISA.xml @@ -4,6 +4,10 @@ + + + +