# Copyright (c) 2003, Adam Dunkels.
# All rights reserved. 
#
# Redistribution and use in source and binary forms, with or without 
# modification, are permitted provided that the following conditions 
# are met: 
# 1. Redistributions of source code must retain the above copyright 
#    notice, this list of conditions and the following disclaimer. 
# 2. Redistributions in binary form must reproduce the above copyright 
#    notice, this list of conditions and the following disclaimer in the 
#    documentation and/or other materials provided with the distribution. 
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#      This product includes software developed by Adam Dunkels.
# 4. The name of the author may not be used to endorse or promote
#    products derived from this software without specific prior
#    written permission.  
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
#
# This file is part of the Contiki desktop environment
#
# $Id: Makefile.programs,v 1.2 2006/04/17 14:42:28 kthacker Exp $
#
# convert to cpc

UIP_PRGS = ../contiki/apps/www.prg ../contiki/apps/www.dsc \
	../contiki/apps/websrv.prg ../contiki/apps/websrv.dsc \
	../contiki/apps/stelnet.prg ../contiki/apps/stelnet.dsc \
	../contiki/apps/ftp.prg ../contiki/apps/ftp.dsc \
	../contiki/apps/email.prg ../contiki/apps/email.dsc \
	../contiki/apps/dhcp.prg ../contiki/apps/dhcp.dsc \
	../contiki/apps/wget.dsc \
	../contiki/apps/vnc.prg ../contiki/apps/vnc.dsc \
#	../contiki/apps/irc.prg ../contiki/apps/irc.dsc 
#	../contiki/apps/wget.prg 
#	../contiki/apps/telnetd.prg ../contiki/apps/telnetd.dsc \



all: 	./arch/crt0-dsc.o \
	./arch/crt0-prg.o \
	./arch/contiki_labels.o \
	./loader/loader-arch-module.o \
	./apps/welcome.prg \
	../contiki/apps/conio.prg \
	../contiki/apps/about.prg ../contiki/apps/about.dsc \
	../contiki/apps/netconf.prg ../contiki/apps/netconf.dsc \
	../contiki/apps/process.prg ../contiki/apps/process.dsc \
	../contiki/apps/calc.prg ../contiki/apps/calc.dsc \
	../contiki/apps/editor.prg ../contiki/apps/editor.dsc \
	../contiki/apps/dir.prg ./apps/dir.dsc \
	./apps/config.prg \
	./apps/confedit.prg \
	./apps/confedit.dsc \
	../contiki/apps/shell.prg ../contiki/apps/shell.dsc \
    ./apps/memstat.prg ./apps/memstat.dsc
#	$(UIP_PRGS) \

#	./cfs-cpc.drv \
#	./ctk-text.drv \
#	./ctk-default.drv \
#	./ctk-80col.drv \
#	./slip.drv slip.dsc \
#	./cgterm.prg cgterm.dsc \


SYS=cpc

include Makefile.common 

CFLAGS:=$(CFLAGSCOMMON) --compile-only \
	-DWITH_ASCII \
	-DWITH_CONIO \
	-DWITH_LOADER_ARCH=1

# conversion of intel hex record to binary, cpc binary with header, then inject into disc image
define MAKE_DSC
echo -in $(@:.dsc=.ihx) > $@.lnk
	echo arch/crt0-dsc.o >> $@.lnk
	echo $< >> $@.lnk
	echo -e >> $@.lnk
	$(LD) -f $@.lnk
	makebin -p -s 65535 < $(@:.dsc=.ihx) > $@.bin
	cpcfs contiki.dsk p -b -e $@.bin
endef	

%.dsc: %-dsc.o 
	$(MAKE_DSC)

define MAKE_PRG
	echo -ihmwn $(@:.prg=.ihx) > $@.lnk
	echo -k /usr/local/share/sdcc/lib/z80 >> $@.lnk
	echo -l z80 >> $@.lnk
	echo arch/crt0-prg.o >> $@.lnk
	echo loader/loader-arch-module.o >> $@.lnk
	echo arch/contiki_labels.o >> $@.lnk
	echo $^ | xargs -n1 >> $@.lnk
	echo -e >> $@.lnk
	$(LD) -f $@.lnk
	makebin -p -s 65535 < $(@:.prg=.ihx) > $@.bin
	cpcfs contiki.dsk p -b -e $@.bin
endef	

../contiki/apps/irc.prg: ../contiki/apps/ircc.o ../contiki/apps/ircc-strings.o \
	../contiki/apps/irc.o ../contiki/uip/socket.o ../contiki/uip/uipbuf.o
	$(MAKE_PRG)

../contiki/apps/irc.dsc: ../contiki/apps/irc-dsc.o
	$(MAKE_DSC)

./apps/config.prg: apps/config.o
	$(MAKE_PRG)

./apps/confedit.prg: apps/configedit.o
	$(MAKE_PRG)

./apps/confedit.dsc: apps/configedit-dsc.o
	$(MAKE_DSC)

./apps/welcome.prg: apps/welcome.o
	$(MAKE_PRG)

../contiki/apps/about.prg: ../contiki/apps/about.o
	$(MAKE_PRG)

