|
@@ -23,15 +23,54 @@ const
|
|
abox_signature: dword = 1; public name '__abox__';
|
|
abox_signature: dword = 1; public name '__abox__';
|
|
|
|
|
|
var
|
|
var
|
|
- ExecBase: Pointer; public name '_ExecBase';
|
|
|
|
|
|
+ MOS_ExecBase: Pointer; public name '_ExecBase';
|
|
realExecBase: Pointer absolute $4;
|
|
realExecBase: Pointer absolute $4;
|
|
|
|
+ StkLen: LongInt; external name '__stklen';
|
|
|
|
+ sysinit_jmpbuf: jmp_buf;
|
|
|
|
+ ExitCode: LongInt;
|
|
|
|
|
|
-function PascalSysInit: longint; external name 'PASCALSYSINIT';
|
|
|
|
|
|
+{ the definitions in there need MOS_Execbase }
|
|
|
|
+{$include execd.inc}
|
|
|
|
+{$include execf.inc}
|
|
|
|
|
|
-function _FPC_proc_start: longint; public name '_start';
|
|
|
|
|
|
+procedure PascalMainEntry; cdecl; forward;
|
|
|
|
+
|
|
|
|
+{ this function must be the first in this unit which contains code }
|
|
|
|
+function _FPC_proc_start: longint; cdecl; public name '_start';
|
|
|
|
+var
|
|
|
|
+ sst: TStackSwapStruct;
|
|
|
|
+ newStack: Pointer;
|
|
|
|
+ newStackAligned: Pointer;
|
|
begin
|
|
begin
|
|
- ExecBase:=realExecBase;
|
|
|
|
- _FPC_proc_start:=PascalSysInit;
|
|
|
|
|
|
+ MOS_ExecBase:=realExecBase;
|
|
|
|
+
|
|
|
|
+ newStack:=AllocVecTaskPooled(StkLen+16);
|
|
|
|
+ newStackAligned:=align(newStack,16);
|
|
|
|
+
|
|
|
|
+ sst.stk_Lower:=newStackAligned;
|
|
|
|
+ sst.stk_Upper:=newStackAligned+StkLen;
|
|
|
|
+ sst.stk_Pointer:=newStackAligned+StkLen;
|
|
|
|
+
|
|
|
|
+ NewPPCStackSwap(@sst,@PascalMainEntry,nil);
|
|
|
|
+
|
|
|
|
+ FreeVecTaskPooled(newStack);
|
|
|
|
+ _FPC_proc_start:=ExitCode;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure _FPC_proc_halt(_ExitCode: longint); cdecl; public name '_haltproc';
|
|
|
|
+begin
|
|
|
|
+ ExitCode:=_ExitCode;
|
|
|
|
+ longjmp(sysinit_jmpbuf,1);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure PascalMain; external name 'PASCALMAIN';
|
|
|
|
+
|
|
|
|
+procedure PascalMainEntry; cdecl;
|
|
|
|
+begin
|
|
|
|
+ if setjmp(sysinit_jmpbuf) = 0 then
|
|
|
|
+ PascalMain;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
end.
|
|
end.
|