Przeglądaj źródła

sinclairql: changed startup code to be able to run directly as job without a BASIC loader. based on a patch by Marcel Kilgus in qlforum.co.uk

git-svn-id: trunk@47570 -
Károly Balogh 4 lat temu
rodzic
commit
2294472ac7
1 zmienionych plików z 20 dodań i 38 usunięć
  1. 20 38
      rtl/sinclairql/si_prc.pp

+ 20 - 38
rtl/sinclairql/si_prc.pp

@@ -22,29 +22,25 @@ implementation
 {$i qdosfuncs.inc}
 
 var
-  stacktop: pointer;
-  setjmpbuf: jmp_buf;
-  stklen: longint; external name '__stklen';
   binstart: byte; external name '_stext';
   binend: byte; external name '_etext';
   bssstart: byte; external name '_sbss';
   bssend: byte; external name '_ebss';
 
-{ this is const, so it will go into the .data section, not .bss }
-const
-  stackorig: pointer = nil;
-
 procedure PascalMain; external name 'PASCALMAIN';
+procedure PascalStart; forward;
 
 { this function must be the first in this unit which contains code }
 {$OPTIMIZATION OFF}
-function _FPC_proc_start: longint; cdecl; public name '_start';
-var
-  newstack: pointer;
-begin
-  _FPC_proc_start:=0;
-  asm
-    move.l d7,-(sp)
+function _FPC_proc_start: longint; cdecl; assembler; nostackframe; public name '_start';
+asm
+    bra   @start
+    dc.l  $0
+    dc.w  $4afb
+    dc.w  3
+    dc.l  $46504300   { Job name, just FPC for now }
+
+@start:
     { relocation code }
 
     { get our actual position in RAM }
@@ -80,36 +76,22 @@ begin
     bne @relocloop
 
 @noreloc:
-    move.l (sp)+,d7
+    jsr PascalStart
+end;
 
-    { save the original stack pointer }
-    move.l a7,stackorig
-  end;
+procedure _FPC_proc_halt(_ExitCode: longint); public name '_haltproc';
+begin
+  mt_frjob(-1, _ExitCode);
+end;
 
+procedure PascalStart;
+begin
   { initialize .bss }
   FillChar(bssstart,PtrUInt(@bssend)-PtrUInt(@bssstart),#0);
 
-  newstack:=mt_alchp(stklen,nil,-1);
-  if not assigned(newstack) then
-    _FPC_proc_start:=ERR_OM
-  else
-    begin
-      stacktop:=pbyte(newstack)+stklen;
-      asm
-        move.l stacktop,sp
-      end;
-      if setjmp(setjmpbuf) = 0 then
-        PascalMain;
-      asm
-        move.l stackorig,sp
-      end;
-      mt_rechp(newstack);
-   end;
-end;
+  PascalMain;
 
-procedure _FPC_proc_halt(_ExitCode: longint); public name '_haltproc';
-begin
-  longjmp(setjmpbuf,1); 
+  Halt; { this should never be reached }
 end;