Skip to content

Commit

Permalink
initial SDCC support!
Browse files Browse the repository at this point in the history
  • Loading branch information
santiontanon committed Aug 9, 2020
1 parent 3e2c366 commit 7261006
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 25 deletions.
7 changes: 7 additions & 0 deletions src/main/java/parser/ExpressionParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public class ExpressionParser {

// dialect-specific variables:
public List<Integer> sjasmConterVariables = new ArrayList<>();

public boolean sdccStyleHashMarksForConstants = false;


public ExpressionParser(MDLConfig a_config)
{
Expand Down Expand Up @@ -258,6 +261,10 @@ public Expression parse(List<String> tokens, SourceStatement s, SourceStatement

public Expression parseInternal(List<String> tokens, SourceStatement s, SourceStatement previous, CodeBase code)
{
if (sdccStyleHashMarksForConstants && tokens.size() >= 1 && tokens.get(0).equals("#")) {
tokens.remove(0);
}

if (tokens.size() >= 1 &&
Tokenizer.isInteger(tokens.get(0))) {
// integer constant:
Expand Down
30 changes: 26 additions & 4 deletions src/main/java/parser/LineParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class LineParser {
public String KEYWORD_DW = "dw";
public String KEYWORD_DD = "dd";
public String KEYWORD_DS = "ds";
public String KEYWORD_COLON = ":";
HashMap<String, String> keywordSynonyms = new HashMap<>();
public List<String> keywordsHintingALabel = new ArrayList<>();

Expand All @@ -42,6 +43,8 @@ public class LineParser {
public boolean macroNameIsFirstArgumentOfMacro = false;
public boolean allowNumberLabels = false; // also for sjasm (for "reusable" labels)

public boolean sdccStyleOffsets = false;

MDLConfig config;
CodeBaseParser codeBaseParser;

Expand Down Expand Up @@ -115,9 +118,12 @@ public String newSymbolName(String rawName, Expression value, SourceStatement pr
name = config.dialectParser.newSymbolName(name, value, previous);
}

if (!allowNumberLabels || !Tokenizer.isInteger(name)) {
if (allowNumberLabels && Tokenizer.isInteger(name)) {
return name;
} else {
name = labelPrefix + name;
}

return name;
}

Expand Down Expand Up @@ -251,7 +257,7 @@ public boolean parseLabel(List<String> tokens, SourceLine sl, SourceStatement s,

if (tokens.size() >= 2
&& canBeLabel(token)
&& tokens.get(1).equals(":")) {
&& isKeyword(tokens.get(1),KEYWORD_COLON)) {
Expression exp = Expression.symbolExpression(CodeBase.CURRENT_ADDRESS, s, code, config);

if (tokens.size() >= 3) {
Expand Down Expand Up @@ -682,9 +688,25 @@ public boolean parseCPUOp(List<String> tokens, String opName, SourceLine sl,
if (exp == null) {
config.error("parseCPUOp: Cannot parse line " + sl);
return false;
} else {
arguments.add(exp);
}

if (sdccStyleOffsets && !tokens.isEmpty()) {
if (tokens.get(0).equals("(")) {
// offset of the type: "offset (register)", meaning (register+offset):
Expression exp2 = config.expressionParser.parse(tokens, s, previous, code);
if (exp2 == null || exp2.type != Expression.EXPRESSION_PARENTHESIS ||
exp2.args.size()!=1 ||
exp2.args.get(0).type != Expression.EXPRESSION_REGISTER_OR_FLAG) {
config.error("parseCPUOp: Cannot parse line " + sl);
return false;
}
Expression exp_tmp = Expression.operatorExpression(Expression.EXPRESSION_SUM, exp2.args.get(0), exp, config);
exp2.args.set(0, exp_tmp);
exp = exp2;
}
}

arguments.add(exp);
if (!tokens.isEmpty() && tokens.get(0).equals(",")) {
tokens.remove(0);
} else {
Expand Down
33 changes: 25 additions & 8 deletions src/main/java/parser/Tokenizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ public class Tokenizer {
doubleTokens.add(":=");
doubleTokens.add("++");
doubleTokens.add("--");
doubleTokens.add("::");
doubleTokens.add("=:");
doubleTokens.add("==");
}

public static boolean allowAndpersandHex = false;
public static boolean sdccStyleHashMarksForConstants = false;
public static boolean sdccStyleDollarInLabels = false;


static Matcher doubleMatcher = Pattern.compile("[\\x00-\\x20]*[+-]?(((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*")
Expand All @@ -51,8 +56,12 @@ public static List<String> tokenize(String line, List<String> tokens) {


public static List<String> tokenize(String line, List<String> tokens, boolean includeBlanks) {

StringTokenizer st = new StringTokenizer(line, " \r\n\t()[]#$,;:+-*/%|&'\"!?<>=~^{}", true);
StringTokenizer st;
if (sdccStyleDollarInLabels) {
st = new StringTokenizer(line, " \r\n\t()[]#,;:+-*/%|&'\"!?<>=~^{}", true);
} else {
st = new StringTokenizer(line, " \r\n\t()[]#$,;:+-*/%|&'\"!?<>=~^{}", true);
}
String previous = null;
while(st.hasMoreTokens()) {
String next = st.nextToken();
Expand All @@ -63,12 +72,14 @@ public static List<String> tokenize(String line, List<String> tokens, boolean in
previous = previous+next;
continue;
}
if (previous.equals("#") && isHexCharacter(next.charAt(0))) {
// merge, as this is just a single symbol
tokens.remove(tokens.size()-1);
tokens.add(previous+next);
previous = previous+next;
continue;
if (!sdccStyleHashMarksForConstants) {
if (previous.equals("#") && isHexCharacter(next.charAt(0))) {
// merge, as this is just a single symbol
tokens.remove(tokens.size()-1);
tokens.add(previous+next);
previous = previous+next;
continue;
}
}
if (previous.equals("$") && isHexCharacter(next.charAt(0))) {
// merge, as this is just a single symbol
Expand Down Expand Up @@ -172,6 +183,12 @@ public static boolean isSymbol(String token)
int c = token.charAt(0);
if ((c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_' ||
c=='.' || c == '@') return true;

if (sdccStyleDollarInLabels && token.charAt(token.length()-1) == '$' &&
c>='0' && c<='9') {
return true;
}

return false;
}

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/parser/dialects/Dialects.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static String defaultDialect() {
* @return the known dialect identifier strings
*/
public static String[] knownDialects() {
return new String[]{"mdl", "asmsx", "glass", "sjasm", "tniasm", "winape", "pasmo"};
return new String[]{"mdl", "asmsx", "glass", "sjasm", "tniasm", "winape", "pasmo", "sdcc"};
}

/**
Expand Down Expand Up @@ -61,6 +61,8 @@ public static Dialect getDialectParser(String pDialect, MDLConfig config) {
return new WinAPEDialect(config);
case "pasmo":
return new PasmoDialect(config);
case "sdcc":
return new SDCCDialect(config);
default:
return null;
}
Expand Down
21 changes: 17 additions & 4 deletions src/main/resources/data/z80-instruction-set.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -244,10 +244,10 @@ OUT (C),L 12 ED 69 2 C,L S,Z,N C true
OUT (n),A 11 D3 n 2 A S,Z,N n true
OUTD 16 ED AB 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
OUTI 16 ED A3 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
POP IX 14 DD E1 2 [SP:SP+1] IX,SP true
POP IY 14 FD E1 2 [SP:SP+1] IY,SP true
PUSH IX 15 DD E5 2 IX SP [SP-2:SP-1] true
PUSH IY 15 FD E5 2 IY SP [SP-2:SP-1] true
POP IX 14 DD E1 2 SP [SP:SP+1] IX,SP true
POP IY 14 FD E1 2 SP [SP:SP+1] IY,SP true
PUSH IX 15 DD E5 2 SP,IX SP [SP-2:SP-1] true
PUSH IY 15 FD E5 2 SP,IY SP [SP-2:SP-1] true
RES b,(HL) 15 CB 86+8*b 2 HL HL HL true
RES b,r 8 CB 80+8*b+r 2 r r true
RETI 14 ED 4D 2 [SP:SP+1] SP,PC true
Expand Down Expand Up @@ -419,3 +419,16 @@ EX AF,AF 4 8 1 AF AF false
SBC (IX+o) 19 DD 9E o 3 A,IX C IX+o A S,Z,H,P/V,N,C false
SBC (IY+o) 19 FD 9E o 3 A,IY C IY+o A S,Z,H,P/V,N,C false
AND A, n 7 E6 n 2 A A S,Z,H,P/V,N,C false
OR A, (IX+o) 19 DD B6 o 3 A,IX IX+o A S,Z,H,P/V,N,C false
OR A, (IY+o) 19 FD B6 o 3 A,IY IY+o A S,Z,H,P/V,N,C false
OR A, r 4 B0+r 1 A,r A S,Z,H,P/V,N,C false
CP A, (HL) 7 BE 1 A,HL HL S,Z,H,P/V,N,C false
CP A, r 4 B8+r 1 A,r S,Z,H,P/V,N,C false
XOR A, (HL) 7 AE 1 A,HL HL A S,Z,H,P/V,N,C false
XOR A, A 4 A8+7 1 A S,Z,H,P/V,N,C false
XOR A, B 4 A8+0 1 A,B A S,Z,H,P/V,N,C false
XOR A, C 4 A8+1 1 A,C A S,Z,H,P/V,N,C false
XOR A, D 4 A8+2 1 A,D A S,Z,H,P/V,N,C false
XOR A, E 4 A8+3 1 A,E A S,Z,H,P/V,N,C false
XOR A, H 4 A8+4 1 A,H A S,Z,H,P/V,N,C false
XOR A, L 4 A8+5 1 A,L A S,Z,H,P/V,N,C false
21 changes: 17 additions & 4 deletions src/main/resources/data/z80cpc-instruction-set.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -245,10 +245,10 @@ OUT (C),L 4 ED 69 2 BC,L S,Z,N C true
OUT (n),A 4 D3 n 2 A S,Z,N n true
OUTD 5 ED AB 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
OUTI 5 ED A3 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
POP IX 5 DD E1 2 [SP:SP+1] IX,SP true
POP IY 5 FD E1 2 [SP:SP+1] IY,SP true
PUSH IX 5 DD E5 2 IX SP [SP-2:SP-1] true
PUSH IY 5 FD E5 2 IY SP [SP-2:SP-1] true
POP IX 5 DD E1 2 SP [SP:SP+1] IX,SP true
POP IY 5 FD E1 2 SP [SP:SP+1] IY,SP true
PUSH IX 5 DD E5 2 SP,IX SP [SP-2:SP-1] true
PUSH IY 5 FD E5 2 SP,IY SP [SP-2:SP-1] true
RES b,(HL) 4 CB 86+8*b 2 HL HL HL true
RES b,r 2 CB 80+8*b+r 2 r r true
RETI 4 ED 4D 2 [SP:SP+1] SP,PC true
Expand Down Expand Up @@ -420,3 +420,16 @@ EX AF,AF 1 8 1 AF AF false
SBC (IX+o) 5 DD 9E o 3 A,IX C IX+o A S,Z,H,P/V,N,C false
SBC (IY+o) 5 FD 9E o 3 A,IY C IY+o A S,Z,H,P/V,N,C false
AND A, n 2 E6 n 2 A A S,Z,H,P/V,N,C false
OR A, (IX+o) 5 DD B6 o 3 A,IX IX+o A S,Z,H,P/V,N,C false
OR A, (IY+o) 5 FD B6 o 3 A,IY IY+o A S,Z,H,P/V,N,C false
OR A, r 1 B0+r 1 A,r A S,Z,H,P/V,N,C false
CP A, (HL) 2 BE 1 A,HL HL S,Z,H,P/V,N,C false
CP A, r 1 B8+r 1 A,r S,Z,H,P/V,N,C false
XOR A, (HL) 2 AE 1 A,HL HL A S,Z,H,P/V,N,C false
XOR A, A 1 A8+7 1 A S,Z,H,P/V,N,C false
XOR A, B 1 A8+0 1 A,B A S,Z,H,P/V,N,C false
XOR A, C 1 A8+1 1 A,C A S,Z,H,P/V,N,C false
XOR A, D 1 A8+2 1 A,D A S,Z,H,P/V,N,C false
XOR A, E 1 A8+3 1 A,E A S,Z,H,P/V,N,C false
XOR A, H 1 A8+4 1 A,H A S,Z,H,P/V,N,C false
XOR A, L 1 A8+5 1 A,L A S,Z,H,P/V,N,C false
21 changes: 17 additions & 4 deletions src/main/resources/data/z80msx-instruction-set.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -245,10 +245,10 @@ OUT (C),L 14 ED 69 2 C,L S,Z,N C true
OUT (n),A 12 D3 n 2 A S,Z,N n true
OUTD 18 ED AB 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
OUTI 18 ED A3 2 B,C,HL HL B,HL S,Z,H,P/V,N,C C true
POP IX 16 DD E1 2 [SP:SP+1] IX,SP true
POP IY 16 FD E1 2 [SP:SP+1] IY,SP true
PUSH IX 17 DD E5 2 IX SP [SP-2:SP-1] true
PUSH IY 17 FD E5 2 IY SP [SP-2:SP-1] true
POP IX 16 DD E1 2 SP [SP:SP+1] IX,SP true
POP IY 16 FD E1 2 SP [SP:SP+1] IY,SP true
PUSH IX 17 DD E5 2 SP,IX SP [SP-2:SP-1] true
PUSH IY 17 FD E5 2 SP,IY SP [SP-2:SP-1] true
RES b,(HL) 17 CB 86+8*b 2 HL HL HL true
RES b,r 10 CB 80+8*b+r 2 r r true
RETI 16 ED 4D 2 [SP:SP+1] SP,PC true
Expand Down Expand Up @@ -423,3 +423,16 @@ EX AF,AF 5 8 1 AF AF false
SBC (IX+o) 21 DD 9E o 3 A,IX C IX+o A S,Z,H,P/V,N,C false
SBC (IY+o) 21 FD 9E o 3 A,IY C IY+o A S,Z,H,P/V,N,C false
AND A, n 8 E6 n 2 A A S,Z,H,P/V,N,C false
OR A, (IX+o) 21 DD B6 o 3 A,IX IX+o A S,Z,H,P/V,N,C false
OR A, (IY+o) 21 FD B6 o 3 A,IY IY+o A S,Z,H,P/V,N,C false
OR A, r 5 B0+r 1 A,r A S,Z,H,P/V,N,C false
CP A, (HL) 8 BE 1 A,HL HL S,Z,H,P/V,N,C false
CP A, r 5 B8+r 1 A,r S,Z,H,P/V,N,C false
XOR A, (HL) 8 AE 1 A,HL HL A S,Z,H,P/V,N,C false
XOR A, A 5 A8+7 1 A S,Z,H,P/V,N,C false
XOR A, B 5 A8+0 1 A,B A S,Z,H,P/V,N,C false
XOR A, C 5 A8+1 1 A,C A S,Z,H,P/V,N,C false
XOR A, D 5 A8+2 1 A,D A S,Z,H,P/V,N,C false
XOR A, E 5 A8+3 1 A,E A S,Z,H,P/V,N,C false
XOR A, H 5 A8+4 1 A,H A S,Z,H,P/V,N,C false
XOR A, L 5 A8+5 1 A,L A S,Z,H,P/V,N,C false
16 changes: 16 additions & 0 deletions src/test/java/test/TokenizerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,22 @@ public class TokenizerTest {
Assert.assertArrayEquals(new String[]{"&C0DE"}, tokenize("&C0DE"));
Tokenizer.allowAndpersandHex = false;
}
@Test public void test23() {
Assert.assertArrayEquals(new String[]{"_main","::"}, tokenize("_main::"));
}
@Test public void test24() {
Assert.assertArrayEquals(new String[]{"ld","hl",",","#0x0000"}, tokenize("ld hl, #0x0000"));
}
@Test public void test25() {
Tokenizer.sdccStyleHashMarksForConstants = true;
Assert.assertArrayEquals(new String[]{"ld","hl",",","#","0x0000"}, tokenize("ld hl, #0x0000"));
Tokenizer.sdccStyleHashMarksForConstants = false;
}
@Test public void test26() {
Tokenizer.sdccStyleDollarInLabels = true;
Assert.assertArrayEquals(new String[]{"00102$",":"}, tokenize("00102$:"));
Tokenizer.sdccStyleDollarInLabels = true;
}


private static String[] tokenize(String line)
Expand Down

0 comments on commit 7261006

Please sign in to comment.