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