newlib/libgloss/cr16/crt1.S

99 lines
4.0 KiB
ArmAsm

##############################################################################
# crt0.s -- CR16 default start-up routine #
# #
# Copyright (c) 2004 National Semiconductor Corporation #
# #
# The authors hereby grant permission to use, copy, modify, distribute, #
# and license this software and its documentation for any purpose, provided #
# that existing copyright notices are retained in all copies and that this #
# notice is included verbatim in any distributions. No written agreement, #
# license, or royalty fee is required for any of the authorized uses. #
# Modifications to this software may be copyrighted by their authors #
# and need not follow the licensing terms described here, provided that #
# the new terms are clearly indicated on the first page of each file where #
# they apply. #
# #
# This is the start routine of your CR16 program. #
# It is linked with your application automatically. You can use #
# this routine as a template and modify it to your needs, yet this #
# file must be supplied for the compiler. #
# It is assumed that the following symbols are defined in your linker #
# script: __STACK_START, __ISTACK_START #
##############################################################################
.text
#ifdef __CR16CP__
.align 4
#else
.align 2
#endif
.global _main
.global _atexit
.global _exit
.global _start
.global __fini
.global __init
.global __STACK_START
.global __ISTACK_START
_start:
#----------------------------------------------------------------------------#
# Initialize the stack pointers. The constants __STACK_START and #
# __ISTACK_START should be defined in the linker script. #
movd $__STACK_START, (sp)
movd $__ISTACK_START, (r1,r0)
lprd (r1,r0), isp
#----------------------------------------------------------------------------#
# Initialize the default sections according to the linker script. #
# bal (ra), __init_bss_data
#----------------------------------------------------------------------#
# Set the Extended Dispatch bit in the CFG register. This is the #
# default configuration for CR16C. #
spr cfg, r0 # Set dispatch table width
orw $0x100, r0
lpr r0, cfg
#----------------------------------------------------------------------------#
#----------------------------------------------------------------------------#
# Handle global and static constructurs execution and setup #
# destructors to be called from exit. #
bal (ra),__init
movd $__fini@c, (r3,r2)
bal (ra), _atexit
#----------------------------------------------------------------------------#
# Jump to the main function in your application. #
#ifdef __INT32__
movd $0, (r3,r2) # Number of arguments
movd $0, (r5,r4) # conatins pointer to argument string.
#else
movw $0, r2 # Number of arguments
movd $0, (r4,r3) # conatins pointer to argument string.
#endif
bal (ra), _main
#----------------------------------------------------------------------------#
# Upon returning from the main function (if it isn't an infinite loop), #
# jump to the exit function. The exit function is located in the #
# library 'libc.a'. #
#ifdef __INT32__
movd (r1,r0), (r3,r2) # _main return value gets forwarded.
#else
movw r0, r2 # _main return value gets forwarded.
#endif
br _exit # returns control to the functional simulator.