Browse Source

+ Implemented nwpre and prelude in assembler, now working like the original nwpre

armin 23 years ago
parent
commit
071ee9bfd8
4 changed files with 238 additions and 19 deletions
  1. 12 8
      rtl/netware/Makefile
  2. 18 11
      rtl/netware/compile.cmd
  3. 109 0
      rtl/netware/nwpre.as
  4. 99 0
      rtl/netware/prelude.as

+ 12 - 8
rtl/netware/Makefile

@@ -4,16 +4,17 @@
 UNITDIR = $(INSTALL_PREFIX)/usr/lib/fpc/1.1/units/netware/rtl
 #PPC386OPT = -n -dMT -dDEBUG_MT -di386 -dSYSTEMDEBUG -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
 #PPC386OPT = -n -di386 -dSYSTEMDEBUG -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
-PPC386OPT = -n -di386 -O3 -Sg -Tnetware -Aelf -a -al -FE.
+PPC386OPT = -n -di386 -O3 -Og -Sg -Tnetware -Aelf -a -al -FE.
 PPC386OPTDBG = -n -di386 -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
 INCLUDES = -I../inc -I../i386 -I../objpas
 
 SYSUNIT=system
 NWPRE=nwpre
+PRELUDE=prelude
 OBJEXT=on
 PPUEXT=ppn
 ASMEXT=s
-OBJS = $(SYSUNIT).$(OBJEXT) $(NWPRE).$(OBJEXT) ../inc/os_types.$(OBJEXT) ../inc/strings.$(OBJEXT) dos.$(OBJEXT) ../objpas/objpas.$(OBJEXT) sysutils.$(OBJEXT) crt.$(OBJEXT) sockets.$(OBJEXT) mouse.$(OBJEXT) netware.$(OBJEXT) video.$(OBJEXT) keyboard.$(OBJEXT) ../objpas/math.$(OBJEXT) ../objpas/typinfo.$(OBJEXT) ../inc/objects.$(OBJEXT) ../inc/getopts.$(OBJEXT) ../inc/heaptrc.$(OBJEXT) varutils.$(OBJEXT) ../i386/cpu.$(OBJEXT) ../i386/mmx.$(OBJEXT) winsock2.$(OBJEXT)
+OBJS = $(SYSUNIT).$(OBJEXT) $(NWPRE).$(OBJEXT) $(PRELUDE).$(OBJEXT) ../inc/os_types.$(OBJEXT) ../inc/strings.$(OBJEXT) dos.$(OBJEXT) ../objpas/objpas.$(OBJEXT) sysutils.$(OBJEXT) crt.$(OBJEXT) sockets.$(OBJEXT) mouse.$(OBJEXT) netware.$(OBJEXT) video.$(OBJEXT) keyboard.$(OBJEXT) ../objpas/math.$(OBJEXT) ../objpas/typinfo.$(OBJEXT) ../inc/objects.$(OBJEXT) ../inc/getopts.$(OBJEXT) ../inc/heaptrc.$(OBJEXT) varutils.$(OBJEXT) ../i386/cpu.$(OBJEXT) ../i386/mmx.$(OBJEXT) winsock2.$(OBJEXT)
 
 
 all:	$(OBJS)
@@ -21,22 +22,25 @@ all:	$(OBJS)
 $(SYSUNIT).$(OBJEXT):	$(SYSUNIT).pp nwsys.inc
 	ppc386 -Us $(PPC386OPT) $(INCLUDES) $(SYSUNIT).pp
 
-$(NWPRE).$(OBJEXT):	$(NWPRE).pp
-	ppc386 $(PPC386OPTDBG) $(INCLUDES) $(NWPRE).pp
+$(NWPRE).$(OBJEXT):	$(NWPRE).as
+	as $(NWPRE).as -o $(NWPRE).$(OBJEXT)
+
+$(PRELUDE).$(OBJEXT):	$(NWPRE).as
+	as $(PRELUDE).as -o $(PRELUDE).$(OBJEXT)
 
 %.$(OBJEXT):	%.pp nwsys.inc
 	ppc386 $(PPC386OPT) $(INCLUDES) $*.pp
 
 install: $(OBJS)
