@TITLE MTL27(7,8)
@COL 8S-1R-2R-3R-4R
@COL 9N-6R-7F
@FLOW 8-1-2-3-4-6-7
@BOX 1.0
SECTION 27
COMPUTATIONAL
CODE GENERATION
[IMPORTS MTL27/1]
@BOX 2.0
TYPE DECLARATIONS
@BOX 3.0
VARIABLE AND LITERAL
DECLARATIONS
@BOX 4.0
PROCEDURES

.1 PLANT
.2 PROC ENTRY
.3 PROC EXIT
.4 PROG ENTRY
.5 PROG EXIT
.6 PR VAR REFS
.7 ASS LIT 64
.8 ASS LIT 128
.9 RANGE
.10 ASS REF VAR
.11 INSERT
.12 REL REGS
.13 LIB ENTRY
.14 CYCLE
.15 CV CYCLE
.16 CV LIMIT
.17 REPEAT
.18 ASS, ASS END
.19 END CODE AREA

.20 PLANT ORDER
.21 VAR OP
.22 GEN ADDR
.23 LIT TO POOL
.24 PLANT SEQ
.25 ASS ADDR
.26 PLANT V16 CODE
.27 PLANT V32 CODE
.28 PLANT STORE
.29 PLANT LOAD
.30 PLANT A CONV
.31 PLANT COMP
.32 ADD FWD REF
.33 PLANT FWD REF
.34 GEN OPERAND
.35 CONVERT A OP
.36 PLANT CODE
.37 ROUND UP
.38 RUN ADDR
.39 CLEAR OP
.40 PLANT SLINK
.41 PLANT STACK
.42 LOAD
.43 PLANT REF
.44 GET REG
.45 FLUSH POOL
.46 PLANT STRING SIZE
.47 GET FWD REF
.48 PLANT BM CONV
.49 CONVERT BM OP
.50 ADD LIT 32
.51 UNDO OPTS
.52 GET LIT 32
@BOX 6.0
SUBCHARTS
@BOX 7.0
END
@BOX 8.0
MODULE WHICH EXPORTS
VAR.UNDEF.TY
@BOX 1.1
#MTL27/1
MODULE(PLANT,PROCENTRY,PROCEXIT,PRVARREFS,PROGENTRY,PROGEXIT,
RANGE,ASSLIT64,ASSLIT128,ASSREFVAR,CYCLE,CVCYCLE,CVLIMIT,REPEAT,
ASS,ASSEND,INSERT,INIT27,RELREGS,LIBENTRY,
RUNADDR,GETFWDREF,ROUNDUP,PLANTSTACK,PLANTLOAD,PLANTSEQ,PLANTSLINK,
CLEAROP,PLANTFWDREF,ASSADDR,PLANTV32CODE,PLANTV16CODE,PLANTCODE,UNDOOPTS,
PROGSFLIT,ADDFWDREF,GETREG,CALL,EXECENTRY,JUMPS,SUBRENTRY,ENTERVAR,
FLUSHPOOL,REGS,LASTAMODE,REGMASK,ACCREGS,NOOFPPROCS,ENDCODEAREA,
ENTERACC);
@BOX 2.1
@BOX 3.1
*GLOBAL 9;
OPDE CYCLEINIT;
ADDR STOREE LIBENTRYSEG;
$IN32 LIBENTRYADDR;
$IN LASTAMODE,LASTMS,LASTBMODE,LASTDMODE,CYCLEINITK,CYCLEPOS,CYCLETOS,NOOFPPROCS
;
ADDR FWDREFTYPE PROGSFLIT;
ADDR FWDREFTYPE FREEFWDREF;
$LI/ADDR FWDREFTYPE NILFWDREF=;
$LI FWDREFSIZE=8000,CYCLESIZE=20;
$IN OLDFRFS;
SPACE FWDREFSPACE [FWDREFSIZE];
$LI/ADDR STOREE NILSTORE=;
$LI/ADDR TYPEE NILTYPE=;
$LI/ADDR OPERANDTYPE NILOP=;
$IN32 REGS,RELREG:: BIT SIGNIFICANT, 1<<-REG NUMBER
TYPE CYCLETYPE IS
ADDR VARE CV $IN MODE,LIMITK OPDE LIMIT OPERANDTYPE L1,L2;
::CV CYCLE BIT = %10, GAP BIT = %20
CYCLETYPE [CYCLESIZE] CYCLESTACK;
TYPE POOLTYPE IS $IN NOOFUSES, LITSIZE $IN32 POOLADDR $LO64 POOLLIT
 ADDR FWDREFTYPE LITFWDREF, ADDRFWDREF;
