@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             MTL131
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YMTL131
~S1~M~OMUTL IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 13  Version 1~
~S1~OSection 13.1 MUTL Captioning
~S1~O1. General Description~
~BThe purpose of this section is to provide compiler developers
with an annotated print out of the MUTL procedures called while
compiling. This section contains a version of all the MUTL procedures
which do the printing.~
~S1~O2. Interfaces~
~
MUTL Procedures:~
   MUTL procedures of section 1 to 9.~
~S1~O2.1 Hardware Interface~
~BAny machine.~
~S1~O2.2 Software Interface~
~BNone.~
~S1~O3. Implementation~
~S1~O3.1 Outline of Operation~
~BThe operation of this section is straightforward.~
~S1~O3.2 Data Structures~
~B(RP to be completed)~
~S1~O4. Compile Jobs~
~BA compile job for this section can be found in Section 20
(Configuration Section).~
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H                MTL131
~V9 -1
~F
@TITLE MTL13(1,11)
@COL 1S-2R-3R-7R-4R-5R-6F
@FLOW 1-2-3-7-4-5-6
@BOX 1.0
SECTION 13
MUTL ANNOTATION
@BOX 2.0
EXTERNAL ENVIRONMENT [MTL13/1]
MODULE HEADING
@BOX 3.0
EXPORT PROCEDURE SPECS
[MTL13/2]
@BOX 4.0
SUB PROCEDURES [MTL13.1]
@BOX 5.0
MUTL PROCEDURES [MTL13.2]
@BOX 6.0
END
@BOX 7.0
DECLARATIONS
@BOX 1.1
::SECTION 13
@BOX 2.1
#MUTL13/1
MODULE(C.TL.ENQ, C.TL.ENQ.REG,
 C.TL.TYPE,C.TL.TYPE.COMP,C.TL.END.TYPE,C.TL.CODE.AREA,C.TL.DATA.AREA,C.TL.SET.T
YPE,
C.TL.SELECT.FIELD,C.TL.CYCLE,C.TL.REPEAT,C.TL.CV.CYCLE,C.TL.CV.LIMIT,C.TL.EQUIV.
POS,
C.TL.COMMON,C.TL.END.COMMON,C.TL.SPACE,C.TL.S.DECL,C.TL.V.DECL,C.TL.SELECT.VAR,C
.TL.MAKE,C.TL.C.LIT.16,
C.TL.C.LIT.32,C.TL.C.LIT.64,C.TL.C.NULL,C.TL.C.TYPE,C.TL.C.LIT.S,C.TL.C.LIT.128,
C.TL.LIT,C.TL.ASS,
C.TL.ASS.VALUE,C.TL.ASS.END,C.TL.ASS.ADV,C.TL.PROC.SPEC,C.TL.PROC.PARAM,
C.TL.PROC.RESULT,C.TL.PROC,C.TL.PARAM.NAME,C.TL.PROC.KIND,C.TL.END.PROC,
C.TL.I.PARAM,C.TL.BLOCK,C.TL.END.BLOCK,C.TL.LABEL.SPEC,C.TL.LABEL,
C.TL.PL,C.TL.D.TYPE,C.TL.INSERT,C.TL.CHECK,C.TL.REG,C.TL.RANGE,C.TL.LINE,
C.TL.END,C.TL.MODULE,C.TL.END.MODULE,C.TL.SEG,C.TL.LOAD,
C.TL.BOUNDS,C.TL.PRINT,C.TL.MODE,C.TL.ENTRY,
C.TL.CALC,C.TL.GLOBAL,C.TL.C.DATA);
@BOX 3.1
#MTL13/2
@BOX 4.1
PSPEC C.CAP(ADDR [$LO8]);  ::OUTPUTS PROC NAME
PSPEC PS();   ::OUTPUTS PARAMETER SEPARATOR
PSPEC PE();   ::OUTPUTS PARAMETER TERMINATOR AND ENDS CALL
PSPEC OH(INTEGER32);   ::OUTPUTS IN SUITABLE HEX
PSPEC OS(ADDR[$LO8]);   ::OUTPUTS STRING
PSPEC NP();   ::PARAMETERS AND END FOR PARAMETERLESS PROC
PSPEC OUTHX($IN32);
PSPEC OHE($IN);
PSPEC OBYTE($LO);
PSPEC ADDNAME();
PSPEC OUTNAME($IN);
PSPEC OUTMNAME();
PSPEC OUTTYPE($IN);
;*CODE 22
#MTL13.1
@BOX 5.1
#MTL13.2
@BOX 6.1
;*END
@BOX 7.1
*GLOBAL 24 ;
$IN COUNT;
$IN MUTL.NAME,GLOB.ST,CUR.AMODE,CUR.MODEK,MUBL.STR;
LITERAL/ADDR [$LO8] NIL.STR =;
*GLOBAL 0 ;
@END
@TITLE MTL13/1(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 2.0
IMPORTED PROCEDURES
AND VARIABLES
@BOX 3.0
END
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 2.1
;ADDR PW0, PW1, PW2, PW3, PW4, PW5, PW6
;ADDR [$LO64] USE.LIT.P
;$LO64 PWW1, PWW2;
;$IN CHK.IN, TL.PR.M, LAST.NAME, LAST.G.NAME
;PSPEC GET.LIT($IN)/$IN
;PSPEC YIELD.SYMB.NAME ($IN)/ ADDR [$LO8]
;LSPEC SPACES($IN)
;LSPEC NEWLINES($IN)
;LSPEC CAPTION(ADDR [$LO8])
;LSPEC END.OUTPUT($IN,$IN)
;LSPEC SELECT.OUTPUT($IN)
;LSPEC OUTCH($IN)
;LSPEC OUTI($IN32,$IN)
@BOX 3.1
::END
@END
@TITLE MTL13/2(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
EXPORT PROCEDURE SPECS
@B2
SPECS
@BOX 3.0
END
@BOX 1.1
::EXPORT PROC SPECS
@BOX 2.1
;PSPEC C.TL.ENQ($IN)/$IN
;PSPEC C.TL.ENQ.REG($IN)/ADDR[$IN]
;PSPEC C.TL.TYPE(ADDR[$LO8],$IN)
;PSPEC C.TL.TYPE.COMP($IN,ADDR,ADDR[$LO8])
;PSPEC C.TL.END.TYPE($IN)
;PSPEC C.TL.SEG($IN,ADDR,$LO32,ADDR,$IN)
;PSPEC C.TL.LOAD($IN,$IN)
;PSPEC C.TL.CODE.AREA($IN)
;PSPEC C.TL.DATA.AREA($IN)
;PSPEC C.TL.COMMON (ADDR[$LO8], $IN32, $IN)
;PSPEC C.TL.END.COMMON()
;PSPEC C.TL.EQUIV.POS(ADDR)
;PSPEC C.TL.SPACE(ADDR)
;PSPEC C.TL.S.DECL(ADDR[$LO8],$IN,ADDR)
;PSPEC C.TL.V.DECL(ADDR[$LO8],$LO32,$IN,$IN,$IN,ADDR)
;PSPEC C.TL.MAKE($IN,$IN,ADDR)
;PSPEC C.TL.SELECT.VAR()
;PSPEC C.TL.SELECT.FIELD($IN,$IN,$IN)
;PSPEC C.TL.SET.TYPE($IN,$IN)
;PSPEC C.TL.ASS($IN,$IN)
;PSPEC C.TL.ASS.VALUE($IN,$IN)
;PSPEC C.TL.ASS.END()
;PSPEC C.TL.ASS.ADV($IN)
;PSPEC C.TL.C.LIT.16($IN,$IN16)
;PSPEC C.TL.C.LIT.32($IN,$IN32)
;PSPEC C.TL.C.LIT.64($IN,$LO64)
;PSPEC C.TL.C.LIT.128($IN,$RE128)
;PSPEC C.TL.C.LIT.S($IN,ADDR[$LO8])
;PSPEC C.TL.C.NULL($IN)
;PSPEC C.TL.C.TYPE($IN, $IN, $IN)
;PSPEC C.TL.C.DATA($IN,$IN,ADDR);
;PSPEC C.TL.LIT(ADDR[$LO8],$IN)
;PSPEC C.TL.CALC($IN,$IN)
;PSPEC C.TL.PROC.SPEC(ADDR [$LO8],$IN)
;PSPEC C.TL.PROC.PARAM($IN,ADDR)
;PSPEC C.TL.PROC.RESULT($IN)
;PSPEC C.TL.PROC($IN)
;PSPEC C.TL.PARAM.NAME($IN,ADDR[$LO8])
;PSPEC C.TL.PROC.KIND($IN)
;PSPEC C.TL.END.PROC()
;PSPEC C.TL.ENTRY($IN)
;PSPEC C.TL.I.PARAM($IN,$IN,$IN)
;PSPEC C.TL.BLOCK()
;PSPEC C.TL.END.BLOCK()
;PSPEC C.TL.LABEL.SPEC(ADDR[$LO8],$IN)
;PSPEC C.TL.LABEL($IN)
;PSPEC C.TL.PL($IN,$IN)
;PSPEC C.TL.D.TYPE($IN,ADDR)
;PSPEC C.TL.CHECK($IN)
;PSPEC C.TL.INSERT($IN)
;PSPEC C.TL.CYCLE($IN)
;PSPEC C.TL.REPEAT()
;PSPEC C.TL.CV.CYCLE($IN,$IN,$IN)
;PSPEC C.TL.CV.LIMIT($IN)
;PSPEC C.TL.REG($IN)
;PSPEC C.TL.RANGE($IN,$IN,$IN,$IN)
;PSPEC C.TL.END()
;PSPEC C.TL.MODULE()
;PSPEC C.TL.END.MODULE($IN)
;PSPEC C.TL.GLOBAL()
;PSPEC C.TL.MODE($IN,$IN)
;PSPEC C.TL.LINE($IN32)/$IN
;PSPEC C.TL.BOUNDS($IN,ADDR[$IN])
::SECOND PARAMETER SHOULD BE ADDR[$IN] -- TMUTLP BUG***
;PSPEC C.TL.PRINT($IN);
@BOX 3.1
::END
@END
@TITLE MTL13.1(1,6)
@COL 1S-2R-4R-5F
@FLOW 1-2-4-5
@BOX 1.0
SUB PROCEDURES
@BOX 2.0
BASIC OUTPUT FORMATTING PROCEDURES
[MTL13.1.1]
@BOX 4.0
NAME AND TYPE OUTPUT PROCEDURES
[MTL13.1.5]
@BOX 5.0
END
@BOX 1.1
::SUB PROCEDURES
@BOX 2.1
#MTL13.1.1
@BOX 4.1
#MTL13.1.5
@BOX 5.1
::END
@END
@TITLE MTL13.1.1(1,11)
@COL 1S-2R-3R-4R-5R-6R-7R-8R-9R-10R-11F
@FLOW 1-2-3-4-5-6-7-8-9-10-11
@BOX 1.0
BASIC OUTPUT FORMATTING PROCEDURES
@BOX 2.0
PRINT PROC NAME
@BOX 3.0
PS - PRINT COMMA
@BOX 4.0
PE - PRINT CLOSE BRACKET
@BOX 5.0
OHE - PRINT HEX DIGIT
@BOX 6.0
OUTHX - PRINT HEX 32
@BOX 7.0
OH - PRINT HEX 32 WITH %
@BOX 8.0
OBYTE - PRINT BYTE AS HEX DIGIT PAIR
@BOX 9.0
OS - PRINT STRING
@BOX 10.0
NP - PRINT ()
@BOX 11.0
END
@BOX 1.1
::BASIC OUTPUT FORMATTING PROCS
@BOX 2.1
PROC C.CAP(S);
IF CHK.IN /= 0 THEN
   SPACES(5);
FI
CAPTION(%"TL.");
CAPTION(S);
END
@BOX 3.1
PROC PS;
     OUTCH(",");
END
@BOX 4.1
PROC PE;
     OUTCH(")"); NEWLINES(1);
END;
@BOX 5.1
PROC OHE(HEX);
   IF HEX < 0 OR HEX > 15 THEN
     CAPTION(%"GASH HEX CODE");
     OUTHX(HEX);
     NEWLINES(1)
   ELSE
   IF HEX < 10 THEN
    OUTCH(HEX + "0")
   ELSE
    OUTCH(HEX-10+"A")
   FI
   FI
END
@BOX 6.1
PROC OUTHX(V);
$IN I,F,J;
$LO32 VL;
V=>VL;
0=>F;
32=>I;
WHILE 4->I >= 0 DO
  VL->>I & %F => J !> F;
  IF F/= 0 OR I= 0 THEN
    OHE(J);
  FI;
OD;
END
@BOX 7.1
PROC OH(NUM);
      OUTCH('%);
      OUTHX(NUM);
END;
@BOX 8.1
PROC OBYTE(BY);
   OHE(BY & %F0 ->>4);
   OHE(BY & %F);
END;
@BOX 9.1
PROC OS(STRING);
     OUTCH("%") ;OUTCH ('");
     CAPTION(STRING);
     OUTCH('");
END;
@BOX 10.1
PROC NP;
      OUTCH(")") ;NEWLINES(1);
END;
@BOX 11.1
::END
@END
@TITLE MTL13.1.5(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
NAME AND TYPE OUTPUT PROCEDURES
@BOX 2.0
ADD.NAME - NOTE ITS MUTL NAME
@BOX 3.0
OUTNAME(MUTL.NAME) - PRINT SYMBOLIC
NAME OF MUTL.NAME
@BOX 4.0
OUTNAME() - PRINT CURRENT MUTL NAME
@BOX 5.0
OUTTYPE(MUTL.TYPE) - PRINT MUTL TYPE
@BOX 6.0
END
@BOX 1.1
::NAME AND TYPE OUTPUT PROCS
@BOX 2.1
PROC ADDNAME;
IF GLOB.ST = 0 THEN
   1 + LAST.NAME => MUTL.NAME;
ELSE
   1 - LAST.G.NAME => MUTL.NAME;
   0 => GLOB.ST;
FI
END
@BOX 3.1
PROC OUTNAME(N);
;ADDR [$LO8] P
;IF YIELD.SYMB.NAME(N) => P /= NIL.STR THEN
   ;CAPTION(P)
ELSE;
   CAPTION(%"name ");
   OH(N);
FI;
END;
@BOX 4.1
PROC OUTMNAME;
OUTCH('));OUTCH('*); OH(MUTLNAME);NEWLINES(1);
END;
@BOX 5.1
PROC OUTTYPE(TY);
OUTCH('{);
$IN I,J,K,ASIZE;
TY & %3FFF => TY ->> 2 => K;
IF [[K =< %C AND K > 7] OR K = 0] AND TY < 256 THEN;
   IF K = 8 THEN;
      CAPTION(%"1 bit scalar");
      0 => I;
   ELSE;
      IF K = 0 THEN 7 => K FI;
      CAPTION(%"Addr [");
      ALTERNATIVE K - 7 FROM
      CAPTION(%"Undefined");
      CAPTION(%"Logical");
      CAPTION(%"Procedure");
      CAPTION(%"Procedure and Environment");
      CAPTION(%"Label");
      CAPTION(%"Label and Environment");
      END;
      3 => I;
   FI;
ELSE;
   TY & %03 => I;
   ALTERNATIVE I FROM
   BEGIN;END;
   CAPTION(%"Addr ");
   CAPTION(%"Addr [");
   CAPTION(%"Addr [");
   END;
   IF TY < 256 OR TY > 8191 THEN;
      ALTERNATIVE TY ->> 6 & 3 FROM
      CAPTION(%"Real");
      CAPTION(%"Integer");
      CAPTION(%"Logical");
      CAPTION(%"Decimal");
      END;
    IF TY < 256 THEN
        TY ->> 2 & %F + 1 * 8 => ASIZE
   ELSE
      TY ->> 8 & %1F  + 1 => ASIZE
   FI
   OUTI(ASIZE,0);
   ELSE;
      OUTNAME (TY ->> 2 & %FFF - 64);
   FI;
FI;
IF I = 3 THEN OUTCH ("]") FI;
OUTCH('});
END;
@BOX 6.1
::END
@END
@TITLE MTL13.2(1,8)
@COL 1S-12R-2R-3R-4R-5R-6R-7R-8R-9R-10R-11F
@FLOW 1-12-2-3-4-5-6-7-8-9-10-11
@BOX 1.0
MUTL PROCEDURES
@BOX 2.0
TYPE DEFINITIONS
[MTL13.2.2]
@BOX 3.0
AREA SELECTION AND EQUIVALENCING
[MTL13.2.3]
@BOX 4.0
DATA DECLARATIONS
[MTL13.2.4]
@BOX 5.0
LITERAL DECLARATION
[MTL13.2.5]
@BOX 6.0
PROGRAM STRUCTURE DECLARATION
[MTL13.2.6]
@BOX 7.0
LABEL DECLARATION
[MTL13.2.7]
@BOX 8.0
CODE PLANTING
[MTL13.2.8]
@BOX 9.0
MUTL INITIALISATION
[MTL13.2.9]
@BOX 10.0
DIAGNOSTICS
[MTL13.2.10]
@BOX 11.0
END
@BOX 12.0
CONFIGURATION PROCEDURES
@BOX 1.1
::MUTL PROCEDURES
@BOX 2.1
#MTL13.2.2
@BOX 3.1
#MTL13.2.3
@BOX 4.1
#MTL13.2.4
@BOX 5.1
#MTL13.2.5
@BOX 6.1
#MTL13.2.6
@BOX 7.1
#MTL13.2.7
@BOX 8.1
#MTL13.2.8
@BOX 9.1
#MTL13.2.9
@BOX 10.1
#MTL13.2.10
@BOX 11.1
::END
@BOX 12.1
#MTL13.2.1
@END
@TITLE MTL13.2.1(1,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
COFIGURATION PROCEDURES
@BOX 2.0
PROCEDURES
   TL.ENQ
   TL.ENQ.REG
@BOX 3.0
END
@BOX 1.1
::CONFIGURATION PROCEDURES
@BOX 2.1
PROC C.TL.ENQ(MODE);
END;
PROC C.TL.ENQ.REG(MODE);
END;
@BOX 3.1
::END
@END

@TITLE MTL13.2.2(1,7)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TYPE DEFINITION
@BOX 2.0
PROCEDURES
   TL.TYPE
   TL.TYPE.COMP
   TL.END.TYPE
@BOX 3.0
END
@BOX 1.1
::TYPE DEFINITIONS
@BOX 2.1
PROC C.TL.TYPE(N,NAT);
IF NAT & %FFF < 2 THEN
  ADDNAME();
FI
     C.CAP(%"TYPE(");  OS(N);  PS(); OH(NAT);
IF NAT & %FFF < 2 THEN
   OUTMNAME();
ELSE
   PE();
FI
END;

PROC C.TL.TYPE.COMP(T,D,NM);
     C.CAP(%"TYPE.COMP(");
      OH(T); OUTTYPE(T); PS(); OH(D); PS();OS(NM);PE();
END;

PROC C.TL.END.TYPE(STAT);
     C.CAP(%"END.TYPE(");
     OH(STAT);PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.3(1,11)
@COL 1S-2R-3F
@BOX 1.0
AREA SELECTION AND EQUIVALENCING
@BOX 2.0
PROCEDURES
   TL.SEG
   TL.LOAD
   TL.CODE.AREA
   TL.DATA.AREA
   TL.COMMON
   TL.END.COMMON
   TL.EQUIV.POS
@BOX 3.0
END
@BOX 1.1
::AREA SELECTION AND EQUIVALENCING
@BOX 2.1
PROC C.TL.SEG(N,S,RTA,CTA,K);
     C.CAP(%"SEG(");
      OH(N); PS(); OH(S); PS(); OH(RTA); PS(); OH(CTA);
     PS(); OH(K); PE();
END;

PROC C.TL.LOAD(SN,AN);
     C.CAP(%"LOAD(");
      OH(SN); PS(); OH(AN); PE();
END;

PROC C.TL.CODE.AREA(AN);
     C.CAP(%"CODE.AREA(");
      OH(AN); PE();
END;

PROC C.TL.COMMON (SN, SIZ, NAT);
   C.CAP(%"COMMON");
    OS(SN); PS(); OH(SIZ); PS(); OH(NAT); PE();
END

PROC C.TL.END.COMMON;
   C.CAP(%"END.COMMON");
   NP();
END

PROC C.TL.DATA.AREA(AN);
     C.CAP(%"DATA.AREA(");
      OH(AN); PE();
END;

PROC C.TL.EQUIV.POS(POS);
     C.CAP(%"EQUIV.POS(");
      OH(POS); PE();
END;

@BOX 3.1
::END
@END
@TITLE MTL13.2.4(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DATA DECLARATIONS
@BOX 2.0
PROCEDURES
   TL.SPACE
   TL.S.DECL
   TL.V.DECL
   TL.SELECT.VAR
   TL.SET.TYPE
   TL.MAKE
DATA DECLARATIONS [MTL13.2.3/1]
@BOX 3.0
END
@BOX 1.1
::DATA DECLARATIONS
@BOX 2.1
PROC C.TL.SPACE(SI);
ADDNAME();
     C.CAP(%"SPACE(");
     ; OH(SI); OUTMNAME();
END;

PROC C.TL.S.DECL(SN,T,D);
ADDNAME();
     C.CAP(%"S.DECL(");
     ; OS(SN); PS(); OH(T); OUTTYPE(T); PS(); OH(D); OUTMNAME();
END;

PROC C.TL.V.DECL(SN,SA,RS,WS,T,D);
ADDNAME();
     C.CAP(%"V.DECL(");
     ; OS(SN); PS(); OH(SA); PS(); OH(RS); PS(); OH(WS); PS();
OH(T); OUTTYPE(T); PS();  OH(D); OUTMNAME();
END;

PROC C.TL.SELECT.VAR;
ADDNAME();
     C.CAP(%"SELECT.VAR(");
  ;   OUTMNAME();
END;
PROC C.TL.SELECT.FIELD(B,A,F);
   C.CAP(%"SELECT.FIELD(");
   ; OH(B); PS(); OH(A); PS(); OH(F); OUTMNAME();
END;

PROC C.TL.SET.TYPE(N,T);
   C.CAP(%"SET.TYPE(");
   ;OH(N);OUTCH('{);OUTNAME(N);OUTCH('});PS();OH(T);OUTTYPE(T);PE();
END;

PROC C.TL.MAKE(S,T,D);
     C.CAP(%"MAKE(");
     ; OH(S); PS(); OH(T); OUTTYPE(T); PS(); OH(D); PE();
END;
#MTL13.2.4/1
@BOX 3.1
::END
@END
@TITLE MTL13.2.5(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
LITERAL DECLARATIONS
@BOX 2.0
PROCEDURES
   TL.C.LIT.16
   TL.C.LIT.32
   TL.C.LIT.64
   TL.C.LIT.128
   TL.C.NULL
   TL.C.TYPE
   TL.C.DATA
   TL.C.LIT.S
   TL.LIT
  TL.CALC
@BOX 3.0
END
@BOX 1.1
::LITERAL DECLARATIONS
@BOX 2.1
PROC C.TL.C.LIT.16(BT,VAL);
     C.CAP(%"C.LIT.16(");  OH(BT); OUTTYPE(BT & %FE); PS(); OH(VAL); PE();
END;
PROC C.TL.C.LIT.32(BT,VAL);
     C.CAP(%"C.LIT.32(");  OH(BT); OUTTYPE(BT & %FE); PS(); OH(VAL); PE();
END;
PROC C.TL.C.LIT.64(BT,VAL);
   C.CAP(%"C.LIT.64(");      OH(BT); OUTTYPE(BT & %FE);PS();     OH(VAL ->>32);
OUTHX(VAL & %F(8));     PE();
END;
PROC C.TL.C.NULL(PT);
      C.CAP(%"C.NULL("); OH(PT); OUTTYPE(PT);PE();
END;
PROC C.TL.C.TYPE(BT,K,MN);
C.CAP(%"C.TYPE(");  OH(BT); OUTTYPE(BT); PS(); OH(K); PS();
                       OH(MN); OUTTYPE(MN); PE();
END;
PROC C.TL.C.DATA(BT,MN,EL);
C.CAP(%"C.DATA(");  OH(BT); OUTTYPE(BT); PS(); OH(MN); OUTNAME(MN);
PS(); OH(EL); PE();
END;
PROC C.TL.C.LIT.S(BT,VAL);
     C.CAP(%"C.LIT.S(");
      OH(BT); OUTTYPE(BT & %FE);PS();
        $IN TEMP,TSIZE,CHVAL;
        OUTCH("%");OUTCH('");
        SIZE(VAL) => TSIZE;
        -1 => TEMP;
        WHILE 1 +> TEMP < TSIZE DO
          VAL^[TEMP] => CHVAL;
           IF BT & %C3 = 0 THEN
              OBYTE(CHVAL);
         ELSE IF CHVAL < %20 OR CHVAL > %7E OR CHVAL = "!" OR CHVAL = '$" THEN
          OUTCH("!");OBYTE(CHVAL);OUTCH("!")
         ELSE
          OUTCH(CHVAL)
         FI FI
        OD
        OUTCH('");PE();
END;
PROC C.TL.C.LIT.128(BT,VAL);
   C.CAP(%"C.LIT.128(");  OH(BT); OUTTYPE(BT & %FE); CAPTION(%"MUSL CANNOT COPE"
);
     PE();
END;
PROC C.TL.LIT(SN,K);
ADDNAME();
   C.CAP(%"LIT(");  OS(SN); PS(); OH(K); OUTMNAME();
END;
PROC C.TL.CALC(FN,OPD);
   C.CAP(%"CALC(");  OH(FN); PS(); OH(OPD); PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.4/1(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DATA DECLARATIONS CONT
@BOX 2.0
PROCEDURES
   TL.ASS
   TL.ASS.VALUE
   TL.ASS.ADV
   TL.ASS.ADV
@BOX 3.0
END
@BOX 1.1
::DATA DECLARATIONS CONT
@BOX 2.1
PROC C.TL.ASS(N,A);
::KV    IF TL.PR.M & %4000 /= 0 THEN
::KV       CAPTION(%"$LDATAVEC  ");
::KV       OUTNAME(N);
::KV       NEWLINES(1);
::KV       -1 => COUNT;
::KV    FI
     C.CAP(%"ASS(");
      OH(N); OUTCH('{); OUTNAME(N); OUTCH('}); PS(); OH(A); PE();
END;

PROC C.TL.ASS.VALUE(N,R);
$IN32 I;
::KV   IF TL.PR.M & %4000 /= 0 THEN
::KV      FOR R DO
::KV         IF N = 0 THEN
::KV            GET.LIT(0);
::KV             USE.LIT.P^[0] & %F(8) => I
::KV         ELSE
::KV            LIT.VAL[N] => I
::KV         FI
::KV         OH(I);
::KV         SPACES(2);
::KV         IF 1+> COUNT > 8 THEN
::KV            -1 => COUNT;
::KV            NEWLINES(1);
::KV         FI
::KV      OD
::KV   FI
     C.CAP(%"ASS.VALUE(");
     OH(N); OUTCH('{); OUTNAME(N); OUTCH('});PS();OH(R);PE();
END;

PROC C.TL.ASS.END;
::KV   IF TL.PR.M & %4000 /= 0 THEN
::KV      CAPTION(%"$LEND");
::KV      NEWLINES(1);
::KV   FI
     C.CAP(%"ASS.END(");
     NP();
END;

PROC C.TL.ASS.ADV(N);
     C.CAP(%"ASS.ADV(");
      OH(N);  PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.6(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROGRAM STRUCTURE DECLARATION
@BOX 2.0
PROCEDURES
   TL.PROC.SPEC
   TL.PROC.PARAM
   TL.PROC.RESULT
   TL.PROC
   TL.PARAM.NAME
   TL.PROC.KIND
   TL.END.PROC
   TL.BLOCK
   TL.END.BLOCK
OTHER PROCS [MTL13.2.6/1]
@BOX 3.0
END
@BOX 1.1
::PROGRAM STRUCTURE DECLARATIONS
@BOX 2.1
PROC C.TL.PROC.SPEC(NAM,NAT);
   IF NAT & %1000 = 0 THEN;
      ADDNAME();
FI;
     C.CAP(%"PROC.SPEC(");
      OS(NAM); PS(); OH(NAT);
    IF NAT & %1000 = 0 THEN;
    OUTMNAME();
    ELSE;
    PE();
    FI;
END;
PROC C.TL.PROC.PARAM(T,D);
     C.CAP(%"PROC.PARAM(");
      OH(T); OUTTYPE(T); PS(); OH(D); PE();
END;
PROC C.TL.PROC.RESULT(R);
     C.CAP(%"PROC.RESULT(");
      OH(R); PE();
END;
PROC C.TL.PROC(P);
     C.CAP(%"PROC(");
      OH(P); OUTCH('{); OUTNAME(P & %7FFF);OUTCH('}); PE();
END;
PROC C.TL.PARAM.NAME(N,SN);
   C.CAP(%"PARAM.NAME(");
    OH(N); PS(); OS(SN); PE();
END;
PROC C.TL.PROC.KIND(K);
     C.CAP(%"PROC.KIND(");
      OH(K); PE();
END;
PROC C.TL.END.PROC;
     C.CAP(%"END.PROC(");
     NP();
END;
PROC C.TL.BLOCK;
     C.CAP(%"BLOCK(");
     NP();
END;
PROC C.TL.END.BLOCK;
     C.CAP(%"END.BLOCK(");
     NP();
END;
#MTL13.2.6/1
@BOX 3.1
::END
@END
@TITLE MTL13.2.7(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
LABEL DECLARATIONS
@BOX 2.0
PROCEDURES
   TL.LABEL.SPEC
   TL.LABEL
@BOX 3.0
END
@BOX 1.1
::LABEL DECLARATIONS
@BOX 2.1
PROC C.TL.LABEL.SPEC(N,U);
ADDNAME();
     C.CAP(%"LABEL.SPEC(");
      OS(N); PS(); OH(U); OUTMNAME();
END;

PROC C.TL.LABEL(L);
     C.CAP(%"LABEL(");
      OH(L); OUTCH('{); OUTNAME(L); OUTCH('}); PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.8(1,6)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
CODE PLANTING
@BOX 2.0
TL.PL
[MTL13.2.8.1]
@BOX 3.0
OTHER PROCS
[MTL13.2.8.2]
@BOX 4.0
END
@BOX 1.1
::CODE PLANTING
@BOX 2.1
#MTL13.2.8.1
@BOX 3.1
#MTL13.2.8.2
@BOX 4.1
::END
@END
@TITLE MTL13.2.8.1(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TL.PL
@BOX 2.0
TL.PL CODE
TL.PL DATAVECS [MTL13.2.8.1.1]
@BOX 3.0
END
@BOX 1.1
::TL.PL
@BOX 2.1
PROC C.TL.PL(F,N);
$LO8[17] LIB.N;
ADDR [$LO8] LIB.P;
$LO8 [128] PROC.N;
INTEGER I, CLT;
$LO64 V;
$LO32[4] CL;
#MTL13.2.8.1.1
IF F = %52 OR F = %51 OR F = %45 OR F = %46 THEN;
   F => CUR.MODEK;
   N => CUR.AMODE;
FI;
     C.CAP(%"PL(");
      OH(F);OUTCH('{);
IF F >= %20 < %40 THEN
   IF CUR.AMODE = %83 AND CUR.MODEK > %46 THEN
      %60 +> F;
   ELSE
      IF CUR.AMODE & %1 /= 0 THEN
         %80 +> F;
      FI
   FI
FI
   -1 => I;
   WHILE 1+> I < 8 DO;
      IF FNMS[F*8+I] /= "@" THEN;
         OUTCH(FNMS[F*8+I]);
      FI;
   OD;
OUTCH('}); PS(); OH(N);
IF OPMS[F] /= 4 THEN;
   OUTCH('{);
FI;
ALTERNATIVE OPMS[F] FROM
BEGIN;
IF N = 0 THEN;
  GET.LIT(0) => CLT;
  USE.LIT.P^[0] => V & %F(8) => CL[0];
  V ->> 32 => CL[1];
  IF CLT & %3 = 0 THEN;
   IF CLT = %20 THEN
      1 => I
   ELSE
   (CLT ->>2 & %F)/4 + 1 => I;
   FI
   CAPTION(%"Current Literal = %");
   OUTHX(CL[1 -> I]);
   WHILE 1 -> I > -1 DO;
   SPACES(2);
   OUTHX(CL[I]);
   OD;
  ELSE;
   CAPTION(%"NULL");
  FI;
ELSE IF N < %1000 THEN;
   OUTNAME (N);
ELSE  IF N =< %100D THEN;
   ALTERNATIVE N - %1000 FROM
   CAPTION(%"OPD ERROR");
   CAPTION(%"OPD ERROR");
   CAPTION(%"V.SUB");
   CAPTION(%"UNSTACK");
   CAPTION(%"D[]");
   CAPTION(%"SEL.VAR");
   CAPTION(%"OPD ERROR");
   CAPTION(%"OPD ERROR");
   CAPTION(%"T =");
   CAPTION(%"T /=");
   CAPTION(%"T >=");
   CAPTION(%"T >");
   CAPTION(%"T =<");
   CAPTION(%"T <");
   END
ELSE IF N = %2000 THEN
     CAPTION(%"B register")
ELSE IF N = %3000 THEN
   CAPTION(%"A register")
FI FI FI FI FI;
END;
BEGIN;CAPTION(%"***ILLEGAL TL.PL CALL***");END;
BEGIN;END;
BEGIN;END;  ::MFN OPERAND
OUTTYPE(N);
BEGIN;END;::PROCEDURE VARIABLE OPERAND
BEGIN;END;  ::NO OPERAND REQUIRED
BEGIN
   END
BEGIN;END;
END;
IF OPMS[F] /= 4 THEN;
   OUTCH('});
FI;
PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.8.1.1(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TL.PL DATAVECS
@BOX 2.0
DATAVECS
@BOX 3.0
END
@BOX 1.1
::TL.PL DATAVECS
@BOX 2.1
DATAVEC FNMS($LO8);
"B=>@@@@@B=-@@@@@B=@@@@@@B@-/=@@@B&@@@@@@B!@@@@@@B<<-@@@@B->>@@@@B+@@@@@@"
"B-@@@@@@B-:@@@@@B*@@@@@@B/@@@@@@B/:@@@@@B@-=@@@@B COMP@@@@@@@@@@@@@@@@@@"
"@@@@@@@@B-/=>@@@B&>@@@@@B!>@@@@@@@@@@@@@@@@@@@@@B@+>@@@@B@->@@@@B-:>@@@@"
"B*>@@@@@B/>@@@@@B/:>@@@@B@-=>@@@B@**@@@@"
"A@=>@@@@A=-@@@@@A=@@@@@@A@-/=@@@A&@@@@@@A!@@@@@@A<<-@@@@A->>@@@@A@+@@@@@"
"A@-@@@@@A@-:@@@@A@*@@@@@A@/@@@@@A@/:@@@@A-=@@@@@A COMP@@@@@@@@@@@@@@@@@@"
"A MFN@@@A@@-/=>@A&>@@@@@A@!>@@@@@@@@@@@@@@@@@@@@A@+>@@@@A@->@@@@A@-:>@@@"
"A@*>@@@@A@/>@@@@A@/:>@@@A@-=>@@@A@**@@@@"
"STK L@@@STK PAR@ENTER@@@RETURN@@@@@@@@@@ACONV@=@AMODE@=@STACK@@@STACK LB"
"->@IF@=@->IF@/=@->IF@>=@->IF@<@@->IF@=<@->IF>@@@SEG@->@@ISEG@->@AECONV@@"
"AEMODE=@ADDR=@@@@@@@@@@@BCONV@=@BMODE@=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"D@=>@@@@D@=REF@@D@=@@@@@SEL FLD@SEL EL@@SEL ALT@BASE@@@@LIMIT@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"L.STR@@@R.STR@@@MOV@@@@@E.MOV@@@COMP@@@@E.COMP@@SRCH@@@@E.SRCH@@LEN@@@@@"
"E.LEN@@@ASC.COMPE.AS.CMP@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"A@=>@@@@A@=REF@@A@=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BASE@@@@LIMIT@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@COMP@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
END;
DATAVEC OPMS($IN)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 3 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 5 0 1 4 4 0 7 0 0 0 0 0 0 0 0 4 4 6 1 4 4 1 1 1 1 1 1 1 1 1
0 0 0 6 6 6 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
8 8 8 8 8 8 8 8 8 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 6 6 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.8.2(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
OTHER CODE PLANTING PROCS
@BOX 2.0
PROCEDURES
   TL.D.TYPE
   TL.INSERT
   TL.CYCLE
   TL.REPEAT
   TL.CV.CYCLE
   TL.CV.LIMIT
   TL.CHECK
   TL.REG
   TL.RANGE
@BOX 3.0
END
@BOX 1.1
::OTHER CODE PLANTING PROCS
@BOX 2.1
PROC C.TL.D.TYPE(T,D);
     C.CAP(%"D.TYPE(");
      OH(T); OUTTYPE(T); PS(); OH(D); PE();
END;
PROC C.TL.INSERT(BIN);
      C.CAP(%"INSERT(");
      OH(BIN);PE();
END;
PROC C.TL.CYCLE(LIM);
   C.CAP(%"CYCLE(");
    OH(LIM); PE();
END;
PROC C.TL.REPEAT;
   C.CAP(%"REPEAT(");
   NP();
END;
PROC C.TL.CV.CYCLE(CV,I,M);
   C.CAP(%"CV.CYCLE(");
    OH(CV); PS(); OH(I); PS(); OH(M); PE();
END;
PROC C.TL.CV.LIMIT(LIM);
   C.CAP(%"CV.LIMIT(");
    OH(LIM); PE();
END;
PROC C.TL.CHECK(S);
     C.CAP(%"CHECK(");
      OH(S); PE();
END;
PROC C.TL.REG(RU);
     C.CAP(%"REG(");
      OH(RU); PE();
END;
PROC C.TL.RANGE(R,K,LL,UL);
     C.CAP(%"RANGE(");
     OH(R);PS();OH(K);PS();OH(LL);PS();OH(UL);PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.10(1,6)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
DIAGNOSTICS
@BOX 2.0
PROCEDURES
   TL.LINE
   TL.BOUNDS
   TL.PRINT
@BOX 3.0
END
@BOX 1.1
::DIAGNOSTICS
@BOX 2.1
PROC C.TL.LINE(LN);
     C.CAP(%"LINE(");
      OH(LN); PE();
END;
PROC C.TL.BOUNDS(N,B);
   C.CAP(%"BOUNDS(");
    OH(N); OUTCH('{); OUTNAME(N); OUTCH('}); PE();
END;
PROC C.TL.PRINT(M);
   C.CAP(%"PRINT(");
   OH(M);PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.9(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MUTL INITIALISATION
@BOX 2.0
PROCEDURES
   TL.END
   TL.MODULE
   TL.END.MODULE
   TL.GLOBAL
   TL.MODE
@BOX 3.0
END
@BOX 1.1
::MUTL INITIALISATION
@BOX 2.1
PROC C.TL.END;
     C.CAP(%"END(");
      NP();
END;
PROC C.TL.MODULE;
   0 => GLOB.ST;
     C.CAP(%"MODULE(");
     NP();
END;
PROC C.TL.END.MODULE(ST);
     C.CAP(%"END.MODULE("); ; OH(ST); PE();
END;
PROC C.TL.GLOBAL;
   1 => GLOB.ST;
   C.CAP(%"GLOBAL(");
   NP();
END;
PROC C.TL.MODE(I,J);
   C.CAP(%"MODE(");
   ;OH(I);PS();OH(J);PE();
END;
@BOX 3.1
::END
@END
@TITLE MTL13.2.6/1(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROGRAM STRUCTURE DECLARATIONS CONT
@BOX 2.0
PROCEDURES
   TL.ENTRY
   TL.I.PARAM
@BOX 3.0
END
@BOX 1.1
::PROGRAM STRUCTURE DECLARATIONS CONT
@BOX 2.1
PROC C.TL.ENTRY(N);
   C.CAP(%"ENTRY(");
   ;OH(N); OUTCH('{); OUTNAME(N); OUTCH('{);PE();
END;

PROC C.TL.I.PARAM (PROC.N, PAR.N, TYP);
   ADD.NAME();
   C.CAP(%"I.PARAM");
   ; OUTNAME(PROC.N); PS(); OH(PAR.N); PS(); OH(TYP); OUTTYPE(TYP);
   OUT.CH(')); OUT.CH('*); OH(MUTLNAME); OUT.CH(" ");
   OUT.CH('*); OH(MUTLNAME+1); NEWLINES(1);
END
@BOX 3.1
::END
@END
