
CC65PREFIX=~/Desktop/cc65/github-current/cc65

CC65=$(CC65PREFIX)/bin/cc65
CA65=$(CC65PREFIX)/bin/ca65
LD65=$(CC65PREFIX)/bin/ld65
CL65=$(CC65PREFIX)/bin/cl65
AR65=$(CC65PREFIX)/bin/ar65
SIM65=$(CC65PREFIX)/bin/sim65

# Makefile for the regression tests that return an error code on failure

ifneq ($(shell echo),)
  CMD_EXE = 1
endif

ifdef CMD_EXE
  S = $(subst /,\,/)
  NULLDEV = nul:
  MKDIR = mkdir $(subst /,\,$1)
  RMDIR = -rmdir /s /q $(subst /,\,$1)
  DEL = del /f $(subst /,\,$1)
else
  S = /
  NULLDEV = /dev/null
  MKDIR = mkdir -p $1
  RMDIR = $(RM) -r $1
  DEL = $(RM) $1
endif

#QUIET=1

ifdef QUIET
  .SILENT:
  NULLOUT = >$(NULLDEV)
  NULLERR = 2>$(NULLDEV)
endif

SIM65FLAGS = -x 200000000

WORKDIR = .

OPTIONS = g O Os Osi Osir Osr Oi Oir Or


.PHONY: all clean

SOURCES := $(wildcard *.c)
TESTS  = $(foreach option,$(OPTIONS),$(SOURCES:%.c=$(WORKDIR)/%.$(option).6502.prg))
TESTS += $(foreach option,$(OPTIONS),$(SOURCES:%.c=$(WORKDIR)/%.$(option).65c02.prg))
TESTS += $(foreach option,$(OPTIONS),$(SOURCES:%.c=$(WORKDIR)/%.$(option).6502.cs.prg))
TESTS += $(foreach option,$(OPTIONS),$(SOURCES:%.c=$(WORKDIR)/%.$(option).65c02.cs.prg))

all: $(TESTS)

$(WORKDIR):
	$(call MKDIR,$(WORKDIR))

define PRG_template

%.$1.$2.prg: %.c
	echo -ne $$*.$1.$2.prg
	$(CL65) -t sim$2 $$(CC65FLAGS) -$1 -o $$@ $$< $(NULLERR)
	if $(SIM65) $(SIM65FLAGS) $$@ $(NULLOUT); then \
			echo " - ok"; \
		else \
			echo " - fail"; \
		fi

endef # PRG_template

define PRG_template2

%.$1.$2.$3.prg: %.c
	echo -ne $$*.$1.$2.$3.prg
	$(CL65) -t sim$2 $$(CC65FLAGS) -$1 --codesize 180 -o $$@ $$< $(NULLERR)
	if $(SIM65) $(SIM65FLAGS) $$@ $(NULLOUT); then \
			echo " - ok"; \
		else \
			echo " - fail"; \
		fi

endef # PRG_template

$(foreach option,$(OPTIONS),$(eval $(call PRG_template,$(option),6502)))
$(foreach option,$(OPTIONS),$(eval $(call PRG_template,$(option),65c02)))
$(foreach option,$(OPTIONS),$(eval $(call PRG_template2,$(option),6502,cs)))
$(foreach option,$(OPTIONS),$(eval $(call PRG_template2,$(option),65c02,cs)))

check:
	$(RM) ./div-char-char
	gcc -funsigned-char -m32 -DREFERENCE -o div-char-char div-char-char.c
	./div-char-char
	$(RM) ./div-int-int
	gcc -funsigned-char -m32 -DREFERENCE -o div-int-int div-int-int.c
	./div-int-int
	$(RM) ./div-long-long
	gcc -funsigned-char -m32 -DREFERENCE -o div-long-long div-long-long.c
	./div-long-long

clean:
#	@$(call RMDIR,$(WORKDIR))
#	@$(call DEL,$(SOURCES:.c=.o))
	$(RM) *.prg *.o
	$(RM) ./div-int-int
	$(RM) ./div-char-char
	$(RM) ./div-long-long
