# Define a helper macro for debugging make errors online # you can type "make print-VARIABLE" and it will show you # how that ended up being resolved by all of the included # makefiles. print-%: @echo $*=$($*) #CP/M emulator CPMEMU = zxcc #Location of CP/M binaries CPMBIN = /usr/local/lib/cpm/bin80 #AS = $(CPMEMU) $(CPMBIN)/m80.com AS = $(CPMEMU) slr180.com LN = $(CPMEMU) slrnk+.com #LN = $(CPMEMU) ccpline.com RM = rm -f ASM_OPT := HFS comma:= , empty:= space:= $(empty) $(empty) ccpline = $(CPMEMU) $(1) -$(subst $(space),$(comma),$(strip $(2))) define cpm-asm = COMMAND="$(AS) -$*/$(ASM_OPT)"; \ OUTPUT=$$(mktemp); echo $${COMMAND}; \ $${COMMAND} < $< > $${OUTPUT}; \ grep -q '^ 0 Error(s) Detected' $${OUTPUT}; ERROR=$$? ; \ if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; rm -f $@; fi ; \ exit $${ERROR} endef define cpm-link = COMMAND="$(call ccpline, slrnk+, $*/H/M /V \ /P:$(PROG_SEG) /D:$(DATA_SEG) $(basename $^) /E /Q)";\ OUTPUT=$$(mktemp); echo $${COMMAND};\ $${COMMAND} > $${OUTPUT};\ ERROR=0;\ cat $${OUTPUT};\ grep -q ' Duplicate Symbol ' $${OUTPUT} && ERROR=2; \ grep -q '\- Previously Defined' $${OUTPUT} && ERROR=2; \ [ "$${ERROR}" = "0" ] && grep -q '^ ** ' $${OUTPUT} && ERROR=1 ; \ [ "$${ERROR}" != "0" ] && rm -f $@; \ exit $${ERROR} endef #Use: MAKESYM Filename[.ext][/PXXXX][/DXXXX][/CXXXX] #egrep '^[[:xdigit:]]{4}[[:space:]]+[[:xdigit:]]{4}[[:space:]]+D.*init\.rel' hdrom.map define cpm-mksym = COMMAND="$(CPMEMU) makesym -$^ -/P0 -/D0"; \ OUTPUT=$$(mktemp); echo $${COMMAND}; \ $${COMMAND} > $${OUTPUT}; \ grep -q '^ 0 Error(s) Detected' $${OUTPUT}; ERROR=$$? ; \ if [ "$${ERROR}" != "0" ]; then cat $${OUTPUT}; rm -f $@; fi ; \ exit $${ERROR} endef .SUFFIXES: %.hex %.lst: %.180 @$(cpm-asm) %.hex %.map: $(OBJ) @#$(cpm-link) ld80 -o $@ -ms $(@:.hex=.map) -P $(PROG_SEG) -D $(DATA_SEG) $^ %.rel %.lst: %.180 @$(cpm-asm) %.c: %.hex srec_cat -o $@ -c_array $* -C_COMpressed -include $< -Intel %.sym: %.lst @$(cpm-mksym) .PHONY: clean clean: $(RM) *.hex *.rel *.lst *.sym *.map *.c *.h