{
    $Id$
    This file is part of the Free Pascal run time library.
    Copyright (c) 1993,97 by the Free Pascal development team

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

procedure MoveLong(selector:word;dst:pointer;cnt:longint);
begin
  asm 
    movw    %fs,%dx
    movw    selector,%ax
    movw    %ax,%fs
    xorl    %esi,%esi
    movl    DST,%edi
    movl    CNT,%ecx
    shrl    $0x2,%ecx
  MOVE1:
    movl    %fs:(%esi,%ecx,4),%eax
    movl    %eax,(%edi,%ecx,4)
    decl    %ecx
    jns     MOVE1
    movw    %dx,%fs
  end;
end;

procedure ScreenToMem(Source,Target,Counter:longint);
begin
  asm
    pushw  %ds
    movl   counter,%ecx
    movl   %ecx,%ebx
    shrl   $0x2,%ecx
    andl   $0x3,%ebx
    movl   target,%edi
    movl   source,%esi
    addl   _WBUFFER,%esi
    movw   _SEG_WRITE,%ax
    movw   %ax,%ds
    rep
    movsl
    movl   %ebx,%ecx
    rep
    movsb
    popw   %ds
  end;
end;

procedure MemToScreen(Source,Target,Counter:longint);
begin
  asm
    movw   %es,%dx
    movl   counter,%ecx
    movl   %ecx,%ebx
    shrl   $0x2,%ecx
    andl   $0x3,%ebx
    movl   target,%edi
    movl   source,%esi
    addl   _WBUFFER,%edi
    movw   _SEG_WRITE,%ax
    movw   %ax,%es
    rep
    movsl
    movl   %ebx,%ecx
    rep
    movsb
    movw   %dx,%es
  end;
end;

procedure MemAndScreen(Source,Target,Counter:longint);
begin
  asm
    pushw  %es
    movl   counter,%ecx
    movl   %ecx,%ebx
    shrl   $0x2,%ecx
    andl   $0x3,%ebx
    movl   target,%edi
    movl   source,%esi
    movl   $4,%edx
    addl   _WBUFFER,%edi
    movw   _SEG_WRITE,%ax
    movw   %ax,%es
mas_lloop:
    movl   (%esi),%eax
    andl   %eax,%es:(%edi)
    addl   %edx,%edi
    addl   %edx,%esi
    decl   %ecx
    jnz    mas_lloop
    orl    %ebx,%ecx
    jz     mas_end
mas_bloop:
    movb   (%esi),%al
    andb   %al,%es:(%edi)
    incl   %esi
    incl   %edi
    decl   %ecx
    jnz    mas_bloop
mas_end:
    popw   %es
  end;
end;

procedure MemOrScreen(Source,Target,Counter:longint);
begin
  asm
    pushw  %es
    movl   counter,%ecx
    movl   %ecx,%ebx
    shrl   $0x2,%ecx
    andl   $0x3,%ebx
    movl   target,%edi
    movl   source,%esi
    addl   _WBUFFER,%edi
    movw   _SEG_WRITE,%ax
    movw   %ax,%es
mos_lloop:
    movl   (%esi),%eax
    orl    %eax,%es:(%edi)
    addl   $4,%edi
    addl   $4,%esi
    decl   %ecx
    jnz    mos_lloop
    orl    %ebx,%ecx
    jz     mos_end
mos_bloop:
    movb   (%esi),%al
    orb    %al,%es:(%edi)
    incl   %esi
    incl   %edi
    decl   %ecx
    jnz    mos_bloop
mos_end:
    popw   %es
  end;
end;

procedure MemXorScreen(Source,Target,Counter:longint);
begin
  if is_mmx_cpu and (counter>50) then
    asm
       movw   %es,%dx
       movl   counter,%ecx
       movl   %ecx,%ebx
       shrl   $0x3,%ecx
       andl   $0x7,%ebx
       movl   target,%edi
       movl   source,%esi
       addl   _WBUFFER,%edi
       movw   _SEG_WRITE,%ax
       movw   %ax,%es
       jecxz  mmxmxs_b
   mmxmxs_lloop:
       movq   (%esi),%mm0
       addl   $8,%esi
       pxor   %es:(%edi),%mm0
       movq   %mm0,%es:(%edi)
       addl   $8,%edi
       decl   %ecx
       jnz    mmxmxs_lloop
   mmxmxs_b:
       orl    %ebx,%ecx
       jz     mmxmxs_end
   mmxmxs_bloop:
       movb   (%esi),%al
       xorb   %al,%es:(%edi)
       incl   %esi
       incl   %edi
       decl   %ecx
       jnz    mmxmxs_bloop
   mmxmxs_end:
       movw   %dx,%es
    end
  else
    asm
      movw   %es,%dx
      movl   counter,%ecx
      movl   %ecx,%ebx
      shrl   $0x2,%ecx
      andl   $0x3,%ebx
      movl   target,%edi
      movl   source,%esi
      addl   _WBUFFER,%edi
      movw   _SEG_WRITE,%ax
      movw   %ax,%es
      jecxz  mxs_b
  mxs_lloop:
      movl   (%esi),%eax
      xorl   %eax,%es:(%edi)
      addl   $4,%edi
      addl   $4,%esi
      decl   %ecx
      jnz    mxs_lloop
  mxs_b:
      orl    %ebx,%ecx
      jz     mxs_end
  mxs_bloop:
      movb   (%esi),%al
      xorb   %al,%es:(%edi)
      incl   %esi
      incl   %edi
      decl   %ecx
      jnz    mxs_bloop
  mxs_end:
      movw   %dx,%es
    end;
end;

procedure MemNotScreen(Source,Target,Counter:longint);
begin
  asm
    pushw  %es
    movl   counter,%ecx
    movl   %ecx,%ebx
    shrl   $0x2,%ecx
    andl   $0x3,%ebx
    movl   target,%edi
    movl   source,%esi
    addl   _WBUFFER,%edi
    movw   _SEG_WRITE,%ax
    movw   %ax,%es
    jecxz  mns_b
mns_lloop:
    movl   (%esi),%eax
    notl   %eax
    movl   %eax,%es:(%edi)
    addl   $4,%edi
    addl   $4,%esi
    decl   %ecx
    jnz    mns_lloop
mns_b:
    orl    %ebx,%ecx
    jz     mns_end
mns_bloop:
    movb   (%esi),%al
    notb   %al
    movb   %al,%es:(%edi)
    incl   %esi
    incl   %edi
    decl   %ecx
    jnz    mns_bloop
mns_end:
    popw   %es
  end;
end;


{
  $Log$
  Revision 1.1  1998-03-25 11:18:42  root
  Initial revision

  Revision 1.4  1998/03/03 22:48:43  florian
    + graph.drawpoly procedure
    + putimage with xorput uses mmx if available

  Revision 1.3  1998/01/26 11:58:25  michael
  + Added log at the end


  
  Working file: rtl/dos/ppi/move.ppi
  description:
  ----------------------------
  revision 1.2
  date: 1997/12/01 12:21:32;  author: michael;  state: Exp;  lines: +14 -0
  + added copyright reference in header.
  ----------------------------
  revision 1.1
  date: 1997/11/27 08:33:51;  author: michael;  state: Exp;
  Initial revision
  ----------------------------
  revision 1.1.1.1
  date: 1997/11/27 08:33:51;  author: michael;  state: Exp;  lines: +0 -0
  FPC RTL CVS start
  =============================================================================
}
