fpc/rtl/netware/nwpre.as
fpc 50778076c3 initial import
git-svn-id: trunk@1 -
2005-05-16 18:37:41 +00:00

143 lines
3.2 KiB
ActionScript

#
# $Id: nwpre.as,v 1.3 2003/03/25 18:17:54 armin Exp $
# This file is part of the Free Pascal run time library.
# Copyright (c) 1999-2002 by the Free Pascal development team
# Copyright (c) 2002 Armin Diehl
#
# This is the (nwpre-like) startup code for netware
#
# 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.
#
#**********************************************************************
.file "nwpre.as"
.text
#
# This is the main program (not loader) Entry-Point that will be called by netware
# it sets up the argc and argv and calls _nlm_main (in system.pp)
#
_pasStart_:
pushl $_nlm_main
call _SetupArgV_411
addl $4,%esp
ret
# this is a hack to avoid that FPC_NW_CHECKFUNCTION will be
# eleminated by the linker (with smartlinking)
call FPC_NW_CHECKFUNCTION
#
# this will be called by the loader, we pass the address of _pasStart_ and
# _kNLMInfo (needed by clib) and netware is doing the work
#
.globl _Prelude
_Prelude:
pushl %ebp
movl %esp,%ebp
pushl %edi
pushl %esi
pushl %ebx
movl 0x14(%ebp),%edi
movl 0x18(%ebp),%esi
movl %esi, __uninitializedDataSize
movl 0x1c(%ebp),%ebx
movl 0x20(%ebp),%ecx
movl 0x28(%ebp),%eax
pushl $_pasStart_
pushl $_kNLMInfo
pushl %eax
movl 0x24(%ebp),%edx # 1b7f6
pushl %edx
pushl %ecx
pushl %ebx
pushl %esi # uninitialized data size
pushl %edi
movl 0x10(%ebp),%edx
pushl %edx
movl 0xc(%ebp),%edx
pushl %edx
movl 0x8(%ebp),%edx
pushl %edx
call _StartNLM
test %eax,%eax
jne x1
xorl %eax,%eax # dont know why this is needed ?
x1:
lea 0xfffffff4(%ebp),%esp
popl %ebx
popl %esi
popl %edi
movl %ebp,%esp
popl %ebp
ret
#
# the global stop-function
#
.globl _Stop
_Stop:
pushl $0x5 # TERMINATE_BY_UNLOAD=0, TERMINATE_BY_EXTERNAL_THREAD=0
pushl $0x0
movl _kNLMInfo,%edx
pushl %edx
call _TerminateNLM
addl $0x0c,%esp
ret
.data
# argc is defined in the novell nwpre, i assume it is not needed
#_argc:
# .long 0
# structure needed by clib
# kNLMInfoT =
# PACKED RECORD
# Signature : ARRAY [0..3] OF CHAR; // LONG 'NLMI'
# Flavor : LONGINT; // TRADINIONAL_FLAVOR = 0
# Version : LONGINT; // TRADINIONAL_VERSION = 0, LIBERTY_VERSION = 1
# LongDoubleSize : LONGINT; // gcc nwpre defines 12, watcom 8
# wchar_tSize : LONGINT;
# END;
.globl _kNLMInfo # will be used as data start
_kNLMInfo:
.ascii "NLMI"
.long 0,1,8,2
.text
.globl __getTextStart
__getTextStart:
movl $.text,%eax
ret
.text
.globl __getDataStart
__getDataStart:
movl $.data,%eax
ret
.text
.globl __getBssStart
__getBssStart:
movl $.bss,%eax
ret
.data
__uninitializedDataSize: .long
.text
.globl __getUninitializedDataSize
__getUninitializedDataSize:
movl __uninitializedDataSize, %eax
ret