1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-02 00:41:42 +00:00
kickc/src/main/java/dk/camelot64/kickc/model/Directive.java
2023-04-23 22:20:13 +02:00

181 lines
4.3 KiB
Java

package dk.camelot64.kickc.model;
import dk.camelot64.kickc.model.symbols.Procedure;
import dk.camelot64.kickc.model.values.ConstantValue;
import java.util.List;
/** A declaration directive. */
public class Directive {
private String name;
public Directive(String name) {
this.name = name;
}
public String getName() {
return name;
}
/** Variable declared const */
public static class Const extends Directive {
public Const() { super("const"); }
}
/** Variable declared volatile */
public static class Volatile extends Directive {
public Volatile() { super("volatile"); }
}
/** Variable declared register. */
public static class Register extends Directive {
public Register() { super("register"); }
}
/** Variable declared static. */
public static class Static extends Directive {
public Static() { super("static"); }
}
/** Function declared inline. */
static public class Inline extends Directive {
public Inline() { super("inline"); }
}
/**
* Bank to place code into. Used for determining call distance.
*/
static public class Bank extends Directive {
private String bankArea;
private Long bankNumber;
public Bank(String bankArea, Long bankNumber) {
super("bank" );
this.bankArea = bankArea;
this.bankNumber = bankNumber;
}
public String getBankArea() {
return bankArea;
}
public Long getBankNumber() {
return bankNumber;
}
}
/** Function declared intrinsic. */
public static class Intrinsic extends Directive {
public Intrinsic() { super("intrinsic"); }
}
/** Variable declared as extern. */
public static class Extern extends Directive {
public Extern() { super("extern"); }
}
/** Variable declared as export. */
public static class Export extends Directive {
public Export() { super("__export"); }
}
/** Variable __ssa */
public static class FormSsa extends Directive {
public FormSsa() { super("__ssa"); }
}
/** Variable __ma */
public static class FormMa extends Directive {
public FormMa() { super("__ma"); }
}
/** Variable __zp */
public static class MemZp extends Directive {
public MemZp() { super("__zp"); }
}
/** Variable __mem */
public static class MemMain extends Directive {
public MemMain() { super("__mem"); }
}
/** Function with specific declared calling convention. */
public static class CallingConvention extends Directive {
public Procedure.CallingConvention callingConvention;
public CallingConvention(Procedure.CallingConvention callingConvention) {
super(callingConvention.getName());
this.callingConvention = callingConvention;
}
}
/** Function declared interrupt. */
public static class Interrupt extends Directive {
public String interruptType;
public Interrupt(String interruptType) {
super(interruptType);
this.interruptType = interruptType;
}
}
/** Variable memory alignment. */
public static class Align extends Directive {
int alignment;
public Align(int alignment) {
super("__align");
this.alignment = alignment;
}
}
/** Variable hardcoded register directive. */
public static class NamedRegister extends Directive {
/** Name of register to use for the variable (if named) */
public String name;
public NamedRegister(String name) {
super("__register");
this.name = name;
}
}
/** Variable hardcoded __address() directive */
public static class Address extends Directive {
/** Expression for calculating the address. */
public ConstantValue addressValue;
/** Optional hard-coded address to use for storing the variable. */
public Long addressLiteral;
public Address(ConstantValue addressValue, Long addressLiteral) {
super("__address");
this.addressValue = addressValue;
this.addressLiteral = addressLiteral;
}
}
/** Reservation of zero-page addresses */
public static class ReserveZp extends Directive {
public List<Integer> reservedZp;
public ReserveZp(List<Integer> reservedZp) {
super("__reserve_zp");
this.reservedZp = reservedZp;
}
}
}