Skip to content

Commit 9a8148b

Browse files
author
azertyfun
committed
Added .org directive
1 parent 4c26485 commit 9a8148b

File tree

5 files changed

+26
-6
lines changed

5 files changed

+26
-6
lines changed

src/tk/azertyfun/dcputoolchain/AssemblerManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public boolean assemble() {
100100
System.out.print("Optimizing... ");
101101
start = System.currentTimeMillis();
102102

103-
FinalOptimizer finalOptimizer = new FinalOptimizer(tokens, optimize_shortLiterals);
103+
FinalOptimizer finalOptimizer = new FinalOptimizer(sourceManager, tokens, optimize_shortLiterals);
104104
finalOptimizer.optimize();
105105

106106
System.out.println("Done in " + (System.currentTimeMillis() - start) + " ms.");

src/tk/azertyfun/dcputoolchain/assembler/FinalOptimizer.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,23 @@
22

33
import tk.azertyfun.dcputoolchain.assembler.arguments.ArgumentOptimizable;
44
import tk.azertyfun.dcputoolchain.assembler.exceptions.ParsingException;
5+
import tk.azertyfun.dcputoolchain.assembler.sourceManagement.SourceManager;
56

67
import java.util.HashMap;
78
import java.util.LinkedList;
89

910
public class FinalOptimizer {
1011

12+
private SourceManager sourceManager;
13+
1114
private LinkedList<Token> tokens;
1215

1316
private HashMap<String, Character> labelToValue = new HashMap<>();
1417

1518
private boolean optimizeShortLiterals;
1619

17-
public FinalOptimizer(LinkedList<Token> tokens, boolean optimizeShortLiterals) {
20+
public FinalOptimizer(SourceManager sourceManager, LinkedList<Token> tokens, boolean optimizeShortLiterals) {
21+
this.sourceManager = sourceManager;
1822
this.tokens = tokens;
1923
this.optimizeShortLiterals = optimizeShortLiterals;
2024
}
@@ -38,8 +42,8 @@ public void optimize() throws ParsingException {
3842
}
3943
for (Token token : tokens) {
4044
if (!token.isDat() && !token.isLabel()) {
41-
token.getA().makeValueLiteral(labelToValue);
42-
token.getB().makeValueLiteral(labelToValue);
45+
token.getA().makeValueLiteral(labelToValue, sourceManager.getOffset());
46+
token.getB().makeValueLiteral(labelToValue, sourceManager.getOffset());
4347
} else if(token.isDat()) {
4448
token.makeDatValueLiteral(labelToValue);
4549
}

src/tk/azertyfun/dcputoolchain/assembler/Preprocessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ public void processDefines() throws ParsingException {
3333
else
3434
throw new ParsingException("Error: Excpected 2 arguments for magic directive, got " + (splitted.length - 1) + " at " + line.getFile() + ":" + line.getLine() + " (" + line.getOriginal_line() + ")");
3535
line.setLine(""); //Set the line for deletion
36+
} else if(splitted[0].equalsIgnoreCase(".org") || splitted[0].equalsIgnoreCase("#org")) {
37+
if(splitted.length == 2)
38+
sourceManager.setOffset(Parser.parseNumber(splitted[1], line));
39+
else
40+
throw new ParsingException("Error: Expected 1 arguments for org directive, got " + (splitted.length - 1) + " at " + line.getFile() + ":" + line.getLine() + " (" + line.getOriginal_line() + ")");
41+
line.setLine(""); //Set the line for deletion
3642
}
3743
}
3844

src/tk/azertyfun/dcputoolchain/assembler/arguments/Argument.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
public abstract class Argument {
88
protected Value value = new Value('\0');
99

10-
public void makeValueLiteral(HashMap<String, Character> labels) throws ParsingException {
10+
public void makeValueLiteral(HashMap<String, Character> labels, char offset) throws ParsingException {
1111
if(!value.isLiteral) {
1212
if(labels.containsKey(value.label.toUpperCase()))
13-
value.literal = labels.get(value.label.toUpperCase());
13+
value.literal = (char) (labels.get(value.label.toUpperCase()) + offset);
1414
else
1515
throw new ParsingException("Error: Can't find label declaration for " + value.label);
1616
//value.isLiteral = true;

src/tk/azertyfun/dcputoolchain/assembler/sourceManagement/SourceManager.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public class SourceManager {
1313
private LinkedList<Label> labels = new LinkedList<>();
1414
private HashMap<Character, Character> magic = new HashMap<>();
1515

16+
private char offset = 0;
17+
1618
public SourceManager() {
1719

1820
}
@@ -60,6 +62,10 @@ public void addMagic(char location, char magic) {
6062
this.magic.put(location, magic);
6163
}
6264

65+
public void setOffset(char offset) {
66+
this.offset = offset;
67+
}
68+
6369
public LinkedList<String> getS_labels() {
6470
return s_labels;
6571
}
@@ -81,4 +87,8 @@ public String toString() {
8187
public HashMap<Character, Character> getMagic() {
8288
return magic;
8389
}
90+
91+
public char getOffset() {
92+
return offset;
93+
}
8494
}

0 commit comments

Comments
 (0)