#compress64k Makefile

VERSION = 1.4
COMPRESSION_SFX_HEADER_SIZE = 256

#control if assembler shows an unconditional warning with assembled code-sizes
VERBOSE_BUILD = 0

INSTALL_FOLDER = /usr/local/bin
TESTFILE_FOLDER = testfiles
COMMON_SUBSOURCES =  compression.h  app_common.c


CC = gcc
#CC = tcc
ASS = 64tass -C

CCFLAGS = -Wall -Wextra -Wno-unused -Wno-unused-parameter -Wno-enum-compare -Wno-misleading-indentation 
#CCFLAGS += -O3
LDFLAGS = -lm

DEFINES = -DVERSION=\"$(VERSION)\"  -DCOMPRESSION_SFX_HEADER_SIZE=$(COMPRESSION_SFX_HEADER_SIZE)


all: compress decompress


compress: CCFLAGS += -O3 -s
compress: compress64k

#compress64k: CCFLAGS += -g
compress64k:  compress64k.c compressor.c $(COMMON_SUBSOURCES)  native  # Makefile  # FORCE
	make native
	$(CC)  compress64k.c selfextract.prg.o selfextract_nomove.prg.o \
                             selfextract_rle.prg.o selfextract_rle_nomove.prg.o \
                             -o compress64k  $(CCFLAGS)  $(LDFLAGS)  $(DEFINES)
	rm -f  *.prg.o


decompress: CCFLAGS += -O3 -s
decompress: decompress64k

#decompress64k: CCFLAGS += -g
decompress64k: decompress64k.c decompressor.c $(COMMON_SUBSOURCES)  #native  # Makefile  # FORCE
	$(CC)  decompress64k.c  -o decompress64k  $(CCFLAGS)  $(LDFLAGS)  $(DEFINES)


native: asm obj


asm: selfextract.prg selfextract_nomove.prg  selfextract_rle.prg selfextract_rle_nomove.prg


selfextract.prg: selfextract.asm  extract.asm  # FORCE
	$(ASS)  selfextract.asm  -o selfextract.prg  -DCOMPRESSION_METHOD_RLE=0  -DCOMPRESSION_MOVE_INPUTDATA_BEFORE_SFX_DECRUNCH=1  $(DEFINES)  -DVERBOSE_BUILD=$(VERBOSE_BUILD)

selfextract_rle.prg: selfextract.asm  extract.asm  # FORCE
	$(ASS)  selfextract.asm  -o selfextract_rle.prg  -DCOMPRESSION_METHOD_RLE=1  -DCOMPRESSION_MOVE_INPUTDATA_BEFORE_SFX_DECRUNCH=1  $(DEFINES)  -DVERBOSE_BUILD=$(VERBOSE_BUILD)


selfextract_nomove.prg: selfextract.asm  extract.asm  # FORCE
	$(ASS)  selfextract.asm  -o selfextract_nomove.prg  -DCOMPRESSION_METHOD_RLE=0  -DCOMPRESSION_MOVE_INPUTDATA_BEFORE_SFX_DECRUNCH=0  $(DEFINES)  -DVERBOSE_BUILD=$(VERBOSE_BUILD)

selfextract_rle_nomove.prg: selfextract.asm  extract.asm  # FORCE
	$(ASS)  selfextract.asm  -o selfextract_rle_nomove.prg  -DCOMPRESSION_METHOD_RLE=1  -DCOMPRESSION_MOVE_INPUTDATA_BEFORE_SFX_DECRUNCH=0  $(DEFINES)  -DVERBOSE_BUILD=$(VERBOSE_BUILD)


obj: selfextract.prg.o selfextract_nomove.prg.o  selfextract_rle.prg.o selfextract_rle_nomove.prg.o


selfextract.prg.o:  selfextract.prg
	$(LD)  -r  -b binary  selfextract.prg  -o selfextract.prg.o  #make prg linkable by CC

selfextract_rle.prg.o:  selfextract_rle.prg
	$(LD)  -r  -b binary  selfextract_rle.prg  -o selfextract_rle.prg.o  #make prg linkable by CC


