! Modified 05/10/85
!
! FORTRAN 77 CTL MODULE FOR IBM 370 ARCHITECTURE
! XCTL1 MODIFIED FROM ACTL3 07/01/85
!
%OWNSTRING (52) VERSION = "Fortran77 Compiler Version 8Mar86"
%constinteger Rel  = 1
%constinteger Vers = 21
!*
%include "ftn_ht"
%include "ftn_consts1"
%include "ftn_fmts1"
!*
!*
!***********************************************************************
!* Exports                                                             *
!***********************************************************************
!*
%integerfnspec IBMFORT77 (%integer Control,Options1,Options2,F77parm,
                           Optflags,Srflags,Console,Liststream,Diagstream,
                           Diaglevel,Dsize,Tsize,Bsize,Lsize,Asize,Sp2)
%routinespec Dicful
%routinespec Namesful
%routinespec Extful
%routinespec F77abort(%integer N)
%integerfnspec Outputful
%integerfnspec Analful
%integerfnspec Genful
!*
!***********************************************************************
!* Imports                                                             *
!***********************************************************************
!*
%externalroutinespec Codegen(%integer Cgenep,
                             %record(Triadf)%arrayname Triads,
                             %integer Comad)
%externalintegerfnspec Analstart(%record(Triadf)%arrayname Triads,
                                 %integer Comad,%integername Count)
%EXTERNALROUTINESPEC INIT ALLOC (%INTEGER MODE, COMAD, REL, AVERS)
%externalroutinespec Init Num(%integer Comad)
%externalroutinespec F77area(%integer index,size,%integername ad)
%externalroutinespec Free(%integer byteaddress)
!*
%externalroutinespec Op4 Init(%integer Comad)
%externalroutinespec op4 Init1(%integer Comad)
%externalintegerfnspec Op4 Subprog
%externalroutinespec Reset Oplist
%externalroutinespec Lfault(%integer N)
%externalroutinespec Op4 Resetanal
!*
%externalroutinespec Optsource(%integer a,b,c,d,e,f)
%externalroutinespec Optctl(%integer Acom,Nexttr,Bits,Assgotos)
!*
!***********************************************************************
!* OWN variables                                                       *
!***********************************************************************
!*
%owninteger ComCONTROL,OPT,OPTIONS1,OPTIONS2,PTRACE,
      ADICT,ANAMES,ADOUTPUT,ADBLKDTAID,DICLEN,DPTR,
      MAXTRIADS,NEXTPLAB,ALABH,ADLHEAD,
      SUBPROGTYPE,SFPTR,EXTERNALS,CBNPTR,SCPTR,CHECKLIST,
      RESCOM1,RESCOM2,F77PARMS,FNO,FAULTY,LINEST,CMNIIN,SFMK,
      LISTL,LISTSTREAM,DIAGSTREAM,LISTMODE,XREF,
      PACKCMN,ITSMODE,PATHANAL,CHARACTER CODE,SPACE CHAR,
      HEADINGS,ARRAYCHECKS,JBRMODE,MESSLEN,NAMESLEN,
      NEXTCH,FUNRESDISP,WARNCOUNT,INP,MAXINP,MESSCOUNT,
      UNASSPATTERN,LISTCODE,PI21INT,DOPTR,SUBPROGPTR,
      FNLST,LAB,NAMESFREE,ALGOLREF,FIRSTSTATNUM,CEXPDICT,
      COMMONBASE,FASTPROLOGUE,STATEMENT,IFPTR,
      CNSTCA,COMMENTCNT,ADIDENT,ADERRIDEN,
      ADEXT,MAXDICT,MAXNAMES,MAXOUTPUT,MAXEXT,
      ACOMP,ASUBNAMES,MAXPSTACK,
      ATRIADS,TRFILEID,TRBLOCK,CMNCNT,SCANONLY,NOISY,
      MAXANAL,MAXGEN,SAVEANAL,SAVEGEN,OPTFLAGS,NEXTBIT,
      ACMNBITS,NEXTTEMP,ASSGOTOS,TMPPTR,DESTEMPS,OBJADDR,
      AREAADDR,PASTART,ADOPTDATA,TMINDEX,VRETURN,ENTRIES,
      EQUCHK,LABWARN,LINENO,MAXIBUFF,
      COMMENTS,DIAGLEVEL,WARNNOT77,WARNLENGTH,ALLOWUNIX,ALLOWVAX,
      ONETRIP,ComHOST,ComTARGET,MONERRS,TRANSMTM,
      GLACA,PLTCA,SSTCA,GSTCA,CONSTCA,SCALARCA,IOAREACA,ZGSTCA,STACKCA,
      ComW1,ComW2,ComW4,STATORDERMODE,CURSTATCLASS,LISTPOINT,STACKBASE,
      NEXTTRIAD,ASAVE,MAXSAVE,SUBTAB,LASTSUBTAB,
      INHIBOP4,ARGCNT,IDCNT,LABCNT,TMLIST,MAINPROG,PROCINDEX,ComCONSOLE,
      NEXTSAVE
