diff --git a/Source/DSPSpy/templates/if_test.tpl b/Source/DSPSpy/templates/if_test.tpl
new file mode 100644
index 0000000000..80c96641ca
--- /dev/null
+++ b/Source/DSPSpy/templates/if_test.tpl
@@ -0,0 +1,15 @@
+
+
+incdir "tests"
+include "dsp_base.inc"
+
+
+lri $IX0, #0x0000
+lri $SR @SR@
+
+@CMD@
+lri $IX0, #0x1337
+call send_back
+
+
\ No newline at end of file
diff --git a/Source/DSPSpy/util/createtest.pl b/Source/DSPSpy/util/createtest.pl
new file mode 100755
index 0000000000..db50c9e2cb
--- /dev/null
+++ b/Source/DSPSpy/util/createtest.pl
@@ -0,0 +1,69 @@
+#!/usr/bin/perl -w
+
+use strict;
+use XML::Simple;
+use Getopt::Long;
+
+use Data::Dumper;
+
+sub usage() {
+ die("createtest -i \n");
+}
+
+sub parseString {
+ my $string = shift;
+ my $cmd = shift;
+ $string =~ s/\@CMD\@/$cmd/gi;
+ return $string;
+}
+
+sub generateSRFull {
+ my $res = shift;
+ my $body = shift;
+
+ $res .= join "\n", map {my $b = sprintf "\#0x%04X", $_; (my $a = $body) =~ s/\@SR\@/$b/g; $a} 1..65535;
+
+ return $res;
+}
+
+sub generateTest {
+ my $type = shift;
+ my $header = shift;
+ my $body = shift;
+
+ if ($type eq "srfull") {
+ return generateSRFull($header, $body);
+ }
+}
+
+my ($cmds,$input,$output);
+if (!GetOptions('cmds|c=s' => \$cmds,
+ 'input|i=s' => \$input,
+# 'output|o=s' => \$output,
+ )) {
+ usage();
+ exit 1;
+}
+
+usage() if (! defined $input);
+
+my $xtest = XMLin($input);
+my $type = $xtest->{'type'};
+
+foreach my $cmd (split(/,/, $cmds)) {
+ my $name = parseString($xtest->{'name'}, $cmd);
+ $name =~ s/ /_/g;
+ my $desc = parseString($xtest->{'description'}, $cmd);
+ my $header = parseString($xtest->{'header'}, $cmd);
+ my $body = parseString($xtest->{'body'}, $cmd);
+
+ open(OUTPUT, ">$name.ds") ||
+ die("Can't open file $name for writing: $!\n");
+
+ print OUTPUT "; $name\n";
+ print OUTPUT "; $desc\n";
+ my $test = generateTest($type, $header, $body);
+ print OUTPUT $test . "\n";
+
+}
+