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>RSRESET</code> and <code>RSSET</code> directives. * * @author Francis Gagné */ @Immutable class RsresetRssetDirective extends Mnemonic { @Nonnull static final RsresetRssetDirective RSRESET = new RsresetRssetDirective(true); @Nonnull static final RsresetRssetDirective RSSET = new RsresetRssetDirective(false); private final boolean operandIsOptional; private RsresetRssetDirective(boolean operandIsOptional) { this.operandIsOptional = operandIsOptional; } @Override void assemble(M68KAssemblyContext context) throws IOException { context.sizeNotAllowed(); if (!(this.operandIsOptional && context.numberOfOperands == 0 || context.numberOfOperands == 1)) { context.addWrongNumberOfOperandsErrorMessage(); } long value = 0; boolean signed = false; if (context.numberOfOperands >= 1) { final Value countValue = evaluateExpressionOperand(context, 0); final IntegerValueVisitor valueVisitor = context.integerValueVisitor; valueVisitor.reset(); Value.accept(countValue, valueVisitor); value = valueVisitor.getValue(); signed = valueVisitor.getSigned(); } context.rs.set(value, signed); } }