!*
%ownrecord(Objfmt) Obj
%ownrecord(Comfmt)%name Com
%owninteger Comad
!*
!*
%CONSTBYTEINTEGERARRAY HEX(0 : 15) =   %C
 '0','1','2','3','4','5','6',
'7','8','9','A','B','C','D','E','F'
!*
%ROUTINE PRHEX(%INTEGER J)
%INTEGER K
      %CYCLE K = 28,-4,0
         PRINT SYMBOL(HEX((J>>K)&15))
      %REPEAT
%END
!*
!
%EXTERNALINTEGERFN FORT77 (%INTEGER CONTROL, OPTIONS1, OPTIONS2, F77PARMS, OPTFLAGS, %C  
   SRFLAGS, CONSOLE, LISTSTREAM, DIAGSTREAM, DIAGLEVEL, DSIZE, TSIZE, BSIZE, LSIZE, ASIZE, SP2)
%record(Triadf)%arrayformat Trform(0:10000)
%record(Triadf)%arrayname Triads
%integer Diclen,Maxtriads,Maxblocks,Maxloops
%integer I,J,K,F,Count
%string(63) S
!*
      Com==record(addr(ComControl))
      Comad=addr(Com_Control)
!*
!******  Host dependent data
!*
      Com_Host=HOST
      Com_W1=W1
      Com_W2=W2
      Com_W4=W3
!*
!******
!*
      Com_Messlen=1
!*
!******* ESTABLISH Com_Options
!*
      Com_Control = Control
      Com_Options1=Options1
      Com_Options2=Options2
!      %if F77PARMS&X'18'=0 %then F77PARMS=F77PARMS!X'10'
      F77parms=F77parms!2;! inhibit argument checks
      Com_F77parm=F77PARMS
      Com_Opt=(Com_Options1>>20)&15
      %if Com_Opt>2 %then Com_Opt=4
      %if Com_Opt#0 %then Com_F77parm=Com_F77parm!X'17';! all checks off
      Com_Optflags=Optflags
      Obj_Srflags=Srflags
      Obj_Inhibmask=0
      Com_Liststream=Liststream
      Com_Diagstream=Diagstream
      Com_Console=Diagstream
    {  Com_Liststream=1 }
    {  Com_Diagstream=2 }
    {  Com_Console=2    }
      Com_Noisy=1;! report routine name to diagstream
      %if Srflags#0 %thenstart
         printstring("       SRFLAGS = X")
         Prhex(Srflags)
      %finish
!*
      %if Dsize=0 %then Dsize=48
      %if Dsize<16 %then Dsize=16
      %if Dsize>64 %then Dsize=64
!*
      %if Tsize=0 %then Tsize=128
      %if Tsize<32 %then Tsize=32
      %if Tsize>256 %then Tsize=256
!*
      %if Bsize=0 %then Bsize=48
      %if Bsize<16 %then Bsize=16
      %if Bsize>128 %then Bsize=128
!*
      %if Lsize=0 %then Lsize=4
      %if Lsize<1 %then Lsize=1
      %if Lsize>16 %then Lsize=16
