+ support i8086 far data memory models in InterLockedDecrement and

InterLockedIncrement

git-svn-id: trunk@27402 -
This commit is contained in:
nickysn 2014-03-30 22:49:40 +00:00
parent 14ecc118ec
commit 8eaf8938f4

View File

@ -208,11 +208,16 @@ asm
@@Lgnf_null: @@Lgnf_null:
end; end;
{TODO: fix, use smallint?} {TODO: use smallint?}
function InterLockedDecrement (var Target: longint) : longint;nostackframe;assembler; function InterLockedDecrement (var Target: longint) : longint;nostackframe;assembler;
asm asm
mov si, sp mov si, sp
{$ifdef FPC_X86_DATA_NEAR}
mov bx, ss:[si + 2 + extra_param_offset] // Target mov bx, ss:[si + 2 + extra_param_offset] // Target
{$else FPC_X86_DATA_NEAR}
mov cx, ds
lds bx, ss:[si + 2 + extra_param_offset] // Target
{$endif FPC_X86_DATA_NEAR}
pushf pushf
cli cli
sub word [bx], 1 sub word [bx], 1
@ -220,13 +225,21 @@ asm
mov ax, [bx] mov ax, [bx]
mov dx, [bx+2] mov dx, [bx+2]
popf popf
{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)}
mov ds, cx
{$endif}
end; end;
{TODO: fix, use smallint?} {TODO: use smallint?}
function InterLockedIncrement (var Target: longint) : longint;nostackframe;assembler; function InterLockedIncrement (var Target: longint) : longint;nostackframe;assembler;
asm asm
mov si, sp mov si, sp
{$ifdef FPC_X86_DATA_NEAR}
mov bx, ss:[si + 2 + extra_param_offset] // Target mov bx, ss:[si + 2 + extra_param_offset] // Target
{$else FPC_X86_DATA_NEAR}
mov cx, ds
lds bx, ss:[si + 2 + extra_param_offset] // Target
{$endif FPC_X86_DATA_NEAR}
pushf pushf
cli cli
add word [bx], 1 add word [bx], 1
@ -234,6 +247,9 @@ asm
mov ax, [bx] mov ax, [bx]
mov dx, [bx+2] mov dx, [bx+2]
popf popf
{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)}
mov ds, cx
{$endif}
end; end;
{TODO: fix, use smallint?} {TODO: fix, use smallint?}