123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- |
- | This file is part of the Free Pascal run time library.
- | Copyright (c) 2005-2014 by Karoly Balogh
- |
- | Startup code for Amiga/m68k RTL
- |
- | See the file COPYING.FPC, included in this distribution,
- | for details about the copyright.
- |
- | This program is distributed in the hope that it will be useful,
- | but WITHOUT ANY WARRANTY; without even the implied warranty of
- | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- |
- .text
- .align 4
- | This symbol is required for lineinfo support!
- .globl __EXESTART
- __EXESTART:
- .globl _start
- .globl start
- _start:
- start:
- movem.l d0-d7/a0-a6,-(sp)
- | Get ExecBase
- move.l 0x4,a6
- move.l a6,_ExecBase
- | Get current stacksize
- move #0,a1 | nil
- jsr -294(a6) | FindTask()
- move.l d0,a0
- move.l 62(a0),d1 | SPUpper
- sub.l 58(a0),d1 | SPLower
- | Check if we need a new stack
- | Only allocate a new stack if the system-provided
- | stack is smaller than the one set compile time
- move.l __stklen,d0 | Also an argument for AllocVec() below
- cmp.l d0,d1
- blt _allocStack
- move.l d1,__stklen | Store the new stack size
- moveq.l #0,d0
- move.l d0,stackArea | Clear the stackArea pointer for exit test
- move.l sp,stackPtr | Store the stackPointer for restoration
- bra _noAllocStack
- _allocStack:
- | Allocating new stack
- moveq.l #0,d1 | MEMF_ANY
- jsr -684(a6) | AllocVec()
- tst.l d0
- beq __exit
- move.l d0,stackArea
- | Setting up StackSwap structure, and do the StackSwap
- lea stackSwap,a0
- move.l d0,(a0) | Bottom of the stack
- add.l __stklen,d0
- move.l d0,4(a0) | Top of the stack
- move.l d0,8(a0) | Initial stackpointer
- jsr -732(a6) | StackSwap()
- _noAllocStack:
- jsr PASCALMAIN
- .globl _haltproc
- _haltproc:
- | Check if we need to release a stack
- tst.l stackArea
- bne _freeStack
- move.l stackPtr,sp
- bra __exit
- _freeStack:
- | Swapping the stack back
- move.l _ExecBase,a6
- lea stackSwap,a0
- jsr -732(a6) | StackSwap()
- | Freeing up stack area
- move.l stackArea,a1
- jsr -690(a6) | FreeVec()
- __exit:
- movem.l (sp)+,d0-d7/a0-a6
- move.l operatingsystem_result,d0
- rts
- .bss
- .globl _ExecBase
- .globl SysBase
- .balign 4
- SysBase:
- _ExecBase:
- .skip 4
- .globl stackArea
- .balign 4
- stackArea:
- .skip 4
- .globl stackPtr
- .balign 4
- stackPtr:
- .skip 4
- .globl stackSwap
- .balign 4
- stackSwap:
- .skip 12
|