!*
      Diclen=Dsize<<10
      Dsize=Dsize<<10
!*
      Tsize=Tsize<<10
      Maxtriads=Tsize//12
!*
      Maxblocks=Bsize<<9
      Bsize=Bsize<<10
!*
      Maxloops=Lsize<<9
      Lsize=Lsize<<10
!*
      Com_Objaddr=addr(Obj)
      F77area(0,Dsize,Com_Adict);! T#DICT
      %IF COM_ADICT < 1 %THEN %RESULT = -COM_ADICT
      Com_Diclen=Diclen
      F77area(1,X'b000',Com_Anames);! T#NAMES
      %IF COM_ANAMES < 1 %THEN %RESULT = -COM_ANAMES
      Com_Nameslen=x'1000'
      Com_Adoutput=Com_Anames+X'1000'
      Com_Maxoutput=4000
      Com_Saveanal=Com_Anames+X'4000'
      Com_Maxanal=X'4000'
      Com_Savegen=Com_Anames+X'8000'
      Com_Maxgen=X'3000'
      f77area(2,Tsize,Com_Atriads);! T#TRIADS
      %IF COM_ATRIADS < 1 %THEN %RESULT = -COM_ATRIADS
      Com_Maxtriads=Maxtriads
      %if Com_Opt#0 %thenstart
         F77area(3,Bsize,Obj_Ablocks);! T#BLOCKS
         %IF OBJ_ABLOCKS < 1 %THEN %RESULT = -OBJ_ABLOCKS
         Obj_Maxblocks=Maxblocks
         F77area(4,X'10000',Obj_Atabs);! T#TABS
         %IF OBJ_ATABS < 1 %THEN %RESULT = -OBJ_ATABS
         Obj_Maxtabs=X'8000'
         F77area(5,Lsize,Obj_Aloop);! T#LOOPS
         %IF OBJ_ALOOP < 1 %THEN %RESULT = -OBJ_ALOOP
         Obj_Maxloop=Maxloops
         %if Com_Opt=4 %thenstart
            F77area(6,X'40000',Com_Asave);! T#SAVE
            Com_Maxsave=X'40000'
         %finish
      %finish
      Triads==array(Com_Atriads,Trform)
!*
      Com_Allowvax=0
      Com_Allowunix=0
!*
      %if Com_Control&2=0 %or Host=IBM %thenstart;! listing required
         %if Liststream>=0 %and Diagstream>=0 %then Com_Listmode=1  %c
                                              %else Com_Listmode=2
         Com_Listl=1
      %finishelsestart
         Com_Listmode=0
         Com_Listl=0
      %finish
      Com_Listl=((Com_Control&2)>>1)!!1
      Com_Listmode=2
      Com_Xref=(Com_Control&X'800')>>11
      Com_Scanonly=(Com_Options1&X'20')>>5
      %if Com_Control&X'400000'#0 %thenstart;! EBCDIC
         Com_Character Code=1
         Com_Space Char=X'40'
      %finishelsestart;! ISO
         Com_Character Code=0
         Com_Space Char=X'20'
      %finish
      Com_Itsmode=0
      Com_Unasspattern=X'81818181'
      %if Com_Control&X'10'#0 %then Com_F77parm=(Com_F77parm)!X'7'
                                 ! nochar,noarg,nochar (NOCHECK)
      %if Com_Control&X'20'#0 %then Com_F77parm=Com_F77parm!X'10'
                                ! nobound (NOARRAY)
!*
      %if Com_F77parm&X'F'#7 %and Diaglevel<0 %then Diaglevel=0;! to ensure some diags available
      %if Diaglevel<0 %then Com_Control=Com_Control!X'10000';! to minimise overhead
      Com_Diaglevel=Diaglevel
!*
      %if Com_F77parm&X'10'#0 %then Com_Arraychecks=NO  %C
                              %else Com_Arraychecks=YES
!*
      %if Com_Options1&X'10'#0 %then Com_Optflags=Com_Optflags!32;! oplist
      Obj_Optflags=Com_Optflags
!*
      Com_Pathanal=Com_Control&X'80';! PROFILE BIT
