SRC = ..\Acid800\source\ 
SRCSAP = source\ 
SOUT = $(OUT)standalone\ 
YOUT = $(OUT)symbols\ 
LIBDEPS = $(SRC)library.s $(SRCSAP)libsap.s

.SUFFIXES: .s .obx .atr .sap .xex

{$(SRC)}.s.{$(OBJ)}.obx:
	@echo $(@F)
	@if not exist "$(OBJ)\" md "$(OBJ)\"
	@if not exist "$(YOUT)\" md "$(YOUT)\"
	@for %x in ("$(SRC)$(@B).s") do @mads -s -c -d:SYSSAP=1 -t:"$(YOUT)$(@B).lab" -l:"$(YOUT)$(@B).lst" -o:"$(OBJ)$(@B).obx" -i:"$(SRC)\" -i:"$(SRCSAP)\" -i:"$(OBJ)\" "%~fx"

{$(SRC)}.s.{$(SOUT)}.xex:
	@echo $(@F)
	@if not exist "$(SOUT)\" md "$(SOUT)\"
	@for %x in ("$(SRC)$(@B).s") do @mads -s -c -d:SYSSAP=1 -d:GENLIBRARY=1 -d:STANDALONE=1 -t:"$(SOUT)$(@B).lab" -l:"$(SOUT)$(@B).lst" -o:"$(SOUT)$(@B).xex" -i:"$(SRC)\" -i:"$(SRCSAP)\" "%~fx"
	
{$(SRC)}.s.{$(SOUT)}.sap:
	@echo $(@F)
	@if not exist "$(SOUT)\" md "$(SOUT)\"
	@for %x in ("$(SRC)$(@B).s") do @mads -s -c -d:GENSAP=1 -d:SYSSAP=1 -d:GENLIBRARY=1 -d:STANDALONE=1 -t:"$(SOUT)$(@B).lab" -l:"$(SOUT)$(@B).lst" -o:"$(SOUT)$(@B).sap" -i:"$(SRC)\" -i:"$(SRCSAP)\" "%~fx"
	
all: $(OUT)acidsap.xex $(OUT)acidsap.sap standalone-tests

