Advertisement
Guest User

memememerge

a guest
Jun 1st, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;**********************************************************************************
  2.  
  3. ; DESCRIPTION:
  4.  
  5. ; SORT.ASM 
  6.  
  7. ; Merge Sort
  8.  
  9. ;**********************************************************************************
  10.  
  11. ;
  12.  
  13. sort    macro   data,length
  14.  
  15. sort    ident   1,0
  16.  
  17. ;   data -> data pointer
  18.  
  19. ;   length -> length of data to sort (power of 2)
  20.  
  21. ;   X data to sort
  22.  
  23. ;   Y will be used during the sorting process
  24.  
  25. ;   sorting - big to small
  26.  
  27. ;   USED REGISTERS:
  28.  
  29. ;   r0,r1 - data pointers
  30.  
  31. ;   r2,r3 - counter
  32.  
  33. ;   r4 - result pointer
  34.  
  35.  
  36. ; x0 - rozmiar grupy
  37.  
  38. ; x0*2 - petla po grupie
  39.  
  40. ; n5 - liczba grup
  41.  
  42. ;
  43.     page
  44.    
  45.     ;move #1,x0     ;how many inner loops
  46.     ;move #1,b
  47.    
  48.     move #1,r5      ;store in X or Y
  49.     move r5,x0
  50.    
  51.     tfr x0,b #length/2,n5   ;how many group loops
  52.    
  53.     move #length-1,m0
  54.     move #length-1,m1
  55.     move #length-1,m4
  56.    
  57.     move #1,n0
  58.     move #1,n1
  59.     move #1,n4
  60.    
  61.     ; 2 elem groups
  62.     do #@cvi(@log(length)/@log(2)),_sort_loop
  63.         tfr x0,a    #data,r4 ;set writing address
  64.         add #data,a     ;calc group offset
  65.         move #data,r0       ;set reading address
  66.         move a,r1
  67.        
  68.         do n5,_loop_end     ;loop for groups
  69.             tfr x0,b x0,r2  ; r2, r3 = how many elem in groups
  70.             asl b x0,r3 ; b = how many loops
  71.             move r2,n0  ; n0, n1 = group offsets
  72.             tfr b,a r2,n1   ; a = how many loops
  73.            
  74.             do b,_inner_loop    ;loop inside groups
  75.                 tst a
  76.                 jeq _store_rest_2
  77.                
  78.                 tst     b
  79.                 jeq _store_rest_1
  80.                
  81.                 jsset   #0,r5,_compare_two_y
  82.                 jsclr   #0,r5,_compare_two_x
  83. _inner_loop
  84.     nop
  85. _loop_end
  86.     tfr x0,b n5,a
  87.     asr a (r5)+
  88.     asl b
  89.     move a,n5
  90.     move b,x0
  91.    
  92. _sort_loop
  93.     jmp _end_sort
  94.    
  95. _compare_two_x  ;compare and store in x
  96.  
  97.     move    y:(r0),a
  98.     move    y:(r1),b
  99.    
  100.     cmp b,a
  101.    
  102.     .if <le>
  103.         move a,x:(r4)+ y:(r0)+,y1
  104.         move (r2)-
  105.         move r2,a
  106.     .else          
  107.         move b,x:(r4)+ y:(r1)+,y1
  108.         move (r3)-
  109.         move r3,b
  110.     .endi
  111.  
  112.     rts
  113.    
  114. _compare_two_y  ;compare and store in y
  115.  
  116.     move    x:(r0),a
  117.     move    x:(r1),b
  118.    
  119.     cmp b,a
  120.    
  121.     .if <le>
  122.         move a,y:(r4)+ x:(r0)+,x1
  123.         move (r2)-
  124.         move r2,a
  125.     .else          
  126.         move b,y:(r4)+ x:(r1)+,x1
  127.         move (r3)-
  128.         move r3,b
  129.     .endi
  130.  
  131.     rts
  132.    
  133. _store_rest_1
  134.     jclr #0,r5,_store_1x
  135. _store_1y
  136.     do r2,_store_end_1y
  137.         move x:(r0)+,b
  138.         nop
  139.         move b,y:(r4)+
  140. _store_end_1y
  141.     jmp _store_end_1
  142. _store_1x
  143.     do r2,_store_end_1x
  144.         move y:(r0)+,b
  145.         nop
  146.         move b,x:(r4)+
  147. _store_end_1x
  148. _store_end_1
  149.     move (r1)+n1
  150.     move (r0)+n0
  151.     enddo
  152.     jmp _inner_loop
  153.    
  154. _store_rest_2
  155.     jclr #0,r5,_store_2x
  156. _store_2y
  157.     do r3,_store_end_2y
  158.         move x:(r1)+,b
  159.         nop
  160.         move b,y:(r4)+
  161. _store_end_2y
  162.     jmp _store_end_2
  163. _store_2x
  164.     do r3,_store_end_2x
  165.         move y:(r1)+,b
  166.         nop
  167.         move b,x:(r4)+
  168. _store_end_2x
  169. _store_end_2
  170.     move (r1)+n1
  171.     move (r0)+n0
  172.     enddo
  173.     jmp _inner_loop
  174.    
  175. _end_sort
  176.     endm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement