--- /dev/null
+
+CC65FLAGS = -t sim6502
+SIM65FLAGS = -x 200000000
+
+CL65 := $(if $(wildcard ../../bin/cl65*),../../bin/cl65,cl65)
+SIM65 := $(if $(wildcard ../../bin/sim65*),../../bin/sim65,sim65)
+
+RM := rm -f
+DIFF := diff -q
+
+.PHONY: all
+
+TESTS := $(patsubst %.c,%.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.o.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.os.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.osi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.osir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.oi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.oir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,%.or.prg,$(wildcard *.c))
+
+all: $(TESTS)
+
+# should compile, but then hangs in an endless loop
+endless%prg: endless.c
+ $(CL65) $(CC65FLAGS) $< -o $@
+ ! $(SIM65) $(SIM65FLAGS) $@
+
+# these need reference data that cant be generated by a host compiled program
+# in a useful way
+limits%prg: limits.c
+ $(CL65) $(CC65FLAGS) $< -o $@
+ $(SIM65) $(SIM65FLAGS) $@ > limits.out
+ $(DIFF) limits.out limits.ref
+
+# the rest are tests that fail currently for one reason or another
+fields%prg: fields.c
+ @echo "FIXME: " $@ "will currently fail"
+ $(CL65) $(CC65FLAGS) $< -o $@
+ -$(SIM65) $(SIM65FLAGS) $@
+sitest%prg: sitest.c
+ @echo "FIXME: " $@ "will currently fail"
+ -$(CL65) $(CC65FLAGS) $< -o $@
+ -$(SIM65) $(SIM65FLAGS) $@
+
+clean:
+ @$(RM) *.o
+ @$(RM) *.prg
+ @$(RM) *.out
+
--- /dev/null
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define NO_OLD_FUNC_DECL
+#define NO_TYPELESS_INT
+#define NO_TYPELESS_INT_PTR
+#define MAIN_RETURNS_INT
+#define NO_IMPLICIT_FUNC_PROTOTYPES
+#define NO_FLOATS
+#define NO_WCHAR
+#define NO_EMPTY_FUNC_ARGS
+#define NO_SLOPPY_STRUCT_INIT
+#define NO_FUNCS_TAKE_STRUCTS
+#define NO_FUNCS_RETURN_STRUCTS
+#define CAST_STRUCT_PTR
+#define NO_TYPELESS_STRUCT_PTR
+#define NO_IMPLICIT_FUNCPTR_CONV
+#define SIZEOF_INT_16BIT
+#define SIZEOF_LONG_32BIT
+#define UNSIGNED_CHARS
+#define UNSIGNED_BITFIELDS