home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / asm / AsmSort.lha / _CombSort.s < prev    next >
Encoding:
Text File  |  1997-01-22  |  1003 b   |  64 lines

  1.  
  2. ; Comb sort in MC68020+ ASM.
  3. ; (c) Mattias Nilsson (c-lous@freenet.hut.fi)
  4. ;
  5. ; Sorts an array of 16 bit INTS.
  6.  
  7. ListSize    =    256
  8.  
  9.     xdef    _CombSort
  10.  
  11.  
  12. _CombSort
  13.  
  14. ; Create some "random" numbers
  15.     Lea.l    List(Pc),a0
  16.     Move.l    #ListSize-1,d7
  17. .Loop:    Move.w    $dff006,d0
  18.     Muls    d7,d0
  19.     Lsr.w    #7,d0
  20.     Move.w    d0,(a0)+
  21.     Dbf    d7,.Loop
  22.  
  23. ; Comb sort the array.
  24.  
  25.     Lea.l    List(Pc),a0
  26.     Move.l    #ListSize,d7    ; Number of values
  27.  
  28.     Move.l    d7,d1        ; d1=Gap
  29. .MoreSort
  30.     MoveQ    #0,d0        ; d0=Switch
  31.     Asl.l    #8,d1
  32.     Divu.w    #333,d1        ; 1.3*256 = 332.8
  33.     And.l    #$ffff,d1    ; gap=gap/1.3
  34.  
  35.     Cmp.w    #1,d1        ; if gap<1 then gap:=1
  36.     Bpl    .okgap
  37.     Moveq    #1,d1
  38. .okgap:
  39.     Move.l    d7,d2        ; d2=Top
  40.     Sub.l    d1,d2        ; D2=NMAX-gap
  41.     Move.l    a0,a1
  42.     Lea.l    (a1,d1.w*2),a2    ; a2=a1+gap
  43.     Subq.w    #1,d2
  44. .Loop:    Move.w    (a1)+,d3
  45.     Cmp.w    (a2)+,d3
  46.     Bmi    .okval
  47.     Beq    .okval
  48.  
  49.     Move.w    -2(a1),d3    ; swap
  50.     Move.w    -2(a2),-2(a1)
  51.     Move.w    d3,-2(a2)
  52.  
  53.     Moveq    #1,d0
  54. .okval:
  55.     Dbf    d2,.Loop
  56.  
  57.     Cmp.w    #1,d1        ; gap < 1 ?
  58.     Bne    .MoreSort
  59.     Tst.w    d0        ; Any entries swapped ?
  60.     Bne    .MoreSort
  61.     Rts
  62.  
  63. List:    ds.w    ListSize
  64.