예제 #1
0
        public override void Compile(Assembly assembly, Scope scope, Register target)
        {
            var variable = scope.FindVariable(AsString);
            if (variable == null) throw new CompileError("Could not find variable " + AsString);

            if (variable.location == Register.CONST)
            {
                assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), variable.staticLabel);
            }
            else if (variable.location == Register.STATIC)
            {
                assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), "[" + variable.staticLabel + "]");
            }
            else if (variable.location == Register.STACK)
            {
                if (scope.stackDepth - variable.stackOffset > 1)
                {
                    assembly.Add("SET", Scope.TempRegister, "SP");
                    assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), "[" + hex(scope.stackDepth - variable.stackOffset - 1) + "+" + Scope.TempRegister + "]", "Fetching variable");
                }
                else
                    assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), "PEEK", "Fetching variable");
            }
            else
            {
                if (target == variable.location) return;
                assembly.Add("SET", Scope.GetRegisterLabelFirst((int)target), Scope.GetRegisterLabelSecond((int)variable.location), "Fetching variable");
            }
            if (target == Register.STACK) scope.stackDepth += 1;
        }
예제 #2
0
 public override void Compile(List<string> assembly, Scope scope)
 {
     var variable = scope.FindVariable(AsString);
     if (variable == null) throw new CompileError("Could not find variable " + AsString);
     if (scope.stackDepth - variable.stackOffset > 0)
     {
         assembly.Add("SET A, SP");
         assembly.Add("SET PUSH, [" + hex(scope.stackDepth - variable.stackOffset) + "+A]");
     }
     else
         assembly.Add("SET PUSH, PEEK");
     scope.stackDepth += 1;
 }
예제 #3
0
        public override void Compile(List<string> assembly, Scope scope)
        {
            if (ChildNodes[0] is VariableNameNode)
            {
                var variable = scope.FindVariable(ChildNodes[0].AsString);
                if (variable == null) throw new CompileError("Could not find variable " + ChildNodes[0].AsString);

                (ChildNodes[1] as CompilableNode).Compile(assembly, scope);
                assembly.Add("SET A, SP");
                assembly.Add("SET [" + hex(scope.stackDepth - variable.stackOffset) + "+A], POP");
                scope.stackDepth -= 1;
            }
            else if (ChildNodes[0] is DereferenceNode)
            {
                (ChildNodes[1] as CompilableNode).Compile(assembly, scope);
                (ChildNodes[0].ChildNodes[0] as CompilableNode).Compile(assembly, scope);
                assembly.Add("SET A, POP");
                assembly.Add("SET [A], POP");
                scope.stackDepth -= 2;
            }
        }
예제 #4
0
        public override void Compile(Assembly assembly, Scope scope, Register target)
        {
            if (ChildNodes[0] is VariableNameNode)
            {
                var variable = scope.FindVariable(ChildNodes[0].AsString);
                if (variable == null) throw new CompileError("Could not find variable " + ChildNodes[0].AsString);

                if (variable.location == Register.STACK)
                {
                    var register = scope.FindAndUseFreeRegister();
                    (ChildNodes[1] as CompilableNode).Compile(assembly, scope, (Register)register);
                    scope.FreeMaybeRegister(register);

                    if (scope.stackDepth - variable.stackOffset > 1)
                    {
                        assembly.Add("SET", Scope.TempRegister, "SP");
                        assembly.Add("SET", "[" + hex(scope.stackDepth - variable.stackOffset - 1) + "+" + Scope.TempRegister + "]",
                            Scope.GetRegisterLabelSecond(register), "Fetching variable");
                    }
                    else
                        assembly.Add("SET", "PEEK", Scope.GetRegisterLabelSecond(register), "Fetching variable");

                    if (register == (int)Register.STACK) scope.stackDepth -= 1;
                }
                else if (variable.location == Register.STATIC)
                {
                    //if (!variable.emitBrackets) throw new CompileError("Can't assign to data pointers!");
                     var register = scope.FindAndUseFreeRegister();
                    (ChildNodes[1] as CompilableNode).Compile(assembly, scope, (Register)register);
                    scope.FreeMaybeRegister(register);
                    assembly.Add("SET", "[" + variable.staticLabel + "]", Scope.GetRegisterLabelSecond(register));
                    if (register == (int)Register.STACK) scope.stackDepth -= 1;
                }
                else if (variable.location == Register.CONST)
                {
                    throw new CompileError("Can't assign to const");
                }
                else
                    (ChildNodes[1] as CompilableNode).Compile(assembly, scope, variable.location);

            }
            else if (ChildNodes[0] is DereferenceNode)
            {
                bool firstConstant = false;
                int firstRegister = (int)Register.STACK;

                if ((ChildNodes[0].ChildNodes[0] as CompilableNode).IsConstant())
                    firstConstant = true;
                else
                {
                    firstRegister = scope.FindAndUseFreeRegister();
                    (ChildNodes[0].ChildNodes[0] as CompilableNode).Compile(assembly, scope, (Register)firstRegister);
                }

                var secondRegister = scope.FindAndUseFreeRegister();
                (ChildNodes[1] as CompilableNode).Compile(assembly, scope, (Register)secondRegister);

                if (firstConstant)
                {
                    assembly.Add("SET", "[" + hex((ChildNodes[0].ChildNodes[0] as CompilableNode).GetConstantValue()) + "]",
                        Scope.GetRegisterLabelSecond(secondRegister));
                    if (secondRegister == (int)Register.STACK)
                        scope.stackDepth -= 1;
                    else
                        scope.FreeMaybeRegister(secondRegister);
                }
                else
                {
                    if (firstRegister == (int)Register.STACK && secondRegister == (int)Register.STACK)
                    {
                        assembly.Add("SET", Scope.TempRegister, "POP");
                        assembly.Add("SET", "[" + Scope.TempRegister + "]", "POP");
                        scope.stackDepth -= 2;
                    }
                    else if (secondRegister == (int)Register.STACK)
                    {
                        assembly.Add("SET", "[" + Scope.GetRegisterLabelFirst(firstRegister) + "]", "POP");
                        scope.stackDepth -= 1;
                        scope.FreeMaybeRegister(firstRegister);
                        return;
                    }
                    else if (firstRegister == (int)Register.STACK)
                    {
                        throw new CompileError("Impossible situation entered");
                    }
                    else
                    {
                        assembly.Add("SET", "[" + Scope.GetRegisterLabelFirst(firstRegister) + "]", Scope.GetRegisterLabelSecond(secondRegister));
                        scope.FreeMaybeRegister(firstRegister);
                        scope.FreeMaybeRegister(secondRegister);
                    }
                }
            }
        }