Hi,
I am probably doing something wrong, but I can't figure out how
to get _GSINIT into the code section. I'm compiling for z80, and
using link options:
-mz80 --no-std-crt0 --code-loc 0x4100 --data-loc 0x8000
The target z80 based system has existing firmware at 0x0000-3fff.
That firmware has provision to call a user app in dataflash at 0x4000-7fff.
There is RAM available for this user app at 0x8000-bfff.
The system RAM & stack is at 0xC000-ffff.
A very simple example is pasted below, including my crt0.s, makefile, and
contents of the .map file generated. The problem is that the *code*
that inits
the variable "x" is landing at 0x8002, in RAM, right after the two bytes
reserved
by the "int x" at 0x8000.
Googling [sdcc gsinit] finds several examples of ".area GSINITx (CODE)",
but I just get an undefined symbol error if I use ".area _GSINIT (CODE)"
in my crt0.s. Also, the assembler manual doesn't show "CODE" as a
valid .area option.
I am using SDCC 2.7.0 #4818 (May 31 2007) (MINGW32)
on an AMD K7 under win98.
Also tried 2.7.3 #4913 (Sep 15 2007) (MINGW32)
with same results.
Thanks!!!
Randy
-------------- start of example.c ------------
int x = 1;
int main(void) {
return x;
}
-------------- end of example.c ------------
--------------- start of crt0.s ---------------------
.module crt0
.globl _main
.area _HEADER (ABS)
.org 0x4000
call gsinit
call _main
jp 0x0000
;; Ordering of segments for the linker.
.area _HOME
.area _CODE
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _BSS
.area _HEAP
.area _GSINIT
gsinit::
.area _GSFINAL
ret
-------------- end of crt0.s ----------------------------
-------------- start of makefile ----------------------------
# makefile for "example.c"
TARGET = example
SRC = example.c
ASRC = crt0.s
CODELOC = 0x4100
DATALOC = 0x8000
###CC = "G:/Program Files/SDCC/bin/sdcc"
###AS = "G:/Program Files/SDCC/bin/as-z80"
# Try latest snapshot. (sdcc-snapshot-i586-mingw32msvc-20070915-4913.zip)
CC = "G:/projects/SDCC/snap/sdcc/bin/sdcc"
AS = "G:/projects/SDCC/snap/sdcc/bin/as-z80"
SHELL = sh
REMOVE = rm -f
COPY = cp
# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.s=.o)
# Define all listing files.
LST = $(SRC:.c=.lst) $(ASRC:.s=.lst)
# Default target.
all : $(TARGET).hex
# Link object files.
$(TARGET).hex: $(OBJ)
@echo
@echo "Linking: $@"
$(CC) -mz80 --no-std-crt0 --code-loc $(CODELOC) --data-loc
$(DATALOC) $^ -o $@
# Compile: create object files from C source files.
%.o : %.c
@echo
@echo Compiling: $<
$(CC) -mz80 -c $< -o $@
# Assemble: create object files from assembler source files.
%.o : %.s
@echo
@echo Assembling: $<
$(AS) -ls -o $@ $<
# cheat sheet
# $@ the target of the rule
# $< the first dependency
# $^ all the dependencies
# Clean up project directory.
clean:
@echo
@echo Cleaning project:
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).map
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.asm)
$(REMOVE) $(SRC:.c=.sym)
$(REMOVE) $(ASRC:.s=.sym)
# coz I'm lazy, do "make clean" & "make all", in one step.
clean_all: clean all
# Listing of phony targets.
.PHONY : all clean clean_all
--------------- end of makefile -------------------------------
--------------- start of example.map -------------------------------
Hexadecimal
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
. .ABS. 0000 0000 = 0. bytes (ABS,CON)
Value Global
-------- --------------------------------
0000 l__BSS
0000 l__CABS
0000 l__HEAP
0000 l__HOME
0000 l__OVERLAY
0000 s__HEADER
0001 l__GSFINAL
0002 l__DATA
0004 l__CODE
000C l__GSINIT
4009 l__HEADER
4100 s__CODE
8000 s__DATA
8002 s__GSINIT <<<<---------------- ******* THIS NEEDS TO GO
IN CODE SECTION *******
8002 s__HOME
8002 s__OVERLAY
800E s__GSFINAL
800F s__BSS
800F s__CABS
800F s__HEAP
Hexadecimal
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_CODE 4100 0004 = 4. bytes (REL,CON)
Value Global
-------- --------------------------------
4100 _main
4100 _main_start
4104 _main_end
Hexadecimal
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_DATA 8000 0002 = 2. bytes (REL,CON)
Value Global
-------- --------------------------------
8000 _x
Hexadecimal
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_GSINIT 8002 000C = 12. bytes (REL,CON)
Value Global
-------- --------------------------------
800E gsinit
MODULES
FILE example.o
NAME example
FILE crt0.o
NAME crt0
USERBASEDEF
_CODE = 0x4100
_DATA = 0x8000
------------------------ end of example.map-----------------------------
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user