#!/bin/sh

#
#
# $@   the target of the rule
# $<   the first dependency
# $^   all the dependencies
#

#sdcc -mz80 --no-std-crt0 --code-loc 0x42 crt0.rel loader.c
# --no-peep
#sdcc -mz80 --no-std-crt0 --code-loc 0x42 loader.c
#makebin -p loader.ihx loader.bin
#hex2bin -e bin loader.ihx

PROJ = mzmuml

CODE0_LOC = 0x2000

MZF_START = $(CODE0_LOC)
MZF_EXEC = $(CODE0_LOC)

RM = /bin/rm -f
FIND = /bin/find
CP = /bin/cp

CC = sdcc
#AS = asz80
AS = sdasz80
#LINK = asz80
LINK = sdld

MZFHDR = mzfhdr

#USHELL = /root/USARTshell_RTS /dev/ttyUSB0
USHELL = ~/projects/STM32/unikarta-uip/latest/trunk/STM32fw/doc/a.out tcp:192.168.167.80:23

EMU_MZF_PATH=~/share/MZ800EMU_FILES/

INCDIR = -I./

#
# crt0.rel musi jit do linkeru jako prvni !!!
#

SRC  = main.c muml.c
ASRC = crt0.s mz/video/video800_clvvram.s mz/libs/memcpy.s

#OBJ = $(addsuffix .rel,$(basename $(notdir $(SRC))))

# Define all object files.
OBJ = $(ASRC:.s=.rel) $(SRC:.c=.rel) 

# Define all listing files.
LST = $(SRC:.c=.lst) $(ASRC:.s=.lst)

#
#SDCC_LIB_PATH = /root/sdcc/device/lib/z80/
#SDCC_Z80_LIB = z80.lib

LINK_OPTS=-nmjywxi
LINK_LIBS=-k /usr/local/sdcc/share/sdcc/lib/z80 -k /usr/local/sdcc/share/sdcc/lib/z80 -l z80

#
#LNK_LIBS = $(SDCC_LP)crtcall.rel $(SDCC_LP)stubs.rel

all: $(PROJ).mzf

$(PROJ).mzf: $(PROJ).bin
	@echo
	@echo "MZFize: $@"
	@#/root/share/nipos/new/develtools/bin2mzf `echo "$(PROJ)" | tr [a-z] [A-Z]` $(MZF_START) <$< >$(PROJ).mzf
	$(MZFHDR) -n -t 1 -f `echo "$(PROJ)" | tr [a-z] [A-Z]` -d $(MZF_START) -e $(MZF_EXEC) -o $(PROJ).mzf $<
	$(CP) $(PROJ).mzf $(EMU_MZF_PATH)
	@#$(CP) $(PROJ).mzf ~/NetBeansProjects/mz800emu/
	@#$(CP) $(PROJ).mzf ~/NetBeansProjects/old_emulator/
	@#scp testgdg.mzf nas:~michal/CloudStation/

$(PROJ).bin: $(PROJ).ihx
	@echo
	@echo "Binarize:"
	hex2bin -e bin $(PROJ).ihx
	
	
$(PROJ).ihx: $(OBJ)
	@echo
	@echo "Linking: $@"
	@###$(CC) -mz80  --no-std-crt0  --code-loc $(CODELOC) --data-loc $(DATALOC) $^ -o $@
	@##aslink -w -i -m -b _CODE=$(CODELOC) -b _DATA=$(DATALOC) -b _GSINIT=$(GSINIT) -k $(SDCC_LIB_PATH) -l $(SDCC_Z80_LIB) $@ $^
	@#aslink -w -i -m -b _CODE0=0x0000 -b _DATA=0x5000 $@ $^
	@#aslink -w -i -m -b _CODE0=$(CODE0_LOC) -k $(SDCC_LIB_PATH) -l $(SDCC_Z80_LIB) $@ $^
	$(LINK) $(LINK_OPTS) -b _CODE=$(CODE0_LOC) $(LINK_LIBS) $@ $^ && $(LINK) $(LINK_OPTS) -b _CODE=$(CODE0_LOC) -b _GSINIT=$(CODE0_LOC)+0x`egrep "^\s+[0-9|A-F]+\s+l__CODE\s" $(PROJ).map |sed -e 's/\sl__CODE\s.*//' -e 's/[^0-9|A-F]//g'` $(LINK_LIBS) $@ $^

	@egrep " [sl]_" $(PROJ).map | \
	sed -re 's/\s+/ /g' -e 's/^ //g' -e 's/^0000/0x/g' -e 's/ s_/ /g' -e 's/(\w+)\s(\w+).*/\1 \2/g' | \
	egrep -v "^\w+\s(BSEG|_CABS|_DABS|REG_BANK_)" | \
	awk '\
		BEGIN { \
			OFS="\t";print "\nStart\tSize\tArea Name\n=========================" \
		} \
		{ if ( $$2 ~ /l_/) { \
			SIZE[$$2]=$$1 \
		} else { \
			if ( $$2 == "_DATA" ) print ""; \
			print $$1,SIZE["l_"$$2],$$2 \
		} }'
	@echo
	
%.rel: %.c
	@echo
	@echo Compiling: $<
	@#$(CC) -mz80 -o $@ -c $<
	@#$(CC) -mz80 --codeseg CODE1 --constseg CONST_DATA1 -o $@ -c $<
	@#$(CC) -mz80 --opt-code-size -o $@ -c $<
	$(CC) -mz80 --opt-code-speed --std-sdcc99 -D UNMASK_SFR ${INCDIR} -o $@ -c $<
	
#%.asm: %.c
#	@echo
#	@echo Compiling into ASM: $<
#	$(CC) -mz80 --codeseg CODE1 --constseg CONST_DATA1 -o $@_tmp -S $<
#	@sed -e "s/^\s\.optsdcc \-mz80/;\t.optsdcc -mz80/" -e "s/\.area _DATA/.area _DATA1/g" $@_tmp > $@
#	@$(RM) -f $@_tmp

#%.rel: %.asm
#	@echo
#	@echo Assembling from .ASM: $<
#	$(AS) -l -s -o $<

%.rel: %.s
	@echo
	@echo Assembling: $<
	@#$(AS) -l -s -o $<
	$(AS) -lsow $<

bin2mzf:
	gcc -o bin2mzf bin2mzf.c


z80libs:
	$(FIND) $(SDCC_LIB_PATH) -name "*.rel" -exec basename {} \; > $(SDCC_LIB_PATH)/$(SDCC_Z80_LIB)

upl: $(PROJ).mzf
	@echo
	@echo "Uploading project file to unicard SD..."
	$(USHELL) open $(PROJ).mzf /$(PROJ).mzf

clean:
	@echo
	@echo "Cleaning project..."
	@$(RM) $(PROJ).ihx
	@$(RM) $(PROJ).map
	@$(RM) $(PROJ).lk
	@$(RM) $(PROJ).noi
	@$(RM) $(PROJ).bin
	@$(RM) $(PROJ).cdb
	@$(RM) $(PROJ).omf
	@$(RM) $(OBJ)
	@$(RM) $(LST)
	@$(RM) $(SRC:.c=.asm)
	@$(RM) $(SRC:.c=.sym)
	@$(RM) $(ASRC:.s=.sym)
	@$(RM) */*~ *~