selfextract_nomove.prg.o:  selfextract_nomove.prg
	$(LD)  -r  -b binary  selfextract_nomove.prg  -o selfextract_nomove.prg.o  #make prg linkable by CC

selfextract_rle_nomove.prg.o:  selfextract_rle_nomove.prg
	$(LD)  -r  -b binary  selfextract_rle_nomove.prg  -o selfextract_rle_nomove.prg.o  #make prg linkable by CC


#test: CCFLAGS += -O1
test: CCFLAGS += -O3
test: CCFLAGS += -s 
#test: CCFLAGS += -g 
#test: DEBUG = gdb -ex run --args
test:  compress64k  decompress64k   # native  # Makefile
	-./compress64k  $(TESTFILE_FOLDER)/empty.bin
	-./decompress64k  $(TESTFILE_FOLDER)/empty.cmp
	-diff  $(TESTFILE_FOLDER)/empty.bin  $(TESTFILE_FOLDER)/empty.dec
	@echo ""
	$(DEBUG) ./compress64k  $(TESTFILE_FOLDER)/1byte.bin
	$(DEBUG) ./decompress64k  $(TESTFILE_FOLDER)/1byte.cmp
	diff  $(TESTFILE_FOLDER)/1byte.bin  $(TESTFILE_FOLDER)/1byte.dec
	@echo ""
	./compress64k  $(TESTFILE_FOLDER)/testfile
	./decompress64k  $(TESTFILE_FOLDER)/testfile.cmp
	diff  $(TESTFILE_FOLDER)/testfile  $(TESTFILE_FOLDER)/testfile.dec
	@echo ""
	$(ASS)  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.asm  -o $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg
	$(DEBUG) ./compress64kSFX  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg
	$(DEBUG) ./decompress64kSFX  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.sfx.prg
	diff  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.sfx.dec
	@echo ""
	$(ASS)  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.asm  -o $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg
	$(DEBUG) ./compress64kRLESFX  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg
	$(DEBUG) ./decompress64kRLESFX  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.rlesfx.prg
	diff  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.prg  $(TESTFILE_FOLDER)/NonBASIC_SFX_test.rlesfx.dec
	@echo ""
	./compress64kMEM  $(TESTFILE_FOLDER)/MEMextract_testfile.prg  $(TESTFILE_FOLDER)/MEMextract_testfile.mem
	./decompress64kMEM  $(TESTFILE_FOLDER)/MEMextract_testfile.mem  $(TESTFILE_FOLDER)/MEMextract_testfile.memdec.prg
	diff  $(TESTFILE_FOLDER)/MEMextract_testfile.prg  $(TESTFILE_FOLDER)/MEMextract_testfile.memdec.prg
	$(ASS)  $(TESTFILE_FOLDER)/MEMextract_test.asm  -o $(TESTFILE_FOLDER)/MEMextract_test.prg
#	x64 $(TESTFILE_FOLDER)/MEMextract_test.prg
	@echo ""
	./compress64kRLEMEM  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.prg  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.rlemem
	./dec64rlemem  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.rlemem  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.rlememdec.prg
	diff  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.prg  $(TESTFILE_FOLDER)/RLEMEMextract_testfile.rlememdec.prg
	$(ASS)  $(TESTFILE_FOLDER)/RLEMEMextract_test.asm  -o $(TESTFILE_FOLDER)/RLEMEMextract_test.prg
#	x64 $(TESTFILE_FOLDER)/RLEMEMextract_test.prg
	@echo ""
	$(ASS)  $(TESTFILE_FOLDER)/RLESFX_test.asm  -o $(TESTFILE_FOLDER)/RLESFX_test.prg
	$(DEBUG) ./compress64kRLESFX  $(TESTFILE_FOLDER)/RLESFX_test.prg  $(TESTFILE_FOLDER)/RLESFX_test.rlesfx.prg
	./decompress64kRLESFX  $(TESTFILE_FOLDER)/RLESFX_test.rlesfx.prg  $(TESTFILE_FOLDER)/RLESFX_test.rledec.prg
	diff  $(TESTFILE_FOLDER)/RLESFX_test.prg  $(TESTFILE_FOLDER)/RLESFX_test.rledec.prg
