Browse Source

added Hardware dependens into Mnemonics

Wilfried Klaas 6 years ago
parent
commit
299a6fbb4b
27 changed files with 243 additions and 23 deletions
  1. 1 2
      SimpleServo.tps
  2. 19 16
      src/main/java/de/mcs/tools/sps/SPSAssembler.java
  3. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/ARC.java
  4. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/AbstractMnemonic.java
  5. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/BADC.java
  6. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/BARC.java
  7. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/BPWM.java
  8. 7 0
      src/main/java/de/mcs/tools/sps/mnemonic/BSRV.java
  9. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/BSUBA.java
  10. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/BYTE.java
  11. 9 0
      src/main/java/de/mcs/tools/sps/mnemonic/CASB.java
  12. 9 0
      src/main/java/de/mcs/tools/sps/mnemonic/DFSB.java
  13. 5 0
      src/main/java/de/mcs/tools/sps/mnemonic/HARDWARE.java
  14. 17 0
      src/main/java/de/mcs/tools/sps/mnemonic/LDA.java
  15. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/MOD.java
  16. 25 5
      src/main/java/de/mcs/tools/sps/mnemonic/MOV.java
  17. 4 0
      src/main/java/de/mcs/tools/sps/mnemonic/Mnemonic.java
  18. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/NOP.java
  19. 11 0
      src/main/java/de/mcs/tools/sps/mnemonic/PAGE.java
  20. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/PEND.java
  21. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/POP.java
  22. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/PUSH.java
  23. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/REST.java
  24. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/SKIP0.java
  25. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/SRV.java
  26. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/SWAP.java
  27. 8 0
      src/main/java/de/mcs/tools/sps/mnemonic/TONE.java

+ 1 - 2
SimpleServo.tps

@@ -4,7 +4,6 @@ WAIT 500ms
 DOUT #0
 WAIT 200ms
 RJMP :loop
-:loop
 ; Zeilen kommentar
 NOP
 DOUT #5
@@ -15,7 +14,7 @@ block Kommentar
 DOUT #0x0F
 WAIT 200ms  ; inline Kommentar
 NOP
-LDA 0x04
+LDA #0x04
 MOV a, B
 DOUT
 DOUT 3

+ 19 - 16
src/main/java/de/mcs/tools/sps/SPSAssembler.java

@@ -38,6 +38,7 @@ import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.IntelHex;
 import de.mcs.tools.sps.exceptions.SyntaxError;
+import de.mcs.tools.sps.mnemonic.HARDWARE;
 import de.mcs.tools.sps.mnemonic.JMP;
 import de.mcs.tools.sps.mnemonic.Mnemonic;
 import de.mcs.tools.sps.mnemonic.MnemonicFactory;
