RM := del /f
   EXE := .exe
   MKDIR = mkdir
+  RMDIR = rmdir
 else
   RM := rm -f
   EXE :=
   MKDIR = mkdir -p
+  RMDIR = rmdir
 endif
 
 WORKDIR := ../testwrk
        @$(MAKE) -C err clean
        @$(MAKE) -C misc clean
        @$(RM) $(WORKDIR)/bdiff$(EXE)
+       @$(RMDIR) $(WORKDIR)
 
 
 .PHONY: all clean
 
-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))
+TESTS := $(patsubst %.c,$(WORKDIR)/%.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.o.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.os.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.or.prg,$(wildcard *.c))
 
 all: $(TESTS)
 
-%.prg: %.c
+$(WORKDIR)/%.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.o.prg: %.c
+$(WORKDIR)/%.o.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.os.prg: %.c
+$(WORKDIR)/%.os.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.osi.prg: %.c
+$(WORKDIR)/%.osi.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.osir.prg: %.c
+$(WORKDIR)/%.osir.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.oi.prg: %.c
+$(WORKDIR)/%.oi.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.oir.prg: %.c
+$(WORKDIR)/%.oir.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
-%.or.prg: %.c
+$(WORKDIR)/%.or.prg: %.c
        ! $(CL65) $(CC65FLAGS) $< -o $@
 clean:
-       @$(RM) *.o
-       @$(RM) *.prg
+       @$(RM) $(TESTS)
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.o,$(wildcard *.c))
 
 
 .PHONY: all clean
 
-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))
+TESTS := $(patsubst %.c,$(WORKDIR)/%.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.o.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.os.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.or.prg,$(wildcard *.c))
 
 all: $(TESTS)
 
 # should compile, but then hangs in an endless loop
-endless%prg: endless.c
+$(WORKDIR)/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
+$(WORKDIR)/limits%prg: limits.c
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > limits.out
-       $(DIFF) limits.out limits.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/limits.out
+       $(DIFF) $(WORKDIR)/limits.out limits.ref
 
 # the rest are tests that fail currently for one reason or another
-fields%prg: fields.c
+$(WORKDIR)/fields%prg: fields.c
        @echo "FIXME: " $@ "will currently fail"
        $(CL65) $(CC65FLAGS) $< -o $@
        -$(SIM65) $(SIM65FLAGS) $@
-sitest%prg: sitest.c
+$(WORKDIR)/sitest%prg: sitest.c
        @echo "FIXME: " $@ "will currently fail"
        -$(CL65) $(CC65FLAGS) $< -o $@
        -$(SIM65) $(SIM65FLAGS) $@
 
 clean:
-       @$(RM) *.o
-       @$(RM) *.prg
-       @$(RM) *.out
+       @$(RM) $(TESTS)
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.o,$(wildcard *.c))
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.out,$(wildcard *.c))
+
 
 
 
 .PHONY: all clean
 
-REFS := $(patsubst %.c,%.ref,$(wildcard *.c))
+REFS := $(patsubst %.c,$(WORKDIR)/%.ref,$(wildcard *.c))
 
-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))
+TESTS := $(patsubst %.c,$(WORKDIR)/%.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.o.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.os.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.or.prg,$(wildcard *.c))
 
 all: $(REFS) $(TESTS)
 
-%.ref: %.c
-       $(CC) $(CFLAGS) $< -o $*.host
-       ./$*.host > $@
+$(WORKDIR)/%.ref: %.c
+       $(CC) $(CFLAGS) $< -o $(WORKDIR)/$*.host
+       $(WORKDIR)/$*.host > $@
 
-%.prg: %.c %.ref
+$(WORKDIR)/%.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.o.prg: %.c %.ref
+$(WORKDIR)/%.o.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.os.prg: %.c %.ref
+$(WORKDIR)/%.os.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.osi.prg: %.c %.ref
+$(WORKDIR)/%.osi.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.osir.prg: %.c %.ref
+$(WORKDIR)/%.osir.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.oi.prg: %.c %.ref
+$(WORKDIR)/%.oi.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.oir.prg: %.c %.ref
+$(WORKDIR)/%.oir.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
-%.or.prg: %.c %.ref
+$(WORKDIR)/%.or.prg: %.c $(WORKDIR)/%.ref
        $(CL65) $(CC65FLAGS) $< -o $@
-       $(SIM65) $(SIM65FLAGS) $@ > $*.out
-       $(DIFF) $*.out $*.ref
+       $(SIM65) $(SIM65FLAGS) $@ > $(WORKDIR)/$*.out
+       $(DIFF) $(WORKDIR)/$*.out $(WORKDIR)/$*.ref
 
 clean:
-       @$(RM) *.o
-       @$(RM) *.prg
-       @$(RM) *.out
-       @$(RM) *.ref
-       @$(RM) *.host
+       @$(RM) $(TESTS)
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.o,$(wildcard *.c))
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.out,$(wildcard *.c))
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.ref,$(wildcard *.c))
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.host,$(wildcard *.c))
 
 
 .PHONY: all clean
 
-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))
+TESTS := $(patsubst %.c,$(WORKDIR)/%.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.o.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.os.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.osir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oi.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.oir.prg,$(wildcard *.c))
+TESTS += $(patsubst %.c,$(WORKDIR)/%.or.prg,$(wildcard *.c))
 
 all: $(TESTS)
 
-%.prg: %.c
+$(WORKDIR)/%.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.o.prg: %.c
+$(WORKDIR)/%.o.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.os.prg: %.c
+$(WORKDIR)/%.os.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.osi.prg: %.c
+$(WORKDIR)/%.osi.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.osir.prg: %.c
+$(WORKDIR)/%.osir.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.oi.prg: %.c
+$(WORKDIR)/%.oi.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.oir.prg: %.c
+$(WORKDIR)/%.oir.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
-%.or.prg: %.c
+$(WORKDIR)/%.or.prg: %.c
        $(CL65) $(CC65FLAGS) $< -o $@
        $(SIM65) $(SIM65FLAGS) $@
 
 clean:
-       @$(RM) *.o
-       @$(RM) *.prg
+       @$(RM) $(TESTS)
+       @$(RM) $(patsubst %.c,$(WORKDIR)/%.o,$(wildcard *.c))