80 lines
1.8 KiB
Text
80 lines
1.8 KiB
Text
100H:
|
|
BDOS: PROCEDURE (F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
|
|
EXIT: PROCEDURE; GO TO 0; END EXIT;
|
|
PR$CHAR: PROCEDURE (C); DECLARE C BYTE; CALL BDOS(2,C); END PR$CHAR;
|
|
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
|
|
|
|
PR$NUM: PROCEDURE (N, WIDTH);
|
|
DECLARE N ADDRESS, WIDTH BYTE;
|
|
DECLARE S (6) BYTE INITIAL ('.....$');
|
|
DECLARE P ADDRESS, DG BASED P BYTE;
|
|
P = .S(5);
|
|
DIGIT:
|
|
P = P - 1;
|
|
DG = '0' + N MOD 10;
|
|
IF WIDTH > 0 THEN WIDTH = WIDTH - 1;
|
|
IF (N := N / 10) > 0 THEN GO TO DIGIT;
|
|
CALL PRINT(P);
|
|
DO WHILE WIDTH > 0;
|
|
CALL PR$CHAR(' ');
|
|
WIDTH = WIDTH - 1;
|
|
END;
|
|
END PR$NUM;
|
|
|
|
DECLARE MAX$SIGMA LITERALLY '10$001';
|
|
DECLARE SIGMA (MAX$SIGMA) ADDRESS;
|
|
CALC$SIGMA: PROCEDURE;
|
|
DECLARE (I, J) ADDRESS;
|
|
DO I = 1 TO MAX$SIGMA-1;
|
|
SIGMA(I) = 0;
|
|
END;
|
|
DO I = 1 TO MAX$SIGMA-1;
|
|
DO J = I TO MAX$SIGMA-1 BY I;
|
|
SIGMA(J) = SIGMA(J) + I;
|
|
END;
|
|
END;
|
|
END CALC$SIGMA;
|
|
|
|
GCD: PROCEDURE (X, Y) ADDRESS;
|
|
DECLARE (X, Y, Z) ADDRESS;
|
|
DO WHILE Y > 0;
|
|
Z = X MOD Y;
|
|
X = Y;
|
|
Y = Z;
|
|
END;
|
|
RETURN X;
|
|
END GCD;
|
|
|
|
DUFF: PROCEDURE (N) BYTE;
|
|
DECLARE N ADDRESS;
|
|
RETURN SIGMA(N) > N+1 AND GCD(N, SIGMA(N)) = 1;
|
|
END DUFF;
|
|
|
|
DUFF$TRIPLE: PROCEDURE (N) BYTE;
|
|
DECLARE N ADDRESS;
|
|
RETURN DUFF(N) AND DUFF(N+1) AND DUFF(N+2);
|
|
END DUFF$TRIPLE;
|
|
|
|
DECLARE N ADDRESS, I BYTE;
|
|
|
|
CALL CALC$SIGMA;
|
|
CALL PRINT(.('FIRST 50 DUFFINIAN NUMBERS:',13,10,'$'));
|
|
N = 0;
|
|
DO I = 1 TO 50;
|
|
DO WHILE NOT DUFF(N := N+1); END;
|
|
CALL PR$NUM(N, 4);
|
|
IF I MOD 10 = 0 THEN CALL PRINT(.(13,10,'$'));
|
|
END;
|
|
|
|
CALL PRINT(.(13,10,'FIRST 15 DUFFINIAN TRIPLES:',13,10,'$'));
|
|
N = 0;
|
|
DO I = 1 TO 15;
|
|
DO WHILE NOT DUFF$TRIPLE(N := N+1); END;
|
|
CALL PR$NUM(N, 6);
|
|
CALL PR$NUM(N+1, 6);
|
|
CALL PR$NUM(N+2, 6);
|
|
CALL PRINT(.(13,10,'$'));
|
|
END;
|
|
|
|
CALL EXIT;
|
|
EOF
|