public void EmitInstruction(InstructionNode node) { EmitOpCode((OpCodes)Enum.Parse(typeof(OpCodes), node.Name, true)); var type = node.GetTypeInfo(); switch (type) { case InstructionType.LitReg: EmitLit(node.GetArg <HexLiteralNode>(0)); EmitReg(node.GetArg <RegisterLiteralNode>(1)); break; case InstructionType.RegLit: EmitReg(node.GetArg <RegisterLiteralNode>(0)); EmitLit(node.GetArg <HexLiteralNode>(1)); break; case InstructionType.RegLit8: EmitReg(node.GetArg <RegisterLiteralNode>(0)); EmitLit8(node.GetArg <LiteralNode>(1)); break; case InstructionType.Reg: EmitReg(node.GetArg <RegisterLiteralNode>(0)); break; case InstructionType.RegReg: EmitReg(node.GetArg <RegisterLiteralNode>(0)); EmitReg(node.GetArg <RegisterLiteralNode>(1)); break; case InstructionType.RegPtrReg: EmitReg(node.GetArg <RegisterLiteralNode>(0)); EmitReg(node.GetArg <RegisterLiteralNode>(1)); break; case InstructionType.Lit: EmitLit(node.GetArg <HexLiteralNode>(0)); break; case InstructionType.LitMem: EmitLit(node.GetArg <HexLiteralNode>(0)); EmitMem(node.GetArg <AddressLiteralNode>(1)); break; case InstructionType.RegMem: EmitReg(node.GetArg <RegisterLiteralNode>(0)); EmitMem(node.GetArg <AddressLiteralNode>(1)); break; case InstructionType.MemReg: EmitMem(node.GetArg <AddressLiteralNode>(0)); EmitReg(node.GetArg <RegisterLiteralNode>(1)); break; case InstructionType.LitOffReg: EmitLit(node.GetArg <HexLiteralNode>(0)); EmitReg(node.GetArg <RegisterLiteralNode>(1)); EmitReg(node.GetArg <RegisterLiteralNode>(2)); break; } }