mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 08:19:36 +01:00 
			
		
		
		
	* patches from wiktor
This commit is contained in:
		
							parent
							
								
									2d7ecc1273
								
							
						
					
					
						commit
						d715c6195f
					
				@ -527,29 +527,78 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function strcopy(dest,source : pchar) : pchar;assembler;
 | 
			
		||||
var
 | 
			
		||||
  saveeax,saveesi,saveedi : longint;
 | 
			
		||||
asm
 | 
			
		||||
        pushl %esi
 | 
			
		||||
        pushl %edi
 | 
			
		||||
        cld
 | 
			
		||||
        movl 12(%ebp),%edi
 | 
			
		||||
        movl $0xffffffff,%ecx
 | 
			
		||||
        xorb %al,%al
 | 
			
		||||
        repne
 | 
			
		||||
        scasb
 | 
			
		||||
        not %ecx
 | 
			
		||||
        movl 8(%ebp),%edi
 | 
			
		||||
        movl 12(%ebp),%esi
 | 
			
		||||
        movl %ecx,%eax
 | 
			
		||||
        shrl $2,%ecx
 | 
			
		||||
        rep
 | 
			
		||||
        movsl
 | 
			
		||||
        movl %eax,%ecx
 | 
			
		||||
        andl $3,%ecx
 | 
			
		||||
        rep
 | 
			
		||||
        movsb
 | 
			
		||||
        movl 8(%ebp),%eax
 | 
			
		||||
        popl %edi
 | 
			
		||||
        popl %esi
 | 
			
		||||
        movl    %edi,saveedi
 | 
			
		||||
        movl    %esi,saveesi
 | 
			
		||||
{$ifdef REGCALL}
 | 
			
		||||
        movl    %eax,saveeax
 | 
			
		||||
        movl    %edx,%edi
 | 
			
		||||
{$else}
 | 
			
		||||
        movl    source,%edi
 | 
			
		||||
{$endif}
 | 
			
		||||
        testl   %edi,%edi
 | 
			
		||||
        jz      .LStrCopyDone
 | 
			
		||||
        leal    3(%edi),%ecx
 | 
			
		||||
        andl    $-4,%ecx
 | 
			
		||||
        movl    %edi,%esi
 | 
			
		||||
        subl    %edi,%ecx
 | 
			
		||||
{$ifdef REGCALL}
 | 
			
		||||
        movl    %eax,%edi
 | 
			
		||||
{$else}
 | 
			
		||||
        movl    dest,%edi
 | 
			
		||||
{$endif}
 | 
			
		||||
        jz      .LStrCopyAligned
 | 
			
		||||
.LStrCopyAlignLoop:
 | 
			
		||||
        movb    (%esi),%al
 | 
			
		||||
        incl    %edi
 | 
			
		||||
        incl    %esi
 | 
			
		||||
        testb   %al,%al
 | 
			
		||||
        movb    %al,-1(%edi)
 | 
			
		||||
        jz      .LStrCopyDone
 | 
			
		||||
        decl    %ecx
 | 
			
		||||
        jnz     .LStrCopyAlignLoop
 | 
			
		||||
        .balign  16
 | 
			
		||||
.LStrCopyAligned:
 | 
			
		||||
        movl    (%esi),%eax
 | 
			
		||||
        movl    %eax,%edx
 | 
			
		||||
        leal    0x0fefefeff(%eax),%ecx
 | 
			
		||||
        notl    %edx
 | 
			
		||||
        addl    $4,%esi
 | 
			
		||||
        andl    %edx,%ecx
 | 
			
		||||
        andl    $0x080808080,%ecx
 | 
			
		||||
        jnz     .LStrCopyEndFound
 | 
			
		||||
        movl    %eax,(%edi)
 | 
			
		||||
        addl    $4,%edi
 | 
			
		||||
        jmp     .LStrCopyAligned
 | 
			
		||||
.LStrCopyEndFound:
 | 
			
		||||
        testl   $0x0ff,%eax
 | 
			
		||||
        jz      .LStrCopyByte
 | 
			
		||||
        testl   $0x0ff00,%eax
 | 
			
		||||
        jz      .LStrCopyWord
 | 
			
		||||
        testl   $0x0ff0000,%eax
 | 
			
		||||
        jz      .LStrCopy3Bytes
 | 
			
		||||
        movl    %eax,(%edi)
 | 
			
		||||
        jmp     .LStrCopyDone
 | 
			
		||||
.LStrCopy3Bytes:
 | 
			
		||||
        xorb     %dl,%dl
 | 
			
		||||
        movw     %ax,(%edi)
 | 
			
		||||
        movb     %dl,2(%edi)
 | 
			
		||||
        jmp     .LStrCopyDone
 | 
			
		||||
.LStrCopyWord:
 | 
			
		||||
        movw    %ax,(%edi)
 | 
			
		||||
        jmp     .LStrCopyDone
 | 
			
		||||
