Browse Source

* the 'count' parameter of Move and FillChar on i8086 made 16-bit unsigned,
instead of signed (BP7 compatibility)

git-svn-id: trunk@32443 -

nickysn 9 years ago
parent
commit
0f6b5161e6
3 changed files with 15 additions and 14 deletions
  1. 4 6
      rtl/i8086/i8086.inc
  2. 3 3
      rtl/inc/system.inc
  3. 8 5
      rtl/inc/systemh.inc

+ 4 - 6
rtl/i8086/i8086.inc

@@ -20,12 +20,11 @@ procedure fpc_cpuinit;
 
 {$ifndef FPC_SYSTEM_HAS_FILLCHAR}
 {$define FPC_SYSTEM_HAS_FILLCHAR}
-procedure FillChar(var x;count:SizeInt;value:byte);assembler;nostackframe;
+procedure FillChar(var x;count:SizeUInt;value:byte);assembler;nostackframe;
 asm
   mov bx, sp
   mov cx, ss:[bx + 4 + extra_param_offset]  // count
-  or cx, cx
-  jle @@Done
+  jcxz @@Done
 {$ifdef FPC_X86_DATA_NEAR}
   mov di, ss:[bx + 6 + extra_param_offset]  // @x
   mov ax, ds
@@ -112,12 +111,11 @@ end;
 
 {$ifndef FPC_SYSTEM_HAS_MOVE}
 {$define FPC_SYSTEM_HAS_MOVE}
-procedure Move(const source;var dest;count:SizeInt);[public, alias: 'FPC_MOVE'];assembler;nostackframe;
+procedure Move(const source;var dest;count:SizeUInt);[public, alias: 'FPC_MOVE'];assembler;nostackframe;
 asm
   mov bx, sp
   mov cx, ss:[bx + 2 + extra_param_offset]  // count
-  or cx, cx
-  jle @@Done
+  jcxz @@Done
 
   mov ax, ds  // for far data models, backup ds; for near data models, use to initialize es
 {$ifdef FPC_X86_DATA_NEAR}

+ 3 - 3
rtl/inc/system.inc

@@ -272,19 +272,19 @@ function do_isdevice(handle:thandle):boolean;forward;
   {$Error Can't determine processor type !}
 {$endif}
 
-procedure fillchar(var x;count : SizeInt;value : boolean);
+procedure fillchar(var x;count : {$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};value : boolean);
 begin
   fillchar(x,count,byte(value));
 end;
 
 
-procedure fillchar(var x;count : SizeInt;value : char);
+procedure fillchar(var x;count : {$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};value : char);
 begin
   fillchar(x,count,byte(value));
 end;
 
 
-procedure FillByte (var x;count : SizeInt;value : byte );
+procedure FillByte (var x;count : {$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};value : byte );
 begin
   FillChar (X,Count,VALUE);
 end;

+ 8 - 5
rtl/inc/systemh.inc

@@ -153,6 +153,9 @@ Type
     ValReal = Extended;
   {$endif}
 
+  {$define MOVE_HAS_SIZEUINT_COUNT}
+  {$define FILLCHAR_HAS_SIZEUINT_COUNT}
+
   {$if defined(FPC_MM_TINY)}
     {$define FPC_X86_CODE_NEAR}
     {$define FPC_X86_DATA_NEAR}
@@ -774,11 +777,11 @@ function StackTop: Pointer;
   {$endif}
 {$endif}
 
-Procedure Move(const source;var dest;count:SizeInt);
-Procedure FillChar(var x;count:SizeInt;Value:Byte);
-Procedure FillChar(var x;count:SizeInt;Value:Boolean);
-Procedure FillChar(var x;count:SizeInt;Value:Char);
-procedure FillByte(var x;count:SizeInt;value:byte);
+Procedure Move(const source;var dest;count:{$ifdef MOVE_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif});
+Procedure FillChar(var x;count:{$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};Value:Byte);
+Procedure FillChar(var x;count:{$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};Value:Boolean);
+Procedure FillChar(var x;count:{$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};Value:Char);
+procedure FillByte(var x;count:{$ifdef FILLCHAR_HAS_SIZEUINT_COUNT}SizeUInt{$else}SizeInt{$endif};value:byte);
 Procedure FillWord(var x;count:SizeInt;Value:Word);
 procedure FillDWord(var x;count:SizeInt;value:DWord);
 procedure FillQWord(var x;count:SizeInt;value:QWord);