Add beginning of Lips compiler, DynASM
diff --git a/src/lisp/compiler.dasc b/src/lisp/compiler.dasc
new file mode 100644
index 0000000..b6d23e7
--- /dev/null
+++ b/src/lisp/compiler.dasc
@@ -0,0 +1,67 @@
+#include "compiler.h"
+
+#include <dasm_proto.h>
+#include <dasm_x86.h>
+
+#define value_size sizeof (struct value)
+
+|.arch x86;
+
+|.macro setup, nvars;
+| push ebp;
+| mov ebp, esp;
+| sub esp, value_size *nvars;
+|.endmacro;
+
+|.macro cleanup;
+| mov esp, ebp;
+| pop ebp;
+| ret;
+|.endmacro;
+
+dasm_State *d;
+unsigned int npc = 8;
+
+struct function *find_function (struct environment *env, char *name)
+{
+	struct function *f = env->first;
+
+	while ( strcmp (f->name, name) != 0 )
+	{
+		if ( f->prev )
+			f = f->prev;
+		else
+			return NULL;
+	}
+
+	return f;
+}
+
+void compile (struct istream *is)
+{
+	|.section code;
+	dasm_init (&d, DASM_MAXSECTION);
+
+	|.globals lbl_;
+	void *labels[ lbl__MAX ];
+	dasm_setupglobal (&d, labels, lbl__MAX);
+
+	|.actionlist lisp_actions;
+	dasm_setup (&d, lisp_actions);
+
+	dasm_growpc (&d, npc);
+}
+
+// First pass populates local
+void firstpass (struct value val, struct environment *env, struct local *local)
+{
+}
+
+// Second pass generates code
+void secondpass (struct value val, struct environment *env, struct local *local)
+{
+}
+
+void toplevel (struct value val, struct environment *env)
+{
+}