Files
failnix/targets/wasm-tacle/parallel/DEBIE/code/arch/arm7-lpc2138-mam/crt_asyst.c

100 lines
2.8 KiB
C

typedef unsigned char byte;
typedef unsigned int uint;
typedef void ( *pfunc )( void );
int main( int argc, char *argv[ ] );
extern byte __ASYST_DATA_LOAD[ ];
extern byte __ASYST_DATA_START[ ];
extern byte __ASYST_DATA_END[ ];
extern byte __ASYST_BSS_START[ ];
extern byte __ASYST_BSS_END[ ];
extern pfunc __ASYST_CTOR_START[ ];
extern pfunc __ASYST_CTOR_END[ ];
extern pfunc __ASYST_DTOR_START[ ];
extern pfunc __ASYST_DTOR_END[ ];
extern byte __ASYST_HEAP_START[ ];
#define __ASYST_IS_ALIGNED(P) ((((uint)(P)) & (~(sizeof(uint) -1))) == ((uint)(P)))
void __asyst_memset_byte( byte *pbyDest, byte byValue, uint uiSize )
{
byte *pbyDestLast = pbyDest + uiSize;
for ( ; pbyDest != pbyDestLast; pbyDest++ )
pbyDest[ 0 ] = byValue;
}
void __asyst_memset_uint( uint *puiDest, uint uiValue, uint uiSize )
{
uint *puiDestLast = puiDest + uiSize;
for ( ; puiDest != puiDestLast; puiDest++ )
puiDest[ 0 ] = uiValue;
}
void __asyst_memset( byte *pbyDest, byte byValue, uint uiSize )
{
if ( __ASYST_IS_ALIGNED( pbyDest ) &&
__ASYST_IS_ALIGNED( uiSize ) ) {
uint uiValue = 0;
__asyst_memset_byte( ( byte * )&uiValue, byValue, sizeof( uint ) );
return __asyst_memset_uint( ( uint * )pbyDest, uiValue,
uiSize / sizeof( uint ) );
} else
return __asyst_memset_byte( pbyDest, byValue, uiSize );
}
void *__asyst_memcpy_uint( uint *puiDest, const uint *puiSrc, uint uiSize )
{
uint *puiDestLast = puiDest + uiSize;
for ( ; puiDest != puiDestLast; puiSrc++, puiDest++ )
puiDest[ 0 ] = puiSrc[ 0 ];
return puiDestLast;
}
void *__asyst_memcpy_byte( byte *pbyDest, const byte *pbySrc, uint uiSize )
{
byte *pbyDestLast = pbyDest + uiSize;
for ( ; pbyDest != pbyDestLast; pbySrc++, pbyDest++ )
pbyDest[ 0 ] = pbySrc[ 0 ];
return pbyDestLast;
}
void *__asyst_memcpy( byte *pbyDest, const byte *pbySrc, uint uiSize )
{
if ( __ASYST_IS_ALIGNED( pbyDest ) &&
__ASYST_IS_ALIGNED( pbySrc ) &&
__ASYST_IS_ALIGNED( uiSize ) )
return __asyst_memcpy_uint( ( uint * )pbyDest, ( uint * )pbySrc,
uiSize / sizeof( uint ) );
else
return __asyst_memcpy_byte( pbyDest, pbySrc, uiSize );
}
void __asyst_main()
{
pfunc *pfTable;
// copy data
if ( __ASYST_DATA_START != __ASYST_DATA_LOAD )
__asyst_memcpy( __ASYST_DATA_START, __ASYST_DATA_LOAD,
__ASYST_DATA_END - __ASYST_DATA_START );
// zero bss
__asyst_memset( __ASYST_BSS_START, 0, __ASYST_BSS_END - __ASYST_BSS_START );
/* Not used in C project
// call constructors
for(pfTable=__ASYST_CTOR_END-1; pfTable!=__ASYST_CTOR_START; pfTable--)
pfTable[ 0 ]();
*/
// main
main( 0, 0 );
/* Not used in C project
// call destructors
//for(pfTable=__ASYST_DTOR_START; pfTable!=__ASYST_DTOR_END; pfTable++)
//pfTable[ 0 ]();
*/
while ( 1 );
}