#	x64 $(TESTFILE_FOLDER)/RLESFX_test.rlesfx.prg
	@echo ""
	./compress64k  $(TESTFILE_FOLDER)/test_for_arithmetic_coding.bin
	./decompress64k  $(TESTFILE_FOLDER)/test_for_arithmetic_coding.cmp
	diff  $(TESTFILE_FOLDER)/test_for_arithmetic_coding.bin  $(TESTFILE_FOLDER)/test_for_arithmetic_coding.dec
	@echo ""
	./compress64k  $(TESTFILE_FOLDER)/random.bin  $(TESTFILE_FOLDER)/random.bin.cmp
	./decompress64k  $(TESTFILE_FOLDER)/random.bin.cmp  $(TESTFILE_FOLDER)/random.bin.dec
	diff  $(TESTFILE_FOLDER)/random.bin  $(TESTFILE_FOLDER)/random.bin.dec
	@echo ""
	$(DEBUG) ./compress64k  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.prg.cmp
	$(DEBUG) ./decompress64k  $(TESTFILE_FOLDER)/FlexSID-normal.prg.cmp  $(TESTFILE_FOLDER)/FlexSID-normal.prg.dec
	diff  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.prg.dec
	@echo ""
	$(DEBUG) ./compress64kSFX  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.sfx.prg
	./decompress64kSFX  $(TESTFILE_FOLDER)/FlexSID-normal.sfx.prg  $(TESTFILE_FOLDER)/FlexSID-normal.dec.prg
	diff  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.dec.prg
	@echo ""
	$(DEBUG) ./compress64kRLESFX  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.rlesfx.prg
	./decompress64kRLESFX  $(TESTFILE_FOLDER)/FlexSID-normal.rlesfx.prg  $(TESTFILE_FOLDER)/FlexSID-normal.rledec.prg
	diff  $(TESTFILE_FOLDER)/FlexSID-normal.prg  $(TESTFILE_FOLDER)/FlexSID-normal.rledec.prg
#	x64 $(TESTFILE_FOLDER)/FlexSID-normal.rlesfx.prg
	@echo ""
	./compress64k  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg.cmp
	./decompress64k  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg.cmp  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg.dec
	diff  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg.dec
	@echo ""
	$(DEBUG) ./compress64kSFX  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.sfx.prg
	$(DEBUG) ./decompress64kSFX  $(TESTFILE_FOLDER)/SID-Maker-1.9.sfx.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.dec.prg
	diff  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.dec.prg
	@echo ""
	$(DEBUG) ./cmp64rlesfx  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.rlesfx.prg
	$(DEBUG) ./dec64rlesfx  $(TESTFILE_FOLDER)/SID-Maker-1.9.rlesfx.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.rledec.prg
	diff  $(TESTFILE_FOLDER)/SID-Maker-1.9.prg  $(TESTFILE_FOLDER)/SID-Maker-1.9.rledec.prg
	@echo ""
	./cmp64 $(TESTFILE_FOLDER)/HerMiniSID-exe.prg  -SFX
	./cmp64rlesfx $(TESTFILE_FOLDER)/HerMiniSID-exe.prg
	./cmp64sfx $(TESTFILE_FOLDER)/invitro.prg  -exec 2061
	./cmp64rlesfx $(TESTFILE_FOLDER)/invitro.prg
	./cmp64sfx $(TESTFILE_FOLDER)/stretchbegin.prg
	./cmp64rlesfx $(TESTFILE_FOLDER)/stretchbegin.prg
	./cmp64 $(TESTFILE_FOLDER)/usermanual-unpacked.prg $(TESTFILE_FOLDER)/usermanual-compress64k.sfx.prg  -SFX
	./cmp64 $(TESTFILE_FOLDER)/usermanual-unpacked.prg  -RLESFX  $(TESTFILE_FOLDER)/usermanual-compress64k.rlesfx.prg  -exec h080d
	@echo ""
