mirror of
https://github.com/creeperlv/SVM.git
synced 2026-01-10 20:39:54 +00:00
Working on the assembler.
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
using LibCLCC.NET.Lexer;
|
||||
using LibCLCC.NET.Operations;
|
||||
using SVM.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SVM.Assembler.Core
|
||||
{
|
||||
@@ -19,7 +22,10 @@ InstSD sd
|
||||
Register \${D}+
|
||||
LabelCode \.code\:
|
||||
LabelData \.data\:
|
||||
\.const\:
|
||||
string "".*""
|
||||
word \w*
|
||||
GenericLabel {word}\:
|
||||
LineEnd \n
|
||||
|
||||
OpAdd add
|
||||
@@ -42,11 +48,54 @@ OpSub BOp
|
||||
OpMul BOp
|
||||
OpDiv BOp
|
||||
LineEnd LE
|
||||
GenericLabel LblG
|
||||
LabelCode InternalLbl
|
||||
LabelData InternalLbl
|
||||
LabelConstant InternalLbl
|
||||
";
|
||||
LexerDefinition? definition;
|
||||
public Assembler()
|
||||
{
|
||||
LexerDefinition.TryParse(LexDefinition, out definition);
|
||||
if (LexerDefinition.TryParse(LexDefinition, out definition))
|
||||
{
|
||||
definition.Substitute();
|
||||
}
|
||||
}
|
||||
public OperationResult<IntermediateObject> Assemble(string input, string ID = "main.asm")
|
||||
{
|
||||
StringLexer lexer = new StringLexer();
|
||||
lexer.SetDefinition(definition);
|
||||
lexer.Content = input;
|
||||
lexer.SourceID = ID;
|
||||
OperationResult<IntermediateObject> operationResult = new OperationResult<IntermediateObject>();
|
||||
while (true)
|
||||
{
|
||||
var lexResult = lexer.Lex();
|
||||
if (lexResult.Result == null) break;
|
||||
var r = lexResult.Result;
|
||||
switch (r.LexSegmentId)
|
||||
{
|
||||
case "InternalLbl":
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return operationResult;
|
||||
}
|
||||
}
|
||||
[Serializable]
|
||||
public class IntermediateObject
|
||||
{
|
||||
public Dictionary<string, string> data = new Dictionary<string, string>();
|
||||
public List<IntermediateInstruction> instructions = new List<IntermediateInstruction>();
|
||||
}
|
||||
[Serializable]
|
||||
public class IntermediateInstruction
|
||||
{
|
||||
public string? Label = null;
|
||||
public PrimaryInstruction inst;
|
||||
public List<LexSegment> Parameters = new List<LexSegment>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace SVM.Core
|
||||
{
|
||||
public enum SVMInstDef : byte
|
||||
public enum PrimaryInstruction : byte
|
||||
{
|
||||
// 0 1 2 3 4 5 6
|
||||
// Math [I]Op [I]Type [R]L [R]R [R]T [I]CheckOF
|
||||
@@ -72,7 +72,7 @@ namespace SVM.Core
|
||||
|
||||
switch (def)
|
||||
{
|
||||
case SVMInstDef.BMath:
|
||||
case PrimaryInstruction.BMath:
|
||||
{
|
||||
var Op = Instruction.GetData<BMathOp>(1);
|
||||
var NativeType = Instruction.GetData<SVMNativeTypes>(2);
|
||||
@@ -102,16 +102,16 @@ namespace SVM.Core
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SVMInstDef.UMath:
|
||||
case PrimaryInstruction.UMath:
|
||||
break;
|
||||
case SVMInstDef.Cvt:
|
||||
case PrimaryInstruction.Cvt:
|
||||
{
|
||||
Convert(Instruction);
|
||||
}
|
||||
break;
|
||||
case SVMInstDef.Cmp:
|
||||
case PrimaryInstruction.Cmp:
|
||||
break;
|
||||
case SVMInstDef.SD:
|
||||
case PrimaryInstruction.SD:
|
||||
{
|
||||
var Reg = Instruction.GetData<byte>(1);
|
||||
PC++;
|
||||
@@ -120,19 +120,19 @@ namespace SVM.Core
|
||||
registers.SetData(Reg, data);
|
||||
}
|
||||
break;
|
||||
case SVMInstDef.JAL:
|
||||
case PrimaryInstruction.JAL:
|
||||
break;
|
||||
case SVMInstDef.JALF:
|
||||
case PrimaryInstruction.JALF:
|
||||
break;
|
||||
case SVMInstDef.Load:
|
||||
case PrimaryInstruction.Load:
|
||||
break;
|
||||
case SVMInstDef.Save:
|
||||
case PrimaryInstruction.Save:
|
||||
break;
|
||||
case SVMInstDef.Call:
|
||||
case PrimaryInstruction.Call:
|
||||
break;
|
||||
case SVMInstDef.Return:
|
||||
case PrimaryInstruction.Return:
|
||||
break;
|
||||
case SVMInstDef.System:
|
||||
case PrimaryInstruction.System:
|
||||
if (Config != null)
|
||||
{
|
||||
var target = Instruction.GetData<uint>(1);
|
||||
@@ -142,7 +142,7 @@ namespace SVM.Core
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SVMInstDef.SIMD:
|
||||
case PrimaryInstruction.SIMD:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -351,11 +351,11 @@ namespace SVM.Core
|
||||
return ((T*)(((byte*)dataPtr) + offset))[0];
|
||||
}
|
||||
}
|
||||
public SVMInstDef GetDef()
|
||||
public PrimaryInstruction GetDef()
|
||||
{
|
||||
fixed (ulong* dataPtr = &data)
|
||||
{
|
||||
return ((SVMInstDef*)dataPtr)[0];
|
||||
return ((PrimaryInstruction*)dataPtr)[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user