package org.reasm.m68k.assembly.internal; import java.io.IOException; import javax.annotation.Nonnull; import javax.annotation.concurrent.Immutable; import org.reasm.Value; /** * The <code>DBcc</code> instructions. * * @author Francis Gagné */ @Immutable class DecrementAndBranchInstruction extends TwoOperandIntegerInstruction { @Nonnull static final DecrementAndBranchInstruction DBCC = new DecrementAndBranchInstruction(IntegerConditionCode.CC); @Nonnull static final DecrementAndBranchInstruction DBCS = new DecrementAndBranchInstruction(IntegerConditionCode.CS); @Nonnull static final DecrementAndBranchInstruction DBEQ = new DecrementAndBranchInstruction(IntegerConditionCode.EQ); @Nonnull static final DecrementAndBranchInstruction DBF = new DecrementAndBranchInstruction(IntegerConditionCode.F); @Nonnull static final DecrementAndBranchInstruction DBGE = new DecrementAndBranchInstruction(IntegerConditionCode.GE); @Nonnull static final DecrementAndBranchInstruction DBGT = new DecrementAndBranchInstruction(IntegerConditionCode.GT); @Nonnull static final DecrementAndBranchInstruction DBHI = new DecrementAndBranchInstruction(IntegerConditionCode.HI); @Nonnull static final DecrementAndBranchInstruction DBHS = new DecrementAndBranchInstruction(IntegerConditionCode.HS); @Nonnull static final DecrementAndBranchInstruction DBLE = new DecrementAndBranchInstruction(IntegerConditionCode.LE); @Nonnull static final DecrementAndBranchInstruction DBLO = new DecrementAndBranchInstruction(IntegerConditionCode.LO); @Nonnull static final DecrementAndBranchInstruction DBLS = new DecrementAndBranchInstruction(IntegerConditionCode.LS); @Nonnull static final DecrementAndBranchInstruction DBLT = new DecrementAndBranchInstruction(IntegerConditionCode.LT); @Nonnull static final DecrementAndBranchInstruction DBMI = new DecrementAndBranchInstruction(IntegerConditionCode.MI); @Nonnull static final DecrementAndBranchInstruction DBNE = new DecrementAndBranchInstruction(IntegerConditionCode.NE); @Nonnull static final DecrementAndBranchInstruction DBPL = new DecrementAndBranchInstruction(IntegerConditionCode.PL); @Nonnull static final DecrementAndBranchInstruction DBRA = new DecrementAndBranchInstruction(IntegerConditionCode.F); @Nonnull static final DecrementAndBranchInstruction DBT = new DecrementAndBranchInstruction(IntegerConditionCode.T); @Nonnull static final DecrementAndBranchInstruction DBVC = new DecrementAndBranchInstruction(IntegerConditionCode.VC); @Nonnull static final DecrementAndBranchInstruction DBVS = new DecrementAndBranchInstruction(IntegerConditionCode.VS); @Nonnull private final IntegerConditionCode cc; private DecrementAndBranchInstruction(@Nonnull IntegerConditionCode cc) { this.cc = cc; } @Override void assemble(M68KAssemblyContext context, InstructionSize size) throws IOException { if (size != InstructionSize.DEFAULT && size != InstructionSize.WORD) { context.addInvalidSizeAttributeErrorMessage(); } // Parse the first operand (loop counter). final EffectiveAddress ea = context.ea0; context.getEffectiveAddress(context.getOperandText(0), AddressingModeCategory.DATA_REGISTER_DIRECT, InstructionSize.WORD, ea); // Parse and evaluate the label. final Value value = evaluateExpressionOperand(context, 1); final BranchLabelValueVisitor visitor = context.branchLabelValueVisitor; visitor.reset(size); visitor.outputSize = InstructionSize.BYTE; visitor.distance = 0; Value.accept(value, visitor); context.appendWord((short) (0b01010000_11001000 | this.cc.ordinal() << 8 | ea.getRegister())); context.appendWord((short) visitor.distance); } }