../contiki/apps/calc.prg: ../contiki/apps/calc.o
	$(MAKE_PRG)

./apps/cgterm.prg: ./apps/cgterm.o \
	../contiki/uip/socket.o \
	../contiki/uip/uipbuf.o	\
	lib/lc-asm.o
	$(MAKE_PRG)

./apps/cgterm.dsc: ./apps/cgterm-dsc.o 
	$(MAKE_DSC)

../contiki/apps/dhcp.prg: ../contiki/apps/dhcp.o ../contiki/uip/dhcpc.o ./lib/lc-asm.o
	$(MAKE_PRG)

../contiki/apps/editor.prg: ../contiki/apps/editor.o \
	../contiki/lib/ctk-filedialog.o \
	../contiki/lib/memb.o
	$(MAKE_PRG)

../contiki/apps/email.prg: ../contiki/apps/email.o \
	../contiki/lib/ctk-textedit.o \
	../contiki/apps/smtp-socket.o \
	../contiki/apps/smtp-strings.o \
	../contiki/uip/socket.o \
	../contiki/uip/uipbuf.o \
	./lib/lc-asm.o 
	$(MAKE_PRG)

../contiki/apps/ftp.prg: ../contiki/apps/ftp.o \
	../contiki/apps/ftpc.o \
	../contiki/lib/memb.o
	$(MAKE_PRG)

../contiki/apps/netconf.prg: ../contiki/apps/netconf.o
	$(MAKE_PRG)

../contiki/apps/process.prg: ../contiki/apps/processes.o
	$(MAKE_PRG)

../contiki/apps/process.dsc: ../contiki/apps/processes-dsc.o
	$(MAKE_DSC)

../contiki/apps/dir.prg: ../contiki/apps/directory.o lib/strcasecmp.o
	$(MAKE_PRG)

./apps/dir.dsc: ./apps/directory-dsc.o
	$(MAKE_DSC)

../contiki/apps/shell.prg: ../contiki/apps/shell-gui.o ./apps/shell.o ../contiki/lib/ctk-textentry-cmdline.o
	$(MAKE_PRG)

../contiki/apps/telnetd.prg: ../contiki/apps/telnetd.o \
 	../contiki/apps/shell.o \
	../contiki/lib/memb.o \
	../contiki/apps/telnetd-gui.o
	$(MAKE_PRG)

../contiki/apps/telnetd.dsc: telnetd-dsc.o 
	$(MAKE_DSC)

../contiki/apps/www.prg: $(WWW)
	$(MAKE_PRG)

../contiki/apps/websrv.prg: $(WEBSERVER)
	$(MAKE_PRG)

../contiki/apps/websrv.dsc: ../contiki/apps/webserver-dsc.o
	$(MAKE_DSC)

../contiki/apps/stelnet.prg: $(TELNET)
	$(MAKE_PRG)

../contiki/apps/stelnet.dsc: ../contiki/apps/telnet-dsc.o
	$(MAKE_DSC)

../contiki/apps/wget.prg: $(WGET)
	$(MAKE_PRG)

../contiki/apps/wget.dsc: apps/wget-dsc.o
	$(MAKE_DSC)

../contiki/apps/splip.drv: slip-drv.o rs232dev.o


../contiki/apps/conio.prg: \
	./ctk/ctk-conio-service.o \
	./arch/conio.o
	$(MAKE_PRG)

#ctk-text.drv: ctk-conio-service.o

ctk-80col.drv: ctk-80col.o 

ctk-default.drv: ctk-hires-service.o

default.prg: themeloader.o ctk-hires-theme-default.o



VNC=../contiki/apps/vnc.o \
	../contiki/apps/vnc-viewer.o \
	./apps/vnc-draw.o 

../contiki/apps/vnc.prg: $(VNC)
	$(MAKE_PRG)

#blueround.prg: themeloader.o ctk-hires-theme-blueround.o contiki-labels.o
#	cl65 --module -t c64 -o $@ loader-arch-module.o $^

#default.prg: themeloader.o ctk-hires-theme-default.o contiki-labels.o
#	cl65 -Ln default-prg.labels --module -t c64 -o $@ loader-arch-module.o $^

#enabler.prg: themeloader.o ctk-hires-theme-enabler.o contiki-labels.o
#	cl65 -Ln default-prg.labels --module -t c64 -o $@ loader-arch-module.o $^

#springlight.prg: themeloader.o ctk-hires-theme-springlight.o contiki-labels.o
#	cl65 -Ln default-prg.labels --module -t c64 -o $@ loader-arch-module.o $^

#ravenpine.prg: themeloader.o ctk-hires-theme-ravenpine.o contiki-labels.o
#	cl65 -Ln default-prg.labels --module -t c64 -o $@ loader-arch-module.o $^




./apps/memstat.prg: apps/memstat.o
	$(MAKE_PRG)

./apps/memstat.dsc: apps/memstat-dsc.o
	$(MAKE_DSC)

mtest.prg: mtest.o mtp.o mt.o mtarch.o mtarch-asm.o

lc-test: lc-test.o lc-asm.o
