diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java index 5e87fe9db..0a67f5492 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java @@ -70,8 +70,10 @@ public class AsmProgramStaticRegisterValues { } if (instructionType.getMnemnonic().equals("lda") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { current.setA(instruction.getParameter()); + current.setaMem(null); + try { - int immValue = Integer.parseInt(instruction.getParameter()); + int immValue = getImmValue(instruction); current.setZ(immValue == 0); current.setN(immValue > 127); } catch (NumberFormatException e) { @@ -83,8 +85,9 @@ public class AsmProgramStaticRegisterValues { } if (instructionType.getMnemnonic().equals("ldx") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { current.setX(instruction.getParameter()); + current.setxMem(null); try { - int immValue = Integer.parseInt(instruction.getParameter()); + int immValue = getImmValue(instruction); current.setZ(immValue == 0); current.setN(immValue > 127); } catch (NumberFormatException e) { @@ -96,8 +99,9 @@ public class AsmProgramStaticRegisterValues { } if (instructionType.getMnemnonic().equals("ldy") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { current.setY(instruction.getParameter()); + current.setyMem(null); try { - int immValue = Integer.parseInt(instruction.getParameter()); + int immValue = getImmValue(instruction); current.setZ(immValue == 0); current.setN(immValue > 127); } catch (NumberFormatException e) { @@ -133,6 +137,18 @@ public class AsmProgramStaticRegisterValues { return current; } + private int getImmValue(AsmInstruction instruction) { + int immValue; + if(instruction.getParameter().equals("<0")) { + immValue = 0; + } else if(instruction.getParameter().equals(">0")) { + immValue = 0; + } else{ + immValue = Integer.parseInt(instruction.getParameter()); + } + return immValue; + } + /** * Known values of registers/flags at an instruction. null where value is unknown. */ diff --git a/src/main/java/dk/camelot64/kickc/model/SymbolTypeInference.java b/src/main/java/dk/camelot64/kickc/model/SymbolTypeInference.java index 82650740b..809f5540d 100644 --- a/src/main/java/dk/camelot64/kickc/model/SymbolTypeInference.java +++ b/src/main/java/dk/camelot64/kickc/model/SymbolTypeInference.java @@ -168,10 +168,10 @@ public class SymbolTypeInference { if (isSByte(type1) && isSByte(type2)) { return SymbolType.SBYTE; } - if (isWord(type1) && isWord(type2)) { + if (isWord(type1) && isWord(type2) || isByte(type2)) { return SymbolType.WORD; } - if (isSWord(type1) && isSWord(type2)) { + if (isSWord(type1) && isSWord(type2) || isSByte(type2)) { return SymbolType.SWORD; } throw new RuntimeException("Type inference case not handled " + type1 + " " + "+" + " " + type2); diff --git a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java index 9bcedf3f5..250df5442 100644 --- a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java @@ -24,6 +24,10 @@ public class TestPrograms extends TestCase { helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/"); } + public void testImmZero() throws IOException, URISyntaxException { + compileAndCompare("immzero"); + } + public void testWordExpr() throws IOException, URISyntaxException { compileAndCompare("wordexpr"); } diff --git a/src/main/java/dk/camelot64/kickc/test/immzero.kc b/src/main/java/dk/camelot64/kickc/test/immzero.kc new file mode 100644 index 000000000..22eadefd6 --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/test/immzero.kc @@ -0,0 +1,9 @@ +// Tests that immediate zero values are reused - even when assigning to words +void main() { + byte i = 0; + word w = (word)0; + for ( byte j : 0..10) { + i = j; + w = w + j; + } +} \ No newline at end of file