105 lines
4.7 KiB
Plaintext
105 lines
4.7 KiB
Plaintext
* Spigot algorithm do the digits of PI 02/07/2016
|
|
PISPIG CSECT
|
|
USING PISPIG,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 "
|
|
SR R0,R0 0
|
|
ST R0,MORE more=0
|
|
LA R6,1 i=1
|
|
LOOPI1 C R6,=A(NBUF) do i=1 to hbound(buf)
|
|
BH ELOOPI1 "
|
|
SR R9,R9 karray=0
|
|
L R7,=A(NVECT) j=hbound(vect)
|
|
LR R1,R7 j
|
|
SLA R1,2 .
|
|
LA R10,VECT-4(R1) r10=@vect(j)
|
|
LOOPJ EQU * do j=hbound(vect) to 1 by -1
|
|
L R5,=F'100000' 100000
|
|
M R4,0(R10) *vect(j)
|
|
LR R2,R5 r2=100000*vect(j)
|
|
LR R5,R9 karray
|
|
MR R4,R7 karray*j
|
|
AR R2,R5 r2+karray*j
|
|
LR R11,R2 n=100000*vect(j)+karray*j
|
|
LR R3,R7 j
|
|
SLA R3,1 2*j
|
|
BCTR R3,0 2*j-1)
|
|
LR R4,R11 n
|
|
SRDA R4,32 .
|
|
DR R4,R3 n/(2*j-1)
|
|
LR R9,R5 karray=n/(2*j-1)
|
|
LR R5,R9 karray
|
|
MR R4,R3 karray*(2*j-1)
|
|
LR R1,R11 n
|
|
SR R1,R5 n-karray*(2*j-1)
|
|
ST R1,0(R10) vect(j)=n-karray*(2*j-1)
|
|
SH R10,=H'4' r10=@vect(j)
|
|
BCT R7,LOOPJ end do j
|
|
LR R4,R9 karray
|
|
SRDA R4,32 .
|
|
D R4,=F'100000' karray/100000
|
|
LR R11,R5 k=karray/100000
|
|
L R2,MORE more
|
|
AR R2,R11 +k
|
|
LR R1,R6 i
|
|
SLA R1,2 .
|
|
ST R2,BUF-4(R1) buf(i)=more+k
|
|
LR R5,R11 k
|
|
M R4,=F'100000' *100000
|
|
LR R1,R9 karray
|
|
SR R1,R5 -k*100000
|
|
ST R1,MORE more=karray-k*100000
|
|
LA R6,1(R6) i=i+1
|
|
B LOOPI1 end do i
|
|
ELOOPI1 L R1,BUF buf(1)
|
|
CVD R1,PACKED convert buf(1) to packed decimal
|
|
OI PACKED+7,X'0F' prepare unpack
|
|
UNPK PG(1),PACKED packed decimal to zoned printable
|
|
MVI PG+1,C'.' output '.'
|
|
XPRNT PG,80 print buffer
|
|
MVC PG,=CL80' ' clear buffer
|
|
LA R3,PG pgi=0
|
|
LA R6,2 i=2
|
|
LOOPI2 C R6,=A(NBUF) do i=2 to hbound(buf)
|
|
BH ELOOPI2 "
|
|
MVC 0(1,R3),=C' ' output ' '
|
|
LA R3,1(R3) pgi=pgi+1
|
|
LR R1,R6 i
|
|
SLA R1,2 .
|
|
L R2,BUF-4(R1) buf(i)
|
|
CVD R2,PACKED convert v to packed decimal
|
|
OI PACKED+7,X'0F' prepare unpack
|
|
UNPK XDEC,PACKED packed decimal to zoned printable
|
|
MVC 0(5,R3),XDEC+7 output buf(i) with 5 decimals
|
|
LA R3,5(R3) pgi=pgi+5
|
|
LR R4,R6 i
|
|
BCTR R4,0 i-1
|
|
SRDA R4,32 .
|
|
D R4,=F'10' (i-1)/10
|
|
LTR R4,R4 if (i-1)//10=0
|
|
BNZ NOSKIP then
|
|
XPRNT PG,80 print buffer
|
|
LA R3,PG pgi=0
|
|
MVC PG,=CL80' ' clear buffer
|
|
NOSKIP LA R6,1(R6) i=i+1
|
|
B LOOPI2 end do i
|
|
ELOOPI2 L R13,4(0,R13) epilog
|
|
LM R14,R12,12(R13) "
|
|
XR R15,R15 "
|
|
BR R14 exit
|
|
LTORG
|
|
MORE DS F more
|
|
PACKED DS 0D,PL8 packed decimal
|
|
PG DC CL80' ' buffer
|
|
XDEC DS CL12 temp
|
|
BUF DC (NBUF)F'0' buf(nbuf)
|
|
VECT DC (NVECT)F'2' vect(nvect) init 2
|
|
YREGS
|
|
NBUF EQU 201 number of 5 decimals
|
|
NVECT EQU 3350 nvect=ceil(nbuf*50/3)
|
|
END PISPIG
|