@@ -55,12 +56,13 @@ import de.mcs.utils.jsap.SwitchOption;
 public class SPSAssembler {
 
   private static File source;
-  private static File destination;
+  private static HARDWARE destination;
   private static int lineNumber;
   private static int srcLineNumber;
   private static Map<String, Integer> labels = new HashMap<>();
   private static boolean inBlockComment;
   private static List<Mnemonic> mnemonics = new ArrayList<>();
+  private static File destinationFile;
 
   /**
    * 
@@ -78,13 +80,20 @@ public class SPSAssembler {
   }
 
   @StringOption(shortKey = 'd', longKey = "destination", name = "destination system", defaultValue = "HOLTEK", help = "the destination system to compile to.", required = false)
-  public static void setDestinationSystemFile(String destination) {
-    System.out.printf("set destination %s\r\n", destination);
+  public static void setDestinationSystem(String value) {
+    destination = HARDWARE.valueOf((value.toUpperCase()));
   }
 
-  @FileOption(index = 1, name = "source file", help = "source file to compile", required = false)
-  public static void setSourceFile(File sourceFile) {
-    System.out.printf("set source to: %s\r\n", sourceFile);
+  @FileOption(index = 1, name = "source file", help = "source file to compile", required = true, mustExists = true)
+  public static void setSourceFile(File file) {
+    source = file;
+  }
+
+  @FileOption(index = 2, name = "destination file", help = "destination file to compile to", required = false)
+  public static void setDestinationFile(File file) {
+    if (file != null) {
+      destinationFile = file;
+    }
   }
 
   /**
@@ -94,22 +103,16 @@ public class SPSAssembler {
   public static void main(String[] args) throws IOException, SyntaxError {
     CommandlineProcessor.processCommandline(SPSAssembler.class, args);
 
-    if (args.length == 0) {
-      showHelp();
-    }
-    source = new File(args[0]);
     if (!source.exists()) {
       throw new FileNotFoundException(String.format("source file not found. %s", source.getAbsolutePath()));
     }
     System.out.printf("source file: %s \r\n", source.getName());
-    if (args.length > 1) {
-      destination = new File(args[1]);
-    } else {
+    if (destinationFile == null) {
       String name = source.getName();
       name = name.substring(0, source.getName().lastIndexOf("."));
-      destination = new File(source.getParentFile(), name + ".hex");
+      destinationFile = new File(source.getParentFile(), name + ".hex");
     }
-    System.out.printf("destination file: %s \r\n", destination.getName());
+    System.out.printf("destination file: %s \r\n", destinationFile.getName());
     System.out.println();
 
     try {
@@ -152,7 +155,7 @@ public class SPSAssembler {
       data[i] = (byte) mnemonic.getByte();
       i++;
     }
-    FileOutputStream output = new FileOutputStream(destination);
+    FileOutputStream output = new FileOutputStream(destinationFile);
     intelHex.writeHexStream(output, data);
     output.close();
   }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/ARC.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,9 @@ public class ARC extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/AbstractMnemonic.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -133,4 +136,9 @@ public abstract class AbstractMnemonic implements Mnemonic {
   public boolean isLabel() {
     return false;
   }
+
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.allOf(HARDWARE.class);
+  }
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BADC.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,9 @@ public class BADC extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BARC.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,9 @@ public class BARC extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BPWM.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,9 @@ public class BPWM extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 7 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BSRV.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,8 @@ public class BSRV extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BSUBA.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class BSUBA extends AbstractMnemonic implements Mnemonic {
     return 0x7D;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/BYTE.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class BYTE extends AbstractMnemonic implements Mnemonic {
     return 0x7C;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 9 - 0
src/main/java/de/mcs/tools/sps/mnemonic/CASB.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -76,4 +79,10 @@ public class CASB extends AbstractMnemonic implements Mnemonic {
   public boolean hasArgument() {
     return true;
   }
+
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 9 - 0
src/main/java/de/mcs/tools/sps/mnemonic/DFSB.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -76,4 +79,10 @@ public class DFSB extends AbstractMnemonic implements Mnemonic {
   public boolean hasArgument() {
     return true;
   }
+
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 5 - 0
src/main/java/de/mcs/tools/sps/mnemonic/HARDWARE.java

@@ -0,0 +1,5 @@
+package de.mcs.tools.sps.mnemonic;
+
+public enum HARDWARE {
+  HOLTEK, ATMEGA8, ARDUINOSPS, TINYSPS
+}

+ 17 - 0
src/main/java/de/mcs/tools/sps/mnemonic/LDA.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -135,4 +138,18 @@ public class LDA extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    switch (inputSource) {
+    case DIRECT:
+    case DIGITAL:
+    case ANALOG:
+      return super.allowedHardware();
+    case RC:
+      return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+    default:
+      return super.allowedHardware();
+    }
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/MOD.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class MOD extends AbstractMnemonic implements Mnemonic {
     return 0x7B;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 25 - 5
src/main/java/de/mcs/tools/sps/mnemonic/MOV.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -52,6 +55,7 @@ public class MOV extends AbstractMnemonic implements Mnemonic {
   };
 
   byte output;
+  MOVE_VALUE actual;
 
   public MOV(String line) throws SyntaxError {
     super(line);
@@ -69,11 +73,15 @@ public class MOV extends AbstractMnemonic implements Mnemonic {
       throw new SyntaxError(getLineNumber(),
           String.format("missing arguments for %s.", this.getClass().getSimpleName()));
     }
-    int value = 0;
+    int value = -1;
     argument = argument.replace(",", "");
     argument = argument.replace(" ", "");
 
-    value = getTime(argument);
+    actual = getActualMoveValue(argument);
+    if (actual != null) {
+      value = actual.value;
+    }
+
     if (value < 0) {
       throw new IllegalArgument(getLineNumber(),
           String.format("argument %s is not in enum for %s.", getArgument(), this.getClass().getSimpleName()));
@@ -82,17 +90,17 @@ public class MOV extends AbstractMnemonic implements Mnemonic {
     output = (byte) (value & 0xFF);
   }
 
-  private int getTime(String argument) throws IllegalArgument {
+  private MOVE_VALUE getActualMoveValue(String argument) throws IllegalArgument {
     try {
       MOVE_VALUE moveValue = MOVE_VALUE.valueOf(String.format("MOV_%S", argument.trim()));
       if (moveValue != null) {
-        return moveValue.value;
+        return moveValue;
       }
     } catch (IllegalArgumentException e) {
       throw new IllegalArgument(getLineNumber(),
           String.format("argument %s is not in enum for %s.", getArgument(), this.getClass().getSimpleName()));
     }
-    return -1;
+    return null;
   }
 
   @Override
@@ -110,4 +118,16 @@ public class MOV extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    switch (actual) {
+    case MOV_EA:
+    case MOV_FA:
+    case MOV_AE:
+    case MOV_AF:
+      return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+    default:
+      return super.allowedHardware();
+    }
+  }
 }

+ 4 - 0
src/main/java/de/mcs/tools/sps/mnemonic/Mnemonic.java

@@ -1,5 +1,7 @@
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 public interface Mnemonic {
@@ -22,4 +24,6 @@ public interface Mnemonic {
 
   boolean isLabel();
 
+  Set<HARDWARE> allowedHardware();
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/NOP.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class NOP extends AbstractMnemonic implements Mnemonic {
     return 0x00;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 11 - 0
src/main/java/de/mcs/tools/sps/mnemonic/PAGE.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,12 @@ public class PAGE extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    if (value > 8) {
+      return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+    }
+    return super.allowedHardware();
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/PEND.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class PEND extends AbstractMnemonic implements Mnemonic {
     return 0xFF;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/POP.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class POP extends AbstractMnemonic implements Mnemonic {
     return 0x6F;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/PUSH.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class PUSH extends AbstractMnemonic implements Mnemonic {
     return 0x5F;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/REST.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class REST extends AbstractMnemonic implements Mnemonic {
     return 0xEF;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/SKIP0.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class SKIP0 extends AbstractMnemonic implements Mnemonic {
     return 0xC0;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/SRV.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import org.apache.commons.lang3.StringUtils;
 
 import de.mcs.tools.sps.exceptions.IllegalArgument;
@@ -70,4 +73,9 @@ public class SRV extends AbstractMnemonic implements Mnemonic {
     return true;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/SWAP.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class SWAP extends AbstractMnemonic implements Mnemonic {
     return 0x50;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }

+ 8 - 0
src/main/java/de/mcs/tools/sps/mnemonic/TONE.java

@@ -21,6 +21,9 @@
  */
 package de.mcs.tools.sps.mnemonic;
 
+import java.util.EnumSet;
+import java.util.Set;
+
 import de.mcs.tools.sps.exceptions.SyntaxError;
 
 /**
@@ -40,4 +43,9 @@ public class TONE extends AbstractMnemonic implements Mnemonic {
     return 0xF8;
   }
 
+  @Override
+  public Set<HARDWARE> allowedHardware() {
+    return EnumSet.of(HARDWARE.ARDUINOSPS, HARDWARE.TINYSPS);
+  }
+
 }