& I/O ROUTINES FOR PL-516
.ORIGIN '1000;
.COMPCONST ZEROSYMBOL = '260,
NINESYMBOL = '271, MINUSSIGN = '255,
SPACE = '240, CR = '215,
LF = '212, ERASE = '377;
.PROCEDURE INCHAR;
.BEGIN
L:%OCP,1;
%INA,'1001;
%JMP,*-1;
%OCP,'101;
.WHEN @ .Z .THEN
.GOTO L;
.WHEN @ = ERASE .THEN
.GOTO L;
@ := @ .AND '177 .NEV '200;
.END;
@.PROCEDURE OUT1;
.BEGIN
%SKS,'104;
%JMP,*-1;
%OCP,'104;
%OTA,4;
%JMP,*-1;
.END;
.PROCEDURE NEWLINE;
.BEGIN
OUT1(CR);
OUT1(LF);
.END;
@ .CONDITIONAL .PROCEDURE DIGIT;
.BEGIN
.WHEN @ .LE NINESYMBOL .THEN
.WHEN @ .GE ZEROSYMBOL .THEN
.EXITTRUE;
.END;
.PROCEDURE READ;
.INTEGER N,M,MINUS;
.BEGIN
MINUS := .Z;
MORE:
.IF DIGIT(INCHAR) .THEN
N := @ - ZEROSYMBOL
.ELSE
.BEGIN
.WHEN @ = MINUSSIGN .THEN
MINUS := -1;
.GOTO MORE;
.END;
.WHILE DIGIT(INCHAR) .DO
.BEGIN
M := @ - ZEROSYMBOL;
N := N .SHSLA 3 + N + N + M;
.END;
@:=.IF MINUS .Z .THEN N .ELSE .NEG N;
.END;
@ .PROCEDURE PRINT;
.INTEGER M;
.ARRAY P[5](10000,1000,100,10,1),
D[5];
.BEGIN
M := @;
.FOR # := -5 .DO
D[#] := .Z;
@ := .ABS M;
.FOR # := -5 .DO
.BEGIN
.WHILE @ .GE P[#] .DO
.BEGIN
@ := @ - P[#];
%IRS*D;
.END;
.END;
NEWLINE;
OUT1(.IF M .LZ .THEN MINUSSIGN .ELSE SPACE);
.FOR # := -5 .DO
OUT1(D[#] + ZEROSYMBOL);
.END;
& PROGRAM TO SORT NUMBERS INTO ASCENDING ORDER
.INTEGER I,
J,
T,
MARK;
.CONSTANT SIZE = -20;
.ARRAY A[SIZE];
.ORIGIN '2000;
.BEGIN
.FOR I := SIZE .DO
A[I] := READ;
AGAIN:
MARK := .Z;
.FOR I := SIZE + 1 .DO
.BEGIN
J := I - 1;
.WHEN A[I] < A[J] .THEN
.BEGIN
T := A[I];
A[I] := A[J];
A[J] := T;
MARK := -1;
.END;
.END;
.WHEN MARK .LZ .THEN
.GOTO AGAIN;
.FOR I := SIZE .DO
PRINT(A[I]);
.END;