FINDS ALL PRIME NUMBERS LESS THAN GIVEN METHOD IS TO FILL ODD LOCATIONS IN % C ARRAY A WITH ONE AND THEN DELETE MULTIPLES OF ALL POSSIBLE % C FACTORS READ(GIVEN); !OBTAIN DATA %BEGIN %INTEGER I, SQ, TAB %BYTEINTEGERARRAY A(2:GIVEN - 1) A(2) = 1; !SPECIAL CASE ONLY EVEN PRIME %CYCLE I = 3, 1, GIVEN - 1 %IF I&I = 0 %THEN A(I) = 0 %ELSE A(I) = 1 %REPEAT ! I = 3 %WHILE I < MAX FACTOR(GIVEN) %CYCLE %IF A(I)#0 %THEN %START SQ = I2 %WHILE SQ < GIVEN %CYCLE A(SQ) = 0; !THIS NUMBER NOT PRIME SQ = SQ + 2*I %REPEAT %FINISH I = I + 2 %REPEAT ! NOW PRINT OUT ANSWERS AT TEN % C TO A LINE ! PRINTSTRING('PRIMES LESS THAN ') WRITE(GIVEN,4) NEWLINES(2) ! TAB = 0 %CYCLE I = 2, 1, GIVEN; % C !ERROR. SHOULD BE 'GIVEN - 1' %IF A(I)#0 %THEN %START WRITE(I,5) TAB = TAB + 1 %IF TAB = 10 %THEN %START TAB = 0 NEWLINE %FINISH %FINISH %REPEAT %END; !OF INNER BLOCK %INTEGERFN MAX FACTOR(%INTEGER N) ! !RETURNS ANSWER SUCH THAT % C (ANSWER - 1)2 < = N < ANSWER2 ! %INTEGER I I = 1 %WHILE I2 < = N %THEN I = I + 1 %RESULT = I %END; !OF INTEGER FUNCTION MAX FACTOR %ENDOFPROGRAM When this program is run with a datum of 99 the following output is obtained. PRIMES LESS THAN 99 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 MONITOR ENTERED FROM IMP ARRAY BOUND FAULT 99 ENTERED FROM LINE 41 OF BLOCK STARTING AT LINE 12 LOCAL VARIABLES TAB = 5 SQ = 105 I = 99 ENTERED FROM LINE 12 OF BLOCK STARTING AT LINE 1 LOCAL VARIABLES SQ = NOT ASSIGNED GIVEN = 99 STOPPED AT LINE 41 Appendix 2 The object code produced for an optimising compilation of a piece of IMP. given integer i, j, k, n integer array a(0:100), b(0:n) then the code produced for cycle i = 1, 1, n j = j + a(i) k = k + b(i + 1) repeat is as follows USING STACKFRAME, 9 USING CODEBASE, 10 *PROLOGUE TO THE CYCLE L 4,A80 SET GR4 TO POINT AT DYNAMIC ARRAY B L 5,K ASSIGN K TO GR5 LA 6,1 ASSIGN INCREMENT TO GR6 L 7,N AND FINAL VALUE(N) TO GR7 L 8,J ASSIGN J TO GR8 LA 1,1 ASSIGN I TO GR1 AND SET TO 1 END OF PROLOGUE=START OF CYCLE BODY CYCO1 LR 2,1 SLL 2,2 SET GR2 = 4I A 8,A(2) J = J + A(I) STATIC ARRAY A IS IN STACKFRAME (UNLIKE B) A 5,4(2,4) K = K + B(I + 1) BXLE 1, 6, CYCO1 REPEAT *CYCLE EPILOGUE ASSUMING ALL REGISTERS NEED TO BE UNSET *I.E. NEXT STATEMENT IS BRANCH OR ROUTINE CALL. ST 5,K RETURN K TO STORE ST 8,J RETURN J TO STORE ST 7,I SET I TO FINAL VALUE This code is not the optimum possible since it is possible to rearrange the cycle so that it is of the form cycle [MATH: i=4,4n i = 4, 4 * n :MATH] i=4,4∗n this saves a LR and SLL in the innerloop at the expense of more in the prologue and epilogue. References BRATLEY, P., REES, D. J., SCHOFIELD, P. D. A., and WHITFIELD, H. (1965). Atlas Autocode Compiler for KDF9, Edinburgh University Computer Unit Report No. 4. BROOKER, R. A., ROHL, J. S., and CLARK, S. R. (1966). The main feature of Atlas Autocode, The Computer Journal, Vol. 8, pp. 303-310. DIJKSTRA, E. W. (1970). Notes on Structural Programming, Technical University of Eindhoven Report No. 70-WSK-03. MILLARD, G. E., REES, D. J., and WHITFIELD, H. (1973). The Standard EMAS Subsystem, The Computer Journal (to be published). PAVELIN, C. J. (1970). The improvement of program behaviour in paged computer systems, Edinburgh University Ph.D. Thesis. REES, D. J. (1973). The EMAS Director, The Computer Journal (to be published). WHITFIELD, H., and WIGHT, A. S. (1973). EMAS—The Edinburgh Multi-Access System, The Computer Journal, Vol. 16, No. 4, pp. 331-346. YARWOOD, J. K. (1970). Towards machine independent processors. The Computer Bulletin, Vol. 14, No. 7, pp. 219-221.