home *** CD-ROM | disk | FTP | other *** search
- |
- | Initialization code; this is common to both 16 and 32 bit libraries,
- | so be careful!
- |
- .globl __app | short, declared in crtinit.c
- .globl __base | BASEPAGE *, declared in crtinit.c
- .globl __heapbase | void *
- .globl __stksize | long, declared by user or in stksiz.c
-
- |
- | externs to pull ident strings of all used libraries into the
- | executable; if a library is not used, then the extern is
- | satisfied by a dummy in the library
-
- .globl ___Ident_libg
- .globl ___Ident_curses
- .globl ___Ident_widget
- .globl ___Ident_gem
- .globl ___Ident_pml
- .globl ___Ident_gnulib
-
- |
- | Assumption: basepage is passed in a0 for accessories; for programs
- | a0 is always 0.
-
- .text
- .even
- .globl __start
- __start:
-
- |
- | If compiled for base-relative, get address of data segment from
- | basepage and store data+32K in base register. -- hyc
-
- #ifdef __MBASE__
-
- #define Base __MBASE__@(__base)
- #define Heapbase __MBASE__@(__heapbase)
- #define Stksize __MBASE__@(__stksize)
-
- movl a0, a1
- cmpw #0, a1
- jne skip0
- movl sp@(4), a1
- skip0: movl a1@(16), __MBASE__
- subw #32768, __MBASE__ | 32K == -32K, so subtract to add
- #else
-
- #define Base __base
- #define Heapbase __heapbase
- #define Stksize __stksize
-
- #endif
- subl a6, a6 | clear a6 for debuggers
- cmpw #0, a0 | test if acc or program
- beq __startprg | if a program, go elsewhere
- tstl a0@(36) | also test parent basepage pointer
- bne __startprg | for accs, it must be 0
- movel a0, Base | acc basepage is in A0
- lea a0@(252), sp | use the command line as a temporary stack
- jmp __acc_main | function is in crtinit.c
- |
- | program startup code: doesn''t actually do much, other than push
- | the basepage onto the stack and call _start1 in crtinit.c
- |
- __startprg:
- movel sp@(4), a0 | get basepage
- movel a0, Base | save it
- movel a0@(4), d0 | get _base->p_hitpa
- bclr #0, d0 | round off
- movel d0, sp | set stack (temporarily)
- jmp __crtinit | in crtinit.c
-
- |
- | _setstack: changes the stack pointer; called as
- | void setstack( void *newsp )
- | called from crtinit.c once the new stack size has been decided upon
- |
- | WARNING WARNING WARNING: after you do this, local variables may no longer
- | be accessible!
- | destroys a0 and a7
-
- .globl __setstack
- __setstack:
- movel sp@+, a0 | save return address
- movel sp@, sp | new stack pointer
- subql #4, sp | fixup for tidy upon return
- jmp a0@ | back to caller
-
- |
- | interfaces for gprof: for crt0.o, does nothing, but for gcrt0.o branches
- | to the appropriate subroutines
- |
- .globl __monstartup
- .globl __moncontrol
- .globl ___mcleanup
-
- #ifdef GCRT0
- .globl _monstartup
- .globl _moncontrol
- .globl __mcleanup
-
- __monstartup:
- jmp _monstartup
- __moncontrol:
- jmp _moncontrol
- ___mcleanup:
- jmp __mcleanup
- #else
- __monstartup:
- __moncontrol:
- ___mcleanup:
- rts
- #endif /* GCRT0 */
-