.LStrCopyByte:
 | 
			
		||||
        movb    %al,(%edi)
 | 
			
		||||
.LStrCopyDone:
 | 
			
		||||
{$ifdef REGCALL}
 | 
			
		||||
        movl    saveeax,%eax
 | 
			
		||||
{$else}
 | 
			
		||||
        movl    dest,%eax
 | 
			
		||||
{$endif}
 | 
			
		||||
        movl    saveedi,%edi
 | 
			
		||||
        movl    saveesi,%esi
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1442,7 +1491,10 @@ END.
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.8  2003-11-17 19:55:13  hajny
 | 
			
		||||
  Revision 1.9  2003-12-15 15:57:48  peter
 | 
			
		||||
    * patches from wiktor
 | 
			
		||||
 | 
			
		||||
  Revision 1.8  2003/11/17 19:55:13  hajny
 | 
			
		||||
    * Wiktor Sywula: LFN detection uncommented in system, new units added
 | 
			
		||||
 | 
			
		||||
  Revision 1.7  2003/10/18 09:31:59  hajny
 | 
			
		||||
 | 
			
		||||
@ -68,9 +68,9 @@ begin
 | 
			
		||||
  StrDispose(P);
 | 
			
		||||
end ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{  Native OpenFile function.
 | 
			
		||||
   if return value <> 0 call failed.  }
 | 
			
		||||
 | 
			
		||||
function OpenFile(const FileName: string; var Handle: longint; Mode, Action: word): longint;
 | 
			
		||||
var
 | 
			
		||||
   Regs: registers;
 | 
			
		||||
@ -78,17 +78,34 @@ begin
 | 
			
		||||
  result := 0;
 | 
			
		||||
  Handle := 0;
 | 
			
		||||
  StringToTB(FileName);
 | 
			
		||||
  if LFNSupport then Regs.Eax:=$716c
 | 
			
		||||
  else Regs.Eax:=$6c00;
 | 
			
		||||
  Regs.Edx := Action;                   { Action if file exists/not exists }
 | 
			
		||||
  Regs.Ds := tb_segment;
 | 
			
		||||
  Regs.Esi := tb_offset;
 | 
			
		||||
  Regs.Ebx := $2000 + (Mode and $ff);   { file open mode }
 | 
			
		||||
  Regs.Ecx := $20;                      { Attributes }
 | 
			
		||||
  if LFNSupport then
 | 
			
		||||
    Regs.Eax := $716c                       { Use LFN Open/Create API }
 | 
			
		||||
  else  { Check if Extended Open/Create API is safe to use }
 | 
			
		||||
    if lo(dosversion) < 7 then
 | 
			
		||||
      Regs.Eax := $3d00 + (Mode and $ff)    { For now, map to Open API }
 | 
			
		||||
    else
 | 
			
		||||
      Regs.Eax := $6c00;                    { Use Extended Open/Create API }
 | 
			
		||||
  if Regs.Ah = $3d then
 | 
			
		||||
    begin
 | 
			
		||||
      if (Action and $00f0) <> 0 then
 | 
			
		||||
        Regs.Eax := $3c00;                  { Map to Create/Replace API }
 | 
			
		||||
      Regs.Ds := tb_segment;
 | 
			
		||||
      Regs.Edx := tb_offset;
 | 
			
		||||
    end
 | 
			
		||||
  else  { LFN or Extended Open/Create API }
 | 
			
		||||
    begin
 | 
			
		||||
      Regs.Edx := Action;                   { Action if file exists/not exists }
 | 
			
		||||
      Regs.Ds := tb_segment;
 | 
			
		||||
      Regs.Esi := tb_offset;
 | 
			
		||||
      Regs.Ebx := $2000 + (Mode and $ff);   { file open mode }
 | 
			
		||||
    end;
 | 
			
		||||
  Regs.Ecx := $20;                          { Attributes }
 | 
			
		||||
  RealIntr($21, Regs);
 | 
			
		||||
  if Regs.Flags and CarryFlag <> 0 then result := Regs.Ax
 | 
			
		||||
  else Handle := Regs.Ax;
 | 
			
		||||
end ;
 | 
			
		||||
  if (Regs.Flags and CarryFlag) <> 0 then
 | 
			
		||||
    result := Regs.Ax
 | 
			
		||||
  else
 | 
			
		||||
    Handle := Regs.Ax;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Function FileOpen (Const FileName : string; Mode : Integer) : Longint;
 | 
			
		||||
@ -755,7 +772,10 @@ end.
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.2  2003-11-26 20:00:19  florian
 | 
			
		||||
  Revision 1.3  2003-12-15 15:57:49  peter
 | 
			
		||||
    * patches from wiktor
 | 
			
		||||
 | 
			
		||||
  Revision 1.2  2003/11/26 20:00:19  florian
 | 
			
		||||
    * error handling for Variants improved
 | 
			
		||||
 | 
			
		||||
  Revision 1.1  2003/11/17 19:55:13  hajny
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user