#	./compress64k  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg.cmp
#	./decompress64k  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg.cmp  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg.dec
#	diff  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg.dec
#	@echo ""
#	./compress64kSFX  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg
#	./decompress64kSFX  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.sfx.prg  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.dec.prg
#	diff  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.prg  $(TESTFILE_FOLDER)/more/SID-Wizard-1.9.dec.prg
#	@echo ""
#	./compress64k  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64.cmp
#	./decompress64k  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64.cmp  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64.dec
#	diff  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64  $(TESTFILE_FOLDER)/more/Robocop3-YELA.d64.dec
#	@echo ""
#	./compress64k  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html.cmp
#	./decompress64k  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html.cmp  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html.dec
#	diff  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html  $(TESTFILE_FOLDER)/more/fast-modulo-10-in-c.html.dec
#	@echo ""
#	./cmp64sfx $(TESTFILE_FOLDER)/more/angry.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/border-main.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/borderodysse.exe.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/borderodyssey-unpacked.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/bullet-time.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/c64goo.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/crack2.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/diamondcity.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/emomyst-SFX-test.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/kerekes-main.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/kerekes.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/LFSR-SID.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/relive.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/soundemon-saw32x.prg
#	./cmp64sfx $(TESTFILE_FOLDER)/more/SRAcol67.prg
	rm -f  $(TESTFILE_FOLDER)/*.dec $(TESTFILE_FOLDER)/*.dec.prg  $(TESTFILE_FOLDER)/*.memdec.prg $(TESTFILE_FOLDER)/*.rledec.prg $(TESTFILE_FOLDER)/*.rlememdec.prg  # $(TESTFILE_FOLDER)/more/*.dec


clean:
	rm -f  ./compress64k  ./decompress64k *.prg.o
	rm -f  $(TESTFILE_FOLDER)/*.cmp  $(TESTFILE_FOLDER)/*.mem  $(TESTFILE_FOLDER)/*.rlemem
	rm -f  $(TESTFILE_FOLDER)/*.dec  $(TESTFILE_FOLDER)/*.dec.prg $(TESTFILE_FOLDER)/*.rledec.prg
#	rm -f  $(TESTFILE_FOLDER)/more/*.cmp  $(TESTFILE_FOLDER)/more/*.dec  $(TESTFILE_FOLDER)/more/*.dec.prg


install: all
	cp  compress64k cmp64  compress64kSFX cmp64sfx  compress64kMEM cmp64mem  $(INSTALL_FOLDER)
	 cp  compress64kRLESFX cmp64rlesfx  compress64kRLEMEM cmp64rlemem  $(INSTALL_FOLDER)
	cp  decompress64k dec64  decompress64kSFX dec64sfx  decompress64kMEM dec64mem  $(INSTALL_FOLDER)
	 cp  decompress64kRLESFX dec64rlesfx  decompress64kRLEMEM dec64rlemem  $(INSTALL_FOLDER)

uninstall:
	rm -f  $(INSTALL_FOLDER)/compress64k $(INSTALL_FOLDER)/decompress64k
	rm -f  $(INSTALL_FOLDER)/cmp64 $(INSTALL_FOLDER)/dec64
	rm -f  $(INSTALL_FOLDER)/compress64kSFX $(INSTALL_FOLDER)/decompress64kSFX
	rm -f  $(INSTALL_FOLDER)/compress64kMEM $(INSTALL_FOLDER)/decompress64kMEM
	rm -f  $(INSTALL_FOLDER)/cmp64sfx $(INSTALL_FOLDER)/dec64sfx
	rm -f  $(INSTALL_FOLDER)/cmp64mem $(INSTALL_FOLDER)/dec64mem
	rm -f  $(INSTALL_FOLDER)/compress64kRLESFX $(INSTALL_FOLDER)/decompress64kRLESFX
	rm -f  $(INSTALL_FOLDER)/cmp64rlesfx $(INSTALL_FOLDER)/dec64rlesfx
	rm -f  $(INSTALL_FOLDER)/compress64kRLEMEM  $(INSTALL_FOLDER)/cmp64rlemem


purge: clean uninstall


FORCE:

