package org.reasm.m68k.assembly.internal;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.Immutable;
import org.reasm.AssemblyErrorMessage;
import org.reasm.m68k.messages.DephaseWithoutPhaseErrorMessage;
import org.reasm.m68k.messages.ObjendWithoutObjErrorMessage;
/**
* The <code>OBJEND</code> and <code>DEPHASE</code> directives.
*
* @author Francis Gagné
*/
@Immutable
abstract class ObjendDirective extends Mnemonic {
@Nonnull
static final ObjendDirective DEPHASE = new ObjendDirective() {
@Override
AssemblyErrorMessage createWrongContextErrorMessage() {
return new DephaseWithoutPhaseErrorMessage();
}
};
@Nonnull
static final ObjendDirective OBJEND = new ObjendDirective() {
@Override
AssemblyErrorMessage createWrongContextErrorMessage() {
return new ObjendWithoutObjErrorMessage();
}
};
@Override
void assemble(M68KAssemblyContext context) {
context.sizeNotAllowed();
context.requireNumberOfOperands(0);
final Object block = context.getParentBlock();
if (!(block instanceof ObjBlockState)) {
context.addMessage(this.createWrongContextErrorMessage());
}
}
@Nonnull
abstract AssemblyErrorMessage createWrongContextErrorMessage();
}