Browse Source

+ implemented FPC_SETJMP for the i8086

git-svn-id: branches/i8086@24002 -
nickysn 12 years ago
parent
commit
5ea6f37247
3 changed files with 18 additions and 3 deletions
  1. 14 1
      rtl/i8086/setjump.inc
  2. 3 1
      rtl/i8086/setjumph.inc
  3. 1 1
      rtl/inc/compproc.inc

+ 14 - 1
rtl/i8086/setjump.inc

@@ -13,8 +13,21 @@
 
  **********************************************************************}
 
-Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP']; compilerproc;
+Function fpc_SetJmp (Var S : Jmp_buf) : smallint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP']; compilerproc;
 asm
+  xchg ax, bx
+  mov word [bx + Jmp_buf.bx], ax
+  mov word [bx + Jmp_buf.si], si
+  mov word [bx + Jmp_buf.di], di
+  mov word [bx + Jmp_buf.bp], bp
+  mov di, sp
+  add di, 2
+  mov word [bx + Jmp_buf.sp], di
+  mov di, word [di - 2]
+  mov word [bx + Jmp_buf.pc], di
+  mov di, word [bx + Jmp_buf.di]
+  mov bx, ax
+  xor ax, ax
 end;
 
 

+ 3 - 1
rtl/i8086/setjumph.inc

@@ -15,8 +15,10 @@
 
 Type
   jmp_buf = packed record
+    bx,si,di: Word;
+    bp,sp,pc: Pointer;
   end;
   PJmp_buf = ^jmp_buf;
 
-Function Setjmp (Var S : Jmp_buf) : longint; [external name 'FPC_SETJMP'];
+Function Setjmp (Var S : Jmp_buf) : smallint; [external name 'FPC_SETJMP'];
 Procedure longjmp (Var S : Jmp_buf; value : longint); [external name 'FPC_LONGJMP'];

+ 1 - 1
rtl/inc/compproc.inc

@@ -640,5 +640,5 @@ function fpc_qword_to_double(q: qword): double; compilerproc;
 function fpc_longword_to_double(i: longword): double; compilerproc;
 {$endif FPC_INCLUDE_SOFTWARE_LONGWORD_TO_DOUBLE}
 
-function fpc_setjmp(var s : jmp_buf) : longint; compilerproc;
+function fpc_setjmp(var s : jmp_buf) : {$ifdef CPU16}smallint{$else}longint{$endif}; compilerproc;
 procedure fpc_longjmp(var s : jmp_buf; value : longint); compilerproc;