Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;**********************************************************************************
- ; DESCRIPTION:
- ; SORT.ASM
- ; Merge Sort
- ;**********************************************************************************
- ;
- sort macro data,length
- sort ident 1,0
- ; data -> data pointer
- ; length -> length of data to sort (power of 2)
- ; X data to sort
- ; Y will be used during the sorting process
- ; sorting - big to small
- ; USED REGISTERS:
- ; r0,r1 - data pointers
- ; r2,r3 - counter
- ; r4 - result pointer
- ; x0 - rozmiar grupy
- ; x0*2 - petla po grupie
- ; n5 - liczba grup
- ;
- page
- ;move #1,x0 ;how many inner loops
- ;move #1,b
- move #1,r5 ;store in X or Y
- move r5,x0
- tfr x0,b #length/2,n5 ;how many group loops
- move #length-1,m0
- move #length-1,m1
- move #length-1,m4
- move #1,n0
- move #1,n1
- move #1,n4
- ; 2 elem groups
- do #@cvi(@log(length)/@log(2)),_sort_loop
- tfr x0,a #data,r4 ;set writing address
- add #data,a ;calc group offset
- move #data,r0 ;set reading address
- move a,r1
- do n5,_loop_end ;loop for groups
- tfr x0,b x0,r2 ; r2, r3 = how many elem in groups
- asl b x0,r3 ; b = how many loops
- move r2,n0 ; n0, n1 = group offsets
- tfr b,a r2,n1 ; a = how many loops
- do b,_inner_loop ;loop inside groups
- tst a
- jeq _store_rest_2
- tst b
- jeq _store_rest_1
- jsset #0,r5,_compare_two_y
- jsclr #0,r5,_compare_two_x
- _inner_loop
- nop
- _loop_end
- tfr x0,b n5,a
- asr a (r5)+
- asl b
- move a,n5
- move b,x0
- _sort_loop
- jmp _end_sort
- _compare_two_x ;compare and store in x
- move y:(r0),a
- move y:(r1),b
- cmp b,a
- .if <le>
- move a,x:(r4)+ y:(r0)+,y1
- move (r2)-
- move r2,a
- .else
- move b,x:(r4)+ y:(r1)+,y1
- move (r3)-
- move r3,b
- .endi
- rts
- _compare_two_y ;compare and store in y
- move x:(r0),a
- move x:(r1),b
- cmp b,a
- .if <le>
- move a,y:(r4)+ x:(r0)+,x1
- move (r2)-
- move r2,a
- .else
- move b,y:(r4)+ x:(r1)+,x1
- move (r3)-
- move r3,b
- .endi
- rts
- _store_rest_1
- jclr #0,r5,_store_1x
- _store_1y
- do r2,_store_end_1y
- move x:(r0)+,b
- nop
- move b,y:(r4)+
- _store_end_1y
- jmp _store_end_1
- _store_1x
- do r2,_store_end_1x
- move y:(r0)+,b
- nop
- move b,x:(r4)+
- _store_end_1x
- _store_end_1
- move (r1)+n1
- move (r0)+n0
- enddo
- jmp _inner_loop
- _store_rest_2
- jclr #0,r5,_store_2x
- _store_2y
- do r3,_store_end_2y
- move x:(r1)+,b
- nop
- move b,y:(r4)+
- _store_end_2y
- jmp _store_end_2
- _store_2x
- do r3,_store_end_2x
- move y:(r1)+,b
- nop
- move b,x:(r4)+
- _store_end_2x
- _store_end_2
- move (r1)+n1
- move (r0)+n0
- enddo
- jmp _inner_loop
- _end_sort
- endm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement