|
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: 69888 (0x11100) Types: TextFile Names: »ftnpass33tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »ftnpass33tx «
; rc4tran pass 3 ret 3.1.78 ; rc4tran pass 3 ret 10.7.70 ; rc4tran pass3 ret 30.6.70 ; rc4tran pass 3 ret 11.6.70 ; rc4tran pass3 ret 29-5 70 ; rc4tran pass 3 ret 6-5-70 ; rc4tran pass3 ret 21-4-70 ; rc4tran pass 3 ret 13-4-70 ; rc4tran ret 6-4-70 ;rc4tran pass3 26.11.69 ; rc4000 fortran pass3 start side s. a500 k= e0 w. i. pass3lng ; length of pass 3 h. inpa3, 3<1 ; entry, pass no no direction change ; definition of bases and symbols for ; input bytes ib1 = 42 ib2 = 43 ib3 = 44 ib4 = 45 ib5 = 46 ib6 = 47 ib7 = 48 ib8 = 50 ib9 = 51 ib10 = 52 ib11 = 54 ib12 = 55 ib13 = 104 ib14 = 106 ib15 = 107 ib16 = 512 endfori= ib13 confori= ib13+ 1 commai = ib11 cpconsi= ib7 + 1 dbconsi= ib7 begforci= ib12+ 47 begforoi= ib12+ 48 equi = ib12+2 functi = ib12+ 32 endstmi= ib12+17 enduni=ib1+0 iconsi= ib4 identi = ib16 inconsi= ib4 logicali= ib12+34 leftpi = ib8 lnconsi = ib5 lgconsi = ib3 minusi= ib10+ 1 plusi= ib10 \f ;rc4000 fortran ,pass 3 definitions side 2 ; definition of symbols for input bytes rightpi = ib9 rghtpi= rightpi reconsi = ib6 slashi = ib12+1 stari = ib12 toi = ib12+19 ; symbols for input classes docl= 19 identcl= 11 ; identificr constcl= 2 ; constant goasscl= 15 ; goto assigned speclim= identcl+ 1 ; limit for special stm types gcomcl = 14 ; goto computed arifcl = 16 ; aritm if rparcl= 10 logifcl= 16 ; logical if stmbase= identcl ; start of class values ; for key bytes identlim= 512 ; limit for ident byte values \f ;rc4000 fortran ,pass 3 definitions side 3 ; definition of bases for output byte ;values ob1 = 1 ob2 = ob1+9 ob3 = ob2+6 ob4 = ob3+3 ob5 = ob4+5 ob6 = ob5+8 ob7 = ob6+2 ob8 = ob7+3 ob9 = ob8+5 ob10= ob9+3 ob11= ob10+9 ob12= 60 ob13= ob12+8 ob14= ob13+2 ob15= ob14+9 ob16= ob15+9 ob17= ob16+2 ob18= ob17+4 ob19= ob18+6 ob20= ob19+2 ob21= ob20+1 ob22= ob21+3 ob23= ob22+7 ob24= ob23+2 ob25= ob24+6 ob26= ob25+1 \f ;rc4000 fortran, pass 3 definitions side 4 ;definition of symbols for output bytes ; and related symbols ariteq = ob17 program=ob1+6 bndleft = ob5 bndrght = ob5+1 blcom= 511 common = ob4+1 call = ob9+2 declabel= ob10+8 doterm = ob23+0 doterror= ob23+1 doeq = ob17+2 doinit = ob15 dyadic = 0 dyaminus = ob12+ 2 dostepc = ob15+6 datacon = ob16+1 datastar= ob16 data = ob7+1 endlogif= ob26+ 5 endcall= ob24+ 1 endata= ob26+ 6 endequiv= ob6+1 endecl = ob6 endstyp= ob26 endstm = ob8+4 eqlsleft= ob9 eqlsrght= ob9+1 equival = ob4 formlab= ob10+7 endifex = ob25 errorbas = e84- 1 ; create error code base for following passes extident= ob11+2 genform= ob11+ 0 giveupsf= ob5+7 implrea= ob3+1 icons = ob10+1 impinit= ob14 impstepc= ob14+6 implabel= ob3+2 \f ;rc4000 fortran ,pass 3 definitions side 5 ; definition of symbols for output bytes listcom = ob13 listleft = ob9 listrght = ob9+1 logfnc = ob1 logical= ob2 monadic = 1 nzspec = ob5+4 prepass= ob17+ 3 psfleft = ob5+5 psfrght = ob5+6 return= ob7+ 2 subrout= ob1+ 7 stop= ob22+ 4 spark= ob24+ 2 stmlab = ob10+6 trouble = ob11+3 vanopnd= ob26 zoneleft = ob5+2 zonerght = ob5+3 aritleft = ob24 aritrght = ob24+3 iorght = ob24+4 imprght = ob24+5 iocom = ob13+ 1 nbyt= 0 inexp= 1 inexpim= 2 inliva= 3 inlico= 4 inlibo= 5 qqq= 1<11 esm= 3<10 \f ;rc4000 fortran , pass 3 main control table (mct) side 1 ; state ,input , ibyte ,new state, action , obyte mbas: enx1: ent1 = enx1 - mbas ; program / entry qqq+nbyt , identi , entx , prgra , 0 enx2: ent2 = enx2-mbas ; subroutine ,function qqq+nbyt , identi ,ent2+5 , subra , 0 ;+5 esm+nbyt , leftpi ,ent2+10 , empa , 0 ; exp leftp or es ;+10 qqq+inliva , rightpi,entx , empa , 0 ; formal list enx3: ent3 = enx3 - mbas ; type qqq+nbyt , functi , ent2 , funca , logfnc ; type function identi , ent3+9 , type2a , 0 ; type list ;+9 esm+inliva, leftpi ,ent3+14 , outa , bndleft ; bound left ;+14 qqq+inlibo, rightpi,ent3+19 , type3a , bndrght ; bound right ; +19 esm+ nbyt, commai, ent3+9, empa, 0 enx4: ent4 = enx4 - mbas ; common qqq+nbyt , slashi , ent4+9 , empa , 0 ; / before co name identi , ent4+23 , blank1a, 0 ; slashes omitted ;state , input ibyte , new stat, action ,obyte , ;+9 qqq+nbyt, slashi , ent4+23 , blanka , 0 ; // for blank c identi , ent4+18 , outbta , 0 ; com name ;+18 qqq+nbyt, slashi , ent4+23 , empa , 0 ; / after co name ;+23 esm+inliva,slashi,ent4+9 , outa , common ; com name leftpi , ent4+32 , outa , bndleft ; bound lft in com ;+32 qqq+inlico,rightpi, ent4+37 , outa , bndrght ; bound right in com ;+37 esm+nbyt ,commai , ent4+23 , empa , 0 ; comma or es slashi , ent4+9 , outa , common ; new 1 for co name enx5: ent5 = enx5-mbas ; dimension qqq+nbyt ,identi , ent5+5 , outbta , 0 ; dimens name ;+5 qqq+nbyt ,leftpi , ent5+10 , outa , bndleft ; bound left ;+10 qqq+inlibo,rightpi, ent5+15 , outa , bndrght ; bound right ;+15 esm+nbyt , commai, ent5 , empa , 0 ; comma or es \f ;rc4000 fortran , pass 3 main control table (mct) side 3 ;state , input , ibyte ,new stat ,action , obyte enx6: ent6 =enx6-mbas ; zone qqq+nbyt , identi ,ent6+5 , outbta, 0 ; zone name ;+5 qqq+nbyt , leftpi ,ent6+18 , outa , zoneleft ; leftp in zone decl commai ,ent6 , outa , nzspec ; zone specification endstmi , 0 , zspeca, nzspec ;+18 qqq+nbyt , iconsi , ent6+23 , cskipa, 0 ; bufsize,skip comma ;+23 qqq+nbyt , iconsi , ent6+28 ,cskipa , 0 ; shares , skip comma ;+28 qqq+nbyt , identi , ent6+33 , outbta, 0 ; blockproc ;+33 qqq+nbyt , rightpi , ent6+38 , outa ,zonerght ; rightp in zone decl ;+38 esm+nbyt , commai , ent6 , empa , 0 ; comma or es enx7: ent7 = enx7 - mbas ; external qqq+inliva, endstmi , 0 , esacta, 0 ; variable list es \f ;rc4000 fortran ,pass 3 main control table (mct) side 4 enx8: ent8 = enx8 - mbas ; enquivalence qqq+nbyt ,leftpi ,ent8+5 , empa , 0 ; equivalence leftp ;+5 qqq+inliva,rightpi,ent8+28, empa, 0 ; end of eq - group leftpi ,ent8+14 , outa , eqlsleft ; list left in equival ;+14 qqq+inlico ,rightpi,ent8+19, outa ,eqlsrght ; list right in equival ;+19 qqq+nbyt ,commai ,ent8+5 , empa , 0 ; comma in eq - equival rightpi,ent8+28, empa , 0 ; end of eq-group ;+28 esm+nbyt ,commai , ent8 , outa ,equival ; equial comma enx9: ent9 = enx9 - mbas ; data qqq+inliva, slashi ,ent9+23, data1a,datacon ; / after, var list leftpi ,ent9+9 , listlea, 0 ; listleft in data ;+9 qqq+ nbyt, iconsi, ent9+ 83, outca, 0 ; subscript constant ;+14 qqq+nbyt , commai , ent9 , empa , 0 ; comma in var list slashi , ent9+23, data1a, datacon ; /after var list \f ;rc4000 fortran , pass 3 main control table (mct) side 5 ;+23 qqq+nbyt ,lgconsi ,ent9+56 , outca , 0 ; data constant inconsi ,ent9+65 , outca , 0 ; may be repeat fact lnconsi ,ent9+56 , outca , 0 ; reconsi ,ent9+56 , outca , 0 dbconsi ,ent9+56 , outca , 0 cpconsi ,ent9+56 , outca , 0 plusi, ent9+ 23, signpa, 0 ; monadic + minusi, ent9+ 23, signma, dyaminus ; monadic - ;+56 qqq+nbyt ,commai ,ent9+23 , data2a , 0 ; comma in const list slashi ,ent9+78 , outa , endata ; / after const list ;+65 qqq+nbyt ,commai ,ent9+23 ,data2a , 0 ; comma in const list slashi ,ent9+78 , outa , endata ; / after const list stari ,ent9+23 , data3a ,datastar; repeat star ;+78 esm+nbyt,commai ,ent9 , outa , data ; more data groups ; +83 qqq+ nbyt, commai, ent9+ 9,listcoa, 0 ; list comma rightpi, ent9+ 14, listrga, 0 ; list right enx10: ent10= enx10- mbas ; format qqq+ nbyt, confori, ent10, confora, 0 ; continue format endfori, entx, confora, 0 ; end form enx20: ent20 = enx20 - mbas ; ident qqq+ inexp, equi, ent20+ 5, ariteqa, 0 esm+ inexp, equi, ent20+ 5 , ariteqa, ariteq ;esm or mult assign enx21: ent21 = enx21 - mbas ; assign qqq+nbyt , iconsi , ent21+5, outlaba , stmlab ; statem label ;+5 qqq+nbyt , toi , ent21+10, outbta , 0 ; to ;+10 qqq+nbyt , identi , entx , implaba , implabel ; label variable \f ;rc4000 fortran ,pass 3 main control table (mct) side 6 enx22: ent22 = enx22 - mbas ; goto qqq+nbyt ,iconsi ,entx ,outlaba, stmlab ; simple goto identi ,ent22+ 32 ,gasa , implabel ; assigned goto leftpi ,ent22+13,gcoma , 0 ; computed goto ;+13 qqq+nbyt ,iconsi ,ent22+18,outlaba, stmlab ;+18 qqq+nbyt ,commai ,ent22+13,empa , 0 rghtpi ,ent22+27,comskipa, 0 ;end lab list skip com ;+27 qqq+inexp,endstmi , 0 ,esacta, 0 ; comp express es ; + 32 esm+ nbyt, commai, ent22+ 32, empa, 0 inconsi, ent22+ 32, skipia, 0 leftpi, ent22+ 32, empa, 0 rightpi, ent22+ 32, empa, 0 enx24: ent24 = enx24 - mbas ; call qqq+nbyt ,identi ,ent24+5 ,calla , call ;+5 esm+nbyt ,leftpi ,ent24+14 ,callea , 0 ; param left par endstmi, ent24+14, callesa, endcall ; paramless call ;+14 qqq+inexp,commai ,ent24+14 ,listcoa ,0 rightpi ,entx ,listrga ,0 ; end param list enx26: ent26 = enx26 - mbas ; stop qqq+nbyt ,iconsi ,entx ,outca, 0 endstmi, 0, stopa, 0 ; missing icons ; if , special treatm entof logical if in action ifa enx27: ent27 = enx27 - mbas qqq+nbyt , leftpi ,ent27+5 ,empa , 0 ;+5 qqq+inexp,rightpi ,ent27+10 ,ifa , endifex ; end if expression ;+10 qqq+nbyt ,iconsi ,ent27+15 ,arifa , stmlab ; +15 qqq+nbyt, commai, ent27+ 10, empa, 0 ;after label endstmi , 0 ,arifesa,0 ; end arit if stm enx29: ent29 = enx29 - mbas ; do qqq+nbyt ,iconsi ,ent29+5 ,dolaba, 0 ; do label ;+5 qqq+nbyt ,identi ,ent29+10 ,outbta, 0 ; controlled variable ;+10 qqq+nbyt ,equi ,ent29+15,doliga, doeq ; equals ;+15 qqq+inexp ,commai ,ent29+15,docoma, doinit ; do parameters endstmi , 0 ,doesa , doinit \f ;rc4000 fortran , pass 3 main control table (mct) side 7 enx31: ent31 = enx31 - mbas qqq+nbyt ,leftpi ,ent31+5 ,callea , 0 ;+5 qqq+inexp ,rightpi,ent31+28, rwrga , 0 ; unformatted r/w commai ,ent31+14 ,listcoa ,0 ; formatted r/w ;+14 qqq+nbyt ,identi ,ent31+23,outbta, 0 ; format array iconsi ,ent31+23,outlaba,formlab; format label ;+23 qqq+nbyt ,rightpi,ent31+28, rwrga , 0 ;+28 esm+inexpim ,commai ,ent31+28,outa ,iocom ; io-list enx32: ent32= enx32- mbas qqq+ nbyt, identi, entx, outbta, 0 ; ident after entry enxx: entx = enxx - mbas ; expecting end statement qqq+nbyt ,endstmi, 0 ,esacta , 0 \f ;rc4000 fortran, pass 3 byte table (bt) side 1 ;key<8 w. btbase: h.;+class,entmct , btact ,btobyt , inbyte 5<8 + 12, 0 , endunita, ob8+0 ; 0 end unit 12, 0 , endpassa, ob8+1 ; end pass 7<8 + 2, 0 , 0, ob10+0 ; 2 lgcons 0<8 + 2, 0 , labela , ob10+1 ; intcons 7<8 + 2, 0 , 0, ob10+3 ; 4 lncons 7<8 + 2, 0 , 0, ob10+2 ; recons 7<8 + 2, 0 , 0, ob10+4 ; 6 dbcons 7<8 + 2, 0 , 0, ob10+5 ; cpcons 7<8 + 8, 0 , 0, ob9+0 ; 8 listleft 7<8 +10, 0 , 0, ob9+1 ; listrght 7<8 + 3, 0 , 0, ob12+0 ;10 + 7<8 + 3, 0 , 0, ob12+2 ; - 7<8 + 9, 0 , 0, ob13+0 ; 12 comma 7<8 + 4, 0 , 0, ob12+4 ; * 7<8 + 4, 0 , 0, ob12+5 ; 14 / 7<8 + 1, 0 , 0, ob17+1 ; = 7<8 +12, 0 , 0, ob11+3 ; 16 . 12, 0 ,begunita , ob8 +2 ; beg unit 7<8 + 4, 0 , 0, ob12+6 ; 18 ** 7<8 + 6, 0 , 0, ob18+0 ; lt 7<8 + 6, 0 , 0, ob18+1 ; 20 le 7<8 + 6, 0 , 0, ob18+2 ; eq 7<8 + 6, 0 , 0, ob18+3 ; 22 ge 7<8 + 6, 0 , 0, ob18+4 ; gt 7<8 + 6, 0 , 0, ob18+5 ; 24 ne 7<8 + 5, 0 , 0, ob19+0 ; and 7<8 + 5, 0 , 0, ob19+1 ; 26 or 7<8 + 7, 0 , 0, ob20+0 ; not 7<8 + 4, 0 , 0, ob12+7 ; 28 shift 7<8 +12, 0 , 0, ob11+3 ; string 4<8 +12, 0 , esacta, ob26+0 ; 30 end stm \f ;rc4000 fortran, pass 3 byte table (bt) side 2 ;key<8 ;+class ,entmct ,btact ,btobyt , , inbyte 12, 0,declaba ,ob10+8 ; end label 7<8 + 12, 0, outbta, ob22+ 3 ; 32 to 4<8 + 13, ent22 , outbta ,ob22+0 ; go to 4<8 + 12, ent27 , outbta ,ob22+1 ; 34 if 4<8 + 12, ent29 , dovala ,ob22+2 ; do 4<8 + 12, ent21 , 0 , 0 ; 36 assign 4<8 + 12, ent24 , empa ,ob9+2 ; call 4<8 + 12, entx , 0 , 0 ; 38 continue 4<8 + 12, entx , outbta ,ob7+2 ; return 4<8 + 12, ent26 , outbta ,ob22+4 ; 40 stop 4<8 + 20, ent31 , outbta ,ob22+5 ; read 4<8 + 20, ent31 , outbta ,ob22+6 ; 42 write 1<8 + 12, ent1 , outbta ,ob1+6 ; program 1<8 + 12, ent2 , outbta ,ob1+7 ; 44 subroutine 1<8 + 12, ent2 , outbta ,ob1+8 ; function 4<8 + 12, ent32 , outbta ,ob7+0 ; 46 entry 3<8 + 12, ent3 , typea ,ob2 +0 ; logical 3<8 + 12, ent3 , typea ,ob2 +1 ; 48 integer 3<8 + 12, ent3 , typea ,ob2+3 ; long 3<8 + 12, ent3 , typea ,ob2+2 ; 50 real 3<8 + 12, ent3 , typea ,ob2 +4 ; double 3<8 + 12, ent3 , typea ,ob2 +5 ; 52 complex 2<8 + 12, ent5 , outbta ,ob4 +2 ; dimension 2<8 + 12, ent4 , outbta ,ob4 + 1 ; 54 common 2<8 + 12, ent9 , outbta ,ob7+1 ; data 6<8 + 12, ent8 , outbta ,ob4 + 0 ; 56 equivalence 2<8 + 12, ent7 , outbta ,ob4+3 ; external 2<8 + 12, ent6 , outbta ,ob4+4 ; 58 zone \f ;rc4000 fortran, pass 3 byte table (bt) ;key<8 ;+clacc, entmct, btact , btobyt , inbyte 0, 0, endla, ob8+3 ; endline 8<8+ 12, ent10, begfora, ob21+0 ; 60 begforc 8<8+ 12, ent10, begfora, ob21+1 ; begforo 7<8+12, 0, 0, ob11+0 ; 62 endfor 7<8+12, 0, 0, ob11+1 ; confor 0, 0, trouba , ob11+3 ; 64 trouble 0, 0, extida , ob11+2 ; extident 0, 0, outbta , ob3+0 ; impl int 0, 0, outbta , ob3+1 ; impl real btident: 4<8+11 , ent20 , identa, 0 ; identifier ; obyte tables for leftpar, rghtpar and comma lparbyt: h. 0 ,aritleft, listleft, aritleft, 0, 0 rparbyt: 0 ,aritrght,listrght, aritrght,iorght ,imprght , commabyt: 0 , 0 ,listcom , iocom , iocom , 0 w. \f ;rc4000 fortran, pass 3 definitions dside 8 ; input bytes are classified in relation ; to then statement type they introduce ; when heading a statement ;key 0 miscelleaneous bytes ; 1 program heading bytes ; (program,function, e.t.c.) ; 2 declaratives ; (dimension, common, e.t.c.) ; 3 integer, real, etc ; 4 executable statements ; (do, if, e.t.c.) ; 5 end ; 6 equivalence ; 7 illegal as key byte ; 8 format ;************************* key8 boer ogsaa indeholde data (og entry) \f ;rc4000 fortran pass 3 definitions side 9 ; tables for control of program structure ; the following program states are defined ; 0 after begin program unit ; 1 in declarative statements ; 2 in equivalences ; 3 in executable statements ; each statement type has a key value ; ranging from 0-6 . the key value ; determines together with the present ; program state ; a. if the statement type is legal ; b. the new program state ; the legality is given by the table ; keybits, the new state by the table ; prstable. key value 0 indicates ; bytes beyond the structure rules. ; legal key values keybits: h. 2.011111 101000 ; 0-1,3 2.001111 101000 ; 1-2,3,4,5,6 2.000011 101000 ; 2-4,5,6 2.000011 001000 ; 3-4,5 prstable: 0,1,0,3,3,2,0-0,1 ; key 1-6 w. prstart=0 prstdecl= 1 prstequ= 2 prstex = 3 ; progr. st. in executable part \f ;rc4000 fortran ' pass 3 definitions side 10 ; global variables btstate : 0 ; prstable (bt (ibyte,key)) dosavlab : 0 ; saved do-label exprtyp : 0 ; type of current expres ; sion read by inexp firstlft : 0 ; boolean for first left ; par in expression used ; for treatm of io-lists impcnt : 0 ; comma counter for do comcnt : 0 ; and imp do iflab : 0 ; counter for arit if labels incount : 0 ; element count in inlist inlisw : 0 ; flip-flop word in inlist ibyte : 0 ; current input byte prstate : 0 ; current program state pointer : 0 ; stack pointer prgcnt: 0 ; counter for main programs putype: 0 ; 0: head missing, 1: mainprogr, 2: subrout or fnct pucnt : 0 ; counter for program units repeat : 0 ; boolean for nextbyte ; to repeat last byte stacklim : 0 ; limit for stack pointer savtyp : 0 ; work for mct action ; type function wlabel : 0 ; buffer for label value wstar : 0 ; boolean for star occur stmclas: 0 ; statement type logifcnt: 0 ; count for log if nesting wsign: 0 ; boolean for monadic sign in data eqcount: 0 ; counter for multiple assignments \f ;rc4000 fortran, pass 3 definitions side 11 ; constants and symbol values cn17t0 : 8.377 cn7: 7 cn18t0: 8.777 cinliva : 8.00010000 ; control parameters for cinlico : 8.10000000 ; inlist, indicalting allowed cinlibo : 8.10010000 ; classes stackmsk:8.07777777 ; to extract label of stack ; element ; gpa entries inbyte : jl. e2. outbyte : jl. e3. gpael : jl. e1. alarm = e5 stacktxt = e10 gpalastw = e9+4 ; addr last work for pass gpaendp: jl. e7. \f ;rc4000 fortran, pass 3 definitions side 12 ; words from current bt, mct and ect-entru and stack h. btbits : 0 ; key <8 + class entmct : 0 ; index to mct entry btact : 0 ; action adress rel actionbase btobyt : 0 ; value or base value of output byte ; mct bytes mctnew : 0 ; new mct index mctobyt : 0 ; value or base value of output byte ; ect bytes ecstate : 0 ; new ec state ecact : 0 ; action w. mctrecl= 4 ; reclength for mct btclass: 0;bt subfiels \f ;rc4000 fortran, pass 3 definitions side 13 ; acbas for action addresses ; btbase start of byte table ; mbas start of main control table ; stackbas start of stack ; pass 3 end end of code for pass 3 \f w. ;rc4000 fortran pass 3 main side acbas: ; error administration entered in error+ errrorcode<1 error: am -1 , r.9 ; 9 error codes defined al w1 errorbas+ 9 ; w1 = error code al w0 trouble jl. w3 outbyte. al w0 x1 jl. w3 outbyte. ; outbyte( trouble, errcode,0,0) al w0 0 jl. w3 outbyte. rl. w0 btclass. jl.w3 outbyte. al w1 0 ; suppres statement types rs. w1 logifcnt. ; bytes except enddo rl. w0 stmclas. se w0 docl rs. w1 stmclas. ; skip all except identifiers and constants until end statement skipon: rl. w0 ibyte. sn w0 endstmi ; if ibyte eq endstmi then goto jl. esact. ; endstm action sn w0 enduni jl. euact. sh w0 begforci-1 ; skip trailers in format bytes jl. noform. sl w0 confori+ 1 jl. noform. jl. w3 skiptwo. jl. skipnxt. noform: al w0 0 rl. w1 btclass. se w1 identcl ; if clas eq identifier then output jl. constest. ; else goto test for const jl. w3 outbt. skipnxt: jl. w3 nextbyte. jl. skipon. constest: se w1 constcl jl. skipnxt. al w0 vanopnd jl. w3 outbyte. jl. w3 skipix. ; skip trilers i n const jl. skipnxt. ; and goto take next byte ; end unit found during trouble skip euact: al w0 1 ; rs. w0 repeat. ; repeat(end unit byte) ; simulate an end statement byte ; end statement action esact: rl. w1 stmclas. al w1 x1- speclim ; if special stm type sh w1 0 ; then output byte jl. esout. ; for statement type al w0 x1+ endstyp jl. w3 outbyte. esout: rl. w1 logifcnt. ; output possible log if sh w1 0 ; bytes jl. obesm. al w0 endlogif esloop: jl. w3 outbyte. al w1 x1- 1 ; count log ifs down se w1 0 jl. esloop. rs. w1 logifcnt. obesm: al w0 endstm ; output end statement jl. w3 outbyte. rl. w1 putype. se w1 0 jl. cleanup. jl. w3 outhead. ; use of registers: w0, relevant obyte for do termination ; w1, working reg w2, controlled varable w3, stackindex for first found elem cleanup: rl. w2 pointer. ; cleanup possible parentheses sh w2 0 jl. dosearch. bz. w1 x2+ stackbas. ; in stack ls w1 -9 sh w1 1 jl. dosearch. al w2 x2 -2 rs. w2 pointer. jl. cleanup. dosearch: al w3 0 ; found = 0 sl. w3 (wlabel.) ; if current statm unlabelled jl. newstm. ; then skip search al w0 doterm ; obyte for correct termination al w2 0 jl. dosstep. ; for w2 = 2 step 2 until pointer do dosloop: rl. w1 x2+ stackbas. ; if found eq 0 then la. w1 stackmsk. ; begin se w3 0 ; if stacked label eq wlabel then jl. donotfnd. ; found = w2 \f ;rc4000 fortran pass3 main side sn. w1 (wlabel.) ; end if found al w3 x2 dosstep: al w2 x2+ 2 sh. w2 (pointer.) jl. dosloop. jl. dosout. ; end of search goto possible output donotfnd: se. w1 (wlabel.) ; else if stacked label nq wlabel al w0 doterror ; then w0 = do termination error jl. dosstep. ; output do termination bytes for all found or erroneous do elements ; and unstack elements ; at entry w0 contains the relevant output byte ; w3 the pointer value for first involved stack element or 0 if none found dosout: sh w3 0 ; if none found goto new statement jl. newstm. al w2 x3- 2 ; save for later adjustment of pointer al w1 x3 dosocal: jl. w3 outbyte. al w1 x1+ 2 sh. w1 (pointer.) jl. dosocal. rs. w2 pointer. ; set new pointer jl. newstm. ; end of end statem action \f ;rc4000 fortran pass3 main side ; entry to pass3 inpass3: al. w1 pass3end. inpa3= inpass3-e0 ac w1 x1 wa. w1 gpalastw. rs. w1 stacklim. ; set stack limit newstm: al w0 -1 rs. w0 wlabel. ; set no label or endlabel read mainext: jl. w3 nextbyte. bz. w1 btbits. ls w1 -8 ; w1 = btkey sn w1 0 jl. btperfa. ; if neutral byte skip prog structure test rl. w3 prstate. bz. w0 x3+ keybits. ; w0 = keybits(prstate) ls w0 x1 12 ; relevant keybit to sign pos sl w0 0 jl. error.+ 1<1 ; if illegal keybyte then error(1) bz. w0 x1+ prstable.- 1 ; btstate = prstable(btkey) rs. w0 btstate. manola: rl. w1 prstate. sl. w1 (btstate.) ; if state change then begin jl. btperf. ; sn w1 prstart jl. w3 outhead. al w0 endecl ; if prstate= in declaratives sn w1 prstdecl ; then outbyte( endecl) jl. w3 outbyte. al w0 endequiv ; if in equivalences then sn w1 prstequ ; outbyte(endequiv) jl. w3 outbyte. al w1 x1+ 1 rs. w1 prstate. ; increase prstate jl. manola. ; repeat btperf: rl. w1 prstate. ; or after no before format sl w1 prstex jl. wrlabel. btperfa: rl. w1 ibyte. se w1 begforoi sn w1 begforci jl. 4 jl. btperf1. wrlabel: rl. w1 logifcnt. ; if in logical if se w1 0 ; dont output label jl. btperf1. rl. w1 wlabel. sh w1 0 ; if label read output jl. btperf1. al w0 declabel ; output (declabel,labelvalue) jl. w3 outbyte. bz. w0 wlabel. jl. w3 outbyte. bz. w0 wlabel.+ 1 jl. w3 outbyte. btperf1: rl. w0 entmct. ; set mct entry index hs. w0 mctnew. bz. w0 btbits. ; set statem type la. w0 cn17t0. rs. w0 stmclas. bl. w3 btact. se w3 0 jl. w3 x3+ acbas. ; if btact nq 0 perform btaction nxmct: bz. w2 mctnew. bz. w1 x2+ mbas. ; w1 = input case la. w1 cn7. ls w1 2 ; mult by 4 and clear flagbits al. w3 inpretur. ; prepare return jl. x1+2 ; switch to input case jl. nextbyte. ; 0, nextbyte am ; filler al w1 0 jl. inexpx. ; 1, inexp (no implied) al w1 1 ; 2, inexp ( imlied) jl. inexpx. rl. w1 cinliva. ; 3, inlist( variables only) jl. inlist. rl. w1 cinlico. ; 4, inlist( constants only) jl. inlist. rl. w1 cinlibo. jl. inlist. ; 5, inlist ( varbs and constants) inpretur: bz. w2 mctnew. al w2 x2+ 1 ; mctinx now point to firstregular entry ; search mct section for entry with mctib eq to actual ibyte mctsearc: bl. w1 x2+ mbas. sh w1 0 ; if end if section then test for end stm jl. mctesec. sn. w1 (ibyte.) ; if mctib eq ibyte then goto ibfound jl. ibfound. ; else increase mctinx al w2 x2+ mctrecl jl. mctsearc. ; and try next entry ibfound: bz. w1 x2+ mbas.+ 1 hs. w1 mctnew. ; move mctbytes bz. w1 x2+ mbas.+ 3 hs. w1 mctobyt. bz. w1 x2+ mbas.+ 2 ; perform mct action jl. w3 x1+ acbas. ;mct actions may return normally or jump direci to nxmct jl. nxmct. ; if normal return from action mctesec: rl. w0 ibyte. se w0 endstmi jl. error.+ 3<1 ; if not end stm then error(3) bz. w2 mctnew. bz. w2 x2+ mbas. ; fetch section start byte so w2 1<10 jl. error.+ 3<1 ; if end stm not legal then error(3) jl. esact. ; else jump to standard end stm action ; end of main \f ;rc4000 fortran pass 3 inlist side ; input and control list of identifiers and/or constants ; entry with w1 = control mask, bit 23 - i = 1 for class i legal inlist: rs. w3 inliret. ; save return rs. w1 inlisw. al w1 0 ; initiate element count rs. w1 incount. jl. inliele. inliloo: jl. w3 nextbyte. sn w2 commai ; accept and skip comma jl. inliele. rl. w1 incount. ; else if not empty list se w1 0 jl. (inliret.) ; then return se w2 endstmi jl. error. +6<1 ; accept empty list if endstatem jl. (inliret.) inliele: jl. w3 nextbyte. rl. w0 inlisw. ls. w0 (btclass.) ; check if correct element class sl w0 0 jl. error. +6<1 ; else error(6) rl. w2 incount. al w2 x2 +1 ; count element rs. w2 incount. rl. w2 ibyte. sn w2 identi jl. inident. ; copy identifier se w2 inconsi ; integer only allowed jl. error.+ 6<1 jl. w3 outcx. ; output constant jl. inliloo. inident: jl. w3 outbt. jl. inliloo. inliret: 0 ;rc4000 fortran pass 3 general subroutines side ; setexp, set current expression type ; values : 0 empty expr ; 1 constant ; 2 simple variable ; 3 general expr ; entry: w1 = new expr type setexp: rl. w0 exprtyp. sh w0 x1 rs. w1 exprtyp. ; set max(new , current) jl x3 ; outcase output byte from specifeed table indexed by paretheses type ; given in stack top ; entry : w1 = base of byte table, w0,1,3 changed outcase: rs. w3 outcw3. rl. w3 pointer. bz. w3 x3+ stacont. ; w3 = parent type am x3 bz w0 x1 ; w0 = byte value jl. w3 outbyte. jl. (outcw3.) outcw3: 0 ; sawed return ; outbt, outmct : output byte from btobyt/mctobyt incremented ; by value in w0, w0,3 changed outbt: rs. w3 outsw3. ba. w0 btobyt. ; add obyte from bt jl. outret. outmct: rs. w3 outsw3. ba. w0 mctobyt. ; add obyte from mct outret: jl. w3 outbyte. jl. (outsw3.) outsw3: 0 ; outcopy : copy no of bytes given in w1 outcopy: rs. w3 outsw3. jl. w3 inbyte. al w0 x2 jl. w3 outbyte. al w1 x1- 1 sl w1 1 jl. outcopy.+ 2 jl. (outsw3.) ; stack, create new stack word, entry : w0= element type, w1= content of element stack: rl. w2 pointer. al w2 x2+ 2 ; increase stack pointer sh. w2 (stacklim.) ; check for core overflow jl. stackok. al. w1 stacktxt. jl. w3 alarm. ; go to rs entry alarm stackok: ls w1 3 ; concatenate type and content ld w1 -3 rs. w1 x2+ stackbas. ; set new entry rs. w2 pointer. ;set new stack pointer jl x3 skipix: rs. w3 genretur. ; skip const trailers rl. w1 ibyte. al w1 x1- lgconsi bl. w1 x1+ coptab. jl. w3 inbyte. al w1 x1- 1 sl w1 1 jl. -6 jl. (genretur.) skiptwo: rs. w3 genretur. ; skip two trailerds jl. w3 inbyte. jl. w3 inbyte. jl. (genretur.) \f ;rc4000 fortran pass 3 general suroutines side ; copy constant according to ibyte outcx: rs. w3 genretur. al w0 0 jl. w3 outbt. ; output header byte rl. w1 ibyte. al w1 x1- lgconsi bz. w1 x1+ coptab. ; find no of trailer bytes jl. w3 outcopy. ; copy trailer bytes jl. (genretur.) coptab: h. 1,2,4,4,8,8 w. ; nextbyte, read next input byte ; if identifier substitute with standard ident value and set actual ; ident value in btobyt for output ; if class eq 0 perform action specified in bt and take next byte ; return with byte value in ibyte and w2 , corresponding bt-entry ; moved to simple bytes btbits,entmct,btact,btobyt and btclass nextbyte: rs. w3 nbw3save. nbagain: am. (repeat.) sn w3 x3 jl. nbnew. ; no repeating al w2 0 rs. w2 repeat. ; repeat := false rl. w2 ibyte. ; repeat last byte jl. (nbw3save.) nbnew: jl. w3 inbyte. ; take new byte sh w2 identlim- 1 jl. noident. hs. w2 btident.+ 3 ; set ident value for output al w2 identlim ; and replace with ident value base dl. w1 btident.+ 2 jl. nbstore. noident: al w1 x2- ib1 ls w1 2 dl. w1 x1+ btbase.+ 2 ; move bt-entry nbstore: rs. w2 ibyte. ds. w1 btact. ; to simple bytes ls w0 -12 la. w0 cn17t0. ; extract class sl w0 stmbase+ 1 ; if class gt ident class then replace al w0 stmbase+1 ;with else class rs. w0 btclass. se w0 0 ; ifnot neutral byte (class 0) then jl. (nbw3save.) ; return bl. w3 btact. ; else perform btaction jl. w3 x3+ acbas. jl. nbagain. ; take next byte if action returns nbw3save: 0 ; blanc common h. blcbyt: 8, 539, implrea, extident, 4, w.<:9blcom:>, h. ; missing heading heabyt: 10, program, 540, implrea, extident,4,w.<:missng:>, h. endstm ;in the above line, program can be exchanged by subrout ; trouble no of mainprograms troubyt: 4, trouble, errorbas+ 9,0,0 ; return statement retubyt: 2,return, endstm ; stop statement stobyt: 5,stop, icons, 0, 1111, endstm ; iconstant 0 zerobyt: 3, icons,0,0 w. ; outseq, ou.put sequence of bytes ; srtart given in w1, no of bytes in first byte outseq: rs. w3 seqsav. al w2 x1+ 1 ba w2 x1 seqloop: al w1 x1+ 1 sl w1 x2 jl. (seqsav.) bl w0 x1 jl. w3 outbyte. jl. seqloop. seqsav: 0 0 ; w1 ohw2sav: 0 ; w2 ohw3sav: 0 ; w3 outhead: rs. w3 ohw3sav. ; ds. w2 ohw2sav. ; al w1 prstdecl ; rs. w1 prstate. ; rl. w1 prgcnt. ; al w2 subrout ; se w1 0 ; hs. w2 heabyt.+1 ; if prgcnt <> 0 then set heading to subrout al w2 1 ; se w1 0 ; al w2 2 ; rs. w2 putype. ; putype:=if prgcnt=0 then mainprg else subr rs. w2 prgcnt. ; main prg occured := true al. w1 troubyt. ; sn w2 2 ; jl. w3 outseq. ; if subr then outseq(illegal number of main programs) al. w1 heabyt. ; jl. w3 outseq. ; dl. w2 ohw2sav. ; jl. (ohw3sav.) ; \f ;rc4000 fortran pass 3 general actions side outbtx: rs. w3 genretur. ; outbt(0) al w0 0 jl. w3 outbt. jl. (genretur.) genretur: 0 emptx: jl x3 ;empty action outx: rs. w3 genretur. al w0 0 jl. w3 outmct. ; outmct(0) jl. (genretur.) \f ;rc4000 fortran pass3 inexp side ; inexpx : input and process expression according to ; expression control table (ect) ; ect contains a row for each expr cont state and a coloumn pr input class ; each table entry consists of 2 bytes: ; byte 1: new state ; byte 2: action address ; the action address is given relative to label inexp ; if the combination actual state and actual input class is illegal ; byte 1 contains 1<11 + error code ectbas: ; expression control table h. ; ecstate 1, before expression ecst1x: 1<11 +2, 0 ; = ecst3, ecact2a ; const ecst4, ecact3a ; +- 1<11+ 2, 0 ;mult / pilup shift 1<11+ 2, 0 ; and or 1<11+2, 0 ; relation ecst5, ecact4a ; not ecst1, lparaa ; leftp , aritmetic 1<11+ 2, 0 ; comma 1<11+2 , 0 ;right par ecst2, ecact1a ; ident 1<11+2, 0 ;else class ; ecstate 2, after identifier ecst2x: ecst1, eqacta ; 11 = 1<11+ 2, 0 ; 2, constant ecst4, ecact4a ; 3, + - ecst4, ecact4a ; 4, star / starstar shift ecst1, ecact4a ; 5, and or ecst5, ecact4a ; 6, relation 1<11+ 2, 0 ; 7, not ecst1, lparla ; 8, left par , list ecst1, comacta ; 9,comma ecst3, rpara ; 10, right par 1< 11+ 2, 0 ; ident 0, exretura ; 12, else class return ;rc4000 fortran pass 3 expression control table side ; ecstate 3, after constant ecst3x: 0, exretura ; = 1<11+ 2, 0 ecst4, ecact4a ecst4, ecact4a ecst1, ecact4a ecst5, ecact4a 1<11+ 2, 0 1<11+ 2, 0 ecst1, comacta ecst3, rpara 1<11+2, 0 0, exretura ; ecstate 4, after - + star / starstar shift ecst4x: 1<11+ 2, 0 ; = ecst3, ecact2a 1<11+ 2,0 1<11+2 , 0 1<11+ 2,0 1<11+2 ,0 1<11+2, 0 ecst1, lparaa 1<11+ 2,0 1<11+ 2,0 ecst2, ecact1a ; ident 1<11+ 2,0 ; ecstate 5, after not , after relational operator ecst5x: 1< 11+ 2, 0 ecst3, ecact2a ecst4, ecact3a 1<11+ 2,0 1<11+ 2,0 1<11+ 2,0 1<11+ 2,0 ecst1, lparaa 1<11+ 2,0 1<11+ 2,0 ecst2, ecact1a 1<11+ 2,0 ; ecstste 6, after io,imp right par ecst6x: 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 1<11+2 , 0 ecst1 ,comacta ; 9 comma ecst3 , rpara ; 10 right par 1<11+2 , 0 0 , exretura ; 12 else \f ;rc4000 fortran pass 3 inexp side ; inexp, control and process next expression ; if w1 eq 1 at entry accept implied do loops w. ; exit with terminating byte in ibyte ,expression type in exprtyp inexpx: rs. w3 ineret. rs. w1 sinio. al w1 1 rs. w1 firstlft. ;firstlft = true, pars may be io-pars al w1 ecst1 rs. w1 ecstate. ; set initial state al w0 3 ; set exprtyp to 0 al w1 0 ; and stack empty parenteses element rs. w1 exprtyp. jl. w3 stack. inenxt: jl. w3 nextbyte. ; start of control loop rl. w1 btclass. ls w1 1 ; class*2 ba. w1 ecstate. ; + ecstate rl. w1 x1+ ectbas.- 2 rs. w1 ecstate. ; move ect word to simple bytes sh w1 0 ; if new state lt 0 jl. ecerr. ; then goto express error bz. w1 ecact. ; else go to action jl. x1+ acbas. ineret: 0 ; return addr sinio: 0 ; input param specifying impl do legality ecerr: ls w1 1 ls w1-12 ; go to error+ error code<1 jl. x1+ error. ; return administration called by actions at expression termination exreturn: rl. w2 pointer. bz. w1 x2+ stackbas. ; check for open left paretheses ls w1 -9 se w1 3 jl. (ineret.) ; if not parent elem then return bz. w1 x2+ stacont. se w1 0 jl. error. + 4<1 ; if parent elem not empty then error(4) al w2 x2- 2 rs. w2 pointer. ; else unstack element jl. (ineret.) \f ;rc4000 fortran pass 3 inexp actions side ; standard actions ecact1x: al w1 2 jl. w3 setexp. ; expr typ up to simple var al w0 0 jl. w3 outbt. jl. ecacret. ecact2x: al w1 1 jl. w3 setexp. ; expr typ constant jl. w3 outcx. ; output header for constant jl. ecacret. ecact3x: al. w1 zerobyt. jl. w3 outseq. ecact4x: al w0 dyadic ecact42: jl. w3 outbt. ; output monadic or dyadic operator ecact44: al w1 3 jl. w3 setexp. ; exprtyp general ecacret: al w0 0 rs. w0 firstlft. ; no more leading left pars jl. inenxt. ; actions for left par ; aritmetcal left lparax: al w1 3 jl. w3 setexp. ; expr typ general al w1 0 se. w1 (sinio.) ; leftp typ = if sinio and firstleft then sl. w1 (firstlft.) ; arit/io else aritmeticcal am -2 al w1 3 al w0 3 jl. w3 stack. ; stack left par jl. leftout. ; list left par lparlx: al w1 3 jl. w3 setexp. ; expr typ general al w1 2 al w0 3 jl. w3 stack. ; stack left par al w1 1 ; intiate list elem coynt ba. w1 x2+ stackbas. hs. w1 x2+ stackbas. leftout: al. w1 lparbyt. ; base for left par byte table jl. w3 outcase. ; output leftp byte from table jl. inenxt. ; end action \f ;rc 4000 fortran pass 3 inexp actions side ; actions for comma comactx: al w1 1 rs. w1 firstlft. ; left pars are leading rl. w2 pointer. bz. w1 x2+ stacont. ; w1 = parent type ls w1 1 jl. x1+ 2 ; switch on parent type jl. exreturn. ; empty par jl. exreturn. ; aritmetic jl. comlist. ; list jl. comario. ; arit/ io jl. comio. ; io jl. comimp. ; implied comlist: al. w1 commabyt. ; list comma jl. w3 outcase. ; output byte from commatable bl. w1 x2+ stackbas. al w1 x1+ 1 ; count list elements hs. w1 x2+ stackbas. jl. inenxt. comario: al w1 4 hs. w1 x2+ stacont. ; set parent type to io jl. comio. comio: al w1 0 rs. w1 exprtyp. ; clear expr typ al. w1 commabyt. ; output byte from commatable jl. w3 outcase. jl. inenxt. comimp: rl. w1 impcnt. sl w1 7 jl. error.+ 5<1 ; if imppl comma count gt 3 then error(5) al w1 x1+ 3 rs. w1 impcnt. ; count commas wa. w1 exprtyp. al w0 x1+ impinit- 4 jl. w3 outbyte. al w1 0 rs. w1 exprtyp. ; clear expr typ jl. inenxt. ; end action ; action for = in implied do loops eqactx: rl. w2 sinio. sn w2 0 ; if not in io-stm return jl. exreturn. rl. w2 pointer. rl. w0 exprtyp. ; if exprtyp is not simple ident se w0 2 ; then errror(5) jl. error.+ 5<1 bz. w0 x2+ stacont. se w0 4 ; if parent typ is not io then jl. error.+ 2<1 ; error(2) al w0 5 hs. w0 x2+ stacont. ; set parent typ to implied al w0 0 rs. w0 exprtyp. ; clear exprtyp rs. w0 impcnt. ; implied comma count = 0 jl. w3 outbt. ; outbt (0) jl. inenxt. ; end action \f ;rc4000 fortran pass 3 inexp actions side ; actions for right parenthesis rparx: rl. w2 pointer. bz. w1 x2+ stacont. ls w1 1 jl. x1+ 2 ; switch on parent type in stack jl. exreturn. ; empty parent jl. eunstack. ; arithmetical jl. listrp . ; list jl. eunstack. ; arit/ io jl. ioright. ; io jl. imright. ; implied imright: rl. w1 exprtyp. ; (6) wa. w1 impcnt. al w0 x1+ impinit- 1 jl. w3 outbyte. rl. w1 impcnt. sh w1 0 jl. error.+ 5<1 ; if impcnt lt 1 then error (6) sl w1 6 jl. ioright. al w0 icons jl. w3 outbyte. ; generate step 1 al w0 0 jl. w3 outbyte. al w0 1 jl. w3 outbyte. al w0 impstepc jl. w3 outbyte. ioright: al. w1 rparbyt. ; table of obytes for right parent jl. w3 outcase. al w0 ecst6m2 hs. w0 ecstate. jl. eunst4. listrp: al. w1 rparbyt. jl. w3 outcase. bl. w0 x2+ stackbas. la. w0 cn18t0. jl. w3 outbyte. al w0 spark jl. w3 outbyte. jl. eunst4. jl. inenxt. ; counter eunstack: al. w1 rparbyt. jl. w3 outcase. ; output rpar byte from table eunst4: al w2 x2- 2 rs. w2 pointer. ; unstack parent element jl. inenxt. ; end action \f ;definitions of action symbols for inexp ecact1a = ecact1x- acbas ecact2a = ecact2x- acbas ecact3a = ecact3x- acbas ecact4a = ecact4x- acbas lparaa = lparax- acbas lparla = lparlx- acbas rpara = rparx - acbas comacta = comactx- acbas eqacta = eqactx- acbas exretura = exreturn- acbas ; definition of state symbols for inexp ecst1 = ecst1x- ectbas ecst2 = ecst2x- ectbas ecst3 = ecst3x- ectbas ecst4 = ecst4x- ectbas ecst5 = ecst5x- ectbas ecst6m2= ecst6x-ectbas \f ;rc4000 fortran , pass 3 actions side 1 ; bt actions/1 ; end program unit endunitx : rl. w0 prstate. ; if program state in declaration or sn w0 prstequ ; in equivalences then output jl. enduneq. ; poss missing endeclaration sl w0 prstequ ; and endequivalence jl. endunok. ; prstate gt in equiv al w0 endecl jl. w3 outbyte. enduneq: al w0 endequiv jl. w3 outbyte. endunok: rl. w2 pointer. ; process possible open do-ranges se w2 0 jl. odoterr. ; if open do-range outbyte(doterr) rl. w0 putype. ; if subr or fnct generate return al. w1 retubyt. ; else generate stop se w0 2 al. w1 stobyt. jl. w3 outseq. al w0 0 jl. w3 outbt. ; outbyte (endunit, linecount) rl. w1 pucnt. ; count progr units al w1 x1+ 1 rs. w1 pucnt. jl. mainext. ; end action odoterr: al w0 doterror ; jl. w3 outbyte. ; outbyte (do term in error) al w2 x2-2 rs. w2 pointer. ; decrease stack pointer jl. endunok. ; end pass endpassx: rl. w1 pucnt. ; if no of prunits gt 1 and no main program rl. w0 prgcnt. ; then output trouble no of prmaimprg sl w1 2 se w0 0 jl. endpok. al. w1 troubyt. jl. w3 outseq. endpok: al w0 0 jl. w3 outbt. jl. gpaendp. ; return to gpa prgrx: al w1 1 ; ident after program, set head ok,mainprgr rs. w1 putype. al w1 prstdecl ; rs. w1 prstate. ; rl. w1 prgcnt. se w1 0 ; if already one main prgr then error 8 jl. error.+ 9<1 rs. w0 prgcnt. ; else set main prgr occured jl. outbtx. \f ;rc4000 fortran, pass 3 actions side 2 ;bt actions/2 ; tabel declaration labelx: am. (wlabel.) sh w1 x1 ; if label or endlabel read jl. w3 error.+3<1 ; then error(15) jl. w3 inbyte. hs. w2 wlabel. ; wlabel = 2 next bytes jl. w3 inbyte. hs. w2 wlabel.+ 1 jl. mainext. ; end action ; end label declabx: am. (wlabel.) ; if no label read then sh w1 x1 jl. mainext. ; wlabel=0 al w0 0 rs. w0 wlabel. jl. mainext. ; end action ; ident after subroutine or function subrx: al w1 2 rs . w1 putype. ; set head ok subr or funct al w1 prstdecl ; rs. w1 prstate. ; jl. outbtx. ; return via outbta \f ;rc4000 fortran ,pass 3 actions side 3 ; bt actions/3 ;begin unit begunitx: al w0 0 rs. w0 prstate. rs. w0 putype. ; set head missing jl. w3 outbt. jl. mainext. ; end action \f ;rc4000 fortran ,pass 3 actions side 4 ; btactions/4 dovalx: rs. w3 extiret. rl. w0 logifcnt. se w0 0 jl. error.+ 8<1 ; do after logical if jl. w3 outbt. jl. (extiret.) typex : bz. w0 btobyt. ; save obyte of type expecting rs. w0 savtyp. ; function or ident jl x3 ; return begforx: rl. w0 wlabel. ; begin format sh w0 0 ; if unlabelled format jl. error.+7<1 ; then error(13) conforx: al w0 0 ; action for continue format rs. w0 wlabel. ; clear format label al w0 genform jl. w3 outbyte. ; output general format byte al w0 0 ; folloved by normal format byts jl. w3 outbt. ; else copy begin format al w1 2 jl. w3 outcopy. jl. nxmct. ; goto take next byte \f ;rc4000 fortran pass 3 actions side 5 ; btactions/5 troubx: al w0 0 ; action for trouble jl. w3 outbt. al w1 3 ; copy trouble bytes jl. w3 outcopy. jl. w3 nextbyte. ; read next byte jl. skipon. ; proceed with error treatment in main extidx: rs. w3 extiret. ; action for external repr bytes al w0 0 jl. w3 outbt. ; copy control byte jl. w3 inbyte. ; w2 = no of bytes al w1 x2 extcopy: al w0 x2 jl. w3 outbyte. ; copy no and trailers sh w1 0 jl. (extiret.) al w1 x1- 1 jl. w3 inbyte. jl. extcopy. extiret: 0 \f ;rc4000 fortran ,pass 3 actions side 6 endlx: rs. w3 endlsav. jl. w3 outbt. jl. w3 gpael. jl. (endlsav.) endlsav : 0 identx: al w0 0 ; initiate count for mult assign rs. w0 eqcount. al w0 1 rs. w0 repeat. ; repeat ident in inexpression jl x3 ; mctactions/1 ; function after type funcx: rl. w0 prstate. ; if after heading then error se w0 0 jl. w3 error. +1<1 al w0 prstdecl ; else set prstate rs. w0 prstate. ; in declaratives rl. w1 savtyp. al w0 x1- logical ; compute increment jl. w3 outmct. ; output byte jl. nxmct. ; end action ; ident after type type2x: rl. w0 prstate. ; if before heading sn w0 0 ; then error jl. w3 outhead. ; rl. w0 savtyp. jl. w3 outbyte. ; outbyte (saved type) al w0 1 rs. w0 repeat. ; repeat identifier in list jl. nxmct. \f ;rc4000 fortran ,pass 3 actions side 7 ; assign = ariteqx: rl. w1 eqcount. ; if eqcount = 0 then al w0 prepass ; outbyte (prepass) se w1 0 al w0 ariteq jl. w3 outbyte. al w1 x1+ 1 rs. w1 eqcount. ; count equals jl. nxmct. ;mct actions/2 ;bound left in type list type3x: al w0 0 jl. w3 outmct. ; out byte (bound right) jl. nxmct. ; end action ; blank common actions blank1x: al w0 1 ; repeat ident from common rs. w0 repeat. ; variable list blankx: al. w1 blcbyt. ; output identbytes for jl. w3 outseq. ; blank common jl. nxmct. \f ;rc4000 fortran, pass 3 actions side 8 ;mct actions/3 ; es in zone specifications zspecx: al w0 0 jl. w3 outmct. jl. esact. ; actions for listleft,listrght and listcomma listlex: al w0 1 rs. w0 incount. ; initiate elem counter jl. outbtx. listcox: rl. w1 incount. ; count list elements al w1 x1+ 1 rs. w1 incount. jl. outbtx. listrgx: rs. w3 listw3. al w0 0 jl. w3 outbt. ; output listrght rl. w0 incount. jl. w3 outbyte. ; output listelem count al w0 spark jl. w3 outbyte. jl. (listw3.) ; rw listright par rwrgx: jl. w3 listrgx. ; process listright jl. w3 nextbyte. sn w2 endstmi ; check for empty iolist jl. esact. rs. w2 repeat. ; repeat byte if not endstm jl. nxmct. ; end action listw3: 0 ; skip comma after copying constant cskipx: jl. w3 outcx. comskipx: jl. w3 nextbyte. sn w2 commai jl. nxmct. jl. error. + 6<1 \f ;rc4000 fortran ,pass 3 actions side 9 ; mct actions/4 ;actions for data constant list data1x: al w0 0 ; start of const list rs. w0 wstar. ; wstar=false, star allowed rs. w0 wsign. ; set monadic sign allowed jl. w3 outmct. jl. nxmct. data2x: al w0 0 ; comma in const list rs. w0 wstar. ; star allowed rs. w0 wsign. ; set monadic sign allowed jl. nxmct. data3x: rl. w0 wstar. ; after iconst se w0 0 ; if star then error(3) jl. error.+ 2<1 jl. w3 outmct. ; else outmct al w0 1 rs. w0 wstar. ; set star illegal jl. nxmct. signmx: al w0 0 ; monadic - in data rl. w1 wsign. se w1 0 jl. error.+ 2<1 ; only one sign allowed al w1 1 rs. w1 wsign. ; set sign met se w0 0 ; if monadic - jl. nxmct. ; then output icons 0 dyaminus al. w1 zerobyt. jl. w3 outseq. al w0 0 jl. w3 outmct. jl. nxmct. ; end action signpx: al w0 1 ; monadic + in data jl. signmx.+2 ; go to check no of signs \f ;rc4000 fortran,pass 3 actions side 12 ; leftpar after goto, computed goto gcomx: al w0 gcomcl rs. w0 stmclas. jl. nxmct. ; end action ; identifier connected with call,assign,ass goto callx: implabx: al w0 0 jl. w3 outbt. ; output ident jl. w3 nextbyte. ; copy poss imlied type al w0 1 ; and extrepr, set repeat rs. w0 repeat. al w0 0 jl. w3 outmct. ; output imlied label nyte jl. nxmct. ; or call byte gasx: al w0 goasscl rs. w0 stmclas. ; set statemnt type jl. implabx. ; list left after call callex: al w0 1 rs. w0 incount. ; initiate list elem count jl. nxmct. ; esm after simple call callesx: jl. w3 outx. ; outbyte (endcall) al w0 spark ; for unstack-action in pass 6 jl. w3 outbyte. ; jl. esact. ; label const in aritm if arifx: rl. w1 iflab. al w1 x1+1 ; iflab=iflab+1 rs. w1 iflab. sl w1 4 ; if more than 3 labes then jl. w3 error.+3<1 ; error(4) jl. w3 outlabx. ; output label stopx: al. w1 zerobyt. jl. w3 outseq. jl. esact. \f ;rc4000 fortran ,pass 3 actions side 13 ; right par after if expression ifx: rs. w3 ifxretur. al w0 0 jl. w3 outmct. ; outbyte (end if expr) jl. w3 nextbyte. ; nextbyte to w2 and ibyte sn w2 inconsi ; if ibyte eq integer const jl. ifxarit. ; then aritm if else rl. w1 logifcnt. al w1 x1+ 1 ; count log if nesting rs. w1 logifcnt. al w0 1 ; if logical if repeat last byte rs. w0 repeat. jl. mainext. ; and start new statement ifxarit: al w0 0 rs. w0 iflab. ; initiate count of labels al w0 1 rs. w0 repeat. ; repeat last byte al w0 arifcl rs. w0 stmclas. jl. (ifxretur.) ; end action ifxretur: 0 \f ;rc4000 fortran , pass 3 actions side 14 ; end stm in aritm if arifesx: rl. w0 iflab. se w0 3 ; if no of labels not 3 jl. w3 error.+3<1 ; then error(4) jl. esact. ; goto end stm action ; actions for do statement ; do label dolabx: jl. w3 inbyte. ; get label value hs. w2 dosavlab. jl. w3 inbyte. hs. w2 dosavlab.+1 al w0 stmlab ; output label bytes jl. w3 outbyte. bl. w0 dosavlab. jl. w3 outbyte. bl. w0 dosavlab.+ 1 jl. w3 outbyte. jl. nxmct. ; end action \f ;rc4000 fortran ,pass 3 actions side 15 ; equal in do doligx: al w0 0 ; comma count=0 rs. w0 comcnt. jl. w3 outmct. ; outmct(0) jl. nxmct. ;comma in do list docomx: al w0 -1 ; compute increment for wa. w0 exprtyp. ; do-byte wa. w0 comcnt. jl. w3 outmct. rl. w1 comcnt. ; increase comma count al w1 x1+3 rs. w1 comcnt. sh w1 6 ; if comma count gt 6 jl. nxmct. jl w3 error. +5<1 ; then error(6) \f ;rc4000 fortran ,pass 3 actions side 16 ; end stm in do doesx: al w0 -1 ; compute increment wa. w0 exprtyp. wa. w0 comcnt. jl. w3 outmct. rl. w0 comcnt. sh w0 2 ; if comcnt tt 3 jl. w3 error.+5<1 ; then error(6) se w0 3 jl. dostack. al w0 icons ; outbyte(icons, 1, dostepc) jl. w3 outbyte. al w0 0 jl. w3 outbyte. al w0 1 jl. w3 outbyte. al w0 dostepc jl. w3 outbyte. dostack: al w0 1 rl. w1 dosavlab. ; stack do label jl. w3 stack. al w0 docl ; set statemt class to do rs. w0 stmclas. jl. esact. ; end action \f ;rc4000 fortran, pass 3 actions side 17 ; output label const outlabx: al w0 0 jl. w3 outmct. ; output header al w1 2 ; no of trailers jl. w3 outcopy. ; copy trailers jl. nxmct. \f ;rc4000 fortran ,pass 3 definitions side 6 ; definition of symbols used in bt, mct ; for actions and states /1 endunita = endunitx - acbas endpassa = endpassx - acbas labela = labelx - acbas begfora = begforx - acbas confora = conforx - acbas trouba = troubx - acbas extida = extidx - acbas funca = funcx - acbas type2a = type2x - acbas outa = outx - acbas type3a = type3x - acbas blank1a = blank1x - acbas blanka = blankx - acbas zspeca = zspecx - acbas comskipa = comskipx- acbas cskipa = cskipx - acbas esacta = esact - acbas data1a = data1x - acbas outca = outcx - acbas data2a = data2x - acbas data3a = data3x - acbas rwrga= rwrgx- acbas outbta= outbtx- acbas empa= emptx- acbas begunita= begunitx- acbas implaba = implabx - acbas declaba= declabx- acbas dovala= dovalx- acbas typea= typex- acbas outlaba= outlabx- acbas ariteqa= ariteqx- acbas identa= identx- acbas endla= endlx- acbas callea= callex- acbas callesa= callesx- acbas prgra = prgrx- acbas subra= subrx- acbas stopa= stopx- acbas skipia= skipix- acbas \f \f ;rc4000 fortran, pass 3 definitions side 7 ;definition of symbols used in bt, mct ;for actions and states/2 gasa = gasx - acbas gcoma = gcomx - acbas calla = callx - acbas ifa = ifx - acbas arifa = arifx - acbas arifesa = arifesx - acbas dolaba = dolabx - acbas doliga = doligx - acbas docoma = docomx - acbas doesa = doesx - acbas listlea= listlex- acbas listcoa= listcox- acbas listrga= listrgx- acbas signma= signmx- acbas signpa= signpx- acbas \f pass3end: stackbas: stacont= stackbas+ 1 pass3lng = pass3end - e0 e30 = e30 + pass3lng ; length := length + length pass 3; m. rc 83.08.29 fortran, pass 3 i. e. ▶EOF◀