Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1186 | savelij | 1 | cpu imp-16c/200 |
2 | |||
3 | flag: word 0 ; if non-zero, swap made during pass |
||
4 | tab: ; vector address |
||
5 | . = .+1 |
||
6 | tabend: ; sort limit |
||
7 | . = .+1 |
||
8 | regs: ; register save area |
||
9 | . = .+4 |
||
10 | ssort: st 0,regs ; save registers |
||
11 | st 1,regs+1 |
||
12 | st 2,regs+2 |
||
13 | st 3,regs+3 |
||
14 | pull 2 ; obtain address of parameter list |
||
15 | push 2 |
||
16 | li 0,0 |
||
17 | st 0,flag |
||
18 | ld 3,1(2) ; end of vector |
||
19 | aisz 3,-1 |
||
20 | st 3,tabend |
||
21 | ld 3,(2) ; vector address |
||
22 | st 3,tab |
||
23 | loop: ld 0,(3) ; get a value |
||
24 | skg 0,1(3) ; compare against next value |
||
25 | jmp test ; values in order |
||
26 | ld 1,1(3) ; swap value |
||
27 | st 0,1(3) |
||
28 | st 1,0(3) |
||
29 | li 1,1 ; set sort flg non-zero |
||
30 | st 1,flag |
||
31 | test: aisz 3,1 ; increment table pointer |
||
32 | skg 3,tabend ; finished this pass? |
||
33 | jmp loop ; no |
||
34 | ld 0,flag ; yes - did we make a swap? |
||
35 | aisz 0,0 |
||
36 | jmp .+2 ; yes - continue sort |
||
37 | jmp out ; no - sort done |
||
38 | li 0,0 ; initialize for next pass |
||
39 | st 0,flag |
||
40 | ld 3,tab |
||
41 | jmp loop |
||
42 | out: ld 0,regs ; restore registers |
||
43 | ld 1,regs+1 |
||
44 | ld 2,regs+2 |
||
45 | ld 3,regs+3 |
||
46 | rts 2 |
||
47 | |||
48 | end |