clean:
	@if {$(OBJ)}=={} (echo ERROR: OBJ is empty; I won't clean the root. && exit /b 10)
	@if {$(OUT)}=={} (echo ERROR: OUT is empty; I won't clean the root. && exit /b 10)
	@if exist "$(OBJ)*.obx" del "$(OBJ)*.obx"
	@if exist "$(OUT)acidsap.rom" del "$(OUT)acidsap.rom"
	@if exist "$(OUT)*.lst" del "$(OUT)*.lst"
	@if exist "$(OUT)*.lab" del "$(OUT)*.lab"
	@if exist "$(YOUT)*.lst" del "$(YOUT)*.lst"
	@if exist "$(YOUT)*.lab" del "$(YOUT)*.lab"
	@if exist "$(SOUT)*.xex" del "$(SOUT)*.xex"
	@if exist "$(SOUT)*.lst" del "$(SOUT)*.lst"
	@if exist "$(SOUT)*.lab" del "$(SOUT)*.lab"

$(OUT)acidsap.xex: $(SRCSAP)boot.s tests $(LIBDEPS)
	@echo $(@F)
	@if not exist "$(OUT)\" md "$(OUT)\"
	@for %x in ("$(SRCSAP)boot.s") do @mads -s -c -d:SAPBOOTER=1 -d:SYSSAP=1 -o:"$(OUT)acidsap.xex" -i:"$(OBJ)\" -i:"$(SRC)\" -i:"$(SRCSAP)\" -l:"$(OUT)acidsap.lst" -t:"$(OUT)acidsap.lab" "%~fx"

$(OUT)acidsap.sap: $(SRCSAP)boot.s tests $(LIBDEPS)
	@echo $*
	@if not exist "$(OUT)\" md "$(OUT)\"
	@for %x in ("$(SRCSAP)boot.s") do @mads -s -c -d:SYSSAP=1 -o:"$(OUT)acidsap.sap" -i:"$(OBJ)\" -i:"$(SRC)\" -i:"$(SRCSAP)\" -l:"$(OUT)acidsap.lst" -t:"$(OUT)acidsap.lab" "%~fx"
	
tests:	\
	$(OBJ)antic_vcount.obx \
	$(OBJ)antic_wsync.obx \
	$(OBJ)antic_addrmirror.obx \
	$(OBJ)pokey_default.obx \
	$(OBJ)pokey_noise.obx \
	$(OBJ)pokey_irqtiming.obx \
	$(OBJ)pokey_timerirq.obx \
	$(OBJ)pokey_timergranularity.obx \
	$(OBJ)pokey_twotone.obx \
	$(OBJ)pokey_seroc.obx \
	$(OBJ)pokey_asyncrecv.obx \
	$(OBJ)pokey_addrmirror.obx \
	$(OBJ)cpu_flags.obx \
	$(OBJ)cpu_decimal.obx \
	$(OBJ)cpu_timing.obx \
	$(OBJ)cpu_bugs.obx \
	$(OBJ)cpu_clisei.obx \
	$(OBJ)cpu_illegal.obx \

standalone-tests:	\
	$(SOUT)antic_vcount.xex \
	$(SOUT)antic_vcount.sap \
	$(SOUT)antic_wsync.xex \
	$(SOUT)antic_wsync.sap \
	$(SOUT)antic_addrmirror.xex \
	$(SOUT)antic_addrmirror.sap \
	$(SOUT)pokey_default.xex \
	$(SOUT)pokey_default.sap \
	$(SOUT)pokey_noise.xex \
	$(SOUT)pokey_noise.sap \
	$(SOUT)pokey_irqtiming.xex \
	$(SOUT)pokey_irqtiming.sap \
	$(SOUT)pokey_timerirq.xex \
	$(SOUT)pokey_timerirq.sap \
	$(SOUT)pokey_timergranularity.xex \
	$(SOUT)pokey_timergranularity.sap \
	$(SOUT)pokey_twotone.xex \
	$(SOUT)pokey_twotone.sap \
	$(SOUT)pokey_seroc.xex \
	$(SOUT)pokey_seroc.sap \
	$(SOUT)pokey_asyncrecv.xex \
	$(SOUT)pokey_asyncrecv.sap \
	$(SOUT)pokey_addrmirror.xex \
	$(SOUT)pokey_addrmirror.sap \
	$(SOUT)pokey_inittiming.xex \
	$(SOUT)pokey_inittiming.sap \
	$(SOUT)cpu_insn.xex \
	$(SOUT)cpu_insn.sap \
	$(SOUT)cpu_flags.xex \
	$(SOUT)cpu_flags.sap \
	$(SOUT)cpu_decimal.xex \
	$(SOUT)cpu_decimal.sap \
	$(SOUT)cpu_timing.xex \
	$(SOUT)cpu_timing.sap \
	$(SOUT)cpu_bugs.xex \
	$(SOUT)cpu_bugs.sap \
	$(SOUT)cpu_clisei.xex \
	$(SOUT)cpu_clisei.sap \
	$(SOUT)cpu_illegal.xex \
	$(SOUT)cpu_illegal.sap

$(SOUT)antic_vcount.sap:			$(SOUT)antic_vcount.xex
$(SOUT)antic_wsync.sap:				$(SOUT)antic_wsync.xex
$(SOUT)antic_addrmirror.sap:		$(SOUT)antic_addrmirror.xex
$(SOUT)pokey_default.sap:			$(SOUT)pokey_default.xex
$(SOUT)pokey_noise.sap:				$(SOUT)pokey_noise.xex
$(SOUT)pokey_irqtiming.sap:			$(SOUT)pokey_irqtiming.xex
$(SOUT)pokey_timerirq.sap:			$(SOUT)pokey_timerirq.xex
$(SOUT)pokey_timergranularity.sap:	$(SOUT)pokey_timergranularity.xex
$(SOUT)pokey_twotone.sap:			$(SOUT)pokey_twotone.xex
$(SOUT)pokey_seroc.sap:				$(SOUT)pokey_seroc.xex
$(SOUT)pokey_asyncrecv.sap:			$(SOUT)pokey_asyncrecv.xex
$(SOUT)pokey_addrmirror.sap:		$(SOUT)pokey_addrmirror.xex
$(SOUT)pokey_inittiming.sap:		$(SOUT)pokey_inittiming.xex
$(SOUT)cpu_insn.sap:				$(SOUT)cpu_insn.xex
$(SOUT)cpu_flags.sap:				$(SOUT)cpu_flags.xex
$(SOUT)cpu_decimal.sap:				$(SOUT)cpu_decimal.xex
$(SOUT)cpu_timing.sap:				$(SOUT)cpu_timing.xex
$(SOUT)cpu_bugs.sap:				$(SOUT)cpu_bugs.xex
$(SOUT)cpu_clisei.sap:				$(SOUT)cpu_clisei.xex
$(SOUT)cpu_illegal.sap:				$(SOUT)cpu_illegal.xex

$(SOUT)antic_vcount.xex				$(OBJ)antic_vcount.obx:				$(SRC)antic_vcount.s $(LIBDEPS)
$(SOUT)antic_wsync.xex				$(OBJ)antic_wsync.obx:				$(SRC)antic_wsync.s $(LIBDEPS)
$(SOUT)antic_addrmirror.xex			$(OBJ)antic_addrmirror.obx:			$(SRC)antic_addrmirror.s $(LIBDEPS)
$(SOUT)pokey_default.xex			$(OBJ)pokey_default.obx:			$(SRC)pokey_default.s $(LIBDEPS)
$(SOUT)pokey_noise.xex				$(OBJ)pokey_noise.obx:				$(SRC)pokey_noise.s $(LIBDEPS)
$(SOUT)pokey_irqtiming.xex			$(OBJ)pokey_irqtiming.obx:			$(SRC)pokey_irqtiming.s $(LIBDEPS)
$(SOUT)pokey_timerirq.xex			$(OBJ)pokey_timerirq.obx:			$(SRC)pokey_timerirq.s $(LIBDEPS)
$(SOUT)pokey_timergranularity.xex	$(OBJ)pokey_timergranularity.obx:	$(SRC)pokey_timergranularity.s $(LIBDEPS)
$(SOUT)pokey_twotone.xex			$(OBJ)pokey_twotone.obx:			$(SRC)pokey_twotone.s $(LIBDEPS)
$(SOUT)pokey_seroc.xex				$(OBJ)pokey_seroc.obx:				$(SRC)pokey_seroc.s $(LIBDEPS)
$(SOUT)pokey_asyncrecv.xex			$(OBJ)pokey_asyncrecv.obx:			$(SRC)pokey_asyncrecv.s $(LIBDEPS)
$(SOUT)pokey_addrmirror.xex			$(OBJ)pokey_addrmirror.obx:			$(SRC)pokey_addrmirror.s $(LIBDEPS)
$(SOUT)pokey_inittiming.xex			$(OBJ)pokey_inittiming.obx:			$(SRC)pokey_inittiming.s $(LIBDEPS)
$(SOUT)cpu_insn.xex					$(OBJ)cpu_insn.obx:					$(SRC)cpu_insn.s $(LIBDEPS)
$(SOUT)cpu_flags.xex				$(OBJ)cpu_flags.obx:				$(SRC)cpu_flags.s $(LIBDEPS)
$(SOUT)cpu_decimal.xex				$(OBJ)cpu_decimal.obx:				$(SRC)cpu_decimal.s $(LIBDEPS)
$(SOUT)cpu_timing.xex				$(OBJ)cpu_timing.obx:				$(SRC)cpu_timing.s $(LIBDEPS)
$(SOUT)cpu_bugs.xex					$(OBJ)cpu_bugs.obx:					$(SRC)cpu_bugs.s $(LIBDEPS)
$(SOUT)cpu_clisei.xex				$(OBJ)cpu_clisei.obx:				$(SRC)cpu_clisei.s $(LIBDEPS)
$(SOUT)cpu_illegal.xex				$(OBJ)cpu_illegal.obx:				$(SRC)cpu_illegal.s $(LIBDEPS)
