!!! ====================================================================
!!! Compute the Fibonacci series in Bliss-36 on TOPS-20, including the
!!! ratios of successive terms, and their differences from the golden
!!! ratio, with floating-point computating in single precision
!!! (F-floating) format.
!!! [26-Jun-2007]
!!! ====================================================================

MODULE FIBMOD(MAIN = FIBONACCI) =
    BEGIN
	REQUIRE 'TUTIO';

	ROUTINE TTY_PUT_FLT(value) : NOVALUE =
	BEGIN
	    BUILTIN JSYS;
	    LITERAL
		FLOUT = %O'233',
		PRIOU = %O'101';
	    REGISTER
		AC1 = 1,
		AC2 = 2,
		AC3 = 3;
	    AC1 = PRIOU;
	    AC2 = ..value;
	    AC3 = %O'024034070700';
	    JSYS(2, FLOUT, AC1, AC2, AC3);	! print value
	END;

	ROUTINE FIBONACCI : NOVALUE =
	BEGIN
	    BUILTIN CVTIF, DIVF, SUBF;
	    LITERAL
		    HT = %C'	',
		    SPACE = %C' ';
	    LOCAL den, diff, fk, fkm1, fkm2, k, num, ratio;
	    OWN golden_ratio : INITIAL(%E'1.61803398874989484');

	    TTY_PUT_QUO('Fibonacci series in Bliss-36 [F-floating computation]:');
	    TTY_PUT_CRLF();

	    k = 1;
	    fkm2 = 1;

	    TTY_PUT_CHAR(HT);
	    TTY_PUT_INTEGER(.k, 10, 5);
	    TTY_PUT_CHAR(SPACE);
	    TTY_PUT_INTEGER(.fkm2, 10, 15);
	    TTY_PUT_CRLF();

	    k = 2;
	    fkm1 = 1;

	    TTY_PUT_CHAR(HT);
	    TTY_PUT_INTEGER(.k, 10, 5);
	    TTY_PUT_CHAR(SPACE);
	    TTY_PUT_INTEGER(.fkm1, 10, 15);
	    TTY_PUT_CRLF();

	    INCR k FROM 3 TO 100 DO
	    BEGIN
		fk = .fkm1 + .fkm2;			! Fibonacci recursion

		IF (.fk LSS 0) THEN EXITLOOP;		! wrap to negative means integer overflow

		CVTIF(fk, num);
		CVTIF(fkm1, den);
		DIVF(den, num, ratio);			! ratio = fk/fkm1
		SUBF(golden_ratio, ratio, diff);	! diff = ratio - golden_ratio

		fkm2 = .fkm1;
		fkm1 = .fk;

		TTY_PUT_CHAR(HT);
		TTY_PUT_INTEGER(.k, 10, 5);
		TTY_PUT_CHAR(SPACE);
		TTY_PUT_INTEGER(.fk, 10, 15);

		TTY_PUT_CHAR(SPACE);

		TTY_PUT_FLT(ratio);
		TTY_PUT_CHAR(SPACE);

		TTY_PUT_FLT(diff);
		TTY_PUT_CRLF();
	    END;
	END;
    END
ELUDOM
