From 1e6ac84151a1a11ea4254616ac8478e5d1c54674 Mon Sep 17 00:00:00 2001 From: matsutsuka Date: Sat, 29 Sep 2007 03:57:07 +0000 Subject: [PATCH] Customized crt0 has been introduced to fix some SDCC glitches. --- cpu/z80/Makefile.z80 | 25 ++++++++++++++--------- cpu/z80/crt0.S | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 cpu/z80/crt0.S diff --git a/cpu/z80/Makefile.z80 b/cpu/z80/Makefile.z80 index 493069e64..752d7cf3a 100644 --- a/cpu/z80/Makefile.z80 +++ b/cpu/z80/Makefile.z80 @@ -2,13 +2,12 @@ # Makefile for z80/SDCC # @author Takahide Matsutsuka # -# $Id: Makefile.z80,v 1.7 2007/09/19 12:41:33 matsutsuka Exp $ +# $Id: Makefile.z80,v 1.8 2007/09/29 03:57:07 matsutsuka Exp $ # ### Compiler definitions CC = sdcc -LD = sdcc -#LD = link-z80 +LD = link-z80 AS = as-z80 AR = sdcclib OBJCOPY = objcopy @@ -21,17 +20,21 @@ CUSTOM_RULE_LINK=1 ### Default flags CFLAGS += --std-c99 --vc -mz80 +# --peep-file $(CONTIKI_CPU)/z80peephole.def ASFLAGS += -LDFLAGS += +LDFLAGS += -mz80 --out-fmt-ihx --no-std-crt0 AROPTS = -a +### CPU-dependent cleanup files +CLEAN += *.lnk *.sym *.lib contiki.ihx + ### CPU-dependent directories CONTIKI_CPU_DIRS = . dev lib ### CPU-dependent source files CONTIKI_SOURCEFILES += strcasecmp.c mtarch.c uip_arch.c \ - libconio_z80.c log-conio.c rs232.c rs232-slip.c -CONTIKI_ASMFILES += uip_arch-asm.S + libconio_z80.c log-conio.c rs232.c +CONTIKI_ASMFILES += uip_arch-asm.S crt0.S CONTIKI_CASMOBJECTFILES = ${addprefix $(OBJECTDIR)/,$(CONTIKI_CASMFILES:.cS=.o)} @@ -55,9 +58,11 @@ $(OBJECTDIR)/%.o: %.cS endif #CUSTOM_RULE_ALLOBJS_TO_TARGETLIB -contiki-$(TARGET).a: $(CONTIKI_OBJECTFILES) $(PROJECT_OBJECTFILES) $(CONTIKI_ASMOBJECTFILES) $(CONTIKI_CASMOBJECTFILES) - for target in $^; do $(AR) $(AROPTS) $@ $$target; done +contiki-$(TARGET).lib: $(CONTIKI_OBJECTFILES) $(PROJECT_OBJECTFILES) $(CONTIKI_ASMOBJECTFILES) $(CONTIKI_CASMOBJECTFILES) + rm -f $@ + for target in $^; do echo $$target >> $@; done #CUSTOM_RULE_LINK -contiki.ihex: contiki-$(TARGET).a - $(LD) $(LDFLAGS) -DAUTOSTART_ENABLE $(CONTIKI_TARGET_MAIN) -lcontiki-$(TARGET).a -o $@ +contiki.ihx: contiki-$(TARGET).lib + $(CC) $(LDFLAGS) -o $@ $(OBJECTDIR)/crt0.o -lcontiki-$(TARGET).lib + $(LD) -nf contiki diff --git a/cpu/z80/crt0.S b/cpu/z80/crt0.S new file mode 100644 index 000000000..a570c5785 --- /dev/null +++ b/cpu/z80/crt0.S @@ -0,0 +1,48 @@ + ;; crt0.S for Contiki + .module crt0 + .globl _main + + .area _HEADER (ABS) + .org 0 + jp init + + ;; Ordering of segments for the linker. + .area _HOME + .area _CODE + .area _GSINIT + .area _GSFINAL + .area _DATA + .area _DATAFINAL + .area _BSS + .area _HEAP + + .area _CODE +init:: + ;; Clear global variables + ld hl, #_datastart + ld bc, #_dataend +_clear_loop: + ld a, h + sub b + jr nz, _clear_next + ld a, l + sub c + jr z, _clear_exit +_clear_next: + ld (hl), #0 + inc hl + jr _clear_loop +_clear_exit: + ;; Initialize global variables + call gsinit + jp _main + + .area _GSINIT +gsinit:: + + .area _GSFINAL + ret + .area _DATA +_datastart:: + .area _DATAFINAL +_dataend::