bastools/api/src/main/java/io/github/applecommander/bastools/api/code/BasicBuilder.java

121 lines
4.3 KiB
Java

package io.github.applecommander.bastools.api.code;
import java.util.Objects;
import io.github.applecommander.bastools.api.model.ApplesoftKeyword;
/**
* {@code BasicBuilder} allows BASIC commands to be built. Note that {@code #endLine()} and {{@link #endStatement()}
* are items that need to be invoked by hand.
* <p>
* By no means is this complete, but is being built out as the need arises.
*/
public class BasicBuilder {
private CodeBuilder builder;
public BasicBuilder(CodeBuilder builder) {
Objects.requireNonNull(builder);
this.builder = builder;
}
public CodeBuilder end() {
return this.builder;
}
/** Generate a "RETURN" statement. */
public BasicBuilder RETURN() {
builder.add(state -> state.write(ApplesoftKeyword.RETURN.code));
return this;
}
/** Generate a "GOTO <lineNumber>" statement. */
public BasicBuilder GOTO(int lineNumber) {
builder.add(state -> {
state.write(ApplesoftKeyword.GOTO.code);
state.write(Integer.toString(lineNumber).getBytes());
});
return this;
}
/** Generate a "GOSUB <lineNumber>" statement. */
public BasicBuilder GOSUB(int lineNumber) {
builder.add(state -> {
state.write(ApplesoftKeyword.GOSUB.code);
state.write(Integer.toString(lineNumber).getBytes());
});
return this;
}
/** Generate a "CALL <markAddress>" statement. */
public BasicBuilder CALL(CodeMark mark) {
builder.add(state -> {
int address = mark.getAddress();
state.write(ApplesoftKeyword.CALL.code);
state.write(Integer.toString(address).getBytes());
});
return this;
}
/** Generate a "POKE <address>,<lowMarkAddress>:POKE <address+1>,<highMarkAddress>" set of statements. */
public BasicBuilder POKEW(int address, CodeMark mark) {
builder.add(state -> {
int value = mark.getAddress();
state.write(ApplesoftKeyword.POKE.code);
state.write(Integer.toString(address).getBytes());
state.write(',');
state.write(Integer.toString(value & 0xff).getBytes());
state.write(':');
state.write(ApplesoftKeyword.POKE.code);
state.write(Integer.toString(address+1).getBytes());
state.write(',');
state.write(Integer.toString(value >> 8).getBytes());
});
return this;
}
/** Generate a statement separator. */
public BasicBuilder endStatement() {
builder.add(state -> state.write(':'));
return this;
}
/** Generate an assignment statement. */
public BasicBuilder assign(String varName, CodeMark mark) {
builder.add(state -> {
state.write(varName.getBytes());
state.write(ApplesoftKeyword.eq.code);
state.write(Integer.toString(mark.getAddress()).getBytes());
});
return this;
}
/** Generate an assignment statement. */
public BasicBuilder assign(String varName, int value) {
builder.add(state -> {
state.write(varName.getBytes());
state.write(ApplesoftKeyword.eq.code);
state.write(Integer.toString(value).getBytes());
});
return this;
}
/** End the current line. No more BASIC after this point! */
public CodeBuilder endLine() {
builder.add(state -> state.write(0x00));
return builder;
}
/** Generate a "ROT=<0-64>" statement. */
public BasicBuilder ROT(int lineNumber) {
builder.add(state -> {
state.write(ApplesoftKeyword.ROT.code);
state.write(Integer.toString(lineNumber).getBytes());
});
return this;
}
/** Generate a "SCALE=<1-255>" statement. */
public BasicBuilder SCALE(int lineNumber) {
builder.add(state -> {
state.write(ApplesoftKeyword.SCALE.code);
state.write(Integer.toString(lineNumber).getBytes());
});
return this;
}
/** Generate a "HCOLOR=<0-7>" statement. */
public BasicBuilder HCOLOR(int lineNumber) {
builder.add(state -> {
state.write(ApplesoftKeyword.HCOLOR.code);
state.write(Integer.toString(lineNumber).getBytes());
});
return this;
}
}