URL
https://opencores.org/ocsvn/eco32/eco32/trunk
Subversion Repositories eco32
[/] [eco32/] [trunk/] [fp/] [implementation/] [mmix/] [permu-heap.mms] - Rev 15
Compare with Previous | Blame | View Log
* Permutation generator a la Heap
N IS 5 $n$ (3, 4, 5, or 6)
t IS $255
j IS $0 $8j$
k IS $1 $8k$
ak IS $2
aj IS $3
LOC Data_Segment
a GREG @ Base address for $a_0\ldots a_{n-1}$
A0 IS @
A1 IS @+8
A2 IS @+16
* LOC @+8*N Space for $a_0\ldots a_{n-1}$
BYTE "11111111","22222222","33333333"
BYTE "44444444","55555555","66666666"
BYTE #a,0
LOC (@+7)&-8 (align to octabyte)
c GREG @-8*3 Location of $c_0$
LOC @-8*3+8*N $8c_3\ldots 8c_{n-1}$, initially zero
OCTA -1 $c_n=-1$, a convenient sentinel
u GREG 0 Contents of $a_0$, except in inner loop
v GREG 0 Contents of $a_1$, except in inner loop
w GREG 0 Contents of $a_2$, except in inner loop
LOC #100
1H STCO 0,c,k $c_k\gets 0$.
INCL k,8 $k\gets k+1$.
0H LDO j,c,k $j\gets c_k$.
CMP t,j,k
BZ t,1B Loop if $c_k=k$.
BN j,Done Terminate if $c_k<0$ ($k=n$).
LDO ak,a,k Fetch $a_k$.
ADD t,j,8
STO t,c,k $c_k\gets j+1$.
AND t,k,#8
CSZ j,t,0 Set $j\gets 0$ if $k$ is even.
LDO aj,a,j Fetch $a_j$.
STO ak,a,j Replace it by $a_k$.
CSZ u,j,ak Set $u\gets a_k$ if $j=0$.
SUB j,j,8 $j\gets j-1$.
CSZ v,j,ak Set $v\gets a_k$ if $j=0$.
SUB j,j,8 $j\gets j-1$.
CSZ w,j,ak Set $w\gets a_k$ if $j=0$.
STO aj,a,k Replace $a_k$ by what was $a_j$.
In PUSHJ 0,Visit
STO v,A0 $a_0\gets v$.
STO u,A1 $a_1\gets u$.
PUSHJ 0,Visit
STO w,A0 $a_0\gets w$.
STO v,A2 $a_2\gets v$.
PUSHJ 0,Visit
STO u,A0 $a_0\gets u$.
STO w,A1 $a_1\gets w$.
PUSHJ 0,Visit
STO v,A0 $a_0\gets v$.
STO u,A2 $a_2\gets u$.
PUSHJ 0,Visit
STO w,A0 $a_0\gets w$.
STO v,A1 $a_1\gets v$.
PUSHJ 0,Visit
SET t,u Swap $u\leftrightarrow w$.
SET u,w
SET w,t
SET k,8*3 $k\gets3$.
JMP 0B
Visit LDA t,A0
TRAP 0,Fputs,StdOut
POP
Main LDO u,A0
LDO v,A1
LDO w,A2
JMP In
Done TRAP 0,Halt,0