Trailing-Edge
-
PDP-10 Archives
-
decuslib10-01
-
43,50205/algol1.met
There are 2 other files named algol1.met in the archive. Click here to see a list.
00100 .SYNTAX ALGOLW
00200
00300 .INTERNAL AC,ARGCT,ARGNUM,STATEMENT,ENDBLK,STRTMP,REFTMP
00400 .EXTERNAL FORST,CASEST,WHILEST,IFST,INTASSI,REFASSI,STRASSI
00500 .EXTERNAL BUILTIN,INTEXPR,BLTINPROC,ARGGET
00600
00700 .INTEGER UNLBL,ARGCT,I,AC,STRTMP,REFTMP
00800
00900 .COMMENT DICTIONARY FLAGS: 1-STRING, 2-USES DOPE VECTOR;
01000 .COMMENT 3-INTEGER, 4-REFERENCE, 5-RECORD, 6-FIELD, 7-ARRAY;
01100 .COMMENT 8-LABEL, 9-PROCEDURE, 10-PARAMETER, 11-ONE DIMENSION;
01200 .COMMENT 12-TWO DIMENSIONS, 13-SCALAR, 14-LABEL USED IN HIGHER LEVEL BLOCK;
01300 .COMMENT 15-BLOCK VARIABLE, 16-UNALLOCATED RECORD VARIABLE;
01400 .COMMENT 17-DEFINED LABEL, 18-20-PARAMETER NUMBER, 21-CONTROL VARIABLE;
01500 .COMMENT 22-STRING TEMPORARY, 23-EXTERNAL PROCEDURE CALLED, 24-BITS;
01600 .COMMENT 25-BUILT IN PROCEDURE, 26-34-INDICATES WHICH PROCEDURE;
01700 .COMMENT 35-BOOLEAN, 36-VARIABLE LENGTH STRING;
01800 .COMMENT 26-ALSO USED TO INDICATE CONTROL VARIABLE IN USE;
01900
02000 STRDEC: .PEEK("STRING" "(") (.NUMBER .IF(*.NE.0) %1 / "*" #1"0") ")"
02100 ("ARRAY " ^1%1 .IF(*.NE.0) ARRAYDEC .SET 1
02200 .OUT("MOVSI"-"(POINT 7,0)")
02300 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
02400 .OUT("ASTRA"-"^D"^1*",$"B#"."S#"("^3%3*")")
02500 /.ID .ENTERC .SET 1 .SET 2 .SET 13 ^1%1 (.IF(*.EQ.0) .SET 36/.EMPTY)
02600 .OUT("MOVSI"-"(POINT 7,0)")
02700 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
02800 ^1 (.IF(*.NE.0) .OUT("MOVSI"-"^D"*)
02900 .OUT("MOVEM"-"$"B#"."S#"+1("^3%3*")")
03000 .OUT("ASTRG"-"$"B#"."S#"("^3%3*")")/.EMPTY ))/
03100 .PEEK("BITS" "(") (.NUMBER .IF(*.NE.0) %1 / "*" #1"0") ")"
03200 ("ARRAY " ^1%1 .IF(*.NE.0) ARRAYDEC .SET 1 .SET 24
03300 .OUT("MOVSI"-"(POINT 1,0)")
03400 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
03500 .OUT("ASTRA"-"^D"^1*",$"B#"."S#"("^3%3*")")
03600 /.ID .ENTERC .SET 1 .SET 2 .SET 13 .SET 24 ^1%1 (.IF(*.EQ.0) .SET 36/.EMPTY)
03700 .OUT("MOVSI"-"(POINT 1,0)")
03800 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
03900 ^1 (.IF(*.NE.0) .OUT("MOVSI"-"^D"*)
04000 .OUT("MOVEM"-"$"B#"."S#"+1("^3%3*")")
04100 .OUT("ASTRG"-"$"B#"."S#"("^3%3*")")/.EMPTY ));
04200
04300 INTDEC: "INTEGER "
04400 ("ARRAY " #1"1" ARRAYDEC .SET 3
04500 .OUT("MOVSI"-"(POINT ^D36,0)")
04600 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
04700 .OUT("AARRY"-"^D"^1*",$"B#"."S#"("^3%3*")")
04800 /.ID .ENTERC .SET 13 .SET 3);
04900
05000 REFDEC: (.PEEK("REFERENCE" "(") .ID *("," .ID) ")"/"REFERENCE ")
05100 ("ARRAY " #1"1" ARRAYDEC .SET 4
05200 .OUT("MOVSI"-"(POINT ^D36,0)")
05300 .OUT("MOVEM"-"$"B#"."S#"("^3%3*")")
05400 .OUT("RARRY"-"^D"^1*",$"B#"."S#"("^3%3*")")
05500 /.ID .ENTERC .SET 13 .SET 4);
05600
05700 ARRAYDEC: .ID .ENTERC .SET 2 .SET 7 %2
05800 .OUT("MOVSI"-^1"^D"*)
05900 .OUT("MOVEM"-"$"B#"."S#"+1("^3%3*")")
06000 "(" [AC:=-1] INTEXPR ^2%2 .LOOKC "::"
06100 .OUT("MOVEM"-"$"B#"."S#"+3("^3%3*")")
06200 [AC:=-1] INTEXPR ^2%2 .LOOKC
06300 .OUT("MOVEM"-"$"B#"."S#"+4("^3%3*")")
06400 ("," .SET 12 [AC:=-1] INTEXPR ^2%2 .LOOKC
06500 "::" .OUT("MOVEM"-"$"B#"."S#"+6("^3%3*")")
06600 [AC:=-1] INTEXPR ^2%2 .LOOKC ")"
06700 .OUT("MOVEM"-"$"B#"."S#"+7("^3%3*")")
06800 #1"2" /")" .SET 11 #1"1") ^2;
06900
07000 ENDBLK: .OUT("XWD"-"0,0") .OUT("XWD"-"^D"CL#"-1,[ASCIZ/"^1%1*"/]")
07100 .SETSCAN [*:=CL#+2] %1 %2 #3"" #3"0"
07200 *(.SCAN
07300 (.CHECK 13 SET (.CHECK 4 SET (.CHECK 15 SET
07400 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+1] %1
07500 ^2 [*:=*+1] %2 /.EMPTY)/.EMPTY)/.EMPTY))
07600 .SETSCAN
07700 *(.SCAN
07800 (.CHECK 2 SET (.CHECK 15 SET ^3 (.IF(*.GT.0) +#3","/.EMPTY) %3 (.CHECK 11 SET
07900 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+5] %1
08000 ^3 [*:=*+1] +#3"1" %3/.CHECK 12 SET
08100 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+8] %1
08200 ^3 [*:=*+1] +#3"2" %3/.EMPTY
08300 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+2] %1
08400 ^3 [*:=*+1] +#3"0" %3)/.EMPTY)/.EMPTY))
08500 .SETSCAN
08600 *(.SCAN
08700 (.CHECK 13 SET (.CHECK 3 SET (.CHECK 15 SET
08800 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+1] %1
08900 /.EMPTY)/.EMPTY)/.CHECK 21 SET
09000 .OUT("$"B#"."S#"="-^1"^D"*)
09100 [*:=*+3] %1/.EMPTY))
09200 .LABEL("$"C#".R")
09300 .OUT("XWD"-^1"^D"*",[ASCIZ/PROCESS/]")
09400 .OUT("XWD"-^2"^D"*",^D"^3*)
09500 (.IF(*.GT.0) .OUT("BYTE"-"(4) "^3*)/.EMPTY ^3)
09600 TRACE .SETSCAN [UNLBL:=0]
09700 *(.SCAN (.CHECK 8 SET (.CHECK 17 CLEAR
09800 %1 #2"$" #3"$" [*:=B#] +%2 +%3 +#2"." +#3"$" [*:=S#]
09900 +%2 +%3 [UNLBL:=UNLBL+1]/.EMPTY)/.EMPTY)) .END
10000 *(.IF(UNLBL.GT.0) [UNLBL:=UNLBL-1] ^1 .ENTERC
10100 (.CHECK 17 SET .LABEL(^2*) .LABEL(^3*)
10200 .OUT("MOVE"-"%B,^D"CL#"+2(%B)") .OUT("JRST"-"$"B#"."S#)
10300 /.EMPTY .SET 8 .SET 14 .LABEL(^2*) .LABEL(^3*) .OUT("JRST"-"$"B#"$"S#)));
10400
10500 RECSCAN: .SETSCAN #1"0" #2"0" #3"" #3"0"
10600 *(.SCAN
10700 (.CHECK 13 SET (.CHECK 4 SET (.CHECK 16 SET
10800 .CLEAR 16 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+1] %1
10900 ^2 [*:=*+1] %2 /.EMPTY)/.EMPTY)/.EMPTY))
11000 .SETSCAN
11100 *(.SCAN
11200 (.CHECK 2 SET (.CHECK 16 SET ^3 (.IF(*.GT.0) +#3","/.EMPTY) %3 (.CHECK 11 SET
11300 .CLEAR 16 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+5] %1
11400 ^3 [*:=*+1] +#3"1" %3/.CHECK 12 SET
11500 .CLEAR 17 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+8] %1
11600 ^3 [*:=*+1] +#3"2" %3/.EMPTY .CLEAR 16
11700 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+2] %1
11800 ^3 [*:=*+1] +#3"0" %3)/.EMPTY)/.EMPTY))
11900 .SETSCAN
12000 *(.SCAN
12100 (.CHECK 13 SET (.CHECK 3 SET (.CHECK 16 SET
12200 .CLEAR 16 .OUT("$"B#"."S#"="-^1"^D"*) [*:=*+1] %1
12300 /.EMPTY)/.EMPTY)/.EMPTY))
12400 ^1%3^1%1 .LOOKC .LABEL("$"B#"$"S#)
12500 .OUT("XWD"-^3"^D"*",[ASCIZ/"^1*"/]")
12600 .OUT("XWD"-^2"^D"*",^D"^3*)
12700 (.IF(*.GT.0) .OUT("BYTE"-"(4) "^3*)/.EMPTY ^3);
12800
12900 RECORD: "RECORD " .ID %1 .ENTERC .SET 5 "("
13000 .OUT("JRST"-*1) .LABEL("$"B#"."S#)
13100 .OUT("ARECD"-"%TB,$"B#"$"S#) #3"%TB"
13200 ((STRDEC/INTDEC/REFDEC) .SET 16 .SET 6/.PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";")
13300 *(";" ((STRDEC/INTDEC/REFDEC) .SET 16 .SET 6 /.PEEK("COMMENT"
13400 .NOT(-.ID)) "COMMENT" .UNTIL ";"))
13500 ")" ^3 .OUT("POPJ"-"%P,") RECSCAN .LABEL *1;
13600
13700 TRACE: .SETSCAN .OUT(";") .OUT(";BLOCK "C#" LEVEL "CL#" "^1%1*)
13800 *(.SCAN .OUT(";") .OUT(";SYMBOL: "*" = $"B#"."S#)
13900 (.CHECK 9 SET .OUT(";TYPE: PROCEDURE")/
14000 .CHECK 8 SET .OUT(";TYPE: LABEL")
14100 (.CHECK 17 CLEAR .OUT(";AS YET UNDEFINED")/.EMPTY)
14200 (.CHECK 14 SET .OUT(";USED AT HIGHER BLOCK LEVEL")/.EMPTY)/
14300 .CHECK 5 SET .OUT(";TYPE: RECORD")/
14400 .CHECK 21 SET .OUT(";TYPE: INTEGER CONTROL VARIABLE")/
14500 (.CHECK 1 SET (.CHECK 24 SET .OUT(";TYPE: BITS")/.EMPTY
14600 .OUT(";TYPE: STRING"))/.CHECK 3 SET .OUT(";TYPE: INTEGER")/
14700 .CHECK 35 SET .OUT(";TYPE: BOOLEAN") /
14800 .CHECK 4 SET .OUT(";TYPE: REFERENCE"))
14900 (.CHECK 11 SET .OUT(";ONE DIMENSIONAL ARRAY")/
15000 .CHECK 12 SET .OUT(";TWO DIMENSIONAL ARRAY")/.EMPTY)
15100 (.CHECK 36 SET .OUT(";VARIABLE LENGTH")/.EMPTY)
15200 (.CHECK 22 SET .OUT(";TEMPORARY")/.EMPTY)
15300 (.CHECK 6 SET .OUT(";RECORD FIELD")/
15400 .CHECK 10 SET ARGNUM [*:=ARGCT+1] .OUT(";PROCEDURE PARAMETER #"*)/
15500 .EMPTY))) .OUT(";");
15600
15700 ARGNUM: (.CHECK 18 SET [ARGCT:=4]/.EMPTY [ARGCT:=0])
15800 (.CHECK 19 SET [ARGCT:=ARGCT+2]/.EMPTY)
15900 (.CHECK 20 SET [ARGCT:=ARGCT+1]/.EMPTY);
16000
16100 BLOCK: "BEGIN " (.NOT(("INTEGER "/"REFERENCE("/"REFERENCE "/
16200 "STRING("/"STRING "/"RECORD("/"RECORD "/"BITS("/"BITS "/
16300 "PROCEDURE("/"PROCEDURE ")) STATEMENT *(";" STATEMENT) "END" .NOT(-.ID)/
16400 .BEGIN .OUT("BLOCK"-"$"C#".R") #3"%B"
16500 *(((STRDEC/INTDEC/REFDEC) .SET 15/RECORD/PROCEDURE/EXTERNAL) ";"/
16600 .PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";")
16700 STATEMENT *(";" STATEMENT) "END" .NOT(-.ID) .OUT("MOVE"-"%B,(%B)")
16800 ^3 .OUT("JRST"-*1) ENDBLK .LABEL *1);
16900
17000 PROCEDURE: "PROCEDURE " .ID .ENTERC .SET 9
17100 .OUT("JRST"-*1) SETPROC .LABEL *1;
17200
17300 SETPROC: %1 .LABEL("$"B#"."S#) .BEGIN
17400 ("(" [ARGCT:=0] ARG *(";" ARG) ")"/.EMPTY) ";"
17500 .OUT("PROC"-"$"C#".R")
17600 ("BEGIN " #3"%B" *(((STRDEC/INTDEC/REFDEC) .SET 15/RECORD/PROCEDURE/EXTERNAL) ";"/
17700 .PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";")
17800 STATEMENT *(";" STATEMENT) "END" .NOT(-.ID) ^3/STATEMENT)
17900 .OUT("PUSH"-"%P,1(%B)") .OUT("MOVE"-"%B,(%B)")
18000 .OUT("POPJ"-"%P,") ENDBLK ^1;
18100
18200 ARG: ("INTEGER " ("ARRAY " .ID .ENTERC .SET 3 ARRAYPARM /
18300 .ID .ENTERC .SET 3 .SET 13 .SET 10)/
18400 (.PEEK("REFERENCE" "(") .ID *("," .ID) ")"/"REFERENCE ") ("ARRAY " .ID .ENTERC .SET 4
18500 ARRAYPARM / .ID .ENTERC .SET 4 .SET 13 .SET 10)/
18600 .PEEK("STRING" "(") ("*"/.NUMBER) ")" ("ARRAY " .ID .ENTERC .SET 1 ARRAYPARM /
18700 .ID .ENTERC .SET 1 .SET 13 .SET 10)/
18800 .PEEK("BITS" "(") ("*"/.NUMBER) ")" ("ARRAY " .ID .ENTERC .SET 1 .SET 24
18900 ARRAYPARM /.ID .ENTERC .SET 1 .SET 13 .SET 10 .SET 24)/
19000 "PROCEDURE " .ID .ENTERC .SET 9 .SET 10)
19100 [I:=ARGCT] [ARGCT:=ARGCT+1]
19200 (.IF(I.GE.4) [I:=I-4] .SET 18/.EMPTY)
19300 (.IF(I.GE.2) [I:=I-2] .SET 19/.EMPTY)
19400 (.IF(I.GE.1) .SET 20/.EMPTY);
19500
19600 ARRAYPARM: .SET 7 .SET 10 "(" "*" ("," "*" .SET 12/.SET 11) ")";
19700
19800 STATEMENT: .PEEK(.ID ":" .NOT(-"=")) .ID ":" .ENTERC .SET 8 .SET 17
19900 (.CHECK 14 SET .OUT("JRST"-"$"B#"."S#) .LABEL("$"B#"$"S#)
20000 .OUT("MOVE"-"%B,^D"CL#"+2(%B)")/.EMPTY)
20100 .LABEL("$"B#"."S#) STATEMENT/[AC:=-1] [STRTMP:=1] [REFTMP:=1]
20200 *(.PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";")
20300 UNLBLST *(.PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";");
20400
20500 UNLBLST: BLOCK / GOTO / FORST / CASEST / WHILEST / IFST /
20600 PROCCALL / INTASSI / REFASSI / STRASSI / .EMPTY;
20700
20800 GOTO: "GO" "TO " .ID .ENTERC .SET 8 .OUT("JRST"-"$"B#"."S#);
20900
21000 ALGOLW: "BEGIN " BUILTIN .BEGIN .OUT("TITLE"-".ALGOL MAIN PROGRAM")
21100 .OUT("HISEG") .OUT("RELOC") #1"MAIN PROGRAM" .LABEL ".ALGOL"
21200 .OUT("TRZA"-"777777") .OUT("TRO"-"777777") .OUT("RESET"-"$"C#".R") #3"%B"
21300 *(((STRDEC/INTDEC/REFDEC) .SET 15/RECORD/PROCEDURE/EXTERNAL) ";"/
21400 .PEEK("COMMENT" .NOT(-.ID)) "COMMENT" .UNTIL ";")
21500 STATEMENT *(";" STATEMENT) "END" "." .OUT("EXIT")
21600 ^3 ENDBLK ^1 ENDPRG .OUT("END"-".ALGOL")/
21700 "PROCEDURE " BUILTIN .ID .ENTERC .SET 9 .OUT("TITLE"-*) %2 .OUT("HISEG")
21800 .OUT("RELOC") .OUT("ENTRY"-*) .LABEL * SETPROC "." ^2 .LOOK .CLEAR 23 ENDPRG .OUT("END");
21900
22000 EXTERNAL: "EXTERNAL " "PROCEDURE " .ID .ENTERC .SET 9
22100 .OUT("EXTERN"-*) .OUT("$"B#"."S#"="-*)
22200 ("(" [ARGCT:=0] .BEGIN ARG *(";" ARG) ")" .END /.EMPTY);
22300
22400 PROCCALL: .PEEK(.ID .LOOK .CHECK 9 SET) (.CHECK 25 SET BLTINPROC / .SET 23
22500 ("(" [ARGCT:=1] %1 .OUT("JRST"-*1) .LABEL *2 #1"0"
22600 PROCARG *("," [ARGCT:=ARGCT+1] PROCARG) ")" ^1[I:=*]
22700 *(.IF(I.GT.0) [I:=I-1] .LABEL("$"^3*) .OUT("BITS"-^2*)) .LABEL *1 ^1 .LOOK
22800 [*:=ARGCT] .OUT("PUSH"-"%P,[Z ^D"*","*2"]")/
22900 .EMPTY .OUT("PUSH"-"%P,[0]"))
23000 (.CHECK 10 SET #2"1" ARGGET / .OUT("PUSHJ"-"%P,$"B#"."S#)));
23100
23200 PROCARG:("-" .NUMBER [*:=-*] /.NUMBER)
23300 .OUT("Z"-"%T") .OUT("ERROR"-"[EXP 0,0]")
23400 .OUT("MOVE"-"%0,[DEC "*"]") .OUT("ERROR"-"[EXP 0,0]")/
23500 "#" -.NUMBER .OUT("Z"-"%T") .OUT("ERROR"-"[EXP 0,0]")
23600 .OUT("PUSHJ"-"%P,[MOVE %0,[POINT 1,"*3"]") %2 .*3 %3 ^1[*:=*+1]%1
23700 .OUT("MOVSI"-"%1,^D"^2%2*L) .OUT("POPJ"-"%P,]")
23800 .OUT("ERROR"-"[EXP 0,0]")/
23900 .STRING .OUT("Z"-"%T") .OUT("ERROR"-"[EXP 0,0]")
24000 (.IF(*L.GT.2) .OUT("PUSHJ"-"%P,[MOVE %0,[POINT 7,[ASCII"*"]]")
24100 /.EMPTY .OUT("PUSHJ"-"%P,[MOVSI %0,(POINT 7,0)"))
24200 .OUT("MOVSI"-"%1,^D"*L"-2") .OUT("POPJ"-"%P,]")
24300 .OUT("ERROR"-"[EXP 0,0]")/
24400 .PEEK("NULL" .NOT(-.ID)) "NULL" .OUT("Z"-"%T") .OUT("ERROR"-"[EXP 0,0]")
24500 .OUT("MOVEI"-"%TB,0") .OUT("ERROR"-"[EXP 0,0]")/
24600 .ID .LOOK .CHECK 25 CLEAR .CHECK 8 CLEAR .CHECK 6 CLEAR .CHECK 5 CLEAR
24700 (.IF(CL#.EQ.BL#) .OUT("Z"-"%T")/.EMPTY .OUT("Z"-"^D"BL#"+2(%T)"))
24800 (.CHECK 9 SET .OUT("PUSHJ"-"%P,$"B#"."S#)
24900 .OUT("ERROR"-"[EXP 0,0]") .OUT("ERROR"-"[EXP 0,0]")/
25000 .CHECK 10 SET ARGNUM #3"1" ARGARG #3"2" ARGARG #3"3" ARGARG/
25100 .CHECK 7 SET .OUT("MOVEI"-"%,$"B#"."S#"(%T)")
25200 .OUT("ERROR"-"[EXP 0,0]") .OUT("ERROR"-"[EXP 0,0]") /
25300 (.CHECK 1 SET .OUT("SUBST"-"%0,$"B#"."S#"(%T)")/
25400 .OUT("ERROR"-"[EXP 0,0]"))
25500 (.CHECK 21 SET .OUT("MOVE"-"%0,$"B#"."S#"(%T)")
25600 .OUT("ERROR"-"[EXP 0,0]")/.CHECK 13 SET .CHECK 15 SET
25700 (.CHECK 1 SET .OUT("PUSHJ"-"%P,[MOVE %0,$"B#"."S#"(%T)")
25800 .OUT("MOVE"-"%1,$"B#"."S#"+1(%T)") .OUT("POPJ"-"%P,]")
25900 (.CHECK 36 SET .OUT("PUSHJ"-"%P,[MOVEM %0,$"B#"."S#"(%T)")
26000 .OUT("MOVEM"-"%1,$"B#"."S#"+1(%T)") .OUT("POPJ"-"%P,]")/
26100 .OUT("SMOVEM"-"%0,$"B#"."S#"(%T)")) /
26200 .CHECK 3 SET .OUT("MOVE"-"%0,$"B#"."S#"(%T)")
26300 .OUT("MOVEM"-"%0,$"B#"."S#"(%T)")/
26400 .CHECK 4 SET .OUT("MOVE"-"%TB,$"B#"."S#"(%T)")
26500 .OUT("MOVEM"-"%TB,$"B#"."S#"(%T)"))));
26600
26700 ARGARG: .OUT("PUSHJ"-"%P,[MOVE %AL,2(%T)") .OUT("MOVE"-"%T,(%T)")
26800 [*:=ARGCT] .OUT("MOVE"-"%T,@4*^D"*"(%AL)")
26900 .OUT("XCT"-"4*^D"*"+"^3*"(%AL)") .OUT("POPJ"-"%P,]");
27000
27100 ENDPRG: .SETSCAN *(.SCAN (.CHECK 23 SET .OUT("EXTERN"-*)
27200 .OUT("$"B#"."S#"="-*)/.EMPTY));
27300
27400 .END