99 lines
4.0 KiB
ArmAsm
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.
|
|
|
|
|