| ############################################################################## |
| # 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. |
| |
| |