home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / wp_dtp / xdme1820.lha / XDME / swap.a < prev    next >
Text File  |  1992-11-30  |  889b  |  71 lines

  1.  
  2. ;
  3. ;   swap.a
  4. ;
  5. ;   swap (s1, s2, len)
  6. ;      A0  A1  D0
  7. ;      4   8   12
  8. ;
  9. ;   swap two regions of memory
  10. ;
  11. ;   this routine looks a bit like CMPMEM.A from DICE, because I took it
  12. ;   from there :-)
  13. ;
  14.  
  15.         section text,code
  16.  
  17.         xdef    _swapmem
  18.         xdef    @swapmem
  19.  
  20. _swapmem:    move.l    4(sp),A0
  21.         move.l    8(sp),A1
  22.         move.l    12(sp),D0
  23.  
  24. @swapmem:    cmp.l    A0,A1
  25.         bne    w2
  26.  
  27.         rts
  28.  
  29. w2:        movem.l D2/D3,-(sp)
  30.  
  31.         move.l    D0,D1
  32.         move.w    A0,D0
  33.         lsr.l    #1,D0
  34.         bcs    swapbyte
  35.         move.w    A1,D0
  36.         lsr.l    #1,D0
  37.         bcs    swapbyte
  38.  
  39.         move.l    D1,D0
  40.         lsr.l    #2,D0
  41.  
  42.         subq.l    #1,D1
  43.         bcs    w1
  44.  
  45. loop:        move.l    (A0),D2
  46.         move.l    (A1),D3
  47.         move.l    D2,(A0)+
  48.         move.l    D3,(A1)+
  49.         dbf    D1,loop
  50.         sub.l    #$10000,D1
  51.         bcc    loop
  52.  
  53. w1:        move.l    D0,D1
  54.         and.l    #3,D1
  55.  
  56. swapbyte:    subq.l    #1,D1
  57.         bcs    end
  58.  
  59. loop2:        move.b    (A0),D2
  60.         move.b    (A1),D3
  61.         move.b    D2,(A0)+
  62.         move.b    D3,(A1)+
  63.         dbf    D1,loop2
  64.         sub.l    #$10000,D1
  65.         bcc    loop2
  66.  
  67. end:        movem.l (sp)+,D2/D3
  68.         rts
  69.  
  70.         END
  71.