@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             FTN021
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
~V2 -16
                                                                     ISSUE 11~
~V2 0
~V9 -1
~P
~V9 1
~YFTN021
~S1~M~LFORTRAN 77 COMPILER IMPLEMENTATION DESCRIPTION
~S1~M~LSection 2~
~S1~LSection 2. Statement Driver
~S1~L1.1 General Description
~BThis section contains the Fortran compiler procedure, which
drives the compilation. All initialisation is performed in this
section. One Fortran statement at a time is compiled
and this section
controls the processing performed on each statement. Basically procedures
from other sections are called to perform the lexical, syntax and
semantic processing for the statement itself. Also there can be additional
processing invoked whenever there is a change in context
between the previous statement and the current statement.
For example, on encountering the first executable statement of a
program unit, storage is allocated for any preceding specification
statement declarations.
~S1~L2. Interfaces
~S1~L2.1 Section Interfaces used~
~
   Section  1:   (Configuration Section)~
   Section  3:   (Lexical Analysis)~
   Section  4:   (Syntax)~
   Section  5:   (Specification Statement Processing)~
   Section  6:   (Specification Declarations)~
   Section  7:   (Assignment Statement Processing)~
   Section  8:   (Control Statement Processing)~
   Section  9:   (Input/Output Statement Processing)~
   Section 10:   (Program Unit Statement Process)~
   Section 11:   (Expression Evaluation)~
   Section 12:   (Property List Management)~
   Section 13:   (Fault Monitoring)~
   Section 14:   (Directive Processing)~
~S1~L2.2 Section interface
~
Exported Scalars:~
   STAT.AP.G~
   END.AP.G~
   MPU.PRESENT.G~
   EXEC.ST.CNT.G~
   CURRENT.LABEL.PTR.G~
   ABORT.COMPILE~
   PREV.STAT.NO~
~
Exported Vectors:~
   STAT.KIND~
~
Exported Procedures:~
   STATEMENT.DRIVER~
   PROCESS.STATEMENT~
   INIT.PU~
~
Library Procedures:~
   FORTRAN~
~S1~L3. Implementation
~S1~L3.1 Outline of Operation
~S1~LSTATEMENT.DRIVER()~
~BThis procedure drives the compilation process by calling the
appropriate lexical, syntactical and semantic procedures of the
other sections.
~BThe syntax analyser attempts recognition on three classes of
statements;~
~
   PROGRAM statement~
   PROGRAM UNIT HEADERS,~
   ASSIGNMENTS and~
   OTHERS (these include directives)~
~
The context of the previous statement determines the order
in which the above classes are checked.~
~BThe statement driver invokes the following processing for the
statement:~
~T# 5
~
1.~IStatement initialisation.~
2.~ILexical analysis.~
3.~ISyntax analysis.~
4.~ISemantic processing associated with the difference
between the expected context and the actual context
of a statement.~
5.~ISemantic processing associated with the context
of the statement, which includes declaring the
statement label if present.~
6.~ISemantic processing of statement.~
7.~IIf statement's label is a DO terminator
statement label, then process it.
Special action is needed when the
END IF statement is labelled.~
8.~IMonitor any lexical faults.~
~BThe driver uses the following 7 context levels to
control context processing.~
~
~Q 11
CONTEXT    NAME          STATEMENTS ALLOWED IN THIS CONTEXT~
   NO~
~
    0      PROGRAM       PROGRAM~
    1      PROGRAM HDR   FUNCTION,SUBROUTINE,BLOCKDATA~
    2      IMPLICIT      FORMAT,ENTRY,PARAM,IMPLICIT~
    3      SPECIFICATION FORMAT,ENTRY, specification statements~
    4      EXECUTABLE    FORMAT,ENTRY,DATA, executable statements~
    5      END           END~
    6      END COMPILE~
~BFor each statement 8 bits of context information
are encoded as follows:~
~T# 15
~
   Bits 0->2~IMinimum of context range.~
   Bits 4->6~IMaximum of context range.~
   Bit 3~IIf statement is a Fortran executable statement.~
   Bit 7~IIf statement is permitted in a Block
Data subprogram~
~BBefore a statement is compiled its expected context is
derived from the previous statement. If the expected context
of a statement is not between the limits of its
context range, then any processing concerned with the
difference between expected context and the minimum context
permitted for this statement is executed.
~S1~LPROCESS.STATEMENT(STATEMENT.NO)
~BAfter a statement has been read in, lexically and syntactically
analysed, this procedure is invoked to carry out the sementic
processing. This procedure is also used for the semantic processing
of the conditional statement of the LOGICAL IF statement.
~S1~LINIT.PU()
~BInitialises a program unit.
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                FTN021
~V9 -1
~F
@TITLE FTN02(1,11)
@COL 1S-2R-4R-5R-7R-9F
@FLOW 1-2-4-5-7-9
@BOX 1.0
STATEMENT DRIVER SECTION
@BOX 2.0
[IMPORTS FTN02/1]
[ PROCEDURE IMPORTS FTN02/2]
MODULE HEADING
@BOX 4.0
LITERAL DECLARATIONS
@BOX 5.0
SCALAR DECLARATIONS
@BOX 7.0
PROCEDURES IN MODULE
   INPUT ROUTINES:2.0:
   FORTRAN:2.1:
   STATEMENT.DRIVER:2.2:
   PROCESS.STATEMENT:2.3:
   INIT.PU:2.4:
   INIT.MPU:2.5:
@BOX 9.0
END
@BOX 2.1
#FTN02/1
#FTN02/2
;MODULE (STAT.AP.G,END.AP.G,MPU.PRESENT.G,EXEC.ST.CNT.G,STAT.KIND,
   ABORT.COMPILE,STATEMENT.DRIVER,PROCESS.STATEMENT,INIT.PU,fORtRAn,
   GET.INCH,GET.NEXT.CH,MON.STR,STAT.KIND.Z.L,RESTART.COMPILE,
   CURRENT.LABEL.PTR.G,STAT.NO,INIT.MPU);
@BOX 4.1
; *GLOBAL 7
;LITERAL STAT.KIND.Z.L=56
;DATAVEC STAT.KIND($LO8)
%FF  %B3  %B3  %B3
%B3  %33  %24  %CC
%C4  %DD  %4C  %4C
%4C  %4C  %CC  %4C
%4C  %4C  %4C  %4C
%4C  %4C  %4C  %11
%11  %11  %FF  %FF
%4C  %FF  %33  %A2
%B3  %A3  %44  %01
%CC  %CC  %CC  %CC
%4C  %4C  %4C  %80
%80  %80  %80  %80
%00  %80  %80  %80
%80  %80  %80  %80
END
::STAT.KIND IS INDEXED BY STAT.NO
::BITS 0-2 GIVE MAX CONTEXT LEVEL
::BITS 4-6 GIVE MIN CONTEXT LEVEL
::BIT 3=1 EXECUTABLE STATEMENT
::   FOR EXECUTABLE STATEMENT
::      BIT 7=1 MEANS INVALID IN A LOGICAL IF
::   FOR A NON-EXECUTABLE STATEMENT
::      BIT 7=1 MEANS VALID IN A BLOCK DATA
@BOX 5.1
; *GLOBAL 2
;$IN STAT.AP.G, END.AP.G, MPU.PRESENT.G
;$IN MON.STR,EXEC.ST.CNT.G,STAT.NO
;ADDR LABEL.PROP CURRENT.LABEL.PTR.G
; LABEL ABORT.COMPILE,RESTART.COMPILE
; LABEL EOF.RESTART
; $IN CHECK.IN, ERROR.LIMIT
; *GLOBAL 0
@BOX 7.1
;P.SPEC GET.NEXT.CH()/$IN
;P.SPEC GET.INCH()/$IN
;L.SPEC FORTRAN(ADDR [$LO8],ADDR [$LO8],ADDR [$LO8],$IN)
;P.SPEC STATEMENT.DRIVER()
;P.SPEC PROCESS.STATEMENT($IN)
;P.SPEC INIT.PU()
;P.SPEC INIT.MPU()
#FTN02.0
#FTN02.1
#FTN02.2
#FTN02.3
#FTN02.4
#FTN02.5
@BOX 9.1
*END
@END
@TITLE FTN02/1(1,11)
@COL 1S-2R-3R-4R-5R-7F
@FLOW 1-2-3-4-5-7
@BOX 1.0
DRIVER IMPORTS
@BOX 2.0
IMPORTED TYPES
@BOX 3.0
IMPORTED LITERALS
@BOX 4.0
IMPORTED SCALARS
@BOX 5.0
IMPORTED VECTORS
@BOX 7.0
END
@BOX 2.1
;IMPORT TYPE LOCAL.PROP,COMMON.PROP,
             LABEL.PROP,DATA.LIST,CONST.PROP,
             FORMAT.LIST,ENTRY.LIST
