mirror of
https://github.com/AppleCommander/bastools.git
synced 2024-12-22 14:29:22 +00:00
Generating binary AppleSoft program.
This commit is contained in:
parent
3dd328cb1a
commit
731930b56e
@ -1,5 +1,7 @@
|
|||||||
package net.sf.applecommander.bastokenizer;
|
package net.sf.applecommander.bastokenizer;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -25,4 +27,21 @@ public class Line {
|
|||||||
ps.println();
|
ps.println();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int toBytes(int address, ByteArrayOutputStream os) throws IOException {
|
||||||
|
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
|
||||||
|
for (Statement stmt : statements) {
|
||||||
|
if (tmp.size() > 0) tmp.write(':');
|
||||||
|
stmt.toBytes(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int nextAddress = address + tmp.size() + 5;
|
||||||
|
os.write(nextAddress);
|
||||||
|
os.write(nextAddress >> 8);
|
||||||
|
os.write(lineNumber);
|
||||||
|
os.write(lineNumber >> 8);
|
||||||
|
tmp.writeTo(os);
|
||||||
|
os.write(0x00);
|
||||||
|
return nextAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,5 +16,42 @@ public class Main {
|
|||||||
Parser parser = new Parser(tokens);
|
Parser parser = new Parser(tokens);
|
||||||
Program program = parser.parse();
|
Program program = parser.parse();
|
||||||
program.prettyPrint(System.out);
|
program.prettyPrint(System.out);
|
||||||
|
|
||||||
|
int address = 0x801;
|
||||||
|
byte[] data = program.toBytes(address);
|
||||||
|
print(address, data, false);
|
||||||
|
print(address, data, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void print(int address, byte[] data, boolean forApple) {
|
||||||
|
final int line = 16;
|
||||||
|
int offset = 0;
|
||||||
|
while (offset < data.length) {
|
||||||
|
System.out.printf("%04x: ", address);
|
||||||
|
for (int i=0; i<line; i++) {
|
||||||
|
if (offset < data.length) {
|
||||||
|
System.out.printf("%02x ", data[offset]);
|
||||||
|
} else if (!forApple) {
|
||||||
|
System.out.printf(".. ");
|
||||||
|
}
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
System.out.print(" ");
|
||||||
|
if (!forApple) {
|
||||||
|
offset -= line;
|
||||||
|
for (int i=0; i<line; i++) {
|
||||||
|
char ch = ' ';
|
||||||
|
if (offset < data.length) {
|
||||||
|
byte b = data[offset];
|
||||||
|
ch = (b >= ' ') ? (char)b : '.';
|
||||||
|
}
|
||||||
|
System.out.printf("%c", ch);
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.printf("\n");
|
||||||
|
address += line;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package net.sf.applecommander.bastokenizer;
|
package net.sf.applecommander.bastokenizer;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -12,4 +14,12 @@ public class Program {
|
|||||||
line.prettyPrint(ps);
|
line.prettyPrint(ps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public byte[] toBytes(int address) throws IOException {
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
for (Line line : lines) address = line.toBytes(address, os);
|
||||||
|
os.write(0x00);
|
||||||
|
os.write(0x00);
|
||||||
|
return os.toByteArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package net.sf.applecommander.bastokenizer;
|
package net.sf.applecommander.bastokenizer;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -12,4 +14,8 @@ public class Statement {
|
|||||||
token.prettyPrint(ps);
|
token.prettyPrint(ps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toBytes(ByteArrayOutputStream os) throws IOException {
|
||||||
|
for (Token t : tokens) t.toBytes(os);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package net.sf.applecommander.bastokenizer;
|
package net.sf.applecommander.bastokenizer;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class Token {
|
public class Token {
|
||||||
public final int line;
|
public final int line;
|
||||||
@ -58,6 +61,44 @@ public class Token {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void toBytes(ByteArrayOutputStream os) throws IOException {
|
||||||
|
switch (type) {
|
||||||
|
case COMMENT:
|
||||||
|
os.write(ApplesoftKeyword.REM.code);
|
||||||
|
os.write(text.getBytes());
|
||||||
|
break;
|
||||||
|
case EOL:
|
||||||
|
os.write(0x00);
|
||||||
|
break;
|
||||||
|
case IDENT:
|
||||||
|
os.write(text.getBytes());
|
||||||
|
break;
|
||||||
|
case KEYWORD:
|
||||||
|
os.write(keyword.code);
|
||||||
|
break;
|
||||||
|
case NUMBER:
|
||||||
|
if (Math.rint(number) == number) {
|
||||||
|
os.write(Integer.toString(number.intValue()).getBytes());
|
||||||
|
} else {
|
||||||
|
os.write(Double.toString(number).getBytes());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
os.write('"');
|
||||||
|
os.write(text.getBytes());
|
||||||
|
os.write('"');
|
||||||
|
break;
|
||||||
|
case SYNTAX:
|
||||||
|
Optional<ApplesoftKeyword> opt = ApplesoftKeyword.find(text);
|
||||||
|
if (opt.isPresent()) {
|
||||||
|
os.write(opt.get().code);
|
||||||
|
} else {
|
||||||
|
os.write(text.getBytes());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static Token eol(int line) {
|
public static Token eol(int line) {
|
||||||
return new Token(line, Type.EOL, null, null, null);
|
return new Token(line, Type.EOL, null, null, null);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user