59 lines
844 B
C
59 lines
844 B
C
|
extern char _start_bss;
|
||
|
extern char _end_bss;
|
||
|
extern int main(int argc, char **argv, char **environ);
|
||
|
void __main();
|
||
|
|
||
|
static void
|
||
|
enter()
|
||
|
{
|
||
|
#if defined(__Z8002__)
|
||
|
__main();
|
||
|
#endif
|
||
|
exit(main(0,0,0));
|
||
|
}
|
||
|
start()
|
||
|
{
|
||
|
char *p;
|
||
|
#if defined(__Z8002__)
|
||
|
asm("ld r15,#__stack_top");
|
||
|
asm("ld r10,r15");
|
||
|
#endif
|
||
|
#if defined(__Z8001__)
|
||
|
asm("ldl rr14,#__stack_top");
|
||
|
asm("ldl rr10,rr14");
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/* zero bss */
|
||
|
p = &_start_bss;
|
||
|
while (p < & _end_bss)
|
||
|
{
|
||
|
*p++ = 0;
|
||
|
}
|
||
|
enter();
|
||
|
}
|
||
|
|
||
|
#if defined(__Z8002__)
|
||
|
void __do_global_ctors ()
|
||
|
{
|
||
|
typedef void (*pfunc)();
|
||
|
extern pfunc __ctors[];
|
||
|
extern pfunc __ctors_end[];
|
||
|
pfunc *p;
|
||
|
for (p = __ctors_end; p > __ctors; )
|
||
|
{
|
||
|
(*--p)();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void __main()
|
||
|
{
|
||
|
static int initialized;
|
||
|
if (! initialized)
|
||
|
{
|
||
|
initialized = 1;
|
||
|
__do_global_ctors ();
|
||
|
}
|
||
|
}
|
||
|
#endif
|