;TYPE NAME.T IS ADDR [$LO8] NAME
;TYPE GLOBAL.PROP IS
       ADDR GLOBAL.PROP G.NEXT.P
       NAME.T G.NAME
       $LO8 G.KIND
       $LO16 G.TL.NAME
       ADDR [$LO8] G.ARG.SPEC.P
;TYPE PROPS IS
      $IN32 INT OR
      ADDR ADDRESS OR
      ADDR LOCAL.PROP LOC OR
      ADDR GLOBAL.PROP GLOB OR
      ADDR COMMON.PROP COM OR
      ADDR CONST.PROP CONST
@BOX 3.1
;IMPORT LITERAL $IN32 DATA.SEG.Z
;IMPORT LITERAL DATA.SEG, NO.DATA.SEGS
;IMPORT LITERAL $LO32 MAX.SEG.Z.L
;IMPORT LITERAL LINE.SPACE,C.COMP.ACC.T.L,FMT.TABLE.PTR.TYPE.L,
      MAX.SPECS.L,LINE.SZ.L,ACC.Z.Z.L,ERROR.CLASS.L,NO.OF.TRAPS,MAX.ERROR.L,
      AS.Z.L,PROPS.Z.L
;IMPORT LITERAL $LO32 DEFAULT.INFORM.LINE.L,TL.DEBUG.BIT.L,TL.LIBRARY.BIT.L,
      SYNTAX.CHECK.BIT.L,ON.STACK.BIT.L,CLI.BIT.L,LIST.BIT.L,
      NO.ARG.CHECK.BIT.L,DEFAULT.TL.PRINT.L,LONGNAMES.BIT.L,HOLLERITHS.BIT.L,
      OLD.PARAM.BIT.L,ALT.DA.BIT.L,EN.DE.CODE.BIT.L,HEX.OCTAL.BIT.L,
      RECURSION.BIT.L,LOOP66.BIT.L,EXTRA.CHARS.BIT.L,EXTRA.TYPES.BIT.L,
      NOTL.BIT.L,NOTL.END.BIT.L,DEFAULT.ANSI.BITS.L,COMMON.SIZE.BIT.L,
      MIX.CHAR.BIT.L,INIT.DECL.BIT.L,INIT.COMMON.BIT.L,EX.RANGE.BIT.L,QUOTE.HOLL
.BIT.L

; IMPORT LITERAL $LO8 EOF.L,SPACE.L,NL.L
; IMPORT LITERAL  FIO.INIT.RUN, CREATE.SEG, NO.FIO.PROCS.L
@BOX 4.1
;$IN I.ACC.Z.G,L.ACC.Z.G,IND.ACC.Z.G,VAL.ARG.Z.G
;$LO8 ASSIGN.FL.G,PU.G,OPEN.DEFAULT.VAL.G
;$IN PROPS.I,AMBIG.PARAM.G,DONE.DECLARATIONS
;$IN FSS, MIN.IND.Z.G, MIN.INTR.Z.G
;$IN32 CURRENT.LABEL.G
;$IN32 CUR.LIN.PAG.G,NEXT.ST.LABEL.G
;$LO8 LABEL.FAULTY.G,JUMPED.G,U.N.B.D.G
;$IN A.AP.G,B.AP.G,T.AP.G,CUR.A.TYPE.G
;ADDR ENTRY.LIST ENTRY.LIST.ROOT
;ADDR FORMAT.LIST FORMAT.LIST.ROOT
; ADDR DATA.LIST DATA.LIST.ROOT
; ADDR LOCAL.PROP LOCAL.LIST.HD.G,LOCAL.LIST.ST.G
; $IN DATA.ST.CNT.G,DO.PTR.G,RW.ARR.CNT.VAR.G,PSPEC.CNT
; $IN CUR.NEST.LEV.G,CUR.BLOCK.NO.G,ALL.SAVE.G
; $LO16 FMT.DICT.NAME.G,ASS.GOTO.LOOP.NAME.G,
     ASS.GOTO.VEC.NAME.G,TL.ZERO.G,TL.ONE.G,PSPECN.G
