* Topswops optimized 12/07/2016 TOPSWOPS CSECT USING TOPSWOPS,R13 base register B 72(R15) skip savearea DC 17F'0' savearea STM R14,R12,12(R13) prolog ST R13,4(R15) " <- ST R15,8(R13) " -> LR R13,R15 " addressability MVC N,=F'1' n=1 LOOPN L R4,N n; do n=1 to 10 ===-------------==* C R4,=F'10' " * BH ELOOPN . * MVC P(40),PINIT p=pinit MVC COUNTM,=F'0' countm=0 REPEAT MVC CARDS(40),P cards=p -------------------------+ SR R11,R11 count=0 | WHILE CLC CARDS,=F'1' do while cards(1)^=1 ---------+ BE EWHILE . | MVC M,CARDS m=cards(1) L R2,M m SRA R2,1 m/2 ST R2,MD2 md2=m/2 L R3,M @card(mm)=m SLA R3,2 *4 LA R3,CARDS-4(R3) @card(mm) LA R2,CARDS @card(i)=0 LA R6,1 i=1 LOOPI C R6,MD2 do i=1 to m/2 -------------+ BH ELOOPI . | L R0,0(R2) swap r0=cards(i) MVC 0(4,R2),0(R3) swap cards(i)=cards(mm) ST R0,0(R3) swap cards(mm)=r0 AH R2,=H'4' @card(i)=@card(i)+4 SH R3,=H'4' @card(mm)=@card(mm)-4 LA R6,1(R6) i=i+1 | B LOOPI ----------------------------+ ELOOPI LA R11,1(R11) count=count+1 | B WHILE -------------------------------+ EWHILE C R11,COUNTM if count>countm BNH NOTGT then ST R11,COUNTM countm=count NOTGT BAL R14,NEXTPERM call nextperm LTR R0,R0 until nextperm=0 | BNZ REPEAT ---------------------------------+ L R1,N n XDECO R1,XDEC edit n MVC PG(2),XDEC+10 output n MVI PG+2,C':' output ':' L R1,COUNTM countm XDECO R1,XDEC edit countm MVC PG+3(4),XDEC+8 output countm XPRNT PG,L'PG print buffer L R1,N n * LA R1,1(R1) +1 * ST R1,N n=n+1 * B LOOPN ===------------------------------==* ELOOPN L R13,4(0,R13) epilog LM R14,R12,12(R13) " restore XR R15,R15 " rc=0 BR R14 exit PINIT DC F'1',F'2',F'3',F'4',F'5',F'6',F'7',F'8',F'9',F'10' CARDS DS 10F cards P DS 10F p COUNTM DS F countm M DS F m N DS F n MD2 DS F m/2 PG DC CL20' ' buffer XDEC DS CL12 temp *------- ---- nextperm ----------{----------------------------------- NEXTPERM L R9,N nn=n SR R8,R8 jj=0 LR R7,R9 nn BCTR R7,0 j=nn-1 LTR R7,R7 if j=0 BZ ELOOPJ1 then skip do loop LOOPJ1 LR R1,R7 do j=nn-1 to 1 by -1; j ----+ SLA R1,2 . | L R2,P-4(R1) p(j) C R2,P(R1) if p(j)