100H: /* FIND SOME SEMI-PRIMES - NUMBERS WITH EXACTLY 2 PRIME FACTORS */ /* CP/M BDOS SYSTEM CALL AND I/O ROUTINES */ BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END; PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END; PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END; PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */ DECLARE N ADDRESS; DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE; V = N; W = LAST( N$STR ); N$STR( W ) = '$'; N$STR( W := W - 1 ) = '0' + ( V MOD 10 ); DO WHILE( ( V := V / 10 ) > 0 ); N$STR( W := W - 1 ) = '0' + ( V MOD 10 ); END; CALL PR$STRING( .N$STR( W ) ); END PR$NUMBER; /* TASK */ /* RETURNS TRUE IF V IS SEMI-PRIME, FALSE OTHERWISE */ IS$SEMI$PRIME: PROCEDURE( V )BYTE; DECLARE V ADDRESS; DECLARE ( A, B, C ) ADDRESS; A = 2; B = 0; C = V; DO WHILE B < 3 AND C > 1; IF C MOD A = 0 THEN DO; C = C / A; B = B + 1; END; ELSE A = A + 1; END; RETURN B = 2; END IS$SEMI$PRIME; DECLARE X ADDRESS; DO X = 2 TO 99; IF IS$SEMI$PRIME( X ) THEN DO; CALL PR$NUMBER( X ); CALL PR$CHAR( ' ' ); END; END; EOF