예제 #1
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 2)
     {
         cgen.CreateError("{0} does not take {1} arguments!", ins.Name, ins.Operands.Count);
     }
     else if (!(ins.Operands[0] is TokenIntLiteral || ins.Operands[0] is TokenRegister) && !(ins.Operands[1] is TokenRegister))
     {
         cgen.CreateError("Unsupported addressing mode for instruction '{0}'", ins.Name);
     }
     else
     {
         TokenRegister op2    = ins.Operands[1] as TokenRegister;
         Opcode        opcode = Opcode.OUT;
         if (ins.Operands[0] is TokenRegister)
         {
             TokenRegister op1 = ins.Operands[0] as TokenRegister;
             str.Emit(new QuasarInstruction(opcode, new RegisterOperand(op1.Register), new RegisterOperand(op2.Register)));
         }
         else if (ins.Operands[0] is TokenIntLiteral)
         {
             TokenIntLiteral op1 = ins.Operands[0] as TokenIntLiteral;
             str.Emit(new QuasarInstruction(opcode, new IntegerOperand((int)op1.Value), new RegisterOperand(op2.Register)));
         }
     }
 }
예제 #2
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 2)
     {
         cgen.CreateError("{0} does not take {1} arguments!", ins.Name, ins.Operands.Count);
     }
     else if (!(ins.Operands[0] is TokenRegister) || (!(ins.Operands[1] is TokenRegister) && !(ins.Operands[1] is TokenIntLiteral) && !(ins.Operands[1] is TokenIdentifier)))
     {
         cgen.CreateError("Unsupported addressing mode for instruction '{0}'", ins.Name);
     }
     else
     {
         TokenRegister op1    = ins.Operands[0] as TokenRegister;
         Opcode        opcode = Opcode.ADD;
         if (ins.Operands[1] is TokenRegister)
         {
             TokenRegister op2 = ins.Operands[1] as TokenRegister;
             str.Emit(new QuasarInstruction(opcode, new RegisterOperand(op1.Register), new RegisterOperand(op2.Register)));
         }
         else if (ins.Operands[1] is TokenIntLiteral)
         {
             TokenIntLiteral op2 = ins.Operands[1] as TokenIntLiteral;
             Console.WriteLine("Add with " + op1.Register);
             str.Emit(new QuasarInstruction(opcode, new RegisterOperand(op1.Register), new IntegerOperand((int)op2.Value)));
         }
         else if (ins.Operands[1] is TokenIdentifier)
         {
             TokenIdentifier ident = ins.Operands[1] as TokenIdentifier;
             str.Emit(new QuasarInstruction(opcode, new RegisterOperand(op1.Register), new SymbolReferenceOperand(ident.Value)));
         }
     }
 }
예제 #3
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 0)
     {
         cgen.CreateError("{0} does not take {1} arguments!", ins.Name, ins.Operands.Count);
     }
     else
     {
         str.Emit(new QuasarInstruction(Opcode.IRTN));
     }
 }
예제 #4
0
        public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
        {
            if (ins.Operands.Count != 1)
            {
                cgen.CreateError("Instruction {0} does not take {1} operand(s)!", ins.Name, ins.Operands.Count);
            }
            else if (ins.Operands[0] is TokenIdentifier)
            {
                TokenIdentifier label = ins.Operands[0] as TokenIdentifier;

                str.Emit(new QuasarInstruction(Opcode.BSR, new SymbolReferenceOperand(label.Value, true)));
            }
        }
예제 #5
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 1)
     {
         cgen.CreateError("Directive {0} does not take {1} operands!", ins.Name, ins.Operands.Count);
     }
     else if (!(ins.Operands[0] is TokenIntLiteral))
     {
         cgen.CreateError("Integer size expected!");
     }
     else
     {
         str.Emit(new QuasarData(new byte[((TokenIntLiteral)ins.Operands[0]).Value]));
     }
 }
예제 #6
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 1)
     {
         cgen.CreateError("{0} does not take {1} arguments!", ins.Name, ins.Operands.Count);
     }
     else if (!(ins.Operands[0] is TokenRegister))
     {
         cgen.CreateError("Unsupported addressing mode for instruction '{0}'", ins.Name);
     }
     else
     {
         TokenRegister src = ins.Operands[0] as TokenRegister;
         str.Emit(new QuasarInstruction(Opcode.LCTL, new RegisterOperand(src.Register)));
     }
 }
예제 #7
0
        public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryWriter bw = new BinaryWriter(ms);
                foreach (AbstractToken tok in ins.Operands)
                {
                    if (tok is TokenIntLiteral)
                    {
                        bw.Write((byte)((TokenIntLiteral)tok).Value);
                    }
                }

                str.Emit(new QuasarData(ms.ToArray()));
            }
        }
예제 #8
0
 public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
 {
     if (ins.Operands.Count != 1)
     {
         cgen.CreateError("{0} does not take {1} arguments!", ins.Name, ins.Operands.Count);
     }
     else if (!(ins.Operands[0] is TokenIntLiteral))
     {
         cgen.CreateError("Unsupported addressing mode for instruction '{0}'", ins.Name);
     }
     else
     {
         TokenIntLiteral il = ins.Operands[0] as TokenIntLiteral;
         str.Emit(new OrgDirective((uint)il.Value));
     }
 }
예제 #9
0
        public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
        {
            if (ins.Operands.Count != 1)
            {
                cgen.CreateError("Instruction {0} does not take {1} operand(s)!", ins.Name, ins.Operands.Count);
            }
            else if (ins.Operands[0] is TokenIdentifier)
            {
                TokenIdentifier     label = ins.Operands[0] as TokenIdentifier;
                QuasarConditionCode code  = QuasarConditionCode.NONE;
                switch (ins.Name)
                {
                case "bc":
                    code = QuasarConditionCode.C;
                    break;

                case "bs":
                    code = QuasarConditionCode.N;
                    break;

                case "bv":
                    code = QuasarConditionCode.V;
                    break;

                case "bz":
                    code = QuasarConditionCode.Z;
                    break;

                case "be":
                    code = QuasarConditionCode.EQ;
                    break;

                case "bne":
                    code = QuasarConditionCode.NE;
                    break;

                case "ba":
                    code = QuasarConditionCode.AB;
                    break;

                case "bb":
                    code = QuasarConditionCode.BL;
                    break;

                case "bl":
                    code = QuasarConditionCode.LT;
                    break;

                case "bg":
                    code = QuasarConditionCode.GT;
                    break;

                case "ble":
                    code = QuasarConditionCode.LE;
                    break;

                case "bge":
                    code = QuasarConditionCode.GE;
                    break;
                }
                str.Emit(new QuasarInstruction(Opcode.BR, new ConditionCodeOperand(code), new SymbolReferenceOperand(label.Value, true)));
            }
        }
예제 #10
0
        public override void Assemble(CodeGenerator cgen, Instruction ins, BytecodeStream str)
        {
            if (ins.Operands.Count != 2)
            {
                cgen.CreateError("Instruction {0} does not take {1} operand(s)!", ins.Name, ins.Operands.Count);
            }
            else if (ins.Name == "movb")
            {
                if (ins.Operands[0] is TokenIndirectRegister &&
                    ins.Operands[1] is TokenRegister)
                {
                    TokenIndirectRegister r1 = ins.Operands[0] as TokenIndirectRegister;
                    TokenRegister         r2 = ins.Operands[1] as TokenRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new IndirectRegisterOffsetOperand(r1.Register, AddressingMode.REGISTER_INDIRECT_BYTE, r1.Offset),
                                                   new RegisterOperand(r2.Register)));
                }
                else if (ins.Operands[0] is TokenIndirectRegister &&
                         ins.Operands[1] is TokenRegister)
                {
                    TokenIndirectRegister r1 = ins.Operands[0] as TokenIndirectRegister;
                    TokenRegister         r2 = ins.Operands[1] as TokenRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new IndirectRegisterOffsetOperand(r1.Register, AddressingMode.REGISTER_INDIRECT_BYTE, r1.Offset),
                                                   new RegisterOperand(r2.Register)));
                }
            }
            else if (ins.Name == "movw")
            {
                if (ins.Operands[0] is TokenIndirectRegister &&
                    ins.Operands[1] is TokenRegister)
                {
                    TokenIndirectRegister r1 = ins.Operands[0] as TokenIndirectRegister;
                    TokenRegister         r2 = ins.Operands[1] as TokenRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new IndirectRegisterOffsetOperand(r1.Register, AddressingMode.REGISTER_INDIRECT_WORD, r1.Offset),
                                                   new RegisterOperand(r2.Register)));
                }
            }
            else
            {
                if (ins.Operands[0] is TokenRegister &&
                    ins.Operands[1] is TokenRegister)
                {
                    TokenRegister r1 = ins.Operands[0] as TokenRegister;
                    TokenRegister r2 = ins.Operands[1] as TokenRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new RegisterOperand(r1.Register),
                                                   new RegisterOperand(r2.Register)));
                }
                else if (ins.Operands[0] is TokenRegister &&
                         ins.Operands[1] is TokenIntLiteral)
                {
                    TokenRegister   r1 = ins.Operands[0] as TokenRegister;
                    TokenIntLiteral i1 = ins.Operands[1] as TokenIntLiteral;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new RegisterOperand(r1.Register),
                                                   new IntegerOperand((int)i1.Value)));
                }
                else if (ins.Operands[0] is TokenRegister &&
                         ins.Operands[1] is TokenIdentifier)
                {
                    TokenRegister   r1 = ins.Operands[0] as TokenRegister;
                    TokenIdentifier i1 = ins.Operands[1] as TokenIdentifier;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new RegisterOperand(r1.Register),
                                                   new SymbolReferenceOperand(i1.Value)));
                }
                else if (ins.Operands[0] is TokenRegister &&
                         ins.Operands[1] is TokenIndirectRegister)
                {
                    TokenRegister         r1 = ins.Operands[0] as TokenRegister;
                    TokenIndirectRegister r2 = ins.Operands[1] as TokenIndirectRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new RegisterOperand(r1.Register),
                                                   new IndirectRegisterOffsetOperand(r2.Register, r2.Offset)));
                }
                else if (ins.Operands[0] is TokenIndirectRegister &&
                         ins.Operands[1] is TokenRegister)
                {
                    TokenIndirectRegister r1 = ins.Operands[0] as TokenIndirectRegister;

                    TokenRegister r2 = ins.Operands[1] as TokenRegister;
                    str.Emit(new QuasarInstruction(Opcode.MOV, new IndirectRegisterOffsetOperand(r1.Register, AddressingMode.REGISTER_INDIRECT, r1.Offset),
                                                   new RegisterOperand(r2.Register)));
                }
                else
                {
                    cgen.CreateError("Unsupported addressing mode for instruction {0}", ins.Name);
                }
            }
        }