69 lines
1.6 KiB
Plaintext
69 lines
1.6 KiB
Plaintext
100H:
|
|
BDOS: PROCEDURE(F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
|
|
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
|
|
PRINT$CH: PROCEDURE(C); DECLARE C BYTE; CALL BDOS(2,C); END PRINT$CH;
|
|
PRINT$STR: PROCEDURE(S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT$STR;
|
|
|
|
/* PRINT NUMBER */
|
|
PRINT$NUM: PROCEDURE(N);
|
|
DECLARE (N, P) ADDRESS, C BASED P BYTE;
|
|
DECLARE S(6) BYTE INITIAL('.....$');
|
|
P = .S(5);
|
|
DIGIT:
|
|
P = P-1;
|
|
C = '0' + N MOD 10;
|
|
N = N/10;
|
|
IF N>0 THEN GO TO DIGIT;
|
|
CALL PRINT$STR(P);
|
|
END PRINT$NUM;
|
|
|
|
/* IS X IN THE FIRST N TERMS OF THE SEQUENCE */
|
|
FIND: PROCEDURE(SEQ,X,N) BYTE;
|
|
DECLARE SEQ ADDRESS, (I, X, N, A BASED SEQ) BYTE;
|
|
DO I=0 TO N-1;
|
|
IF A(I)=X THEN RETURN 0FFH;
|
|
END;
|
|
RETURN 0;
|
|
END FIND;
|
|
|
|
/* GENERATE THE N'TH TERM OF THE SEQUENCE */
|
|
GENERATE: PROCEDURE(SEQ,N) BYTE;
|
|
DECLARE SEQ ADDRESS, (N, A BASED SEQ) BYTE;
|
|
IF N=0 THEN
|
|
A(N)=0;
|
|
ELSE DO;
|
|
DECLARE (SUB, ADD) BYTE;
|
|
SUB = A(N-1) - N;
|
|
ADD = A(N-1) + N;
|
|
/* A(N-1) - N NEGATIVE? */
|
|
IF A(N-1) <= N THEN
|
|
A(N) = ADD;
|
|
/* A(N-1) - N ALREADY GENERATED? */
|
|
ELSE IF FIND(SEQ,SUB,N) THEN
|
|
A(N) = ADD;
|
|
ELSE
|
|
A(N) = SUB;
|
|
END;
|
|
RETURN A(N);
|
|
END GENERATE;
|
|
|
|
DECLARE I BYTE, A(30) BYTE;
|
|
CALL PRINT$STR(.'FIRST 15 MEMBERS: $');
|
|
DO I=0 TO 14;
|
|
CALL PRINT$NUM(GENERATE(.A, I));
|
|
CALL PRINT$CH(' ');
|
|
END;
|
|
CALL PRINT$STR(.(13,10,'FIRST REPEATED TERM: A($'));
|
|
|
|
I=15;
|
|
DO WHILE NOT FIND(.A, GENERATE(.A, I), I);
|
|
I = I+1;
|
|
END;
|
|
|
|
CALL PRINT$NUM(I);
|
|
CALL PRINT$STR(.') = $');
|
|
CALL PRINT$NUM(A(I));
|
|
CALL PRINT$STR(.(13,10,'$'));
|
|
CALL EXIT;
|
|
EOF
|