$LI POOLSIZE=32;
POOLTYPE [POOLSIZE] POOL;
$IN POOLUSED;
*GLOBAL 1;
#MTL27.0
*GLOBAL 9;
@BOX 4.1
::DEBUG PSPEC TEST($IN);
PSPEC INIT27();
PSPEC PLANT(ADDR[INSTSEQE]);
PSPEC PROCENTRY($IN,ADDR PROCE);
PSPEC PROCEXIT(ADDR PROCE);
PSPEC PROGENTRY($IN,$IN);
PSPEC PROGEXIT($IN);
PSPEC PRVARREFS(ADDR VARE,ADDR STOREE,ADDR);
PSPEC ASSLIT64($LO64,$IN,ADDR STOREE,ADDR);
PSPEC ASSLIT128($LO64,$LO64,$IN,ADDR STOREE,ADDR);
PSPEC ASSREFVAR(ADDR VARE,ADDR STOREE,ADDR);
PSPEC RANGE($IN,$IN,ADDR OPDE,$IN,ADDR OPDE);
PSPEC INSERT($IN);
PSPEC RELREGS($IN);
PSPEC LIBENTRY(ADDR PROCE);
PSPEC CYCLE($IN,ADDR OPDE);
PSPEC CVCYCLE(ADDR VARE,$IN,ADDR OPDE,$IN);
PSPEC CVLIMIT($IN,ADDR OPDE);
PSPEC REPEAT();
PSPEC ASS();
PSPEC ASSEND();
PSPEC ENDCODEAREA();
PSPEC PLANTORDER(ADDR INSTSEQE,ADDR OPERANDTYPE);
PSPEC VAROP(ADDR VARE,$IN,ADDR OPERANDTYPE,$IN,$IN);
PSPEC GENADDR(ADDR STOREE,$IN,$IN,ADDR OPERANDTYPE);
PSPEC LITTOPOOL(ADDR $LO64,ADDR FWDREFTYPE,ADDR $IN,$IN)/ADDR FWDREFTYPE;
PSPEC PLANTSEQ($IN,$IN,$IN,ADDR OPERANDTYPE,$IN);
PSPEC ASSADDR($IN,ADDR STOREE,$IN,ADDR FWDREFTYPE);
PSPEC PLANTV16CODE($LO);
PSPEC PLANTV32CODE($LO,$LO);
PSPEC PLANTSTORE($IN,$IN,ADDR OPERANDTYPE,$IN);
PSPEC PLANTLOAD($IN,$IN,ADDR OPERANDTYPE,$IN);
PSPEC PLANTACONV($IN,$IN,$IN,$IN,$IN);
PSPEC PLANTCOMP($IN,$IN,ADDR OPERANDTYPE,$LO);
PSPEC ADDFWDREF(ADDR STOREE,$IN,$IN,ADDR FWDREFTYPE,$IN);
PSPEC PLANTFWDREF($IN,ADDR FWDREFTYPE);
PSPEC GENOPERAND(ADDR INSTSEQE,ADDR OPERANDTYPE);
PSPEC CONVERTAOP(ADDR OPERANDTYPE,$IN,$IN,$IN,$IN);
PSPEC PLANTCODE($LO,$LO);
PSPEC ROUNDUP($IN,$IN)/$IN;
PSPEC RUNADDR(ADDR STOREE,$IN)/$IN32;
PSPEC CLEAROP(ADDR OPERANDTYPE);
PSPEC PLANTSLINK($IN,$IN,$IN);
PSPEC PLANTSTACK(ADDR OPERANDTYPE,$IN);
PSPEC PLANTREF($IN,ADDR OPERANDTYPE);
PSPEC GETREG($IN,$IN,$IN)/$IN;
PSPEC GETFWDREF()/ADDR FWDREFTYPE;
PSPEC LOAD($IN,$IN,$IN,$IN,ADDR OPERANDTYPE);
PSPEC ADDLIT32($IN32,$IN,$IN32,ADDR STOREE);
PSPEC UNDOOPTS($IN);
PSPEC FLUSHPOOL();
PSPEC PLANTSTRINGSIZE($IN);
PSPEC PLANTBMCONV($IN,$IN,$IN,$IN);
PSPEC CONVERTBMOP(ADDR OPERANDTYPE,$IN,$IN);
PSPEC GETLIT32($IN32,$IN32,ADDR STOREE)/$IN32;
@BOX6.1
#MTL27.1
#MTL27.2
#MTL27.3
#MTL27.4
#MTL27.5
#MTL27.6
#MTL27.7
#MTL27.8
#MTL27.9
#MTL27.10
#MTL27.11
#MTL27.12
#MTL27.13
#MTL27.14
#MTL27.15
#MTL27.16
#MTL27.17
#MTL27.18
#MTL27.19
#MTL27.20
#MTL27.21
#MTL27.22
#MTL27.23
#MTL27.24
#MTL27.25
#MTL27.26
#MTL27.27
#MTL27.28
#MTL27.29
#MTL27.30
#MTL27.31
#MTL27.32
#MTL27.33
#MTL27.34
#MTL27.35
#MTL27.36
#MTL27.37
#MTL27.38
#MTL27.39
#MTL27.40
#MTL27.41
#MTL27.42
#MTL27.43
#MTL27.44
#MTL27.45
#MTL27.46
#MTL27.47
#MTL27.48
#MTL27.49
#MTL27.50
#MTL27.51
#MTL27.52
#MTL27/2
@BOX 7.1
*END
@BOX 8.1
#MTL27/0
@END
@TITLE MTL27/0(7,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
FIRST MODULE:-
 IMPORTS
@BOX 2.0
MODULE HEADING
@BOX3.0
EXPORTS
@BOX1.1
IMPORT TYPE VAR.E,SEL.E,VSTORE.E,LAB.E,PROC.E,STORE.E,TX.E;
@BOX2.1
MODULE(SEL.ADDR.TY,VAR.UNDEF.TY,ORIG.E,OP.TYPE.E,LIT.OPD.E,OPD.E,INST.SEQ.E,
 OPERANDTYPE,FWDREFTYPE,NILFWDREF);
@BOX3.1
TYPE FWDREFTYPE IS
 $LO32 FWDADDRESS ADDR FWDREFTYPE FRLINK ADDR STOREE FWDSTORE;
::TOP BIT OF ADDRESS = 0 (V1), 1 (V16) SCALING
::NEXT BIT OF ADDRESS= 0 (V32),1 (V16) LENGTH
::NEXT BIT OF ADDRESS= 0 (CODE),1 (POOL) REF
TYPE SEL.ADDR.TY IS ADDR VAR.E SEL.VAR;
TYPE VAR.UNDEF.TY IS
 ADDR FWDREFTYPE VARFWDREF, BOUNDFWDREF; ::ONLY IF VARF /= 0
::VAX TYPE OPERANDTYPE IS
::VAX  $LO64 OPLIT
::VAX  $IN MU6GOP,OPSIZE,OPTOPDIFF,TOPMU6GOP,REFBIT,OPTYP,V64ASV32S
::VAX  ADDR FWDREFTYPE OPFWDREF,TOPFWDREF
::VAX  OR
::VAX  $IN32 OPOFFSET,TOPLIT;
::MU6 TYPE OPERANDTYPE IS
::MU6 $LO64 OPLIT
::MU6 $IN MU6GOP,OPSIZE,OPTOPDIFF,TOPMU6GOP,REFBIT,OPTYP,V64ASV32S
::MU6 ADDR FWDREFTYPE OPFWDREF,TOPFWDREF
::MU6 OR
::MU6 $IN32 TOPLIT,OPOFFSET;
 ::MU6GOP = 1ST 9 BITS OF OPERAND
 ::TOP... = TOP 32 BITS OF (V32,V32) V64 OP
TYPE ORIG.E IS ADDR VAR.E VAR
 OR ADDR VAR.E PTR
 OR ADDR SEL.E SEL
 OR ADDR VSTORE.E V.ST;
TYPE OP.TYPE.E IS $LO SIZ $LO8 MOD, AL $IN32 DIM;
TYPE LIT.OPD.E IS $LO64 VAL
 OR $LO64 VAL.LS,VAL.MS;
TYPE OPD.E IS $LO8 ORIG.KIND
 ORIG.E ORIG
 $LO32 OFFSET
 $IN INDEX.C
 $LO8 INDEX.B
 OP.TYPE.E OP.TYPE
 OR ADDR VSTORE.E V.STOR
 OR ADDR SEL.E SEL.VAR
 OR OP.TYPE.E LIT.TYPE
 LIT.OPD.E LIT
 OR ADDR LAB.E LAB
 $LO8 LAB.K
 OR ADDR PROC.E PROCED
 $LO8 PROC.K
 OR OP.TYPE.E PAR.STK
 OR OP.TYPE.E UNSTK
 OR $LO16 REG
     OP.TYPE.E  REG.TYP
 OR $LO16 TREG
 OR $LO8 B.L.B
 $IN B.L.C
 OP.TYPE.E BL.EL
 OR $LO16 A.TYPE, OLD.A.TYPE
 OR $LO8 MFN
OR $LO8 ADKIND ADDR STOREE ADSTORE ADDR TXE ADTX;
TYPE INST.SEQ.E IS $LO16 OP.CODE
 $LO8 REG.SPEC
 $LO8 OPD.KIND
 OPD.E OPD;
$LI/ADDR FWDREFTYPE NILFWDREF=;
*END
@END
@TITLE MTL27/1(7,8)
@COL 1S-2R
@COL 6N-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
EXTERNAL
ENVIRONMENT
@BOX 2.0
TYPES
@BOX 3.0
VARIABLES &
LITERALS
@BOX 4.0
PROCEDURES
@BOX 5.0
END
@BOX 1.1
@BOX 2.1
TYPE STORE.ADDR.TY IS
 $LO32 STORE.RA,STORE.CA,MUSS.SFNS ADDR[$LO8] STORE.DESC;
TYPE STORE.E IS
 $IN STORE.I,STORE.Z,STORE.EQ.Z $LO8 STORE.KIND,SEG.NO
 STORE.ADDR.TY STORE.ADDR $LO8 STORE.TX ADDR STORE.C.ADDR
 $LO32 STORE.R.ADDR $LO8 STORE.BASE,STORE.ACCESS;
TYPE FWDREFTYPE IS
 $LO32 FWDADDRESS ADDR FWDREFTYPE FRLINK ADDR STOREE FWDSTORE;
::VAX TYPE OPERANDTYPE IS
::VAX  $LO64 OPLIT
::VAX  $IN MU6GOP,OPSIZE,OPTOPDIFF,TOPMU6GOP,REFBIT,OPTYP,V64ASV32S
::VAX  ADDR FWDREFTYPE OPFWDREF,TOPFWDREF
::VAX OR $IN32 OPOFFSET,TOPLIT;
::MU6 TYPE OPERANDTYPE IS
::MU6 $LO64 OPLIT
::MU6 $IN MU6GOP,OPSIZE,OPTOPDIFF,TOPMU6GOP,REFBIT,OPTYP,V64ASV32S
::MU6 ADDR FWDREFTYPE OPFWDREF,TOPFWDREF
::MU6 OR $IN32 TOPLIT,OPOFFSET;
IMPORT TYPE TYPE.E,PAR.E;
IMPORT LITERAL FRAME.AREAS,TX.Z,SEGSHIFT;
TYPE TX.E IS
 $LO16 TX.PROC.N $LO8 TX.STATUS,TX.BASE STORE.E[FRAME.AREAS] TX.FRAME;
TYPE PROC.ADDR.TY IS
 $LO32 PROCADDRESS ADDR FWDREFTYPE PROCSFLIT,PROCFWDREF;
TYPE PROC.ENTRYTY IS
 PROCADDRTY PROCADDR OR
 $LO32 PROCFINDN;
TYPE PROC.E IS
 $LO8 PROC.NAT,PROC.RES.TYP,PROC.INFO ADDR PAR.E PROC.PAR.P
 ADDR TYPE.E PROC.RES.TYP.P PROCENTRYTY ENTRY;
TYPE VAR.UNDEF.TY IS
 ADDR FWDREFTYPE VARFWDREF,BOUNDFWDREF;
 TYPE VAR.ADDR.TY IS
 ADDR STORE.E VAR.STORE.P $IN VAR.OFF
 OR VAR.UNDEF.TY VAR.UNDEF;
TYPE VAR.E IS
 $LO16 VAR.TYP $IN VAR.DIM $LO16 VAR.F ADDR TYPE.E VAR.TYP.P VAR.ADDR.TY VAR.ADD
R;
TYPE V.E IS $LO32 STORE.ADDR
 OR ADDR VAR.E VAR.P;
TYPE V.STORE.E IS
 ADDR PROC.E V.READ.P,V.WRITE.P $IN32 V.STORE.DIM $LO16 V.STORE.TYPE $LO8 VKIND
V.E V;
TYPE LAB.ADDR.TY IS
 $LO32 LABADDRESS ADDR FWDREFTYPE LABFWDREF;
TYPE LAB.E IS
 $LO8 LAB.USE,LAB.TX LAB.ADDR.TY LAB.ADDR;
TYPE SEL.ADDR.TY IS ADDR VAR.E SELECTVAR;
TYPE SEL.E IS $LO8 SEL.V.MODE, SEL.V.BASE.ST
 $LO16 SEL.V.BASE.N $IN SEL.V.OFFSET ADDR VAR.E SEL.V.BASE.P
 $LO16 SEL.V.TYP ADDR TYPE.E SEL.V.TYP.P $IN SEL.V.DIM
 $LO8 SEL.V.F SEL.ADDR.TY SEL.ADDR;
TYPE ORIG.E IS ADDR VAR.E VAR
    OR ADDR VAR.E PTR
    OR ADDR SEL.E SEL
    OR ADDR VSTORE.E V.ST;
TYPE OP.TYPE.E IS $LO SIZ $LO8 MOD, AL $IN32 DIM;
TYPE LIT.OPD.E IS $LO64 VAL
 OR $LO64 VAL.LS,VAL.MS;
TYPE OPD.E IS
 $LO8 ORIG.KIND ORIG.E ORIG $LO32 OFFSET $IN INDEX.C
 $LO8 INDEX.B OP.TYPE.E OP.TYPE
 OR ADDR VSTORE.E  V.STOR
 OR ADDR SEL.E  SEL.VAR
 OR OP.TYPE.E LIT.TYPE LIT.OPD.E LIT
 OR ADDR LAB.E LAB $LO8 LAB.K
 OR ADDR PROC.E PROCED $LO8 PROC.K
 OR OP.TYPE.E PAR.STK
  OR OP.TYPE.E UNSTK
 OR $LO16  REG OP.TYPE.E REG.TYP
 OR $LO16  TREG
 OR $LO8 B.L.B $IN B.L.C
 OP.TYPE.E BL.EL
 OR $LO16  A.TYPE, OLD.A.TYPE
 OR $LO8   MFN
 OR $LO8 ADKIND ADDR STOREE ADSTORE ADDR TXE ADTX;
TYPE INST.SEQ.E IS
 $LO16 OP.CODE $LO8 REG.SPEC $LO8 OPD.KIND OPD.E OPD;
TYPE LL.CALL.E IS $IN UNUSED;
TYPE CALL.PROC.E IS
 ADDR PAR.E PAR.P ADDR PROC.E PROC.P
   OR $LO32 FIND.N.I $IN FIND.N.P.NO;
TYPE CALL.E IS
 $LO8 CALL.K OP.TYPE.E RES CALL.PROC.E CALL.PROC LL.CALL.E LL.CALL;
@BOX 3.1
ADDR PROCE CURPROCP;
IMPORT LITERAL AREATZ,SEGZ:: TEST
STOREE [SEGZ] SEGT:: TEST
$LO8 [AREATZ] AREAT:: TEST
$IN TLM;
$IN TX.I,TL.PR.M;
TX.E[TX.Z] TX.S;
ADDR STORE.E CODE.SEG.P;
IMPORT LITERAL CALL.Z;
CALL.E[CALL.Z] CALL.S;
$IN CALL.I;
IMPORT LITERAL ASIZ.Z;
$LO8 [ASIZ.Z] ASIZ;
@BOX 4.1
LSPEC CURPROG($LO32);
LSPEC FINDN(ADDR[$LO8],$IN)/$LO32;
LSPEC BO($IN);
LSPEC OUTI($IN,$IN);
LSPEC NEWLINES($IN);
LSPEC SPACES($IN);
LSPEC OUTHEX($LO32,$IN);
LSPEC CAPTION(ADDR [$LO8]);
PSPEC PROPPTR($IN,$IN);
PSPEC GOTO(ADDR LABE);
PSPEC TYPESIZE($IN,ADDR TYPEE,$IN,$IN);
PSPEC RETURN(ADDR PROCE);
PSPEC S.DECL($IN,$IN)/ADDR VAR.E;
PSPEC FAULT($IN,ADDR[$LO8]);
PSPEC PLANTJUMP($IN,ADDR OPERANDTYPE);
PSPEC PLANTENTER(ADDR OPERANDTYPE,$IN,$IN,$IN);
PSPEC INITVAR(ADDR VARE);
PSPEC INITLABEL(ADDR LAB.E);
PSPEC INITPROC(ADDR PROCE);
PSPEC OUTPLANT(ADDR[INSTSEQE]);
@BOX 5.1
::END 27/1
@END
@TITLE MTL27/2(7,8)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX1.0
INITIALISATION
@BOX2.0
INIT 27
@BOX3.0
TEST
@BOX4.0
END
@BOX2.1
PROC INIT27;
::HERE BECAUSE MAIN BODY NOT OBEYED
BYTE(^FWDREFSPACE)+4=>FWDREFSPACE;
FWDREFSPACE=>OLDFRFS;
 %0303F=>REGS;
 NILFWDREF=>FREEFWDREF;
-1=>LASTMS=>LASTBMODE=>LASTAMODE=>LASTDMODE=>CYCLETOS;
FOR POOLUSED<POOLSIZE DO
 0=>NOOFUSES OF POOL[POOLUSED];
OD;
0=>POOLUSED=>NOOFPPROCS;
END;
@BOX3.1
::DEBUG PROC TEST(P);
::DEBUG IF TLPRM&%2/=0 THEN
::DEBUG CAPTION(%"$LTEST");
::DEBUG OUTI(P,1);
::DEBUG SPACES(1);
::DEBUG OUTHEX(REGS,8);
::DEBUG FI;
::DEBUG END;
@END
@TITLE MTL27.0(7,8)
@COL 1S
@COL 2R
@COL 3R
@COL 4F
@BOX1.0
**PROCESS6G & DVMSL6G
*1DATAVEC CODES($LO16)
*2@BOX3.1
*2DATAVEC INDICES($LO16)
*0 SINGLE LENGTH
+T
+F2
+1
+F 030000R1O1
+F 040000R1O1
+F 050000R1O1
+4
+5
+F 080000R1O1
+F 090000R1O1
+F 0A0000R1O1
+F 0B0000R1O1
+F 0C0000R1O1
+F 0D0000R1O1
+F 030000R1O1 031000R1 %FFFF
+F3
+ +
+6
+FT +FT +FT
+ +
+FT +FT +FT +FT +FT +FT +FT
+F7
*0 DOUBLE LENGTH
+T
+
+1
+F 730000R1O2 030000R1O5
+F 740000R1O2 040000R1O5
+F 750000R1O2 050000R1O5
+ %0001C
+ %0000C
+ + + + + +
+F 730000R1O2 030000R1O5 731000R1
   %FFFF 031000R1 %FFFF
+F3
+ + +
+FT +FT +FT
+ + + + + + + +
+FT
+
*0 DOUBLE OP SINGLE
+T
+
+1
+F 030000R1O1
+F 740000R1 040000R1O1
+F 050000R1O1
+ %0001C
+ %0000C
+ + + + + +
+F 030000R1O2 731000R1 %FFFF
   031000R1 %FFFF
+F3
+ + +
+FT +FT +FT
+ + + + + + + +
+FT
+
@BOX2.0
*0 SPECIALS
*0 COMP1
+ 0F0000R1O1
*0 COMP2
+ 0F0000R1O5
*0 STORE1
+ 000000R1O1
*0 STORE2
+ 000000R1O5
*0 BASTORE
+ 500000R1O5
*0 LOAD1
+ 020000R1O1
*0 LOAD2
+ 020000R1O5
*0 BALOAD
+ 600000R1O5
*0 BAREF
+ 700000R1O1
*0 CALL
+ 500000O7
*0 EXECENTRY
+ 600000O1
*0 SUBRENTRY
+ 6D0104 500000O7
*0 JUMPS
+ 480000O8
+ 490000O8
+ 4A0000O8
+ 4B0000O8
+ 4C0000O8
+ 4D0000O8
+ 470000O6
*0 ENTERVAR
+ 600000R1O5 4B1000 %0003 400000O3
  471000 %0002 600000O3
*0 CINC
+ 070000R1O1
*0 MFNS
+ %0002C
+ %0003C
+ %0004C
+ %0005C
+ %0006C
+ %0007C
*0 ENTERACC
+ 221000 %FFFF 2E1000 %FFF0 341002
  %00FF 4B1000 %0004 3E1000 %FFFB 400113
  471000 %0003 3E1000 %FFFB 600113
*0 COMPLEX
+T
+F2
+1
+F 220000O5
+F 320000O5
+ + +
+F 020112 080000O2 00013E 22120C %0000 020113
   080000O5 00130C %0000 32120C %0000 02013F
+F 020112 090000O2 00013E 22120C %0000 020113
   090000O5 00130C %0000 32120C %0000 02013F
+F 020112 0A0000O2 00013E 22120C %0000 020113
   0A0000O5 00130C %0000 32120C %0000 02013F
+F4 %0008C
+F4 %0009C
+F5 %0009C
+
+F3 020112 0F0000O2 490000O9 020113 0F0000O5 080000L
+ +
+6
+ + + + +
+FT +FT +FT +FT +FT +FT
+
+F7 020112 00013E 020113 00013E 020000O2
    00013E 020000O5 00013E %000BC
*0 RPOWER
+ 041000 %001B 0B0000O1 041000 %001C
*0 IPOWER
+ %000AC
*0 CCONJ
+ 020113 0A0000 00013E 32120C %0000 02013F
*0 CABS
+ 020112 0B0120 00013E 020113 0B0120 08013F 041000 %001A
*0 CMFNS
+ %000CC
+ %000DC
+ %000EC
+ %000FC
+ %0010C
*0 STACK
+ 510000O1
*0 STRING FUNCTIONS
+ %0012C
+ %0013C
+ %0011C
+ %0014C
+ %0011C
+ %0015C
+ %0011C
+ %0016C
+ %0011C
+ %0017C
+ %0011C
+ %0015C
+ + + + + +
+

*2END;
*1END;
*1@BOX2.1
*1DATAVEC SUBS($LO8)
!1
*1END;
*2::**IN -1
&
IN -1
@BOX3.0
INDICES
@BOX4.0
ASSOCIATED
LITERALS
ETC
@BOX1.1
::**IN DVMSL6G
DATAVEC CODES($LO16)
%0600  %0800  %0A00  %1000
%1200  %1400  %1600  %1800
%1A00  %0600  %0700  %FFFF
%E600  %0600  %E800  %0800
%EA00  %0A00  %0001  %0000
%E600  %0600  %E700  %FFFF
%0700  %FFFF  %0600  %E800
%0800  %0A00  %0001  %0000
%0600  %E700  %FFFF  %0700
%FFFF  %1E00  %1E00  %0000
%0000  %A000  %0400  %0400
%C000  %E000  %A000  %C000
%DA44  %A000  %9000  %9200
%9400  %9600  %9800  %9A00
%8E00  %C000  %9700  %0003
%8000  %8F00  %0002  %C000
%0E00  %0002  %0003  %0004
%0005  %0006  %0007  %4500
%FFFF  %5D00  %FFF0  %6902
%00FF  %9700  %0004  %7D00
%FFFB  %8053  %8F00  %0003
%7D00  %FFFB  %C053  %4400
%6400  %0452  %1000  %007E
%458C  %0000  %0453  %1000
%01CC  %0000  %658C  %0000
%047F  %0452  %1200  %007E
%458C  %0000  %0453  %1200
%01CC  %0000  %658C  %0000
%047F  %0452  %1400  %007E
%458C  %0000  %0453  %1400
%01CC  %0000  %658C  %0000
%047F  %0008  %0009  %0009
%0452  %1E00  %9200  %0453
%1E00  %1000  %0452  %007E
%0453  %007E  %0400  %007E
%0400  %007E  %000B  %0900
%001B  %1600  %0900  %001C
%000A  %0453  %1400  %007E
%658C  %0000  %047F  %0452
%1660  %007E  %0453  %1660
%107F  %0900  %001A  %000C
%000D  %000E  %000F  %0010
%A200  %0012  %0013  %0011
%0014  %0011  %0015  %0011
%0016  %0011  %0017  %0011
%0015  END;
@BOX2.1
DATAVEC SUBS($LO8)
%0011  %0011  %0011  %0011
%0011  %0011  %0011  %0011
%0011  %0011  %0010  %0000
%0012  %0015  %0012  %0015
%0012  %0015  %0080  %0080
%0012  %0015  %0010  %0000
%0010  %0000  %0011  %0010
%0011  %0011  %0080  %0080
%0012  %0010  %0000  %0010
%0000  %0011  %0015  %0011
%0015  %0015  %0011  %0015
%0015  %0011  %0007  %0001
%0000  %0007  %0008  %0008
%0008  %0008  %0008  %0008
%0006  %0015  %0000  %0000
%0003  %0000  %0000  %0003
%0011  %0080  %0080  %0080
%0080  %0080  %0080  %0000
%0000  %0000  %0000  %0000
%0000  %0000  %0000  %0000
%0000  %0000  %0000  %0000
%0000  %0000  %0000  %0005
%0005  %0000  %0002  %0000
%0000  %0000  %0000  %0005
%0000  %0000  %0000  %0000
%0000  %0000  %0002  %0000
%0000  %0000  %0000  %0005
%0000  %0000  %0000  %0000
%0000  %0000  %0002  %0000
%0000  %0000  %0000  %0005
%0000  %0000  %0000  %0000
%0000  %0080  %0080  %0080
%0000  %0002  %0009  %0000
%0005  %0040  %0000  %0000
%0000  %0000  %0002  %0000
%0005  %0000  %0080  %0000
%0000  %0001  %0000  %0000
%0080  %0000  %0000  %0000
%0000  %0000  %0000  %0000
%0000  %0000  %0000  %0000
%0000  %0000  %0000  %0080
%0080  %0080  %0080  %0080
%0001  %0080  %0080  %0080
%0080  %0080  %0080  %0080
%0080  %0080  %0080  %0080
%0080  END;
@BOX3.1
DATAVEC INDICES($LO16)
%4000  %8800  %0400  %8000
%8001  %8002  %1003  %1403
%8003  %8004  %8005  %8006
%8007  %8008  %8009  %8C0C
%000C  %000C  %180C  %C00C
%C00C  %C00C  %000C  %000C
%C00C  %C00C  %C00C  %C00C
%C00C  %C00C  %C00C  %9C0C
%400C  %000C  %040C  %800C
%800E  %8010  %0012  %0013
%0014  %0014  %0014  %0014
%0014  %0014  %8014  %8C1A
%001A  %001A  %001A  %C01A
%C01A  %C01A  %001A  %001A
%001A  %001A  %001A  %001A
%001A  %001A  %C01A  %001A
%401A  %001A  %041A  %801A
%801B  %801D  %001E  %001F
%0020  %0020  %0020  %0020
%0020  %0020  %8020  %8C25
%0025  %0025  %0025  %C025
%C025  %C025  %0025  %0025
%0025  %0025  %0025  %0025
%0025  %0025  %C025  %0025
%0025  %0026  %0027  %0028
%0029  %002A  %002B  %002C
%002D  %002E  %002F  %0030
%0032  %0033  %0034  %0035
%0036  %0037  %0038  %0039
%0040  %0041  %0042  %0043
%0044  %0045  %0046  %0047
%4057  %8857  %0457  %8057
%8058  %0059  %0059  %0059
%8059  %8065  %8071  %907D
%907E  %947F  %0080  %8C80
%0086  %0086  %1886  %0086
%0086  %0086  %0086  %0086
%C086  %C086  %C086  %C086
%C086  %C086  %0086  %9C86
%008F  %0094  %0095  %009B
%00A3  %00A4  %00A5  %00A6
%00A7  %00A8  %00A9  %00AA
%00AB  %00AC  %00AD  %00AE
%00AF  %00B0  %00B1  %00B2
%00B3  %00B4  %00B5  %00B5
%00B5  %00B5  %00B5  %00B5
%00B5  END;
::**IN -1
@BOX4.1
DATAVEC ACCREGS ($IN)
%10 %13 %13 %10 %13 %13 %13 %14 -1
END;:: %14 = NO REGS
DATAVEC REGMASK ($IN32)
1 2 4 8
%10 %20 %40 %80
%100 %200 %400 %800
%1000 %2000 %4000 %8000
%10000 %20000 %40000 %80000
0
END;
LITERAL COMP1=96,COMP2=97,STORE1=98,STORE2=99,
 BASTORE=100,LOAD1=101,LOAD2=102,BALOAD=103,BAREF=104,
 CALL=105,EXECENTRY=106,
 SUBRENTRY=107,JUMPS=108,ENTERVAR=115,
 CINC=116,ENTERACC=123,COMPLEXINDEX=124,RPOWER=156,IPOWER=157,
 COMPLEXCONJG=158,COMPLEXABS=159,COMPLEXMFNS=160,STACK=165,
 STRFNS=166;
DATAVEC MFNS ($IN)
117 118 -1 -1 119 120 121 122
END;
@END
@TITLE MTL27.1(7,8)
@COL 1S-2T-8T-10T-3R-4R-5T-6R-7F
@COL 9R-11R
@ROW 10-9
@FLOW 1-2-8N-10N-3-4-5-6-7
@FLOW 8Y-9-5
@FLOW 10Y-11-5
@BOX 1.0
PLANT([]INST)
@BOX 2.0
FOR EACH INSTRUCTION DO
@BOX 3.0
PROCESS OPERAND
@BOX 4.0
PROCESS FUNCTION
@BOX 5.0
OD
@BOX 6.0
RESOLVE HANGING OPTIMISATIONS
@BOX 7.0
END
@BOX 8.0
IS OPERAND = 'RESULT' ?
@BOX 9.0
ENSURE REGISTER CORRECT
@BOX 10.0
B => VSUB
@BOX 11.0
VSUB = B
@BOX 1.1
PROC PLANT(INST); ::DEBUG TEST(1);
$IN I;
OPERANDTYPE OP;
IF TLPRM&%80/=0 THEN
 OUTPLANT(INST);
FI;
@BOX 2.1
FOR I < SIZE(INST) DO
IF TLPRM&%80/=0 THEN
 CAPTION(%"$LINST");
 OUTI(I,1);
FI;
SELECT INST^[I];
@BOX 3.1
GENOPERAND(^INST^[I],^OP);
@BOX 4.1
0=>RELREG;
PLANTORDER(^INST^[I],^OP);
@BOX 5.1
RELREG-=>REGS;
%FF03F&>REGS::! DON'T RELEASE REGS IN MUTLOPS
RELREGS(REGSPEC);
OD;
@BOX 6.1
@BOX 7.1
END;
@BOX 8.1
IF OPDKIND=12,
@BOX 9.1
@BOX 10.1
IF OPDKIND=11 AND OPCODE&%7F=0,
@BOX 11.1
PLANTV16CODE(%D851):: BA12 = BM1
@END
@TITLE MTL27.2(7,8)
@COL 1S-4T-7R-5T-6R-10F
@COL 8R
@ROW 7-8
@FLOW 1-4N-7-5N-6-10
@FLOW 5Y-10
@FLOW 4Y-8-10
@BOX 1.0
PROC ENTRY(KIND,^PROC)
@BOX 4.0
SUBR ?
@BOX 5.0
TLEV =< 1?
@BOX 6.0
PLANT SAVE SLINK
@BOX 7.0
PLANT SF = NB + #0
SET FWD REF
@BOX 8.0
RESET NB
@BOX 10.0
END
@BOX 1.1
PROC PROCENTRY(KIND,PPROC); ::DEBUG TEST(3);
SELECT PPROC^; SELECT PROCADDR OF ENTRY;
UNDOOPTS(1);
@BOX 4.1
IF PROCNAT&2/=0,
@BOX 5.1
IF TXI =< 1,
@BOX 6.1
PLANTV16CODE(%BA82) ::BA13 (SLINKREG) => 2/NB
@BOX 7.1
GETFWDREF()=>PROCSFLIT;
PLANTV32CODE(%E7D0,0) ::SF =REF V64 ?/NB
ADDFWDREF(CODESEGP,STOREI OF CODESEGP^ -2, 0 ,PROCSFLIT,1);
@BOX 8.1
PLANTV16CODE(%A87E) ::NB=>STK
PLANTV16CODE(%C84D) ::NB = BA13 (SLINKREG)
@BOX 10.1
END;
@END
@TITLE MTL27.3(7,8)
@COL 1S-2R-6F
@FLOW 1-2-6
@BOX 1.0
PROC EXIT (^PROC)
@BOX 2.0
RESOLVE SF + FWD REF
@BOX 6.0
END
@BOX 1.1
PROC PROCEXIT(PPROC); ::DEBUG TEST(5);
SELECT PPROC^; SELECT PROCADDR OF ENTRY;
@BOX 2.1
IF PROCNAT &2=0 THEN
PLANTFWDREF(ROUNDUP(STOREI OF TXFRAME[1]OF TXS[TXI],3),PROCSFLIT);
FI;
@BOX 6.1
UNDOOPTS(1);
END;
@END
@TITLE MTL27.4(7,8)
@COL 1S-3T-4R-5R-2T-6R-7F
@COL 8R
@ROW 4-8
@FLOW 1-3N-4-5-2N-6-7
@FLOW 3Y-8-2Y-7
@BOX 1.0
PROG ENTRY (MODE, DIRECTORY SIZE)
@BOX 2.0
MUSS ?
@BOX 3.0
PROGRAM ?
@BOX 4.0
PLANT ADDRESS OF
INSTRUCTION AFTER DIRECTORY
@BOX 5.0
PLANT DIRECTORY
@BOX 6.0
PLANT SF = NB + 0
SET FWD REF
SAVE OLD GNB
PLANT GNB = NB
@BOX 7.0
END
@BOX 8.0
PLANT ADDRESS OF
NEXT INSTRUCTION
@BOX 1.1
PROC PROGENTRY(MODE,DIRSIZE); ::DEBUG TEST(6);
$IN TEMP;
@BOX 2.1
IF MODE&2/=0,
@BOX 3.1
IF MODE&4=0,
@BOX 4.1
PLANTV32CODE(%8F00,DIRSIZE*4+2):: BR ->START
@BOX 5.1
FOR DIRSIZE DO
 PLANTV32CODE(%C588,DIRSIZE):: JMP DIRSIZE/CO
OD;
CODESEGP=>LIBENTRYSEG;
STOREI OF CODESEGP^=>LIBENTRYADDR;
DIRSIZE*4+>STOREI OF CODESEGP^;
@BOX 6.1
PLANTV16CODE(%8400) ::MS = #0
1=>LASTMS;
PLANTV32CODE(%E7CC,0) ::SF =REF V64 ?/SF
GETFWDREF()=>PROGSFLIT;
ADDFWDREF(CODESEGP,STOREI OF CODESEGP^-2,0,PROGSFLIT,1);
PLANTV16CODE(%AA82) ::BA5 (GNB) => 2/NB
PLANTV16CODE(%CA44) ::BA5 (GNB) = NB
@BOX 7.1
END;
@BOX 8.1
PLANTV32CODE(%8F00,2):: BR ->START
@END
@TITLE MTL27.5(7,8)
@COL 1S-2T-3R-5R-4F
@FLOW 1-2N-3-5-4
@FLOW 2Y-4
@BOX 1.0
PROG EXIT (MODE)
@BOX 2.0
MUSS?
@BOX 3.0
PLANT GNB = OLD GNB
PLANT RETURN
@BOX 4.0
END
@BOX 5.0
RESOLVE SF + FWD REF
@BOX 1.1
PROC PROGEXIT(MODE); ::DEBUG TEST(7);
@BOX 2.1
IF MODE&2/=0,
@BOX 3.1
PLANTV16CODE(%CA82) ::BA5 (GNB) = V32 2/NB
PLANTV16CODE(%E0FF) ::RTS V64 -1/NB
CURPROG(STORERADDR OF CODESEGP^->>SEGSHIFT);
@BOX 4.1
FLUSHPOOL();
CAPTION(%"$LFWDREFSPACE= ");
OUTHEX(FWDREFSPACE-OLDFRFS,8);
END;
@BOX 5.1
PLANTFWDREF(ROUNDUP(STOREI OF TXFRAME[1] OF TXS[0],3),PROGSFLIT);
@END
@TITLE MTL27.6(7,8)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
PR VAR REFS (^VAR,^STORE,OFFSET)
@BOX 2.0
CALCULATE ADDRESS OF VAR AND PLANT FWD REFS
@BOX 3.0
USING DIMENSION OF VAR, PLANT FWD REFS
@BOX 4.0
END
@BOX 1.1
PROC PRVARREFS(PVAR,PSTORE,OFFSET); ::DEBUG TEST(8);
SELECT PVAR^; SELECT VARUNDEF OF VARADDR;
INITVAR(PVAR);
@BOX 2.1
PLANTFWDREF(RUNADDR(PSTORE,OFFSET)<<-3,VARFWDREF);
@BOX 3.1
PLANTFWDREF(VARDIM,BOUNDFWDREF);
@BOX 4.1
END;
@END
@TITLE MTL27.7(7,8)
@COL 1S-3R-4F
@FLOW 1-3-4
@BOX 1.0
ASS LIT 64 (VALUE,SIZE,^STORE,POSN)
@BOX 3.0
STORE VALUE
@BOX 4.0
END
@BOX 1.1
PROC ASSLIT64(VALUE,PSIZE,PSTORE,PPOSN); ::DEBUG TEST(9);
SELECT PSTORE^;
SELECT STORE.ADDR;
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LASSLIT64 ");
 OUTHEX(VALUE->>32,8);
 OUTHEX(VALUE,8);
 OUTI(PSIZE,2);
 SPACES(1);
 OUTHEX(RUNADDR(PSTORE,PPOSN)<<-3,8);
FI;
@BOX 3.1
IF PPOSN+PSIZE>STORE.Z THEN
 FAULT(0,%"SEGMENT OVERFLOW");
 OUTHEX(RUNADDR(PSTORE,0),8);
 SPACES(1);
 OUTHEX(PPOSN+PSIZE,8);
 0=>PPOSN=>STOREI;
FI;
WHILE 1->PSIZE>=0  DO
VALUE => STOREDESC^[PSIZE+PPOSN];
VALUE->>8 => VALUE;
OD;
@BOX 4.1
END;
@END
@TITLE MTL27.8(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ASS LIT 128 (VALUE1,VALUE2,SIZE,^STORE,POSN)
@BOX 2.0
ASS LIT 64 (VALUE1,8 BYTES,^STORE,POSN)
ASS LIT 64 (VALUE2,8 BYTES,^STORE,POSN+8)
@BOX 3.0
END
@BOX 1.1
PROC ASSLIT128(VALUE1,VALUE2,PSIZE,PSTORE,PPOSN); ::DEBUG TEST(10);
@BOX 2.1
ASSLIT64(VALUE1,8,PSTORE,PPOSN);
ASSLIT64(VALUE2,8,PSTORE,PPOSN+8);
@BOX 3.1
END;
@END
@TITLE MTL27.9(7,8)
@COL 1S-2F
@FLOW 1-2
@BOX1.0
RANGE
@BOX2.0
END
@BOX1.1
PROC RANGE(A,B,C,D,E);
@BOX2.1
END;
@END
@TITLE MTL27.10(7,8)
@CO< 1S-2T-3R-4R-5R-6F
@FLOW 1-2N-3-4-5-6
@FLOW 2Y-4
@BOX 1.0
ASS REF VAR (^VAR,^STORE,POSN)
@BOX 2.0
IS VAR UNBOUNDED?
@BOX 3.0
ASS ADDR (BOUND,^STORE,POSN,^BOUND FWD REF LIST)
V32 +> POSN
@BOX 4.0
GENERATE ADDRESS OF VAR
@BOX 5.0
ASS ADDR (ADDRESS,^STORE,POSN,^FWD REF LIST)
@BOX 6.0
END
@BOX 1.1
PROC ASSREFVAR(PVAR,PSTORE,PPOSN); ::DEBUG TEST(12);
SELECT PVAR^;
SELECT VAR.ADDR;
SELECT VARUNDEF;
$IN ADDRESS;
INITVAR(PVAR);
@BOX 2.1
IF VARDIM=0,
@BOX 3.1
IF VARDIM => ADDRESS<0 THEN
0 => ADDRESS;
FI;
ASSADDR(ADDRESS,PSTORE,PPOSN,BOUNDFWDREF);
4+>PPOSN;
@BOX 4.1
IF VARF&1/= 0 THEN
RUNADDR(VARSTOREP,VAROFF) => ADDRESS;
ELSE
0 => ADDRESS;
FI;
@BOX 5.1
ASSADDR(ADDRESS<<-3,PSTORE,PPOSN,VARFWDREF);
@BOX 6.1
END;
@END
@TITLE MTL27.11(7,8)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INSERT (BINARY)
@BOX 2.0
INHIBIT ALL OPTIMISATION
@BOX 3.0
PLANT BINARY
@BOX 4.0
END
@BOX 1.1
PROC INSERT (BINARY); ::DEBUG TEST(13);
SELECT CODESEGP^;
IF BINARY&%F(4)/=BINARY THEN
 FAULT(0,%"INSERTS MUST BE 16 BITS");
 ::INSERT(BINARY->>16);
FI;
@BOX 2.1
UNDOOPTS(1);
@BOX 3.1
ASSLIT64(BINARY,2,CODESEGP,STOREI);
2+>STOREI;
@BOX 4.1
END;
@END
@TITLE MTL27.12(7,8)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX 1.0
REL REGS (REGS)
@BOX 2.0
RELEASE B
@BOX 3.0
RELEASE A
@BOX 4.0
RELEASE D
@BOX 5.0
END
@BOX 1.1
PROC RELREGS(REG); ::DEBUG TEST(14);
@BOX 2.1
IF REG&1/=0 THEN
 IF LASTBMODE/=-1 THEN
  %DFFFF&>REGS;
 FI;
 -1=>LASTBMODE;
FI;
@BOX 3.1
IF REG&2/=0 THEN
 IF LASTAMODE/=-1 THEN
  $IN32 TEMP; $IN Z,T;
  LASTAMODE->>2&7=>T;
  ASIZ[LASTAMODE->>5]=>Z;
  REGMASK[ACCREGS[T]]=>TEMP;
  IF [T=5 AND Z=1] OR Z=8 THEN
   TEMP->>1!>TEMP;
  FI;
  TEMP-=%F(5)&>REGS;
 FI;
 -1=>LASTAMODE;
FI;
@BOX 4.1
IF REG&4/=0 THEN
 IF LASTDMODE/=-1 THEN
  IF LASTDMODE->>5&7=0 THEN
   %F7FFF&>REGS;
  ELSE
   %F3FFF&>REGS;
  FI;
 FI;
 -1=>LASTDMODE;
FI;
@BOX 5.1
END;
@END
@TITLE MTL27.13(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX1.0
LIB ENTRY (^PROC)
@BOX2.0
PUT ADDRESS OF PROC IN NEXT ENTRY IN LIBRARY TABLE
@BOX3.0
END
@BOX1.1
PROC LIBENTRY(PPROC);
@BOX2.1
ASSLIT64(PROCADDRESS OF PROCADDR OF ENTRY OF PPROC^<<-3,
 4,LIBENTRYSEG,LIBENTRYADDR);
4+>LIBENTRYADDR;
@BOX3.1
END;
@END
@TITLE MTL27.14(7,8)
@COL 1S-2R-3T-4R-5R-6F
@FLOW 1-2-3N-4-5-6
@FLOW 3Y-5
@BOX1.0
CYCLE (LIMIT KIND, ^LIMIT)

INIT CYCLE STACK
@BOX2.0
SDECL (INTEGER SCALAR) => CV
0 => CV CYCLE BIT
PLANT (COUNT = LIMIT)
@BOX3.0
LIMIT KIND = LITERAL > 0 ?
@BOX4.0
PLANT (ILO ->L2)
@BOX5.0
PLANT (L1: COUNT => CV)
SET L1
@BOX6.0
END
@BOX1.1
PROC CYCLE(PLIMITK,PLIMIT);
INSTSEQE ISE;
OPERANDTYPE TEMPOP;
#MTL27.14.1
PLIMITK=>LIMITK;
PLIMIT^=>LIMIT;
@BOX2.1
INITVAR(SDECL(%4C,0)=>CV);
0=>MODE;
#MTL27.14.3
PLANTLOAD(%12,4,^TEMPOP,0);
@BOX3.1
IF LIMITK=3 AND VAL OF LIT OF LIMIT>0,
@BOX4.1
PLANTJUMP(4,^L2);
@BOX5.1
RUNADDR(CODESEGP,-1)<<-3=>OPOFFSET OF L1;
UNDOOPTS(1);
#MTL27.14.2
PLANTSTORE(%12,4,^TEMPOP,0);
@BOX6.1
END;
@END
@TITLE MTL27.14.1(7,8)
@COL 1S-2T-3R-4R-5R-6R-7F
@FLOW 1-2N-3-4-5-6-7
@FLOW 2Y-4
@BOX1.0
INIT CYCLE STACK

(USED BY CYCLE AND CV CYCLE)
@BOX2.0
INCREMENT TOP OF STACK
NO OVERFLOW ?
@BOX3.0
OUTPUT ERROR MESSAGE
@BOX4.0
CREATE L1
@BOX5.0
CREATE L2
@BOX6.0
INITIALISE OTHER FIELDS
@BOX7.0
END
@BOX2.1
IF 1+>CYCLETOS < CYCLESIZE,
@BOX3.1
FAULT(0,%"CYCLE STACK OVERFLOW");
@BOX4.1
SELECT CYCLESTACK[CYCLETOS];

CLEAROP(^L1);
%100=>MU6GOP OF L1:: LITERAL
@BOX5.1
CLEAROP(^L2);
%100=>MU6GOP OF L2:: LITERAL
GETFWDREF()=>OPFWDREF OF L2;
@END
@TITLE MTL27.14.2(7,8)
@COL 1S
@BOX1.0
CREATE OPERAND FROM CV

USES TEMPOP
@BOX1.1
CLEAROP(^TEMPOP);
VAROP(CV,0,^TEMPOP,VARTYP OF CV^->>2&%7+1,0);
@END
@TITLE MTL27.14.3(7,8)
@COL 1S
@BOX1.0
CREATE OPERAND FROM LIMIT AND LIMITK

USES ISE AND TEMPOP
@BOX1.1
CLEAROP(^TEMPOP);
LIMIT=>OPD OF ISE;
LIMITK=>OPDKIND OF ISE;
GENOPERAND(^ISE,^TEMPOP);
@END
@TITLE MTL27.15(7,8)
@COL 1S-2T-3R-4R-5F
@COL 6R
@ROW 3-6
@FLOW 1-2N-3-4-5
@FLOW 2Y-6-4
@BOX1.0
CV CYCLE (^CV, INIT KIND, ^INIT, MODE)

INIT CYCLE STACK
@BOX2.0
INIT KIND = ACC ?
@BOX3.0
PLANT (COUNT = INIT)
PLANT (L1: COUNT => CV)
SET L1
@BOX4.0
SET CV, MODE
1 => CV CYCLE BIT
REMEMBER INIT KIND, INIT, CODE POSITION
@BOX5.0
END
@BOX6.0
PLANT (ACC => CV)
PLANT (L1:)
SET L1
1=> GAP BIT
@BOX1.1
PROC CVCYCLE(PCV,INITK,INIT,PMODE);
OPERANDTYPE TEMPOP;
INSTSEQE ISE;
#MTL27.14.1
INITVAR(PCV=>CV);
PMODE!%10=>MODE;
@BOX2.1
IF INITK=9,
@BOX3.1
CLEAROP(^TEMPOP);
INIT^=>OPD OF ISE;
INITK=>OPDKIND OF ISE;
GENOPERAND(^ISE,^TEMPOP);
PLANTLOAD(%12,4,^TEMPOP,0);
UNDOOPTS(1);
RUNADDR(CODESEGP,-1)<<-3=>OPOFFSET OF L1;
#MTL27.14.2
PLANTSTORE(%12,4,^TEMPOP,0);
@BOX4.1
INITK=>CYCLEINITK;
INIT^=>CYCLEINIT;
RUNADDR(CODESEGP,-1)=>CYCLEPOS;
@BOX5.1
END;
@BOX6.1
#MTL27.14.2
PLANTSTORE(%13,4,^TEMPOP,0);
UNDOOPTS(1);
RUNADDR(CODESEGP,-1)<<-3=>OPOFFSET OF L1;
%20!>MODE;
@END
@TITLE MTL27.16(7,8)
@COL 1S-2R-3T-5T-6R-4T-7T-8R-9R-22T-10T-11R-12R-13R-14F
@COL 15T-16R-17T-18T-19R-20R-21R
@ROW 5-15
@ROW 11-20
@FLOW 1-2-3N-5N-6-4N-7N-8-9-22N-10N-11-12-13-14
@FLOW 3Y-15N-16-17N-18N-19-22
@FLOW 10Y-20-12
@FLOW 4Y-22Y-12
@FLOW 5Y-4
@FLOW 7Y-9
@FLOW 15Y-17Y-14
@FLOW 18Y-21-13
@BOX1.0
CV LIMIT (LIMIT KIND, ^LIMIT)

GAP BIT SET = COUNT NOT LOADED
@BOX2.0
IF CODE POSITION /= REMEMBERED,
   1 => GAP BIT
@BOX3.0
LIMIT KIND = LITERAL ?
@BOX4.0
LIMIT KIND = VARIABLE AND
MODE /= ">=" ?
@BOX5.0
LIMIT KIND = ACC ?
@BOX6.0
PLANT (ACC = LIMIT)
@BOX7.0
IS MODE /= ">="
@BOX8.0
PLANT (ACC - #1)
">" => MODE
@BOX9.0
SDECL() => LIMIT
PLANT (ACC => LIMIT)
@BOX10.0
GAP BIT SET ?
@BOX11.0
PLANT (ACC CMP COUNT)
@BOX12.0
PLANT (IF NOT OK ->L2)
@BOX13.0
PLANT (L1:)
SET L1
1 => GAP BIT
@BOX14.0
END
@BOX15.0
IS MODE /= ">=" ?
@BOX16.0
1 -> LIMIT
">" => MODE
@BOX17.0
INIT KIND = LITERAL AND
INIT {<,<=,>,>=} LIMIT ?
@BOX18.0
GAP BIT CLEAR ?
@BOX19.0
PLANT (ACC = LIMIT)
@BOX20.0
PLANT (ACC CMP CV)
@BOX21.0
PLANT (COUNT CMP LIMIT)
PLANT (IF NOT OK ->L2)
@BOX22.0
INIT KIND = LITERAL
AND INIT = 0 ?
(AND LIMIT KIND <> ACC ?)
@BOX1.1
PROC CVLIMIT(PLIMITK,PLIMIT);
OPERANDTYPE TEMPOP;
INSTSEQE ISE;
SELECT CYCLESTACK[CYCLETOS];
PLIMITK=>LIMITK;
PLIMIT^=>LIMIT;
@BOX2.1
IF RUNADDR(CODESEGP,-1)/= CYCLEPOS THEN
 %20!>MODE;
FI;
@BOX3.1
IF LIMITK=3,
@BOX4.1
IF LIMITK=0 AND INDEXB OF LIMIT=0 AND MODE&%3/=0,
@BOX5.1
IF LIMITK=9,
@BOX6.1
#MTL27.14.3
PLANTLOAD(%13,4,^TEMPOP,0);
@BOX7.1
IF MODE&%3/=0,
@BOX8.1
PLANTV16CODE(%7201);
1!>MODE;
@BOX9.1
SELECT LIMIT;
SELECT OPTYPE;
INITVAR(SDECL(%4C,0)=>VAR OF ORIG);
0=>ORIGKIND=>OFFSET=>INDEXC=>INDEXB=>DIM;
4=>SIZ;
1=>MOD;
0=>LIMITK;
#MTL27.14.3
PLANTSTORE(%13,4,^TEMPOP,0);
@BOX10.1
IF MODE&%20/=0,
@BOX11.1
PLANTV16CODE(%7E52);
@BOX12.1
DATAVEC JMP1 ($IN)
4 3 5 2
END;
PLANTJUMP(JMP1[MODE&%3],^L2);
@BOX13.1
RUNADDR(CODESEGP,-1)<<-3=>OPOFFSET OF L1;
%20!>MODE;
@BOX14.1
END;
@BOX15.1
IF MODE&%3/=0,
@BOX16.1
$IN TEMP;
VAL OF LIT OF LIMIT=>TEMP;
(TEMP-1)=>VAL OF LIT OF LIMIT;
1!>MODE;
@BOX17.1
IF CYCLEINITK=3 AND[
 [MODE&%3=1 AND VAL OF LIT OF LIMIT>=VAL OF LIT OF CYCLEINIT] OR
 [MODE&%3=2 AND VAL OF LIT OF LIMIT=<VAL OF LIT OF CYCLEINIT] OR
 [MODE&%3=3 AND VAL OF LIT OF LIMIT<VAL OF LIT OF CYCLEINIT]],
@BOX18.1
IF MODE&%20=0,
@BOX19.1
#MTL27.14.3
PLANTLOAD(%13,4,^TEMPOP,0);
@BOX20.1
#MTL27.14.2
PLANTCOMP(%13,4,^TEMPOP,0);
@BOX21.1
#MTL27.14.3
PLANTCOMP(%12,4,^TEMPOP,0);
DATAVEC JMP2 ($IN)
2 5 3 4
END;
PLANTJUMP(JMP2[MODE&%3],^L2);
@BOX22.1
IF CYCLEINITK=3 AND VAL OF LIT OF CYCLEINIT=0,
@END
@TITLE MTL27.17(7,8)
@COL 1S-2R-3T-4T-5R-6T-7R-8T-9R-10R-11T-12R-13R-16F
@COL 14R-15R
@ROW 5-14
@ROW 12-15
@FLOW 1-2-3N-4N-5-6N-7-8N-9-10-11N-12-13-16
@FLOW 3Y-15-13
@FLOW 4Y-14-8Y-10
@FLOW 6Y-8
@FLOW 11Y-13
@BOX1.0
REPEAT

GAP BIT SET = "COUNT => CV" NOT IN LOOP
@BOX2.0
PLANT (COUNT = CV)
@BOX3.0
CV CYCLE BIT = 0 ?
@BOX4.0
MODE SAYS + 1 ?
@BOX5.0
PLANT (COUNT - #1)
@BOX6.0
LIMIT KIND = LITERAL
AND LIMIT = 0 ?
@BOX7.0
PLANT (COUNT CMP LIMIT)
@BOX8.0
GAP BIT CLEAR ?
@BOX9.0
PLANT (COUNT => CV)
@BOX10.0
PLANT (IF OK ->L1)
@BOX11.0
GAP BIT SET OR
CV NOT WANTED ?
@BOX12.0
PLANT (COUNT => CV)
@BOX13.0
PLANT (L2:)
@BOX14.0
PLANT (COUNT CINC LIMIT)
@BOX15.0
PLANT (COUNT - #1)
PLANT (IHI ->L1)
@BOX16.0
END
@BOX1.1
PROC REPEAT;
OPERANDTYPE TEMPOP,TEMPCVOP;
INSTSEQE ISE;
SELECT CYCLESTACK[CYCLETOS];
IF MODE&%B=%A THEN
 1!>MODE;
FI;
@BOX2.1
::#MTL27.14.2
CLEAROP(^TEMPCVOP);
VAROP(CV,0,^TEMPCVOP,VARTYP OF CV^->>2&%7+1,0);
PLANTLOAD(%12,4,^TEMPCVOP,0);
@BOX3.1
IF MODE&%10=0,
@BOX4.1
IF MODE&%2=0,
@BOX5.1
PLANTV16CODE(%5201);
@BOX6.1
IF LIMITK=3 AND VAL OF LIT OF LIMIT=0,
@BOX7.1
#MTL27.14.3
PLANTCOMP(%12,4,^TEMPOP,0);
@BOX8.1
IF MODE&%20=0,
@BOX9.1
::#MTL27.14.2
PLANTSTORE(%12,4,^TEMPCVOP,0);
@BOX10.1
DATAVEC JMP1 ($IN)
3 2 5
END;
PLANTJUMP(JMP1[MODE&%3-1],^L1);
@BOX11.1
::IF MODE&%20/=0 OR MODE&%4=0,
IF MODE&%24/=%4,
@BOX12.1
::#MTL27.14.2
PLANTSTORE(%12,4,^TEMPCVOP,0);
@BOX13.1
PLANTFWDREF(RUNADDR(CODESEGP,-1)<<-3,OPFWDREF OF L2);
UNDOOPTS(1);
@BOX14.1
#MTL27.14.3
PLANTSEQ(CINC,%12,0,^TEMPOP,0);
@BOX15.1
PLANTV16CODE(%5201);
PLANTJUMP(5,^L1);
@BOX16.1
1->CYCLETOS;
END;
@END
@TITLE MTL27.18(7,8)
@COL 1S-2R-3R-4F
@BOX1.0
NOT IMPLEMENTED
@BOX2.0
ASS
@BOX3.0
ASS END
@BOX4.0
END
@BOX2.1
PROC ASS;
END;
@BOX3.1
PROC ASSEND;
END;
@END
@TITLE MTL27.19(7,8)
@COL 1S-2R-3T-4R-5R-6F
@COL 7R
@ROW 4-7
@FLOW 1-2-3N-4-5-6
@FLOW 3Y-7-5
@BOX1.0
END CODE AREA
@BOX2.0
PLANT (-> L)
FLUSH POOL
@BOX3.0
POOL EMPTY ?
@BOX4.0
PLANT (L:)
@BOX5.0
EMPTY POOL
@BOX6.0
END
@BOX7.0
RESET CODE ADDRESS
@BOX1.1
PROC ENDCODEAREA;
$IN TEMP;
@BOX2.1
STOREI OF CODESEGP^=>TEMP;
PLANTV32CODE(%8F00,0);
FLUSHPOOL();
@BOX3.1
IF STOREI OF CODESEGP^-4=TEMP,
@BOX4.1
ASSLIT64((STOREI OF CODESEGP^-TEMP->>1),2,CODESEGP,TEMP+2);
::FAULT(0,%"POOL FLUSHED");
@BOX5.1
FOR TEMP<POOLSIZE DO
 0=>NOOFUSES OF POOL[TEMP];
OD;
0=>POOLUSED;
@BOX6.1
END;
@BOX7.1
TEMP=>STOREI OF CODESEGP^;
@END
@TITLE MTL27.20(7,8)
@COL 1S-2C-3R-4R-5R-6R-7C-9F
@COL 10R
@ROW 4-10
@FLOW 1-2
@FLOW 3-10
@FLOW 4-10
@FLOW 7-9
@BOX 1.0
PLANT ORDER (^INST,^OPERAND)
@BOX 2.0
CASE
R
OF
@BOX 3.0
B: SELECT B REG
@BOX 4.0
A: SELECT A REG
@BOX 5.0
D: SELECT D REG
PROCESS ADDRESS ORDER
[MTL27.20.1]
@BOX 6.0
ORG: PROCESS ORG ORDER
[MTL27.20.2]
@BOX 7.0
ESAC
@BOX 9.0
END
@BOX 10.0
PROCESS ARITH ORDER
[MTL27.20.3]
@BOX 1.1
PROC PLANTORDER (INST,OP); ::DEBUG TEST(15);
SELECT INST^;
SELECT OP^;
$IN MU6GREG,Z,T,R,F,TEMP,TEMP2,TEMP3,TEMP4;
OPCODE&%1F => F;
OPCODE->>5&%3 => R;
OPCODE->>7&%7 => T;
ASIZ[OPCODE->>10] => Z;
@BOX 2.1
SWITCH
R\RB,RA,RD,RC;
@BOX 3.1
RB: %11 => MU6GREG ::BM1
%20000!>REGS;
OPCODE->>5=>LASTBMODE;
@BOX 4.1
RA:
IF T=6 THEN
 IF Z=1 THEN
  OPCODE&%1F!%17B0=>OPCODE;
  8=>Z;
  7=>T;
 ELSE
  OPCODE&%1F!%17A0=>OPCODE;
  8=>Z;
 FI::T=6:COMPLEX, =7:STRING
FI;
ACCREGS[T]=>MU6GREG;
REGMASK[MU6GREG]=>TEMP!>REGS;
IF [T=5 AND Z=1] OR Z=8 THEN
 TEMP->>1!>REGS;
FI;
OPCODE->>5=>LASTAMODE;
@BOX 5.1
RD:
15=>MU6GREG ::D
IF Z=0 THEN
 %8000!>REGS;
ELSE
 %C000!>REGS;
FI;
OPCODE->>5=>LASTDMODE;
#MTL27.20.1
@BOX 6.1
RC:
#MTL27.20.2
@BOX 7.1
E:
RESAC:
@BOX 9.1
END;
@BOX 10.1
#MTL27.20.3
@END
@TITLE MTL27.20.1(7,8)
@COL 1S-2C-3R-4R-5R-6R-8F
@FLOW 1-2
@BOX 1.0
PROCESS ADDRESS ORDER
@BOX 2.0
CASE
F
OF
@BOX 3.0
=>: PLANT STORE DO (& DB)
@BOX 4.0
= : LOAD D WITH OP
@BOX 5.0
BASE: IF BCHK, PLANT CHK B >= 0
PLANT DB - B
IF BCHK, PLANT CHK DB >= 0
PLANT DO + (B * ELTSIZE)
@BOX 6.0
LIMIT: PLANT DB = B + 1
@BOX 7.0
ESAC
@BOX 8.0
ESAC
@BOX 2.1
SWITCH F\D0,E,D2,E,E,E,
D6,D7;
@BOX 3.1
D0:
IF OPSIZE=-1 THEN
 IF Z=1 THEN 8=>OPSIZE ELSE 4=>OPSIZE FI;
FI;
PLANTSTORE(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX 4.1
D2:
LOAD(MU6GREG,2,5,Z,OP);
->RESAC;
@BOX 5.1
D6:
IF BLB OF OPD/=0 THEN
 IF BLC OF OPD/=0 THEN
  PLANTCODE(%3000,BLC OF OPD) ::BM1 (B) + B.LIT
 FI;
   PLANTV16CODE(%207E) ::BM1 (B) => STK
   PLANTV16CODE(%343F+MU6GREG) ::BM1 (B) -: ?BOUND
   PLANTV16CODE(MU6GREG<<-9+%BE51) ::?BOUND = BM1 (B)
   PLANTV16CODE(%247F) ::BM1 (B) = UNST
  IF SIZ OF BLEL OF OPD=>TEMP/=1 THEN
   PLANTCODE(%3600,TEMP) ::BM1 (B) * #?
   FI;
   PLANTV32CODE(MU6GREG*%204+%E141,0) ::?ORIGIN =REF $0/BM1 (B)/?ORIGIN
ELSE
 PLANTV32CODE(MU6GREG*%204+%BEFC,0-BLC OF OPD) ::?BOUND - B.LIT
 PLANTV32CODE(MU6GREG*%204+%E140,BLC OF OPD * SIZ OF BLEL OF OPD) ::?ORIGIN MOD
B.LIT
FI;
->RESAC;
@BOX 6.1
D7:
0=>TEMP;
IF BLB OF OPD/=0 THEN
 1=>TEMP ::BM1 (B)
FI;
PLANTCODE(MU6GREG<<-9+%BF00+TEMP,1+BLC OF OPD) ::?BOUND = #1+B.LIT/B.REG
->RESAC;
@END
@TITLE MTL27.20.2(7,8)
@COL 1S-2C-14R-10R-11R-3R-13F
@FLOW 1-2
@BOX 1.0
PROCESS ORG ORDER
@BOX 2.0
CASE
F
OF
@BOX3.0
STACK NILS:
PLANT INCREMENT SF
@BOX 10.0
ACONV: PLANT CONVERT
@BOX 11.0
ENTER: PLANT ENTER
@BOX 13.0
BCONV: NO ACTION

ESAC
@BOX 14.0
IF'S: PLANT BRANCH
@BOX 2.1
SWITCH F\C0,C0,C0,
C0,C0,C0,C0,C7,C8,E,RESAC,C11;
@BOX3.1
C11:
PLANTV32CODE(%E7CC,MFN OF OPD);
->RESAC;
@BOX 10.1
C7:
PLANTACONV(ASIZ[OLDATYPE OF OPD->>3&%7],OLDATYPE OF OPD&%7,
 ASIZ[ATYPE OF OPD->>3&%7]=>Z,ATYPE OF OPD&%7=>T,ATYPE OF OPD->>6);
ATYPE OF OPD&%3F<<-2=>LASTAMODE;
%2FF3F&>REGS::! CHANGE WITH GETREG
REGMASK[ACCREGS[T]]=>TEMP!>REGS;
IF [T=5 AND Z=1] OR Z=8 THEN
 TEMP->>1!>REGS;
FI;
->RESAC;
@BOX 11.1
C8:PLANTENTER(OP,TXI,0,0);
->RESAC;
@BOX 14.1
C0:PLANTJUMP(F,OP);
->RESAC;
@END
@TITLE MTL27.20.3(7,8)
@COL 1S-2C-5R-8C-9R-11F
@COL 3R-4R
@ROW 5-3
@FLOW 1-2
@FLOW 3-4
@FLOW 5-8
@BOX 1.0
PROCESS ARITH ORDER
@BOX 2.0
CASE
ADDRESSING
OF
@BOX 3.0
INTO STORE: PLANT ORDER (FROMSTORE)
@BOX 4.0
STORE: PLANT CONVERT
 PLANT STORE
 PLANT CONVERT BACK
@BOX 5.0
FROM STORE: CONVERT OPERAND TO CORRECT MODE
@BOX 8.0
CASE
ORDER TYPE
OF
@BOX 9.0
NORMAL,=,=-  :MTL27.20.4
COMP,V32 SHIFT  :MTL27.20.5
MFN,**  :MTL27.20.6
GEN     :MTL27.20.7
PTR     :MTL27.20.8
COMPLEX :MTL27.20.9
STRING  :MTL27.20.10
@BOX 11.0
ESAC
@BOX 1.1
$IN INDEX;
F=>INDEX;
IF T>3 THEN
 SWITCH T-4\AGEN,ANEXT,ANEXT,ASTR;
FI;
ANEXT: ::IF T=4,->AGEN;
IF [T=1 OR T=2] AND Z=8 THEN
 32+>INDEX;
 IF OPSIZE=<4 THEN
  32+>INDEX;
 FI;
FI;
@BOX 2.1
SWITCH INDICES[INDEX]->>14\
OPESAC,S,FS,ISL;
@BOX 3.1
ISL: 16->OPCODE OF INST^;
OPSIZE=>TEMP;
PLANTORDER(INST,OP);
IF Z>TEMP THEN
 GENOPERAND(INST,OP);
FI;
@BOX 4.1
S:
IF OPSIZE=-1 THEN
 T=>OPTYP;
 IF T/=5 THEN
  Z=>OPSIZE;
 ELSE
  IF Z=1 THEN 8=>OPSIZE ELSE 4=>OPSIZE FI;
 FI;
FI;
IF R/=1 THEN
 PLANTSTORE(MU6GREG,OPSIZE,OP,0);
ELSE
 PLANTACONV(Z,T,OPSIZE,OPTYP,0);
 PLANTSTORE(MU6GREG,OPSIZE,OP,0);
 IF 1<<-R&REGSPEC=0 THEN
  PLANTACONV(OPSIZE,OPTYP,Z,T,0);
 FI;
FI;
->RESAC;
@BOX 5.1
FS:
IF R=1 THEN
 CONVERTAOP(OP,Z,T,MU6GREG,OPTYP);
ELSE IF R=0 THEN
 CONVERTBMOP(OP,Z,OPTYP);
FI;FI;
@BOX 8.1
OPESAC:
IF T>3 THEN
 SWITCH T-4\AGEN,APTR,ACMPLX,ASTR;
FI;
SWITCH INDICES[INDEX]->>10&%F\
A0,A1,A2,A3,A4,A5,A6,A7;
@BOX 9.1
#MTL27.20.4
#MTL27.20.5
#MTL27.20.6
#MTL27.20.7
#MTL27.20.8
#MTL27.20.9
#MTL27.20.10
@END
@TITLE MTL27.20.4(7,8)
@COL 1S-2C-3R-4C-5T-6R-7F
@COL 8R-9C-10R
@ROW 6-8
@FLOW 2-3
@FLOW 4-5N-6
@FLOW 5Y-8-9-10
@BOX 1.0
NORMAL,=,=-
@BOX 2.0
NORMAL
@BOX 3.0
PLANT SEQUENCE
@BOX 4.0
=-
@BOX 5.0
IS OPERAND A LITERAL?
@BOX 6.0
LOAD OPERAND
PLANT NEGATE
@BOX 7.0
END
@BOX 8.0
NEGATE LITERAL OPERAND
@BOX 9.0
=
@BOX 10.0
LOAD OPERAND
@BOX 2.1
A0:
@BOX 3.1
PLANTSEQ(INDEX,MU6GREG,-1,OP,0);
->RESAC;
@BOX 4.1
A2:
@BOX 5.1
IF MU6GOP=%100,
@BOX 6.1
LOAD(MU6GREG,R,T,Z,OP);
PLANTV16CODE(MU6GREG<<-13+%1400) ::BM? -: #0
->RESAC;
@BOX 8.1
IF T=0 THEN
 IF OPSIZE=8 THEN
  %80(15)-=>OPLIT;
 ELSE
  %80(7)-=>OPLIT;
 FI;
ELSE
 0-OPOFFSET=>OPOFFSET;
FI;
@BOX 9.1
A1:
@BOX 10.1
LOAD(MU6GREG,R,T,Z,OP);
->RESAC;
@END
@TITLE MTL27.20.5(7,8)
@COL 1S-2C-3R-4C-5T-6R-7C-8T-9R-10F
@COL 11R-12R
@ROW 6-11
@ROW 9-12
@FLOW 2-3
@FLOW 4-5N-6
@FLOW 5Y-11
@FLOW 7-8N-9
@FLOW 8Y-12
@BOX 1.0
COMP,V32 SHIFTS
@BOX 2.0
COMP
@BOX 3.0
PLANT COMPARE
@BOX 4.0
V32->>
@BOX 5.0
A/B <<- 32-SIZE
LITERAL OPERAND?
@BOX 6.0
BM? = OP
A/B ->> BM?+32-SIZE
@BOX 7.0
V32<<-
@BOX 8.0
LITERAL OPERAND?
@BOX 9.0
BM? = OP
A/B <<- BM?
@BOX 10.0
END
@BOX 11.0
A/B ->> OP+32-SIZE
@BOX 12.0
A/B <<- OP
@BOX 2.1
A3:
@BOX 3.1
OPSIZE=>TEMP;
Z=>OPSIZE;
IF T=2 THEN
 1=>T;
FI;
IF R=1 THEN
 PLANTACONV(Z,T,4,T,0);
 CONVERTAOP(OP,4,T,MU6GREG,T);
ELSE IF R=0 THEN
 PLANTBMCONV(MU6GREG,Z,T,4);
 CONVERTBMOP(OP,4,T);
FI;FI;
TEMP=>OPSIZE;
PLANTCOMP(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX 4.1
A5:
@BOX 5.1
IF 4-Z*8=>TEMP2/=0 THEN
 PLANTV16CODE(MU6GREG<<-13+%1C00+(0-TEMP2&%3F)):: BM->>L
FI;
IF MU6GOP=%100,
@BOX 6.1
GETREG(-1,%11,%13)=>TEMP;
PLANTLOAD(TEMP,4,OP,0);
PLANTV32CODE(MU6GREG<<-13+TEMP+%1CF0,%C0+TEMP2) ::BM<<-
->RESAC;
@BOX 7.1
A4:
@BOX 8.1
4-Z*8=>TEMP2;
IF MU6GOP=%100,
@BOX 9.1
GETREG(-1,%11,%13)=>TEMP;
PLANTLOAD(TEMP,4,OP,0);
PLANTV16CODE(TEMP<<-13+%1400) ::BM? -: #0
PLANTV16CODE(MU6GREG<<-13+TEMP+%1C40):: BM<<-
->RESAC;
@BOX 11.1
PLANTV32CODE(MU6GREG<<-13+%1C00,OPOFFSET+TEMP2!%C0) ::BM<<-
->RESAC;
@BOX 12.1
PLANTV16CODE(MU6GREG<<-13+%1C00+(0-OPOFFSET&%3F)) ::BM<<-
->RESAC;
@END
@TITLE MTL27.20.6(7,8)
@COL 1S-2C-3R-4R-5R-6R-7R-8R-9R-18F
@COL 19R-10R-11R-12R-13R-14R-15R-16R
@ROW 1-19
@ROW 3-10
@BOX1.0
MFN
@BOX2.0
CASE
(MFN, TYPE)
OF
@BOX3.0
MOD1, SIGN1, DIM1,
MAXS, MINS, ATAN1:
STACK ACC
@BOX4.0
ASIN, ACOS, SINH,
COSH, TANH, ATAN2:
STACK ACC
CALL MFN
@BOX5.0
SQRT, SIN, COS, LOG,
EXP, ATAN, R.ABS:
SP1 ?
@BOX6.0
LOG.10:
SP1 LOG.E
ACC * #LOG.10(E)
@BOX7.0
MAX.M, MIN.M:
ACC COMP V? 0/SF
BLE/BGE .+V32
ACC => V? 0/SF
@BOX8.0
MAX.F, MIN.F:
ACC COMP V? 0/SF
BGT/BLT .+V32
ACC = V? 0/SF
SF = REF V64 -1/SF
@BOX9.0
XSIGN:
ACC COMP #0
BM? = GE
BM? <<- #1
BM? - #1
ACC = BM?
SP1 #I=>R
@BOX10.0
I.ABS:
[ACC COMP #0]
BGE .+V16
ACC RSB #0
@BOX11.0
ODD:
ACC AND #1
@BOX12.0
I.MOD2:
ACC RDV UNST
ACC = BREM
@BOX13.0
SIGN2:
ACC COMP #0
BGE .+V48
ACC = UNST
ACC = ABS(ACC)
ACC RSB #0
BR .+V16
ACC = UNST
ACC = ABS(ACC)
@BOX14.0
DIM2:
ACC RSB UNST
[ACC COMP #0]
BGE .+V16
ACC = #0
@BOX15.0
R.MOD2:
ACC => STK
ACC /: V64 -1/SF
ACC CONV INT (TRUNC)
ACC CONV REAL
ACC * UNST
ACC -: UNST
@BOX16.0
TAN:
ACC => STK
SP1 COS
ACC => STK
ACC = V64 -1/SF
SP1 SIN
ACC DIV UNST
SF = REF V64 -1/SF
@BOX18.0
END
@BOX19.0
**
@BOX1.1
DATAVEC SP1S ($IN)
%804 -1[12] %81A %81E %816 %81B %81C -1[4] %819
END;
@BOX2.1
A6:
SWITCH T\SW0,SW1,SW2,SW3;
SW0:SWITCH MFN OF OPD\M3,M1,M13,M1,M11,M1,M12,M1,M5,M6,
 M1,M5,M6,M3,M3,M3,M3,M3,M4,M14,M2,M2,M3,M1,M2,
 M2,M2,M2,M7:: REAL
SW1:SWITCH MFN OF OPD\M8,M1,M10,M1,M11,M1,M12,M1,M5,
 M6,M1,M5,M6,M9:: INTEGER
SW2:FAULT(0,%"LOGICAL MFN");->RESAC;
SW3:FAULT(0,%"DECIMAL MFN");->RESAC;
@BOX3.1
M1:
PLANTV16CODE(MU6GREG<<-13+%7E);
->RESAC;
@BOX4.1
M2:
PLANTV16CODE(MU6GREG<<-13+%7E);
PLANTSEQ(MFNS[MFN OF OPD-20],MU6GREG,-1,NILOP,0);
->RESAC;
@BOX5.1
M3:
PLANTV16CODE(SP1S[MFN OF OPD]);
->RESAC;
@BOX6.1
M4:
PLANTV16CODE(SP1S[16]);
CLEAROP(OP);
%100=>MU6GOP;
8=>OPSIZE;
%406F2DEC549B9419=>OPLIT:: LOG10(E)
PLANTSEQ(11,MU6GREG,-1,OP,0):: ACC *
->RESAC;
@BOX7.1
M5:
MU6GREG<<-13=>TEMP;
IF Z=8 THEN
 0=>TEMP2;
 %1CC+>TEMP;
ELSE
 1=>TEMP2;
 %18C+>TEMP;
FI;
PLANTV32CODE(TEMP+%1E00,TEMP2);
IF MFN OF OPD=8 THEN
 PLANTV16CODE(%9803):: MAX
ELSE
 PLANTV16CODE(%9403):: MIN
FI;
PLANTV32CODE(TEMP,TEMP2);
->RESAC;
@BOX8.1
M6:
MU6GREG<<-13=>TEMP;
IF Z=8 THEN
 0=>TEMP2;
 %1CC+>TEMP;
ELSE
 1=>TEMP2;
 %18C+>TEMP;
FI;
PLANTV32CODE(TEMP+%1E00,TEMP2);
IF MFN OF OPD=9 THEN
 PLANTV16CODE(%9A03):: MAX
ELSE
 PLANTV16CODE(%9603):: MIN
FI;
PLANTV32CODE(TEMP+%400,TEMP2);
PLANTV32CODE(%E7CC,-1);
->RESAC;

@BOX9.1
M7:
PLANTV16CODE(%1E00);
GETREG(%13,%13,%13):: BM3
PLANTV16CODE(%646A);
PLANTV16CODE(%7C3F);
PLANTV16CODE(%703F);
PLANTV16CODE(%0053);
PLANTV16CODE(%0800);
->RESAC;
@BOX10.1
M8:
PLANTV16CODE(%7E00):: ?
PLANTV16CODE(%9402);
PLANTV16CODE(%7400);
->RESAC;
@BOX11.1
M9:
PLANTV16CODE(%6801);
->RESAC;
@BOX12.1
M10:
PLANTV16CODE(%7A7F);
PLANTV16CODE(%6475);
->RESAC;
@BOX13.1
M11:
MU6GREG<<-13=>TEMP;
PLANTV16CODE(TEMP+%1E00):: ?
IF T=0 THEN
 PLANTV16CODE(%9407);
ELSE
 PLANTV16CODE(%9406);
FI;
PLANTV16CODE(TEMP+%47F);
IF T=0 THEN
 PLANTV16CODE(%1E00);
FI;
PLANTV16CODE(%9402);
PLANTV16CODE(TEMP+%1400);
PLANTV16CODE(TEMP+%1400);
IF T=0 THEN
 PLANTV16CODE(%8E05);
ELSE
 PLANTV16CODE(%8E04);
FI;
PLANTV16CODE(TEMP+%47F);
IF T=0 THEN
 PLANTV16CODE(%1E00);
FI;
PLANTV16CODE(%9402);
PLANTV16CODE(TEMP+%1400);
->RESAC;
@BOX14.1
M12:
MU6GREG<<-13=>TEMP;
PLANTV16CODE(TEMP+%147F);
IF T=0 THEN
 PLANTV16CODE(%1E00);
FI;
PLANTV16CODE(%9402);
PLANTV16CODE(TEMP+%400);
->RESAC;
@BOX15.1
M13:
PLANTV16CODE(%007E);
PLANTV32CODE(%1BCC,-1);
PLANTV16CODE(%0801);
PLANTV16CODE(%0800);
PLANTV16CODE(%167F);
PLANTV16CODE(%147F);
->RESAC;
@BOX16.1
M14:
PLANTV16CODE(%007E);
PLANTV16CODE(SP1S[15]);
PLANTV16CODE(%007E);
PLANTV32CODE(%05CC,-1);
PLANTV16CODE(SP1S[14]);
PLANTV16CODE(%187F);
PLANTV32CODE(%E7CC,-1);
->RESAC;
@BOX19.1
A7:
IF T=0 THEN
 RPOWER=>INDEX;
ELSE
 IF MU6GOP/=%7F THEN
  PLANTV16CODE(MU6GREG<<-13!%007E):: STACK ACC
  PLANTSTACK(OP,0):: STACK OP
 ELSE
  PLANTV32CODE(%A3CC,0):: RESTACK OP
  PLANTV32CODE(MU6GREG<<-13!%01CC,-1):: SAVE ACC
 FI;
 IPOWER=>INDEX;
FI;
->A0;
@END
@TITLE MTL27.20.7(7,8)
@COL 1S-2T-3C-4R-5R-6R-7F
@COL 8T-15T-9R-10T-11R-12R
@COL 13R-16T-17R-14R
@COL 18R-19R
@ROW 3-8
@ROW 15-13
@ROW 11-14
@ROW 17-18
@FLOW 1-2N-3
@FLOW 2Y-8N-15N-9-10N-11-12
@FLOW 8Y-13
@FLOW 10Y-14-12
@FLOW 15Y-16N-17
@FLOW 16Y-18-19
@BOX 1.0
GEN
@BOX 2.0
LONG ORDER
@BOX 3.0
CASE
FN
OF
@BOX 4.0
PLANT LOAD
@BOX 5.0
PLANT STORE
@BOX 6.0
PLANT COMPARE
@BOX 7.0
END
@BOX 8.0
LOAD ORDER
@BOX 9.0
PLANT LOOP
INITIALISATION
@BOX 10.0
STORE ORDER
@BOX 11.0
PLANT COMPARE LOOP
@BOX 12.0
PLANT LOOP
TERMINATION
@BOX 13.0
KEEP ADDRESS IN ACC
@BOX 14.0
PLANT MOVE LOOP
@BOX15.0
NOT BYTE STRING ?
@BOX16.0
STORE => STK ?
@BOX17.0
FAULT
@BOX18.0
STACK FIRST (SIZE MOD 8) BYTES
@BOX19.0
STACK REMAINDER
IN 8 BYTE UNITS
@BOX 1.1
$IN TEMPADDR,TEMPSIZE;
AGEN:
@BOX 2.1
IF OPSIZE>4/=8,
@BOX 3.1
IF F=2,->A8;
IF F=0,->A9;
->A10;
@BOX 4.1
A8:
PLANTLOAD(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX 5.1
A9:
PLANTSTORE(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX 6.1
A10:
PLANTCOMP(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX 8.1
IF F=2,
@BOX 9.1
OPSIZE=>TEMPSIZE;
1=>OPSIZE;
PLANTV16CODE(GETREG(-1,6,11)=>TEMP<<-9+%C053):: BA=BM3
IF MU6GOP&%3/=0 THEN
 PLANTREF(GETREG(-1,6,11)=>TEMP2,OP);
 TEMP2<<-2+%140=>MU6GOP;
 0=>OPLIT;
FI;
PLANTV16CODE(GETREG(-1,%11,%13)=>TEMP2<<-13+%0400):: BM = #0
PLANTSTRINGSIZE(1);
TEMP2-16+>MU6GOP;
STOREI OF CODESEGP^=>TEMPADDR;
GETREG(%12,%11,%13)=>TEMP3;
::LOOP:
PLANTV32CODE(TEMP3<<-11+TEMP<<-2+TEMP2+%530,0):: BM= 1ST OP[BM]
@BOX 10.1
IF F=0,
@BOX 11.1
PLANTCOMP(TEMP3,1,OP,0);
IF TEMPSIZE=<32 THEN
 PLANTV16CODE(%9203):: INE +3
ELSE
 PLANTV16CODE(%9204):: INE +4
FI;
@BOX 12.1
PLANTCODE(TEMP2<<-13+%0E00,TEMPSIZE-1):: BM CINC #OPSIZE-1
PLANTV16CODE(TEMPADDR-STOREI OF CODESEGP^->>1&%3F+%9600):: IMI ->LOOP
->RESAC;
@BOX 13.1
1=>REFBIT;
LOAD(MU6GREG,R,T,Z,OP);
%80(4)!>REGS:: SET BM3 IN USE
->RESAC;
@BOX 14.1
PLANTSTORE(TEMP3,1,OP,0);
@BOX15.1
IF REGSPEC&2/=0 THEN
 %7F(4)&>REGS:: SET BM3 NOT IN USE
FI;
IF MU6GOP&%1C0/=%140,
@BOX16.1
IF MU6GOP=%7E AND F=0,
@BOX17.1
FAULT(0,%"NOT BYTE STRING IN AGGR ORDER");
->RESAC;
@BOX18.1
PLANTV16CODE(GETREG(-1,6,11)=>TEMP<<-9+%C053):: BA=BM3
0=>TEMP3;
TEMP<<-2!%A340=>TEMP2;
IF OPSIZE&7=>TEMPSIZE/=0 THEN
 PLANTSTRINGSIZE(TEMPSIZE);
 PLANTV32CODE(TEMP2,TEMP3);
 TEMPSIZE+>TEMP3;
FI;
@BOX19.1
IF OPSIZE->>3=>TEMPSIZE>0 THEN
 PLANTSTRINGSIZE(8);
 IF TEMPSIZE=<4 THEN
  FOR TEMPSIZE DO
   PLANTV32CODE(TEMP2,TEMP3);
   8+>TEMP3;
  OD;
 ELSE
  PLANTV16CODE(GETREG(-1,%11,%13)=>TEMP4<<-13+%0400):: BM = #0
  STOREI OF CODESEGP^=>TEMPADDR:: L:
  PLANTV32CODE(TEMP2,TEMP3):: STACK $ N/BA
  PLANTV32CODE(TEMP*%204+%E140,8):: BA + #8
  PLANTCODE(TEMP4<<-13+%0E00,TEMPSIZE-1):: BM CINC #UNITS-1
  PLANTV16CODE(TEMPADDR-STOREI OF CODESEGP^->>1&%3F+%9600):: IMI -> L
 FI;
FI;
->RESAC;
@END
@TITLE MTL27.20.8(7,8)
@COL 1S-2C-3R-4R-5R-6R-7R-8F
@FLOW 1-2
@BOX1.0
PROCESS PTR ORDER
@BOX2.0
CASE
F
OF
@BOX3.0
=> : PLANT STORE
@BOX4.0
= : PLANT LOAD
@BOX5.0
BASE:
IF BCHK, PLANT CHK B >= 0
PLANT PTR.B - B
IF BCHK, PLANT CHK PTR.B >= 0
PLANT PTR.O + (B * ELTSIZE)
@BOX6.0
LIMIT: LANT PTR.B = B + 1
@BOX7.0
COMP:
PLANT COMP
@BOX8.0
ESAC
@BOX1.1
APTR:
@BOX2.1
SWITCH F\P0,E,P2,E,E,E,
P6,P7,E,E,E,E,E,E,E,P15;
@BOX3.1
P0:
PLANTSTORE(MU6GREG,OPSIZE,OP,0);
->RESAC;
@BOX4.1
P2:
LOAD(MU6GREG,2,5,Z,OP);
->RESAC;
@BOX5.1
P6:
IF BLB OF OPD=0 THEN
 %100=>MU6GOP:: LITERAL
ELSE
 %101=>MU6GOP:: LITERAL + BM1 (B)
FI;
PLANTCODE(MU6GREG<<-13+%F200+MU6GOP,BLC OF OPD):: PTR.B - B
IF SIZ OF BLEL OF OPD<<-3=>TEMP/=1 AND BLB OF OPD/=0 THEN
 PLANTCODE(%3600,TEMP):: BM1(B) * #ELTSIZE
FI;
PLANTCODE(MU6GREG<<-13+%1000+MU6GOP,TEMP*BLC OF OPD):: PTR.O - B
->RESAC;
@BOX6.1
P7:
IF BLB OF OPD=0 THEN
 %100=>MU6GOP ::LITERAL
ELSE
 %101=>MU6GOP ::LITERAL/BM1 (B)
FI;
PLANTCODE(MU6GREG<<-13+%E400+MU6GOP,1+BLC OF OPD):: PTR.B = B+1
->RESAC;
@BOX7.1
P15:
PLANTCOMP(MU6GREG,OPSIZE,OP,0);
->RESAC;
@END
@TITLE MTL27.20.9(7,8)
@COL 1S-2C-3R-5R-7R-9F
@COL 4R-6R-8R
@ROW 3-4
@FLOW 1-2
@BOX1.0
COMPLEX:
@BOX2.0
CASE
FUNCTION TYPE
OF
(NORMAL,= ->27.20.4)
@BOX3.0
=-
@BOX4.0
COMP
@BOX5.0
*,/
@BOX6.0
/:
@BOX7.0
MFN
@BOX8.0
**
@BOX9.0
ESAC
@BOX1.1
ACMPLX:
@BOX2.1
SWITCH INDICES[COMPLEXINDEX+F=>INDEX]->>10&%F\
 A0,A1,CX2,CX3,CX4,CX5,CX6,CX7;
@BOX3.1
CX2:
LOAD(MU6GREG,R,T,Z,OP);
CLEAROP(OP);
%100=>MU6GOP;
6=>OPTYP;
8=>OPSIZE;
0=>OPLIT;
PLANTSEQ(COMPLEXINDEX+10,-1,-1,OP,0):: -:#0
->RESAC;
@BOX4.1
CX3:
PLANTACONV(Z,T,8,T,0);
CONVERTAOP(OP,8,T,MU6GREG,T);
->A0;
@BOX5.1
CX4:
PLANTSTACK(OP,0);
->A0;
@BOX6.1
CX5:
PLANTV16CODE(%607E):: BM3=> STK
PLANTV32CODE(%418C,0):: BM2=> 0/SF
LOAD(MU6GREG,R,T,Z,OP);
->A0;
@BOX7.1
CX6:
IF MFN OF OPD=0 THEN
 PLANTSEQ(COMPLEXABS,-1,-1,NILOP,0);
ELSE IF MFN OF OPD=1 THEN
 PLANTSEQ(COMPLEXCONJG,-1,-1,NILOP,0);
ELSE
 PLANTV16CODE(%0452):: LDR BM2(R)
 PLANTV16CODE(%007E):: ST  STK
 PLANTV16CODE(%0453):: LDR BM3(I)
 PLANTV16CODE(%007E):: ST  STK
 PLANTSEQ(COMPLEXMFNS+MFN OF OPD-13,-1,-1,NILOP,0);
FI;FI;
->RESAC;
@BOX8.1
CX7:
::GET OPERAND CORRECT
IF MU6GOP/=%7E THEN
 PLANTV16CODE(%0453):: LDR BM3(R)
 PLANTV16CODE(%007E):: ST  STK
 PLANTV16CODE(%0452):: LDR BM2(I)
 PLANTV16CODE(%007E):: ST  STK
 PLANTSEQ(COMPLEXINDEX+2,MU6GREG,-1,OP,0):: ACC = OP
 PLANTV16CODE(%0453):: LDR BM3(R)
 PLANTV16CODE(%007E):: ST  STK
 PLANTV16CODE(%0452):: LDR BM2(I)
 PLANTV16CODE(%007E):: ST  STK
ELSE
 PLANTV16CODE(%A200):: STK #0
 PLANTV32CODE(%058C,-1):: LDR REAL(OP)
 PLANTV16CODE(%007E):: ST  STK
 PLANTV32CODE(%058C,-4):: LDR IMAG(OP)
 PLANTV16CODE(%007E):: ST  STK
 PLANTV16CODE(%0453):: LDR BM3(R)
 PLANTV32CODE(%01CC,-3):: ST  REAL(PARAM)
 PLANTV16CODE(%0452):: LDR BM2(I)
 PLANTV32CODE(%01CC,-2):: ST  IMAG(PARAM)
FI;
->A0;
@BOX9.1
@END
@TITLE MTL27.20.10(7,8)
@COL 1S-2R-3R-4R-5F
@FLOW 1-2-3-4-5
@BOX1.0
STRING:
@BOX2.0
LSTR,RSTR:
 STACK OP
@BOX3.0
CALL STRING ROUTINE
@BOX4.0
E.COMP,E.ASC.COMP:
 PLANT CMP3 #0
@BOX5.0
END
@BOX1.1
ASTR:
@BOX2.1
IF F<2 THEN
 PLANTSTACK(OP,0);
FI;
@BOX3.1
PLANTSEQ(STRFNS+F,-1,-1,NILOP,0);
@BOX4.1
IF F=5 OR F=11 THEN
 PLANTV16CODE(%7E00);
FI;
@BOX5.1
->RESAC;
@END
@TITLE MTL27.21(7,8)
@COL 1S-2T-3R-4T-6R-7F
@COL 8R
@ROW 3-8
@FLOW 1-2N-3-4N-6-7
@FLOW 2Y-8-7
@FLOW 4Y-7
@BOX 1.0
VAR OP (^VARIABLE,ORIG KIND,^OPERAND,SIZE,OFFSET)
@BOX 2.0
IS VARIABLE DEFINED?
@BOX 3.0
SET FORWARD REFERENCE
@BOX 4.0
BOUND NOT WANTED?
@BOX 6.0
SET FORWARD REFERENCE TO DIMENSION
@BOX 7.0
END
@BOX 8.0
SET ADDRESS
@BOX 1.1
PROC VAROP(VAR,ORIGKIND,OP,PSIZE,POFFSET); ::DEBUG TEST(16);
SELECT VAR^; SELECT VARADDR;
SELECT VARUNDEF;
SELECT OP^;
@BOX 2.1
IF VARF&1/=0,
@BOX 3.1
GENADDR(NILSTORE,POFFSET,PSIZE,OP);
VARFWDREF => OPFWDREF;
@BOX 4.1
IF VARF&%1/=0 OR ORIGKIND&%18/=%10,
@BOX 6.1
BOUNDFWDREF => TOPFWDREF;
@BOX 7.1
END;
@BOX 8.1
GENADDR(VARSTOREP,VAROFF+POFFSET,PSIZE,OP);
@END
@TITLE MTL27.22(7,8)
@COL 1S-4T-5T-6T-8R-9T-10R-11F
@COL 14R-15R-16R
@ROW 5-14
@FLOW 1-4N-5N-6N-8-9N-10-11
@FLOW 4Y-14-9
@FLOW 5Y-15-9Y-11
@FLOW 6Y-16-9
@BOX 1.0
GEN ADDR (^STORE, OFFSET, SIZE, ^OPERAND)
@BOX 4.0
OPERAND AT FIXED ADDRESS?
@BOX 5.0
OPERAND AT CURRENT LEVEL?
@BOX 6.0
OPERAND AT OUTERMOST LEVEL?
@BOX 8.0
GET BA REG
LOAD REG WITH NON-LOCAL NAMEBASE
ADDRESS = OFFSET/BA REG
@BOX 9.0
NOT A PARAMETER?
@BOX 10.0
INVERT OFFSET
@BOX 11.0
END
@BOX 14.0
ADDRESS = LITERAL
@BOX 15.0
ADDRESS = OFFSET/NB
@BOX 16.0
ADDRESS = OFFSET/GNB
@BOX 1.1
PROC GENADDR(PSTORE,OFFSET,PSIZE,OP); ::DEBUG TEST(17);
$IN TEMP;
SELECT OP^;
PSIZE=>OPSIZE;
@BOX 4.1
IF PSTORE=NILSTORE OR STOREKIND OF PSTORE^&1/=0,
@BOX 5.1
SELECT PSTORE^;
IF STORETX=TXI-NOOFPPROCS,
@BOX 6.1
IF STORETX=0,
@BOX 8.1
GETREG(-1,6,11)=>TEMP;
PLANTSLINK(TEMP,STORETX+1,TXI-NOOFPPROCS);
TEMP<<-2=>MU6GOP;
@BOX9.1
IF PSIZE=8 AND OFFSET&%7=0 THEN
 OFFSET/8=>OPOFFSET;
 %1C0!>MU6GOP;
ELSE IF PSIZE=4 AND OFFSET&%3=0 THEN
 OFFSET/4=>OPOFFSET;
 %180!>MU6GOP;
ELSE
 OFFSET=>OPOFFSET;
 %140!>MU6GOP;
FI;FI;
IF PSTORE=NILSTORE OR STOREKIND OF PSTORE^/=2,
@BOX 10.1
IF MU6GOP&%1C0=%1C0 THEN
 STOREI->>3=>TEMP;
ELSE IF MU6GOP&%1C0=%180 THEN
 STOREI->>2=>TEMP;
ELSE
 STOREI=>TEMP;
FI;FI;
TEMP->OPOFFSET;
@BOX 11.1
END;
@BOX 14.1
RUNADDR(PSTORE,0)+>OFFSET;
IF PSTORE=CODESEGP THEN
 %8=>MU6GOP;
ELSE
 0=>MU6GOP;
FI;
@BOX 15.1
%10=>MU6GOP;
@BOX 16.1
%14=>MU6GOP;
@END
@TITLE MTL27.23(7,8)
@COL 1S-2R-3T-4R-6T-7T-8R-5F
@COL 11R-9R-10R
@ROW 4-11
@ROW 8-9
@FLOW 1-2-3N-4-6N-7N-8-5
@FLOW 6Y-10-5
@FLOW 3Y-11-6-7Y-9-5
@BOX 1.0
LIT TO POOL (^LITERAL,FWD REF,^MU6G OP) :FWD REF
DOES NOT PERMIT LONG LITERALS WITH A BA REG !
@BOX 2.0
ASSOCIATE ON FWD REF AND LITERAL TO GIVE POOL REF
@BOX 3.0
FOUND?
@BOX 4.0
ADD FWDREF AND LITERAL TO POOL
(MAY NEED TO FLUSH POOL FIRST)
RESET FWD REF
@BOX 5.0
END
@BOX 6.0
DOES OPERAND USE A BA REG
@BOX 7.0
IS OPERAND REALLY A LITERAL
@BOX 8.0
GET A BA REGISTER
PLANT BA REG = V32 SIZED VARIABLE /CO
OPERAND = BA REG^
@BOX 9.0
MAKE OPERAND A V32 OR V64 SIZED VARIABLE /CO
@BOX 10.0
GET A BM REGISTER
PLANT BM = V32 SIZED LITERAL/CO
(PLANT BM + ORIGINAL BM)
PUT BM REGISTER IN OPERAND
@BOX11.0
UPDATE POOL ITEM
@BOX 1.1
PROC LITTOPOOL(PLIT,PFWDREF,PMU6GOP,TSIZE); ::DEBUG TEST(18);
$IN TEMP,TLIT,TEMP2;
$LO64 TEMPLIT;
SELECT CODESEGP^;
@BOX 2.1
IF PMU6GOP^&%3C=0 THEN
 IF PMU6GOP^&%1C0/=%100 THEN
  4=>TSIZE;
 FI;
 IF TSIZE<4 THEN
  4=>TSIZE;
 FI;
 DATAVEC SHIFTS ($IN)
 0 3 5 6
 END;
 PLIT^<<-SHIFTS[PMU6GOP^->>6&%3]=>TEMPLIT;
ELSE
 4=>TSIZE;
 PLIT^=>TEMPLIT;
FI;
BEGIN
FOR TEMP<POOLSIZE DO
 SELECT POOL[TEMP];
 IF NOOFUSES>0 AND TSIZE=LITSIZE AND LITFWDREF=PFWDREF
  AND POOLLIT=TEMPLIT,->ENDLOOP;
OD;
POOLSIZE=>TEMP ::!PQ FRIG
ENDLOOP:
END;
IF TEMP<POOLSIZE THEN
 IF PMU6GOP^&%C3=0 THEN TSIZE=>TEMP2 ELSE 4=>TEMP2 FI;
 BEGIN SELECT POOL[TEMP];
 IF ADDRFWDREF=NILFWDREF AND POOLADDR-RUNADDR(CODESEGP,-1)/TEMP2&%FFFF8000/=0/=%
FFFF8000 THEN
  FAULT(0,%"IGNORE POOL ITEM");
  OUTHEX(POOLADDR,8);SPACES(1);
  OUTHEX(RUNADDR(CODESEGP,-1),8);
  OUTI(TEMP2,2);
  0=>NOOFUSES;
  1->POOLUSED;
  POOLSIZE=>TEMP;
 FI;
 END;
FI;
@BOX3.1
IF TEMP<POOLSIZE,
@BOX4.1
IF POOLUSED=POOLSIZE THEN
#MTL27.23.1
FI;
-1=>TEMP;
WHILE 1+>TEMP<POOLSIZE AND NOOFUSES OF POOL[TEMP]>0 DO
OD;
BEGIN
 SELECT POOL[TEMP];
 IF TLPRM&%40/=0 THEN
  CAPTION(%"$LUSING ENTRY");
  OUTI(TEMP,5);
 FI;
 1+>POOLUSED;
 1=>NOOFUSES;
 TEMPLIT=>POOLLIT;
 TSIZE=>LITSIZE;
 IF PFWDREF=>LITFWDREF/=NILFWDREF THEN
 ADDFWDREF(NILSTORE,%20(7)+TEMP,0,PFWDREF,0);
 FI;
 0=>POOLADDR=>TLIT;
 GETFWDREF()=>ADDRFWDREF=>LITTOPOOL;
END;
@BOX5.1
END;
@BOX6.1
IF PMU6GOP^&%3C/=0,
@BOX7.1
IF PMU6GOP^&%C3=0,
@BOX8.1
GETREG(-1,6,11)=>TEMP;
IF LITTOPOOL/=NILFWDREF THEN
 ADDFWDREF(CODESEGP,STOREI+2,0,LITTOPOOL,1);
 NILFWDREF=>LITTOPOOL;
FI;
PLANTV32CODE(TEMP<<-9+%C188,TLIT-RUNADDR(CODESEGP,-1)/4) ::BA? = V32 ?/CO
TEMP<<-2!(PMU6GOP^&%1C3)=>PMU6GOP^;
0=>PLIT^;
@BOX9.1
(TLIT-RUNADDR(CODESEGP,-1)/TSIZE)=>PLIT^;
IF TSIZE=4 THEN
 %188=>PMU6GOP^ ::V32 ?/CO
ELSE
 %1C8=>PMU6GOP^ ::V64 ?/CO
FI;
@BOX 10.1
IF GETREG(-1,%11,%13)=>TEMP=0 THEN
 FAULT(0,%"LITERAL PART OF ADDRESS/SUBSCRIPT TOO BIG AND COMPLICATED");
ELSE
 IF LITTOPOOL/=NILFWDREF THEN
  ADDFWDREF(CODESEGP,STOREI+2,0,LITTOPOOL,1);
  NILFWDREF=>LITTOPOOL;
 FI;
 PLANTV32CODE(TEMP<<-13+%0588,TLIT-RUNADDR(CODESEGP,-1)/4);
 IF PMU6GOP^&3=>TEMP2/=0 THEN
  PLANTV16CODE(TEMP<<-13+%1050+TEMP2);
 FI;
 PMU6GOP^&%1FC!(TEMP&3)=>PMU6GOP^;
 0=>PLIT^;
FI;
@BOX11.1
BEGIN
 SELECT POOL[TEMP];
 IF TLPRM&%40/=0 THEN
  CAPTION(%"$LREUSING ENTRY");
  OUTI(TEMP,5);
  OUTI(NOOFUSES,5);SPACES(1);
  OUTHEX(POOLADDR,8);SPACES(1);
  OUTHEX(BYTE(ADDRFWDREF),8);SPACES(1);
  OUTHEX(FWDADDRESS OF ADDRFWDREF^,8);
 FI;
 1+>NOOFUSES;
 POOLADDR=>TLIT;
 ADDRFWDREF=>LITTOPOOL;
END;
@END
@TITLE MTL27.23.1(7,8)
@COL 1S-2R-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-2-3N-4-5
@FLOW 3Y-6-2
@BOX1.0
CLEAR POOL
@BOX2.0
SCAN POOL TO DETECT LEAST
FREQUENTLY USED (STORED) ITEMS
@BOX3.0
NONE ?
@BOX4.0
REMOVE SUCH ITEMS FROM POOL
@BOX5.0
END
@BOX6.0
PLANT (-> L1)
FLUSH POOL
PLANT (L1:)
@BOX2.1
$IN32 MINUSE;
%7F(7)=>MINUSE;
FOR TEMP<POOLSIZE DO BEGIN
 SELECT POOL[TEMP];
 IF NOOFUSES>0<MINUSE AND ADDRFWDREF=NILFWDREF THEN
  NOOFUSES=>MINUSE;
 FI;
END; OD;
@BOX3.1
IF MINUSE=%7F(7),
@BOX4.1
FOR TEMP<POOLSIZE DO BEGIN
 SELECT POOL[TEMP];
 IF NOOFUSES=MINUSE AND ADDRFWDREF=NILFWDREF THEN
  0=>NOOFUSES;
  1->POOLUSED;
 FI;
END; OD;
@BOX6.1
::FAULT(0,%"POOL FULL");
STOREI OF CODESEGP^=>TEMP;
PLANTV32CODE(%8F00,0);
FLUSHPOOL();
ASSLIT64((STOREI OF CODESEGP^-TEMP->>1),2,CODESEGP,TEMP+2);
@END
@TITLE MTL27.24(7,8)
@COL 1S-2R-3T-4T-5T-13R-14T-6R-7R-8R-9T-10F
@COL 11R-12R
@ROW 4-11
@ROW 6-12
@FLOW 1-2-3N-4-5N-13-14N-6-7-8-9-10
@FLOW 3Y-11-10
@FLOW 5Y-14Y-12-9
@BOX 1.0
PLANT SEQ(START,REG1,REG2,^OP,TOP)
@BOX 2.0
SELECT SEQUENCE
@BOX 3.0
IS SEQUENCE EMPTY
@BOX 4.0
FOR EACH INSTRUCTION DO
@BOX 5.0
NOT LABEL?
@BOX 6.0
PERFORM REGISTER SUBSTITUTIONS
@BOX 7.0
PERFORM OPERAND SUBSTITUTIONS
@BOX 8.0
PLANT CODE
@BOX 9.0
OD
@BOX 10.0
END
@BOX 11.0
ERROR
@BOX 12.0
PERFORM CALL
@BOX 13.0
SET LABEL ADDRESS
@BOX 14.0
CALL ?
@BOX 1.1
PROC PLANTSEQ(START,REG1,REG2,OP,TOP); ::DEBUG TEST(19);
$IN CODETOP,CODEBOTTOM,SUBINDEX,PFROM,PTO,LABNO,POFFSET,TEMPSIZE;
$LI NOOFLABS=2;
$IN [NOOFLABS] LAB;
ADDR FWDREFTYPE [NOOFLABS] LABREF;
SELECT OP^;
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LPLANTSEQ");
 OUTI(START,5);
 OUTI(REG1,5);
 OUTI(REG2,5);
 OUTI(TOP,1);
FI;
FOR LABNO<NOOFLABS DO
 0=>LAB[LABNO];
 NILFWDREF=>LABREF[LABNO];
OD;
0=>LABNO;
@BOX 2.1
INDICES[START]&%3FF=>PFROM;
INDICES[START+1]&%3FF=>PTO;
@BOX 3.1
IF PFROM >= PTO,
@BOX 4.1
IF TLPRM&%40/=0 THEN
 OUTI(PFROM,5);
 OUTI(PTO,5);
FI;
WHILE PFROM < PTO DO
@BOX 5.1
IF TLPRM&%40/=0 THEN
 NEWLINES(1);
 OUTI(PFROM,5);
 OUTI(SUBS[PFROM],5);
FI;
IF SUBS[PFROM=>SUBINDEX]&%40=0,
@BOX 6.1
#MTL27.24.1
IF TLPRM&%40/=0 THEN
 SPACES(1);
 OUTHEX(CODETOP,8);
 OUTHEX(CODEBOTTOM,8);
FI;
@BOX 7.1
#MTL27.24.2
IF TLPRM&%40/=0 THEN
 SPACES(1);
 OUTHEX(CODETOP,8);
 OUTHEX(CODEBOTTOM,8);
FI;
@BOX 8.1
IF POPFWDREF /= NILFWDREF THEN
PLANTV32CODE(CODETOP,CODEBOTTOM);
ELSE
PLANTCODE(CODETOP,CODEBOTTOM);
FI;
@BOX 9.1
1 +> PFROM;
OD;
@BOX 10.1
END;
@BOX 11.1
FAULT(0,%"EMPTY SEQUENCE");
OUTI(START,5);
OUTI(PFROM,5);
OUTI(PTO,5);
NEWLINES(1);
@BOX 12.1
#MTL27.24.4
@BOX13.1
RUNADDR(CODESEGP,-1)=>LAB[LABNO];
IF LABREF[LABNO]/=NILFWDREF THEN
 PLANTFWDREF(LAB[LABNO]<<-3,LABREF[LABNO]);
 ::NILFWDREF=>LABREF[LABNO];
FI;
1+>LABNO;
@BOX14.1
IF SUBS[SUBINDEX]&%80/=0,
@END
@TITLE MTL27.24.1(7,8)
@COL 1S-2C-3R-4R-5R-6C-7F
@FLOW 1-2
@FLOW 6-7
@BOX 1.0
PERFORM REGISTER SUBSTITUTIONS
@BOX 2.0
CASE
REGISTER
OF
@BOX 3.0
O NONE
@BOX 4.0
1 ADD REG1 TO FUNCTION
@BOX 5.0
2 ADD REG2 TO FUNCTION
@BOX 6.0
ESAC
@BOX 7.0
END
@BOX 1.1
DATAVEC REGTOFN($IN)
0     %200  %400  %600  %800  %A00  %C00  %E00
%1000 %1200 %1400 %1600 %1800 %1A00 %1C00 %1E00
0     %2000 %4000 %6000
END;
CODES[PFROM]=>CODETOP;
IF CODETOP & %100/=0 THEN
  CODES[1+>PFROM] => CODEBOTTOM;
ELSE
  0 => CODEBOTTOM;
FI;
@BOX 2.1
SWITCH
SUBS[SUBINDEX]->>4&3
\RESAC,R1,R2;
@BOX 3.1
@BOX 4.1
R1: REGTOFN[REG1] +> CODETOP;
->RESAC;
@BOX 5.1
R2: REGTOFN[REG2] +> CODETOP;
->RESAC;
@BOX 6.1
RESAC:
@END
@TITLE MTL27.24.2(7,8)
@COL 1S-2C-3R-7R-8R-9R-16T-17R-18R-10C-11F
@COL 12R-19T-20R-21R
@ROW 7-12
@ROW 16-19
@FLOW 1-2
@FLOW 10-11
@FLOW 16N-17
@FLOW 16Y-18
@FLOW 19N-20
@FLOW 19Y-21
@BOX 1.0
PERFORM OPERAND SUBSTITUTIONS
@BOX 2.0
CASE
OPERAND
OF
@BOX 3.0
0:NONE
@BOX 7.0
1,2,5: NORMAL OPERANDS
 (27.24.3)
@BOX 8.0
3:USE REG 1
@BOX 9.0
4:USE REG 2
@BOX 10.0
ESAC
@BOX 11.0
END
@BOX12.0
9: IN-SEQUENCE BRANCH
OP=IN-SEQUENCE LABEL - CODE ADDRESS, IN V16'S
@BOX 16.0
6: BR/JMP
SHORT ORDER OK ?
@BOX 17.0
FUNCTION = JMP
-> 5
@BOX 18.0
8: BRANCH OPERAND
OP = OP - CODE ADDRESS, IN V16'S
@BOX 19.0
7: RJSR/JSR
SHORT ORDER OK ?
@BOX 20.0
FUNCTION = JSR
-> 5
@BOX 21.0
ADJUST RJSR OPERAND
@BOX 1.1
DATAVEC REGTOOP($IN);
%100 %104 %108 %10C %110 %114 %118 %11C
%120 %124 %128 %12C %130 %134 %138 %13C
%60  %101 %102 %103
END;
$IN PMU6GOP,OPSUB;
$IN32 TEMP;
$LO64 PLIT;
ADDR FWDREFTYPE POPFWDREF;
NILFWDREF=>POPFWDREF;
IF TLPRM&%40/=0 THEN
 SPACES(1);
 OUTHEX(OPOFFSET,8);
 SPACES(1);
 OUTHEX(MU6GOP,8);
 SPACES(1);
 OUTHEX(TOPLIT,8);
 SPACES(1);
 OUTHEX(TOPMU6GOP,8);
FI;
OPSIZE=>TEMPSIZE;
@BOX 2.1
SWITCH
SUBS[SUBINDEX]&%F=>OPSUB\
OESAC,O1,O2,O3,O4,O5,O6,O7,O8,O9;
@BOX 3.1
@BOX 7.1
#MTL27.24.3
@BOX 8.1
O3:REGTOOP[REG1]!>CODETOP;
->OESAC;
@BOX 9.1
O4:REGTOOP[REG2]!>CODETOP;
->OESAC;
@BOX 10.1
OESAC:
@BOX 11.1
@BOX12.1
O9:
CODETOP&%3F=>TEMP;
%FFC0&>CODETOP;
IF LAB[TEMP]=0 THEN
 IF LABREF[TEMP]=NILFWDREF THEN
  GETFWDREF()=>LABREF[TEMP];
 FI;
 ADDFWDREF(CODESEGP,STOREI OF CODESEGP^+2,1,LABREF[TEMP]=>POPFWDREF,1);
ELSE
 NILFWDREF=>POPFWDREF;
FI;
LAB[TEMP]-RUNADDR(CODESEGP,-1)->>1=>CODEBOTTOM;
->OESAC;
@BOX 16.1
O6:
OPOFFSET->>3-RUNADDR(CODESEGP,-1)->>1&%7FFF8000=>TEMP;
IF MU6GOP&%FF=0 AND [OPFWDREF/=NILFWDREF OR[
TEMP=0 OR TEMP=%7FFF8000]],
@BOX 17.1
%C400=>CODETOP;
->O5;
@BOX 18.1
O8:
IF OPFWDREF=>POPFWDREF/=NILFWDREF THEN
 ADDFWDREF(CODESEGP,STOREI OF CODESEGP^+2,1,OPFWDREF,1);
FI;
OPOFFSET->>3-RUNADDR(CODESEGP,-1)->>1=>CODEBOTTOM;
->OESAC;
@BOX 19.1
O7:
OPOFFSET->>3-RUNADDR(CODESEGP,-1)->>1&%7FFF8000=>TEMP;
IF MU6GOP&%FF=0 AND OPFWDREF=NILFWDREF AND
[TEMP=0 OR TEMP=%7FFF8000],
@BOX 20.1
%8000=>CODETOP;
->O5;
@BOX 21.1
OPOFFSET->>3-RUNADDR(CODESEGP,-1)/2-1=>CODEBOTTOM;
IF CODEBOTTOM&%FFE0/=0/=%FFE0 THEN
 1->CODEBOTTOM;
FI;
->OESAC;
@END
@TITLE MTL27.24.3(7,8)
@COL 1S-13T-4R-5R-8T-6R-7R-11F
@COL 16N-12R-2R
@COL 14T-15R
@ROW 13-16-14
@FLOW 13N-4-5-8N-6-7
@FLOW 13Y-16-12-2-5
@FLOW 8Y-7
@FLOW 14N-15-2-5
@FLOW 14Y-16
@BOX 1.0
NORMAL OPERANDS
@BOX2.0
COPE WITH V64 ARRAYS
@BOX 4.0
USE OPERAND
@BOX 5.0
COPE WITH STRING OPERANDS
AND ADDRESSES /CO
@BOX 6.0
CONVERT TO POOL REFERENCE
@BOX 7.0
SUBSTITUTE OPERAND
@BOX 8.0
DOES OPERAND NOT INVOLVE A
LITERAL >V16 OR A FWDREF?
@BOX 11.0
END
@BOX 12.0
2:USE TOP V32 OF OPERAND
@BOX 13.0
1: FULL OPERAND
    TOP?
@BOX 14.0
5: V32 OPERAND
    TOP?
@BOX 15.0
USE BOTTOM V32 ONLY
@BOX 1.1
@BOX2.1
IF V64ASV32S=0 AND OPSIZE=8 AND PMU6GOP&%180=%180 AND PMU6GOP&%3/=0
 AND OPTOPDIFF=0 THEN
 1=>V64ASV32S;
 PLANTV16CODE(PMU6GOP&%3<<-13+%1602):: BM? * #2
 ::NOTE BM REG RUINED
FI;
@BOX 4.1
IF OPTOPDIFF=0 THEN
 OPLIT=>PLIT;
ELSE
 OPOFFSET=>PLIT;
FI;
OPFWDREF=>POPFWDREF;
IF MU6GOP=>PMU6GOP&%C0=%80 AND OPSIZE>4 AND CODETOP&%E000/=%E000 THEN
 (OPOFFSET+1)=>PLIT;
FI;
@BOX 5.1
IF PMU6GOP&%1C0=%140 AND CODETOP&%E000/=%E000 THEN
 PLANTSTRINGSIZE(TEMPSIZE);
FI;
IF PMU6GOP&%3C=%8 THEN ::/CO
 PLIT=>POFFSET;
 RUNADDR(CODESEGP,-1)=>TEMP;
 ALTERNATIVE PMU6GOP->>6&%3 FROM
  POFFSET-(TEMP<<-3)=>TEMP;
  POFFSET-TEMP=>TEMP;
  POFFSET-(TEMP->>2)=>TEMP;
  POFFSET-(TEMP->>3)=>TEMP;
 END;
 IF 0-TEMP=<%7FFF THEN
  TEMP=>PLIT;
 ELSE
  %1C3&>PMU6GOP;
 FI;
FI;
IF [TEMPSIZE/=8 OR PMU6GOP&%C0/=0 OR TOP/=0 OR OPSUB=2 OR OPSUB=5 OR OPSUB=6 OR
OPSUB=7]
 AND PLIT&%80(7)/=0 THEN
 %F(8)0(8)!>PLIT;
FI;
@BOX 6.1
IF TLPRM&%40/=0 THEN
 CAPTION(%" LIT TO POOL ");
 OUTHEX(BYTE(POPFWDREF),8);SPACES(1);
 OUTHEX(PLIT->>32,8);OUTHEX(PLIT,8);SPACES(1);
FI;
LITTOPOOL(^PLIT,POPFWDREF,^PMU6GOP,TEMPSIZE)=>POPFWDREF;
IF OPSUB=1 AND TOP=0 THEN
 PMU6GOP=>MU6GOP;
 NILFWDREF=>OPFWDREF;
 IF OPTOPDIFF=0 THEN
  PLIT=>OPLIT;
 ELSE
  PLIT=>OPOFFSET;
 FI;
FI;
@BOX 7.1
IF POPFWDREF/=NILFWDREF THEN
 ADDFWDREF(CODESEGP,STOREI OF CODESEGP^+2,0,POPFWDREF,1);
FI;
PLIT=>CODEBOTTOM;
PMU6GOP!>CODETOP;
->OESAC;
@BOX 8.1
IF [POPFWDREF=NILFWDREF AND [PLIT&%F(12)8000=0 OR
PLIT&%F(12)8000=%F(12)8000]]OR PMU6GOP&%13C=%104,
@BOX 11.1
@BOX 12.1
O2:
4=>TEMPSIZE;
IF OPTOPDIFF=0 THEN
OPFWDREF=>POPFWDREF;
IF MU6GOP=>PMU6GOP &%C0=0 THEN
 TOPLIT=>PLIT;
 IF PMU6GOP&3/=0 THEN
  1->PMU6GOP;
 FI;
 IF PMU6GOP&%3C/=0 THEN
  4->PMU6GOP;
 FI;
ELSE IF PMU6GOP&%1C0=%140 THEN
 OPLIT=>PLIT;
 OPSIZE-4=>TEMPSIZE;
ELSE
 OPLIT<<-1=>PLIT;
 %1BF&>PMU6GOP;
FI;FI;
ELSE
TOPMU6GOP=>PMU6GOP;
TOPFWDREF=>POPFWDREF;
TOPLIT=>PLIT;
FI;
IF PMU6GOP=%3E OR PMU6GOP=%3F THEN ::STK, UNST
 %18C=>PMU6GOP ::0/SF
 0=>PLIT;
FI;
@BOX 13.1
O1: IF TOP/=0,
@BOX 14.1
O5:
IF TOP/=0,
@BOX 15.1
IF OPSIZE=>TEMPSIZE>4 THEN
 4=>TEMPSIZE;
FI;
OPOFFSET=>PLIT;
IF MU6GOP=>PMU6GOP&%C0=%C0 THEN
 %1BF&>PMU6GOP;
 (OPOFFSET<<-1+1)=>PLIT;
ELSE IF PMU6GOP&%1C0=%140 AND OPSIZE>4 THEN
 (OPOFFSET+OPSIZE-4)=>PLIT;
FI;FI;
OPFWDREF=>POPFWDREF;
@END
@TITLE MTL27.24.4(7,8)
@COL 1S-2T-3R-4R-5F
@COL 6T-7R-8R
@ROW 2-6
@ROW 3-8
@FLOW 1-2N-3-4-5
@FLOW 2Y-6N-7-8-4
@FLOW 6Y-8
@BOX 1.0
PERFORM CALL
@BOX 2.0
<<- OR ->> ?
@BOX 3.0
FINDN ON LIB PROC
@BOX 4.0
PLANT ENTER
@BOX 5.0
END
@BOX 6.0
ARE PROCS IN SEGMENT ?
@BOX7.0
PUT PROCS IN SEGMENT
@BOX8.0
STACK OPERAND
CALCULATE ADDRESS
@BOX1.1
BEGIN
$LO8 [16] BUFFER;
PSPEC STRING(ADDR[$LO8])/ADDR[$LO8];
PROC STRING(CHARS);
$IN I;
 FOR I<SIZE(CHARS) DO
  CHARS^[I]=>BUFFER[I];
 OD;
 PART(^BUFFER,0,SIZE(CHARS)-1)=>STRING;
END;
OPERANDTYPE ENTEROP;
$IN32 FIND;
ADDR [$LO8] PROCNAME;
CLEAROP(^ENTEROP);
SELECT ENTEROP;
@BOX2.1
IF CODES[PFROM]<2,
@BOX3.1
ALTERNATIVE CODES[PFROM]-2 FROM
 STRING(%"ASIN")=>PROCNAME;
 STRING(%"ACOS")=>PROCNAME;
 STRING(%"ATAN2")=>PROCNAME;
 STRING(%"SINH")=>PROCNAME;
 STRING(%"COSH")=>PROCNAME;
 STRING(%"TANH")=>PROCNAME;
 STRING(%"CMULT")=>PROCNAME;
 STRING(%"CDIV")=>PROCNAME;
 STRING(%"POWER")=>PROCNAME;
 STRING(%"CPOWER")=>PROCNAME;
 STRING(%"CSQRT")=>PROCNAME;
 STRING(%"CSIN")=>PROCNAME;
 STRING(%"CCOS")=>PROCNAME;
 STRING(%"CLOG")=>PROCNAME;
 STRING(%"CEXP")=>PROCNAME;
 STRING(%"STRFN")=>PROCNAME;
 STRING(%"LHS")=>PROCNAME;
 STRING(%"RHS")=>PROCNAME;
 STRING(%"MOV")=>PROCNAME;
 STRING(%"CMP")=>PROCNAME;
 STRING(%"SRCH")=>PROCNAME;
 STRING(%"LEN")=>PROCNAME;
END;
IF FINDN(PROCNAME,0)=>FIND=0 THEN
 FAULT(0,%"NO PROCEDURE ");
 CAPTION(PROCNAME);
ELSE
 FIND&%7FFF00FF<<-5=>OPOFFSET;
FI;
%100=>MU6GOP:: LITERAL
@BOX4.1
PLANTENTER(^ENTEROP,0,0,0);
@BOX5.1
END;
@BOX6.1
IF MUSSSFNS OF STOREADDR OF CODESEGP^/= -1,
@BOX7.1
#MTL27.24.5
RUNADDR(CODESEGP,-1)<<-3+%20=>MUSSSFNS OF STOREADDR OF CODESEGP^;
FOR TEMP<SIZE(^SFNS) DO
 ASSLIT64(SFNS[TEMP],2,CODESEGP,STOREI OF CODESEGP^);
 2+>STOREI OF CODESEGP^;
OD;
@BOX8.1
PLANTSTACK(OP,TOP);
%100=>MU6GOP:: LITERAL
CODES[PFROM]<<-5+MUSSSFNS OF STOREADDR OF CODESEGP^=>OPOFFSET;
@END
@TITLE MTL27.24.5(7,8)
@COL 1S
@COL 2F
@ROW 1-2
@BOX1.0
       BR ->ENDPROCS
SHR64: BR ->SHR64BDY
SHL64: BEGIN ; (BM2, BM3)<<- PARAM
PARAM = -1
OLDBM3 = -1
       STM1 STK
       LDM1 PARAM/4
       IEQ ->EXIT

       CMP1 #32
       IMI ->LT32 ; <32

       LDM2 BM3
       LDM3 #0
       AND1 #%1F
       RSB1 #0 ; FOR SFT
       SFT2 BM1 ; <<- BM1
EXIT:  LDM1 UNST
       RTS @-2/4

LT32:  RSB1 #0 ; FOR SFTS
       SFT2 BM1 ; <<- BM1
       STM3 STK
       SFT3 BM1 ; <<- BM1
       ADD1 #%E0 ; 32 - PARAM, %C0 FOR SFT
       STM1 STK
       LDM1 OLDBM3/3
       SFT1 UNST ; ->>UNST
       OR2  BM1
       BR   ->EXIT
       END

SHR64BDY: BEGIN ; (BM2, BM3) ->> PARAM
PARAM = -1
OLDBM2 = -1
       STM1 STK
       LDM1 PARAM/4
       IEQ ->EXIT

       CMP1 #32
       IMI ->LT32 ; <32

       LDM3 BM2
       LDM2 #0
       AND1 #%1F
       ADD1 #%C0 ; FOR SFT
       SFT3 BM1 ; ->>BM1
EXIT:  LDM1 UNST
       RTS @-2/4

LT32:  ADD1 #%C0 ; FOR SFTS
       SFT3 BM1 ; ->> BM1
       STM2 STK
       SFT2 BM1 ; ->>BM1
       SUB1 #%E0 ; 32 - PARAM, -VE FOR SFT
       STM1 STK
       LDM1 OLDBM2/3
       SFT1 UNST ; <<-UNST
       OR3  BM1
       BR   ->EXIT
       END
ENDPROCS:
ENTER
@BOX2.0
;COMPLEX
LDM1 #0
LDM2 #0
LDM3 #0
ENTER
@BOX1.1
DATAVEC SFNS ($LO16)
%8F00 %0042 %8F00 %0021
%207E %24BF %9100 %000E
%3F00 %0020 %9700 %000C
%4453 %6500 %0000 %2900
%001F %3500 %0000 %5C51
%247F %E0FE %3500 %0000
%5C51 %607E %7C51 %3100
%00E0 %207E %258C %FFFF
%3C7F %4A51 %8E32 %207E
%24BF %9100 %000E %3F00
%0020 %9700 %000C %6452
%4500 %0000 %2900 %001F
%3100 %00C0 %7C51 %247F
%E0FE %3100 %00C0 %7C51
%407E %5C51 %3300 %00E0
%207E %258C %FFFF %3C7F
%6A51 %8E32
END;
@BOX2.1
DATAVEC COMPLEXSFNS ($LO16)
%2500 %0000 %4500 %0000
%6500
END;
@END
@TITLE MTL27.25(7,8)
@COL 1S-2R-3T-4R-5F
@FLOW 1-2-3N-4-5
@FLOW 3Y-5
@BOX 1.0
ASS ADDR (VALUE,^STORE,POSN,^FWD REF LIST)
@BOX 2.0
ASS LIT 64 (VALUE,V32,^STORE,POSN)
@BOX 3.0
NOT FWD REF?
@BOX 4.0
ADD FWD REF TO LIST
@BOX 5.0
END
@BOX 1.1
PROC ASSADDR(VALUE,PSTORE,PPOSN,PFWDREF); ::DEBUG TEST(20);
@BOX 2.1
ASSLIT64(VALUE,4,PSTORE,PPOSN);
@BOX 3.1
IF VALUE/=0,
@BOX 4.1
ADDFWDREF(PSTORE,PPOSN,0,PFWDREF,0);
@BOX 5.1
END;
@END
@TITLE MTL27.26(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PLANT V16 CODE (CODE)
@BOX 2.0
PUT V16 CODE INTO NEXT POSITION IN CODE AREA
@BOX 3.0
END
@BOX 1.1
PROC PLANTV16CODE(CODE); ::DEBUG TEST(21);
SELECT CODESEGP^;
@BOX 2.1
ASSLIT64(CODE&%FEFF,2,CODESEGP,STOREI&1+>STOREI);
2+>STOREI;
@BOX 3.1
END;
@END
@TITLE MTL27.27(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PLANT V32 CODE (TOP, BOTTOM)
@BOX 2.0
PUT V32 CODE INTO NEXT POSN IN CODE AREA
@BOX 3.0
END
@BOX 1.1
PROC PLANTV32CODE(TOP,BOTTOM); ::DEBUG TEST(22);
SELECT CODESEGP^;
@BOX 2.1
ASSLIT64(TOP!%100<<-16!(BOTTOM&%FFFF),4,CODESEGP,STOREI&1+>STOREI);
4+>STOREI;
@BOX 3.1
END;
@END
@TITLE MTL27.28(7,8)
@COL 1S-6T-2T-4R-5F
@COL 7R-8R
@ROW 2-7
@ROW 4-8
@FLOW 1-6N-2N-4-5
@FLOW 2Y-8-5
@FLOW 6Y-7-5
@BOX 1.0
PLANT STORE (REG,REGSIZE,^OPERAND,TOP)
@BOX 2.0
BA REG?
@BOX 4.0
PLANT REG => OPERAND
@BOX 5.0
END
@BOX 6.0
V64 STORE, NOT FROM MU6G A REG
@BOX 7.0
PLANT STORE (BOTTOM HALF)
PLANT STORE (TOP HALF)
@BOX 8.0
PLANT REG => OPERAND
@BOX 1.1
PROC PLANTSTORE(REG,REGSIZE,OP,TOP); ::DEBUG TEST(23);
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LPLANT STORE");
 OUTI(REG,2);
 OUTI(REGSIZE,2);
 OUTI(TOP,1);
FI;
@BOX2.1
IF REG<16,
@BOX4.1
IF REG/=%10 AND OPSIZE OF OP^=8 THEN
 PLANTSEQ(STORE2,REG,-1,OP,TOP);
ELSE
 PLANTSEQ(STORE1,REG,-1,OP,TOP);
FI;
@BOX5.1
END;
@BOX 6.1
IF REGSIZE=8 AND REG/=%10 AND TOP=0,
@BOX 7.1
PLANTSTORE(REG,4,OP,0);
PLANTSTORE(REG-1,4,OP,1);
@BOX8.1
PLANTSEQ(BASTORE,REG,-1,OP,TOP);
@END
@TITLE MTL27.29(7,8)
@COL 1S-6T-2T-4R-5F
@COL 7R-8R
@ROW 2-7
@ROW 4-8
@FLOW 1-6N-2N-4-5
@FLOW 2Y-8-5
@FLOW 6Y-7-5
@BOX 1.0
PLANT LOAD (REG,REGSIZE,^OPERAND,TOP)
@BOX 2.0
BA REG?
@BOX 4.0
PLANT REG = OPERAND
@BOX 5.0
END
@BOX 6.0
V64 LOAD, NOT TO MU6G A REG
@BOX 7.0
PLANT LOAD (TOP HALF)
PLANT LOAD (BOTTOM HALF)
@BOX 8.0
PLANT REG = OPERAND
@BOX 1.1
PROC PLANTLOAD(REG,REGSIZE,OP,TOP); ::DEBUG TEST(24);
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LPLANT LOAD");
 OUTI(REG,2);
 OUTI(REGSIZE,2);
 OUTI(TOP,1);
FI;
@BOX2.1
IF REG<16,
@BOX4.1
IF REG/=%10 AND OPSIZE OF OP^=8 THEN
 PLANTSEQ(LOAD2,REG,-1,OP,TOP);
ELSE
 PLANTSEQ(LOAD1,REG,-1,OP,TOP);
FI;
@BOX5.1
END;
@BOX 6.1
IF REGSIZE=8 AND REG/=%10 AND TOP=0,
@BOX 7.1
PLANTLOAD(REG-1,4,OP,1);
PLANTLOAD(REG,4,OP,0);
@BOX8.1
PLANTSEQ(BALOAD,REG,-1,OP,TOP);
@END
@TITLE MTL27.30(7,8)
@COL 1S-2R-3R-4R-5R-21R-22R-20F
@COL 10R-11R-12R-13R-14R
@COL 15R-16R-17R-18R-19R
@ROW 3-10-15
@FLOW 1-2
@BOX1.0
PLANT A CONV (FROM SIZE, FROM TYPE, TO SIZE, TO TYPE, KIND)
@BOX2.0
CASE
(OLD TYPE, NEW TYPE)
OF
@BOX3.0
NOT IMPLEMENTED
@BOX4.0
ILLEGAL
@BOX5.0
LO/IN->LO/IN
@BOX10.0
IN->PTR
@BOX11.0
PTR->IN
@BOX12.0
CO->RE
@BOX13.0
IN->RE
@BOX14.0
LO->RE
@BOX15.0
RE->CO
@BOX16.0
RE->IN
@BOX17.0
RE->LO
@BOX18.0
CO->IN
@BOX19.0
IN->CO
@BOX20.0
END
@BOX21.0
LO->PTR
@BOX22.0
PTR->LO
@BOX1.1
PROC PLANTACONV(FR.Z,FR.TY,TO.Z,TO.TY,KIND);
@BOX2.1
IF FR.Z=TO.Z AND FR.TY=TO.TY,->L.END;
SWITCH FR.TY\F.RE,F.IN,F.LO,F.DEC,F.GEN,F.PTR,F.COM,F.STR;
F.RE:SWITCH TO.TY\RE.RE,RE.IN,RE.LO,RE.DEC,ERROR,ERROR,RE.COM,ERROR;
F.IN:SWITCH TO.TY\IN.RE,IN.IN,IN.LO,IN.DEC,ERROR,IN.PTR,IN.COM,ERROR;
F.LO:SWITCH TO.TY\LO.RE,LO.IN,LO.LO,LO.DEC,ERROR,LO.PTR,ERROR,ERROR;
F.DEC:SWITCH TO.TY\DEC.RE,DEC.IN,DEC.LO,DEC.DEC,ERROR,ERROR,ERROR,DEC.STR;
F.GEN:SWITCH TO.TY\ERROR,ERROR,ERROR,ERROR,GEN.GEN,ERROR,ERROR,ERROR;
F.PTR:SWITCH TO.TY\ERROR,PTR.IN,PTR.LO,ERROR,ERROR,PTR.PTR,ERROR,ERROR;
F.COM:SWITCH TO.TY\COM.RE,COM.IN,ERROR,ERROR,ERROR,ERROR,COM.COM,ERROR;
F.STR:SWITCH TO.TY\ERROR,ERROR,ERROR,STR.DEC,ERROR,ERROR,ERROR,STR.STR;
@BOX3.1
DEC.STR:STR.DEC:
DEC.IN:IN.DEC:
DEC.LO:LO.DEC:
DEC.RE:RE.DEC:
DEC.DEC:
FAULT(0,%"EXPLICIT CONVERSION NOT IMPLEMENTED");
L.DUMP:
OUTI(FR.TY,5);
OUTI(FR.Z,5);
OUTI(TO.TY,5);
OUTI(TO.Z,5);
->L.END;
@BOX4.1
ERROR:
FAULT(0,%"EXPLICIT CONVERSION NOT LEGAL");
->L.DUMP;
@BOX5.1
LO.LO:IN.LO:
IF TO.Z>FR.Z=8 THEN
 PLANTV16CODE(%4400):: ATOP = #0
 4=>TO.Z;
FI;
LO.IN:IN.IN:
PLANTBMCONV(%13,FR.Z,FR.TY,TO.Z);
->L.END;
@BOX 10.1
IN.PTR:
PLANTACONV(FR.Z,FR.TY,4,FR.TY,0);
PLANTV16CODE(%7C3D):: BM3 (AI) <<- #3
->L.END;
@BOX 11.1
PTR.IN:
IF KIND=0 THEN
 PLANTV16CODE(%7C03) ::BM3 (AI) ->> #3
ELSE
 PLANTV16CODE(%6452) ::BM3 (AI) = BM2 (APTR.B)
FI;
->L.END;
@BOX 12.1
COM.RE:
 IF KIND=0 THEN
  PLANTV16CODE(%0452):: ACC = BM2(R)
 ELSE
  PLANTV16CODE(%0453):: ACC = BM3(I)
 FI;
->L.END;
@BOX13.1
IN.RE:
 PLANTACONV(FR.Z,FR.TY,4,FR.TY,0);
 PLANTV16CODE(%0653) ::AD = BM3 (AI)
 PLANTV16CODE(%0800) ::SP1 #0 (I->R)
->L.END;
@BOX14.1
LO.RE:
 IF FR.Z=8 THEN
  PLANTV16CODE(%607E):: BM3=>STK
  PLANTV32CODE(%418C,0):: BM2=> 0/SF
  PLANTV16CODE(%047F):: ACC=UNST
 ELSE
  PLANTV16CODE(%0453):: ACC=BM3
 FI;
->L.END;
@BOX15.1
RE.COM:
 IF KIND=0 THEN
  PLANTV16CODE(%6400):: BM3 = #0
 FI;
 PLANTV16CODE(%007E):: ACC => STK
 PLANTV32CODE(%458C,0):: BM2 = 0/SF
 PLANTV16CODE(%047F):: POP
->L.END;
@BOX16.1
RE.IN:
 IF KIND=0 THEN
  PLANTV16CODE(%0801) ::SP1 #1 (R->I TRUNCATE)
 ELSE
  PLANTV16CODE(%0802) ::SP1 #2 (R->I ROUND TO 0)
 FI;
 PLANTV16CODE(%6460) ::BM3 (AI) = A
->L.END;
@BOX17.1
RE.LO:
 PLANTV16CODE(%007E):: ACC=> STK
 IF TO.Z=8 THEN
  IF FR.Z=8 THEN
   PLANTV32CODE(%458C,0):: BM2= 0/SF
   PLANTV16CODE(%647F):: BM3= UNST
  ELSE
   PLANTV32CODE(%658C,0):: BM3= 0/SF
   PLANTV16CODE(%447F):: POP (BM2= UNST)
   PLANTV16CODE(%4400):: BM2= #0
  FI;
 ELSE
  PLANTV32CODE(%658C,0):: BM3= 0/SF
  PLANTV16CODE(GETREG(-1,6,11)<<-9!%C07F):: POP (BAX= UNST)
 FI;
->L.END;
@BOX18.1
COM.IN:
 PLANTACONV(FR.Z,FR.TY,4,0,0):: C->R
 PLANTACONV(4,0,TO.Z,TO.TY,0):: R->I
->L.END;
@BOX19.1
IN.COM:
 PLANTACONV(FR.Z,FR.TY,4,0,0):: I->R
 PLANTACONV(4,0,TO.Z,TO.TY,KIND):: R->C
->L.END;
@BOX20.1
L.END:
PTR.PTR:RE.RE:GEN.GEN:STR.STR:COM.COM:
END;
@BOX21.1
LO.PTR:
IF FR.Z<4 THEN
 PLANTACONV(FR.Z,FR.TY,4,FR.TY,0);
FI;
->L.END;
@BOX22.1
PTR.LO:
DATAVEC PTR.Z ($IN)
4 8 2 3 4 0 0 0 8
END;
PTR.Z[FR.Z]=>FR.Z;
PLANTACONV(FR.Z,TO.TY,TO.Z,TO.TY,0);
->L.END;
@END
@TITLE MTL27.31(7,8)
@COL 1S-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-3N-4-5
@FLOW 3Y-6-5
@BOX 1.0
PLANT COMP (REG, SIZE, OP, TOP)
@BOX 3.0
SIZE = 8 & REG /= MU6G ACC & TOP = 0
@BOX 4.0
PLANT SEQUENCE
@BOX 5.0
END
@BOX 6.0
PLANT COMP (REG TOP,V32,OP,TOP)
PLANT BNE + ?
PLANT COMP (REG,V32,OP,BOTTOM)
REPLANT BRANCH
@BOX 1.1
PROC PLANTCOMP(REG,PSIZE,OP,TOP); ::DEBUG TEST(26);
$IN TADDR;
@BOX 3.1
IF PSIZE=8 AND REG/=%10 AND TOP=0,
@BOX 4.1
IF PSIZE=4 AND OPSIZE OF OP^=8 THEN
 PLANTSEQ(COMP2,REG,-1,OP,TOP);
ELSE
 PLANTSEQ(COMP1,REG,-1,OP,TOP);
FI;
@BOX 5.1
END;
@BOX 6.1
PLANTCOMP(REG-1,4,OP,1);
STOREI OF CODESEGP^=>TADDR;
PLANTV16CODE(%9200) ::BNE 0
PLANTCOMP(REG,4,OP,0);
ADDLIT32(STOREI OF CODESEGP^-TADDR->>1,2,TADDR,CODESEGP);
@END
@TITLE MTL27.32(7,8)
@COL 1S-2T-4T-5R-6R-7F
@COL 8R
@ROW 4-8
@FLOW 1-2N-4N-5-6-7
@FLOW 2Y-8-7
@FLOW 4Y-6
@BOX 1.0
ADD FWD REF (^STORE, POSN, SCALE, ^FWDREF, SIZE)
@BOX 2.0
IS FWD REF = NIL
@BOX 4.0
DOES IT POINT TO AN EMPTY ITEM
@BOX 5.0
GET FWD REF AND MAKE IT 2ND ITEM IN LIST
@BOX 6.0
FILL ITEM
@BOX 7.0
END
@BOX 8.0
ERROR
@BOX 1.1
PROC ADDFWDREF(PSTORE,PPOSN,SCALE,PFWDREF,PSIZE); ::DEBUG TEST(27);
ADDR FWDREFTYPE ITEM;
@BOX 2.1
IF PFWDREF=>ITEM=NILFWDREF,
@BOX 4.1
IF FWDADDRESS OF PFWDREF^=0 AND
 FWDSTORE OF PFWDREF^=NILSTORE,
@BOX 5.1
GETFWDREF()=>ITEM;
FRLINK OF PFWDREF^=>FRLINK OF ITEM^;
ITEM=>FRLINK OF PFWDREF^;
@BOX 6.1
SCALE<<-1!PSIZE<<-30!PPOSN=>FWDADDRESS OF ITEM^;
PSTORE=>FWDSTORE OF ITEM^;
@BOX 7.1
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LADD FR ");
 OUTHEX(RUNADDR(PSTORE,0),8);
 SPACES(1);
 OUTHEX(PPOSN,8);
 OUTI(SCALE,1);
 OUTI(PSIZE,1);
 SPACES(1);
 OUTHEX(BYTE(PFWDREF),8);
 SPACES(1);
 OUTHEX(BYTE(ITEM),8);
FI;
END;
@BOX 8.1
FAULT(0,%"NIL FWD REF");
@END
@TITLE MTL27.33(7,8)
@COL 1S-7T-2T-6T-9T-3R-4R
@COL 8R-5F-10R
@ROW 2-8
@ROW 3-10
@FLOW 1-7N-2N-6N-9N-3-4-2Y-5
@FLOW 7Y-8-5
@FLOW 6Y-4
@FLOW 9Y-10-4
@BOX 1.0
PLANT FWD REF (VALUE,FWD REF LIST)
@BOX 2.0
IS LIST EMPTY?
@BOX 3.0
USING NEXT ITEM ON LIST,
ADD SCALED VALUE TO VALUE AT ADDRESS
@BOX 4.0
RELEASE ITEM FROM LIST
@BOX 5.0
END
@BOX 6.0
IS NEXT ITEM EMPTY
@BOX 7.0
IS LIST EMPTY
@BOX 8.0
ERROR
@BOX9.0
DOES NEXT ITEM REFER TO POOL ?
@BOX10.0
RESOLVE POOL FORWARD REF
@BOX 1.1
PROC PLANTFWDREF(VALUE,PFWDREF); ::DEBUG TEST(28);
ADDR FWDREFTYPE NEXT,OLDFWDREF;
$IN TSIZE,TVALUE,TEMP;
PFWDREF=>OLDFWDREF;
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LPLANT FR ");
 OUTHEX(VALUE,8);
 SPACES(1);
 OUTHEX(BYTE(PFWDREF),8);
FI;
@BOX 2.1
IF PFWDREF=>NEXT=NILFWDREF,
@BOX 3.1
$PS ABS($IN32)/$IN32;
PROC ABS(I);
IF I<0 THEN 0-I=>ABS ELSE I=>ABS FI;
END;
IF FWDADDRESS&%40(7)=0 THEN
 4=>TSIZE;
ELSE
 2=>TSIZE;
FI;
IF FWDADDRESS&%80(7)=0 THEN
 VALUE=>TVALUE;
ELSE
 VALUE->>4=>TVALUE;
FI;
FWDADDRESS&%1F(7)-2=>TEMP;
IF FWDADDRESS->>30=3 AND
 ABS(VALUE->>3-RUNADDR(FWDSTORE,TEMP))&%FFFF0000/=0 THEN
 $IN X,Y,Z,D,S;
 RUNADDR(FWDSTORE,TEMP)=>S;
 IF VALUE->>3=>D/=RUNADDR(CODESEGP,STOREI OF CODESEGP^) THEN
  FAULT(0,%"LONG FWD BR TO NON-CURRENT CODE POSITION");
  ->L;
 FI;
 4-(D->>1+3&3)&3=>Y;
 D->>1+Y-1->>2-(S->>3)=>Z;
 IF ABS(Z)&%FFFF8000/=0 THEN
  FAULT(0,%"FWD BR TOO LONG");
  ->L;
 FI;
 IF [GETLIT32(2,TEMP,FWDSTORE)=>X&%E1FF/=%8100 OR X->>9<6]AND X/=%A100 THEN
  FAULT(0,%"FWD BR TOO LONG");
  ->L;
 FI;
 ::CAPTION(%"$LS,D,Y,Z,X");
 ::OUTHEX(S,8);SPACES(1);
 ::OUTHEX(D,8);SPACES(1);
 ::OUTI(Y,8);SPACES(1);
 ::OUTHEX(Z,8);SPACES(1);
 ::OUTHEX(X,8);SPACES(1);
 ASSLIT64(X&%FF00!%C8<<-16!Z,4,FWDSTORE,TEMP);
 PLANTV16CODE(%8E03+Y)::BR #3+Y
 ASSLIT64((D-S/2),4,CODESEGP,Y*2+>STOREI OF CODESEGP^);
 4+>STOREI OF CODESEGP^;
ELSE
 ADDLIT32(TVALUE,TSIZE,TEMP+2,FWDSTORE);
FI;
L:
@BOX 4.1
FRLINK=>PFWDREF;
FREEFWDREF=>FRLINK;
NEXT=>FREEFWDREF;
@BOX 5.1
END;
@BOX 6.1
SELECT NEXT^;
IF TLPRM&%40/=0 THEN
 NEWLINES(1);
 OUTHEX(BYTE(NEXT),8);
 SPACES(1);
 OUTHEX(FWDADDRESS,8);
FI;
IF FWDADDRESS=0 AND FWDSTORE=NILSTORE,
@BOX 7.1
IF PFWDREF=NILFWDREF,
@BOX 8.1
FAULT(0,%"EMPTY FWD REF LIST");
@BOX9.1
IF FWDADDRESS&%20(7)/=0,
@BOX10.1
SELECT POOL[FWDADDRESS&%1F(7)];
IF LITFWDREF/=OLDFWDREF THEN
 OUTHEX(BYTE(OLDFWDREF),8);
 SPACES(1);
 OUTHEX(BYTE(LITFWDREF),8);
 FAULT(0,%"FWDREFS/= IN PLANTFWDREF");
FI;
NILFWDREF=>LITFWDREF;
POOLLIT=>TEMP;
(TEMP+VALUE)=>POOLLIT;
@END
@TITLE MTL27.34(7,8)
@COL 1S-2C-3R-4R-5R-14R-15R-7R-8C-9F
@COL 10R-11R-16R-12R-13R
@ROW 3-10
@FLOW 1-2
@FLOW 7-8-9
@BOX 1.0
GEN OPERAND (^INST,^OPERAND)
@BOX 2.0
CASE
OPERAND
TYPE
OF
@BOX 3.0
SELECT VARIABLE
DECLARE ACTUAL VARIABLE IF NECESSARY
OPERAND=VARIABLE
@BOX 4.0
VARIABLE: GENERATE VARIABLE OPERAND
[MTL27.34.1]
@BOX 5.0
LABEL,PROC: OPERAND = ADDRESS (+ENVIRONMENT?)
[MTL27.34.2]
@BOX 7.0
OTHER:
@BOX 8.0
ESAC
@BOX 9.0
END
@BOX 10.0
LITERAL: OPERAND = LITERAL
@BOX 11.0
STACK:
OPERAND = STK
@BOX 12.0
UNSTACK: OPERAND = UNSTK
@BOX 13.0
REGISTER: OPERAND = REGISTER
@BOX 14.0
VSUB: OPERAND = VSUB
@BOX 15.0
T: OPERAND = T
@BOX 16.0
PARAMETER STACK:
OPERAND = STK
@BOX 1.1
PROC GENOPERAND(INST,OP); ::DEBUG TEST(29);
SELECT INST^; SELECT OPD;
SELECT OP^;
$IN TEMP,TEMP2;
CLEAROP(OP);
IF OPCODE->>5=%39 THEN ::STRING
 %10!>ORIGKIND;
FI;
@BOX 2.1
SWITCH OPDKIND\K0,KESAC,
K2,K3,K4,K5,K6,K7,
K8,K9,K10,K11,KESAC,
KESAC,KESAC,KESAC,KESAC;
@BOX 3.1
K2:
BEGIN
SELECT SELVAR^;
IF SELVF& 2=0 THEN
IF OPCODE&%1C00/=0 THEN
    SDECL(3,0) => SELECTVAR OF SELADDR;
   ELSE
    SDECL(1,0) => SELECTVAR OF SELADDR;
   FI;
2!>SELVF;
FI;
IF OPCODE&%1C00/=0 THEN
 8=>TEMP;
ELSE
 4=>TEMP;
FI;
VAROP(SELECTVAR OF SELADDR,0,OP,TEMP,0);
END;
5=>OPTYP;
->KESAC;
@BOX 4.1
K0:
#MTL27.34.1
->KESAC;
@BOX5.1
#MTL27.34.2
@BOX 7.1
@BOX 8.1
KESAC:
@BOX 9.1
END;
@BOX 10.1
K3:
    %100 => MU6GOP ::LIT
    SIZ OF LITTYPE => OPSIZE;
    MOD OF LITTYPE => OPTYP;
    VAL OF LIT => OPLIT;
IF OPTYP=6 THEN
 IF OPSIZE=1 THEN 7=>OPTYP FI;
 8=>OPSIZE;
FI;
IF OPTYP=0 AND OPSIZE=8 AND OPLIT&%F(8)=0 THEN
 4=>OPSIZE;
 OPLIT->>32=>OPLIT;
FI;
->KESAC;
@BOX 11.1
K6:
-1=>OPSIZE;
    %7E => MU6GOP ::STK
->KESAC;
@BOX 12.1
K8:
    %7F => MU6GOP ::UNST
SIZ OF UNSTK=>OPSIZE;
MOD OF UNSTK=>OPTYP;
IF OPTYP=6 THEN
 IF OPSIZE=1 THEN 7=>OPTYP FI;
 8=>OPSIZE;
FI;
->KESAC;
@BOX 13.1
DATAVEC ACCOPS ($IN)
%60 %103 %103 %60 -1 %11C -1
END;
K9:
    IF REG = 0 THEN
%101 => MU6GOP ::BM1 (B)
1=>OPTYP;
4=>OPSIZE;
    ELSE
IF LASTAMODE=-1 THEN
 FAULT(0,%"A NOT SET, A REG OP");
ELSE
   ASIZ[LASTAMODE->>5&%7]=>OPSIZE;
 ACCOPS[LASTAMODE->>2&%7=>OPTYP]=>MU6GOP;
FI;
    FI;
->KESAC;
@BOX 14.1
K11:
4=>OPSIZE;
2=>OPTYP;
     %130 => MU6GOP ::#BA12 (VSUB)
->KESAC;
@BOX 15.1
DATAVEC T ($IN)
%68 %69 %6A %6B %6C %6D
END;
K10:
 4=>OPSIZE;
 2=>OPTYP;
     T[TREG] => MU6GOP;
->KESAC;
@BOX 16.1
K7:
SIZ OF PARSTK=>OPSIZE;
MOD OF PARSTK=>OPTYP;
%7E=>MU6GOP;
IF OPTYP=6 THEN
 IF OPSIZE=1 THEN 7=>OPTYP FI;
 8=>OPSIZE;
FI;
->KESAC;
@END
@TITLE MTL27.34.1(7,8)
@COL 1S-2C-3R-4R-13R-6R-7C-9R-10F
@COL 5R-11R-14T-12R-15R
@ROW 3-5
@FLOW 1-2
@FLOW 3-13
@FLOW 4-13
@FLOW 5-14N-12
@FLOW 11-14Y-15
@FLOW 7-9-10
@BOX 1.0
GENERATE VARIABLE OPERAND
@BOX 2.0
CASE
VAR TYPE
OF
@BOX 3.0
VAR: OPERAND = VARIABLE
@BOX 4.0
VSTORE: OPERAND = VARIABLE
@BOX 5.0
SELECT: OPERAND = VARIABLE
@BOX 6.0
D: OPERAND = D REG^
@BOX 7.0
ESAC
@BOX 9.0
ADD INDEX AND BOUNDCHECK
@BOX 10.0
END
@BOX 11.0
POINTER: OPERAND = VARIABLE
@BOX 12.0
GET BA REG, LOAD WITH OPERAND
OPERAND = BA REG^
@BOX13.0
IF REF, TOP = DIMENSION
@BOX14.0
REF ?
@BOX15.0
CHECK BOUND & SIZE
@BOX 1.1
$IN TOFFSET;
ADDR VARE TEMPVAR;
INDEXC*SIZ OF OPTYPE+OFFSET=>TOFFSET;
SIZ OF OPTYPE=>OPSIZE;
MOD OF OPTYPE=>OPTYP;
IF OPTYP=6 THEN
 IF OPSIZE=1 THEN 7=>OPTYP FI;
 8=>OPSIZE;
FI;
@BOX 2.1
SWITCH
ORIGKIND&%7\
V0,V1,V2,V3,V4;
@BOX 3.1
V0:
INITVAR(VAR OF ORIG);
VAROP(VAR OF ORIG,ORIGKIND,OP,SIZ OF OPTYPE,TOFFSET);
@BOX 4.1
V4: SELECT VST^ OF ORIG;
SELECT V;
IF VKIND=0 THEN
 GENADDR(NILSTORE,STOREADDR&%F(7)8,8,OP);
 SIZ OF OPTYPE=>OPSIZE;
 MU6GOP&%1C3!%4 => MU6GOP;
ELSE
 INITVAR(VARP);
 VAROP(VARP,ORIGKIND,OP,SIZ OF OPTYPE,TOFFSET);
FI;
@BOX 5.1
V3:
SELECTVAR OF SELADDR OF SEL^ OF ORIG=>TEMPVAR;
@BOX 6.1
V2:
GENADDR(NILSTORE,TOFFSET,SIZ OF OPTYPE,OP);
MU6GOP&%1C0!%3C => MU6GOP;
IF ORIGKIND&%18/=0 THEN
 IF ORIGKIND&%10=0 THEN
  4=>OPSIZE;
 ELSE
  8=>OPSIZE;
  1=>OPTOPDIFF;
IF DIM OF OPTYPE=>TOPLIT=0 THEN
 %138=>TOPMU6GOP:: BA14
ELSE
 %100=>TOPMU6GOP:: LIT
FI;
 FI;
 1=>REFBIT;
 5=>OPTYP;
FI;
->VESAC;
@BOX 7.1
VESAC:
@BOX 9.1
DATAVEC SHIFTS ($IN)
1 1 4 8
END;
IF INDEXB/=0 THEN
 1!>MU6GOP ::BM1 (B)
 IF SIZ OF OPTYPE/SHIFTS[MU6GOP->>6&%3]=>TEMP2>1 THEN
  PLANTCODE(%3700,TEMP2):: BM1 * #OPSIZE
  IF REGSPEC&1=0 THEN
   FAULT(0,%"SUBSCRIPT TOO COMPLICATED");
  FI;
 FI;
FI;
@BOX 11.1
V1: INITVAR(PTR OF ORIG=>TEMPVAR);
@BOX 12.1
GETREG(-1,6,11) => TEMP;
PLANTLOAD(TEMP,4,OP,0);
GENADDR(NILSTORE,TOFFSET,SIZ OF OPTYPE,OP);
NILFWDREF=>OPFWDREF;
MU6GOP&%1C3!(TEMP<<-2) => MU6GOP;
->VESAC;
@BOX13.1
IF ORIGKIND&%18/=0 THEN
 1=>REFBIT;
 5=>OPTYP;
 IF ORIGKIND&%10/=0 THEN
  1=>OPTOPDIFF;
 DIM OF OPTYPE=>TOPLIT;
 %100=>TOPMU6GOP:: LIT
  8=>OPSIZE;
 ELSE
  4=>OPSIZE;
 FI;
FI;
->VESAC;
@BOX14.1
IF VARTYP OF TEMPVAR^&%3=1 OR
 VARTYP OF TEMPVAR^=%24 OR VARTYP OF TEMPVAR^=%2C THEN
 4=>TEMP;
ELSE
 8=>TEMP;
FI;
VAROP(TEMPVAR,0,OP,TEMP,0);
IF ORIGKIND&%18/=0,
@BOX15.1
IF INDEXC/=0 OR INDEXB/=0 OR OFFSET/=0 THEN
 GETREG(-1,6,11)=>TEMP;
 PLANTLOAD(TEMP,4,OP,0);
 OPSIZE=>TEMP2;
 GENADDR(NILSTORE,TOFFSET,AL OF OPTYPE,OP);
 TEMP2=>OPSIZE;
 NILFWDREF=>OPFWDREF;
 MU6GOP&%1C3!(TEMP<<-2)=>MU6GOP;
 1=>REFBIT;
 5=>OPTYP;
FI;
IF ORIGKIND&%10/=0 THEN
 IF DIM OF OPTYPE=>TOPLIT/=0 THEN
  %100=>TOPMU6GOP:: LIT
  1=>OPTOPDIFF;
 FI;
 8=>OPSIZE;
ELSE
 4=>OPSIZE;
FI;
->VESAC;
@END
@TITLE MTL27.34.2(7,8)
@COL 1S-2R-3T-4R-5R-6T-7R-8T-9R-10F
@COL 11R-12R-13R-14R
@ROW 5-11
@FLOW 2-3N-4
@FLOW 3Y-11-14
@FLOW 5-6N-7-8N-9
@FLOW 6Y-12
@FLOW 8Y-13-14
@BOX1.0
@BOX2.0
LABEL: INITIALISE
@BOX3.0
+ENVIRONMENT ?
@BOX4.0
OPERAND = ADDRESS OF LABEL
@BOX5.0
PROC: INITIALISE
@BOX6.0
LSPEC ?
@BOX7.0
OPERAND BOTTOM = ADDRESS OF PROC
(SET TOP BIT IF EXEC)
@BOX8.0
+ENVIRONMENT?
@BOX9.0
END
@BOX10.0
@BOX11.0
OPERAND BOTTOM = ADDRESS OF L1
PLANT:-
->L0
L1: SF=NB+OFFSET FOR LABEL'S PROC
->LABEL
L0:
(SET TEXTUAL LEVEL FOR LABEL'S PROC)
@BOX12.0
OPERAND = ADJUSTED FINDN
(SET TOP BIT IF EXEC)
@BOX13.0
SET TEXTUAL LEVEL
@BOX14.0
OPERAND TOP = SLINK
@BOX1.1
ADDR PROCE TEMPP;
$IN XNB,TX;
@BOX2.1
K4:
SELECT LAB^;
SELECT LABADDR;
INITLABEL(LAB);
%100=>MU6GOP:: LITERAL
5=>OPTYP;
@BOX3.1
IF LABK/=0,
@BOX4.1
LABADDRESS<<-3=>OPOFFSET;
4=>OPSIZE;
IF LABFWDREF=>OPFWDREF=NILFWDREF AND RUNADDR(CODESEGP,-1)-LABADDRESS>0<%FF0 THEN
 %108=>MU6GOP:: LITERAL/CO
FI;
->KESAC;
@BOX5.1
K5:
SELECT PROCED^;
SELECT ENTRY;
SELECT PROCADDR;
INITPROC(PROCED);
%100=>MU6GOP:: LITERAL
IF PROCK=1 THEN
 8=>OPSIZE;
ELSE
 4=>OPSIZE;
FI;
5=>OPTYP;
@BOX6.1
IF PROCNAT&%8/=0,
@BOX7.1
PROCADDRESS<<-3=>OPOFFSET;
IF PROCNAT&%80=0 THEN
 PROCFWDREF=>OPFWDREF;
FI;
::!IF   THEN
::! %80(7)!>OPOFFSET;
::!ELSE
 IF OPFWDREF=NILFWDREF AND RUNADDR(CODESEGP,-1)-PROCADDRESS>0<%FF0 THEN
  %108=>MU6GOP:: LITERAL/CO
 FI;
::!FI;
@BOX8.1
IF PROCK=1,
@BOX9.1
->KESAC;
@BOX11.1
8=>OPSIZE;
LABTX=>TX;
STOREI OF CODESEGP^=>TEMP;
PLANTV16CODE(%8E00):: BR ->L0
RUNADDR(CODESEGP,-1)<<-3=>OPOFFSET;
%108=>MU6GOP:: LITERAL/CO
PLANTV32CODE(%E7D0,0):: SF=REF V64?/NB
IF LABTX=0 THEN
 ADDFWDREF(CODESEGP,STOREI OF CODESEGP^-2,0,PROGSFLIT,1);
ELSE
 CURPROCP=>TEMPP;
 PROPPTR(TXPROCN OF TXS[LABTX],6);
 ADDFWDREF(CODESEGP,STOREI OF CODESEGP^-2,0,PROCSFLIT OF PROCADDR
  OF ENTRY OF CURPROCP^,1);
 TEMPP=>CURPROCP;
FI;
GOTO(LAB);
ASSLIT64((STOREI OF CODESEGP^-TEMP->>1),1,CODESEGP,TEMP+1);
@BOX12.1
PROCFINDN&%7FFF00FF<<-5=>OPOFFSET;
PROCFINDN&%80(7)!>OPOFFSET;
->KESAC;
@BOX13.1
PROCINFO+1=>TX;
@BOX14.1
IF OPDKIND=5 AND TX=<1 THEN ::NOT NEEDED
 %100=>TOPMU6GOP;
 0=>TOPLIT;
ELSE IF TX=TXI THEN ::NB
 %44=>TOPMU6GOP;
ELSE
 PLANTSLINK(GETREG(-1,6,11)=>XNB,TX,TXI-NOOFPPROCS);
 %40+XNB=>TOPMU6GOP;
FI;FI;
1=>OPTOPDIFF;
->KESAC;
@END
@TITLE MTL27.35(7,8)
@COL 1S-2R-3R-4R-21R-22R-20F
@COL 5R-8R-10R
@COL 11R-13R-16R
@ROW 3-5-11
@FLOW 1-2
@BOX1.0
CONVERT A OP (^OPERAND, TO SIZE, TO TYPE, REGISTER, FROM TYPE)
@BOX2.0
CASE
(OLD TYPE, NEW TYPE)
OF
@BOX3.0
NOT IMPLEMENTED
@BOX4.0
ILLEGAL
@BOX5.0
LO/IN->LO/IN
@BOX8.0
PTR->PTR
@BOX10.0
IN->PTR
@BOX11.0
PTR->IN
@BOX13.0
IN->RE
@BOX16.0
RE->IN
@BOX20.0
END
@BOX21.0
LO->PTR
@BOX22.0
PTR->LO
@BOX1.1
PROC CONVERTAOP(OP,TO.Z,TO.TY,REG,FR.TY);
$IN FR.Z,TEMP;
SELECT OP^;
OPSIZE=>FR.Z;
DATAVEC PTR.Z ($IN)
4 8 0 0 4 0 0 0 8
END;
IF TO.TY=5 THEN
 PTR.Z[TO.Z]=>TO.Z;
FI;
@BOX2.1
IF FR.Z=TO.Z AND FR.TY=TO.TY,->L.END;
SWITCH FR.TY\F.RE,F.IN,F.LO,F.DEC,F.GEN,F.PTR,F.COM,F.STR;
F.RE:SWITCH TO.TY\RE.RE,RE.IN,RE.LO,RE.DEC,ERROR,ERROR,RE.COM,ERROR;
F.IN:SWITCH TO.TY\IN.RE,IN.IN,IN.LO,IN.DEC,ERROR,IN.PTR,IN.COM,ERROR;
F.LO:SWITCH TO.TY\LO.RE,LO.IN,LO.LO,LO.DEC,ERROR,LO.PTR,ERROR,ERROR;
F.DEC:SWITCH TO.TY\DEC.RE,DEC.IN,DEC.LO,DEC.DEC,ERROR,ERROR,ERROR,DEC.STR;
F.GEN:SWITCH TO.TY\ERROR,ERROR,ERROR,ERROR,GEN.GEN,ERROR,ERROR,ERROR;
F.PTR:SWITCH TO.TY\ERROR,PTR.IN,PTR.LO,ERROR,ERROR,PTR.PTR,ERROR,ERROR;
F.COM:SWITCH TO.TY\COM.RE,COM.IN,ERROR,ERROR,ERROR,ERROR,COM.COM,ERROR;
F.STR:SWITCH TO.TY\ERROR,ERROR,ERROR,STR.DEC,ERROR,ERROR,ERROR,STR.STR;
@BOX3.1
DEC.STR:STR.DEC:
DEC.IN:IN.DEC:
DEC.LO:LO.DEC:
DEC.RE:RE.DEC:
DEC.DEC:
RE.COM:COM.RE:
IN.COM:COM.IN:
FAULT(0,%"IMPLICIT CONVERSION NOT IMPLEMENTED");
L.DUMP:
OUTI(FR.TY,5);
OUTI(FR.Z,5);
OUTI(TO.TY,5);
OUTI(TO.Z,5);
->L.END;
@BOX4.1
ERROR:
FAULT(0,%"IMPLICIT CONVERSION NOT LEGAL");
->L.DUMP;
@BOX5.1
LO.LO:IN.LO:
LO.IN:IN.IN:
CONVERTBMOP(OP,TO.Z,FR.TY);
->L.END;
@BOX 8.1
PTR.PTR:
IF FR.Z<TO.Z THEN
 1=>OPTOPDIFF;
 0=>TOPLIT;
 %100=>TOPMU6GOP:: LIT
 8=>OPSIZE;
FI;
->L.END;
@BOX 10.1
IN.PTR:
PLANTLOAD(GETREG(-1,%11,%13)=>TEMP,4,OP,0);
PLANTV16CODE(TEMP<<-13!%1C3D):: BM <<- #3
4=>OPSIZE=>FR.Z;
0=>OPLIT;
TEMP&3!%100=>MU6GOP:: BM REG
NILFWDREF=>OPFWDREF;
->PTR.PTR;
@BOX 11.1
PTR.IN:
PLANTLOAD(GETREG(-1,%11,%13)=>TEMP,4,OP,0);
PLANTV16CODE(TEMP<<-13!%1C03):: BM ->> #3
4=>OPSIZE;
0=>OPLIT;
TEMP&3!%100=>MU6GOP:: BM REG
NILFWDREF=>OPFWDREF;
->L.END;
@BOX13.1
IN.RE:
 IF MU6GOP=%7F THEN
  PLANTV16CODE(%007E):: ACC => STK
  PLANTV32CODE(%078C,-1):: ACC(D) = STACKED OP
 ELSE
  PLANTV16CODE(%007E):: SF+ 64
  PLANTV16CODE(%007E):: ACC=> STK
  PLANTSEQ(3,%10,-1,OP,0):: ACC(D)= [BM0 NEQ] OP
 FI;
 PLANTV16CODE(%0800):: ACC CONV REAL
 PLANTV32CODE(%01CC,-1):: ACC=> @-1/SF
 PLANTV16CODE(%047F):: ACC= UNST
 CLEAROP(OP);
 %7F=>MU6GOP:: UNST
 4=>OPSIZE;
 0=>OPTYP=>FR.TY;
->L.END;
@BOX16.1
RE.IN:
 LOAD(%10,1,FR.TY,OPSIZE,OP);
 PLANTV16CODE(%802):: ROUND
 CLEAROP(OP);
 %50=>MU6GOP:: ACC
 4=>OPSIZE;
 1=>OPTYP=>FR.TY;
->L.END;
@BOX20.1
L.END:
RE.RE:GEN.GEN:STR.STR:COM.COM:
LO.RE:RE.LO:
END;
@BOX21.1
LO.PTR:
IF FR.Z<4 THEN
 CONVERTAOP(OP,4,FR.TY,REG,FR.TY);
 4=>OPSIZE=>FR.Z;
FI;
->PTR.PTR;
@BOX22.1
PTR.LO:
CONVERTAOP(OP,TO.Z,TO.TY,REG,TO.TY);
->L.END;
@END
@TITLE MTL27.36(7,8)
@COL 1S-18T-20T-2T-3T-15N-16N-4T-5T-17N-6T-7T-8R-9F
@COL 19R-10T-11R-12R-13R
@COL 14R
@ROW 15-10
@ROW 17-12
@ROW 8-13-14
@ROW 18-19
@FLOW 1-18N-20N-2N-3N-15-16-4N-5N-17-6N-7N-8-9
@FLOW 2Y-14-9
@FLOW 3Y-10N-11-9
@FLOW 10Y-14
@FLOW 4Y-14
@FLOW 5Y-12-9
@FLOW 6Y-14
@FLOW 7Y-13-9
@FLOW 18Y-19-9
@FLOW 20Y-14
@BOX 1.0
PLANT CODE(TOP,BOTTOM)
@BOX 2.0
BOTTOM > 6 BITS?
@BOX 3.0
VARIABLE OPERAND?
@BOX 4.0
BA/=0 AND BM/=0?
@BOX 5.0
BA=0 AND BM=0?
@BOX 6.0
BOTTOM /= 0?
@BOX 7.0
BM = 0?
@BOX 8.0
PLANT V16 CODE
(OP=BM REG)
@BOX 9.0
END
@BOX 10.0
BM /= 0 OR BA /= NB?
@BOX 11.0
PLANT V16 CODE
(OP = /NB)
@BOX 12.0
PLANT V16 CODE
(OP = LITERAL)
@BOX 13.0
PLANT V16 CODE
(OP = BA REG)
@BOX 14.0
PLANT V32 CODE
@BOX 18.0
REGISTER OPERAND?
@BOX 19.0
PLANT V16 CODE
(OP = REGISTER)
@BOX 20.0
BYTE STRING-OP?
@BOX 1.1
PROC PLANTCODE(TOP,BOTTOM); ::DEBUG TEST(31);
@BOX 2.1
IF BOTTOM & %FFE0 /=0 /=%FFE0,
@BOX 3.1
IF TOP&%C0/=0,
@BOX 4.1
IF TOP&%3C/=0 AND TOP&%3/=0,
@BOX 5.1
IF TOP &%3F=0,
@BOX 6.1
IF BOTTOM/=0,
@BOX 7.1
IF TOP&%3=0,
@BOX 8.1
PLANTV16CODE(TOP&%FF83+%50);
@BOX 9.1
END;
@BOX 10.1
IF TOP&%3/=0 OR TOP&%3C/=%10,
@BOX 11.1
PLANTV16CODE(TOP&%FFC0!(BOTTOM&%3F));
@BOX 12.1
PLANTV16CODE(TOP&%FF00!(BOTTOM&%3F));
@BOX 13.1
PLANTV16CODE(TOP&%FF00+%40+(TOP->>2&%F));
@BOX 14.1
PLANTV32CODE(TOP,BOTTOM);
@BOX 18.1
IF TOP&%1C0=%40,
@BOX 19.1
PLANTV16CODE(TOP);
@BOX 20.1
IF TOP&%1C0=%140,
@END
@TITLE MTL27.37(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ROUND UP(VALUE,SCALE) : VALUE
@BOX 2.0
RESULT = VALUE ->> SCALE, ROUNDED UP
@BOX 3.0
END
@BOX 1.1
PROC ROUNDUP(VALUE,SCALE); ::DEBUG TEST(32);
@BOX 2.1
IF VALUE->>SCALE=>ROUNDUP<<-SCALE/=VALUE THEN
1 +> ROUNDUP
FI;
@BOX 3.1
END;
@END
@TITLE MTL27.38(7,8)
@COL 1S-6T-2T-3R-4R-5F
@COL 7R
@ROW 4-7
@FLOW 1-6N-2N-3-4-5
@FLOW 2Y-4
@FLOW 6Y-7-5
@BOX 1.0
RUN ADDR(^STORE,OFFSET) : BYTE ADDRESS
@BOX 2.0
IS OFFSET GIVEN?
@BOX 3.0
OFFSET = TOP OF STORE
@BOX 4.0
CALCULATE ADDRESS
@BOX 5.0
END
@BOX 6.0
ABSOLUTE OFFSET?
@BOX 7.0
ADDRESS = OFFSET
@BOX 1.1
PROC RUNADDR(PSTORE,OFFSET); ::DEBUG TEST(33);
@BOX 2.1
SELECT PSTORE^; SELECT STOREADDR;
IF OFFSET /= -1,
@BOX 3.1
STOREI => OFFSET;
@BOX 4.1
STORERA + OFFSET => RUNADDR;
@BOX 5.1
END;
@BOX 6.1
IF PSTORE = NILSTORE,
@BOX 7.1
OFFSET=>RUNADDR;
@END
@TITLE MTL27.39(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
CLEAR OP (^OPERAND)
@BOX 2.0
CLEAR ALL FIELDS OF OPERAND
(TYPE & SIZE = $IN32)
@BOX 3.0
END
@BOX 1.1
PROC CLEAROP(OP); ::DEBUG TEST(34);
SELECT OP^;
@BOX 2.1
NILFWDREF => OPFWDREF => TOPFWDREF;
0=>MU6GOP=>OPTOPDIFF=>TOPMU6GOP=>REFBIT=>TOPLIT=>V64ASV32S;
4=>OPSIZE;
1=>OPTYP;
0=>OPLIT;
@BOX 3.1
END;
@END
@TITLE MTL27.40(7,8)
@COL 1S-2T-3T-4R-5T-6R-7T-8F
@COL 9R-10R
@ROW 3-9
@FLOW 1-2N-3N-4-5-6-7-8
@FLOW 2Y-9-8
@FLOW 3Y-10-8
@BOX 1.0
PLANT SLINK (REG,TARGET,CURRENT)
@BOX 2.0
TARGET > CURRENT?
@BOX 3.0
TARGET < 2?
@BOX 4.0
PLANT REG = SLINK/NB
@BOX 5.0
FOR CURRENT - TARGET DO
@BOX 6.0
PLANT REG = SLINK/REG
@BOX 7.0
OD
@BOX 8.0
END
@BOX 9.0
PLANT REG= NB
@BOX 10.0
PLANT REG = GNB
@BOX 1.1
PROC PLANTSLINK(REG,TARGET,CURRENT); ::DEBUG TEST(35);
$IN TEMP;
@BOX 2.1
IF TARGET > CURRENT,
@BOX 3.1
IF TARGET < 2,
@BOX 4.1
PLANTV16CODE(REG<<-9+%C082) ::BA? = SLINK/NB
@BOX 5.1
REG*%204+%C180 => TEMP ::BA? = SLINK/BA?
WHILE CURRENT > TARGET DO
@BOX 6.1
PLANTV32CODE(TEMP,2);
@BOX 7.1
1 -> CURRENT;
OD;
@BOX 8.1
END;
@BOX 9.1
PLANTV16CODE(REG<<-9+%C044) ::BA? = NB
@BOX 10.1
PLANTV16CODE(REG<<-9+%C045) ::BA? = BA5 (GNB)
@END
@TITLE MTL27.41(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PLANT STACK(OP,TOP)
@BOX 2.0
STACK OPERAND
@BOX 3.0
END
@BOX 1.1
PROC PLANTSTACK(OP,TOP); ::DEBUG TEST(36);
$IN TEMP;
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LPLANT STACK");
 OUTI(OPSIZE OF OP^,2);
 OUTI(TOP,2);
FI;
@BOX 2.1
IF REFBIT OF OP^=0 THEN
 ::IF OPSIZE OF OP^=8 AND TOP=0 THEN
  PLANTSEQ(STACK,-1,-1,OP,TOP) ::STACK FULL OP
 ::ELSE
 :: PLANTSEQ(BASTORE,1,-1,OP,TOP) ::STACK V32 OP
 ::FI;
ELSE
 PLANTREF(1,OP);
 IF OPSIZE OF OP^=8 THEN
  PLANTLOAD(GETREG(-1,%11,%13)=>TEMP,4,OP,1);
  PLANTV32CODE(TEMP<<-13!%18C,0);
 FI;
FI;
@BOX 3.1
END;
@END
@TITLE MTL27.42(7,8)
@COL 1S-2R-3T-4R-5R-6F
@COL 7T-11T-13R-8R-9R-10R
@ROW 4-7
@FLOW 1-2-3N-4-5-6
@FLOW 3Y-7N-11N-13-10-6
@FLOW 11Y-8-10
@FLOW 7Y-9-10
@BOX 1.0
LOAD (REG, R, T, Z, ^OP)
@BOX 2.0
SELECT REGISTER SUITABLE FOR OPERAND
@BOX 3.0
REF OPERAND ?
@BOX 4.0
LOAD OPERAND
@BOX 5.0
CONVERT TO TYPE AND SIZE REQUIRED
@BOX 6.0
END
@BOX 7.0
BA REG ?
@BOX8.0
GET BA REG
LOAD REF
REG = BA REG
@B9.0
LOAD REF
@BOX10.0
LOAD BOUND
IF WANTED
@BOX11.0
NOT OPTIMISABLE ?
@BOX13.0
LOAD LITERAL
@BOX 1.1
PROC LOAD(REG,R,T,Z,OP); ::DEBUG TEST(37);
SELECT OP^;
$IN TEMP,TEMP2;
DATAVEC TIMES ($IN)
 1 8 32 64
END;
@BOX 2.1
IF R=1 THEN ::A
 ACCREGS[OPTYP]=>TEMP;
ELSE
 REG=>TEMP;
FI;
@BOX 3.1
IF REFBIT/=0,
@BOX 4.1
PLANTLOAD(TEMP,OPSIZE,OP,0);
@BOX 5.1
IF R=1 THEN ::A
 PLANTACONV(OPSIZE,OPTYP,Z,T,0);
ELSE IF R=0 THEN:: B
 PLANTBMCONV(%11,OPSIZE,OPTYP,Z);
FI;FI;
@BOX 6.1
END;
@BOX 7.1
IF REG<%10,
@BOX8.1
PLANTREF(GETREG(-1,6,11)=>TEMP,OP);
PLANTV16CODE(REG<<-13!%440!TEMP);
@BOX9.1
PLANTREF(REG,OP);
@BOX10.1
IF OPSIZE=8 THEN
 PLANTLOAD(REG-1,4,OP,1);
FI;
@BOX11.1
IF MU6GOP&%13C=%108 THEN ::/CO
 RUNADDR(CODESEGP,-1)<<-3=>TEMP2;
ELSE
 0=>TEMP2;
FI;
IF MU6GOP&3/=0 OR OPFWDREF/=NILFWDREF OR
 OPOFFSET*TIMES[MU6GOP->>6&3]-:>TEMP2&%FFFF8000/=0/=%FFFF8000,
@BOX13.1
PLANTCODE(REG<<-13!%400!(MU6GOP&%13C),TEMP2);
@END
@TITLE MTL27.43(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PLANT REF (REG,^OP)
@BOX 2.0
PLANT SEQUENCE
REG = REF OP
@BOX 3.0
END
@BOX 1.1
PROC PLANTREF(REG,OP); ::DEBUG TEST(38);
@BOX 2.1
PLANTSEQ(BAREF,REG,-1,OP,0);
@BOX 3.1
END;
@END
@TITLE MTL27.44(7,8)
@COL 1S-2T-3T-4T-5T-6R-7F
@COL 8R
@ROW 6-8
@FLOW 1-2N-3-4N-5-6-7
@FLOW 2Y-8-7
@FLOW 4Y-8
@BOX 1.0
GET REG (PREFERRED, FROM, TO) :REG
@BOX 2.0
PREFERRED USABLE
@BOX 3.0
FOR ALL REGS IN RANGE
@BOX 4.0
IS REG USABLE
@BOX 5.0
OD
@BOX 6.0
ERROR
@BOX 7.0
END
@BOX 8.0
SELECT REGISTER
@BOX 1.1
PROC GETREG(PREF,PFROM,PTO);
@BOX 2.1
IF PREF/=-1 AND REGS&REGMASK[PREF]=0,
@BOX 3.1
PFROM=>PREF;
WHILE PREF=<PTO DO
@BOX 4.1
IF REGS&REGMASK[PREF]=0,
@BOX 5.1
1+>PREF;
OD;
@BOX 6.1
FAULT(0,%"CAN'T GET REG");
0=>GETREG;
OUTHEX(REGS,8);
OUTI(PFROM,1);
OUTI(PTO,1);
@BOX 7.1
END;
@BOX 8.1
PREF=>GETREG;
REGMASK[PREF]!>REGS;
REGMASK[PREF]!>RELREG;
@END
@TITLE MTL27.45(7,8)
@COL 1S-2T-3T-4R-5T-6F
@FLOW 1-2-3N-4-5-6
@FLOW 3Y-5
@BOX1.0
FLUSH POOL
@BOX2.0
FOR EACH POOL ITEM
@BOX3.0
IS IT UNUSED OR ALREADY PLANTED ?
@BOX4.0
ENSURE ITEM ON CORRECT BOUNDARY
PLANT POOL ITEM
RESOLVE FORWARD REFERENCES
@BOX5.0
OD
@BOX6.0
END
@BOX1.1
PROC FLUSHPOOL;
$IN TEMP,TEMP2;
IF TLPRM&%40/=0 THEN
 CAPTION(%"$LFLUSH POOL");
FI;
@BOX2.1
FOR TEMP<POOLSIZE DO
 SELECT POOL[TEMP];
@BOX3.1
IF NOOFUSES=0 OR ADDRFWDREF=NILFWDREF,
@BOX4.1
IF TLPRM&%40/=0 THEN
 OUTCH('$L);
 OUTI(TEMP,5);
 SPACES(1);
 OUTHEX(BYTE(LITFWDREF),8);
 SPACES(1);
 OUTHEX(BYTE(ADDRFWDREF),8);
FI;
IF LITSIZE-1&STOREI OF CODESEGP^=>TEMP2/=0 THEN
 LITSIZE-TEMP2+>STOREI OF CODESEGP^;
FI;
ASSLIT64(POOLLIT,LITSIZE,CODESEGP,STOREI OF CODESEGP^);
IF LITFWDREF/=NILFWDREF THEN
 ::ADDFWDREF(CODESEGP,STOREI OF CODESEGP^,0,LITFWDREF,0);
 ADDR FWDREFTYPE TEMPREF;
 LITFWDREF=>TEMPREF;
 LOOP: BEGIN
  SELECT TEMPREF^;
  IF %20(7)+TEMP=FWDADDRESS THEN
   CODESEGP=>FWDSTORE;
   STOREI OF CODESEGP^=>FWDADDRESS;
   NILFWDREF=>LITFWDREF;
  ELSE
   IF FRLINK=>TEMPREF/=LITFWDREF,->LOOP;
   FAULT(0,%"CAN'T FIND POOL REF IN FLUSHPOOL");
  FI;
 END;
FI;
PLANTFWDREF(RUNADDR(CODESEGP,-1)=>POOLADDR/LITSIZE,ADDRFWDREF);
NILFWDREF=>ADDRFWDREF;
LITSIZE+>STOREI OF CODESEGP^;
@BOX5.1
OD;
@BOX6.1
END;
@END
@TITLE MTL27.46(7,8)
@COL 1S-2T-4R-5F
@FLOW 1-2N-4-5
@FLOW 2Y-5
@BOX1.0
PLANT STRING SIZE (SIZE)
@BOX2.0
MS = SIZE ALREADY ?
@BOX4.0
PLANT MS = SIZE
AND PRESERVE OTHER BITS
@BOX5.0
END
@BOX1.1
PROC PLANTSTRINGSIZE(OPSIZE);
@BOX2.1
IF LASTMS=OPSIZE,
@BOX4.1
OPSIZE=>LASTMS;
PLANTV32CODE(%8500,OPSIZE-1!%F800);
@BOX5.1
END;
@END
@TITLE MTL27.47(7,8)
@COL 1S-2T-3R-4F
@COL 5R
@ROW 3-5
@FLOW 1-2N-3-4
@FLOW 2Y-5-4
@BOX 1.0
GET FWD REF : ^FWD REF
@BOX 2.0
IS FREE CHAIN EMPTY
@BOX 3.0
TAKE ITEM OFF FREE CHAIN
@BOX 4.0
END
@BOX 5.0
MAKE NEW ITEM
@BOX 1.1
PROC GETFWDREF; ::DEBUG TEST(42);
@BOX 2.1
IF FREEFWDREF=NILFWDREF,
@BOX 3.1
FREEFWDREF=>GETFWDREF;
FRLINK OF FREEFWDREF^=>FREEFWDREF;
@BOX 4.1
0=>FWDADDRESS OF GETFWDREF^;
NILSTORE=>FWDSTORE OF GETFWDREF^;
NILFWDREF=>FRLINK OF GETFWDREF^;
END;
@BOX 5.1
MAKE(FWDREFTYPE,0,FWDREFSPACE)=>GETFWDREF;
IF FWDREFSPACE-OLDFRFS>FWDREFSIZE THEN
 FAULT(0,%"FWDREFSPACE OVERFLOW ");
 OUTHEX(FWDREFSPACE-OLDFRFS,8);
 NEWLINES(1);
FI;
@END
@TITLE MTL27.48(7,8)
@COL 1S-2T-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-2Y-3Y-4-5
@FLOW 2N-5
@FLOW 3N-6-5
@BOX1.0
PLANT BM CONV (BM REG, FROM Z, FROM T, TO Z)
@BOX2.0
ALREADY >= CORRECT SIZE
@BOX3.0
LOGICAL
@BOX4.0
SIGN EXTEND
@BOX5.0
END
@BOX6.0
ZERO EXTEND
@BOX1.1
PROC PLANTBMCONV(BMREG,FZ,FT,TZ);
$IN TEMP;
BMREG<<-13=>BMREG;
@BOX2.1
IF FZ>=TZ,
@BOX3.1
IF FT=2,
@BOX4.1
8*>F.Z;
PLANTV16CODE(FZ-32&%3F!BMREG!%1C00):: BM<<-L
PLANTV16CODE(BMREG!%1C20-FZ):: BM->>A
@BOX5.1
END;
@BOX6.1
IF 8*FZ=>TEMP>=16<32 THEN
 PLANTV16CODE(TEMP-32&%3F!%1C00!BMREG):: BM<<-L
 PLANTV32CODE(BMREG!%1D00,%E0-TEMP):: BM->>L
ELSE
 PLANTCODE(BMREG!%800,1<<-TEMP-1):: BM & MASK
FI;
@END
@TITLE MTL27.49(7,8)
@COL 1S-2T-3R-4F
@FLOW 1-2Y-3-4
@FLOW 2N-4
@BOX1.0
CONVERT BM OP (^OP, SIZE, FROM TYPE)
@BOX2.0
LOGICAL OR ALREADY >= CORRECT SIZE
@BOX3.0
GET & LOAD BM REG
PLANT BM CONV TO SIZE
OP = BM REG
@BOX4.0
END
@BOX1.1
PROC CONVERTBMOP(OP,PSIZE,PTYPE);
SELECT OP^;
$IN BMREG;
DATAVEC BIT ($IN)
 %1 %80 %8000 %800000
END;
DATAVEC SXT ($IN)
 %FFFFFFFE %FFFFFF00 %FFFF0000 %FF000000
END;
IF PSIZE>4 THEN
 4=>PSIZE;
FI;
@BOX2.1
IF OPSIZE>=PSIZE OR PTYPE=2,
@BOX3.1
IF MU6GOP=%100 AND OPFWDREF=NILFWDREF THEN
 IF BIT[OPSIZE]&OPLIT/=0 THEN
  SXT[OPSIZE]!>OPLIT;
 FI;
ELSE
 PLANTLOAD(GETREG(%12,%11,%13)=>BMREG,OPSIZE,OP,0);
 PLANTBMCONV(BMREG,OPSIZE,PTYPE,PSIZE);
 CLEAROP(OP);
 BMREG&3!%100=>MU6GOP;
FI;
@BOX4.1
END;
@END
@TITLE MTL27.50(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ADD LIT 32 (VALUE,SIZE,ADDR,^STORE)
@BOX 2.0
FETCH ITEM
ADD VALUE
STORE ITEM
@BOX 3.0
END
@BOX 1.1
PROC ADDLIT32(VALUE,PSIZE,PADDR,PSTORE); ::DEBUG TEST(45);
$IN32 TEMP;
@BOX 2.1
GETLIT32(PSIZE,PADDR,PSTORE)+VALUE=>TEMP;
IF TLPRM&%C8/=0 THEN
 CAPTION(%"$LADD LIT ");
 OUTHEX(VALUE,8);
FI;
ASSLIT64(TEMP,PSIZE,PSTORE,PADDR);
@BOX 3.1
END;
@END
@TITLE MTL27.51(7,8)
@COL 1S-5R-6F
@FLOW 1-5-6
@BOX 1.0
UNDO OPTS (OPTIMISATIONS)
@BOX 5.0
%1: RESET STRING SIZE
@BOX 6.0
END
@BOX 1.1
PROC UNDOOPTS(OPTS); ::DEBUG TEST(46);
$IN TEMP;
@BOX 5.1
IF OPTS&%1/=0 THEN
 -1=>LASTMS;
FI;
@BOX 6.1
END;
@END
@TITLE MTL27.52(7,8)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1
GET LIT 32 (SIZE, ADDRESS, ^STORE)
@BOX2.0
FETCH ITEM
@BOX3.0
END
@BOX1.1
PROC GETLIT32(PSIZE,PADDR,PSTORE);
$IN32 TEMP;
$IN I;
SELECT STOREADDR OF PSTORE^;
@BOX2.1
0=>TEMP;
FOR I<PSIZE DO
 TEMP<<-8!STOREDESC^[PADDR+I]=>TEMP;
OD;
TEMP=>GETLIT32;
@BOX3.1
END;
@END
