diff --git a/bin/make_interpreter_functions.pike b/bin/make_interpreter_functions.pike
new file mode 100644
index 0000000000000000000000000000000000000000..2da67194c79b154585d0abc024c4fddde756186b
--- /dev/null
+++ b/bin/make_interpreter_functions.pike
@@ -0,0 +1,58 @@
+#!/usr/local/bin/pike
+
+int main(int argc, array(string) argv)
+{
+  array(string) funcs=(Stdio.read_file(argv[1])/"\nOPCODE");
+  array(int) lineno=allocate(sizeof(funcs));
+
+  lineno[0]=1;
+
+  for(int e=1;e<sizeof(funcs);e++)
+    lineno[e]=lineno[e-1]+sizeof(funcs[e-1]/"\n");
+
+  for(int e=1;e<sizeof(funcs);e++)
+  {
+    int x=e+1;
+    while(!sscanf(funcs[e],"%sBREAK",funcs[e]))
+    {
+      string junk,rest;
+      if(!sscanf(funcs[x],"%s\n%s", junk, rest))
+      {
+	werror("%s:%d: Two opcodes in a row?\n",argv[1],lineno[e]);
+	exit(1);
+      }
+      x++;
+      if(search(junk,"TAIL")==-1 &&
+	 search((funcs[e]/"\n")[0],"TAIL")==-1)
+      {
+	werror("Missing TAIL after line %d\n",lineno[e]);
+//	werror("junk=%O\n",junk);
+	exit(1);
+      }
+      funcs[e]+=rest;
+    }
+  }
+  for(int e=1;e<sizeof(funcs);e++)
+  {
+//    werror("funcs[%d]=%O\n",e,funcs[e]);
+    int args;
+    string type, opcode, name, body;
+    if(sscanf(funcs[e],"%d%s(%s,%*[ \t]\"%s\")%s",args,type, opcode, name,  body)!=6)
+    {
+      werror("%s:%d: Opcode sscanf failed.\n",argv[1],lineno[e]);
+      exit(1);
+    }
+    sscanf(opcode,"%*[ \t]%s",opcode);
+    opcode=reverse(opcode);
+    sscanf(opcode,"%*[ \t]%s",opcode);
+    opcode=reverse(opcode);
+
+    write("# %d %O\n",lineno[e],argv[1]);
+    write("void i_%s(",opcode);
+    for(int x=0;x<args;x++) write("%sINT32 arg%d",x?", ":"",x+1);
+    if(!args) write("void");
+    write(") {");
+    write(body);
+    write("}\n\n");
+  }
+}