[英]Sort numbers using easy68k
How can I sort number in descending order by using easy68k? 如何使用easy68k降序对数字进行排序? Please give some suggestions. 请给一些建议。
I'm still learning 68k asm, but obviously you could accomplish this task with the cmp
opcode. 我仍在学习68k asm,但显然您可以使用cmp
操作码完成此任务。
Here's a quicksort implementation I found at this site : 这是我在此站点上找到的快速排序实现:
************************************************************SIM68K V1.1US***
* *
* Program : QSORT.ASM *
* Quick Sort is a classical recursive sort algorithm. *
* Being very famous, I prefer you search how it works in a computer *
* science book. *
* This instance of "Quick Sort" algorithm sorts an unsigned byte table *
* ($FF = 255) by ascending value. *
* *
* Stack top contains min and max indexes of the sub-table being sorted *
* *
* SIM68K.INI options should be : *
* - BIOS = 0 or 1 *
* - VAL_RAM=RANDOM *
* - RAM_AD=$2000 to see table *
* *
******************************************(C)1994-1998*Patrick DEMIRDJIAN***
* min and max indexes of main table to be sorted
min equ 0
* $3F = MEMORY window size
max equ $3f
* Program start address
org $1000
* Stack pointer init, IT masking and full speed mode setting
lea $7ffe,a7
ori.w #$700,sr
andi.w #$7fff,sr
* A0 holds start address of table
lea $2000,a0
* D0 holds min index
move.l #min,d0
* D1 holds max index
move.l #max,d1
* Q_SORT subroutine call
bsr q_sort
* End of program by pseudo monitor call
trap #0
*****************************************************************************
Q_SORT equ *
* Save min and max indexes in the stack
move.w d0,-(a7)
move.w d1,-(a7)
* D2 = "middle" index = D0 + ((D1 - D0) / 2) = "pivot" index
* Why is this formula better than (D1+D0)/2 ?
move.w d1,d2
sub.w d0,d2
lsr.w #1,d2
add.w d0,d2
* D3 = table "pivot" element
move.b 0(a0,d2.w),d3
* Search for table 1st element > pivot, starting from table top
next1 equ *
cmp.b 0(a0,d0.w),d3
bls next2
addq.w #1,d0
bra next1
* Search for table 1st element < pivot, starting from table bottom
next2 equ *
move.b 0(a0,d1.w),d4
cmp.b d3,d4
bls swap
subq.w #1,d1
bra next2
swap equ *
cmp.w d1,d0
bgt suite
* Swap elements through D5
move.b 0(a0,d0.w),d5
move.b 0(a0,d1.w),0(a0,d0.w)
move.b d5,0(a0,d1.w)
* Refresh indexes
addq.w #1,d0
subq.w #1,d1
cmp.w d1,d0
bgt suite
bra next1
suite equ *
cmp.w 2(a7),d1
ble next3
* Save current registers in stack
move.w 2(a7),d6
move.w d0,-(a7)
move.w d1,-(a7)
move.w d6,d0
* Recursive call with new indexes
* Sort sub-table
bsr q_sort
* Get current registers from stack
move.w (a7)+,d1
move.w (a7)+,d0
next3 equ *
cmp.w (a7),d0
bge fin
* Save current registers in stack
move.w (a7),d6
move.w d0,-(a7)
move.w d1,-(a7)
move.w d6,d1
* Recursive call with new indexes
* Sort sub-table
bsr q_sort
* Get current registers from stack
move.w (a7)+,d1
move.w (a7)+,d0
fin equ *
* Remove indexes from stack
adda.l #4,a7
rts
* Suggestion_1
* Modify tests to sort signed bytes table ($FF = -1).
* Display in D7 stack max size.
* Suggestion_2
* Modify Q_SORT to sort word and long word tables.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.