コード例 #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 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)));
         }
     }
 }
コード例 #2
0
ファイル: OutAssembler.cs プロジェクト: orf53975/quasar-sharp
 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)));
         }
     }
 }
コード例 #3
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));
     }
 }
コード例 #4
0
ファイル: MovAssembler.cs プロジェクト: orf53975/quasar-sharp
        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);
                }
            }
        }