.COMPCONST START = '10000;
.ORIGIN START+'4;
.GLOBAL '500;
.FORWARD .PROCEDURE MAIN;
.BLOCK
.INTEGER P, LOW, HIGH, THIGH, COUNT, SUMCHECK;
.ARRAY A[0];
.ARRAY BOOT[33](
'020,
'002010, & 20 JMP 10
'140040, & 21 CRA
'020042, & 22 JST 42
'101040, & 23 SNZ
'002022, & 24 JMP 22
'020042, & 25 JST 42
'010020, & 26 STA 20
'010060, & 27 STA 60
'020051, & 30 JST 51
'010000, & 31 STA 0
'020051, & 32 JST 51
'110060, & 33 STA*60
'024000, & 34 IRS 0
'002032, & 35 JMP 32
'020051, & 36 JST 51
'024020, & 37 IRS 20
'000002, & 40 HLT
'002021, & 41 JMP 21
'000002, & 42
'141240, & 43 ICR
'030001, & 44 OCP 1
'130001, & 45 INA 1
'002045, & 46 JMP 45
'030101, & 47 OCP 101
'102042, & 50 JMP*42
'000002, & 51
'020042, & 52 JST 42
'020042, & 53 JST 42
'026020, & 54 IMA 20
'014020, & 55 ADD 20
'026020, & 56 IMA 20
'102051 & 57 JMP*51
);
@ .CONDITIONAL .PROCEDURE CR;
.BEGIN
.WHEN @ = '215 .THEN .EXITTRUE;
.END;
@ .CONDITIONAL .PROCEDURE DIGIT;
.BEGIN
.WHEN @ .RANGE '260 .TO '267 .THEN .EXITTRUE;
.END;
.COMPCONST LINESIZE = -20, QUERYSYMBOL = '277, ARROW = '337;
.ARRAY LINE[LINESIZE];
@ .PROCEDURE PUNCH;
.BEGIN
%OTA, 2;
%JMP, *-1;
.END;
@ .PROCEDURE PUNCHWORD;
.INTEGER K;
.BEGIN
K := @;
SUMCHECK := SUMCHECK - K;
PUNCH(.SWOP K);
PUNCH(K);
.END;
@ .PROCEDURE LEADER;
.INTEGER I;
.BEGIN;
.FOR I := @ .DO PUNCH(.Z);
.END;
@ .PROCEDRUE OUT;
.BEGIN
%SKS, '104; %JMP, *-1;
%OCP, '104;
%OTA, 4; %JMP, *-1;
.END;
.PROCEDURE NEWLINE;
.BEGIN
OUT('215); OUT('212);
.END;
.PROCEDURE INCHAR;
.BEGIN
L:
%SKS, '104; %JMP, *-1;
%OCP, 4;
%INA, '1004; %JMP, *-1;
@ := @ .AND '177 .NEV '200;
.WHEN CR(@) .THEN .EXIT;
.UNLESS @ .RANGE '240 .TO '337 .THEN .GOTO L;
.END;
.PROCEDURE NUMBER;
.INTEGER N;
.BEGIN
N := .Z;
.WHILE DIGIT(LINE[P]) .DO
.BEGIN
@ := LINE[P] .SHDRL 3;
N := N .SHDLL 3;
%IRS, P;
.END;
@ := N;
%IRS, P; %NOP;
.END;
.PROCEDURE MAIN;
.BEGIN
LEADER(-100);
.FOR # := -33 .DO
PUNCHWORD(BOOT[#]);
LEADER(-20);
NEWSEGMENT:
NEWLINE;
OUT(QUERYSYMBOL);
.FOR # := LINESIZE .DO
.BEGIN
LINE[#] := INCHAR;
.WHEN CR(@) .THEN .GOTO OK;
.WHEN @ = '241 .THEN INDEX := INDEX - 2;
.END;
OK:
P := LINESIZE;
.WHEN LINE[P] = ARROW .THEN
.BEGIN
PUNCHWORD('40041);
PUNCHWORD(-2);
PUNCHWORD('102040);
%IRS, P;
PUNCHWORD(NUMBER);
LEADER(-100);
NEWLINE;
%HLT;
.END;
LOW := NUMBER;
HIGH := NUMBER;
.WHILE HIGH > LOW .DO
.BEGIN
.IF HIGH - 99 > LOW .THEN
.BEGIN
COUNT := -100;
THIGH := LOW + 100;
.END .ELSE
.BEGIN
COUNT := LOW - HIGH -1;
THIGH := HIGH + 1;
.END;
SUMCHECK := -1;
LOW := THIGH;
@ := @ + '40000;
%STA, A; PUNCHWORD(@);
PUNCHWORD(COUNT);
.FOR # := COUNT .DO
PUNCHWORD(A[#]);
PUNCHWORD(SUMCHECK);
LEADER(-12);
.END;
.GOTO NEWSEGMENT;
.END;
.ENDBLOCK;
.ORIGIN START;
.BEGIN
MAIN;
.END;