& PRIME NUMBER SQUARE
.INTEGER I, J, K, START, SQUARESIZE, SQR2,
SIDE, STEP;
.COMPCONST CR='215, LF='212, MAXTABLESIZE=-18;
.TABLE SQ .LATER;
.STRING STARTPROG = /PRIME NUMBER SQUARE./;
@ .PROCEDURE TYPE;
.BEGIN
%SKS,'104; %JMP,*-1; %OCP,'104;
%OTA,4; %JMP,*-1;
.END;
@ .PROCEDURE TYPE2;
.BEGIN
TYPE(.SWOP @);
TYPE(.SWOP @);
.END;
.PROCEDURE NEWLINE;
TYPE2(<CR, LF>);
@ .PROCEDURE OUTSTRING;
.INTEGER P;
.ARRAY STRING[0];
.BEGIN
%STA, STRING;
.FOR P := .Z .DO
.BEGIN
INDEX := P .SHSRA 1;
@ := STRING[#];
.UNLESS .CSET .THEN %ICA;
.WHEN .CLEFT @ = $$. .THEN .EXIT;
TYPE(@);
.END;
.END;
.PROCEDURE INCHAR;
.BEGIN
%SKS,'104; %JMP,*-1; %OCP,4;
%INA,'1004; %JMP,*-1;
.END;
@ .CONDITIONAL .PROCEDURE PRIME NUMBER;
.COMPCONST NOPRIMES = -12;
.ARRAY PRIME[NOPRIMES](2, 3, 5,
7, 11, 13, 17, 19, 23, 29, 31, 37);
.ARRAY PRIMESqUARES[NOPRIMES](2, 4, 9, 25, 49,
121, 169, 289, 381, 529, 841, 961);
.INTEGER NUMBER;
.BEGIN
NUMBER := @;
.FOR # := NOPRIMES .DO
.BEGIN
.WHEN NUMBER .LE PRIMESQUARE[#]
.THEN .EXITTRUE;
.WHEN NUMBER/PRIME[#] * PRIME[#]
= NUMBER .THEN .EXITFALSE;
.END;
.END;
.PROCEDURE READNUMBER;
.INTEGER N;
.BEGIN
N := .Z;
.WHILE INCHAR .RANGE $$0 .TO $$9 .DO
N := @ - $$0 + (N * 10);
@ := N;
.END;
@ .PROCEDURE PRINTNUMBER;
.INTEGER N;
.ARRAY POWER[3](100, 10, 1);
.BEGIN
N := @;
TYPE($$ );
.WHEN N .Z .THEN
.BEGIN
TYPE2($ );
TYPE($$0);
.EXIT;
.END;
.FOR # := -3 .DO
.IF N .GE POWER[#] .THEN .GOTO DIGIT
.ELSE TYPE($$ );
DIGIT:
TYPE(N/POWER[#] + $$0);
N := .B;
%IRS, 0;
.GOTO DIGIT;
.END;
.ORIGIN 0;
.SET SQ[MAXTABLESIZE, MAXTABLESIZE];
.ORIGIN '1000;
.BEGIN
NEWLINE;
OUTSTRING(.CODEWORD STARTPROG);
REPEAT:
NEWLINE;
OUTSTRING("STARTING FROM .");
START := READNUMBER;
NEWLINE;
OUTSTRING("SIZE OF SQUARE .");
SQUARESIZE := .NEG READNUMBER .SHSRA 1;
SQR2 := @ .SHSLA 1;
.WHEN @ * SQR2 + START > 1000
.OR SQR2 < MAXTABLESIZE .THEN
.BEGIN
NEWLINE;
OUTSTRING("TOO BIG.");
.GOTO REPEAT;
.END;
I, J := SQUARESIZE;
STEP := -1;
SIDE := -4;
MORE:
.FOR K := STEP .DO
.BEGIN
SQ[I, J] := START;
%IRS, START;
.CASE SIDE .OF ( I := I - 1,
J := J - 1,
.BEGIN
%IRS, I; %SKP;
.GOTO FINISH;
.END,
%IRS, J);
.END;
%IRS, SIDE; .GOTO OK;
SIDE := -4;
OK:
.WHEN SIDE .EVEN .THEN STEP := STEP - 1;
.GOTO MORE;
FINISH:
NEWLINE;
NEWLINE;
.FOR I := -1 .STEPDOWN -1 .UNTIL SQR2 .DO
.BEGIN
NEWLINE;
.GET SQ[I];
.FOR J := SQR2 .DO
.IF PRIMENUMBER(SQ[#,J]) .THEN
PRINTNUMBER(SQ[#,J]) .ELSE
.BEGIN
TYPE2($ );
TYPE2($* );
.END;
NEWLINE;
.END;
.END;