|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 150528 (0x24c00) Types: TextFile Names: »ftnpass43tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »ftnpass43tx «
; rc 3.1.70 fortran, pass 4, page 1 k=e0 s. a500 w. endp4 ; number of bytes in pass 4 h. beginp4, 4<1+0 ; entry to pass 4, same direction as pass 3 \f ; fgs 1983.06.20 fortran, pass 4, page 3 ; definition of outputbyte values. aritleft=111 ; aritmetic left parenthesis aritrigt=114 ; aritmetic right parenthesis almcom =150 ; normal commonlist zoncom =151 ; zonecommonlist datalist=152 ; data list entrylst=153 ; entry point list extlist =154 ; external list labellst=155 ; labelvariable list localpl =156 ; place for local simple arraypl =157 ; place for local arrays and commons dlocarr =158 ; declare local array dcomarr =159 ; declare common array dformarr=160 ; declare formal array dloczone=161 ; declare local zone dzoncom =162 ; declare common zone dformzon=163 ; declare formal zone dextzone=169 ; declare external zone vanoper =122 ; vanished operand endpass4= 38 ; end pass, is the first byte to output in pass4 endunit4= 37 ; end unit, is the first byte to output in each unit extrepr = 56 ; external representation troubl = 57 ; trouble enddecnw= 58 ; new value of end declaration endforma =59 ; end formal declarations impint = 16 ; implied integer impreal = 17 ; implied real implab = 18 ; implied label endlin = 40 ; end line call = 44 ; call listleft= 42 ; list left parenthesis listrigt =43 ; liste rigth paranters integcon =46 ; integer constant. noerror =e85 ; error number = e85 ; working variables. xx1 = 59 ; upperlimit for bytes of pass 4 interrest xx2 = 512 ; first identifiernumber sharel = e53 ; length of sharedescription descripl= e52 ; length of zonedescription availzar= e61 ; length of available area in front of zbuffer recbasel= -e48 ; place for recordbase rel to start of ; the zonedescription \f ; rc 3.1.70 fortran, pass 4, page 5 w. ;identifier action: is used in the declaration part of the program to ; check the occurrence of the identifier and find the action which is ; depending on the kind of the identifier and its actual occurrence ; (in type, dimension, common statement). lookup: rl. w2 lastid. ; w2:=identifier address bl w1 x2+1 ; w1:=kind(identifier) rl. w1 x1+tilsttab. ; w1:=tabelword corresponding to kind bl. w3 (occur.) ; w3:=no of left shifts ls w1 x3 ; am. (occur.) ; bl w3 +1 ; w3:=no of right shifts to use ls w1 x3 ; for isolating the action number sn w1 0 ; if actionnumber=0 jl. doubdecl. ; then goto erroraction ls w1 1 ; am. (occur.) ; else goto action(kind,occur) jl x1 ; with x2=lastid, x1=kind ; statetable: index is the old kind, and the word is holding some bits ; per occurrence of the variable. the value of these bits is used as ; index in the following address table to find the actual action. ; * procedurename ; ** formal parameter ; ** type declaration ; *** dimension left parenthesis ; *** zone declaration with specification ; *** zone declaration without specification ; ** commonname ; *** identifier in common list ; *** external declaration ; ; kind meaning tilsttab: 2.1010100100100101001001 ; 0 not referenced 2.0001000100100000001001 ; 2 simple local 2.0001001001000000000000 ; 4 simple common 2.0001001100001000100010 ; 6 simple formal 2.0001000001100000010000 ; 8 dimension local 2.0001000010000000000000 ; 10 dimension common 2.0001000000001100100000 ; 12 dimension formal 2.0000010000000000011000 ; 14 zone local 2.0000010000000000000000 ; 16 zone common 2.0000010100000000100000 ; 18 zone formal 2.0001000000010000000100 ; 20 external 2.0001000000000000100100 ; 22 external formal 2.0001000000000000000000 ; 24 entry point name 2.0000000000000010000000 ; 26 common name 2.0000000000000000000011 ; 28 external zone 2.0101111010110111101100 ; 30 trouble \f ; rc 3.1.70 fortran, pass 4, page 6 procdecl: h. 2, -23 ; w. jl. procname. ; formpar: h. 3, -22 ; w. jl. param. ; jl. nextbyte. ; typedecl: ; h. 5, -22 ; w. jl. typek1. ; jl. type. ; jl. nextbyte. ; indimens: ; h. 7, -21 ; w. jl. dimk4. ; jl. dimk5. ; jl. dimk6. ; jl. zonedim. ; jl. fzonedim. ; jl. dimtroub. ; inzone: ; h. 10, -21 w. jl. zonek7. ; jl. zonek8. ; jl. dimzonk7. ; jl. dimzonk8. ; jl. dimtroub. ; nospec: h. 13, -21 ; w. jl. newzone. ; jl. parszone. ; jl. pardzone. ; jl. zoneext. ; jl. nextbyte. ; common: ; h. 16, -22 ; w. jl. firstcom. ; jl. nextcom. ; jl. firstc30. ; comlist: ; h. 18, -21 ; w. jl. commonk2. ; jl. commonk5. ; jl. commonk8. ; jl. comparam. ; jl. common30. ; inext: ; h. 21, -21 ; w. jl. external. jl. extform. ; jl. extzone. ; jl. nextbyte. ; \f ; rc 3.1.70 fortran, pass 4, page 7 ; procedure declaration, x2=byte value progtype: hs. w2 typespec. ; programtype:=bytevalue al. w0 lookup. ; identifier action:=look in rs. w0 identact. ; state table al. w0 procdecl. ; occurrence:=procedure declaration rs. w0 occur. ; jl. nextbyte. ; goto read next input byte ; identifier is procedure name, ; x2=lastid, x1=old kind (=0) procname: rs. w2 subrname. ; save identno for chaining rs. w2 lasticom. ; of parameters rs. w2 entrycha. ; set procedure inentry chain bl. w0 typespec. ; w0:=w1:=type of procedure bl. w1 typespec. ; al w1 x1+1<9+1<6 ; explicit refereret:=1explicit typedecl=1 sl w0 7 ; if type>=7 then la. w1 cleartyp. ; type:=0 sn w0 7 ;if program then al w1 x1+1<4 ; set program bit sn w0 9 ; if function with implicit al w1 6+1<9 ; type then type=6(complex) hs w1 x2 ; al w1 24 ; kind:=entry point (=24) hs w1 x2+1 ; jl. w3 locx2. ; al. w0 formpar. ; occurrence:=formal param rs. w0 occur. ; al w0 8 ; parameter number:=1 hs. w0 parno. ; jl. nextbyte. ; goto read next input byte ; identifier is parameter, ; x2=lastid, x1=old kind (=0) param: rl. w1 formp. ; formal param:=explicit used:=1 hs w1 x2 ; al w1 6 ; kind:=simpel formal (=6) hs w1 x2+1 ; bl. w1 parno. ; x2-rel:=paramno*4 + 6 hs w1 x2+2 ; al w1 x1+4 ; paramno:=paramno+1 hs. w1 parno. ; rl. w0 lastid. ws. w0 lasticom. ; set chain (relative) in last am. (lasticom.); parameter hs w0 +4 ; set new last parameter rs. w2 lasticom. ; jl. nextbyte. ; goto read next inputbyte \f ; rc 3.1.70 fortran, pass 4, page 8 ; typestatement, x2=byte value vartype: al w0 x2-9 ; hs. w0 typespec. ; identifier type:=byte value-8 al. w0 lookup. ; identifier action:=look in rs. w0 identact. ; state table al. w0 typedecl. ; occurrence:=typedeclaration rs. w0 occur. ; jl. nextbyte. ; goto red next inputbyte ; identifier is in type declaration, ; x2=lastid, x1=old kind typek1: al w1 2 ; kind:=simpel local (=2) hs w1 x2+1 ; type: bl w1 x2 ; w1:=divbit,type sz. w1 (expltyp.) ; if explicit decl = 1 jl. doubdecl. ; then goto trouble la. w1 cleartyp. ; clear bits 0-5 ba. w1 typespec. ; bit 0-5:=type al w1 x1+1<6 ; explicit decl:=1 hs w1 x2 ; set divbit and type in identdescr jl. nextbyte. ; goto read next inputbyte ; implicit type declaration of last ; identifier implreal: am 1 ; type:=3 implint: al w0 2 ; type:=2 bl. w2 (lastid.) ; w2:=divbit(lastid) sz. w2 (expltyp.) ; if declared explicitly then jl. nextbyte. ; goto read next byte la. w2 cleartyp. ; ba w2 1 ; type:=real or integer hs. w2 (lastid.) ; jl. nextbyte. ; goto read next byte ; implied label, variable in program ; part and explicitly used before. implabel: jl. nextbyte. ; do not output the byte \f ; rc 3.1.70 fortran, pass 4, page 9 ; common statement comdecl: al. w0 lookup. ; identifier action:=look in rs. w0 identact. ; state table al. w0 common. ; occurrence:=common name rs. w0 occur. ; jl. nextbyte. ; goto read next input byte ; identifier is a common name not used ; before, x2=identifiernumber firstc30: am 4 ; kind:= trouble(30) firstcom: al w0 26 ; kind:=common name(=26) hs w0 x2+1 ; bl w0 x2 ; la. w0 cleartyp. ; clear type lo. w0 explref. ; explicit ref:=1 lo. w0 expltyp. ; explicit typedeclared:=1 hs w0 x2 ; setoccur: rs. w2 lasticom. ; save ident no for linking the common list al. w0 comlist. ; rs. w0 occur. ; occurrence:=common list jl. nextbyte. ; goto read next input byte ; identifier is a common name used ; previously, x2=identifier number nextcom: rl w1 x2+5 ; search for the end of the common sn w1 0 ; chain, if w1=0 jl. setoccur. ; then last in chain rl w2 3 ; else w2:=w1 jl. nextcom. ; goto check next in list ; identifier is in common list, x2=lastid common30: am 14 ; kind:=trouble =30 commonk8: am 6 ; kind:=16 (zone common) commonk5: am 6 ; kind:=10 (dimension common) commonk2: al w0 4 ; kind:=4 (simpel common) am. (lasticom.); if kind(lasticom)=trouble(30) bl w1 +1 ; then kind(lastident):=trouble sn w1 30 ; al w0 30 ; hs w0 x2+1 ; sn w0 30 ; jl. noref. ; bl w0 x2 ; explicit ref:=1 lo. w0 explref. ; hs w0 x2 ; am. (lasticom.); set chain in last in common list rs w2 +5 ; noref: rs. w2 lasticom. ; set the new last in common list jl. nextbyte. ; goto read next input byte ; identifier is a formal in common list comparam: al w0 30 ; kind= trouble=30 hs w0 x2+1 ; jl. w3 err410. ; outbyte trouble 410 jl. nextbyte. ; go to read next input byte \f ; rc 3.1.70 fortran, pass 4, page 10 ; dimension statement dimdecl: al. w0 nextbyte. ; identifieraction:=no action rs. w0 identact. ; the action is taken on ( , which jl. nextbyte. ; gives the same as ( in type decl. ; bound left parenthesis in a dimension, ; type, or common declaration dimensin: rl. w0 occur. ; save actual occurrence rs. w0 retab0. ; rl. w0 identact. ; identifier action rs. w0 retabid. ; rl. w0 lastid. ; and identifier number rs. w0 identdim. ; al. w0 indimens. ; occurrence:=dimension left par rs. w0 occur. ; al w0 1 ; varstate:=undefined41 hs. w0 varstate. ; jl. lookup. ; goto look in state table ; identifier was local simple or common ; simple. is set to local dimension or ; common dimension, x2=ident no. dimk5: am 2 ; kind:=dimension common=10 dimk4: al w0 8 ; kind:=dimension local=8 hs w0 x2+1 ; al. w0 adjerr. ; identifier action:=identifier not rs. w0 identact. ; allowed al w1 2 ; correct:=2 restdim: rs. w1 correct. ; bl w0 x2 ; explict ref := 1 lo. w0 explref. ; hs w0 x2 ; al w0 indx ; integer action:=normal constant hs. w0 intconst. ; index rl. w1 lastfrie. ; chain to rest descr:=w1:=last frie rs w1 x2+2 ; jl. w3 nextloc. ; w2:=next stack relative hs w2 x1 ; x2-rel for baseword:=w2 al w0 6 ; no.of dimensions:=1 hs w0 x1-1 ; al w0 edim ; action on ) := enddim hs. w0 boundr. ; jl. nextbyte. ; goto read next input byte \f ; rc 78.04.13 fortran, pass 4, page 11 ; identifiet was formal simpel. is set ; to formal dimension,w2= ident no. dimk6: al w0 12 ; kind=formal dimension (12) hs w0 x2+1 ; al. w0 adjdim. ; identifier action = rs. w0 identact. ; adjustable bound bl w0 x2+2 ; move x2-rel for paramno to byte 6 hs w0 x2+5 ; in ident description al w1 4 ; correct = 4 jl. restdim. ; goto set chain, baseword, and no.of ; dimensions ; identifier is an actual zone, x2=identno zonedim: al. w0 adjerr. ; identifier action:=identifier not rs. w0 identact. ; allowed testzone: al w0 nummzone ; integer action:= no.of zones hs. w0 intconst. ; rl w1 x2+2 ; w1:=rest descr bl w0 x1-1 ; w0:=no. of zones se w0 0 ; if w0<>0 then double declaration jl. doubdecl. ; al w0 ezdim ; action on ) := endzdim hs. w0 boundr. ; jl. nextbyte. ; goto read next input byte ; identifier is a formal zone, x2=ident fzonedim: al. w0 adjzone. ; identifier action:= rs. w0 identact. ; adjustable zone rl w1 x2+2 ; w1:=rest descr rl. w2 lastid. ; retab x2 jl. testzone. ; goto test if double declaration ; constant is array index, w1=address ; for this index, w2=bytevalue index: al w0 vanoper ; outbyte vanished operand jl. w3 (outbyte.) ; rl. w1 lastfrie. ; address for this index:= bs w1 x1-1 ; lastfrie-no.of indices jl. w3 (inbyte.) ; w2:= first byte of constant hs w2 x1-1 ; jl. w3 (inbyte.) ; w2:= second byte of constant hs w2 x1 ; al w2 0 ; adj bound:=0 in case of formal dim corrix: rs w2 x1-2 ; rl. w2 lastfrie. ; no.of indices:=no.of indices bl w1 x2-1 ; +correct (=-4 for formal arrays wa. w1 correct. ; =-2 for other arrays) hs w1 x2-1 ; sl w1 70 ; if no.of indices > 64 jl. ixoverfl. ; then error jl. nextbyte. ; goto read next input byte indx=index-e0 \f ; rc 87.04.13 fortran, pass4, page 12 ; constant is zone index numzone: al. w0 adjerr. ; identifier action:= rs. w0 identact. ; identifier not allowed al w0 morecon ; constant action:= hs. w0 intconst. ; constant not allowed al w0 vanoper ; outbyte vanished operand jl. w3 (outbyte.) ; am. (identdim.); w1:=start addr for rest descr rl w1 +3 ; of the zone jl. w3 (inbyte.) ; read constant giving no.of zones al w0 x2 ; jl. w3 (inbyte.) ; w2:=second part of constant hs w2 x1-1 ; set in -no.of zones- in description bz w2 5 ; (w2 := positive number) sh w2 40 ; se w0 0 ; if no of zones > 40 jl. zonerr. ; then error jl. nextbyte. ; goto read next input byte nummzone=numzone-e0 morecons: jl. w3 (repinp.) ; repeat input byte jl. moreix. ; go to make error action morecon=morecons-e0 ; variable is an adjustable array ; dimension, w1=address for this index adjdim: rl. w1 lastfrie. ; address of this index:= bs w1 x1-1 ; last frie-no.of indices jl. w3 nextloc. ; w2:=next stack relative rs w2 x1 ; set x2-rel for transmitting the rl. w2 lastid. ; parameter and identno c.-1 ; btj 78.01.09 bl w0 x2 lo. w0 explref. hs w0 x2 z. ; btj 78.03.09 jl. corrix. ; for the parameter \f ; rc 78.03.09 fortran, pass 4, page 13 ; variable is an adjustable zone array ; dimension adjzone: am. (identdim.); w1:=address of the rest descr rl w1 +2 ; for the zone rl. w2 lastid. ; identno for variable with no.of zones rs w2 x1-3 ; is set in the description c.-1 ; btj 78.03.09 bl w0 x2 ; lo. w0 explref. ; explicit ref:=1 hs w0 x2 ; z. ; btj 78.03.09 jl. w3 nextloc. ; w2:=next stack rel hs w2 x1-1 ; set x2-rel for transmitting the jl. nextbyte. ; parameter ; right parenthesis after an array ; dimensioning enddim: rl. w1 lastfrie. ; correct last frie: al w2 x1 ; last frie:=last frie bs w1 x1-1 ; -no.of indices rs. w1 lastfrie. ; bl w1 x2-1 ; no.of indices:= al w1 x1-6 ; (no.of indices-6)/2 ls w1 -1 ; rl. w0 correct. ; if correct=4 se w0 2 ; ls w1 -1 ; then no.of indices:=no.of indices/2 hs w1 x2-1 ; rl. w1 lastfrie. ; if lastfrie < firstfrie sh. w1 (firstfri.); jl. stackfl. ; then too many identifiers edim=enddim-e0 ; right parenthesis after an zone ; dimensioning endzdim: al w0 copytwo ; reset integer constant action hs. w0 intconst. ; rl. w0 retabid. ; identifier action rs. w0 identact. ; rl. w0 retab0. ; occurrence rs. w0 occur. ; al w0 0 ; variable state:= defined=0 hs. w0 varstate. ; al w0 edim ; reset ) action for dimension hs. w0 boundr. ; al w0 edzone ; reset ) action for zones hs. w0 boundrz. ; jl. nextbyte. ; goto read next byte ezdim=endzdim-e0 \f ; rc 3.1.70 fortran, pass 4, page 14 ; zone declaration zonedecl: al. w0 zontype. ; identifier action:=set zone type rs. w0 identact. ; to real jl. nextbyte. ; goto read next input byte ; identifier is in a zone statement zontype: al w0 3 ; type:=real hs. w0 typespec. ; al w0 1 ; variable state:= undefined=1 hs. w0 varstate. ; bl w0 x2 ; explicit referenced:=1 lo. w0 explref. ; hs w0 x2 ; jl. type. ; goto check and set type ; left parenthesis in a zone ; declaration zone: al. w0 inzone. ; occurrence:=zone left par rs. w0 occur. ; rl. w2 lastid. ; rs. w2 identdim. ; save identno for the zone identifier jl. lookup. ; ; identifier was a simple variable, ; local, or common zonek8: am 2 ; kind:=16 (=zone common) zonek7: al w0 14 ; kind:=14 (=zone local) hs w0 x2+1 ; rl. w1 lastfrie. ; chain to rest descr:=w1:= rs w1 x2+2 ; lastfrie jl. w3 nextloc. ; w2:=next stack relative hs w2 x1 ; x2-rel for baseword:=w2 al w0 0 ; no.of dimensions:=0 hs w0 x1-1 ; restzone: al. w0 blocproc. ; identifier action:= rs. w0 identact. ; block procedure al w0 buffleng ; integer constant action:= hs. w0 intconst. ; buflength jl. nextbyte. ; goto read next input byte \f ; rc 78.04.13 fortran, pass 4, page 15 ; identifier was a dimension, local ; or common dimzonk8: am 2 ; kind:=zone common (=16) dimzonk7: al w0 14 ; kind:=zone local (=14) hs w0 x2+1 ; rl w3 x2+3 ; w3:=chain to rest descr bl w0 x3-1 ; move description to new place se w0 1 ; w0:=no.of dimensions in array jl. moreix. ; if antal <> 1 then error rl w0 x3-7 ; no.of zones:= hs w0 x3-1 ; length of first index jl. restzone. ; goto set action on ident and const. ; zone without specification nospecif: al. w0 nospec. ; occurrence:=zone parameter rs. w0 occur. ; jl. lookup. ; goto check occurrence ; zone without specification ; kind = 28 newzone: al w0 28 ; kind = 28 = external zone hs w0 x2+1 ; jl. zonerest. ; ; identifier was a simpel formal ; x2=identifier number parszone: bl w0 x2+2 ; move x2-rel for paramno to byte 6 hs w0 x2+5 ; al w0 18 ; kind = 18 hs w0 x2+1 ; zonerest: rl. w1 lastfrie. ; chain to rest descr:=w1:=lastfrie rs w1 x2+3 ; al w0 0 ; no.of dimensions:=0 hs w0 x1-1 ; bl w0 x2 ; explicit referenced:=1 lo. w0 explref. ; hs w0 x2 ; jl. w3 restdes4. ; make rest description jl. w3 nextloc. ; get next x2-rel for the baseword hs w2 x1 ; to w2 setstate: al w0 0 ; variable state:= defined=0 hs. w0 varstate. ; jl. nextbyte. ; goto read next input byte ; identifier was dimension formal pardzone: jl. moreix. ; w1:=chain to rest descr al w0 18 hs w0 x2+ 1 bl w0 x1-1 ; se w0 1 ; if no.of dimensions <> 1 jl. moreix. ; then goto error rl w0 x1-7 ; no.of zones:= 1.index hs w0 x1-1 ; rl w0 x1-9 ; move identno for adj. bound rs w0 x1-3 ; jl. setstate. ; go to set variable state ; identifier was external zoneext: bl w1 x2 ; la. w1 cleartyp. ; type = external zone = 7 al w1 x1+7 ; hs w1 x2 ; bl w1 x2+2 ; save external number hs w1 x2+4 ; jl. newzone. ; go to new zone action \f ; rc 3.1.70 fortran, pass 4, page 16 ; constant is buflength in a zone decl. bufleng: al w0 noshare ; integer constant action:= hs. w0 intconst. ; no.of shares am. (lastid.) ; w1:=place for buflength=chain-3 rl w1 +3 ; al w1 x1-2 ; setconst: jl. w3 (inbyte.) ; w2:= first byte of integer hs w2 x1-1 ; set in descr. jl. w3 (inbyte.) ; w2:= second byte of integer hs w2 x1 ; set in descr al w0 vanoper ; outbyte vanished operand jl. w3 (outbyte.) ; jl. nextbyte. ; goto read next input byte buffleng=bufleng-e0 ; constant is no.of shares in a ; zone decl nooshare: am. (lastid.) ; w1:=place for no.of shares=chain-5 rl w1 +3 ; al w1 x1-4 ; jl. setconst. ; goto set in descr noshare=nooshare-e0 ; identifier is the block procedure ; in a zone declaration blocproc: am. (identdim.); w1:=place for identno for rl w1 +3 ; block procedure rl. w2 lastid. ; set identno for blockprocedure in rs w2 x1-7 ; the zone descr al. w0 inext. ; declare the identifier as external rs. w0 occur. ; jl. lookup. ; goto look in state table ; right parenthesis in a zone decl. endzone: rl. w1 lastfrie. ; correct lastfrie: al w0 x1-8 ; lastfrie:=lastfrie-8 jl. w3 stackpl. ; test for stack place al. w0 zontype. ; identifier action:= rs. w0 identact. ; set zonetype to real al w0 copytwo ; constant action:= hs. w0 intconst. ; normal action al w0 0 ; variable state:= defined=0 hs. w0 varstate. ; jl. nextbyte. ; goto read next input byte edzone=endzone - e0 ; identifier was in trouble mode dimtroub: al. w0 nextbyte. ; identifieraction:=nothing rs. w0 identact. ; al w0 deleteix ; integer action:= nothing hs. w0 intconst. ; al w0 ezdim ; action on ) :=reset hs. w0 boundr. ; identifier- and constant hs. w0 boundrz. ; jl. nextbyte. ; action ixdelete: al w0 vanoper ; outbyte vanished operand jl. w3 (outbyte.) ; jl. w3 (inbyte.) ; eat integer constant jl. w3 (inbyte.) jl. nextbyte. ; goto read next input byte deleteix=ixdelete-e0 \f ; rc 3.1.70 fortran, pass 4, page 17 ; external statement extern: al. w0 lookup. ; identifier action:= rs. w0 identact. ; look in state table al. w0 inext. ; occurrence:= rs. w0 occur. ; external declaration jl. nextbyte. ; goto read next input byte ; identifier is an actual external external: bl. w1 usedext. ; externalno:=externalno + 1 al w1 x1+1 ; hs. w1 usedext. ; hs w1 x2+2 ; extno(last ident):=externalno al w1 20 ; kind:=20 (external) hs w1 x2+1 ; bl w1 x2 ; if explicit ref then lo. w1 explref. ; explicit ref:=1 hs w1 x2 ; jl. nextbyte. ; goto read next input byte ; identifier is a formal external extform: al w1 22 ; kind:=22 (formal external) hs w1 x2+1 ; bl w0 x2 ; explicit referenced:=1 lo. w0 explref. ; hs w0 x2 ; jl. nextbyte. ; goto read next input byte ; identifier was zone without spe. extzone: al w1 7+1<9+1<6 ; type = external zone(7) hs w1 x2 ; and explicit ref explicit type = 1 bl. w1 usedext. ; uesd externals= usedexter + 1 al w1 x1+1 ; hs. w1 usedext. ; hs w1 x2+4 ; set external number jl. nextbyte. ; go to take next byte ; data statement data: al. w0 indata. ; identifieraction:=in data list rs. w0 identact. ; goto output the byte daa jl. output. ; ; variable is in datalis indata: al w1 2 ; if variable is not used before rl w0 x2 ; (kind=type=0) sn w0 0 ; hs w1 x2+1 ; then kind:=simple vaaiable(29 bl w0 x2 ; lo. w0 datastm. ; databit = 1 hs w0 x2 ; jl. w3 getidno. ; outbyte identifiernumber(x2) jl. nextbyte. ; go to next input byte ; double declaration in declaration part doubdecl: jl. w3 err401. ; outbyte trouble 401 bl w1 x2 ; bl w0 x2+1 ; if kind=26 then sn w0 26 ; al w1 x1+1<5 ; set common trouble bit hs w1 x2 ; in type al w0 30 ; kind(identifier):=trouble = 30 am. (lastid.) ; hs w0 +1 ; jl. lookup. ; goto lookup once more \f \f ; rc 78.03.09 fortran, pass 4, page 18 dummy: possleft: posright: notstmf: ; end statement after entry point endundef: rs. w2 savew2. rl. w2 lastid. ; output description of identifier bl w1 x2+1 ; in lastis bl. w1 x1+progkind. ; jl. w3 x1+e0. ; ; end statement , normal action rl. w2 savew2. al w0 endstm0 ; hs. w0 endstat. ; set normal end statemet action endstm: al. w0 program. rs. w0 identact. ; identitieraction:= in program part al w0 copytwo ; reset integer action hs. w0 intconst. ; to copytwo al w0 0 ; variable state := normal =0 hs. w0 varstate. ; jl. output. ; goto output byte endstm0=endstm - e0 ; endudef=endundef-e0 ; ; entry statement, x2=identnumber entry: al. w0 entrynam. ; identifieraction:= entrypoint name rs. w0 identact. ; goto output the byte jl. output. ; variable is entrypoint name entrynam: bl w0 x2+1 ; if kind <> local simple (1) sn w0 1 ; and kind >< unused (0) jl. entrok. ; then double declaration (error 409) se w0 0 ; jl. doubentr. ; bl. w0 (subrname.) ; la. w0 cleardiv. ; type of entry point=type of subroutine sn w0 0 ; if type=0 then lo. w0 expltyp. ; explicit type =1 hs w0 x2 ; entrok: rl. w1 entrycha. ; w1=last ident. in entry list rs w1 x2+5 ; set chain to last entry rs. w2 entrycha. ; w2=new ident in entry chain al w0 8 ; kind:=entrypoint=8 hs w0 x2+1 ; bl w0 x2 ; if entrypointname is not expl ref sz. w0 (explref.) ; jl. aftx2. ; lo. w0 explref. ; then explicit ref hs w0 x2 ; jl. w3 locx2rel. ; and get x2-rel for entry aftx2: al w0 0 ; variable state:=not defined=0 hs. w0 varstate. ; al w0 endudef ; action on end statement hs. w0 endstat. ; :=output description jl. nextbyte. ; goto read next inputbyte \f ; rc 3.1.70 fortran, pass 4, page 19 ; end unit output the bytes ; 1. entry point list ; 2. external list ; 3. label list ; 4. place for local arrays and zones ; 5. place for simple local ; 6. begin unit ; outbyte entry point list endunit: rl. w2 entrycha. ; get first in entry chain al w1 1 ; w1= no of entry points nextentr: sn. w2 (subrname.); if entry point is subroutine jl. subrout. ; go to subroutine action jl. w3 outhead. ; outbyte identon and x2-rel al w1 x1+1 ; no entry points=no entry points+1 rl w2 x2+5 ; get chain to next entry point jl. nextentr. ; subrout: rs. w1 noelem. ; save on of entry points jl. w3 outhead. ; outbyte(identno and x2-rel) bl w1 x2 sz. w1 (progbit.) ; if subruoname=program al w1 7 ; hen type=7 la. w1 cleardiv. ; al w1 x1+1 sn w1 8 ; proceduretype:=if type=7 al w1 0 ; then 0 else type+1 al w1 x1+1<5 ; language:=1 (fortran) ls w1 18 ; save for later setting rs. w1 typespec. ; al w0 0 ; paramdescription:=0 al w1 0 ; ds. w1 pardes. ; nextpar: bl w1 x2+4 ; if chain to next parameter=0 sn w1 0 ; then goto output entry list jl. entryout. ; ls w0 18 ; se w0 0 ; if no of parameters>7 jl. morepara. ; then go to moreparam ba w2 x2+4 ; w2:=address of next parameter bl w1 x2+1 ; w1:=kind of parameter i al w3 17 ; if kind=simple parameter (3) sn w1 3 ; then paramdescr:=type+17 jl. simple. ; al w3 23 ; if kind=array parameter(4) sn w1 4 ; then parameterdescr:=type+23 jl. simple. ; sn w1 7 ; jl. ext. ; then parameterdescr is complicated sn w1 16 ; if kind is trouble (30) jl. anytype. ; then paramdescr:=40 al w1 8 ; parameter was zone rl w3 x2+3 ; if number of zones =0 bl w3 x3-1 ; then paramdescr:=8 se w3 0 ; else paramdescr:=30 al w1 30 ; jl. setpdes. ; \f ; rc 3.1.70 fortran, pass 4, page 20 ext: al w1 31 ; parameter was external bl w0 x2 ; if not used as function so. w0 (funcuse.) ; then paramdescr:=31 jl. setpdes. ; al w3 31 ; else paramdescr:=31+type jl. simple. ; anytype: al w1 40 ; parameter was trouble jl. setpdes. ; parameterdesc:=40 simple: bl w1 x2 ; parameterdescription:=type la. w1 cleardiv. ; +base in w3 wa w1 7 ; setpdes: dl. w0 pardes. ; parameterdescr:= ls w1 18 ; parameterdescr>6 + new description wa w3 3 ; ld w0 -6 ; ds. w0 pardes. ; jl. nextpar. ; ; more than 7 parameters morepara: dl. w0 pardes. ; la. w3 clearpar. ; et parameter description lo. w3 lastpara. ; of parameter no 7 to 40 ds. w0 pardes. ; entryout: rl. w0 pardesm2. ; outbyte parameterdescription wa. w0 typespec. ; jl. w3 outword. ; rl. w0 pardes. ; jl. w3 outword. ; rl. w1 noelem. ; ls w1 1 ; outbyte no of bytes= al w0 x1+4 ; no of entry points *2 + 4 jl. w3 (outbyte.) ; outbyte entry list al w0 entrylst jl. w3 (outbyte.) ; \f ; rc 3.1.70 fortran, pass 4, page 21 ; outbyte external list al w0 0 ; hs. w0 usedext. ; no of externals:=0 rl. w2 idbase. ; for i:=1 step 1 until no of ident contin12: bl w1 x2+1 ; do sn w1 6 ; if kind(i)<>external jl. extout. ; then take next variable bl w0 x2 ; la. w0 cleardiv. ; if type = external zone(7) se w0 7 ; then take next variable jl. nextv12. ; bl w0 x2+4 ; set external number hs w0 x2+2 ; extout: bl w0 x2+2 ; outbyte externalnumber jl. w3 (outbyte.) jl. w3 getidno. ; outbyte identnumber bl. w1 usedext. ; no of externals:=no of exrernals+1 al w1 x1+1 ; hs. w1 usedext. ; nextv12: al w2 x2+6 ; check limit se. w2 (firstfri.); jl. contin12. ; bl. w0 usedext. ; outbyte no of externals jl. w3 (outbyte.) ; bl. w1 usedext. ; outbyte no of bytes = ls w1 1 ; no of externals*2+1 al w0 x1+1 jl. w3 (outbyte.) ; al w0 extlist ; outbyte direction byte jl. w3 (outbyte.) ; \f ; rc 3.1.70 fortran, pass 4, page 22 ; outbyte label variable list al w0 0 ; no of labels:=0 hs. w0 parno. ; rl. w2 idbase. ; for i:=1 step 1 until no of contin13: bl w1 x2+1 ; identifiers do se w1 15 ; if kind(i) <> labelariable jl. nextv13. ; then take next varialbe bl w0 x2+2 ; outbyte x2-rel for label jl. w3 (outbyte.) ; bl. w1 parno. ; no of variables:=no of variables al w1 x1+1 ; +1 hs. w1 parno. ; nextv13: al w2 x2+6 ; check limit se. w2 (firstfri.); jl. contin13. ; bl. w0 parno. ; outbyte no of labelvariables jl. w3 (outbyte.) ; al labellst ; outbyte directing byte jl. w3 (outbyte.) ; rl. w2 stackrel. ; outbyte place for local variables al w0 x2-2 ; stackrel= first frie jl. w3 (outbyte.) ; al w0 localpl ; jl. w3 (outbyte.) ; rl. w0 arrbase. ; outbyte place for arrays and zones jl. w3 outword. ; al w0 arraypl ; outbyte directing byte jl. w3 (outbyte.) ; al w0 endunit4 ; outbyte end unit jl. w3 (outbyte.) ; jl. nextbyte. ; go to next input byte \f ; rc 3.1.70 fortran, pass 4, page 23 ; identifieraction in program part ; x2=identifiernumber program: rs. w2 lastid. ; bl w0 x2 ; sz. w0 (explref.) ; if variable explicit referenced jl. oldoper. ; then goto output description bl w0 x2+1 ; if kind <> unknown(30) se w0 16 ; then goto new operand jl. newoper. ; oldoper: bl w1 x2+1 ; output decription of identifier bz. w1 x1+progkind. ; jl. w3 x1+e0. ; jl. nextbyte. ; ; make a new declaration newoper: bl w0 x2 ; explicit referenced:=1 lo. w0 explref. ; hs w0 x2 ; hs. w0 typespec. ; save type repeat: jl. w3 (inbyte.) ; read next inputbyte into w2 al. w1 progbyte. ; search in table for action bl w0x1 ; w0:=testalue se w0x2 ; if inputbyte<>tableword jl. getnext. ; then fet next tableword bl w1 x1+1 ; else goto action(tableword) rl. w2 lastid. jl. x1+e0. ; getnext: al w1 x1+2 ; get next word in table se. w1 lastprgb. ; if w1=< no of words in table jl. repeat.+4 ; then goto repeat ; else rl. w2 lastid. bl w0 x2 ; variable is simple local al w1 3 ; if variable is parameter so. w0 (formp.) ; then kind:=simpel formal(3) al w1 1 ; else kind:=simpel local hs w1 x2+1 ; jl. w3 e11. ; repeat input character so. w0 (formp.) ; if simpel local then jl. w3 locx2rel. ; set x2-rel for simpel local jl. oldoper. ; goto output description ; variable is label name declabel: bl w0 x2+1 ; bl w1 x2 la. w1 cleardiv. ; sn w0 0 ; if kind<>0 and jl. label. ; se w1 2 ; type<>2 then jl. oldoper. ; go to output description label: al w0 15 ; kind:=labelname=15 hs w0 x2+1 ; bl w1 x2 ; type:=integer=2 la. w1 cleartyp. ; al w1 x1+2 ; hs w1 x2 ; jl. w3 locx2rel. ; set x2-rel jl. oldoper. ; goto output description \f ; rc 3.1.70 fortran, pass 4, page 24 ; implied integer or real realimpl: am 1 ; type:=real=3 intimpl: al w0 2 ; type:=integer=2 bl w1 x2 ; hs. w1 typespec. ; save type for la. w1 cleartyp. ; intrinsic functions ba w1 1 ; hs w1 x2 ; jl. repeat. ; goto read nest programbyte ; external representation repext: al w2 extrepr ; same as normal hs. w2 reverse. ; (see copyx) jl. w3 (inbyte.) ; hs. w2 reversp1. ; al w1 x2 ; jl. w3 copysav. ; jl. repeat. ; goto repeat process ; trouble byte troub: al w0 16 ; kind:=trouble:=16 hs w0 x2+1 ; jl. w3 e11. ; repeat inputbyte. jl. oldoper. ; goto output description newline: jl. w3 (linecnt.) ; outbyte new line number jl. w3 (outbyte.) ; outbyte new line jl. repeat. ; go to repeat process ; list left parenthesis or call extleft: bl. w1 typespec. ; if variable is an intrinsic se. w1 (explref.) ; function then hs w1 x2 ; type = saved type al w1 7 ; if variable is parameter bl w0 x2 ; then kind:=formal external=7 sz. w0 (formp. ) ; else kind:=external(6) jl. putkind. bl. w1 usedext. ; no of externals=no of externals +1 al w1 x1+1 hs. w1 usedext. hs w1 x2+2 al w1 6 ; putkind: hs w1 x2+1 ; jl. w3 e11. ; repeat input byte jl. oldoper. ; goto output description \f \f ; rc 3.1.70 fortran, pass 4, page 25 ; output description of ; simpel local, simpel parameter ; external' external parameter ; labelvariable simplocd: rs. w3 savew3a. ; bl w0 x2+2 ; outbyte x2-relative jl. w3 (outbyte.) ; jl. w3 direct. ; outbyte directing byte jl. (savew3a.) ; ; output description of a simpel common simpcomd: rs. w3 savew3a. ; rl w0 x2+3 ; outbyte commonnumber jl. w3 outword. ; outbyte commonrelative jl. w3 direct. ; outbyte directing byte jl. (savew3a.) ; ; output description of an array arraydes: rs. w3 savew3a. ; rl w1 x2+3 ; w1:=address of restdescription bl w0 x1 ; outbyte x2-rel for baseword jl. w3 (outbyte.) ; arrzonde: bl w3 x1-1 ; w3:=no of bytes to transmit to ls w3 1 ; pass 5= al w3 x3+4 ; (no of indices-1)*2 + 6 rs. w3 bytes. ; ac w3 x3-1 ; w3:=address of last byte of wa w3 2 ; index n-1 rs. w3 test. ; x1-((no of indices-1)*2+5) rl w0 x1-2 ; jl. w3 outword. ; output upperix rl w0 x1-4 ; jl. w3 outword. ; output lowerix bl w0 x1-1 ; jl. w3 (outbyte.) ; outbyte number of indices al w1 x1-6 ; w1:=address of first byte of words ; to output=w1-6 nextword: sh. w1 (test.) ; jl. stopword. ; rl w0 x1 ; outword w0 jl. w3 outword. ; al w1 x1-2 jl. nextword. ; stopword: rl. w3 bytes. ; outbyte number of bytes bl w1 x2+1 ; sn w1 13 ; if kind=array eq zone then al w3 x3+3 ; no bytes=no bytes+3 al w0 x3 ; jl. w3 (outbyte.) ; jl. w3 direct. ; outbyte directing byte jl. (savew3a.) ; return with bytes = no of bytes in descr. \f ; rc 3.1.70 fortran, pass 4, page 26 ; output description of a zone zoned: rs. w3 savew3a. ; rl w1 x2+3 ; w2:=address of descr bl w0 x1 ; outbyte x2-rel jl. w3 (outbyte.) ; bl w0 x1-1 ; outbyte descr of no.of zones jl. w3 (outbyte.) ; jl. w3 direct. ; outbyte directing byte jl. (savew3a.) ; ; output description of simple equiv. to ; array simpeqar: rs. w3 savew3a. ; bl w0 x2+4 ; outbyte x2-rel for basis descrest: jl. w3 (outbyte.) ; rl w0 x2+3 ; outbyte displacement jl. w3 outword. ; jl. w3 direct. ; outbyte directing byte jl. (savew3a.) ; ; output description of simpel ; equiv: to zone simpeqzo: rs. w3 savew3a. ; rl w1 x2+5 ; bl w0 x1-2 ; outbyte(zonedescriptor- jl. w3 (outbyte.) ; displacement) bl w0 x1 ; jl. descrest. ; goto outbyte rest of description ; output description of array ; equiv. to zone arreqzo: rs. w3 savew3a. ; rl w1 x2+5 ; bl w0 x1-4 ; outbyte(zonedescriptor jl. w3 (outbyte.) ; displacement) bl w0 x1 ; outbyte(x2-rel for jl. w3 (outbyte.) ; zonedescriptor base) rl w0 x1-3 ; outbyte(no of bytes from jl. w3 outword. ; array(0.0..0) to rec(0)) rl w1 x2+3 ; w1 = rest description jl. arrzonde. ; goto output array descrip \f ; rc 3.1.70 fortran, pass 4, page 27 h. ; kind meaning progkind: simplocd-e0 ; 0 simplocd-e0 ; 1 simpel local simpcomd-e0 ; 2 simpel common simplocd-e0 ; 3 simpel formal arraydes-e0 ; 4 array zoned -e0 ; 5 zone simplocd-e0 ; 6 external simplocd-e0 ; 7 external formal simplocd-e0 ; 8 entry point simpeqar-e0 ; unused simpeqar-e0 ; unused simpeqar-e0 ; 11 simpel equivalenced to array simpeqzo-e0 ; 12 simpel equivalenced to zone arreqzo -e0 ; 13 array equivalenced to zone direc ; 14 common name simplocd-e0 ; 15 label variable direc ; 16 trouble w. h. progbyte: implab , declabel - e0 impint , intimpl - e0 impreal , realimpl - e0 extrepr , repext - e0 call , extleft - e0 troubl , troub - e0 endlin , newline -e0 listleft , extleft - e0 lastprgb: w. \f ; rc 78.03.09 fortran, pass 4, page 28 ; entry to pass 4 beginp4 = k - e0 ; initialise al. w0 e5. ; set the address of alarm rs. w0 stackstp. ; after stack owerflow al. w0 e7. rs. w0 endofp. al. w0 e11. rs. w0 repinp. al. w0 program. rs. w0 prstep. al. w0 e3. ; set the address of the byte output rs. w0 outbyte. ; routine al. w0 e2. ; set the address of the byte input rs. w0 inbyte. ; routine al. w0 e1. ; set the address of the line counting rs. w0 linecnt. ; routine al w0 endpass4 ; outbyte(end pass) jl. w3 (outbyte.) ; ; central code: read next inputbyte and classifies the byte. there are ; 3 possibilities: ; 1. value < xx1 , goto action(inputtable(bytevalue)) ; 2. xx1 <= value <= xx2, copy byte ; 3. value > xx2 , this is an identifier. the action address is ; in the word identact. nextbyte: jl. w3 (inbyte.) ; w2:=next input byte bz. w1 x2+intable. ; w1:= action address(byte value) sh w2 xx1 ; if bytevalue < xx1 jl. x1+e0. ; then goto action(bytevalue) sl w2 xx2 ; if bytevalue > xx2 jl. identif. ; then goto identifier output: al w0 x2 ; else copy byte jl. w3 (outbyte.) ; jl. nextbyte. ; goto read next inputbyte ; inputbyte was an identifier identif: al w0 vanoper ; if identifieraction=introuble rl. w1 identact. ; ! (state=in declaration part sn. w1 introubl. ; & identifieraction=in data jl. outvan. ; then outbyte vanished operand sn. w1 indata. ; jl. notvan. ; bl. w1 state. ; se w1 1 ; outvan: jl. w3 (outbyte.) ; notvan: al w2 x2-xx2 ; lastident:=address in identifiertable wm. w2 const6. ; table for 1. byte of the descrop- wa. w2 idbase. ; tion. rs. w2 lastid. ; = (bytevalue-xx2)*6 + idbase am. (firstfri.); sh w2 -1 ; if identifieraddress<firstfrie jl. (identact.) ; then goto identifieraction al w1 x2+6 ; else check if place for ident rs. w1 firstfri. ; al w3 0 ; rs w3 x2+0 ; (clear new entry) rs w3 x2+2 ; rs w3 x2+4 ; sh. w1 (lastfrie.); jl. (identact.) ; then goto identifieraction. jl. stackfl. ; \f ; rc 3.1.70 fortran, pass 4, page 29 ;constants locx2: rs. w3 savew3a. ; jl. w3 locx2rel. ; jl. (savew3a.) ; w. cleardiv: 2.000000001111 ; to get the type from identifiertable cleartyp: 2.111111110000 ; to get the divbit from identifiertable cleardat: 2.111011111111 ; to clear the data bit progbit: 2.000000010000 ; to get the bit program commontr: 2.000000100000 ; to get the bit common trouble expltyp: 2.000001000000 ; to get the bit explicitly typedecl formp: 2.000010000000 ; to get the bit formal parameter funcuse: 2.000100000000 ; to get the bit used as function datastm: 2.000100000000 ; to get the bit in data list explref: 2.001000000000 ; to get the bit explicitly referenced recbase: recbasel ; place for recordbace const1: 1 ; constants mosttly used in divisions const3: 3 ; const5: 5 ; and multiplications const6: 6 ; const8: 8 ; catalog: 2.101011110101101010111000 ; type of std. func.double(1),compl(0) clearpar: 2.000000000000111111111111 ; clear last parameter description lastpara: 2.000000101000000000000000 ; sed for parameterdesc=40 clear1: 2.000000001111111111111111 ; used for checking adjustable check1: 2.000000000010000000000110 ; type and kind clear: 2.111111111111100000000000 ; used to make //2**11*2**11 ; working locations w. endofp:e7 ; abs address of the pass termination in p0 stackstp:0 ; abs address of the alarm routine in p0 lastinco:0 ; abs address of tword with last word in core prstep: program ; stepping stone idbase:0 ; abs address of the first variabledescription firstfri:0 ; abs address of the first available byte in free core lastfrie:0 ; abs address of the last available byte in free core lastid:0 ; abs address of the first byte for the descr of last variable lasticom:0 ; abs address of the first byte for the last in com.list entrycha:0 ; abs address of first byte for last in entry list identdim:0 ; abs address of the first byte for the last dimensioning identact:0 ; abs address of the actual identifieraction occur:0 ; abs address of the actual occurrence of the identifier savew1:0 ; working locations for saving things savew2:0 ; savew3: 0 ; savew3a:0 ; savew3b:0 ; savew3c:0 ; retab0: 0 ; retabid:0 ; reverse:0 ; adjwork: 0 \f ; rc 3.1.70 fortran, pass 4, page 30 nextbyt: jl. nextbyte. ; stepping stones correct:0 ; =2 for arrays, 4 for zones limit:0 ; abs address for the last index in an arraylist lowerix:0 ; for computing lowerindex upperix:0 ; for computing upper index length:0 ; for computing length (in bytes) of a winner arrbase:0 ; - the number of bytes used for local arrays and zones stackrel:0 ; - the number of bytes used for local simples test:0 ; subrname: 0 ; identnumber for procedure ame 0 ; doubleword for setting up the pardes: 0 ; the parameter description comno:0 ; for various counts noelem:0 ; nobytes:0 ; nozones:0 ; bytes:0 ; zonno: 0 ; h. usedext:0 ; no of external used parno:0 ; no of parameters typespec:0 ; the type in the last typespecification lastkind:0 ; the kind of the last identifier in common state:0 ; =0 in declaration part, 1 in program part varstate: 0 ; state of variable, 0 undefined, 1 defined w. indtr: jl. indtroub. ; stepping stones indtrou= indtr - e0 arindx: jl. arrayidx. ; arrindx= arindx - e0 arright: jl. arrayrig. ; arigh = arright - e0 cop1: jl. copy1. ; cop2: jl. copy2. ; listl: jl. listlef. ; reversp1= reverse+ 1 pardesm2 = pardes-2 \f ; rc 78.03.09 fortran, pass4, page 32 endpass: jl. (endofp.) ; go to terminte pass 4 begunit: rl. w1 e9.+4 ; lastfrie:=information from p0 al w1 x1+1 ; rs. w1 lastfrie. ; am idstart ; al. w1 idst. ; idbase:= start of identifier table rs. w1 idbase. ; al w3 x1+24*6 ; al w0 0 ; clear first 24 entries in identifier table hs. w0 state. ; state:=in declaration part nextzero: hs w0 x1 ; al w1 x1+1 ; sh. w1 (lastfrie.); jl. nextzero. ; rl. w1 idbase. ; al w1 x1+36 ; w1 = tabel place for 1.int. func. rl. w3 catalog. ; set type of standard variables nextstdv: al w0 5 ; 1 = double(5) 0 = complex(6) sl w3 0 ; al w0 6 ; hs w0 x1 ; al w1 x1+6 ; w1 = address of next variable ls w3 1 ; se w3 0 ; if not last complex then jl. nextstdv. ; go to take next variable rs. w1 firstfri. ; firstfri = addr of frist variable in the program al w0 -5 ; first stackrelative:=-7 rs. w0 stackrel. ; al w0 0 ; no of externals hs. w0 usedext. ; is set to 0 al w0 0 ; first common number rs. w0 comno. ; is set to 0 al. w0 lastfrie. ; set address of lsatfrie rs. w0 lastfri. ; in lastfri al. w0 lastid. ; set address of lastid rs. w0 lastiden. ; in lastiden jl. output. ; goto take next byte endline: jl. w3 (linecnt.) ; jl. output. ; goto output byte again. listlef: bl. w1 (lastid.) ; if identifier is array lo. w1 funcuse. ; or external .set the bit hs. w1 (lastid.) ; funcused only used for exter jl. output. ; go to output byte listlft=listl-e0 copyx: hs. w2 reverse. ; save the inputbyte jl. w3 (inbyte.) ; get the nest inputbyte hs. w2 reverse.+1; no of bytes in the present byte al w1 x2 ; w1:= no to copy jl. copy. ; goto copy bytes format: jl. w3 (inbyte.) ; read format directing byte jl. copy2. ; go to copy2 next bytes ; copy x bytes to output copy8: am 4 copy4: am 1 copy3: am 1 copy2: am 1 copy1: al w1 1 ; hs. w2 reverse. ; save the inputbyte copy: al. w3 nextbyte. ; set retturnaddress copysav: rs. w3 savew3. ; copyy: jl. w3 (inbyte.) ; w2:=nextbyte al w0 x2 ; w0:=byte jl. w3 (outbyte.) ; outbyte(w0) al w1 x1-1 ; w1:=w1-1 se w1 0 ; if wi <> 0 then jl. copyy. ; then goto copy next byte ; all bytes is copied \f ; rc 3.1.70 fortran, pass 4, page 33 bl. w0 reverse. ; se w0 extrepr ; if directing byte <> extern repr jl. outdir. ; then goto output directing byte rl. w2 lastid. ; outbyte identno jl. w3 getidno. ; bl. w1 reverse.+1 ; outbyte no of bytes for the external al w0 x1+1 jl. w3 (outbyte.) ; representation outdir: bl. w0 reverse. ; outbyte directing byte jl. w3 (outbyte.) ; jl. (savew3.) ; goto get next byte ; trouble byte in input trouble: al. w0 introubl. ; identifier action:=introuble rs. w0 identact. ; (outbyte vanished operand) bl. w0 varstate. ; if variable state = defined=0 se w0 1 ; then goto copy the jl. copy3. ; troublebyte to output al w0 30 ; else kind(lastident):=30 am. (identdim.); hs w0 +1 ; jl. copy3. ; goto copy the trouble byte ; identifier after trouble introubl: jl. nextbyte. ; goto read next input byte \f ; rc 3.1.70 fortran, pass 4, page 34 ; no.of indices > 32 in dimension ixoverfl: jl. w3 err402. ; outbyte trouble 402 jl. seterr. ; goto set ident action and constant ; action to nothing stackfl: al. w1 stacktxt. ; pass 4 stack overflow.terminate jl. w3 (stackstp.); with the message ; stack pass 4 stacktxt: <: process too small<0>:> ; ; constant giving no.of zones > 2**11 zonerr: jl. w3 err403. ; outbyte trouble 403 jl. seterr. ; goto read next input byte ; no.of indices in zone dimens > 1 moreix: jl. w3 err404. ; outbyte trouble 404 seterr: al w0 30 ; kind(ident):=trouble (=30) am. (identdim.); hs w0 +1 ; jl. dimtroub. ; goto set actions to nothing ; adjustable bound on actual dimension adjerr: jl. w3 err405. ; outbyte trouble 405 jl. seterr. ; goto set actions to nothing ; adjustable bound is not formal simple ; integer, x2=identno. type1: al w0 30 ; kind(ident):=trouble (=30) rl. w2 lastid. ; hs w0 x2+1 ; outbyte trouble 406 jl. w3 err406. ; jl. nextvar. ; goto take next var. in table ; mixing of zones and other thing in comm type2: al w0 30 ; kind(commonname):=30 am. (lastid.) ; hs w0 +1 ; hs w0 x2+1 ; kind(common variable:=30) jl. w3 err407. ; make erroractiom jl. nextcha. ; ;zone without specification specerr: al w0 30 ; kind(zone)= 30 = trouble hs w0 x2+1 ; jl. w3 err408. ; outbyte error code jl. nextvar. ; go to next variable ; entry name is not local simple doubentr: al w0 vanoper ; outbyte vanished operand jl. w3 (outbyte.) ; al w0 16 ; kind:=trouble=16 hs w0 x2+1 ; jl. w3 err409. ; al w0 endstm0 ; action on end statement:= hs. w0 endstat. ; normal action jl. nextbyt. ; goto read next input bute err415: am 1 ; err414: am 1 ; err413: am 1 ; err412: am 1 ; err411: am 1 ; err410: am 1 ; err409: am 1 ; err408: am 1 ; err407: am 1 ; err406: am 1 ; err405: am 1 ; err404: am 1 ; err403: am 1 ; err402: am 1 ; err401: al w0 noerror ; outbyte error code rs. w3 savew3b. ; jl. w3 (outbyte.) ; al w0 0 ; jl. w3 (outbyte.) ; outbyte(0) rl. w2 lastid. ; jl. w3 getidno. ; outbyte(identno) al w0 troubl ; outbyte trouble jl. w3 (outbyte.) ; jl. (savew3b.) ; return \f ; rc 3.1.70 fortran, pass 4, page 35 ; inputtable: tabel holding action addresses for bytes pass 4 had to ; make special actions on. is used when 0<input byte value<xx1. ; index is byte value. 1 byte pr byte value. h. intable: progtype - e0 ; dummy word progtype - e0 ; logical function progtype - e0 ; integer function progtype - e0 ; real function progtype - e0 ; long function progtype - e0 ; double function progtype - e0 ; complex function progtype - e0 ; program progtype - e0 ; subroutine progtype - e0 ; function with implicit type vartype - e0 ; logical vartype - e0 ; integer vartype - e0 ; real vartype - e0 ; long vartype - e0 ; double vartype - e0 ; complex implint - e0 ; implied integer implreal - e0 ; implied real implabel - e0 ; implied label equival ; equivalence comdecl - e0 ; common dimdecl - e0 ; dimension extern - e0 ; external zonedecl - e0 ; zone dimensin - e0 ; boundleft boundr: dummy - e0 ; boundright, is set by dimensin zone - e0 ; zoneleft boundrz: endzone - e0 ; zoneright nospecif - e0 ; no specification possleft - e0 ; possible statementfunction left posright - e0 ; possible statement function right notstmf - e0 ; give up statementfunction enddecl ; end declaration endequiv ; end equivalence entry - e0 ; entry databyte: data - e0 ; data output - e0 ; return endunit - e0 ; end unit endpass - e0 ; end pass begunit - e0 ; begin unit endline - e0 ; end line endstat: output - e0 ; end statement set by endundef and end equiv listelft: output - e0 ; liste left is set by endequiv listrigh: copy1 -e0 ; liste right output - e0 ; call \f ;rc 3.1.70 fortran, pass 4, page 36 copy1 - e0 ; logical constant, 1 byte intconst: copy2 - e0 ; integer constant, 2 bytes copy4 - e0 ; real constant , 4 bytes copy4 - e0 ; long constant, 4 bytes copy8 - e0 ; double constant, 8 bytes copy8 - e0 ; complex constant, 8 bytes copy2 - e0 ; statement label, 2 bytes copy2 - e0 ; format label 2 bytes copy2 - e0 ; declare label, 2 bytes format - e0 ; formats output - e0 ; not used copyx - e0 ; external identification, x bytes trouble - e0 ; trouble, 3 bytes copyone= cop1-e0 copytwo=cop2-e0 w. ; p0 routines inbyte:0 ; abs address of the input-byte routine in p0 outbyte:0 ; abs address of the output-byte routine in p0 repinp:0 ; abs address of repeat-input-byte routine linecnt:0 ; abs address of the carret routine in p0 ; compute and set x2-rel for simpel ; local; x2=identnumber locx2rel: rs. w3 savew3. ; bl w0 x2 ; if type=0 then return la. w0 cleardiv. ; sn w0 0 jl. (savew3.) ; al w1 x2 ; save identno jl. w3 nextloc. ; w2:=next stackrel hs w2 x1+2 ; set x2-rel in variable description sh w0 2 ; if type < 3 jl. locx2ret. ; then return jl. w3 nextloc. ; adjust x2-rel for long and real sh w0 4 ; if type<5 jl. locx2ret. ; then return jl. w3 nextloc. ; adjust x2-rel for double and complex jl. w3 nextloc. ; locx2ret: al w2 x1 ; w2= lastid jl. (savew3.) ; return nextloc: rl. w2 stackrel. ; al w2 x2-2 ; w2 = stackrelative - 2 sh w2 -2048 ; if 2048 bytes occupied then jl. stackfl. ; go to stack overflow rs. w2 stackrel. ; stackrelative= w2 jl x3 ; return \f ; rc 3.1.70 fortran, pass 4, page 37 ; compute upper and lower index ; x2= identno ; w0-w1:=computing registers ; w2:=indexstep ; limit:=grænse complim: bl w1 x2 ; typespec:= la. w1 cleardiv. ; type(identifier) hs. w1 typespec. ; limit:= rl w2 x2+3 ; chain-5 al w1 x2-5 rs. w1 limit. ; bl w1 x2-1 ; last index is in chain - 4 al w1 x1- 1 wm. w1 correct. ; - no of indices*correct al w1 x1+6 ws w2 3 ; al w0 x2-2 ; rs. w0 adjwork. ; save for output of declaretion bytes al w0 1 ; lowerix:=1 rs. w0 lowerix. ; rl w1 x2 ; upperix:=length of last index rs. w1 upperix. ; ; for i:=no of ix - 1 step -1 until 1 do check: sh w1 0 ; if index(i+1) is adjustable bound jl. adjbound. ; then goto set x2 rel nextix: wa. w2 correct. ; correction of step limit sl. w2 (limit.) ; check on steplimit jl. endstep. ; rl. w1 upperix. ; upperindex:= wm w1 x2 ; upperindex*index(i) wa w1 x2 ; + index(i) rs. w1 upperix. ; rl. w1 lowerix. ; lowerindex:= wm w1 x2 ; lowerindex*index(i) al w1 x1+1 ; + 1 rs. w1 lowerix. ; rl w1 x2 ; w1:=index(i) jl. check. ; endstep: rl. w0 upperix. ; upperindex:= bl. w1 typespec. ; upperindex*type bl. w1 x1+typshift. ; ls w0 x1 ; rs. w0 upperix. ; rl. w0 lowerix. ; lowerindex:= ws. w0 const1. ; (lowerindex-1)*tyep) ls w0 x1 ; rs. w0 lowerix. ; \f ; rc 3.1.70 fortran, pass 4, page 38 setlim: rl. w2 lastid. ; w2:=address of rest description rl w2 x2+3 ; rl. w1 upperix. ; set upperindex rs w1 x2-3 ; rl. w1 lowerix. ; set lowerindex in the description rs w1 x2-5 ; jl x3 ; goto the return address adjbound: rs. w2 savew2. ; rs. w3 savew3. ; jl. w3 nextloc. ; w2:=next x2-relative rs. w2 upperix. ; upperix:=x2-rel jl. w3 nextloc. ; lowerix:=w2:=next x2-relative rs. w2 lowerix. ; rl. w2 savew2. ; rl. w3 savew3. ; lateradj: rl w1 x2-2 ; if type(adj bound) <> integer rl w0 x1+1 ; if kind <> formal simple la. w0 clear1. ; & type <> integer se. w0 (check1.) ; then type error(406) jl. type1. ; bl w0 x1+2 ; index(i+1):=formalnumber for the adjustable rs w0 x2-2 ; bound aftadj: wa. w2 correct. ; get next index sl. w2 (limit.) ; -check on step limit jl. setlim. ; go to set limit rl w1 x2 ; if index(i) is adjustable sh w1 0 ; jl. lateradj. ; go to later adjustable jl. aftadj. ; go to after adjustable ; compute commonnumber and relative for ; the address given in w0 comadr: sh w0 -1 ; if commonnumber is < 0 then jl. comneg. ; compute negative commonnumber rl w1 1 ; la. w1 clear. ; w1:=displacement//2**11*2**11 ws w0 3 ; w0:=rel=displacement-w1 ls w1 -11 ; w1:=commonno=w1//2**11 jl x3 ; goto returnaddress comneg: ac w1 (1) ; displacement:=-displacement al w0 x1-1 ; -1 rs. w3 savew3. ; jl. w3 comadr. ; get commonnumber and relative ac w3 (1) ; w3:=-relative al w0 x3+1<11-1 ; w0:=2**11-1-relative ac w1 x1+1 ; w1:=-commonnumber jl. (savew3.) ; go to return \f ; rc 3.1.70 fortran, pass 4, page 39 ; compute real commonno and output identno ; length of common, commonno for first in ; fictive part and first in real part transcom: rs. w3 savew3a. ; save return address jl. w3 getidno. ; outbyte identifiernumber(w2) rl w2 x2+3 ; w2:=address of equiv descr rl w0 x2 ; jl. w3 outword. ; outbyte(length of common) rl. w0 comno. ; outbyte(comno for first in fict. part) jl. w3 (outbyte.) ; bl w0 x2-3 ; comno:=comno + no.of fictive parts wa. w0 comno. ; rl. w1 comno. ; hs w1 x2-3 ; set comno for first in fictive part rs. w0 comno. ; jl. w3 (outbyte.) ; outbyte(comno for first in real part) bl w0 x2-2 ; comno:=comno+no.of real parts wa. w0 comno. ; rl. w1 comno. ; set comno for first in real part hs w1 x2-2 ; rs. w0 comno. ; rl. w1 noelem. ; no.of elements:= al w1 x1+1 ; no.of elements + 1 rs. w1 noelem. ; jl. (savew3a.) ; return \f ; rc 3.1.70 fortran, pass 4, page 40 ; outbyte(descrip.of zone), x2=address of ; rest descr of the zone outzone: rs. w3 savew3a. ; bl w0 x2-1 ; outbyte(no.of zones) jl. w3 (outbyte.) ; rl w0 x2-2 ; outbyte(bufferlength) ls w0 -2 ; jl. w3 outword. ; rl w0 x2-4 ; no.of shares:= ws. w0 descr. ; (descr length - zone descr)/ al w3 0 ; share length wd. w0 share. ; jl. w3 (outbyte.) ; outbyte(no.of shares) rl w0 x2-6 ; outbyte(externalno) jl. w3 (outbyte.) ; jl. (savew3a.) ; ; outbyte(commonno), outbyte(real comno) ; for declare array and declare zone ; w2 = identifier outcomno: rs. w3 savew3a. ; rl w1 x2+5 ; w1:=address of com descr rl w3 x1-1 ; w3:=address of common name rl w3 x3+2 ; w3:=address of equiv descr in bl w0 x3-2 ; common name ba w0 x1-3 ; w0:=real commonno for elem jl. w3 (outbyte.) ; outbyte(commonno) bl w0 x1-2 ; outbyte(rel of start of arr(0)) jl. w3 (outbyte.) ; jl. (savew3a.) ; ; output directing byte = ; kind<3 + type + 170, x2 = identno direct: rs. w3 savew3b. ; bl w0 x2+1 ; w0:=kind shift 3 ls w0 3 ; bl w3 x2 ; la. w3 cleardiv. ; w3:=type + 170 al w3 x3+170 ; wa w0 6 ; w0:=kind<3 + type + 170 jl. w3 (outbyte.) ; outbyte(directing byte) jl. (savew3b.) ; direc=direct-e0 ; outputs the word in w0 as two bytes ; the first is pos 0-11, the second is ; pos 12-23. w1 used for working. outword: rs. w3 savew3. ; rs.w0 savew1. bl. w0 savew1. jl. w3 (outbyte.) bl. w0 savew1.+1 jl. w3 (outbyte.) ; jl. (savew3.) ; return \f ; rc 3.1.70 fortran, pass 4, page 40a ; transform address for identifier to ; the corresponding identifiernumber ; output the value. address in w2 getidno: rs. w3 savew3c. ; rs. w1 savew1. ; rl. w1 idbase. ; ac w1 x1 ; wa w1 5 ; al w0 0 ; identno:=(x2-idbase) 6+xx2 wd. w1 const6. ; al w0 x1+xx2 ; jl. w3 (outbyte.) ; rl. w1 savew1. ; jl. (savew3c.) ; outhead: rs. w3 savew3. ; save return address jl. w3 getidno. ; outbyte identifiernumber bl w0 x2+2 ; outbyte x2-rel jl. w3 (outbyte.) ; jl. (savew3.) ; return ; compute length in bytes ; of a variable ; w2 = identifier typeleng: bl w1 x2 ; la. w1 cleardiv. ; bl. w1 x1+typshift. ; bl. w1 x1+bytshift. ; w1 = no of bytes jl x3 ; go to return h. typshift: 0,0,1,2 ; number os shifts of the variable 2,3,3 ; corresponding to the type bytshift: 1,2,4,8 ; number of bytes corresponding w. ; to shifts of the variable (typshift) ; test for place in stack restdes4: al w0 x1-4 ; rest description = 4 bytes stackpl: rs. w0 lastfrie. ; sh. w0 (firstfri.); jl. stackfl. ; jl x3 ; go to return \f ; rc 3.1.70 fortran, pass 4, page 41 ; end declaration ; 1. compute upper and lower index in ; arrays, transform the description ; and generate the bytes declare for- ; mal array and formal zone. base: ; 2. take care of common lists. enddecl=k-e0 ; al w0 enddecnw ; jl. w3 (outbyte.) ; outbyte(end declaration) rl. w2 idbase. ; for i:=1 step 1 until no of variables do contin1: rs. w2 lastid. ; goto action(kind) bl w1 x2+1 ; ls w1 -1 ; action(2-6) = no action bl. w1 x1+kindact1. ; action(8-10) = normal array jl. x1+base. ; action(12) = formal array nextvar: rl. w2 lastid. ; al w2 x2+6 ; action(14-16)=normal zone se. w2 (firstfri.) ; action(18) = formal zone jl. contin1. ; action(20-26)= no action al w0 endforma ; action(28)= external zone jl. w3 (outbyte.) ; outbyte(end formal decl) ; look for common name rl. w2 idbase. ; for i:=1 step 1 until no of variables do contina: rs. w2 lastid. ; bl w1 x2+1 ; bl w0 x2 ; sz. w0 (commontr.) ; if common troubel then jl. comname. ; goto comname so. w0 (datastm.) ; if databit on then jl. notdata. ; se w1 4 ; if kind<>4 sn w1 10 ; or kind<>10 then jl. notdata. ; la. w0 cleardat. ; clear data bit hs w0 x2 ; notdata: sn w1 26 ; if kind(i) = common name jl. comname. ; then make the equivalence nextvara: rl. w2 lastid. ; else take next variable al w2 x2+6 ; se. w2 (firstfri.) ; jl. contina. ; jl. nextbyt. ; goto get next inputbyte \f ; rc 3.1.70 fortran, pass 4, page 42 ; normal array. compute upper and lower index normarr: al w1 2 ; correct:=2 rs. w1 correct. ; jl. w3 complim. ; goto compute and set upper and jl. nextvar. ; goto take next variable ; formal array. compute upper and lower index formarr: al w1 4 ; correct:=4 rs. w1 correct. ; jl. w3 complim. ; goto compute and set upper and ; lower index. ; output declare formal array ; w0:=outputbyte ; w1:=index in restdescription ; w2:=identno rl. w2 lastid. ; bl w0 x2 ; outbyte type of array la. w0 cleardiv. ; jl. w3 (outbyte.) ; rl w1 x2+3 ; bl w0 x1 ; outbyte x2-rel for base word jl. w3 (outbyte.) ; bl w0 x2+5 ; outbyte x2-rel for parameter jl. w3 (outbyte.) ; rl. w0 upperix. ; outbyte uppenindex jl. w3 outword. ; rl. w0 lowerix. ; outbyte lowerindex jl. w3 outword. ; bl w0 x1-1 ; outbyte no of indices jl. w3 (outbyte.) ; al w1 x1-6 ; for i:=1 step 1 until no of dimensions do al w2 x1-1 ; checkix: rl w0 x1 ; outbyte index(i) jl. w3 outword. ; rs w0 x2 ; clear parameter no al w2 x2-1 ; in description al w1 x1-2 ; get next word in the index description sl. w1 (adjwork.) ; jl. checkix. ; rl. w2 lastid. ; rl w1 x2+3 ; bl w0 x1-1 ; ls w0 2 ; compute no of bytes used for declare wa. w0 const8. ; = no of indices*4+8 jl. w3 (outbyte.) ; outbyte number of bytes al w0 dformarr ; outbyte declare formal array jl. w3 (outbyte.) ; jl. nextvar. ; goto take next variable. \f ; fgs 1983.06.20 fortran, pass 4, page 43 ; identifier is a not formal zone normzone: rl w2 x2+3 ; x2:=address of restdescription rl w1 x2-7 ; x1:=identno for errorprocedure bl w0 x1+2 ; move externalno to restdescription rs w0 x2-7 ; compute length of description rl w1 x2-4 ; sharelength is in h6 wm. w1 share. ; descriptionlength is in h5 wa. w1 descr. ; wa. w1 avail. ; length of available area is in h53 rs w1 x2-5 ; move length to description rl w1 x2-2 ; buffer length in bytes= ls w1 2 ; buffer length*4 rs w1 x2-2 ; jl. nextvar. ; goto take next variable ; identifier is a formal zone formzone: rl w3 x2+3 ; w3:= address of restdescription rl w0 x3-1 ; w0:=no of zones sl w0 0 ; if no of zones is a constant jl. notadj. ; then goto declare formal zone rl w1 x3-3 ; check adjustable bound. w1:=identno rl w0 x1+1 ; if kind <> formal simple la. w0 clear1. ; & type <> integer se. w0 (check1.) ; then type error (406) jl. type1. ; bl w0 x1+2 ; set formalno in the restdescription rs w0 x3-3 ; ; output declare formal zone ; w0:=outputbyte ; w1:=index in restdescription ; w2:=identifiernumber notadj: rl. w2 lastid. ; rl w1 x2+3 ; bl w0 x1 ; outbyte x2-rel for base jl. w3 (outbyte.) ; bl w0 x2+5 ; outbyte x2-eel for param jl. w3 (outbyte.) ; bl w0 x1-1 ; outbytte no of zones jl. w3 (outbyte.) ; bl w0 x1-2 ; outbyte x2-rel for no of zones jl. w3 (outbyte.) ; al w0 dformzon ; outbyte declare formal zone jl. w3 (outbyte.) ; jl. nextvar. ; go to take next variable ;identifier is external zone exterzon: bl w0 x2 ; la. w0 cleardiv. ; if type<>external zone(7) se w0 7 ; jl. specerr. ; then error bl w0 x2+4 ; outbyte(external number) jl. w3 (outbyte.) ; bl w0 (x2+3) ; outbyte(x2-rel for basis addr) jl. w3 (outbyte.) ; al w0 dextzone ; outbyte declare external zone jl. w3 (outbyte.) ; jl. nextvar. ; go to take next variable \f ; rc 3.1.70 fortran, pass 4, page 44 ; identifier is a commonname comname: rs. w2 lastid. ; save identno al w0 0 ; commonlength:=0 rs. w0 length. ; rl w2 x2+5 ; w2:=identno for first in commonlist bl w0 x2+1 ; w0:=kind for first in common list hs. w0 lastkind. ; nextname: rl w0 x2+5 ; save chain to next rs. w0 lasticom. ; in common list bl. w1 lastkind. ; if kind=30 then sn w1 30 ; jl. type2. ; go to error bl w0 x2+1 ; w1:=kind of list element sn w0 4 ; if kind = simple jl. comsimp. ; then goto comsimp sn w0 10 ; if kind = array jl. comdim. ; then goto comm9ndimension ; variable is zone se w1 16 ; if lastkind<>zoncommon jl. type2. ; then type error rl. w1 lastfrie. ; get area for description of the rl. w0 lastid. ; equivalence, 3 word rs w0 x1 ; set chain to common name rs w1 x2+5 ; set address for the equivalence description jl. w3 restdes4. ; make rest description rl w1 x2+3 ; correct commonlength: bl w0 x1-1 ; w0:=no of zones sn w0 0 ; if no of zones = 0 al w0 1 ; length:=length+ rl w3 x1-4 ; no of zones*(length of descript wa w3 x1-2 ; +bufferlength) wm w0 6 rs. w0 length. ; al w0 30 ; hs. w0 lastkind. ; lastkind = 30 jl. nextcha. ; goto get next commonelement in list \f ; rc 3.1.70 fortran, pass 4, page 45 ; variable is common simpel comsimp: rl. w0 lastkind. ; rl. w0 lastid. ; set chain to commonname rs w0 x2+5 ; rl. w0 length. ; bytenumber in the common is set rs w0 x2+3 ; jl. w3 typeleng. ; commonlength = commonlength sn w1 1 ; if logical then al w1 x1+1 ; save place for a wod wa w0 3 ; + length of the simpel variable rs. w0 length. ; jl. nextcha. ; goto get next common element in list ; variable is common array comdim: rl. w0 lastkind. ; rl. w1 lastfrie. ; get area for description of the rs w1 x2+5 ; equivalence, 2 words rl. w0 lastid. ; rs w0 x1 ; set chain to the common name rl. w0 length. ; set bytenumber in the common for rs w0 x1-2 ; array(1,1,1) rl w3 x2+3 ; commonlength:= commonlength+upperindex wa w0 x3-2 ; ws w0 x3-4 ; - lowerindex rl w3 1 ; if commonlength is odd sz w3 1 ; then commonlength = al w3 x3+1 ; commonlength + 1 rs. w3 length. ; jl. w3 restdes4. ; make rest description ; get next element in the common list nextcha: bl w0 x2 ; equivalenced:=1 lo. loos. ; hs w0 x2 ; rl. w2 lasticom. ; w2:=address of the next identifier se w2 0 ; if chain <> 0 jl. nextname. ; then goto next in common list ; end of a common rl. w2 lastid. ; set vinderbit to 1 bl w0 x2 ; lo. winn. ; hs w0 x2 ; rl. w1 lastfrie. ; get address for chain to equiv. rs w1 x2+3 ; description, 2 words(w1) rl. w3 length. ; set length of common rs w3 x1 ; jl. w3 restdes4. ; make rest description jl. nextvara. ; goto take next variable \f ; rc 3.1.70 fortran, pass 4, page 46 ; end equivalence ; 1. compute x2-rel for local ; simpel winner, declare local ; array not looser, compute ; real parts for commons ; find kind of loosers ; 2. compute relative commonno and commenrel for ; for common variables. ;, declare local array for looser and local ; zone for not looser. ; 3. compute real commonno for normal com- ; monlist and generate the byte normal ; commonlist. ; 4. compute real commonno for zone common ; list and generate the byte zone common ; list ; 5. transform kind and declare common array ; and common zone. ; 6. generate the byte datalist. endequiv = k-e0 ; al w0 0 ; w2:= index in identifiertable rs. w0 arrbase. ; rl. w2 idbase. ; for i:= 1 step 1 until no of variables do contin0: rs. w2 lastid. ;; bl w1 x2+1 ; sn w1 2 ; if kind = simpel local (2) than jl. simploc. ; action for simpel local not looser sn w1 8 ; if kind = array local (8) then jl. arrloc. ; action for array local not looser sn w1 26 ; if kind= common (26) then jl. comm. ; compute real part of commen sn w1 32 ; if kind = simp eq array then jl. simeqdim. ; find kind of simpel nextvar0: rl. w2 lastid. ; al w2 x2+6 ; se. w2 (firstfri.); jl. contin0. ; rl. w2 idbase. ; for i:=1 step 1 until no of variables do contin2: rs. w2 lastid. ; bl w1 x2+1 ; goto action(kind) ls w1 -1 ; rs. w2 lastid. ; save identno bl. w1 x1+kindact2. ; jl. x1+base. ; nextvar1: rl. w2 lastid. ; reset identno al w2 x2+6 ; identno:=identno+1 se. w2 (firstfri.) ; if identno < no of identifiers jl. contin2. ; then goto continue. ; compute real commonno for normal commonlist al w0 0 ; rs. w0 noelem. ; no of elements in common:=0 rl. w2 idbase. ; contin3: rs. w2 lastid. ; save identno bl w1 x2+1 ; sn w1 4 ; if kind=4 or jl. comtest. ; se w1 10 ; kind=10 or sn w1 16 ; kind=16 then jl. comtest. ; goto commontest se w1 26 ; if kind<>commonname(26) jl. nextvar3. ; then take next variable rl w1 x2+5 ; if kind(first in commonlist)= bl w1 x1+1 ; zonecommon(16) se w1 16 ; then goto take next variable jl. w3 transcom. ; compute real commonnumber \f ; rc 4.6.70 fortran, pass 4, page 47 nextvar3: rl. w2 lastid. ; reset identno al w2 x2+6 ; identno:=identno+1 se. w2 (firstfri.) ; if identno < no of identifiers jl. contin3. ; then goto continue rl. w0 noelem. ; outbyte number of commons jl. w3 (outbyte.) ; rl. w1 noelem. ; outbyte number of bytes in the byte wm. w1 const5. ; = no of commons*5 + 1 al w0 x1+1 ; jl. w3 (outbyte.) ; al w0 almcom ; outbyte alm common list jl. w3 (outbyte.) ; \f ; rc 3.1.70 fortran, pass 4, page 48 ; for i:=1 step 1 until no.of variables ; compute real comno for zone common name ; output(zone common list) al w0 0 ; rs. w0 noelem. ; no.of elements:= rs. w0 nobytes. ; no.of bytes:=0 rl. w2 idbase. ; w2:=index in identifier table contin4: rs. w2 lastid. ; bl w1 x2+1 ; for i:=1 step 1 until no.of variables se w1 26 ; do if kind <> common name (26) jl. nextvar4. ; then take next variable rl w1 x2+5 ; if kind(first in common list) <> bl w1 x1+1 ; zone common (16) then take next se w1 16 ; variable jl. nextvar4. ; jl. w3 transcom. ; compute real comno and output rl. w2 lastid. rl w2 x2+5 ; w2:=first in comlist rl w2 x2+3 ; w2:=address of zone description jl. w3 outzone. ; outbyte description of zone al w1 10 ;no of bytes = no of bytes + 10 wa. w1 nobytes. ; rs. w1 nobytes. ; nextvar4: rl. w2 lastid. ; identno:=identno + 1 al w2 x2+6 ; if not last identifier se. w2 (firstfri.); then continue jl. contin4. ; \f ; rc 3.1.70 fortran, pass 4, page 49 rl. w0 noelem. ; outbyte(no.of zone commons) jl. w3 (outbyte.) ; rl. w1 nobytes. ; outbyte(no.of bytes) al w0 x1+1 ; jl. w3 (outbyte.) ; al w0 zoncom ; outbyte(zone common list) jl. w3 (outbyte.) ; ; for i:=1 step 1 until no.of variables do ; transform kind ; set correct commonno ; declare common array and zone rl. w2 idbase. ; w2:=index in identifier table contin5: rs. w2 lastid. ; bl w1 x2+1 ; make actions on kind sn w1 4 ; 4 jl. simplcom. ; se w1 10 ; 10 sn w1 16 ; 16 jl. arzoncom. ; nextvar5: rl. w2 lastid. ; newkind:=trankind(old kind) bl w1 x2+1 ; ls w1 -1 ; bl. w1 x1+newkind. ; hs w1 x2+1 ; al w2 x2+6 ; identno:=identno + 1 se. w2 (firstfri.); if identno < no.of identifiers jl. contin5. ; then goto take next variable ; for i:=1 step 1 until no.of variables ; do al w0 0 ; if in data then outbyte rs. w0 nobytes. ; no.of bytes:=0 rs. w0 noelem. ; no.of elements:=0 rl. w2 idbase. ; contin6: rs. w2 lastid. ; w2:=index in identifier table bl w1 x2 ; if varialbe not in data so. w1 (datastm.) ; then goto next varialbe jl. nextvar6. ; bl w1 x2+1 ; if kind = trouble (16) sn w1 16 ; jl. nextvar6. ; then goto next variable jl. w3 getidno. ; outbyte identnummer(w2) rl. w3 noelem. ; no.of elements:= al w3 x3+1 ; no.of elements + 1 rs. w3 noelem. ; se w1 2 ; if kind <> simpel (2) then goto array jl. array. ; jl. w3 simpcomd. ; outbyte(descr of simp common) rl. w3 nobytes. ; no.of bytes:= al w3 x3+4 ; no.of bytes + 4 rs. w3 nobytes. jl. nextvar6. ; goto next variable array: rl w1 x2+3 ; w1=restdescription rl w0 x1-3 ; compute length of array ws w0 x1-5 ; =(upperix-lowerix)/type bl w1 x2 ; la. w1 cleardiv. ; bl. w1 x1+typshift. ; ac w1 x1 ; ls w0 x1 ; jl. w3 outword. ; outbyte (length of array) jl. w3 arraydes. ; outbyte(descr of array) rl. w1 bytes. ; al w1 x1+5 ; wa. w1 nobytes. ; no.of bytes:= rs. w1 nobytes. ; no.of bytes + w1 nextvar6: rl. w2 lastid. ; al w2 x2+6 ; identno:=identno + 1 se. w2 (firstfri.); if identno < no.of identifiers jl. contin6. ; then take next variable \f ; rc 24.2.72 fortran, pass 4, page 50 rl. w0 noelem. ; outbyte(no.of identifiers in jl. w3 (outbyte.) ; datalist) rl. w1 nobytes. ; outbyte(no.of bytes in the descr) al w0 x1+1 ; jl. w3 (outbyte.) ; al w0 datalist ; outbyte(data list) jl. w3 (outbyte.) ; rl. w1 prstep. ; identifier action:= rs. w1 identact. ; in program part al w0 endstm0 ; set end statement action hs. w0 endstat. ; in program part al w0 listlft ; -set liste left action hs. w0 listelft. ; in program part al w0 copyone ; reset liste right hs. w0 listrigh. ; action al w0 copytwo ; reset integer hs. w0 intconst. ; constant action al w0 1 ; state := in program part (=1) hs. w0 state. ; jl. nextbyt. ; goto read next input byte ; variable(i) is simpel local, not equi- ; valenced. compute x2-relative for the ; variable. simploc: al w0 0 ; displace = 0 rs. w0 displace. ; bl w0 x2 ; sz. w0 (loos.) ; if variable is looser jl. w3 simwin. ; then find new kind so. w0 (winn.) ; if identifier not equiv. jl. nextvar0. ; then go to next identifier jl. w3 locx2rel. ; get x2-rel for simpel jl. nextvar0. ; goto next variable ; variable(i) is simple common, compute ; comno and comrel simpcom: jl. w3 typeleng. ; w1 = no of bytes for the identifier se w1 1 ; if logical place a word al w1 x1-1 wa w1 x2+3 ; w1:=displacement + type al w0 x1 ; jl. w3 comadr. ; w0:=rel; w1:=comno hs w1 x2+2 ; hs w0 x2+3 ; jl. nextvar1. ; goto next variable \f ; rc 3.1.70 fortran, pass 4, page 51 ; variable(i) is array local, not equi- ; valenced. generate declare local array arrloc: bl w0 x2 ; if equivalenced then goto next variable sz. w0 (loos.) ; jl. alooser. ; rl w2 x2+3 ; w2:=address of rest descr bl w0 x2 ; outbyte(x2-rel for baseword) jl. w3 (outbyte.) ; rl. w0 arrbase. ; outbyte(address of array(0,0,...) ws w0 x2-5 ; rel to array base = jl. w3 outword. ; array base + lowerix) al w0 dlocarr ; outbyte(declare local array) jl. w3 (outbyte.) ; rl. w1 lastid. ; if array is winner bl w0 x1 ; then goto vinder sz. w0 (winn.) ; jl. winner. ; rl. w3 arrbase. ; array base:= wa w3 x2-2 ; array base - upperix + lowerix ws w3 x2-4 ; sz w3 1 ; if arrbase is odd then al w3 x3+1 ; arrbase = arrbase + 1 rs. w3 arrbase. ; jl. nextvar0. ; goto next variable winner: rl. w2 arrbase. ; array is a winner: rl. w0 arrbase. ; array base:= array base + wa w0 x1+5 ; length of area rs. w0 arrbase. ; rs w2 x1+5 ; save arrbase for winner jl. nextvar0. ; goto next variable ; variable is make evt new ; description of variable alooser: al w0 0 ; displace = 0 rs. w0 displace. ; jl. w3 getarrwi. ; jl. nextvar0. ; comm: rl w1 x2+3 ; w1 = rest description rl w3 x1 ; al w3 x3-1 ; ls w3 -11 ; compute no of common parts al w3 x3+1 ; = (length-1)/2**11+1 hs w3 x1-2 ; jl. nextvar0. ; ; variable is simpel equivalenced ; to dimension simeqdim: rl w0 x2+3 ; rs. w0 displace. ; rl w2 x2+5 ; jl. w3 simparra. ; get new kind and displace jl. nextvar0. ; \f ; rc 4.6.70 fortran, pass 4, page 52 ; variable is simpel local simloclo: bl w1 x2 ; so. w1 (loos.) ; if variable not looser jl. nextvar1. ; then go to next variable jl. w3 typeleng. ; w1 = length of looser rl w3 x2+5 ; w3 = winner ws w1 x3+5 ; bl w3 x3+2 ; x2-rel for looser = wa w3 3 ; x2-rel for winner -(length hs w3 x2+2 ; of winner-length of looser) jl. nextvar1. ; go to next variable \f ; rc.4.6.70 fortran,pass 4,page 53 ; variable is array local arrloclo: bl w1 x2 ; so. w1 (loos.) ; if variable not looser jl. nextvar1. ; then go to next variable rl w1 x2+3 ; w1 = rest description bl w0 x1 ; jl. w3 (outbyte.) ; outbyte(x2-rel for baseword) rl w2 x2+5 ; w2 = equivalence rest rl w0 x2-2 ; outbyte(addressof array(0,0..0) ws w0 x1-5 ; rel to arrbase = rl w2 x2 ; arraybase of winner + wa w0 x2+5 ; displacement - lowerix) jl. w3 outword. ; al w0 dlocarr ; jl. w3 (outbyte.) ; outbyte(declare local array) jl. nextvar1. ; go to next variable ; variable (i) is a common array name. ; compute comno and comrelfor arr(0,0 ...) arrcom: rl w1 x2+5 ; w0:=displacement for arr(0) rl w0 x1-2 ; =displacement arr(1)-lowerix-1 rl w1 x2+3 rl w1 x1-4 al w1 x1+1 ws w0 3 rl w2 x2+ 5 jl. w3 comadr. ; w0:=rel, w1:=comno checkno: hs w0 x2-2 ; hs w1 x2-3 ; rl w3 x2 ; w3 =common name sl w1 0 ; if comno > 0 jl. nextvar1. ; then goto next variable ac w1 x1 ; w1:=abs(comno) rl w3 x3+3 ; w3:=addr of descr of length bl w0 x3-3 ; w0:=no.of fictive parts sh w0 x1 ; if no.of fictive parts < comno hs w1 x3-3 ; then no.of fictive parts:=comno jl. nextvar1. ; goto next variable \f ; rc 28.03.73 fortran, pass 4, page 54 ; varialbe(i) is local zone. generate ; declare local zone zonloc: rl w2 x2+3 ; w2:=address of rest descr bl w0 x2 ; jl. w3 (outbyte.) ; outbyte(x2-rel for baseword) rl. w1 arrbase. ; al w0 x1+recbasel+1; w0:=record base bl w1 x2-1 ; rs. w1 zonno. ; se w1 0 ; if no.of zones > 0 then ws. w0 descr. ; jl. w3 outword. ; outbyte(record base) jl. w3 outzone. ; outbyte description of zone al w0 dloczone ; jl. w3 (outbyte.) ; outbyte(declare local zone) rl w1 x2-4 ; zone length:= wa w1 x2-2 ; (buffer length + rl. w0 zonno. ; length of descr) se w0 0 ; *(if no.of zones > 0 then wm. w1 zonno. ; no.of zones else 1) wa. w1 arrbase. ; array base:=array base + zone length rs. w1 arrbase. ; jl. nextvar1. ; goto next variable ; variable(i) is zonecommon. compute ; commonno and relative for record base zoncommn: rl w1 x2+5 ; w1:=address of equiv descr rl w2 x2+3 ; w2:=address of rest descr rl w0 x1-2 ; w0:=displ of descr(1) wa. w0 recbase. ; w0:=displacement of record base bl w3 x2-1 ; if no.of zones > 0 se w3 0 ; then w0:=w0-length of full descr ws. w0 descr. ; rs. w1 savew1. ; w0:=rel in common jl. w3 comadr. ; w1:=commonno rl. w2 savew1. ; jl. checkno. ; go to set and check comno ; simpel equivalenced to array dimeqsim: rl w0 x2+3 ; jl. w3 typeleng. ; wa w0 3 ; rl w1 x2+5 ; index = rl w1 x1+3 ; displacement + lowerix + type length wa w0 x1-5 ; rs w0 x2+3 ; bl w0 x1 ; hs w0 x2+4 ; get x2-rel for base jl. nextvar1. ; go to next variable ; simpel equiv. to zone zoneqsim: rl w0 x2+3 ; jl. w3 typeleng. ; zone record = wa w0 3 ; displacement + typelength rs w0 x2+3 ; rl w2 x2+5 ; w2 = equivalence rest jl. setx2rel. ; ; array equivalenced to zone zoneqarr: rl w3 x2+3 ; w3 = rest description rl w2 x2+5 ; displace = record(0) - rl w1 x2-3 ; ws w1 x3-5 ; array(0,0,..,0) = rs w1 x2-3 ; displacement - lowerrix setx2rel: bl w0 x2-1 ; if simpel equiv. to zone sn w0 0 ; and x2-rel set before jl. nextvar1. ; then go to next variable rl w1 x2 ; rl w1 x1+3 ; get x2-rel for zone base bz w0 x1 ; rs w0 x2 ; jl. nextvar1. ; \f ; rc 3.1.70 fortran, pass 4, page 55 ; simpel common, set correct commonno. simplcom: rl w1 x2+5 ; comno:= rl w1 x1+3 ; comno for first in real part bl w1 x1-2 ; +comno ba w1 x2+2 ; hs w1 x2+2 ; jl. nextvar5. ; goto take next variable ; array common, output declare common arr ; zone common, declare common zone arzoncom: bl w0 (x2+2) ; outbyte(x2-rel for baseword) jl. w3 (outbyte.) ; jl. w3 outcomno. ; outbyte(comno, comrel) bl w1 x2+1 ; if kind = 10 then al w0 dcomarr ; outbyte(declare common array) sn w1 16 ; if kind = 16 then al w0 dzoncom ; outbyte(declare common zone) jl. w3 (outbyte.) ; jl. nextvar5. ; goto take next variable comtest: rl w3 x2+5 ; se w1 4 ; get common address rl w3 x3 ; bl w3 x3+1 ; al w0 30 ; sn w3 30 ; if kind of common=30 then hs w0 x2+1 ; kind fo common variable=30 jl. nextvar3. ; go to next variable \f ; fgs 1983.06.20 fortran,pass 4, page 57 ; work variables for equivalence lasteq:0 ; address of last equivalenced variable lastdisp:0 ; displacement for last equivalenced variable displace:0 ; displacement for actual equivalenced variable zonedisp:0 ; zonedescriptor displacement multrang:0 ; product of ranges range:0 ; range of index indexnum:0 ; number of indices in equivalence statements winn: 2.010000000000 ; to get the bit winner in equivalence loos: 2.100000000000 ; to get the bit looser inequivalence clearwin: 2.101111111111 ; to clear the bit winner cleardi: 2.000000001111 ; to get the type from the identifier constan4: 4 ; the constant 4 constan6: 6 ; the constant 6 share: sharel ; length of sharedescriptors descr: descripl ; length of zonedescriptors avail: availzar ; length of available area in front of zbuffer lim:0 ; array lim upper:0 ; place for upperixfor array lower:0 ; place for lowerix for array lastiden:0 ; address of place for lastident lastfri:0 ; address of place for lastfire byte savew3eq:0 ; work savew3q:0 ; work idst: ; stepping stones lastbyt: ; arrayidx: jl. arrindex. ; arrayrig: jl. aright. ; nextb: jl. nextbyt. ; stepping stone equival=k-e0 ; equivalence al w0 0 ; rs. w0 lasteq. ; lastequivalenced=0 al w0 indtrou ; set error action in hs. w0 listelft. ; liste left al. w0 equivar. ; identifier action= rs. w0 identact. ; equivalenced variable jl. nextb. ; equivar: bl w1 x2+1 ; ls w1 -1 ; bl. w1 x1+eqaction. ; go to action on kind jl. x1+base. ; for equivalenced variable ; errors in equivalence equiverr: jl. w3 err411. ; equivalence is impossible jl. errorac. ; go to error action indtroub: jl. w3 err412. ; index missing for array or zone jl. w3 (repinp.) ; repeat input byte jl. errorac. ; or it exists for simpel indexerr: jl. w3 err413. ; index error for array jl. errorac. ; go to error action arzonerr: jl. w3 err414. ; array can not be equiv to zone jl. errorac. ; go to error action arcomerr: jl. w3 err415. ; array can not be equiv to comm errorac: al. w0 nextb. ; am. intable. ; identifier action = no action rs w0 identact-intable ; al w0 deleteix ; hs. w0 intconst. ; integer action = nothing al w0 nextby ; hs. w0 listelft. ; liste left and liste right hs. w0 listrigh. ; action = nothing jl. nextb. ; go to read next byte nextby = nextbyt-e0 \f ; rc 4.6.70 fortran, pass 4, page 58 ;equivalenced variable ; is not referenced notrefeq: jl. w3 (inbyte.) ; read implicit type al w1 x2-14 ; type=implicit type -14 rl. w2 (lastiden.) ; al w0 2 ; hs w0 x2+1 ; set kind to simpel local jl. simpwinn. ; make simpel winner ; equivalenced variable ; is simpel simpeleq: al w0 0 ; rs. w0 displace. ; displacement=0 bl w1 x2 ; sz. w1 (winn. ) ; if variable is winner jl. equiv. ; then make the equivalence so. w1 (loos.) ; if variable not equivalenced jl. simpwinn. ; before make it winner jl. w3 simwin. ; if looser then get winner jl. equiv. ; go to make equivalence ; equivalenced variable is ; simpel common simcomeq: rl w0 x2+3 ; displace = rs. w0 displace. ; displacement in common rl w2 x2+5 ; w2 = common jl. equiv. ; go to make equivalence ; equivalenced variable is ; dimension local arrayeq: al w0 arigh ; set liste right action hs. w0 listrigh. ; al w0 arrindx ; set integer constant action hs. w0 intconst. ; to array index action al w1 listleft ; jl. w3 readbyte. ; read byte liste left rl. w2 (lastiden.) ; rl w2 x2+3 ; w2= rest description bl w1 x2-1 ; al w1 x1-1 ; test lim= ls w1 1 ; (no of index-1)*2+6 wa. w1 constan6. ; al w3 x2 ; ws w3 3 ; rs. w3 lim. ; al w1 0 ; rs. w1 indexnum. ; number of indices := 0 al w1 1 ; rs. w1 multrang. ; multiple range=1 rl w1 x2-3 ; rs. w1 upper. ; get upperix rl w1 x2-5 ; rs. w1 lower. ; get lowerix al w1 x2-4 ; rs. w1 range. ; range = addr of first index - 2 jl. nextb. ; go to next input byte \f ; rc 4.6.70 fortran, pass 4,page 59 ; array index arrindex: jl. w3 readindx. ; read array index(i)=w0 rl. w1 indexnum. ; al w1 x1+1 ; rs. w1 indexnum. ; increase number of indices simindex: rl. w1 multrang. ; sn w1 1 ; if first index then jump jl. firstind. ; wm w0 3 ; rl. w1 displace. ; displacement=displace wa w0 3 ; +index(i)*multrang firstind: rs. w0 displace. ; rl. w1 range. ; al w1 x1-2 ; range=rangeof index(i) rs. w1 range. ; rl. w0 multrang. ; rl. w2 (range.) ; multrange= multrange wm w0 5 ; * range of index(i-1) rs. w0 multrang. ; jl. nextb. ; ; right list after array index aright: rl. w0 range. ; se. w0 (lim.) ; if not right no of indices jl. checkdim. ; go to check dimension rl. w0 displace. ; rl. w2 (lastiden.) ; w2= identifier bl w1 x2 ; la. w1 cleardi. ; bl. w1 x1+typshift. ; displacement ls w0 x1 ; displacement*type sh. w0 (upper. ) ; if displacement> upperix sh. w0 (lower. ) ; or displacement<lowerix jl. indexerr. ; go to index error ws. w0 lower. ; displace = index in bytes bl. w1 x1+bytshift. ; ws w0 3 ; rs. w0 displace. ; from array(1,1,....,1) rs. w0 range. ; save index displacement bl w1 x2 ; sz. w1 (winn. ) ; if array is winner jl. equiv. ; then make the equivalence so. w1 (loos.) ; if not equivalenced before jl. arrwinn. ; make array winner jl. w3 getarrwi. ; if looser then get winner rl w0 x1-2 ; displacement of array(1.1..) ws. w0 range. ; = displace - index displace rs w0 x1-2 ; jl. equiv. ; make the equivalence checkdim: rl. w0 indexnum. ; se w0 1 ; if number of indices <> 1 then jl. indexerr. ; goto index error jl. w3 (repinp.) ; jl. simindex. ; w0=1; goto simulate index \f ; rc 4.6.70 fortran, pass 4, page 60 ; equivalenced variable was zone zoneeq: al w1 listleft ; jl. w3 readbyte. ; read byte liste left al w1 integcon ; jl. w3 readbyte. ; read byte integer constant al w0 0 ; rs. w0 zonedisp. ; zonedisplacement=0 rl. w2 (lastiden.) ; rl w3 x2+3 ; bl w0 x3-1 ; if no of zones = 0 tjen sn w0 0 ; jl. onedim. ; go to one dimension zone rs. w0 savew3q. ; jl. w3 readindx. ; wo=read zone index sh. w0 (savew3q.) ; if zone index> no of zones sh w0 0 ; orzone index < 0 then jl. indexerr. ; go to index error wm. w0 descr. ; zonedescriptor displacement= rs. w0 zonedisp. ; zoneindex*length of descriptors jl. w3 readbyte. ; read byte integer constant onedim: jl. w3 readindx. ; w0= read record index ls w0 2 ;= al w1 listrigt ; jl. w3 readbyte. ; read byte liste right rl. w2 (lastiden.) ; rl w1 x2+3 ; if record index> sh w0 (x1-3) ; buffer length then sh w0 0 ; jl. indexerr. ; index error ws. w0 constan4. ; displacement=(displacement-1) rs. w0 displace. ; * type bl w1 x2 ; if identifier is not so. w1 (loos.) ; looser then lo. w1 winn. ; make it winner hs w1 x2 ; jl. equiv. ; make the equivalence ; equivalenced variable is ; simpel equival to array simarreq: rl w0 x2+3 ; rs. w0 displace. ; rl w2 x2+5 ; w2= address of array jl. w3 simparra. ; get winner for array jl. equiv. ; make the equivalence ; equivalenced variable is ; simpel equival to zone simzoneq: rl w0 x2+3 ; rs. w0 displace. ; rl w2 x2+5 ; w2=equivalence rest rl w0 x2-2 ; get zonedescriptor displace rs. w0 zonedisp. ; rl w2 x2 ; w2 = address of zone jl. equiv. ; make the equivalence \f ; rc 4.6.70 fortran, pass 4, page 60a ; read byte in equivalence mode ; for array or zone readbyte: rs. w3 savew3eq. ; w1 = wanted byte repread: jl. w3 (inbyte.) ; if input byte = wanted byte sn w2 x1 ; then return jl. (savew3eq.); se w2 endlin ; if input byte <> end line jl. indtroub. ; then trouble jl. w3 (linecnt.) ; outbyte(new line) al w0 x2 ; jl. w3 (outbyte.) ; jl. repread. ; go to read next byte \f ; rc 4.6.70 fortran, pass 4, page 61 ; make a simpel local winner simpwinn: lo. w1 winn. ; w2 = identifier, w1= type al w1 x1+1<9 ; explicit referenced = 1 hs w1 x2 ; set winner bit jl. w3 typeleng. ; sn w1 1 ; if variable is logical jl. equiverr. ; then error rs w1 x2+5 ; set length of variable in bytes jl. equiv. ; go to make the equivalence ; make dim local winner ; w2 = identifier, w1 = type arrwinn: lo. w1 winn. ; hs w1 x2 ; set winner bit rl. w1 upper. ; ws. w1 lower. ; length of array in bytes rs w1 x2+5 ; = upperix- lowerix jl. w3 typeleng. ; sn w1 1 ; if type = logical then jl. equiverr. ; equivalence error jl. equiv. ; goto make the equivalence ; read index in equivalence statement readindx: rs. w3 savew3eq. ; save return address al w0 vanoper ; jl. w3 (outbyte.) ; outbyte vanished operand jl. w3 (inbyte.) ; read integer constant hs w2 0 ; w0 = index jl. w3 (inbyte.) ; hs w2 1 ; jl. (savew3eq.) ; go to return ; make simpel local looser simploos: bl w0 x2 ; w2 = simpel, w1 = winner la. w0 clearwin. ; clear winner bit lo. w0 loos. ; set looser bit hs w0 x2 ; rs w1 x2+5 ; set reference to winner rl. w0 lastdisp. ; rs w0 x2+3 ; set displacement in simpel rs. w1 lasteq. ; set lastequiv to winner jl x3 ; go to return ; make local array looser arrloos: rs. w3 savew3eq. ; w2 = array, w1 = winner bl w0 x2 ; la. w0 clearwin. ; clear winner bit lo. w0 loos. ; set looser bit hs w0 x2 ; rl. w3 (lastfri.) ; rs w3 x2+5 ; set chain to equival rest al w0 x3-6 rs. w3 savew3q. ; lastfrie = lastfrie - 6 jl. w3 stackpl. ; test for place instack rl. w3 savew3q. ; rs w1 x3 ; set chain to winner rl. w0 displace. ; set displacement rs w0 x3-2 ; rs. w1 lasteq. ; set winner in last equival jl. (savew3eq.) ; go to return \f ; rc 4.6.70 fortran, pass 4, page 62 ; a variable in an equivalence ; statement is read equiv: rl. w1 lasteq. ; se w1 0 ;if second in an equivalence jl. makeeq. ; then make the equivalence rs. w2 lasteq. ; last equivalenced=variable rl. w1 displace. ; last displacement= rs. w1 lastdisp. ; displacement jl. nextb. ; go to next input byte ; w1=lasteq, w2=lastid makeeq: rs. w2 (lastiden.); set winner in lastidentifier sn. w2 (lasteq.) ; iflasteq=lastid then jl. equiverr. ; go to equivalence error bl w0 x2+1 ; if kind of 2. variable> bl w3 x1+1 ; sh w0 (7) ; kind of 1. variable then jl. nochange. ; bl w0 x1+1 ; rl. w1 displace. ; set displace= lastdisplace rl. w2 lastdisp. ; last displace = displace rs. w1 lastdisp. ; rs. w2 displace. ; rl. w1 (lastiden.) ; w1 = winner rl. w2 lasteq. ; w2 = looser nochange: sl w0 14 ; if kind of looser>= kind of jl. equiverr. ; zone then equivalence error bl w3 x1+1 ; w3= kind of winner w0 = kind of looser sl w0 8 ; if looser is an array then al w3 x3+1 ;kind of winner= kind of winner+1 bl. w3 x3+eqtable. ; jl. x3+base. ; go to equivalence action ; simpel local equivalenced to ; simpel local ; w1= 1. variable, w2= 2. variable simeqsim: rl w0 x1+5 ; sl w0 (x2+5) ; if length of 1. var< length jl. makeloos. ; of 2. var then change w1 and w2 rl. w1 (lastiden.) ; 1.var = w1= winner rl. w2 lasteq. ; 2. var = w2 = looser makeloos: jl. w3 simploos. ; set simpel local to looser jl. nextb. ; go to read next input byte ; simpel local equivalenced to ; dimension local ; w1=dim local (winner) ; w2= simpel local (looser) simeqarr: rl w0 x2+5 ; wa. w0 lastdisp. ; if length of array < sl w0 (x1+5) ; index+length of simpel rs w0 x1+5 ; then length of array=new length al w0 32 ; set kind of simpel to hs w0 x2+1 ; simpel equival to array (32) jl. w3 simploos. ; make simpel looser jl. nextb. ; go to next input byte \f ; rc 4.6 70 fortran, pass 4, page 63 ; simpel local equivalenced to ; local or common zone ; w1 = zone (winner) ; w2 = simpel local (looser) simeqzon: jl. w3 simploos. ; set simpel to looser al w0 34 ; set kind of simpel to hs w0 x2+1 ; simpel equivalenced to zone rl. w3 (lastfri.) ; make equivalence rest rs w3 x2+5 ; for looser two words rs w1 x3 ; set chain to winner rl. w0 zonedisp. ; rs w0 x3-3 ; set zonedescriptor displace al w1 x3 ; jl. w3 restdes4. ; make restdescription jl. nextb. ; go to read next byte ; simpel equivalenced to common ; w1 = common (winner) ; w2 = simpel local (looser) simeqcom: rl w0 x2+5 ; wa. w0 lastdisp. ; rl w3 x1+3 ; if length of common < length sl w0 (x3) ; of simpel + displacement rs w0 x3 ; then new length of common al w0 4 ; set kind of simpel local hs w0 x2+1 ; to simpel common (4) jl. w3 simploos. ; make simpel looser jl. nextb. ; go to read next input byte ; dim local equivalenced to ; dimension local ; w1 = 1. dim, w2= 2. dim arreqarr: rl. w3 lastdisp. ;displace=displace from ws. w3 displace. ; 1. array(1,..,1) to 2. array(1..1) sl w3 0 ;if displace < 0 then jl. setloos. ; ac w3 x3 ; displace = -displace rl. w0 displace. ;set displacement of winner rs. w0 lastdisp. ; in last displacement rl. w1 (lastiden.) ; w1 = winner rl. w2 lasteq. ; w2 = looser setloos: rs. w3 displace. ; wa w3 x2+5 ; if length of looser + displ sl w3 (x1+5) ; > length of winner then rs w3 x1+5 ; new length of winner jl. w3 arrloos. ; make looser array jl. nextb. ; go to read next intput byte \f ; rc 4.6.70 fortran, pass 4, page 64 ; dimension local equivalenced to ; local or dcommon zone ; w1 = zone (winner) ; w2 = dim local (looser) arreqzon: rl. w0 lastdisp. ; displace of array(1,1...,1) ws. w0 displace. ; = record index - array index sh w0 -1 ; if displacement < 0 then jl. arzonerr. ; error rs. w0 displace. ; al w0 36 ; set kind of array to hs w0 x2+1 ; array equivalenced to zone (36) jl. w3 arrloos. ; make array looser rl. w0 zonedisp. ; rl w3 x2+5 ; set zone descriptor displacement rs w0 x3-5 ; jl. nextb. ; read next input byte ; dimension local equivalenced to ; common w1 = common (winner) ; w2 = dim local (looser) arreqcom: rl. w0 lastdisp. ; disp of array(1,1..,1)in common ws. w0 displace. ; = common displ - array index sh w0 -1 ; if displacement < 0 then jl. arcomerr. ; go to error rs. w0 displace. ; wa w0 x2+5 ; if displacement + length rl w3 x1+3 ; of array > length of common sl w0 (x3) ; then rs w0 x3 ; new length of common al w0 10 ; set kind of array = hs w0 x2+1 ; common array (10) jl. w3 arrloos. ; make array looser jl. nextb. ; read next input byte \f ; rc 4.6.70 fortran,pass 4,page 65 ; get winner for simpel local ; w2 = identifier nextsimp: rl w2 x2+5 ; get next in chain bl w0 x2 ; sz. w0 (winn. ) ; if winner then jl. setdisp. ; go to set displaceand winner simwin: rl w1 x2+3 ; wa. w1 displace. ; displacement = displace rs. w1 displace. ; + displacement for next bl w1 x2+1 ; sh w1 2 ; if kind = simpel local (2) jl. nextsimp. ; then go to next in chain ; kind of w2 = simpel common(4), ; simpel eq array(32)or ; simpel eq zone(34), w1 = kind ; w2 = last before winner rl w2 x2+5 ; w2 = winner setdisp: rs. w3 savew3eq. ; save return address rl. w3 (lastiden.) ; w3 = looser rs w2 x3+5 ; set chain to winner rl. w0 displace. ; rs w0 x3+3 ; set displacement hs w1 x3+1 ; set kind sn w1 34 ; if kind = 34 then rl w2 x2 ; get chain to winner se w1 32 ; if not simpel eq array jl. (savew3eq.) ; then return rl. w3 savew3eq. ; simparra: rs. w3 savew3eq.; save return address bl w1 x2 ; sz. w1 (winn. ) ; if array is winner then jl. (savew3eq.) ; go to return jl. w3 arrwin. ; w2 = winner of array rl. w3 (lastiden.); bl w1 x2+1 ; w1 = kind of winner al w0 4 ; sn w1 26 ; if winner is common (26) hs w0 x3+1 ; then set kind to simpel common rl. w0 displace. ; rs w0 x3+3 ; set displacement rs w2 x3+5 ; set chain to winner se w1 36 ; jl. (savew3eq.) ;if winner is array eq to zone al w0 34 ; then kind = simpel eq zone hs w0 x3+1 ; rl. w1 (lastfri.) ; make equivalence reat rs w1 x3+5 ; rl w2 x2+5 ; w2 = rest description of array jl. w3 restdes4. ; make rest description rl w0 x2-4 ; rs w0 x1-2 ; set zone descriptor displ rl w2 x2 ; rs w2 x1 ; set chain to zone jl. (savew3eq.) ; go to return \f ; rc 4.6.70 fortran, pass 4,page 66 ; get winner for array local ; in equivalence chain nextarr: rl w2 x1 ; w2=next in chain bl w1 x2 ; sz. w1 (winn. ) ; if winner then jl x3 ; go to return arrwin: rl w1 x2+5 ; w1 = equivalence rest rl w0 x1-2 ; wa. w0 displace. ; displace = displace rs. w0 displace. ; + new displacement bl w0 x2+1 ; sn w0 36 ; if kind = array eq zone (36) jl x3 ; go to return jl. nextarr. ; else go to next in chain ; get winner for local array getarrwi: rs. w3 savew3eq. ; save return address jl. w3 arrwin. ; get winner for array bl w1 x2+1 ; w1 = kind of winner rl. w3 (lastiden.) ; w3 = identifier sn w1 26 ; if kind = common (26) al w1 10 ; then kind of identifier hs w1 x3+1 ; = 10(array in common) se w1 36 ; jl. notzone. ; if kind<> zone then jump rl w2 x2+5 ; w2=equivalence rest rl w1 x3+5 ;w3 = equivalence rest rl w0 x2-4 ; rs w0 x1-4 ; set zonedescriptor displ rl w2 x2 ; w2 = addres of zone notzone: rl w1 x3+5 ; rl. w0 displace. ; set displacement rs w0 x1-2 ; rs w2 x1 ; set chain to winner jl. (savew3eq.) ; go to return \f ; rc 3.1.70 fortran, pass 4, page 67 ; tables used by end declaration and ene equivalence h. kindact1: nextvar - base ; is used of the byte end declaration to nextvar - base ; the kind in the identifiertable nextvar - base ; nextvar - base ; normarr - base ; normarr - base ; formarr - base ; normzone- base ; normzone- base ; formzone- base ; nextvar - base ; nextvar - base ; nextvar - base ; nextvar - base exterzon- base ; nextvar - base ; kindact2: nextvar1- base ; is used of the byte end equivalence to give the simloclo- base ; action address depending on the simpcom - base ; the kind in the identifiertable nextvar1- base ; arrloclo- base ; arrcom - base ; nextvar1- base ; zonloc - base ; zoncommn- base ; nextvar1- base ; nextvar1- base ; nextvar1- base ; nextvar1- base ; nextvar1- base ; nextvar1- base ; nextvar1- base ; dimeqsim- base ; zoneqsim- base ; zoneqarr- base ; newkind: 0,1,2,3 ; transform the kind at end- 4,4,4,5,5,5 ; equivalence to the kind used 6,7,8,14, 5,16 ; in the prograa part 11,12,13 w. ; rc 4.6.70 fortran, pass 4, page 68 ;tables used by equivalence h. ; kind eqaction: notrefeq-base ; 0 notreferenced simpeleq-base ; 2 simpel local simcomeq-base ; 4 simpel common equiverr-base ; 6 simpel formal arrayeq -base ; 8 dimen 4cal arrayeq -base ; 10 dimension common equiverr-base ; 12 dimension formal zoneeq -base ; 14 zone local zoneeq -base ; 16 zone common equiverr-base ; 18 zone formal equiverr-base ; 20 external equiverr-base ; 22 external formal equiverr-base ; 24 entry name equiverr-base ; 26 common name equiverr-base ; 28 unused equiverr-base ; 30 trouble simarreq-base ; 32 simpel equival to array simzoneq-base ; 34 simpel equival to zone arrayeq -base ; 36 array equival to zone ; equivalence action table h. ; kind simpel array eqtable: nextbyt -base, nextbyt -base ; 0 simeqsim-base, simeqarr-base ; 2 nextbyt -base, nextbyt -base ; 4 nextbyt -base, nextbyt -base ; 6 simeqarr-base, arreqarr-base ; 8 nextbyt -base, nextbyt -base ; 10 nextbyt -base, nextbyt -base ; 12 simeqzon-base, arreqzon-base ; 14 simeqzon-base, arreqzon-base ; 16 nextbyt -base, nextbyt -base ; 18 nextbyt -base, nextbyt -base ; 20 nextbyt -base, nextbyt -base ; 22 nextbyt -base, nextbyt -base ; 24 simeqcom-base, arreqcom-base ; 26 nextbyt-base,nextbyt-base ; 28 preliminary correction nextbyt-base,nextbyt-base ; 30 priliminary correction w. \f ; rc 6.6.70 fortran,pass 4 ,page 69 idstart=k-idst psidst=-idstart lastbyte=k-lastbyt endp4=k-e0 e30 = e30 + endp4 ; length = length + length pass 4; i. e. m. rc 83.08.29 fortran, pass 4 ▶EOF◀