!*
      Init Alloc(0,Comad,Rel<<16!Vers,addr(Version))
      Init Num(Comad)
      %if Com_Listl#0 %thenstart
%if Target=Gould %thenstart
   printstring("
   EPC/Gould ")
   printstring(Version)
   newlines(2)
%finishelsestart
         newlines(2)
         printstring("    Edinburgh Amdahl ")
         printstring(Version)
         newlines(2)
%finish
      %finish
!*
      Com_Lineno=-1
      Com_Linest=0
      Com_Warncount=0;! individual counts for each subprog
      Com_Messcount=0
      Com_Commonbase=0
      Com_Headings=0
      Com_Mainprog=0;! set after a main program - used to check multiples
      Com_Procindex=0;! used to default main prog out of position for Opt3
      Com_Adoptdata=0;! will be set non-zero on entry to optimiser
!*
      Count=0
!*
      %if Com_Opt=4 %thenstart
         Op4 Init(Comad)
         Op4 Init1(Comad)
      %finish
!*
      I=Analstart(Triads,Comad,Count)
!*
      %if Com_Opt=4 %and Com_Fno=0 %thenstart
!printstring("
!Subtab  Lastsubtab  Nextsave ")
!write(Com_Subtab,4)
!write(Com_Lastsubtab,4)
!write(Com_Nextsave,4)
!newlines(2)
!dump(Com_Asave,Com_Nextsave)
         %if Obj_Optflags&32#0 %then Reset Oplist
         %cycle
            %if Com_Fno#0 %or Com_Faulty#0 %then %exit
            J=Op4 Subprog
            %if J=-3 %then Lfault(347);! recursion
            %if J<=0 %then %exit
            Op4 Resetanal
!!            Optctl(Comad,Com_Nexttriad,32,Com_Assgotos)
            %IF OBJ_OPTFLAGS&X'10000'#0 %THENSTART;! DIS=OPLIST
               SELECTOUTPUT(COM_DIAGSTREAM)
               OPTSOURCE(COM_ADICT,COM_ANAMES,COM_ATRIADS,   %C
                         COM_DESTEMPS,COM_ADOPTDATA,COM_TMLIST)
               SELECTOUTPUT(COM_LISTSTREAM)
            %FINISH
            %IF OBJ_OPTFLAGS&32#0 %THENSTART
               NEWPAGE
               COM_HEADINGS=1
               %IF COM_TMINDEX=0 %THEN COM_TMLIST=0
               OPTSOURCE(COM_ADICT,COM_ANAMES,COM_ATRIADS,    %C
                         COM_DESTEMPS,COM_ADOPTDATA,COM_TMLIST)
            %FINISH
            Codegen(3,Triads,Comad)
         %repeat
      %finish
!*
      %if I#0 %then Codegen(I,Triads,Comad)
!*
      Free(Com_Adict<<1)
      Free(Com_Anames<<1)
      %if Com_Opt#0 %thenstart
         Free(Obj_Ablocks<<1)
         Free(Obj_Atabs<<1)
         Free(Obj_Aloop<<1)
      %finish
      %if Com_Faulty=0 %then %result=Com_Linest  %c
                       %else %result=-Com_Faulty
%end;! PNXFort77
!*
%routine Abort(%string(63) S)
      printstring("
***Compilation aborted due to ")
      printstring(S)
      printstring(" table overflow
***This may be avoided by reducing the size or complexity of the subprogram
***currently being compiled
")
      newline
      %stop
%end;! Abort
!*
%externalroutine Dicful
      Abort("Dictionary")
%end
!*
!*
%externalroutine Namesful
      Abort("Name")
%end
!*
%externalroutine Extful
      Abort("Externals")
%end
!*
%externalroutine F77abort(%integer N)
      %if N=1 %thenstart;! the only defined value pro tem
         Abort("Triad")
      %finishelse Abort("???")
%end;! F77abort
!*
%externalintegerfn Outputful
%result=1
%end
!*
%externalintegerfn Analful
%result=1
%end
!*
%externalintegerfn Genful
%result=1
%end
!*
!*
%ENDOFFILE