-
+	rm -f $(UNITDIR)/*
 	cp -f $(SYSUNIT).$(OBJEXT) $(UNITDIR)
 	cp -f $(SYSUNIT).$(PPUEXT) $(UNITDIR)
 	cp -f dos.$(OBJEXT) $(UNITDIR)
 	cp -f dos.$(PPUEXT) $(UNITDIR)
 	cp -f strings.$(OBJEXT) $(UNITDIR)
 	cp -f strings.$(PPUEXT) $(UNITDIR)
-	cp -f nwpre.$(OBJEXT) $(UNITDIR)
-	cp -f nwpre.$(PPUEXT) $(UNITDIR)
+	cp -f $(NWPRE).$(OBJEXT) $(UNITDIR)
+	cp -f $(PRELUDE).$(OBJEXT) $(UNITDIR)
 	cp -f sysutils.$(OBJEXT) $(UNITDIR)
 	cp -f sysutils.$(PPUEXT) $(UNITDIR)
 	cp -f objpas.$(OBJEXT) $(UNITDIR)
@@ -75,7 +79,7 @@ install: $(OBJS)
 	cp -f nwimp/*.imp $(UNITDIR)
 
 clean:
-	rm -f *.$(OBJEXT) *.$(PPUEXT) *.$(ASMEXT) *.bak
+	rm -f *.$(OBJEXT) *.$(PPUEXT) *.$(ASMEXT) *.bak *.rst *.a
 
 dist:
 	clean

+ 18 - 11
rtl/netware/compile.cmd

@@ -5,9 +5,12 @@ REM
 SET DEST=\compiler\fpc\units\netware
 
 REM Compile and install system unit first
+SET INC=-I../inc -I../i386 -I../objpas ../inc/strings.pp
+SET OPT=-di386 -XX -O3 -Sg -Tnetware
+
 del /Q *.ppn
 del /Q *.on
-ppc386 -di386 -XX -dSYSTEMDEBUG -O3 -Sg -Tnetware -FE. -I../inc -I../i386 -I../objpas ../inc/strings.pp
+ppc386 %OPT% -dSYSTEMDEBUG  -FE. %INC%
 copy *.ppn %DEST%
 copy *.on %DEST%
 
@@ -15,16 +18,20 @@ REM copy the import files
 copy nwimp\*.imp %DEST%
 
 REM and build other stuff
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. nwpre.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 dos.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 crt.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 -I../objpas ../objpas/objpas.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 -I../objpas sysutils.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 keyboard.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 mouse.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 video.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 sockets.pp
-ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. -I../inc -I../i386 netware.pp
+#ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. nwpre.pp
+asw nwpre.as -o nwpre.on
+asw prelude.as -o prelude.on
+
+ppc386 %OPT% %INC% dos.pp
+ppc386 %OPT% %INC% crt.pp
+ppc386 %OPT% %INC% ../objpas/objpas.pp
+ppc386 %OPT% %INC% sysutils.pp
+ppc386 %OPT% %INC% keyboard.pp
+ppc386 %OPT% %INC% mouse.pp
+ppc386 %OPT% %INC% video.pp
+ppc386 %OPT% %INC% sockets.pp
+ppc386 %OPT% %INC% netware.pp
+ppc386 %OPT% %INC% winsock2.pp
 
 copy *.on %DEST%
 copy *.ppn %DEST%

+ 109 - 0
rtl/netware/nwpre.as

@@ -0,0 +1,109 @@
+#
+#    $Id$
+#    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 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	0x1c(%ebp),%ebx
+     	movl	0x20(%ebp),%ecx
+     	movl	0x28(%ebp),%eax
+   	pushl	$_pasStart_
+   	pushl	$_kNLMInfo
+   	pushl	%eax
+     	movl	0x24(%ebp),%edx
+   	pushl	%edx
+       	pushl	%ecx
+   	pushl	%ebx
+       	pushl	%esi
+       	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;
+
+_kNLMInfo:
+	.ascii	"NLMI"
+	.long	0,1,8,2
+

+ 99 - 0
rtl/netware/prelude.as

@@ -0,0 +1,99 @@
+#
+#    $Id$
+#    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 (prelude-like) startup code for netware before 4.11
+#	    
+#    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)
+# This version uses the old _SetupArgv and not the newer _SetupArvV_411
+#
+_pasStart_:
+    pushl	$_nlm_main
+    call	_SetupArgv
+    addl	$4,%esp
+    ret
+
+
+#
+# this will be called by the loader, we pass the address of _pasStart_ and
+# _NLMID (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	0x1c(%ebp),%ebx
+     	movl	0x20(%ebp),%ecx
+     	movl	0x28(%ebp),%eax
+   	pushl	$_pasStart_
+   	pushl	$_NLMID
+   	pushl	%eax
+     	movl	0x24(%ebp),%edx
+   	pushl	%edx
+       	pushl	%ecx
+   	pushl	%ebx
+       	pushl	%esi
+       	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	_NLMID,%edx
+       	pushl	%edx
+       	call	_TerminateNLM
+    	addl	$0x0c,%esp
+       	ret
+
+
+.data
+# argc is defined in the novell prelude, i assume it is not needed
+#_argc:
+#	.long	0
+
+_NLMID:
+	.long	0
+