100 lines
2.8 KiB
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 );
|
|
}
|