; ADDR COMMON.PROP COM.LIST.G
; ADDR GLOBAL.PROP G.CUR.PU
; $LO32 INFORM.LINE.G,ANSI.BITS.G
;$LO16 DEBUG.PU.G,DEBUG.LINE.G
;$IN32 F.I.G
; $IN LEX.FAULT.G
; $IN MUTLN.G,MUTL.SEG.N.G,MUTL.DA.N.G,FMT.DICT.TYPE.G,EXIT.PROG.LABEL.N.G,FMT.T
BL.SZ.G
@BOX 5.1
; $IN16 [NO.FIO.PROCS.L] RW.PROCS
; PROPS [PROPS.Z.L] PROPS.T
; $IN [AS.Z.L] AS
; $LO8[ACC.Z.Z.L] ACC.Z.G,ACC.Z.L
; $LO8[7] PR.DV, PR.T
; $LO8[5] F.PR.DV, F.PR.T
; $IN [ERROR.CLASS.L] ERROR.CNT.G
; $IN [26] IMPLICIT.LEN.G
; $LO8 [26] IMPLICIT.G
; ADDR[3] SEG.Z.TBL
; $IN [3] SEG.TBL
; $LO16 [3] AREA.TBL
; $LO8[32] SEG.INFO
; $LO8[32] CODE.AREA.NO
; $LO8[LINE.SZ.L] LINE.G
@END
@TITLE FTN02/2(1,11)
@COL 6S
@FLOW 6
@BOX 6.0
IMPORTED PROCEDURES
@BOX 6.1
;P.SPEC LEXICAL()
;P.SPEC SYNTAX.CHECK($IN,$IN)/$IN
;P.SPEC FTYPE()
;P.SPEC DIMENSION()
;P.SPEC EXTERNAL()
;P.SPEC INTRINSIC()
;P.SPEC COMMON()
;P.SPEC EQUIVALENCE()
;P.SPEC PARAMETER()
;P.SPEC SAVE()
;P.SPEC IMPLICIT()
;P.SPEC ANAL.SPECS()
;P.SPEC ASSIGNMENT()
;P.SPEC LABEL.ASSIGNMENT()
;P.SPEC DATA()
;P.SPEC GOTO()
;P.SPEC COMP.GOTO()
;P.SPEC ASS.GOTO()
;P.SPEC ARITH.IF()
;P.SPEC LOG.IF()
;P.SPEC BLOCK.IF()
;P.SPEC ELSE.IF()
;P.SPEC F.ELSE()
;P.SPEC END.IF()
;P.SPEC F.DO()
;P.SPEC F.CONTINUE()
;P.SPEC F.STOPAUSE($IN)
;P.SPEC F.END()
;P.SPEC CALL()
;P.SPEC RETURN()
;P.SPEC PROCESS.STAT.LABEL($IN,ADDR LABEL.PROP)
;P.SPEC DO.LABEL($LO24)
;P.SPEC FORMAT()
;P.SPEC FILE.POSITION()
;P.SPEC OPEN()
;P.SPEC CLOSE()
;P.SPEC INQUIRE()
;P.SPEC READ.WRITE.PRINT()
;P.SPEC PROGRAM()
;P.SPEC SUBORFN()
;P.SPEC BLOCK.DATA()
;P.SPEC ENTRY()
;P.SPEC FAULT($IN,$IN)
;P.SPEC PRINT.CLASS.MESS($IN)
;P.SPEC MONITOR($IN)
;P.SPEC ADD.S.NAME($LO24)/ADDR LABEL.PROP
;P.SPEC END.DIRECTIVE()
;P.SPEC MAP.DIRECTIVE()
;P.SPEC EXPORT.DIRECTIVE()
;P.SPEC IMPORT.DIRECTIVE()
;P.SPEC LIB.DIRECTIVE()
;P.SPEC SHORT.INT()
;P.SPEC MAP.COMMON()
;P.SPEC RESET.SPACE($IN)
;P.SPEC INIT.12()
;L.SPEC CAPTION(ADDR[$LO8])
;L.SPEC OUTI($IN32,$IN)
;L.SPEC NEWLINES($IN)
;L.SPEC SPACES($IN)
;L.SPEC OUT.CH($IN)
;L.SPEC OUT.TIME()
;L.SPEC OUT.DATE()
;L.SPEC CURRENT.OUTPUT()/$IN
;L.SPEC CURRENT.INPUT()/$IN
;L.SPEC SELECT.OUTPUT($IN)
;L.SPEC SELECT.INPUT($IN)
;L.SPEC DEFINE.INPUT($IN,ADDR[$LO8],$IN32)/$IN
;L.SPEC END.INPUT($IN,$IN)
;LSPEC CREATE.SEGMENT($IN,ADDR);
;LSPEC RELEASE.SEGMENT($IN)
::MC68000-OBJ ;LSPEC MAP($IN,$IN,$IN)
;L.SPEC INCH()/$IN
;L.SPEC NEXT.CH()/$IN
;L.SPEC IN.BACKSPACE($IN)
;L.SPEC TL($IN,ADDR[$LO8],$IN)
;L.SPEC TL.LINE($IN32)/$IN
;L.SPEC TL.MODULE()
;L.SPEC TL.SEG($IN,ADDR,$LO32,ADDR,$IN)
;L.SPEC TL.LOAD($IN,$IN)
;L.SPEC TL.PRINT($IN)
::CV;L.SPEC TL.MOD.NAME (ADDR [LOGICAL8])
::CV;L.SPEC TL.LANG (LOGICAL64)
;P.SPEC PL.STK.LB($LO8,$IN)
;L.SPEC TL.C.LIT.16($IN,$IN16)
;L.SPEC TL.PL($IN,$IN)
;L.SPEC TL.TYPE(ADDR[$LO8],$IN)
;L.SPEC TL.TYPE.COMP($IN,ADDR,ADDR[$LO8])
;L.SPEC TL.END.TYPE($IN)
;L.SPEC TL.LIT(ADDR[$LO8],$IN)
;L.SPEC TL.LABEL.SPEC(ADDR[$LO8],$IN)
;L.SPEC TL.S.DECL(ADDR[$LO8],$IN,ADDR)
;L.SPEC TL.PROC.SPEC(ADDR[$LO8],$IN)
;LSPEC OUT.FN(ADDR[$LO8])
;L.SPEC TL.END.MODULE($IN)
;L.SPEC TL.END()
;L.SPEC ENTER.TRAP($IN,$IN)
;L.SPEC FIND.N(ADDR [$LO8], INTEGER)/LOGICAL32
::CV ;P.SPEC FIND.N(ADDR[$LO8],INTEGER)/LOGICAL
@END
@TITLE FTN02.0(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INPUT ROUTINES
@BOX 2.0
GET.INCH
@BOX 3.0
GET.NEXTCH
@BOX 4.0
END
@BOX 2.1
;PROC GET.INCH
; -> START
; EOF.POINT: EOF.L => GET.INCH
;    -> FIN
;START: EOF.POINT => EOF.RESTART ;
     ; 1 => CHECK.IN
     ; INCH() => GET.INCH
;FIN:  0 => CHECK.IN
;END
@BOX 3.1
;PROC GET.NEXTCH
;GET.INCH () => GET.NEXT.CH
; IN.BACKSPACE (1)
;END
@END
@TITLE FTN02.1(1,11)
@COL 1S-11R-14R-7R-8R-9R-10R-3F
@FLOW 1-11-14-7-8-9-10-3
@BOX 1.0
FORTRAN(INPUT.FILE,OUTPUT.FILE,MODE,LIBRARY)
@BOX 11.0
CREATE DATA SEGMENTS
@BOX 7.0
PRINT OUT IDENTIFICATION
@BOX 8.0
SAVE CURRENT OUTPUT
SAVE CURRENT INPUT
SELECT COMPILER INPUT
@BOX 14.0
INITIALISE COMPILER
INTERPRET MODE PARAMETER
INITIALISE MUTL
@BOX 9.0
COMPILE PROGRAM:2.2:
@BOX 10.0
OUTPUT ERROR SUMMARY
END CODE GENERATION
RELEASE DATA SEGMENTS
RESELECT ORIGINAL OUTPUT
RESELECT ORIGINAL INPUT
RELEASE COMPILER INPUT
@BOX 3.0
END
@BOX 1.1
;PROC FORTRAN(IFI,OFI,MODE,DZ)
;$IN OI,CI,I,Z,TL.PRINT.ARG
;LITERAL/ADDR [$LO8] NILL =
; -> SKIP; ABORT: -> END.IT; SKIP:
::CV#FTN02.1.0CV
#FTN02.1.0
@BOX 7.1
;OUT.FN(%"$L MUSS.11 FORTRAN AUG.83")
;IF IFI /= NILL THEN
    CAPTION(%" Compiling ")
   ;CAPTION(IFI) FI
;NEWLINES(2)
@BOX 8.1
;CURRENT.INPUT() => OI
;SELECT.INPUT(DEFINE.INPUT(-1,IFI,0)=>CI)
; 0 => CHECK.IN
; SET.UP.TRAPS ()
@BOX 14.1
; MAX.ERROR.L => ERROR.LIMIT
; DEFAULT.TL.PRINT.L => TL.PRINT.ARG
; DEFAULT.INFORM.LINE.L => INFORM.LINE.G
; DEFAULT.ANSI.BITS.L => ANSI.BITS.G
; 0=>MPU.PRESENT.G => UNBDG => DONE.DECLARATIONS
; 5 =>PU.G
; 0 => DEBUG.LINE.G=> FMT.TBL.SZ.G=>JUMPED.G
; 0 => LEX.FAULT.G => DEBUG.PU.G
; %C => OPEN.DEFAULT.VAL.G
;FOR I < ERROR.CLASS.L DO 0 => ERROR.CNT.G[I] OD
;FOR I < 7 DO
   ;PR.DV[I] => PR.T[I]
   ;IF I < 5 THEN F.PR.DV[I] => F.PR.T[I] FI
;OD
; INIT.12()
; -1 => NEXT.ST.LABEL.G
; 1 => DO.PTR.G
;0=> SEG.Z.TBL[1]
  => SEG.Z.TBL[0]
; 1 => MUTL.SEG.N.G
;2 => MUTL.DA.N.G
; 3 => SEG.INFO[0]
; 3 => SEG.INFO[1]
; 1 => SEG.TBL[0]
; 2 => AREA.TBL [0]
; 1 => CODE.AREA.NO[0]
;  0 => SEG.TBL[2]
;FOR I < ACC.Z.Z.L DO ACC.Z.L[I] => ACC.Z.G[I] OD
;ACC.Z.L[3] => I.ACC.Z.G
;ACC.Z.L[4] => L.ACC.Z.G
;ACC.Z.L[6] => IND.ACC.Z.G
;ACC.Z.L[7] => VAL.ARG.Z.G
;ACC.Z.L[8] => MIN.IND.Z.G
;ACC.Z.L[9] => MIN.INTR.Z.G
#FTN02.1.1
;IF INFORM.LINE.G & NOTL.BIT.L = 0 THEN
    TL(INFORM.LINE.G&%FF,OFI,DZ) FI
;TL.PRINT(TL.PRINT.ARG)
;TL.LOAD(1,2)
::PDP-OBJ ;TL.SEG(%2000,%212000,61,NILL)
::PDP-OBJ ;TL.LOAD(0,1)
;TL.MODULE()
::CV;TL.LANG("FORT")
::CV;TL.MOD.NAME(%"$$MAIN")
#FTN02.1.2
@BOX 9.1
;STATEMENT.DRIVER()
; END.IT:
@BOX 10.1
;SELECT.OUTPUT(MON.STR)
; FOR I < ERROR.CLASS.L DO
     IF ERROR.CNT.G[I] => Z /= 0 THEN
        OUTI(Z,4)
      ; PRINT.CLASS.MESS(I)
      ; CAPTION(%"MESSAGE(S) ISSUED DURING COMPILATION")
      ; NEWLINES(1)
     FI
   OD
; TL.END.MODULE (ERROR.CNT.G[0]+ERROR.CNT.G[ERROR.CLASS.L-1])
; IF INFORM.LINE.G & NOTL.END.BIT.L = 0 THEN TL.END () FI
; SET.DOWN.TRAPS ()
; FOR I < NO.DATA.SEGS DO
   ; RELEASE.SEGMENT(DATA.SEG + I)
; OD
;SELECT.INPUT(OI)
;END.INPUT(CI,0)
; IF IFI /= NILL THEN
     CAPTION (%"Compilation of ")
    ;CAPTION(IFI) FI
;OUT.FN(%" FINISHED");NEWLINES(1)
@BOX 11.1
; 0 => OI
;IF FINDN(%"TL",0) = 0 THEN
  CAPTION(%" **WARNING** The Code Generator MUTL is not loaded$L")
  ; 1 => OI FI
;IF FINDN(%"FIO.C.FORMAT",0) = 0 THEN
  CAPTION(%" **WARNING** The Fortran I/O Library FIO is not loaded$L")
  ; 1 => OI FI
;IF FINDN(%"EXP",0) = 0 THEN
  CAPTION(%" **WARNING** The Maths Functions Library is not Loaded$L")
  ; 1 => OI FI
;IF OI /= 0 THEN EXIT FI
;FOR I < NO.DATA.SEGS DO
   ;RELEASE.SEGMENT(DATA.SEG + I)
;OD
; CREATE.SEGMENT(DATA.SEG, DATA.SEG.Z)
;ABORT => ABORT.COMPILE => RESTART.COMPILE
;CURRENT.OUTPUT() => MON.STR
@BOX 3.1
;END
@END
@TITLE FTN02.1.0(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
TRAP HANDLING SECTION
@BOX 2.0
DECLARATIONS
@BOX 3.0
SET UP TRAPS
@BOX 4.0
SET DOWN TRAPS
@BOX 5.0
TRAP HANDLER
@BOX 6.0
END
@BOX 1.1
::BEGIN
@BOX 2.1
; *GLOBAL 2
; $IN [NO.OF.TRAPS] OLD.STATUS
; ADDR ENTER.TRAP [NO.OF.TRAPS] OLD.TRAP
; *GLOBAL 0
;P.SPEC FTN.TRAP($IN,$IN)
;P.SPEC SET.UP.TRAPS()
;P.SPEC SET.DOWN.TRAPS()
@BOX 3.1
;PROC SET.UP.TRAPS
; $IN I
;FOR I < NO.OF.TRAPS DO
     READ.RECOVERY.STATUS (I) => OLD.STATUS [I]
    ;READ.TRAP (I) => OLD.TRAP [I]
    ;SET.RECOVERY.STATUS (I,0)
    ;SET.TRAP (I, ^FTN.TRAP)
 OD
 END
@BOX 4.1
;PROC SET.DOWN.TRAPS
; $IN I
; FOR I < NO.OF.TRAPS DO
     SET.RECOVERY.STATUS (I,OLD.STATUS[I])
    ;SET.TRAP (I,OLD.TRAP[I])
  OD
 END
@BOX 5.1
;PROC FTN.TRAP (CLASS,CODE)
;IF CHECK.IN /= 0 AND CLASS /= 3 THEN -> EOF.RESTART
;ELSE
 SELECT.OUTPUT(0)
    ; FAULT (-1,0)
    ; CAPTION (%" Sorry, but the FORTRAN compilation ")
    ; IF PU.G = 3 OR PU.G = 2 THEN
         IF PU.G = 3 THEN CAPTION (%"of FUNCTION ")
                     ELSE CAPTION (%"of SUBROUTINE ") FI
       ; CAPTION(NAME OF G.NAME OF G.CUR.PU^)
       ; CAPTION (%"$L   ")
      FI
    ; CAPTION(%"has aborted at the above line because of:$L")
    ; SET.DOWN.TRAPS()
    ; ENTER.TRAP (CLASS,CODE)
;FI
END
@BOX 6.1
::END
@END
@TITLE FTN02.1.0CV(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
TRAP HANDLING SECTION
@BOX 2.0
DECLARATIONS
@BOX 3.0
SET UP TRAPS
@BOX 4.0
SET DOWN TRAPS
@BOX 5.0
TRAP HANDLER
@BOX 6.0
END
@BOX 1.1
::BEGIN
@BOX 2.1
;P.SPEC FTN.TRAP(ADDR[$LO8],ADDR $IN,ADDR $IN)/$IN
;P.SPEC SET.UP.TRAPS()
;P.SPEC SET.DOWN.TRAPS()
@BOX 3.1
;PROC SET.UP.TRAPS
 ;SET.TRAP.PROC(^FTN.TRAP)
 END
@BOX 4.1
;PROC SET.DOWN.TRAPS
 END
@BOX 5.1
;PROC FTN.TRAP (LIBID,CLASS,CODE)
;ADDR LOGICAL64 TEMPLIB
;LITERAL/LOGICAL64 CVMOSLIB = "CVMOSLIB"
;MAKE($LO64,0,BYTE(LIBID)) => TEMPLIB;
;IF CHECK.IN /= 0 AND [CLASS^ /= 3 OR TEMPLIB^ /= CVMOSLIB]
    THEN -> EOF.RESTART
;ELSE
 SELECT.OUTPUT(0)
    ; FAULT (-1,0)
    ; CAPTION (%" Sorry, but the FORTRAN compilation ")
    ; IF PU.G = 3 OR PU.G = 2 THEN
         IF PU.G = 3 THEN CAPTION (%"of FUNCTION ")
                     ELSE CAPTION (%"of SUBROUTINE ") FI
       ; CAPTION(NAME OF G.NAME OF G.CUR.PU^)
       ; CAPTION (%"$L   ")
      FI
    ; CAPTION(%"has aborted at the above line because of:$L")
;FI
;0 => FTN.TRAP
END
@BOX 6.1
::END
@END
@TITLE FTN02.1.1(1,11)
@COL 1S-8T-2R-3T-4R-5F
@COL 6R-7C
@ROW 4-6
@FLOW 1-8N-2-3N-4-5
@FLOW 3Y-6-7
@FLOAOW 8Y-5
@BOX 1.0
INTERPRET MODE PARAMETER
@BOX 2.0
COPY MODE TO LINE BUFFER
SKIPING SPACES
@BOX 3.0
INVALID OPTION?
@BOX 4.0
INTERPRET OPTIONS GIVEN
@BOX 5.0
END
@BOX 6.0
GIVE ERROR MESSAGE
@BOX 7.0
EXIT COMPILER
@BOX 8.0
IS THE MODE PARAM EMPTY?
@BOX 1.1
:: INTERPRET MODE PARAMETER
;BEGIN
;$IN SS,AP,OPTION
;$LO8 CH
;ADDR [$LO8] STRING
;ADDR PLACE
@BOX 2.1
;-1 => SS
;FOR I < SIZE(MODE) DO
     IF MODE^[I]=>CH /= SPACE.L THEN CH => LINE.G[1+>SS] FI OD
;NL.L => LINE.G[1+>SS]
@BOX 3.1
;IF SYNTAX.CHECK(0,5) < 0
@BOX 4.1
;STAT.AP.G => AP
;WHILE AS[AP] => OPTION >= 0 DO
    INT OF PROPS.T[AS[OPTION+1]] => SS
  ; ALTERNATIVE AS[OPTION] FROM
       BEGIN
           ;CAPTION(%" **WARNING** Using the old form of options parameter$L")
           ;CAPTION(%"             Please change at your convenience$L")
           ;IF SS & %8000 /= 0 THEN CLI.BIT.L -=> INFORM.LINE.G FI
           ;IF SS & %4000 /= 0 THEN NO.ARG.CHECK.BIT.L -=> ANSI.BITS.G FI
           ;IF SS & %2000 /= 0 THEN LIST.BIT.L -=> INFORM.LINE.G FI
           ;IF SS & %100  /= 0 THEN ON.STACK.BIT.L -=> INFORM.LINE.G FI
           ;IF SS & %80   /= 0 THEN SYNTAX.CHECK.BIT.L -=> INFORM.LINE.G FI
           ;IF SS & %20 /= 0 THEN 2 => I.ACC.Z.G => L.ACC.Z.G => ACC.Z.G[3] => A
CC.Z.G[4] FI
           ;IF SS & %10 /= 0 THEN SHORT.INT() FI
           ;IF SS &  4    /= 0 THEN TL.LIBRARY.BIT.L -=> INFORM.LINE.G FI
           ;IF SS &  1    /= 0 THEN TL.DEBUG.BIT.L -=> INFORM.LINE.G FI
           ; SS ->> 16 -=> TL.PRINT.ARG
           ; %FFFFE085 -= -1 &> SS -=> INFORM.LINE.G ::Just bang other bits in
       END
     ; BEGIN IF SS > %FF THEN
                CAPTION(%" **WARNING** TL argument too long, truncated$L")
               ;%FF &> SS
             FI
            ;SS !> INFORM.LINE.G
       END
     ; SS !> TL.PRINT.ARG
     ; TL.DEBUG.BIT.L !> INFORM.LINE.G
     ; TL.DEBUG.BIT.L -= -1 &> INFORM.LINE.G
     ; TL.LIBRARY.BIT.L !> INFORM.LINE.G
     ; SYNTAX.CHECK.BIT.L !> INFORM.LINE.G
     ; NO.ARG.CHECK.BIT.L !> ANSI.BITS.G
     ; ON.STACK.BIT.L !> INFORM.LINE.G
     ; CLI.BIT.L -= -1 &> INFORM.LINE.G
     ; CLI.BIT.L !> INFORM.LINE.G
     ; LIST.BIT.L !> INFORM.LINE.G
     ; LIST.BIT.L -= -1 &> INFORM.LINE.G
     ; SHORT.INT ()
     ; 2 => I.ACC.Z.G => ACC.Z.G[3]
     ; SS => OPEN.DEFAULT.VAL.G
     ; LONG.NAMES.BIT.L !> ANSI.BITS.G
     ; NOTL.END.BIT.L !> INFORM.LINE.G
     ; NOTL.BIT.L !> INFORM.LINE.G
     ; HOLLERITHS.BIT.L !> ANSI.BITS.G
     ; OLD.PARAM.BIT.L !> ANSI.BITS.G
     ; ALT.DA.BIT.L !> ANSI.BITS.G
     ; EN.DE.CODE.BIT.L !> ANSI.BITS.G
     ; HEX.OCTAL.BIT.L !> ANSI.BITS.G
     ; RECURSION.BIT.L !> ANSI.BITS.G
     ; LOOP66.BIT.L -= -1 &> INFORM.LINE.G
     ; LOOP66.BIT.L !> INFORM.LINE.G
     ; EXTRA.CHARS.BIT.L !> ANSI.BITS.G
     ; EXTRA.TYPES.BIT.L !> ANSI.BITS.G
     ; DEFAULT.ANSI.BITS.L ! EXTRA.TYPES.BIT.L => ANSI.BITS.G
     ; %3FFFFFFF => ANSI.BITS.G
     ; EX.RANGE.BIT.L !> ANSI.BITS.G
     ; COMMON.SIZE.BIT.L !> ANSI.BITS.G
     ; MIX.CHAR.BIT.L !> ANSI.BITS.G
     ; INIT.DECL.BIT.L !> ANSI.BITS.G
     ; INIT.COMMON.BIT.L !> ANSI.BITS.G
     ; QUOTE.HOLL.BIT.L !> ANSI.BITS.G
     ; SS => ERROR.LIMIT
     ; BEGIN CAPTION(%" **WARNING** Unrecognised option ")
           ; ADDRESS OF PROPS.T[AS[OPTION+1]] => PLACE
           ; MAKE($LO8,4095,PLACE) => STRING
           ; -1 => I
           ; WHILE STRING^[1+>I] => CH /= ', /= NL.L
                 DO OUT.CH(CH) OD
           ; CAPTION(%" ignored$L")
       END
    END
   ;1+>AP
 OD
@BOX 5.1
;END
@BOX 6.1
;CAPTION(%" ***ERROR*** Invalid format for options parameter: ")
;CAPTION(MODE)
;NEWLINES(1)
@BOX 7.1
; EXIT
@BOX 8.1
; IF MODE = NILL
@END
@TITLE FTN02.1.2(1,11)
@COL 1S-9R-3R-10R-12R-14R-40F
@FLOW 1-9-3-10-12-14-40
@BOX 1.0
PROGRAM INITIALISATION
@BOX 40.0
END
@BOX 3.0
INIT MUTL NAMES FOR
LITERALS ZERO AND ONE
@BOX 9.0
CREATE TYPE FOR COMPLEX MUTL NAME 2
@BOX 10.0
SAVE NEXT MUTL NAME
@BOX 12.0
DECLARE TYPE FOR FORMAT DICTIONARY
@BOX 14.0
SET PSPEC VARIABLES
@BOX 1.1
;BEGIN
;LITERAL/ADDR [$LO8] NIL.STR=
@BOX 40.1
;END
@BOX 3.1
;TL.C.LIT.16(%80,0)
;TL.LIT(NIL.STR,0)
;TL.C.LIT.16(%80,1)
;TL.LIT(NIL.STR,0)
;3 => TL.ZERO.G
  +1 => TL.ONE.G
@BOX 9.1
;TL.TYPE(NIL.STR,0)
;TL.TYPE.COMP(C.COMP.ACC.T.L,2,NIL.STR)
;TL.END.TYPE(0)
@BOX 10.1
;5 => MUTL.N.G
@BOX 12.1
;TL.TYPE(NIL.STR,0)
;TL.TYPE.COMP(%84,0,NIL.STR)
;TL.TYPE.COMP(FMT.TABLE.PTR.TYPE.L,0,NIL.STR)
;TL.TYPE.COMP(%83,0,NIL.STR)
;TL.END.TYPE(0)
; MUTLN.G + 64 * 4 => FMT.DICT.TYPE.G
; 1 +> MUTLN.G
@BOX 14.1
;TL.LABEL.SPEC (NIL.STR,3)
;MUTL.N.G => EXIT.PROG.LABEL.N.G + 1 => MUTL.N.G
; 0 => PSPEC.CNT => PSPECN.G
@END
@TITLE FTN02.2(1,11)
@COL 1S-3R-40T-4R-5R-24T-25T-31T-32T-6T-7R-8T-9R-30R-10R-2R-11R-19T-20F-13R-18N
@COL 41C-14R-15R-16T-17R-21T-22R-23R
@ROW 7-14
@ROW 30-15
@ROW 41-5
@FLOW 1-3-40N-4-5-24N-25N-31N-32N-6NO-7-8NO-9-30-10-2-11-19Y-13-18-40
@FLOW 25Y-10
@FLOW 24Y-31Y-6YES-14-8
@FLOW 32Y-9
@FLOW 8YES-15-16NO-17-21N-22-13-18
@FLOW 21Y-23-18
@FLOW 16YES-8
@FLOW 19N-20
@FLOW 40Y-41
@BOX 1.0
STATEMENT DRIVER
@BOX 2.0
OUTPUT OUSTANDING LEXICAL FAULTS
@BOX 3.0
SET EXPECTED CONTEXT TO
PROGRAM HEADER STATEMENT
@BOX 4.0
STATEMENT
INITIALISATION:2.2.3:
@BOX 5.0
LEXICAL ANALYSE
STATEMENT:3
@BOX 24.0
STATEMENT NOT POSSIBLE DIRECTIVE?
@BOX 25.0
SYNTAX ANALYSIS OF DIRECTIVE OK?
@BOX 6.0
IS STAT A
POSSIBLE ASSIGNMENT?
@BOX 7.0
SET SYNTAX
LEVEL
@BOX 8.0
SYNTAX ANALYSE A STATEMENT:4.1
FAIL?
@BOX 9.0
DO CHANGE
OF CONTEXT
PROCESSING:2.2.1
@BOX 10.0
DO STATEMENT
CONTEXT PROCESSING
:2.2.2
@BOX 30.0
SET EXPECTED CONTEXT
FOR NEXT STATEMENT
@BOX 11.0
DO STATEMENTPROCESSING
PROCESS END IF LABEL:8.21:
@BOX 13.0
PROCESS DO TERMINATOR
LABEL:8.22:
@BOX 14.0
SET SYNTAX
LEVEL TO ASSIGNMENT
@BOX 15.0
INCR SYNTAX
LEVEL
@BOX 19.0
NOT END OF COMPILATION
@BOX 20.0
END
@BOX 16.0
ALL SYNTAX LEVELS
NOT ATTEMPTED?
@BOX 17.0
FAULT
@BOX 21.0
FAULTY LABEL?
@BOX 22.0
PROCESS LABEL:8.21:
@BOX 23.0
FAULT
@BOX 31.0
PROCESSING EXECUTABLE STATEMENT?
@BOX 32.0
IS STATEMENT A PARAMETER?
@BOX 40.0
ERROR LIMIT REACHED?
@BOX 41.0
GIVE ABORT MESSAGE
@BOX 1.1
;PROC STATEMENTDRIVER
;$IN E.C, S.L, S.L1, MIN.C, MAX.C
; $IN A.C, T, ST.K
;DATAVEC SYN.L($LO8)
0  0  1  1
1  1
END
;DATAVEC E.C.NEXT.ST($LO8)
1   2   2   3   4   1
END
@BOX 2.1
;FAULT(INFORM.LINE.G & LIST.BIT.L -: 0,0)
@BOX 3.1
;0 => E.C
@BOX 4.1
;0 =>  S.L.1
#FTN02.2.3
@BOX 5.1
;LEXICAL()
@BOX 24.1
;IF LINE.G[0] /= '*
@BOX 25.1
;IF SYNTAX.CHECK(0,3=>S.L)=>STAT.NO>0
@BOX 31.1
;IF E.C > 3
@BOX 32.1
;IF LINE.G[0] = 'P AND SYNTAX.CHECK(0,4=>S.L) => STAT.NO = 33
@BOX 6.1
;IF ASSIGN.FL.G /= 0
@BOX 7.1
;SYN.L[E.C] => S.L
@BOX 8.1
;IF SYNTAX.CHECK(0,S.L) => STAT.NO < 0
@BOX 9.1
#FTN02.2.1
@BOX 10.1
#FTN02.2.2
@BOX 30.1
;E.C.NEXT.ST[E.C] => E.C
@BOX 11.1
;IF DEBUG.LINE.G /= 0 THEN
     MONITOR(DEBUG.LINE.G) FI
;PROCESS.STATEMENT(STAT.NO)
;IF STAT.NO = 39 AND CURRENT.LABEL.G > 0 THEN
   PROCESS.STAT.LABEL(2,
     ADD.S.NAME(CURRENT.LABEL.G)=>
       CURRENT.LABEL.PTR.G) FI
@BOX 13.1
;DO.LABEL(CURRENT.LABEL.G)
@BOX 14.1
;2 => S.L
@BOX 15.1
;ALTERNATIVE S.L FROM
   ; BEGIN
      ;IF SL1 = 0 THEN
         ;1 => S.L => SL1
      ;ELSE
         ;-1 => SL
      ;FI
      ;END
      ;BEGIN
         ;IF SL1 = 0 THEN
            ;0 => S.L => SL1
         ;ELSE
            ;-1 => SL
         ;FI
      ;END
      ;0 => S.L
;END
@BOX 16.1
;IF S.L >= 0
@BOX 17.1
;FAULT(107,-1-FSS)
@BOX 19.1
;IF STAT.NO /= 23
@BOX 20.1
;END
@BOX 21.1
; IF LABEL.FAULTY.G /= 0
@BOX 22.1
; IF CURRENT.LABEL.G > 0 THEN
     PROCESS.STAT.LABEL(6,ADD.S.NAME(CURRENT.LABEL.G)
        => CURRENT.LABEL.PTR.G)
  FI
@BOX 23.1
; FAULT(58,1)
@BOX 40.1
; IF ERROR.CNT.G[0] > ERROR.LIMIT
@BOX 41.1
; ERROR.LIMIT => F.I.G
; FAULT(160,7)
@END
@TITLE FTN02.2.1(1,11)
@COL 18C-19C-20T-30T-31R-21R-8C-9C-22R
@COL 1S-2T-3R-4R-5C-6T-7R-10C-11R-12R-13R-14T-15F
@ROW 22-10
@FLOW 1-2NO-3-4
@FLOW 5-6NO-7-13
@FLOW 9-13
@FLOW 10-11-12-13-14NO-15
@FLOW 14YES-4
@FLOW 2YES-15
@FLOW 8-13
@FLOW 18-13
@FLOW 19-20NO-30N-31-21-13
@FLOW 20YES-22-15
@FLOW 30Y-21
@FLOW 6Y-13
@BOX 1.0
CHANGE IN STATEMENT
CONTEXT PROCESSING
@BOX 2.0
DOES CURRENT STATEMENT
CONTEXT RANGE INCLUDE
EXPECTED CONTEXT?
@BOX 3.0
SET ACTUAL CONTEXT
TO MIN OF CONTEXT
RANGE
@BOX 4.0
SWITCH ON EXP CONTEXT
TO DO PROCESSING ASSOCIATED
WITH END OF THAT CONTEXT
@BOX 5.0
PROGRAM UNIT
HDR
@BOX 6.0
HEADER PRESENT?
@BOX 7.0
INIT M.P.U:2.5:
@BOX 8.0
IMPLICIT
@BOX 9.0
EXEC STATS
@BOX 10.0
END STAT
@BOX 11.0
FAULT
@BOX 12.0
DO 'END'
PROCESSING:8.13:
@BOX 13.0
INCR EXP CONTEXT
@BOX 14.0
ACTUAL CONTEXT /=
EXP CONTEXT?
@BOX 15.0
END
@BOX 18.0
PROGRAM
@BOX 19.0
SPECIFICATION
@BOX 20.0
ACT CONTEXT
IMPLICIT?
@BOX 21.0
PROCESS SPECIFICATION
DECLARATIONS:6.1:
@BOX 22.0
FAULT
"IMPLICIT STAT
MUST PRECEDE
OTHER SPECIFICATION
STATEMENTS"
@BOX 30.0
WAS THE LAST STATEMENT NOT
AN AMBIGUOUS PARAMETER?
@BOX 31.0
WARNING
@BOX 1.1
@BOX 2.1
;STAT.KIND[STAT.NO] => ST.K & 7 => MAX.C
;ST.K ->> 4 & 7 => MIN.C
;IF E.C >= MIN.C  =< MAX.C
@BOX 3.1
;MIN.C => A.C
@BOX 4.1
;SWITCH E.C\
F2.1B18, F2.1B5, F2.1B8, F2.1B19,
F2.1B9, F2.1B10
@BOX 5.1
;F2.1B5:
@BOX 6.1
;IF PU.G < 4
@BOX 7.1
;INIT.MPU()
@BOX 8.1
;F2.1B8:
@BOX 9.1
;F2.1B9:
@BOX 10.1
;F2.1B10:
@BOX 11.1
;FAULT(%178,1)
@BOX 12.1
;IF INFORM.LINE.G & SYNTAX.CHECK.BIT.L = 0 THEN
  ;F.END()
  ; %40000000 !> ANSI.BITS.G
  ; SYNTAX.CHECK(0,S.L)
  ; %3FFFFFFF &> ANSI.BITS.G
;FI
@BOX 13.1
;IF 1+> E.C = 6 THEN
0 => E.C
;FI
@BOX 14.1
   ;IF E.C /= A.C
@BOX 15.1
@BOX 18.1
;F2.1B18:
@BOX 19.1
;F2.1B19:
@BOX 20.1
;IF A.C = 2
@BOX 21.1
;IF INFORM.LINE.G & SYNTAX.CHECK.BIT.L = 0 THEN
  ;ANAL.SPECS()
;FI
@BOX 22.1
;FAULT(56,1)
@BOX 30.1
;IF AMBIG.PARAM.G = 0
@BOX 31.1
;FAULT(152,6)
@END
@TITLE FTN02.2.2(1,7)
@COL 1S-2T-3R-4R-5T-20N-6T-8R-21T-13T-14R-9R-22F
@COL 10T-11R-12R
@ROW 20-10
@FLOW 1-2NO-3-4-5NO-20-6NO-8-21NO-13NO-14-9-22
@FLOW 21YES-22
@FLOW 13YES-9
@FLOW 2YES-5
@FLOW 5YES-10NO-11-20
@FLOW 10YES-20
@FLOW 6YES-12-9
@BOX 1.0
STATEMENT CONTEXT
PROCESSING
@BOX 2.0
NOT EXECUTABLE
STATEMENT
@BOX 3.0
INCR EXEC STAT CNT
@BOX 4.0
TL.LINE
@BOX 5.0
BLOCK DATA?
@BOX 6.0
LABEL FAULTY?
@BOX 8.0
DETERMINE STATEMENT LABEL KIND
PROCESS LABEL:8.21:
@BOX 9.0
RESET JUMPED INDICATOR
@BOX 10.0
VALID STAT FOR
BLOCK DATA?
@BOX 11.0
FAULT
"INVALID STAT IN
BLOCK DATA"
@BOX 12.0
FAULT
"LABEL
FAULTY"
@BOX 13.0
STATEMENT ON CONTROL PATH?
@BOX 14.0
WARNING
"STATEMENT NOT ON CONTROL PATH"
@BOX 21.0
END STATEMENT
@BOX 22.0
END
@BOX 1.1
@BOX 2.1
;IF STAT.KIND[STAT.NO]=>ST.K & %8 = 0
@BOX 3.1
;1+>EXEC.ST.CNT.G
@BOX 4.1
;TL.LINE(CUR.LIN.PAG.G)
@BOX 5.1
;IF PU.G = 1
@BOX 6.1
;IF LABEL.FAULTY.G /= 0
@BOX 8.1
;IF ST.K & 8 /= 0 THEN
       ;IF STAT.NO = 37 OR STAT.NO = 38 THEN
             ;8 => T
       ;ELSE
             ;2 => T
       ;FI
;ELSE
       ;IF STAT.NO = 6 THEN
             ;4 => T
       ;ELSE
             ;1 => T
       ;FI
;FI
; IF STAT.NO /= 39 AND CURRENT.LABEL.G > 0 THEN
  PROCESS.STAT.LABEL(T,
     ADD.S.NAME(CURRENT.LABEL.G)=>
        CURRENT.LABEL.PTR.G) FI
@BOX 9.1
; 0=> JUMPED.G
@BOX 10.1
;IF ST.K & %80 /= 0
@BOX 11.1
;FAULT(57,1)
@BOX 12.1
;FAULT(58,1)
@BOX 13.1
;IF T /= JUMPED.G OR STAT.NO = 39
@BOX 14.1
; FAULT(%123,1)
@BOX 21.1
;IF STAT.NO = 9
@BOX 22.1
::END
@END
@TITLE FTN02.2.3(1,11)
@COL 1S-2R-6R-5T-4R-40F
@FLOW 1-2-6-5N-4-40
@FLOW 5Y-40
@BOX 1.0
STATEMENT INITIALISATION
@BOX 2.0
MAX LINE POSITION REACHED
RESET CODE GENERATION GLOBALS
@BOX 6.0
RECOVER LINE SPACE
@BOX 40.0
END
@BOX 4.0
INIT IMPLICIT LENGTHS
AND TYPES
INIT LOCAL LIST HEAD
@BOX 5.0
IN A PROGRAM UNIT
@BOX 1.1
;BEGIN
;$IN I
;LITERAL/ADDR LOCAL.PROP NIL.LP=
@BOX 2.1
;0=>FSS
;7 => PROPS.I
;-1 => A.AP.G => B.AP.G => T.AP.G => CUR.A.TYPE.G
@BOX 6.1
;RESET.SPACE(LINE.SPACE)
@BOX 40.1
;END
@BOX 5.1
;IF PU.G < 4
@BOX 4.1
;NIL.LP=>LOCAL.LIST.HD.G=>LOCAL.LIST.ST.G
;-1=>I
;WHILE 1+>I < 26 DO
   ;IF I < 8 OR I > 13 THEN
      ;0=>IMPLICIT.G[I]
      ;ACC.Z.G[0] => IMPLICIT.LEN.G[I]
   ;ELSE
      ;3=>IMPLICIT.G[I]
      ;I.ACC.Z.G => IMPLICIT.LEN.G[I]
   ;FI
;OD
@END
@TITLE FTN02.3(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
PROCESS STATEMENT(STAT.NO)
@BOX 2.0
CALL APPROPRIATE SEMANTIC PROC
@BOX 3.0
END
@BOX 1.1
;PROC PROCESS.STATEMENT(NO)
@BOX 2.1
;->SKIP ;ABORT: -> AFTER.STATEMENT
;SKIP: ABORT => RESTART.COMPILE
;IF INFORM.LINE.G & SYNTAX.CHECK.BIT.L /= 0 THEN
  ;EXIT
;FI
;ALTERNATIVE NO FROM
;CAPTION (%"ST 0") ::0
;F.TYPE()
;DIMENSION()
;COMMON()
;EQUIVALENCE() ::4
;EXTERNAL()
;FORMAT()
;F.DO()
;DATA() ::8
;F.END()
;ASSIGNMENT()
;COMP.GO.TO()
;ASS.GO.TO() ::12
;GOTO()
;LOG.IF()
;ARITH.IF()
;CALL() ::16
;FCONTINUE()
;RETURN()
;READ.WRITE.PRINT()
;FILE.POSITION() ::20
;FSTOPAUSE(STAT.AP.G)
;LABEL.ASSIGNMENT()
;END.DIRECTIVE()
;SUB.OR.FN() ::24
;BLOCK.DATA()
;CAPTION (%"ST 26")
;CAPTION (%"ST 27")
;FSTOPAUSE(STAT.AP.G) ::28
;CAPTION (%"ST 29")
;INTRINSIC()
;IMPLICIT()
;SAVE() ::32
;PARAMETER()
;ENTRY()
;PROGRAM()
;BLOCK.IF() ::36
;ELSE.IF()
;F.ELSE()
;ENDIF()
;OPEN() ::40
;CLOSE()
;INQUIRE()
;MAP.DIRECTIVE() ::43
;EXPORT.DIRECTIVE() ::44
;IMPORT.DIRECTIVE() ::45
;LIB.DIRECTIVE() ::46
;LONG.NAMES.BIT.L -=> ANSI.BITS.G
;SHORT.INT() ::48
;AS[STAT.AP.G] => OPEN.DEFAULT.VAL.G
;MAP.COMMON() ::50
; LIST.BIT.L !> INFORM.LINE.G
; LIST.BIT.L -= -1 &> INFORM.LINE.G
END
;AFTER.STATEMENT: ABORT.COMPILE => RESTART.COMPILE
@BOX 3.1
;END
@END
@TITLE FTN02.4(1,10)
@COL 1S-2R-3R-4R-5R-7R-8R-49F
@FLOW 1-2-3-4-5-7-8-49
@BOX 1.0
PROGRAM UNIT INITIALISATION
PROC INIT.PU
@BOX 2.0
SET EXEC STAT COUNT TO ZERO
SET DATA STAT COUNT TO ZERO
DECLARE PSPECS FOR FORWARD REFS
@BOX 49.0
END
@BOX 3.0
INIT DO TABLE
INIT BLOCK NEST TABLE
@BOX 4.0
INIT FORMAT DICT NAME
INIT ASS. GOTO LOOP NAME
INIT ASS. GOTO VEC NAME
@BOX 5.0
NOTE CONTROL VARIABLE FOR ARRAYS
IN IOLIST NOT REQUIRED
@BOX 7.0
RESET SAVE ALL INDICATOR
@BOX 8.0
RESET COMMON LIST HEAD
@BOX 1.1
;PROC INIT.PU
;$IN I
;LITERAL/ADDR LOCAL.PROP NIL.LP =
;LITERAL/ADDR COMMON.PROP NIL.CP=
;LITERAL/ADDR [$LO8] NIL.STR =
;LITERAL/ADDR DATA.LIST NIL.DATA =
;LITERAL/ADDR ENTRY.LIST NIL.ENTRY =
;LITERAL/ADDR FORMAT.LIST NIL.FORMAT =
@BOX 2.1
;0 => EXEC.ST.CNT.G => DATA.ST.CNT.G
; IF PSPEC.CNT = 0 THEN
   ; MUTLN.G => PSPECN.G
;FI
; WHILE PSPEC.CNT < MAX.SPECS.L DO
    TL.PROC.SPEC(NIL.STR,%2001)
   ;1 +> PSPEC.CNT
   ;1 +> MUTLN.G OD
@BOX 49.1
;END
@BOX 3.1
;7 => DO.PTR.G
;0 => CUR.NEST.LEV.G => CUR.BLOCK.NO.G
@BOX 4.1
; 0 => FMT.DICT.NAME.G
  => ASS.GOTO.LOOP.NAME.G
  => ASS.GOTO.VEC.NAME.G
; FOR I < NO.FIO.PROCS.L DO
     0 => RW.PROCS[I] OD
@BOX 5.1
;0 => RW.ARR.CNT.VAR.G
@BOX 7.1
;0 => ALL.SAVE.G => AMBIG.PARAM.G
@BOX 8.1
;NIL.CP => COM.LIST.G
;NIL.DATA => DATA.LIST.ROOT
;NIL.FORMAT => FORMAT.LIST.ROOT
;NIL.ENTRY => ENTRY.LIST.ROOT
@END
@TITLE FTN02.5(1,6)
@COL 1S-2T-3R-4R-5F
@FLOW 1-2N-3-4-5
@FLOW 2Y-4
@BOX 1.0
INIT.MPU
@BOX 2.0
FIRST MPU?
@BOX 3.0
FAULT
@BOX 4.0
NOTE MPU
INIT.PU
PLANT CALL TO FIO.INIT.RUN:11.22:
@BOX 5.0
END
@BOX 1.1
;PROC INIT.MPU
;LITERAL/ADDR [$LO8] NIL.STR =
@BOX 2.1
;IF MPU.PRESENT.G= 0
@BOX 3.1
;FAULT(55,1)
@BOX 4.1
;INIT.PU()
;0=>PU.G
;1=>MPU.PRESENT.G
;PL.STK.LB(FIO.INIT.RUN,0)
;TL.PL(%46,%30)
;TL.PL(%21,EXIT.PROG.LABEL.N.G)
;TL.PL(%41,%3000)
;TL.PL(%42,0)
@BOX 5.1
END
@END

