integer function spec i77pODDCOLLATZ(integer array name i77callerdisplay,integer I)
record format i77arfmSHOWCOLLATZLENGTH(integer name MAX,
integer BASEVALUE)
record format i77arfmBLOCK(integer ODD1,
integer ODD2)

integer function i77pEVENCOLLATZ(integer array name i77callerdisplay,integer I)
integer array i77display(1:3)
integer i77
i77display(i77)=i77callerdisplay(i77) for i77=1,1,2
i77display(3)=0
record(i77arfmBLOCK)name i77arBLOCK==record(i77display(1))
record(i77arfmSHOWCOLLATZLENGTH)name i77arSHOWCOLLATZLENGTH==record(i77display(2))
if I{level 3}>=1 then ->i77L1
result=0
i77L1:
if I{level 3}<=i77arSHOWCOLLATZLENGTH_MAX{level 2} then ->i77L2
i77arSHOWCOLLATZLENGTH_MAX{level 2}=I{level 3}
i77L2:
if I{level 3}&i77arBLOCK_ODD2{level 1}=0 then ->i77L3
result=i77arSHOWCOLLATZLENGTH_BASEVALUE{level 2}+(i77pODDCOLLATZ(i77display,I{level 3}>>1))
i77L3:
result=i77arSHOWCOLLATZLENGTH_BASEVALUE{level 2}+(i77pEVENCOLLATZ(i77display,I{level 3}>>1))
end

integer function i77pODDCOLLATZ(integer array name i77callerdisplay,integer I)
integer array i77display(1:3)
integer i77
i77display(i77)=i77callerdisplay(i77) for i77=1,1,2
i77display(3)=0
record(i77arfmSHOWCOLLATZLENGTH)name i77arSHOWCOLLATZLENGTH==record(i77display(2))
if I{level 3}>1 then ->i77L4
result=0
i77L4:
if I{level 3}<=i77arSHOWCOLLATZLENGTH_MAX{level 2} then ->i77L5
i77arSHOWCOLLATZLENGTH_MAX{level 2}=I{level 3}
i77L5:
if I{level 3}<=715827882 then ->i77L6
signal 15,1,1
i77L6:
result=i77arSHOWCOLLATZLENGTH_BASEVALUE{level 2}+(i77pEVENCOLLATZ(i77display,((I{level 3}<<1)+I{level 3})+1))
end

routine i77pSHOWCOLLATZLENGTH(integer array name i77callerdisplay,integer I,integer name MAX)
record(i77arfmSHOWCOLLATZLENGTH) i77ar
integer array i77display(1:2)
i77display(1)=i77callerdisplay(1)
i77display(2)=addr(i77ar)
record(i77arfmBLOCK)name i77arBLOCK==record(i77display(1))
i77ar_MAX==MAX
i77ar_BASEVALUE{level 2}=0+1
PRINTSTRING("The Collatz sequence for")
WRITE(I{level 2},1)
PRINTSTRING(" takes")
if I{level 2}&i77arBLOCK_ODD1{level 1}=0 then ->i77L7
WRITE(i77pODDCOLLATZ(i77display,I{level 2}),1)
->i77L8
i77L7:
WRITE(i77pEVENCOLLATZ(i77display,I{level 2}),1)
i77L8:
PRINTSTRING(" steps and the largest value reached was")
WRITE(i77ar_MAX{level 2},1)
NEWLINE
end

begin
record(i77arfmBLOCK) i77ar
integer array i77display(1:1)
i77display(1)=addr(i77ar)
integer HIGHEST
integer SEED
i77ar_ODD1{level 1}=1
i77ar_ODD2{level 1}=2
PROMPT("Integer seed value: ")
READ(SEED{level 1})
if SEED{level 1}>=0 then ->i77L9
PRINTSTRING("Parameter must be a positive integer.")
NEWLINE
signal 0,0,0
i77L9:
HIGHEST{level 1}=0
i77pSHOWCOLLATZLENGTH(i77display,SEED{level 1}-1,HIGHEST{level 1})
HIGHEST{level 1}=0
i77pSHOWCOLLATZLENGTH(i77display,SEED{level 1},HIGHEST{level 1})
HIGHEST{level 1}=0
i77pSHOWCOLLATZLENGTH(i77display,SEED{level 1}+1,HIGHEST{level 1})
end of program