📄 423quick
字号:
// 0000 ; Quicksort
// 0000 ; =========
// 0000 ;
// 0000 ; R01: LK / -> left edge
// 0000 ; R02: L / -> left
// 0000 ; R03: R / -> right & right edge
// 0000 ; R04: LV / left value
// 0000 ; R05: RV / right value
// 0000 ; R06: MV / -> value of "middle"
// 0000 ; R15: SP / -> stack pointer
// 0000 ; R14: H / help
// 0000
// 0000 ;------------------------------------
// 0000 ;load and begin recursion
E0080000 // 0000 LDH R01, Data ; begin of data field I
44084100 // 0004 OR R01, R01, Data ; begin of data field II
E0180000 // 0008 LDH R03, EOData ; end of data field I
4418C13F // 000c OR R03, R03, EOData ; end of data field II
E0780000 // 0010 LDH R15, Stack ; load stack pointer (SP) I
447BC180 // 0014 OR R15, R15, Stack ; load SP II
80000009 // 0018 CALL SORT ; sort and
607BC00C // 001c INC R15, 12 ; set SP
FF000000 // 0020 HALT ;
// 0024
// 0024 ;------------------------------------
// 0024 ; Quicksort
// 0024 ;>save and determine middle
EA704000 // 0024 SORT: LRFS R14, RPC ; return address
2E73FFFD // 0028 ST R14, R15, -12 ;
2E1BFFFF // 002c ST R03, R15, -4 ; store RK
61100001 // 0030 MOV R02, R01 ; LV := LK
61308003 // 0034 ADD R06, R02, R03 ; determine middle
54318001 // 0038 LSR R06, R06, 1 ; and
01318000 // 003c LD.b R06, R06, R00 ; load value
// 0040
// 0040 ;------------------------------------
// 0040 ;>work left
01208000 // 0040 LEFT: LD.b R04, R02, R00 ; LV := (L)
60108001 // 0044 LEFT_A: INC R02 ; increment L {LD-X-CMP}
6B010006 // 0048 CMP.f R04, R06 ; if LV < MV :
FCEFFFFE // 004c Blt.a LEFT_A ; continue
01208000 // 0050 LD.b R04, R02, R00 ; LV := (L)
// 0054
68108001 // 0054 DEC R02 ; correct L
// 0058 ;------------------------------------
// 0058 ;>work right
0128C000 // 0058 LD.b R05, R03, R00 ; RV := (R)
6818C001 // 005c RIGHT_A: DEC R03 ; decrement R {LD-X-CMP}
6B018005 // 0060 CMP.f R06, R05 ; if MV < RV :
FCEFFFFE // 0064 Blt.a RIGHT_A ; continue
0128C000 // 0068 LD.b R05, R03, R00 ; RV := (R)
// 006c
6018C001 // 006c INC R03 ; correct R {LD-X-CMP}
// 0070
// 0070 ;------------------------------------
// 0070 ;>done with this part ?
6B008003 // 0070 CMP.f R02, R03 ; if L > R :
FCB00007 // 0074 Bgt.a L_RECU_A ; node is done
6B004003 // 0078 CMP.f R01, R03 ; LK < R or LK < new RK ?
// 007c
// 007c ;------------------------------------
// 007c ;>>if not, exchange and again
21288000 // 007c ST.b R05, R02, R00 ; (L) := RV
2120C000 // 0080 ST.b R04, R03, R00 ; (R) := LV
60108001 // 0084 INC R02 ; increment L
FC7FFFEE // 0088 Bt LEFT ; again and
6818C001 // 008c DEC R03 ; decrement R
// 0090
// 0090 ;------------------------------------
// 0090 ;>>if yes, sort both parts
// 0090 ;>>>left part
FC280004 // 0090 L_RECU_A: Bge R_RECU ; if no, continue with right part
2E13FFFE // 0094 ST R02, R15, -8 ; store L (new LK)
80000009 // 0098 CALL SORT ; sort left {8}
607BC00C // 009c INC R15, 12 ; set SP
// 00a0
// 00a0 ;------------------------------------
// 00a0 ;>>>right part
0E1BFFFF // 00a0 R_RECU: LD R03, R15, -4 ; set RK to old RK
0E0BFFFE // 00a4 LD R01, R15, -8 ; set LK to old L
49000000 // 00a8 NOP ; {LD-x-CMP)
6B004003 // 00ac CMP.f R01, R03 ; LK < RK ?
FCA80005 // 00b0 Bge.a RETURN_A ; if not, leaf is done
0E73FFFD // 00b4 LD R14, R15, -12 ; load return address
80000009 // 00b8 CALL SORT ; right
607BC00C // 00bc INC R15, 12 ; set SP
// 00c0
// 00c0 ;------------------------------------
// 00c0 ;branch is done
0E73FFFD // 00c0 LD R14, R15, -12 ; load return address
687BC00C // 00c4 RETURN_A: DEC R15, 12 ; correct SP
EB00000E // 00c8 RET R14 ; return
49000000 // 00cc NOP ;
// 00d0 ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// 00d0
XXXXXXXX // 00d0 ds.q 12 ; improve readability
XXXXXXXX // 00d4
XXXXXXXX // 00d8
XXXXXXXX // 00dc
XXXXXXXX // 00e0
XXXXXXXX // 00e4
XXXXXXXX // 00e8
XXXXXXXX // 00ec
XXXXXXXX // 00f0
XXXXXXXX // 00f4
XXXXXXXX // 00f8
XXXXXXXX // 00fc
FD0122CC // 0100 Data: dc.q $fd0122cc, $322299a9, $a513ac72, $39237665
322299A9 // 0104
A513AC72 // 0108
39237665 // 010c
37B869EE // 0110 dc.q $37b869ee, $2ee44342, $00ffaa23, $cefc6e5f
2EE44342 // 0114
00FFAA23 // 0118
CEFC6E5F // 011c
7A2196E1 // 0120 dc.q $7a2196e1, $1fa55a91, $239c1a34, $c62bc1dd
1FA55A91 // 0124
239C1A34 // 0128
C62BC1DD // 012c
FC2A915F // 0130 dc.q $fc2a915f, $3be71004, $9a323913, $deabcdef
3BE71004 // 0134
9A323913 // 0138
DEABCDEF // 013c
// 0140 EOData equ !-1
XXXXXXXX // 0140 ds.q 16 ; improve readability
XXXXXXXX // 0144
XXXXXXXX // 0148
XXXXXXXX // 014c
XXXXXXXX // 0150
XXXXXXXX // 0154
XXXXXXXX // 0158
XXXXXXXX // 015c
XXXXXXXX // 0160
XXXXXXXX // 0164
XXXXXXXX // 0168
XXXXXXXX // 016c
XXXXXXXX // 0170
XXXXXXXX // 0174
XXXXXXXX // 0178
XXXXXXXX // 017c
XXXXXXXX // 0180 Stack: ds.w 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -