From 5ea6f372471ddec67685c3d3544d29dfe1a665ea Mon Sep 17 00:00:00 2001 From: nickysn Date: Mon, 25 Mar 2013 18:12:48 +0000 Subject: [PATCH] + implemented FPC_SETJMP for the i8086 git-svn-id: branches/i8086@24002 - --- rtl/i8086/setjump.inc | 15 ++++++++++++++- rtl/i8086/setjumph.inc | 4 +++- rtl/inc/compproc.inc | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/rtl/i8086/setjump.inc b/rtl/i8086/setjump.inc index 1e154d35da..7978f23b43 100644 --- a/rtl/i8086/setjump.inc +++ b/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; diff --git a/rtl/i8086/setjumph.inc b/rtl/i8086/setjumph.inc index 2aed1f58a5..181dac2dd4 100644 --- a/rtl/i8086/setjumph.inc +++ b/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']; diff --git a/rtl/inc/compproc.inc b/rtl/inc/compproc.inc index 14d3e0771c..5a1d305c86 100644 --- a/rtl/inc/compproc.inc +++ b/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;