|
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: 134400 (0x20d00) Types: TextFile Names: »ftnpass63tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »ftnpass63tx «
; start pass 6 fortran pass 6 23.2.70 ; jes linderoth ; corrections 1985.10.02 by fgs k= e0 s. c80,d42,f44,g19,h32,i25,j2 ; outbyte values, type independent part h0 = 1 ; begin base 1 h1 = h0+3 ; list base 4 h2 = h1+5 ; declare base 9 h3 = h2+7 ; adj. array base 16 h4 = h3+5 ; data base 21 h5 = h4+4 ; operand base 25 h7 = h5+12 ; end statem base 37 h8 = h7+10 ; format base 44 h9 = h8+2 ; paramzone base 46 h10 = h9+3 ; zonecomma base 49 h11 = h10+2 ; parcount 52 h12 = h11+1 ; start range 53 h13 = h12+1 ; entry base 54 h14 = h13+3 ; jump base 57 h15 = h14+5 ; rel and logpoint base 62 h16 = h15+2 ; do base 64 h17 = h16+9 ; inout base 71 h18 = h17+4 ; implied base 75 h19 = h18+2 ; trouble 80 h20 = h19+2 ; convert base 81 h29 = h20+21 ; exp base 102 h30 = h29+7 ; area inf base 109 h32 = h30+2 ; outbyte values, type dependent part h21 =(:(:h32-1:)>3+1:)<3 ; datainit h22 = h21+8 ; arith oprt base h23 = h22+40 ; mask oprt base h24 = h23+32 ; assign base h25 = h24+16 ; indic base h26 = h25+16 ; call h27 = h26+8 ; param base h28 = h27+32 ; if h6 = h28+8 ; const base h31 = h6 +8 ; formal array decl w. j0: j2 ; no. bytes in pass 6 h. j1 , 6<1+1 ; rel entry, passno.+pass mode ; pass 6 init j1=k-j0 w. rl. w0 e9.+4 ; pass 6 init: rs. w0 f4. ; opnd stack point:= rs. w0 f14. ; opnd bottom:= last work for pass; rl. w2 f12. ; set bottom rs. w2 (f4.) ; operand undefined al. w2 j0.-2 ; oprt stack point:= wa. w2 j0. ; start pass6-2+no.bytes in pass6; rs. w2 f3. ; rs. w2 f19. ; global base:=oprt stack point; al. w2 f39. ; word(general spec param):= rs. w2 f38. ; address of general specs; jl. c80. ; go to new inbyte; \f ; stacking actions are specified with c-names,declared in the ; outmost block ; local labels(a-names) and local variables(b-names) ; are declared in local blocks,if needed. b. a3 ; global entries: comment a table with ; name and paramspecifications for ; each entrypoint in all programunits ; with formats as in a catalog-entry ; ,is read via call of inbyte; ; beforehand,an entry corresponding ; to an unknown procedure is ; established. w. c1: bl. w0 f2. ; jl. w3 e3. ; outbyte(control word part4); jl. w3 e2. ; no.bytes:=inbyte; al w0 x2 ; jl. w3 e3. ; outbyte(no.bytes); wa. w2 f19. ; rs. w2 f20. ; endglobal:=global base+no.bytes; sl. w2 (f4.) ; if endglobal>= opnd stack point jl. d0. ; then goto stack owerflow; rl. w1 f19. ; al w2 x2 -10 ; head address:= rs. w2 f17. ; end global-10; a0: jl. w3 e2. ; for w1:=global base step 1 hs w2 x1 +2 ; byte(w1+2):=inbyte; al w1 x1 +1 ; se. w1 (f20.) ; jl. a0. ; al w1 x1 +2 ; a1: al w1 x1 -12 ; output global entry list: sh. w1 (f19.) ; jl. a3. ; for entry:=endglobals-10 al w2 0 ; step -12 until global base ; do a2: am x1 ; bl w0 x2 ; for i:=0 step 1 until 11 jl. w3 e3. ; do outbyte(byte(entry+i)); al w2 x2 +1 ; sh w2 11 ; jl. a2. ; jl. a1. ; a3: rl. w1 f20. ; w1:=end globals d30: al w1 x1 +6 ; adjust oprt point: rs. w1 f3. ; oprt stack point:=w1+6; al w0 -11<7 ; oprtstack(oprt stack point):= hs w0 x1 -4 ; bottom priority; jl. c80. ; goto new inbyte; e. b. a14, b5 ; external list: ; ; <record> ::=<directing byte> ; <no.bytes> ; no.externals ; (<ext item>) ; no.externals ; <no.externals> ; ; input:<ext item>::=<extno><8 bytes external represent.> ;output:<ext item>::= <8 bytes external represent.> ; <4 bytes kind and specs> ; ; ; ; the external list is read, taking one item at a time. ; ; at the same time,table glob.references is established,holding ; for each external a word with a pointer to the kind and specs to ; be used for that external during parameter-checking in the exe- ; cutable part of the unit. ; ; the kind and specs is searched for in table global entries ; using <external represent.>,that is stored immediately after ; global entries, as a key, and if not found a new entry in ; global entries is created with ext.represent. already defined ; and with kind and specs taken from ; a)the catalog by means of look up entry or ; b)unknown entry, if not found in the catalog. ; ; when all input items have been processed,the external list is ; output, taking for each external,and inthe order of increasing ; values of <extno>, the corressponding entry in table ; global entries ,i.e. 12 bytes for each external. ; kind and specifications: ; format as in notes on code procedures in algol 5. ; special: proctype=15 for unknown entry w. b0: 0 ; ext count b1: 0 ; twice extno b2: 12 ; twelve b3: 9 ; nine b4: <:*version:>, 0, e103, 0 ; pseudo external entry (version): b5: ; end pseudo: c2: bl. w0 f2. ; external list: jl. w3 e3. ; outbyte(control word part4); jl. w3 e2. ; no.inbytes:=w2:=inbyte; al w1 0 ; extcount:=0; rs. w1 b0. ; wd. w2 b3. ; no.externals:= rs. w2 f37. ; w2//9; al w0 x2 +1 ; wm. w0 b2. ; no.outbytes:= ba. w0 1 ; (no.inbytes//9+1)*12+1; <*12 for pseudo entry added*> jl. w3 e3. ; outbyte(no.outbytes); ls w2 1 ; ac w2 x2 +2 ; glob.reference base:= wa. w2 f4. ; opnd stack point - rs. w2 f21. ; 2*no.externals-2; al w2 x2 -2 ; opnd stack point:= rl. w3 f4. ; save operand stack pointer rs. w2 f4. ; opnd bottom:= rs. w2 f14. ; glob.reference base-2; sh. w2 (f3.) ; if opnd bottom<=oprtstackpoint jl. d0. ; then goto stack owerflow; rl. w1 f19. ; glob.references(0):= rs w1 x2 +2 ; global base;comment points at ; unknown entry,and ext params ; are treated as external 0; al w0 0 ; put zeroes al w2 x2 +4 ; in table for a11: sl w2 x3 ; global references jl. a0. ; rs w0 x2 ; al w2 x2 +2 ; jl. a11. ; a0: rl. w1 b0. ; next external: sn. w1 (f37.) ; if extcount=no.externals jl. a7. ; then goto out external list; al w1 x1 +1 ; extcount:= rs. w1 b0. ; extcount+1; jl. w3 e2. ; w2:=inbyte;comment extno; ls w2 1 ; twice external:=w2 shift 1; rs. w2 b1. ; al w1 0 ; w1:=0; a1: jl. w3 e2. ; for w1:=end globals+2 step 1 am. (f20.) ; until end globals+9 do hs w2 x1 +2 ; byte(w1):=inbyte; al w1 x1 +1 ; se w1 8 ; jl. a1. ; sl. w1 (f4.) ; if w1>=opnd stack pointer jl. d0. ; then goto stack owerflow; rl. w1 f19. ; w1:= global base; a2: al w1 x1 +12 ; next global entry:w1:=w1+12; am. (f20.) ; if w1>end global then sl w1 2 ; jl. a4. ; goto search in catalog; al w2 0 ; w2:=0; ; comment start comparing; a3: am. (f20.) ; for w2:=0 step 2 until 6 do rl w0 x2 +2 ; if word(end global+2+w2) am x2 ; se w0 x1 (-10) ; <>word(w1-10+w2) then jl. a2. ; goto next global entry; al w2 x2 +2 ; se w2 8 ; jl. a3. ; jl. a6. ; goto store reference; a4: rs. w1 f20. ; search in catalog: am. (f4.) ; end globals:=w1; sl w1 -18 ; if w1+18>=opndstackpoint jl. d0. ; then goto stack owerflow; ; comment tail part fills 10 ; words at return from ; look up entry; al w3 x1 -10 ; jd 1<11+42 ; look up entry(w1-10,w1,w0); se w0 2 ; if result=2 then jl. a5. ; alarm(<:catalog:>); jl. w1 e5. ; comment input-output error; <:catalog:> a5: rl. w1 f20. ; kind and specs in last global dl w3 x1 14 ; entry:= if entry looked up bl w1 x1 16 ; and content=procedure se w0 0 ; if result<>0 jl. 8 ; then kind and specs. unknown sl w1 32 ; if shared entry jl. a13. ; goto a13 se w1 4 ; if content=procedure then dl. w3 (f19.) ; optional word 6 and 7 from tail ad a13:rl. w1 f20. ; ds w3 x1 ; ; fjernes efter test ; se w0 6 ; if result = 6 jl. a6. ; then jl. w1 e5. ; alarm; <:name form of look up entry<0>:> a6: ; store reference: rl. w2 b1. ; glob references( am. (f21.) ; twice extno):=w1; rs w1 x2 ; jl. a0. ; goto next external; a7: al w2 0 ; out external list:extno:=0; jl. a10. ; goto test for end list; a8: al w2 x2 +1 ; next item out: rs. w2 b0. ; extno:=extno+1; ls w2 1 ; am. (f21.) ; w2:=glob references(extno); rl w2 x2 ; sn w2 0 ; if no external jl. a12. ; test for end list al w1 x2 -10 ; a9: bl w0 x1 ; for w1:=w2-10 step 1 until jl. w3 e3. ; w2+1 do al w1 x1 +1 ; outbyte(byte(w1)); se w1 x2 +2 ; jl. a9. ; a12: rl. w2 b0. ; a10: se. w2 (f37.) ; test for end list: jl. a8. ; if extno<>no.externals then goto next item out; al. w2 b4. ; out pseudo external entry: a14: zl w0 x2 ; the pseudo external entry jl. w3 e3. ; contains the compiler version al w2 x2 +1 ; number used only by pass9; se. w2 b5. ; jl. a14. ; jl. w3 e2. ; inbyte; al w0 x2 +1 ; outbyte(inbyte+1);comment jl. w3 e3. ; no.externals+pseudo external entry; rl. w1 f12. ; set bottom rs. w1 (f4.) ; operand undefined rl. w1 f20. ; w1:= end globals; jl. d30. ; goto adjust oprt point; e. b. a1,b0 ; error labels:comment a table holding ; multiple- or not declared labels, ; if any, is established; w. b0: 0 ; addr of end labels c3: al. w3 f23. ; error labels:w3:= ; addr of enderr labels; rs. w3 b0. ; label list:addr of endlabels rl w1 x3 ; :=w3;w1:=end labels; se w1 0 ; if w1<>0 then jl. a0. ; goto table size; am. (f3.) ; al w1 -5 ; w1:=label base:= rs w1 x3 -2 ; oprt stack point-5; a0: jl. w3 e2. ; table size: wa w2 2 ; w2:=end labels:= w1+inbyte; rs. w2 (b0.) ; sl. w2 (f4.) ; if w2>=opnd stack point then jl. d0. ; goto stack owerflow; a1: al w1 x1 +1 ; for w1:=w1+1 step 1 until jl. w3 e2. ; end labels do hs w2 x1 ; byte(w1):=inbyte; am. (b0.) ; se w1 (0) ; jl. a1. ; sz w1 1 ; w1:=end labels//2*2; al w1 x1 -1 ; jl. d30. ; goto adjust oprt point; e. b. a4,b1 ; decl array param ; parameterranges has to be moved to the stack ; during run time, and to do this, pass6 treats ; each parameterrange as an assignment statement. ; for adjustable arrays, code to calculate lower ; and upper value, has to be generated,and this is ; done by evaluating arrayindex in the usual way ; for first and last array element. w. b0: 0 ; adjustable b1: 1 ; one ; decl array param: c4: jl. w3 e2. ; inbyte;comment no.bytes,skipped; jl. w3 e2. ; control word part4:= ba. w2 f2. ; control word part4+inbyte;comment hs. w2 f2. ; type of array; jl. w3 d4. ; stack and output opnd; jl. w3 e2. ; rs. w2 f6. ; no.dimensions:= inbyte; rl. w1 f3. ; ls w2 1 ; w2:=oprtstack point+ wa w2 2 ; 2* no.dimensions; sl. w2 (f4.) ; if w2>= opnd stack point then jl. d0. ; goto stack owerflow; rs. w2 f29. ; endranges in decl:=w2; ; comment ranges are picked up and ; stored in oprt stack; a0: sn. w1 (f29.) ; for w1:=oprtstackpoint+2 step 2 jl. a1. ; until endranges in decl do al w1 x1 +2 ; begin jl. w3 e2. ; byte(w1):=inbyte; hs w2 x1 ; jl. w3 e2. ; byte(w1+1):=inbyte; hs w2 x1 +1 ; jl. w3 e2. ; inbyte; jl. w3 e2. ; w2:=inbyte; sn w2 0 ; if w2<>0 then jl. a0. ; begin comment parameterrange; ; rs. w2 b0. ; adjustable:= true; al w0 h5+0 ; jl. w3 e3. ; outbyte(simpel local); bz w0 x1 +1 ; jl. w3 e3. ; outbyte(byte(w1+1));comment al w0 h5+2 ; stack relativ address to range; jl. w3 e3. ; outbyte(simpel param); al w0 x2 ; jl. w3 e3. ; outbyte(w2);comment stack al w0 h24+2 ; relativ with paramno; jl. w3 e3. ; outbyte(assign integer); jl. a0. ; end ; end; ; comment calculate lower and upper a1: al w2 0 ; for adjustable arrays; sn. w2 (b0.) ; if -,adjustable then jl. a4. ; goto end array decl; rs. w2 b0. ; adjustable:=false; rl. w2 f6. ; al. w1 b1. ; rangeaddress:=one; ; comment new lower; a2: jl. w3 d6. ; for w2:=no.dimensions step -1 al w2 x2 -1 ; until 1 do se w2 0 ; out range value(rangeaddress); jl. a2. ; jl. w2 d7. ; adjust upplow; al w0 h3+0 ; jl. w3 e3. ; outbyte(adj lower); rl. w1 f3. ; comment new upper; a3: al w1 x1 +2 ; for r address:=oprt stackpoint+2 jl. w3 d6. ; step 2 until end ranges indecl do se. w1 (f29.) ; out range value(r address); jl. a3. ; jl. w2 d7. ; adjust upplow ; al w0 h3+1 ; jl. w3 e3. ; outbyte(adj upper); a4: al w0 h3+2 ; end array decl: jl. w3 e3. ; outbyte(init array); al w0 h3+3 ; if adjustable se w2 0 ; then outbyte(adj array) al w0 h3+4 ; else outbyte(fix array); jl. w3 e3. ; jl. d31. ; goto remove opnd; e. c5: jl. w3 e2. ; local entry list: jl. w3 e11. ; w2:=inbyte;repeat inputbyte; rs. w2 f31. ; no.entries:=w2; jl. w3 d5. ; copy opnd descr; al w0 0 ; no.operands:=0;comment rs. w0 f8. ; executable part starts immediate- ; ly after local entry list; jl. c80. ; goto new inbyte; c6: jl. w3 d5. ; declare and lists: copy opnd descr; jl. c80. ; goto new inbyte; c7: al. w3 f36. ; nulls:w3:=addr of endnulls; jl. c3.+2 ; goto label list; c8: jl. w3 d4. ; copy fixed lenght: ; stack and output opnd; d31: rl. w1 f4. ; remove opnd: al w1 x1 +2 ; opnd stackpoint:= rs. w1 f4. ; opnd stackpoint+2; jl. c80. ; goto new inbyte; c9: jl. w3 d4. ; operand: stack and output opnd; jl. c80. ; goto new inbyte; b. a1 ; array descr: ; the fixed part is output at once while range-descriptions ; are stored in operator-stack as shown(1 word pr range),with ; an end range operator on the top of them,see label a1: ; ; - - - - - - - ; ! range 1 ! the ranges are later on to be ; - - - - - - - used in action c69,index uns, ; ! range 2 ! to output a reverse polish ; - - - - - - - expression for calculating a ; ! ! one-dimensional index,or ; ! ! to be output if the array ; - - - - - - - ident is a parameter. ; ! range n-1 ! ; - - - - - - - ; ! no. ranges ! ; - - - - - - - ; ! end range ! part3 of end range operator holds a ; ! operator ! pointer to the ranges,and it is ; ! ! initialised during stacking of ; - - - - - - - array(. w. c10: jl. w3 e2. ; jl. w3 d4. ; stack and output opnd; jl. w3 e2. ; rs. w2 f6. ; no.dimensions:=inbyte; al w0 x2 ; rl. w1 f3. ; w1:=oldpointer:= rs. w1 f10. ; oprt stack pointer; ls w0 1 ; wa w0 2 ; limit:=w1+no.dimensions*2; sl. w0 (f4.) ; if limit>= opnd stack point then jl. d0. ; goto stack owerflow; rs. w0 f3. ; oprtstack point:= limit; rs w2 (0) ; oprtstack(oprtstack point):= al w1 x1 +2 ; no.dimensions; a0: sn w0 x1 ; for w1:=oldpoint+2 step 1 jl. a1. ; until limit-1 do jl. w3 e2. ; byte(w1):=inbyte; hs w2 x1 ; al w1 x1 +1 ; jl. a0. ; a1: al w2 14<7+1<1 ; comment end range is put hs. w2 f0. ; in control word; al w2 84 ; control word(6 bytes):= ls w2 12 ; 14<7+1<1,0,0,0,pointer to rs. w2 f2. ; end range in oprt table,0; jl. d3. ; goto test control word; e. b. b0 ; w. b0: 2. 10000000000000100 ; zarray opnd c11: jl. w3 d4. ; zone: stack and output opnd;comment rl. w1 b0. ; w0 contains no.zones; se w0 0 ; if no.zones<>0 then rs. w1 (f4.) ; opndstack(top):=zarray opnd; jl. c80. ; goto new inbyte; e. c12: jl. w3 d4. ; external: stack and output opnd; jl. w3 d16. ; comment w0 and w2 contain extno; rl. w0 (f4.) ; get params(extno,receive kind); jl. w3 d10. ; w0:=top operand; check opnd; se. w1 (f12.) ; if operand<>undefined then rs. w1 (f4.) ; opndstack(top):=operand; al w2 i1 ; w2:=end paramdescription; jl. d1. ; goto fetch control entry; ; comment an endparam-operator will ; be stacked on top of the param- ; descriptions; c13: jl. w3 d4. ; ext param: stack and output opnd; al w2 0 ; jl. w3 d16. ; get params(unknown,receive kind); al w2 i1 ; w2:=end paramdescription; jl. d1. ; goto fetch control entry; c14: al w0 177 ; label:controlword part4:=label no.; rx. w0 f18. ; type of last opnd:=177;comment see hs. w0 f2. ; comment for constant; jl. w3 d4. ; stack and output opnd; rs. w0 f18. ; last opnd:=labelno.;comment w0 ; contains label no. at return; rl. w3 f7. ; no.labels :=no.labels+1; al w3 x3 +1 ; rs. w3 f7. ; jl. w3 d15. ; label check; jl. c80. ; goto new inbyte; c15: al w0 177 ; constant:type of last operand:=7; rs. w0 f18. ; comment no change of operand-descr jl. c9. ; during call of stack and output ; opnd; goto operand; c16: rl. w1 f8. ; vanished opnd: al w1 x1 +1 ; no.operands:= rs. w1 f8. ; no.operands+1; jl. c80. ; goto new inbyte; c17: jl. w1 d9. ; dyadic input: check top operand; jl. c80. ; goto new inbyte; c18: jl. w1 d9. ; logic dyadic: check top operand; so w1 1<5 ; if resulttype<>logical then jl. d32. ; goto not relation if;comment ; logic express is given a special ; treatment,cf. description; am 1 ; bl. w0 f0. ; outbyte(control word part2); jl. w3 e3. ; comment logicand or logicor; rl. w1 f3. ; priority of top oprt:= bl w2 x1 -4 ; priority of top oprt-2;comment to al w2 x2 -2<7 ; prevent that and unstacks and,f.ex.; hs w2 x1 -4 ; al w2 h15 ; oprtstack(top part4):=logpoint-1; hs w2 x1 ; ; d32: al w0 0 ; not relation if: rs. w0 f9. ; maybe relation if:= false; jl. c80. ; b. a0 ; w. c19: am. (f4.) ; mult assign: rl w1 2 ; w1:=nexttop operand la. w1 f25. ; and all type mask + lo. w1 f1. ; variable kinds; jl. a0. ; goto check assign; c20: rl. w1 f1. ; assign input:w1:=control word part3; a0: rl. w0 (f4.) ; check assign: w0:=top operand; jl. w3 d10. ; check opnd; rs. w1 (f4.) ; opndstack(top):=result operand; jl. c80. ; goto new inbyte; e. c21: jl. w3 d4. ; decl label: stack and output opnd; rs. w0 f18. ; last operand:=label no.; jl. w3 d15. ; label check; jl. d31. ; goto remove opnd; c22: al w0 0 ; comp goto: rs. w0 f7. ; no.labels:=0; jl. c80. ; goto new inbyte; c23: al w0 1<10 ; if input: maybe relif:=true;comment rs. w0 f9. ; 1<10 added to a relation-bytevalue al w0 0 ; says ifrelart in stead of relart; rs. w0 f28. ; no ifoutput:=false; jl. c80. ; goto new inbyte; c24: jl. w1 d9. ; end if input: check top operand; rl. w1 f4. ; al w1 x1 +2 ; opndstack point:= rs. w1 f4. ; opndstack point+2; jl. d32. ; goto not relation if; c25: jl. w1 d9. ; doinit: check top operand; am. f0. ; bl w0 1 ; special do:=control word part2; rs. w0 f13. ; comment general or special do; bz. w0 f2. ; w0:=control word part4; jl. w3 e3. ; outbyte(w0); jl. d31. ; goto remove opnd; c27: jl. w3 d14. ; do oprt out: integer conv; bz. w0 f2. ; wa. w0 f13. ; outbyte(basevalue+specialdo); jl. w3 e3. ; comment doinitgen or doinitspec; jl. c80. ; goto new inbyte; c28: jl. w3 d14. ; imp until step: integer conv; bz. w0 f2. ; jl. w3 e3. ; outbyte(controlword part4); am. f0. ; bl w0 1 ; byte := control word part 2; se w0 0 ; if byte <> 0 then jl. w3 e3. ; outbyte(byte); jl. c80. ; goto new inbyte; b. b0 ; action stack entry: ; w. b0: 2.11111 ; proctype mask; ; ; table proctype kind holds 1 byte with an operand-mask ; for each possible proctype,found in paramdescriptions. ; it is used to check an entry-name against the unit-name. ; mask proctype h. g0: 2. 101000000 ; 0: program 2. 101000000 ; 1: subroutine 2. 100100000 ; 2: logical function 2. 100000001 ; 3: integer function 2. 100000100 ; 4: real function 2. 100000010 ; 5: long function 2. 100001000 ; 6: double function 2. 100010000 ; 7: complex function w. c29: am. (f17.) ; stack entry: bz w1 +8 ; w1:=word with proctype of this ls w1 -6 ; program unit; la. w1 b0. ; w1:=proctype; bz. w1 x1 g0. ; w1:=proctypekind(proctype); am. (f3.) ; oprtstack(top part2):= w1; rs w1 -2 ; comment operand-mask; jl. c80. ; goto new inbyte; e. ; table list left input: ; the inbyte listleft is given another name by means of the ; top-operand kind and the table listleft input that holds ; a pointer to inputentries for each possible kind. this new ; entry is used further on. h. g1: i6 ; simple : pointer to begin proc list 0 ; subscripted : not used i6 ; label variable: pointer to begin proc list 0 ; label : not used 0 ; zone indic : not used i2 ; array : pointer to begin array list i3 ; array eq zone : - - begin arr eq zone list i4 ; zone : - - begin zone list i5 ; zone array : - - begin zarray list i6 ; subroutine : - - begin proc list i6 ; function : begin proc list i19 ; undefined : - - trouble left( w. c30: jl. w3 e2. ; listleft input: rs. w2 f5. ; no.list elements:=inbyte; rl. w3 (f4.) ; ns w3 5 ; w2:=15-bitno for leftmost bit bl w2 5 ; al w2 x2 +14 ; in topoperand; bl. w2 x2 g1. ; inputbyte:=listleftinput(w2); jl. d1. ; goto fetch control entry; b. a2,b1 ; block for begin array list, ; begin zone list and ; begin zarray list; w. b0: 1<12 ; zoneindic kind c31: al w3 x1 -12 ; begin array list: word(rangepointer) rs w3 x1 -8 ; :=address of rangestart in stack; al. w1 d20. ; erroraddress:=subscript error; rl. w0 f6. ; a0: ; get kind: se. w0 (f5.) ; if no.dimensions<>no.list elements jl w2 x1 ; then error(erroraddress); al w2 1<9 ; resultkind:=subscriptkind; a1: rl. w1 (f4.) ; opnd result: la. w1 f25. ; opndstack(top):=opndstack(top) lo w1 4 ; and alltypemask +resultkind; rs. w1 (f4.) ; jl. c80. ; goto new inbyte; c32: al w0 1 ; begin zone list: no.dimensions:=1; a2: al. w1 d21. ; z subscript:erroraddress:=zoneerror; jl. a0. ; goto get kind; c33: al w0 2 ; begin zarray list: no.dimensions:=2; sh. w0 (f5.) ; if no.dimensions<=no.elements jl. a2. ; then goto z subscripts; rl. w2 b0. ; resultkind:=zoneindic kind; al w1 h10+0 ; outvalue of top operator:= hs. w1 (f3.) ; zonecomma; jl. a1. ; goto opnd result; e. b. a1 ; w. c34: jl. w1 d9. ; begin proc list: check top operand; rl. w3 f3. ; w3:=oprtstack point; se. w1 (f12.) ; if result operand<>undefined jl. a1. ; then goto check no.elements; al w1 4 ; top operator becomes trouble( hs w1 x3 -3 ; with output of a <call> byte ; during unstacking; jl. c80. ; goto new inbyte; a1: ; check no.elements: bl w1 x3 -18 ; no.formals:=byte(w3-18); sn. w1 (f5.) ; if no.formals= no.list elements jl. c80. ; then goto new inbyte; bl w0 x3 -17 ; w0:=param n;comment last paramdesc; sl. w1 (f5.) ; if no.formals> no.list elements jl. a0. ; then goto param error; al w1 40 ; hs w1 x3 -17 ; param n:=general; sl w0 39 ; if w0<> general then sl w0 41 ; a0: jl. w2 d22. ; param error: call error; jl. c80. ; goto new inbyte; e. c35: dl. w0 f1. ; begin io:comment read or write ds. w0 f41. ; is input; ; iocall:=control word part2; ; ioparammask:=control word part3; jl. w3 e2. ; comment readcall or writecall; se w2 0 ; no.elements:=inbyte; sl w2 3 ; if no.elements=0 or >2 then jl. w3 d22. ; call error; jl. c80. ; goto new inbyte; ; table commainput: ; the inbyte listcomma is given another name during call of ; define name(commatype) and table commainput, that holds a ; pointer to inputentries for each commaname. h. g2: i7 ; pointer to indexcomma i8 ; - - zonecomma i9 ; - - paramcomma i10 ; - - rw comma i20 ; - - troub comma w. c36: jl. w3 d13. ; list comma: define name(w2); bl. w2 x2 g2. ; inputbyte:=commatype(w2); jl. d1. ; goto fetch control entry; c37: jl. w3 d14. ; index comma: integer conv; jl. c80. ; goto new inbyte; c38: jl. w3 d14. ; zone comma: integer conv; al w0 h10+0 ; jl. w3 e3. ; outbyte(zone comma); jl. c80. ; goto new inbyte; c39: jl. w3 d11. ; paramcomma: actual vers formal; jl. c80. ; goto new inbyte; b. a0 ; w. c40: rl. w2 f4. ; stack iocomma: se. w2 (f14.) ; if opndstack is empty then jl. a0. ; begin rl. w2 f3. ; oprtstackpoint:= al w2 x2 -6 ; oprtstackpoint-6; rs. w2 f3. ; goto new inbyte; jl. c80. ; end; a0: rl. w1 f15. ; count io: al w1 x1 +1 ; iocount:= iocount+1; rs. w1 f15. ; rl. w0 f41. ; controlword part3:=ioparammask; rs. w0 f1. ; e. c41: rl. w0 f1. ; rw comma: w0:=controlword part3; jl. w3 d12. ; check param; jl. c80. ; goto new inbyte; ; table endlist input: ; the inbyte listright is given another name during call ; of define name(endlist type) and table endlist input, that ; holds a pointer to inputentries for each endlist-name h. g3: i11 ; end index list: pointer to end index i11 ; end zone list: - - end index i12 ; end proc list: - - end proc list i13 ; end rw list: - - end rw list i21 ; end troub list: - - end troub list w. c42: jl. w3 e2. ; end list input: rs. w2 f5. ; no.list elements:=inbyte; jl. w3 d13. ; define name(w2); bl. w2 x2 g3. ; inputbyte:=endlistinput(w2); jl. d1. ; goto fetch control entry; c43: jl. w3 d11. ; end proc list: actual vers formal; d33: am 1 ; parcount out: bl. w0 f0. ; jl. w3 e3. ; outbyte(control word part2); rl. w0 f5. ; sl. w0 (f11.) ; if no.list elements>= paramarea rs. w0 f11. ; then paramarea:=no.list elements; jl. w3 e3. ; outbyte(no.list elements); jl. c80. ; goto new inbyte; b. b0 w. b0: 2. 00001001001110000101 ; rwcomma mask c44: al w3 1 ; end rw list: rl. w0 f1. ; w0:= if no.listelements<>1 sn. w3 (f5.) ; then control word part3 rl. w0 b0. ; else rwcomma mask; jl. w3 d12. ; check param; jl. d33. ; goto parcount out; e. b. a0 ; w. c45: rl. w2 f4. ; end iolist: sn. w2 (f14.) ; if opndstack is empty then jl. a0. ; goto start implied; al w0 i24 ; control word part1:= hs. w0 f0. ; commaunstack priority; comment some al w0 h11+0 ; iocommas has to be unstacked; jl. w3 e3. ; outbyte(parcount); rl. w0 f15. ; if iocount>=paramarea then sl. w0 (f11.) ; paramarea:=iocount; rs. w0 f11. ; jl. w3 e3. ; outbyte(iocount); jl. d2. ; goto priority check; a0: rl. w0 f40. ; start implied: al w1 0 ; se. w1 (f15.) ; if iocount<>0 then jl. w3 e3. ; outbyte(iocall);comment readcall rs. w1 f15. ; or writecall; bl. w0 f2. ; iocount:=0; w0:=controlword part4; se w0 0 ; if w0<>0 then jl. w3 e3. ; outbyte(w0);comment implbegin se w0 h11+0 ; or parcount in which case jl. c80. ; endio was input; ; if w0=parcount then al w0 0 ; begin jl. w3 e3. ; outbyte(0); rl. w0 f40. ; outbyte(iocall); jl. w3 e3. ; end; jl. c80. ; goto new inbyte; e. c46: jl. w3 d4. ; declare ext zone: jl. w3 d16. ; stack and output opnd; al w3 x3 -8 ; get params(extno,receivekind); rs. w3 f3. ; outbyte(inbyte); jl. w3 e2. ; comment decl ext zone al w0 x2 ; consists of 3 bytes.only jl. w3 e3. ; 2 is output in ; stack and output opnd; ; oprtstackpoint:=oprtstackp rl. w0 (f4.) ; -8;comment pamdescriptions are se w0 x1 ; removed from the stack; jl. w2 d27. ; if receivekind<>zone then jl. d31. ; standard zone error; ; goto remove opnd; c47: jl. w3 d4. ; area arr zone param: rl. w0 f11. ; stack and output opnd; jl. w3 e3. ; outbyte(paramarea); rl. w1 f42. ; bl w0 2 ; jl. w3 e3. ; outbyte(no.labels in unit); bl w0 3 ; jl. w3 e3. ; outbyte(no.globals in unit); rl. w0 f37. ; jl. w3 e3. ; outbyte(no.externals); jl. d31. ; goto remove opnd; c48: al w0 1 ; data star: rs. w0 f30. ; mult data:=1; jl. d31. ; goto remove opnd; c49: al w0 3 ; array data: am. (f4.) ; dl w2 2 ; jl. w3 d18. ; conv oprt2(top,nexttop,3);comment al w0 0 ; treated as unstacking of assign; rx. w0 f30. ; w0:=mult data; mult data:=0; ba. w0 f2. ; w0:=w0+ control word part4; jl. w3 e3. ; outbyte(w0); jl. d31. ; goto remove opnd; c50: rl. w2 f14. ; end statement: rs. w2 f4. ; opnd stackpoint:= opnd bottom; jl. c80. ; goto new inbyte; c51: jl. w3 e1. ; end line: count line; al w3 0 ; rs. w3 f8. ; no.operands in line:= 0; jl. c80. ; goto new inbyte; c52: rl. w2 e9.+4 ; begin unit: rs. w2 f4. ; opndstackpoint:=opnd bottom:= rs. w2 f14. ; last work for pass; rl. w2 f12. ; set bottom rs. w2 (f4.) ; operand undefined al w2 0 ; rs. w2 f43. ; zoneornot:=0; rs. w2 f8. ; no.operands in line:=0; rs. w2 f34. ; page:=0; rs. w2 f11. ; paramarea := 0; rs. w2 f23. ; end error labels:= rs. w2 f36. ; end nulls := 0; al w3 -12 ; head address:= wm. w3 f31. ; head address-12*no.entries; wa. w3 f17. ; comment no.entries in rs. w3 f17. ; previous unit; jl. w3 d42. ; get proctype; al w3 2 ; comment w1:=proctype; sn w1 0 ; if proctype=program then rs. w3 f44. ; proginf:=2; rl. w1 f20. ; w1:=end global; al w2 1000 ; line no.:=infinite; rs. w2 f32. ; jl. d30. ; goto adjust oprt point; c53: jl. w3 e2. ; call: no.list elements:= rs. w2 f5. ; inbyte; al w1 1<6 ; top operand:=top operand lo. w1 (f4.) ; +notype; rs. w1 (f4.) ; jl. c34. ; goto begin proc list; c54: rl. w0 f44. ; end pass: jl. w3 e3. ; outbyte(progin); jl. e7. ; call next pass; b. b0 ; table relationart holds for each ; relation a byte with art<3; h.b0: 1<3,3<3,2<3,6<3,4<3,5<3 ; lt,le,eq,ge,gt,ne w. c55: ac w1 i16 ; relation: wa. w1 f18. ; w1:=last operand-.lt.bytevalue; bl. w1 x1 b0. ; oprtstack(top part4):= hs. w1 (f3.) ; relationart(w1); jl. c17. ; goto dyadic input; e. c56: al w2 i17 ; data init:inputbyte:=data array; jl. d1. ; goto fetch control entry; c57: jl. w2 d24. ; errors: error record; jl. c80. ; goto new inbyte; b. b0 ; unknown record: w. b0: <: unknown record to pass6<0>:> c58: al. w1 b0. ; message(<:unknown record to pass6); jl. w3 e4. ; rl. w0 f18. ; writeinteger(last operand); jl. w3 e14. ; 32<12+5 ; al w1 -2000 ; al w3 2 ; set rs. w3 x1 +e87.+2000 ; warning.yes jl. c80. ; goto new inbyte; e. c59: jl.w3 e2. ; globals and labels: hs w2 2 ; no.labels in unit:=inbyte; jl. w3 e2. ; hs w2 3 ; no.globals in unit:=inbyte; rs. w1 f42. ; jl. c80. ; goto new inbyte; ; unstacking actions specified with c-names starting with c60. ; a-and b-names used as in stacking actions ; algol names are marked uns c60: la. w1 f25. ; monadic oprt uns: operand:=w1 and lo. w1 f26. ; all typemask +expresskind; jl. d35. ; goto store operand; c61: am 1 ; assign uns: oprtclass:=3; ; goto conv call; c62: am 1 ; arith oprt uns: oprtclass:=2; ; goto conv call; c63: am 1 ; logical dyadic uns: oprtclass:=1; ; goto conv call; c64: al w0 0 ; exponent uns: oprtclass:=0; jl. w3 d17. ; conv call: conv oprt1(top,nexttop, jl. d35. ; oprtclass); ; goto store operand; c65: rl. w1 (f4.) ; shift uns: w1:=opndstack(opndstack jl. c79. ; print);goto bit actions;comment ; w1 is left operand of shift; ; relation unstacking: ; output consists of 2 bytes, ; 1) rel , output in this action ; 2) ifrelart or relart ,output in bit actions with ; ; ifrelart::= 1<10 +art<3 +type ;if statement with one relation ; relart ::= 0<10 +art<3 +type ;usual relation in expressions ; ; art<3 is specified as outvalue in the oprtstack item ; the choice between relart and ifrelart is made as: ; ; maybe relif : y y n n ; endlogif in control word: y n y n ; ---------------------------------------------------------- ; output : ifrelart relart relart relart ; ; the boolean mayberelif becomes true when logif is stacked and ; false when a logical oprt or endlogif is stacked; c66: al w0 2 ; relation uns: jl. w3 d17. ; conv oprt1(top,nexttop,2); al w0 h15+0 ; jl. w3 e3. ; outbyte(rel); sn. w1 (f12.) ; if operand=undefined then jl. d35. ; goto store operand; al w3 1<7+1<5 ; opndstack(top):= rs. w3 (f4.) ; logical expression; am 1 ; bl. w2 f0. ; w2:=control word part2; comment al w0 1<10 ; w2=-1 if endlogif in control word; sn. w0 (f9.) ; if -,(mayberelif and w2=-1) se w2 -1 ; then jl. c79. ; goto bit actions; ; comment second byte is ifrelart; rs. w0 f28. ; noifoutput:=true;comment when if ba. w0 (f3.) ; is unstacked no byte is output; hs. w0 (f3.) ; oprtstack(top part4):= jl. c79. ; oprtstack(top part4)+1<10; ; goto bit actions; c67: al w0 0 ; if uns: sn. w0 (f28.) ; if -, noifoutput then jl. c79. ; goto bit actions;comment usual act; am. (f3.) ; oprtstack(top part1):=0;comment hs w0 -4 ; the purpose is to set output-and jl. c79. ; modify bit to zero; ; goto bit actions; c68: rl. w1 f4. ; end arith if uns: al w1 x1 +6 ; opndstack point:=opndstackpoint+6; rs. w1 f4. ; comment removes 3 labelno.s; jl. c79. ; goto bit actions; c69: rl. w1 (f27.) ; index uns: al w1 x1 -2 ; w1:=word(rangepointer):= rs. w1 (f27.) ; word(rangepointer)-2;comment jl. w3 d6. ; w1 holds the address of next range; al w0 h22+26 ; out rangevalue(w1); jl. w3 e3. ; outbyte(multiply integer); jl. c79. ; goto bit actions; ; array left uns: ; rangedescriptions ending with an endrange oprt is stacked just below ; the array-left oprt, and they must be removed as we want no dopevector ; output for subscripted variables c70: rl. w3 f3. ; array left uns:w3:=oprtstackpoint; rl w2 x3 -12 ; ls w2 1 ; w2:=oprtstackpoint- (no.ranges*2+6); ac w2 x2 +6 ; comment new oprtstackpoint-value; wa w2 6 ; dl w1 x3 ; ds w1 x2 ; oprtstack(w2):= rl w1 x3 -4 ; oprtstack(w3); rs w1 x2 -4 ; rs. w2 f3. ; oprtstackpoint:=w2; rl. w1 (f4.) ; w1:=top operand; jl. c79. ; goto bit actions; b. a1 ; ; w. c71: al w0 h12+0 ; range uns:comment output of dope- jl. w3 e3. ; vector; rl. w0 f6. ; outbyte(start range); jl. w3 e3. ; outbyte(no.dimensions); rl. w2 f10. ; w2:=oldpointer;comment value of al w1 x2 +2 ; oprtstackpoint before ranges was ; stacked; a0: am. (f3.) ; for w1:=w2+2 step 1 until sn w1 -6 ; oprtstackpoint-6 do jl. a1. ; bl w0 x1 ; outbyte(byte(w1)); jl. w3 e3. ; al w1 x1 +1 ; jl. a0. ; a1: rs. w2 f3. ; oprtstackpoint:=oldpointer; jl. d2. ; goto priority check; e. c72: rl. w1 f18. ; param descr uns: sn w1 44 ; if last opnd=call then jl. d3. ; goto test control word; rl. w1 f3. ; al w1 x1 -14 ; oprtstackpoint:= rs. w1 f3. ; oprtstackpoint-14; jl. d2. ; goto priority check; c73: jl. w3 d26. ; comp goto uns: integer conv2; al w0 h14+4 ; jl. w3 e3. ; outbyte(gotoc); rl. w0 f7. ; jl. w3 e3. ; outbyte(no.labels); jl. c79. ; goto bit actions; ; stacking actions for troub comma and end troub list: c74: al. w1 f38. ; troub comma: parampointer:= rs. w1 f27. ; general spec pointer; jl. c39. ; goto param comma; c75: al. w1 f38. ; end troub list:parampointer:= rs. w1 f27. ; general spec pointer; jl. c43. ; goto end proc list; c76: jl. w3 e2. ; do: rs. w2 f18. ; last operand:=do label; rl. w2 f8. ; al w2 x2 +1 ; no.operands:=no.operands+1; rs. w2 f8. ; jl. w3 d15. ; label check; jl. c80. ; goto new inbyte; b. b0 ; return ; table unitkind holds for each possible proctype-value of current ; unit some returninformation used in pass 8; ; proctype h. b0: 0 ; 0: program 0 ; 1: subroutine 1 ; 2: logical function 1 ; 3: integer function 1 ; 4: real function 1 ; 5: long function 2 ; 6: double function 2 ; 7: complex function w. c77: jl. w3 d42. ; return:get proctype; ; comment w1=proctype; bl. w0 x1 b0. ; w0:=unitkind(proctype); wa. w0 f43. ; w0:=w0+zoneornot; jl. w3 e3. ; outbyte(w0); jl. c80. ; goto new inbyte; e. c78: al w0 1<2 ; local zone decl: rs. w0 f43. ; zoneornot:=1shift 2; jl. c8. ; goto copy fixed lenght; ; bit actions: part1 of top operator is decoded and actions according ; to the bits are executed; finally the operator is ; removed. ; table modify: holds for each type a number to be added to the outbyte- ; value if modify-bit =1; h.g4: 2, 4, 3, 5 ; integer, long,real,double 6, 1, 0, 7 ; complex, logical,notype,undefined b. a2 ; w. d35: rs. w1 (f4.) ; store operand:opndstack(top):=w1; c79: am. (f3.) ; bit actions:comment w1 holds operand; bz w2 -4 ; w2:=oprtstack(top part1); so w2 1 ; if modify output bit=0 then jl. a0. ; goto ask for result; al w0 1<6-1 ; la w1 0 ; w1:=type bit numb(operand and bl. w1 x1 g5. ; all type mask); comment type ; represented as a number<8; bl. w0 x1 g4. ; w0:=modify(w1); ba. w0 (f3.) ; jl. w3 e3. ; outbyte(w0+oprtstack(top part4)); a0: so w2 1<4 ; ask for result: if noresult bit=1 jl. a1. ; then rl. w1 f4. ; opndstackpoint:= al w1 x1 +2 ; opndstackpoint+2; rs. w1 f4. ; a1: so w2 1<3 ; if output self bit=1 then jl. a2. ; bz. w0 (f3.) ; outbyte(oprtstack(top part4)); jl. w3 e3. ; a2: rl. w1 f3. ; oprtstackpoint:= al w1 x1 -6 ; oprtstackpoint-6; rs. w1 f3. ; so w2 1<2 ; goto(if terminate unstack.bit=0 jl. d2. ; then priority check jl. d3. ; else test control word); e. ; global variables w. f0: 0 ; control word part1<12 +part2 f1: 0 ; control word part3 f2: 0 ; control word part4<12 +part5 f3: 0 ; oprt stack pointer f4: 0 ; opnd stack pointer f5: 0 ; no. list elements f6: 0 ; no. dimensions f7: 0 ; no. labels f8: 0 ; no. operands f9: 0 ; maybe relation-if f10: 0 ; oldpointer f11: 0 ; paramarea f12: 1<20-1 ; undefined f13: 0 ; special do f14: 0 ; opnd bottom f15: 0 ; iocount f17: 0 ; head address f18: 0 ; last operand f19: 0 ; global base f20: 0 ; end global f21: 0 ; glob ref base f22: 0 ; err label base f23: 0 ; end err labels f24: 0 ; error mess; f25: 1<7-1 ; all type mask f26: 1<7 ; expresskind; f27: 0 ; rangepointer, parampointer f28: 0 ; no ifoutput f29: 0 ; end ranges in decl. f30: 0 ; mult data f31: 0 ; no.entries f32: 0 ; line no. f33: 50 ; lines pr page f34: 0 ; page f35: 0 ; null base f36: 0 ; end nulls f37: 0 ; no.externals f38: 0 ; general spec pointer f39: 40<12 ; general spec f40: 0 ; iocall f41: 0 ; ioparammask f42: 0 ; globals and labels f43: 0 ; zoneornot f44: 1 ; proginf ; table type bit numb: ; it is used to convert the usual typerepresentation for operands ; ,i.e. one of the bits 17-23 equal to 1, to an integer ; =23-bit no.for type. ; an undefined gives the result 8. ; only 6 bits are used,i.e. no.type is represented with 000000 h. g5: 6, 0, 1, 0, 2, 0, 0, 0; no.type,integer,long,0,real,0,0,0 3, 0,r.7, 4, 0,r.15, 5, 0; double, 7*0,complex,16*0,logical r.30,7 ; 30*0,undefined w. d36: jl. e2. ; stepping stone for inbyte; d37: jl. e3. ; stepping stone for outbyte; d38: jl. e4. ; stepping stone for message; d39: jl. e14. ; stepping stone for writeinteger; d40: jl. e13. ; stepping stone for writetext; d41: jl. e5. ; stepping stone for alarm; d0: al. w1 e10. ; stack owerflow:w1:=<:stack:> addr; jl. w3 e5. ; alarm; ; central logic ; an inputbyte causes an entry from inputtable to be stored in ; control word. ; the control word-priority is tested against the top-operand ; and as a result the top operand can be unstacked,starting with ; action unstacking and continuing with the action name stored ; in part4. ; if control word priority is the highest one, actions according ; to bits in part1 and action-name in part4 takes place. b. a4 ; w. c80: jl. w3 e2. ; new inbyte: rs. w2 f18. ; last operand:=w2:=inbyte; sh w2 177 ; if w2<=type independent value then jl. d1. ; goto fetch control entry; al w2 x2 -170 ; comment w2 is an operand or label; ls w2 -3 ; w2:=kind of operand;comment 0<w2<16; sl w2 42 ; if w2>=42 then w2:=labelentry; al w2 i15 ; comment labelno.s start with ; bytevalue 512; d1: bl. w2 x2 g17. ; fetch control word: am. g17. ; stepping stone dl w1 x2 i23 ; pointer:=inputentries(w2); ; i23=g19-g17 ds. w1 f2. ; am. g17. ; control word:=inputtable(pointer); rl w2 x2 i25 ; comment control word consists of rs. w2 f0. ; 3 words; d2: am. (f3.) ; priority check: rl w0 -4 ; w0:=part1 part2 of top operator; rl. w2 f0. ; w2:=part1 part2 of control word; sl w0 x2 ; comment priority in part1; jl. a2. ; if w0>=w2 then goto unstacking; d3: bz. w0 f0. ; test control word: so w0 1<1 ; w0:=control word part1; jl. a0. ; if stack bit=1 then rl. w1 f3. ; begin comment an operator is to al w1 x1 +6 ; be stacked in oprtstack; sl. w1 (f4.) ; oprtstackpoint:=oprtstackpoint+6; jl. d0. ; if oprtstackpoint>=opndstackpoint rs. w1 f3. ; then goto stack owerflow; bz. w2 f2. ; w2:=control word part4; dl. w0 x2 g18. ; ds w0 x1 ; am -4 ; oprtstack(top):= rl. w0 x2 g18. ; operatortable(w2); rs w0 x1 -4 ; bz. w0 f0. ; end; a0: so w0 1 ; if output self bit=1 then jl. a1. ; bz. w0 f2. ; outbyte(control word part4); jl. w3 e3. ; a1: bl. w2 f2.+1 ; goto stacking action( jl. x2 c80. ; control word part5); ; comment w1 contains oprtstackpoint; a2: am. (f3.) ; unstacking: bz w0 -4 ; w0:=part1 of top operator; rl. w2 f4. ; if nexttop result bit=1 then so w0 1<5 ; begin jl. a3. ; opndstackpoint:=opndstackpoint+2; al w2 x2 +2 ; w1:=opndstack(opndstackpoint-2); rs. w2 f4. ; end am -2 ; else a3: rl w1 x2 ; w1:=opndstack(opndstackpoint); so w0 1<6 ; if typecheck bit=1 then jl. a4. ; begin am. (f3.) ; w0:=part3 of top operator; rl w0 -2 ; comment operand mask; jl. w3 d10. ; check opnd; sn. w1 (f12.) ; if result operand=undefined then jl. d35. ; goto store operand; ; end; a4: am. (f3.) ; bl w2 1 ; goto unstacking action(part5 of jl. x2 c80. ; top operator); ; comment w1 contains result operand; e. b. a0,b1 ;procedure stack and output opnd; ; the procedure has 2 entries, stack and output opnd ; and copy opnd descr, called as: ; jl. w3 d4. and ; jl. w3 d5. ; in both cases the byte value in control word,part4 is output , ; followed by a number of bytes, copied from input. ; the number of bytes is in the first case found in control word, ; part2 and for entry copy opnd descr as the next inputbyte. ; when entry stack and output opnd is used,an operand-description, ; taken from control word,part3 and a type-dependent part from table ; opnd types is stacked in operand stack; ; registeruse: ; entry exit ; w3: returnaddress all registers undefined ; globals used: ; f0,f1,f2,f8,f18 ; local variables w. b0: 0 ; return address b1: 7 ; opnd type mask ; table opnd types: ; it contains for each poss.type of operands a byte, holding a ; pattern that added to part3 of an inputtable-entry form the total ; operand-description to be stored in operand stack h. g6: 2.1000000 ; notype 2.0100000 ; logical 2.0000001 ; integer 2.0000100 ; real 2.0000010 ; long 2.0001000 ; double 2.0010000 ; complex 2.0 ; no change of inputtable-entry ;entry: w.d4: rs. w3 b0. ; save return address; rl. w1 f4. ; opnd stack point:= al w1 x1 -2 ; opnd stack point-2; sh. w1 (f3.) ; if opnd stack point <=oprt stack jl. d0. ; point then goto stack owerflow; rs. w1 f4. ; rl. w2 f18. ; al w2 x2 -170 ; opnd stack(opnd stack point):= la. w2 b1. ; control word part3 + bz. w2 x2 g6. ; opnd types(type part of inputbyte); lo. w2 f1. ; rs w2 x1 ; rl. w1 f8. ; no.operands in line:= al w1 x1 +1 ; no.operands in line +1; rs. w1 f8. ; bz. w0 f2. ; jl. w3 d37. ; outbyte (control word part4); bz. w1 f0.+1 ; w1:=control word part2; jl. a0. ; goto next opnd byte; d5: rs. w3 b0. ; copy opnd descr: save returnaddress; bz. w0 f2. ; jl. w3 d37. ; outbyte (control word part4); jl. w3 d36. ; al w1 x2 ; w1:=w0:=inbyte; al w0 x2 ; jl. w3 d37. ; outbyte (w0); a0: sn w1 0 ; next opnd byte: jl. (b0.) ; if w1<>0 then jl. w3 d36. ; begin al w0 x2 ; outbyte(inbyte); jl. w3 d37. ; w1:=w1 -1; al w1 x1 -1 ; go to next opnd byte jl. a0. ; end; ; return; e. b. ; procedure get proctype; ; the procedure is called as ; jl. w3 d42. ; it gets the value of proctype for this unit by means of ; head address,that is supposed to point at the relevant entry ; in global entry table.head address is set in <begin unit>. ; registeruse: entry: w3=return address ; exit : w1=proctype ; globals: f17,f44 w. d42: am. (f17.) ; get proctype; bz w1 8 ; proctype:=byte(head ls w1 -6 ; address+8)shift-6; al w1 x1 -32 ; jl x3 ; return; e. b. a0,b0 ; procedure out range value(r address); ; the procedure is called when a range description is ; to be output as one operand,f.ex. in evaluating index-expressions ; for subscripted variables, and the call is ; jl. w3 d6. ; at entry-time w1 holds r address, i.e. the abs. address of the word ; holding the range-description. ; depending on the content the range will be output as an integer ; constant or a simple local of integer type ; registeruse: ; entry exit ; w1: r address w1,w2 unchanged ; w3: return address w0,w3 undefined ; local variables w. b0: 0 ; return address ; entry d6: rs. w3 b0. ; save returnadress; rl w3 x1 ; range:= word(r address); al w0 h5+0 ; w0:=simple local; sh w3 -1 ; if range<0 then jl. a0. ; go to range bytes; al w0 h6+2 ; jl. w3 d37. ; outbyte(int constant); bl w0 x1 ; w0:= range(0:11); a0: jl. w3 d37. ; outbyte(w0); bl w0 x1 +1 ; jl. w3 d37. ; outbyte(range(12:23)); jl. (b0.) ; return; e. b. a0 ; procedure adjust upplow ; it is called from action decl array param,when new upper and ; lower is calculated for adjustable arrays, and it finishes ; the reverse polish form for calculation by outputting ; range(n-1) to range(1) with each range followed by * and +. ; globals : f28 ; registeruse: ; entry: w2=return address; exit w2 unchanged w. d7: rl. w1 f29. ; for rangeaddress:= ; end ranges in decl-2 step -2 a0: al w1 x1 -2 ; until oprt stack point+2 do sn. w1 (f3.) ; begin jl x2 ; out range value(range address); jl. w3 d6. ; al w0 h22+26 ; outbyte (multiply integer); jl. w3 d37. ; al w0 h22+18 ; outbyte (dya plus integer); jl. w3 d37. ; end; jl. a0. ; return e. b. b0 ; procedure check top operand ; it checks the top operand description against the mask ; in control word part3 by calling check opnd, and changes ; the kind to express-kind . the call is: ; jl. w1 d9. ; ; registeruse: ; entry: w1=returnaddress ; exit: w1=result operand ; globals used: f1,f4,f12,f25,f26 ; local variable: w. b0: 0 ; returnaddress d9: rs. w1 b0. ; save return address; rl. w1 (f4.) ; w1:=opnd stack(opnd stack point); rl. w0 f1. ; w0:=control word part3; jl. w3 d10. ; check opnd; comment w1 contains se. w1 (f12.) ; masking result; la. w1 f25. ; if w1<>undefined then w1:= lo. w1 f26. ; w1 and alltypemask+expresskind; rs. w1 (f4.) ; opnd stack(opnd stack point):=w1; jl. (b0.) ; return; e. b. a1,b0 ; procedure check opnd; ; it performs a check of the operand in w1 against the ; operand mask in w0, and calls type error if type or ; kind error. ; check opnd is called as: ; jl. w3 d10. ; registeruse: ; entry exit ; w0 operand mask undefined ; w1 w0 and w1(or global undefined if error) ; w2 undefined ; w3 return address undefined ; globals: f12 ; local variable: w. b0: 0 ; return address d10: rs. w3 b0. ; save return address sn. w1 (f12.) ; if operand=undefined then jl. (b0.) ; return; la w1 0 ; w1:= operand and operand mask; sz w1 127 ; if type correct then jl. a1. ; goto kind check; a0: jl. w2 d19. ; operand error: type error; rl. w1 f12. ; w1:=undefined; jl. (b0.) ; return; a1: sh w1 127 ; kind check: if kind incorrect then jl. a0. ; goto operand error; jl. (b0.) ; return; e. ; table parammask contains for every formal param-specification, ; with values as in notes on code procedures in algol 5 , ; an operand mask to be used during param-checking ; the first two bits hold the columnindex to table paramkind ; param-mask paramspecification g7=k-4 ; w. 2.100000000000001110100000 ; 2: boolean name 2.100000000000001110000001 ; 3: integer name 2.100000000000001110000100 ; 4: real name 2.100000000000001110000010 ; 5: long name 2.100000000000001110001000 ; 6: double name 2.100000000000001110010000 ; 7: complex name 2.010000001001000000000100 ; 8: zone 2. 1110000010 ; 9: string 2. 0 ; 10: label 2. 0 ; 11 2.100000000000001110100000 ; 12: boolean value 2.100000000000001110000101 ; 13: integer value 2.100000000000001110000101 ; 14: real value 2.100000000000001110000010 ; 15: long value 2.100000000000001110001000 ; 16: double value 2.100000000000001110010000 ; 17: complex value 2.100000000000001110100000 ; 18: boolean address 2.100000000000001110000001 ; 19: integer address 2.100000000000001110000100 ; 20: real address 2.100000000000001110000010 ; 21: long address 2.100000000000001110001000 ; 22: double address 2.100000000000001110010000 ; 23: complex address ; param-mask paramspecification 2.010000001111001000100000 ; 24: boolean array 2.010000001111001000000001 ; 25: integer array 2.010000001111001000000100 ; 26: real array 2.010000001111001000000010 ; 27: long array 2.010000001111001000001000 ; 28: double array 2.010000001111001000010000 ; 29: complex array 2.100000010000000000000100 ; 30: zone array 2.010000100000000001000000 ; 31: no type procedure 2.010001000000000000100000 ; 32: boolean procedure 2.010001000000000000000001 ; 33: integer procedure 2.010001000000000000000100 ; 34: real procedure 2.010001000000000000000010 ; 35: long procedure 2.010001000000000000001000 ; 36: double procedure 2.010001000000000000010000 ; 37: complex procedure 2. 0 ; 38 2. 11111111001111111111 ; 39: general 2. 11111111001111111111 ; 40: general address 2. 11111111001111111111 ; 41: undefined b. ; procedure actual versus formal ; the procedure is called as: ; jl. w3 d11. ; it picks up an operand-mask from table parammask according to the ; formal paramdescription in byte(parampointer) and checks it against ; the top operand,i.e. actual param, during a call of check param. ; registeruse: ; entry: w3=return address ; exit: all undefined ; globals: f27 w. d11: rl. w1 (f27.) ; paramdescr:=byte(word(parampoint)); bl w2 x1 ; sl w2 39 ; if paramdescr<>general then sl w2 41 ; al w1 x1 -1 ; word(parampoint):= rs. w1 (f27.) ; word(parampoint)-1; ls w2 1 ; rl. w0 x2 g7. ; w0:=parammask(paramdescr); jl. d12. ; check param; return; e. b. a1,b4 ; procedure check param ; the procedure is called as ; jl. w3 d12. ; it checks the top operand,i.e. an actual param, against a mask ; found in w0 at entry time and stores in part4 of top operator ; the resulting parameterkind, found by table lookup in table ; paramkind with an indexvalue obtained from table actual paramkind ; by means of the param-masking result,and the columnindex ; contained in bit(0:1) in w0 at entry. ; registeruse: ; entry: w3=return address exit: all undefined ; w0=operand mask ; globals used: f3,f4 ; local variables: w. b0: 0 ; return address b1: 0 ; mask b2: 9 ; nine b3: 2. 1000000000100000000; function+simple b4: 2.111110011111111111111111; remove function+subroutine ; table actual paramkind holds for each operandkind an index to ; first part of table paramkind ; h.g8: 0 , 0 ; expression , simple 1 , 0 ; subscripted, labelname 7 , 4 ; label , zoneindic 2 , 2 ; array , array eq zone 3 , 5 ; zone , zone array 6 , 6 ; subroutine , function 8 ; undefined ; table paramkind holds for each actual-formal combination the resul- ; ting paramkind-bytevalue ; ; actual formal bytename h.g9: h27+0 ; expressions , general , paramsim h27+0 ; subscripted , - - - - , paramsim h27+16 ; array , - - - - , paramarr h9+0-3 ; zone , - - - - , paramzone h9+0-3 ; zoneindic , - - - - , paramzone h9+0-3 ; zonearray , - - - - , paramzone h27+24 ; procedure , - - - - , paramproc h27+0 ; label , - - - - , paramsim h27+0 ; undefined , - - - - , paramsim ; actual formal bytename 0 ; expressions , proc-zone-array , - h27+8 ; subscripted , - - - , paramsub h27+16 ; array , - - - , paramarr h9+0-3 ; zone , - - - , paramzone h9+0-3 ; zoneindic , - - - , paramzone 0 ; zonearray , - - - , - h27+24 ; procedure , - - - , paramproc 0 ; label , - - - , - h27+0 ; undefined , - - - , paramsim ; actual formal bytename h27+0 ; expressions , simple-zonearray , paramsim h27+0 ; subscripted , - - , paramsim 0 ; array , - - , - 0 ; zone , - - , - h9+2-3 ; zoneindic , - - , paramzinzar h9+1-3 ; zonearray , - - , paramzarr 0 ; procedure , - - , 0 ; label , - - , h27+0 ; undefined , - - , paramsim ; entry w.d12: rs. w3 b0. ; save returnaddress; rs. w0 b1. ; mask:=w0; rl. w1 (f4.) ; w1:=top operand; jl. w3 d10. ; check opnd; se. w1 (f12.) ; if result=undefined then jl. a0. ; begin rs. w1 b1. ; mask:=undefined; rl. w1 (f4.) ; result:=top operand; ; end; a0: so w1 1<6 ; if not notype so. w1 (b3.) ; and function+simple then jl. a1. ; la. w1 b4. ; remove function+subroutine bits; a1: ns w1 5 ; kindentry:=actparam(bit no. bl w2 5 ; for leftmost opndresult-bit); al w2 x2 +15 ; bl. w2 x2 g8. ; rl. w1 b1. ; al w0 0 ; kindentry:=kindentry+ ld w1 2 ; 9*columnindex; wm. w0 b2. ; wa w2 0 ; bl. w0 x2 g9. ; operator stack(top part4):= hs. w0 (f3.) ; paramkind(kindentry); jl. (b0.) ; return e. b. a0 ; procedure define name ; the procedure is called as: ; jl. w3 d13. ; it searchs through operator stack to find an operator with ; namegiving bit=1 and holds at exit time namekind in w2,picked ; up from part2 of this operator. ; at the same time rangepointer (same as parampointer) is initi- ; ated to point at part2 of the operator just below the searched one ; registeruse: ; entry: w3=returnaddress ;exit:w2=namekind ,w3 is unchanged ; w1=rangepointer ; globals: f3,f27 w. d13: rl. w1 f3. ; w1:=oprt stack point-2;comment al w1 x1 -2 ; points to part3 of top operator; a0: al w1 x1 -6 ; next operator: w1:=w1-6; bl w0 x1 +4 ; w0:=part1 of operator; bl w2 x1 +5 ; w2:=part2 of operator; so w0 1<1 ; if namegiving bit=0 then jl. a0. ; goto next operator; rs. w1 f27. ; rangepointer:=w1; jl x3 ; return; e. b. a0,b0 ; integer conv ; the call is: jl. w3 d14. or ; jl. w3 d26. ; it checks the top operand against a mask, found in ; 1)control word part3 for entry d14 ,or ; 2)top operator part3 for entry d26 ; if operand-type <> integer, a conversion byte is output as if ; the top operand were on the right side of an integer assignment ; statement, and finally the top operand is removed. ; registeruse: ; entry:w3=return address . exit:w1=opnd stack point ; globals: f1,f4,f12 ; local variables: w. b0: 0 ; return address d14: rl. w0 f1. ; integer conv:w0:=control word jl. a0. ; part3;goto get top operand; d26: am. (f3.) ; integer conv2: rl w0 -2 ; w0:=top operator part3; a0: rs. w3 b0. ; get top operand:save returnaddress; rl. w1 (f4.) ; w1:= opnd stack(top); jl. w3 d10. ; check opnd; al w2 1<0 ; if result operand <>undefined al w0 3 ; then se. w1 (f12.) ; jl. w3 d18. ; conv oprt2(w1,integer type,3); rl. w1 f4. ; comment top opnd is converted to al w1 x1 +2 ; integer type; rs. w1 f4. ; opnd stackpoint:=opndstackpoint+2; jl. (b0.) ; return; e. b. a0,b2 ; procedure label check; ; the procedure is called as: ; jl. w3 d15. ; it searchs through an errorlable-table,if any, with last ; operand,that contains a labelno, as key. ; if found,an error message is output during call of label error; ; registeruse: entry:w3=return address; exit:all undefined ; globals: f18, f22,f23 ; local variable: w. b0: 0 ; return address b1: 0 ; local return address b2: 0 ; error address d15: rs. w3 b0. ; save return address; dl. w2 f23. ; w1:=error label base; al. w0 d23. ; w2:=end error labels; jl. w3 a0. ; erroraddr:=label error; ; search; dl. w2 f36. ; w1:=null base;w2:=endnull; al. w0 d25. ; erroraddr:=null label; jl. w3 a0. ; search; jl. (b0.) ; return; a0: ds. w0 b2. ; search:save erroraddr; sl w1 x2 ; comment local proc; jl x3 ; for w1:=w1+1 step 1 until al w1 x1 +1 ; w2 do if byte(w1)=last opnd bl w0 x1 ; then goto found; se. w0 (f18.) ; return search; jl. a0.+2 ; jl. w2 (b2.) ; found: errormess(erroraddr); jl. (b1.) ; return; e. b. a0,b1 ; procedure get params(ext no,rec kind) ; the procedure is called as: ; jl. w3 d16. ; it unpacks the paramdescriptions from an entry in table ; global entries and stores them in the next 8 bytes in ; operator stack with param(n-6) in the highest address. ; in stead of proctype, no.paramdescriptions is placed in ; the lowest address. ; the entry is found via table greferences, that holds a ; pointer to global entries for each ext no. ; at exit time, oprt stack pointer points at the top word ; and w1 contains an operand description according to proctype. ; if the entry corresponds to a standard variable,i.e. 7<proctype<14 ; , the top operand kind is changed from external to simple. ; formats of paramdescription-words in global entries are described ; in notes on code procedures in algol 5 ,page 6 ; registeruse: ; entry: w2=extno exit: w1=rec kind ; w3=return address w3=oprt stack point ; globals: f3, f19,f21 ; local variables: w. b0: 0 ; return address b1: 0 ; second param word ; table extkinds holds for each proctype an operand-description ; specifying type and kind in the usual way ; description proctype g10: 2. 100000000001000000 ; 0: program 2. 100000000001000000 ; 1: subroutine 2. 1000000000000100000 ; 2: boolean function 2. 1000000000000000001 ; 3: integer function 2. 1000000000000000100 ; 4: real function 2. 1000000000000000010 ; 5: long function 2. 1000000000000001000 ; 6: double function 2. 1000000000000010000 ; 7: complex function 2. 100100000 ; 8: boolean variable 2. 100000001 ; 9: integer variable 2. 100000100 ; 10: real variable 2. 100000010 ; 11: long variable 2. 100001000 ; 12: double variable 2. 100010000 ; 13: complex variable 2. 1000000000000100 ; 14: zone variable 2. 1100000000001111111 ; 15: unknown ; entry: d16: rs. w3 b0. ; save returnaddress; ls w2 1 ; am. (f21.) ; rl w2 x2 ; w2:=glob reftable(ext no); dl w2 x2 ; paramdescr:=globalentries(w2); rs. w2 b1. ; secnd paramword:=paramdescr(24:47) al w2 -1 ; no.params:=1; al w0 0 ; w0:=0; al w3 0 ; w3:=0 a0: ld w1 6 ; next paramdescr: am. (f3.) ; w0w1:= wow1 shift 6; hs w0 x3 2 ; byte(oprt stackpoint+w3+2):=w0; se w0 0 ; if w0<>0 then al w2 x2 +1 ; no.params:= no.params+1; al w0 0 ; w0:=0; al w3 x3 +1 ; w3:=w3+1; sn w3 4 ; if w3=4 then rl. w1 b1. ; w1:=second paramword; sh w3 7 ; if w3<=7 then jl. a0. ; goto next param descr; wa. w3 f3. ; oprt stackpoint:= rs. w3 f3. ; oprt stackpoint+8; am x2 ; al w0 x3 -6 ; oprttable(endpamdesc part3) am i0 ; :=address of first param- rs. w0 g18. ; description; bl w1 x3 -6 ; proctype:=byte(oprtstackpoint-6) al w0 1<5-1 ; and language mask; la w1 0 ; sn w1 i22 ; if proctype=unknown then al w2 0 ; no.params:=0; hs w2 x3 -6 ; byte(oprtstackpoint-6):= ls w1 1 ; no.params; rl. w1 x1 g10. ; reckind:=extkinds(proctype); so w1 1<8 ; if receivekind=simple variable jl. (b0.) ; then rl. w2 (f4.) ; change kind of top operand la. w2 f25. ; to simple al w2 x2 1<8 ; else return; rs. w2 (f4.) ; jl. (b0.) ; return; e. b. a4,b2,c3 ; procedure conv oprt(top,nexttop,oprt); ; the procedure is called as: ; jl. w3 d17. ; nexttop opnd is taken from the stack; ; or jl. w3 d18. ; nexttop opnd is in w2 at entry time; ; top and nexttop are operand-descriptions and conv oprt outputs, ; if necessary and depending on parameter oprt, a byte specifying ; conversion from the loosing type to the winning type of top and ; nexttop. ; the conversion-byte is found in table conv table(win,loose) and ; at return time w1 holds an expresskind-operand with winning type. ; conv table holds a zero when typecombinations are not allowed or ; the types are equal. ; if top is the winner,the byte next is output before the ; conversion-byte. ; oprt winner ; 0:exponent ; if nexttop<top then top else no conversion ; 1:logical oprt ; lowest typevalue , no output ; 2:arit or relation ; highest typevalue ; 3:assign ; nexttop ; ; typevalue = 23- typebit no in operand-description ; registeruse: ; entry exit ; w0: oprt undefined ; w1: top resultoperand ; w2: nexttop or undef undefined ; w3: return address undefined ; globals: f3,f4,f12,f25,f26 , g5 ; local variables: w. b0: 0 ; return address b1: 0 ; oprt b2: 6 ; no.rows in conv table ; local tables: ; table expbytes holds for each possible top-type in exponentiations ; the relevant bytevalue,that later on is to be modified according to ; winner-type in the usual way h. g11: h29-2 ; **integer 0 ; **long h29+1 ; **real h29+0 ; **double ; conv table: ; a 2-dimensional table that for every combination of ; winning type and loosing type holds a byte that specifies ; conversion from looser to winner. ; winner: int long real doubl compl logic looser h.g12: 0 , h20+0 , h20+1 , h20+2 , h20+3 , 0 ; integer h20+4 , 0 , h20+5 , h20+6 , h20+7 , 0 ; long h20+8 , h20+9 , 0 , h20+10, h20+11, 0 ; real h20+12, h20+13, h20+14, 0 , h20+15, 0 ; double h20+16, h20+17, h20+18, h20+19, 0 , 0 ; complex 0 , 0 , 0 , 0 , 0 , 0 ; logical ; type numb to bit: ; this table holds for each type represented as an integer ; between 0 and 5 , the corresponding bit-type representation h.g13: 2.000001 ; integer 2.000010 ; long 2.000100 ; real 2.001000 ; double 2.010000 ; complex 2.100000 ; logical ; entry w.d17: rl. w2 (f4.) ; conv oprt1:w2:=opndstack(opnd point); ; comment nexttop in stack; d18: rs. w3 b0. ; conv oprt2: save return address; sn. w2 (f12.) ; if nexttop=undefined then jl. a4. ; goto result undef; rs. w0 b1. ; save oprt; la. w1 f25. ; w1:=type part of top; la. w2 f25. ; w2:=type part of nexttop; bl. w1 x1 g5. ; w1:=type bit numb(w1); bl. w2 x2 g5. ; w2:=type bit numb(w2); ; comment types are now numbers between ; 0 and 5; sn w0 0 ; if oprtclass=exponent then jl. c0. ; goto exp; sn w1 x2 ; if w1=w2 then jl. a2. ; goto result express; am (0) ; bl. w3 g14. ; jl. x3 d18. ; goto action(oprt); c0: bl. w0 x1 g11. ; exp: oprt stack(top part4):= hs. w0 (f3.) ; expbytes(w1); sh w1 x2 ; if top type<nexttop type then jl. a2. ; goto result express else jl. a0. ; goto out next; c1: sl w1 x2 ; logical: jl. c3. ; goto if toptype>nexttoptype then jl. a1. ; winner in w2 else exchange; c2: sh w1 x2 ; arith: if toptype<nexttoptype then jl. c3. ; goto winner in w2; a0: al w0 h20+20 ; out next: outbyte(next); jl. w3 d37. ; a1: rx w1 4 ; exchange: i:=w1; w1:=w2; w2:=i; c3: wm. w1 b2. ; winner in w2: wa w1 4 ; bl. w0 x1 g12. ; w0:=conv table(w1,w2); sn w0 0 ; if w0=0 then jl. a3. ; goto conv error; rl. w3 b1. ; se w3 1 ; if oprt<>logical oprt then jl. w3 d37. ; outbyte(w0); a2: bl. w1 x2 g13. ; result express: lo. w1 f26. ; w1:=type numb to bit(w2)+ jl. (b0.) ; expresskind; return; a3: jl. w2 d19. ; conv error: type error; a4: rl. w1 f12. ; result undef: w1:=undefined; jl. (b0.) ; return; ; action-table: ; it holds for each value of oprt a byte with an action address h. g14: c0-d18, c1-d18, c2-d18, c3-d18; e. b. a5,b8 ; procedure errormessage ; one of the entries is called whenever an error message is to be ; output, and there is an entry for each different error detected ; in pass6, and one entry,error record, for errors detected in ; previous passes, in which case the next 3 inputbytes holds: ; ; a)errorclass, used to index table errortextaddr to get ; a pointer to the wanted message ; ; b)2 bytes with aux.information to be output as integers if ; different from 0. ; the message is output on current output as: ; line <line no>. <no.operands in line> <error text> ; if the message is not just a warning,see table errortextaddr, a ; trouble byte is output. ; the procedure is called as: ; jl. w2 d19. ; type error ; or jl. w2 d20. ; subscript error ; or jl. w2 d21. ; zone error ; or jl. w2 d22. ; call error ; or jl. w2 d23. ; label error ; or jl. w2 d24. ; error record ; or jl. w2 d25. ; label not referred ; globals: f8 ; local variables: w. b0: 0 ; return address b1: <:.:> ; pointtext b2: <: :> ; spacetext b3: 0 ; errorident b4: 0 ; aux inf b5: <: <12><10> programunit <0>:> b6: <: page <0>:> b7: <:<10> error messages<10><0>:> b8: <:label not referred<0>:> ; entry: d19: jl. w1 a0. ; type error: w1:=type text; <:type:> ; goto trouble; d20: jl. w1 a0. ; subscript error:w1:=subscript text; <:subscripts:> ; goto trouble; d21: jl. w1 a0. ; zone error: w1:= zone text; <:zone:> ; goto trouble; d22: jl. w1 a0. ; call error: w1:= call text; <:call:> ; goto trouble; d23: jl. w1 a0. ; label error: w1:= label text; <:label:> ; goto trouble; d25: al. w1 b8.+1 ; label not referred:w1:=b8 text; jl. a0. ; goto trouble; d27: jl. w1 a0. ; standard zone error:goto trouble; <:external zone not in catalog<0>:> d24: rs. w2 b0. ; error record: jl. w3 d36. ; bl. w1 x2 g16. ; w1:=errortextaddr(inbyte); sl w1 0 ; if w1>=0 then jl. a4. ; goto get aux inf; al w2 2047 ; la w1 4 ; w1:=w1 and signmask; al. w1 x1 +g15. ; jl. d41. ; alarm(errorbase(w1)); a4: ; get aux inf: al. w1 x1 +g15. ; w1:=errorbase(w1); jl. w3 d36. ; hs. w2 b4. ; aux inf:=inbyte<12+inbyte; jl. w3 d36. ; hs. w2 b4.+1 ; rl. w2 b0. ; w2:=return address; a0: rs. w2 b0. ; trouble: save return addr; sz w1 1 ; if bit(23)of text addr=1 jl. a5. ; then goto out error mess; al w0 h19 ; comment just a warning; jl. w3 d37. ; outbyte(trouble); al w0 2 ; am -2000 ; set warning.yes rs. w3 e87.+2000 ; a1: rs. w1 b3. ; out error mess: errorident:=w1; rl. w1 f32. ; line no.:=line no.+1; al w1 x1 +1 ; sh. w1 (f33.) ; if lineno.>=lines pr page jl. a2. ; then begin al. w1 b5. ; writetext(b5); jl. w3 d40. ; rl. w1 f17. ; writetext(head address); jl. w3 d40. ; comment name of unit; al. w1 b6. ; jl. w3 d40. ; writetext(b6); rl. w0 f34. ; ba. w0 1 ; page:=page+1; rs. w0 f34. ; jl. w3 d39. ; writeinteger(<:ddd:>,page); 32<12+3 ; al. w1 b7. ; jl. w3 d40. ; writetext(b7); al w1 1 ; line no.:=1; ; end a2: rs. w1 f32. ; al. w1 b1. ; jl. w3 d38. ; message(<:.:>); rl. w0 f8. ; jl. w3 d39. ; writeinteger(no.operands); 32<12+3 ; al. w1 b2. ; jl. w3 d40. ; writetext(<: :>); rl. w1 b3. ; jl. w3 d40. ; writetext(errorident); rl. w1 b4. ; a3: al w0 0 ; for i:=1,2do rs. w0 b4. ; ld w1 12 ; if byte(i) of auxinf=0 sn w0 0 ; then return jl. (b0.) ; else writeinteger(byte(i)); jl. w3 d39. ; 32<12+5 ; return; jl. a3. ; a5: ; test warning modebits: am -2000 ; rl. w3 e29.+2000 ; sz w3 1<1 ; if warning.yes then jl. a1. ; goto out error message; jl. (b0.) ; return; e. b. b37 ; block for errortexts ; errorbase gives the start of errormessages for errors detected ; in previous passes w.g15: b0: <:illegal<0>:> b1: <:graphic<0>:> b2: <:short text<0>:> b3: <:bitpattern<0>:> b4: <:too many significant digits<0>:> b5: <:exponent too big<0>:> b6: <:format error before comma no.<0>:> b7: <:label syntax<0>:> b8: <:continuation mark on a labeled line<0>:> b9: <:missing end<0>:> b10: <:constant outside allowed range<0>:> b11: <:statement sequence<0>:> b12: <:syntax error<0>:> b13: <:statement structure<0>:> b14: <:missing )<0>:> b15: <:do construction<0>:> b16: <:list structure<0>:> b17: <:labelling error<0>:> b18: <:do after if<0>:> b19: <:illegal number of main programs<0>:> b20: <:+declaration<0>:> b21: <:no. of subscripts illegal<0>:> b22: <:no. of zones illegal<0>:> b23: <:zone dimension<0>:> b24: <:adjustable dimension<0>:> b25: <:adjustable bound<0>:> b26: <:common error<0>:> b27: <:entry name<0>:> b28: <:formal in common<0>:> b29: <:equivalence impossible<0>:> b30: <:equivalence index trouble<0>:> b31: <:equivalence subscripts<0>:> b32: <:dimension equivalenced zone<0>:> b33: <:dimension equivalenced common variable<0>:> b37: <:zone specification<0>:> b34: <:erroneous terminated do range<0>:> b35: <:unassigned elements, rightmost group no.<0>:> b36: <:non-common element, rightmost group no.<0>:> ; errortextaddresses holds a pointer to the errortexts for each error- ; type detected in previous passes; an odd pointer causes no trouble ; byte to be output. ; a negative pointer terminates the translation with a message ; found in table errorbase by setting the signbit to 0. h.g16=k-1 b0-g15 ; b1-g15 ; b2-g15 ; b3-g15 ; b4-g15 ; b5-g15 ; b6-g15 ; b7-g15 ; b8-g15 ; b9-g15 ; b10-g15 ; b10-g15 ; b11-g15 ; b12-g15 ; b13-g15 ; b14-g15 ; b15-g15 ; b16-g15 ; b17-g15 ; b18-g15 ; 1<11+b19-g15 ; b20-g15 ; b21-g15 ; b22-g15 ; b23-g15 ; b24-g15 ; b25-g15 ; b26-g15 ; b37-g15 ; b27-g15 ; b28-g15 ; b29-g15 ; b30-g15 ; b31-g15 ; b32-g15 ; b33-g15 ; b34-g15 ; b35-g15 ; b36-g15 ; e. ; table inputentries holds for each inputbyte-and some local defined ; bytes- a pointer to an entry in inputtable h. g17=k-1 528 , 534 , 540 , 564 ; 1 simple loc , simple com, simple pam, array 576 , 582 , 588 , 558 ; 5 zone , external , ext param , entry name 0 , 0 , 546 , 552 ; 9 stm f.call , stm descr , sim eq arr, sim eq zon 570 , 594 , 600 , 684 ; 13 arr eq zon , comm name , label name, troub opnd 0 , 0 , 606 , 690 ; 17 n.u. , n.u. , label no. , troub left 108 , 114 , 120 , 126 ; 21 arr left , a eq zleft, zoneleft , zarr left 132 , 162 , 168 , 174 ; 25 proc left , idx comma , zone comma, pam comma 180 , 696 , 192 , 198 ; 29 rw comma , troubcomma, end index , end procl 204 , 264 , 720 , 270 ; 33 end rwlist , entry , end trblst, return 414 , 420 , 408 , 402 ; 37 end unit , end pass , begin un , endline 396 , 102 , 186 , 150 ; 41 end stm , begin lst , end list , call 642 , 612 , 624 , 618 ; 45 log const , int const , real con , long con 630 , 636 , 0 , 0 ; 49 doub const , comp const, n.u. , n.u. 258 , 660 , 666 , 0 ; 53 lab decl , end format, con format, n.u. 654 , 708 , 726 , 12 ; 57 trouble , enddeclare, endformdec, dya plus 0 , 6 , -6 , 18 ; 61 n.u. , dya minus , mon minus , multiply 24 , 30 , 60 , 156 ; 65 divide , exponent , shift , list com 324 , 90 , 96 , 372 ; 69 iocom , end range , endpamdesc, data array 0 , 0 , 0 , 0 ; 73 n.u. , n.u. , n.u. , n.u. 0 , 0 , 0 , 0 ; 77 n.u. , n.u. , n.u. , n.u. 0 , 0 , 0 , 0 ; 81 n.u. , n.u. , n.u. , n.u. 0 , 0 , 0 , 378 ; 85 n.u. , n.u. , n.u. , data star 0 , 72 , 0 , 0 ; 89 n.u. , mult ass , n.u. , n.u. 66 , 36 , 36 , 36 ; 93 arit ass , .lt. , .le. , .eq. 36 , 36 , 36 , 42 ; 97 .ge. , .gt. , .ne. , .and. 48 , 54 , 672 , 678 ;101 .or. , .not. , beg cform , beg oform 0 , 0 , 216 , 282 ;105 n.u. , n.u. , if , do 234 , 276 , 138 , 144 ;109 assign lab , stop , read , write 318 , 0 , 78 , 210 ;113 doterm , n.u. , arit left , end call 390 , 84 , 0 , 360 ;117 spark , arit rght , n.u. , imp rght 0 , 648 , 240 , 252 ;121 n.u. , vanish opn, goto simp , comp goto 246 , 228 , 222 , 0 ;125 goto ass , endaritif , endlogif , n.u. 312 , 342 , 0 , 0 ;129 doend , end io , n.u. , n.u. 0 , 0 , 0 , 0 ;133 n.u. , n.u. , n.u. , n.u. 384 , 366 , 330 , 336 ;137 arr data , datainit , imp left , imp do 288 , 738 , 348 , 354 ;141 impinitsp , impinitgen, imp until , imp step 288 , 294 , 300 , 306 ;145 do initsp , do initgen, do until , do step 714 , 462 , 468 , 0 ;149 data , gencomlist, zo comlist, n.u. 432 , 438 , 474 , 516 ;153 locentlist , ext list , labvarlist, area simp 522 , 504 , 498 , 510 ;157 area ar zo , loc arrdec, com arrdev, formarrdec 492 , 486 , 480 , 444 ;161 loczodecl , com zodecl, formzodecl, notdeclab 450 , 456 , 426 , 702 ;165 multdeclab , nulls , glob list , glob and lab 732 ;169 decextzone ; operator table ; part1: 1 byte with priority(5bits)<7+ typecheck(1bit)<6+ ; nexttop(1bit)<5 + noresult(1bit)<4 + ; output (1bit)<3 + term.unstack(1bit)<2 + ; name giving(1bit)<1 + modify output(1bit)<0 ; part2: 1 byte with name inf if namegivingbit=1 or empty ; part3: 2 bytes with operand mask or empty ; part4: 1 byte with output-value or empty ; part5: 1 byte with action address base w. 0 h. g18=k+4 ; 0 mon minus: 9<7+ 2.1000001, 0 , 0 ,2. 1110011111, h22+0 , c60-c80 ; 6 dya minus: 9<7+ 2.1100001, 0 , 0 ,2. 1110011111, h22+8 , c62-c80 ; 12 dya plus: 9<7+ 2.1100001, 0 , 0 ,2. 1110011111, h22+16 , c62-c80 ; 18 multiply: 11<7+ 2.1100001, 0 , 0 ,2. 1110011111, h22+24 , c62-c80 ; 24 divide: 11<7+ 2.1100001, 0 , 0 ,2. 1110011111, h22+32 , c62-c80 ; 30 exponent: 13<7+ 2.1100001, 0 , 0 ,2. 1110001101, h29-7 , c64-c80 ; 36 relation 7<7+ 2.1100001, 0 , 0 ,2. 1110001111, 0 , c66-c80 ; 42 not 5<7+ 2.1000001, 0 , 0 ,2. 1110100111, h23+0 , c60-c80 ; 48 and 3<7+ 2.1100001, 0 , 0 ,2. 1110100111, h23+8 , c63-c80 ; 54 or 1<7+ 2.1100001, 0 , 0 ,2. 1110100111, h23+16 , c63-c80 ; 60 shift 13<7+ 2.1100001, 0 , 0 ,2. 1110000001, h23+24 , c65-c80 ; 66 assign -3<7+ 2.1110001, 0 , 0 ,2. 1110111111, h24+0 , c61-c80 ; 72 mult assign -3<7+ 2.1100001, 0 , 0 ,2. 1110111111, h24+8 , c61-c80 ; 78 arit left -1<7+ 2.0000100, 0 , 0 , 0, 0 , c79-c80 ; 84 end range 13<7+ 2. 0, 0 , 0 , 0, 0 , c71-c80 ; 90 end paramdescr 13<7+ 2. 0, 0 , 0 , 0, 0 , c72-c80 ; 96 array left -3<7+ 2.0000111, 0 , 0 , 0, h25+0 , c70-c80 ;102 array eq zone left -3<7+ 2.0000111, 0 , 0 , 0, h25+8 , c70-c80 ;108 zone left -3<7+ 2.0001110, 1 , 0 , 0 , h10+1 , c79-c80 ;114 proc left -3<7+ 2.0000111, 2 , 0 , 0 , h26+0 , c79-c80 ;120 indexcomma -3<7+ 2.0001000, 0 , 0 , 0 , h22+18 , c69-c80 ;126 paramcomma -3<7+ 2.0010001, 0 , 0 , 0 , 0 , c79-c80 ;132 rw comma -3<7+ 2.0010001, 0 , 0 , 0 , 0 , c79-c80 ;138 if -5<7+ 2.1000001, 0 , 0 ,2. 1110111111, h28+0 , c67-c80 ;144 end logical if -9<7+ 2.0001000, 0 , 0 , 0, h7+3 , c79-c80 ;150 end arith if -7<7+ 2.0001000, 0 , 0 , 0, h7+4 , c68-c80 ;156 read init -3<7+ 2.0001110, 3 , 0 , 0, h17+0 , c79-c80 ;162 write init -3<7+ 2.0001110, 3 , 0 , 0, h17+1 , c79-c80 ;168 assign label -7<7+ 2.1111000, 0 , 0 ,2. 10000000001, h14+0 , c79-c80 ;174 goto simple -7<7+ 2.1011000, 0 , 0 ,2.100001000000, h14+2 , c79-c80 ;180 goto assign -7<7+ 2.1011000, 0 , 0 ,2. 10000000001, h14+3 , c79-c80 ;186 goto computed -7<7+ 2.1010000, 0 , 0 ,2. 1110011111, 0 , c73-c80 ;192 entry -7<7+ 2.1011000, 0 , 0 , 0, h13+0 , c79-c80 ;198 stop -7<7+ 2.0011000, 0 , 0 , 0, h13+2 , c79-c80 ;204 datainit -7<7+ 2.1000001, 0 ,2. 110 ,2. 111111, h21+0 , c79-c80 ;210 data array -7<7+ 2.0011000, 0 , 0 , 0, h4+3 , c79-c80 ;216 trouble left(: -3<7+ 2.0000110, 4 , 0 , 0 , 0 , c79-c80 ; input table ,operators: ; part1: 1 byte with priority(5bits)<7 +stack(1bit)<1 + output(1bit) ; part2: 1 byte with special information or empty ; part3: 2 bytes with operand mask ; part4: 1 byte with pointer to oprt table or output-value or empty ; part5: 1 byte with action address base h. g19=k+10 ; -6 mon minus: 8<7+1<1+0, 0 ,2. 0 ,2. 0, 0 , c80-c80 ; 0 unknown record: 14<7+0 , 0 , 0 , 0 , 0 , c58-c80 ; 6 dya minus: 8<7+1<1+0, 0 ,2. 0 ,2. 1110011111, 6 , c17-c80 ; 12 dya plus: 8<7+1<1+0, 0 ,2. 0 ,2. 1110011111, 12 , c17-c80 ; 18 multiply: 10<7+1<1+0, 0 ,2. 0 ,2. 1110011111, 18 , c17-c80 ; 24 divide: 10<7+1<1+0, 0 ,2. 0 ,2. 1110011111, 24 , c17-c80 ; 30 exponent: 12<7+1<1+0, 0 ,2. 0 ,2. 1110001111, 30 , c17-c80 ; 36 relations: 6<7+1<1+0, 0 ,2. 0 ,2. 1110001111, 36 , c55-c80 ; 42 and: part2 contains bytevalue logical and 2<7+1<1+0,h23+9 ,2. 0 ,2. 1110100111, 48 , c18-c80 ; 48 or : part2 contains bytevalue logical or 0<7+1<1+0,h23+17,2. 0 ,2. 1110100111, 54 , c18-c80 ; 54 not: 4<7+1<1+0, 0 ,2. 0 ,2. 0, 42 , c80-c80 ; 60 shift: 12<7+1<1+0, 0 ,2. 0 ,2. 1110000111, 60 , c17-c80 ; 66 assign: -2<7+1<1+0, 0 ,2. 0 ,2. 1100111111, 66 , c20-c80 ; 72 mult assign: -2<7+1<1+0, 0 ,2. 0 ,2. 1100000000, 72 , c19-c80 ; 78 arith left( : 14<7+1<1+0, 0 ,2. 0 ,2. 0, 78 , c80-c80 ; 84 arith right): -2<7+0 , 0 ,2. 0 ,2. 0, 0 , c80-c80 ; 90 end range: 14<7+1<1+0, 0 ,2. 0 ,2. 0, 84 , c80-c80 ; 96 end pamdescription: 14<7+1<1+0, 0 ,2. 0 ,2. 0, 90 , c80-c80 ;102 listleft ( : 14<7+0 , 0 ,2. 0 ,2. 0, 0 , c30-c80 ;108 array left (: 14<7+1<1+0, 0 ,2. 0 ,2. 0, 96 , c31-c80 ;114 arr eq zone left( : 14<7+1<1+0, 0 ,2. 0 ,2. 0, 102 , c31-c80 ;120 zone left( : 14<7+1<1+0, 0 ,2. 0 ,2. 0, 108 , c32-c80 ;126 z array left(: 14<7+1<1+0, 0 ,2. 0 ,2. 0, 108 , c33-c80 ;132 proc left ( : 14<7+1<1+0, 0 ,2. 1000000 ,2. 111111, 114 , c34-c80 ;138 read: 14<7+1<1+0,h17+2 ,2. 11111 ,2.001100111111, 156 , c35-c80 ;144 write: 14<7+1<1+0,h17+3 ,2. 11111 ,2.001110111111, 162 , c35-c80 ;150 call : 12<7+1<1+0, 0 ,2. 1100000 ,2. 1000000, 114 , c53-c80 ;156 list comma: -2<7+0 , 0 ,2. 0 ,2. 0, 0 , c36-c80 ;162 index comma: -2<7+1<1+0, 0 ,2. 0 ,2. 1110011111, 120 , c37-c80 ;168 zone comma: -2<7+0 , 0 ,2. 0 ,2. 1110011111, 0 , c38-c80 ;174 param comma: -2<7+1<1+0, 0 ,2. 0 ,2. 0, 126 , c39-c80 ;180 rw comma: -2<7+1<1+0, 0 ,2. 1001 ,2. 1110000101, 132 , c41-c80 ;186 end list: -2<7+0 , 0 ,2. 0 ,2. 0, 0 , c42-c80 ;192 end index: -2<7+0 , 0 ,2. 0 ,2. 1110011111, 0 , c37-c80 ;198 end paramlist: -2<7+1<1+0,h11+0 ,2. 0 ,2. 0, 126 , c43-c80 ;204 end rw list: -2<7+1<1+0,h11+0 ,2. 110 ,2.101001000010, 132 , c44-c80 ;210 end call: treated as a list with no.bytes=0;first byte=parcount 14<7+0 , 0 , 0 , 0 , h11+0 , c6-c80 ;216 if: -4<7+1<1+0, 0 ,2. 0 ,2. 0, 138 , c23-c80 ;222 end logif: -8<7+1<1+0, -1 ,2. 0 ,2. 1110100000, 144 , c24-c80 ;228 end arith if: -6<7+1<1+0, 0 ,2. 0 ,2. 1110001111, 150 , c24-c80 ;234 assign label: -8<7+1<1+0, 0 ,2. 0 ,2.100001000000, 168 , c17-c80 ;240 goto s : -8<7+1<1+0, 0 ,2. 0 ,2. 0, 174 , c80-c80 ;246 goto ass: -8<7+1<1+0, 0 ,2. 0 ,2. 0, 180 , c80-c80 ;252 goto comp: -8<7+1<1+0, 0 ,2. 0 ,2. 0, 186 , c22-c80 ;258 decl label: comment treated as an operand 14<7+0 , 1 ,2. 0 ,2. 0, h14+1 , c21-c80 ;264 entry: -8<7+1<1+0, 0 ,2. 0 ,2. 0, 192 , c29-c80 ;270 return: -8<7+0<1+1, 0 ,2. 0 ,2. 0, h13+1 , c77-c80 ;276 stop: -8<7+1<1+0, 0 ,2. 0 ,2. 0, 198 , c80-c80 ;282 do : 14<7+0<1+1, 0 ,2. 0 ,2. 0, h16+0 , c76-c80 ;288 do init spec: -8<7+0 , 1-1 ,2. 0 ,2. 100000001, h16+2 , c25-c80 ;294 do init gen: -8<7+0 , 0 ,2. 0 ,2. 100000001, h16+2 , c25-c80 ;300 do until: -8<7+0 , 0 ,2. 0 ,2. 1110011111, h16+4 , c27-c80 ;306 do step: -8<7+0 , 0 ,2. 0 ,2. 1110011111, h16+6 , c28-c80 ;312 do end: -8<7+0 , 0 ,2. 0 ,2. 1110011111, h16+7 , c28-c80 ;318 do term: -8<7+0<1+1, 0 ,2. 0 ,2. 0, h16+8 , c80-c80 ;324 io comma: -2<7+1<1+0, 0 ,2. 0 ,2. 0, 126 , c40-c80 ;330 imp left: -2<7+0 , 0 ,2. 0 ,2. 0, h18+0 , c45-c80 ;336 imp do : -2<7+0 , 0 ,2. 0 ,2. 0, h18+1 , c45-c80 ;342 end io : -2<7+0 , 0 ,2. 0 ,2. 0, h11+0 , c45-c80 ;348 imp until: -8<7+0 , 0 ,2. 0 ,2. 1110011111, h16+4 , c27-c80 ;354 imp step: -8<7+0 , 0 ,2. 0 ,2. 1110011111, h16+6 , c28-c80 ;360 imp right: -8<7+0 , h16+8 ,2. 0 ,2. 1110011111, h16+7 , c28-c80 ;366 data init: -6<7+1<1+0, 0 ,2. 0 ,2. 0, 204 , c56-c80 ;372 data array: created by pass6 to unstack data init-type dependent; -8<7+1<1+0, 0 ,2. 0 ,2. 0, 210 , c80-c80 ;378 data star : -4<7+0<1+1, 0 ,2. 0 ,2. 0, h4+0 , c48-c80 ;384 array data: -4<7+0 , 0 ,2. 0 ,2. 0, h4+1 , c49-c80 ;390 spark: -10<7+0 , 0 ,2. 0 ,2. 0, 0 , c80-c80 ;396 end statement: -10<7+0<1+1, 0 ,2. 0 ,2. 0, h7+0 , c50-c80 ;402 end line: 14<7+0<1+1, 0 ,2. 0 ,2. 0, h7+1 , c51-c80 ;408 begin unit: 14<7+0<1+1, 0 ,2. 0 ,2. 0, h0+0 , c52-c80 ;414 end unit: -10<7+0 , 0 ,2. 0 ,2. 0, h0+1 , c8 -c80 ;420 end pass: 14<7+0<1+1, 0 ,2. 0 ,2. 0, h0+2 , c54-c80 ; inputtable ,operands ; part1: 1 byte with priority(5bits)<7 ; part2: 1 byte with number of bytes in record -1 or empty ; part3: 2 bytes with operand description ; part4: 1 byte with outbyte-value or empty ; part5: 1 byte with action address base ;426 global entry list: 14<7+0 , 0 ,2. 0 ,2. 0 , h1+0 , c1-c80 ;432 local entry list : 14<7+0 , 0 ,2. 0 ,2. 0 , h1+4 , c5-c80 ;438 external list: 14<7+0 , 0 ,2. 0 ,2. 0 , h1+3 , c2-c80 ;444 not decl labels: 14<7+0 , 0 ,2. 0 ,2. 0 , 0 , c3-c80 ;450 multiple decl labels: 14<7+0 , 0 ,2. 0 ,2. 0 , 0 , c3-c80 ;456 declared but not referred labels: 14<7+0 , 0 ,2. 0 ,2. 0 , 0 , c7-c80 ;462 general common list: 14<7+0 , 0 ,2. 0 ,2. 0 , h1+1 , c6-c80 ;468 zone common list: 14<7+0 , 0 ,2. 0 ,2. 0 , h1+2 , c6-c80 ;474 label variable list: 14<7+0 , 0 ,2. 0 ,2. 0 , h1+5 , c6-c80 ;480 formal zone decl: 14<7+0 , 4 ,2. 0 ,2. 0 , h2+1 , c8-c80 ;486 common zone decl: 14<7+0 , 3 ,2. 0 ,2. 0 , h2+5 , c8-c80 ;492 local zone decl: 14<7+0 , 8 ,2. 0 ,2. 0 , h2+3 , c78-c80 ;498 common array decl: 14<7+0 , 3 ,2. 0 ,2. 0 , h2+4 , c8-c80 ;504 local array decl: 14<7+0 , 3 ,2. 0 ,2. 0 , h2+2 , c8-c80 ;510 formal array decl: 14<7+0 , 6 ,2. 0 ,2. 0 , h31 , c4-c80 ;516 area simple loc: 14<7+0 , 2 , 0 , 0 , h30+0 , c8-c80 ;522 area array-zone-param: 14<7+0 , 2 , 0 , 0 , h30+1 , c47-c80 ;528 simple local: 14<7+0 , 1 , 0 ,2. 100000000, h5+0 , c9-c80 ;534 simple common: 14<7+0 , 2 , 0 ,2. 100000000, h5+1 , c9-c80 ;540 simple param: 14<7+0 , 1 , 0 ,2. 100000000, h5+2 , c9-c80 ;546 simple eq array: 14<7+0 , 3 , 0 ,2. 100000000, h5+3 , c9-c80 ;552 simple eq zone: 14<7+0 , 4 , 0 ,2. 100000000, h5+4 , c9-c80 ;558 entry name: 14<7+0 , 1 ,2. 1100000 ,2. 100000000, h5+6 , c13-c80 ; notice: the action for <entry name> was earlier c9, but c13 is ; a little bit better, but still not correct, because the ; parameters for a call will not be checked ;564 array ident: 14<7+0 , 5 ,2. 10 ,2. 0, h5+7 , c10-c80 ;570 array eq zone: 14<7+0 , 8 ,2. 100 ,2. 0, h5+8 , c10-c80 ;576 zone ident: 14<7+0 , 2 ,2. 1000 ,2. 100, h5+9 , c11-c80 ;582 external ident: 14<7+0 , 1 ,2. 1100000 ,2. 1000000, h5+10 , c12-c80 ;588 external param: 14<7+0 , 1 ,2. 1100000 ,2. 0, h5+11 , c13-c80 ;594 common name: 14<7+0 , 0 , 0 , 0, h19+0 , c9-c80 ;600 label variab: 14<7+0 , 1 , 0 ,2. 10000000000, h5+5 , c9-c80 ;606 label no.: 14<7+0 , 0 , 0 ,2.100001000000, 0 , c14-c80 ;612 constant integer: 14<7+0 , 2 , 0 ,2. 10000001, h6+2 , c15-c80 ;618 constant long: 14<7+0 , 4 , 0 ,2. 10000010, h6+4 , c15-c80 ;624 constant real: 14<7+0 , 4 , 0 ,2. 10000100, h6+3 , c15-c80 ;630 constant double: 14<7+0 , 8 , 0 ,2. 10001000, h6+5 , c15-c80 ;636 constant complex: 14<7+0 , 8 , 0 ,2. 10010000, h6+6 , c15-c80 ;642 constant logical: 14<7+0 , 1 , 0 ,2. 10100000, h6+1 , c15-c80 ;648 vanished operand: 14<7+0 , 0 , 0 , 0, 0 , c16-c80 ;654 trouble: 14<7+0 , 0 , 0 , 0, 0 , c57-c80 ;660 end format: 14<7+0 , 2 , 0 , 0, h8+0 , c8-c80 ;666 continue format: 14<7+0 , 2 , 0 , 0, h8+1 , c8-c80 ;672 begin closed format: 14<7+0 , 2 , 0 , 0, h7+6 , c8-c80 ;678 begin open format: 14<7+0 , 2 , 0 , 0 , h7+5 , c8-c80 ;684 trouble operand: treated as external param 14<7+0 , 0 ,2.11111111 ,2.111110000000, h19+1 , c13-c80 ;690 trouble left(: 14<7+1<1+0, 0, 0 , 0, 216 , c80-c80 ;696 troub comma: -2<7+1<1+0, 0 ,2. 0 ,2. 0, 126 , c74-c80 ;702 globals and labels in unit: 14<7+0 , 0 , 0 , 0 , 0 ,c59-c80 ;708 end declarations: 14<7+0 , 0 , 0 , 0 , h7+7 , c8-c80 ;714 data 14<7+0 , 0 , 0 , 0 , h7+8 , c8-c80 ;720 end trouble list: -2<7+1<1+0,h11+0 ,2. 0 ,2. 0, 126 , c75-c80 ;726 end formal declaration: 14<7+0 , 0 ,2. 0 ,2. 0, h7+9 , c8-c80 ;732 declare external zone: 14<7+0 , 1 ,2. 1000 ,2. 100, h2+6 , c46-c80 ;738 imp init gen: -8<7+0 , 0 ,2. 0 ,2. 100000001, h16+2 , c25-c80 ; operator stack bottom w. -11<19 ; global base 1<23+15<18+40<12+0 ; first paramword 0 ; second paramword j2=k-j0 ; assignment of intermediates i0 = 88 ; address of endpamdescript,part3 in oprt table i1 = 71 ; end pamdescript entry i2 = 21 ; begin array list entry i3 = 22 ; begin array eq zone list entry i4 = 23 ; begin zone list entry i5 = 24 ; begin zarray list entry i6 = 25 ; begin proc list entry i7 = 26 ; index comma entry i8 = 27 ; zone comma entry i9 = 28 ; paramcomma entry i10 = 29 ; rw comma entry i11 = 31 ; end index list entry i12 = 32 ; end proc list entry i13 = 33 ; end rw list entry i14 = -10<7 ; spark priority i15 = 19 ; label no. entry i16 = 94 ; .lt. inputbyte value i17 = 72 ; data array entry i18 = 70 ; end range entry, not used i19 = 20 ; trouble left( entry i20 = 30 ; troub comma entry i21 = 35 ; end troub list i22 = 15 ; unknown proctype i23 = g19-g17 ; stepping stone i24 = -5<7 ; commaunstack priority i25 = i23-4 ; stepping stone e30 = e30 + j2 ; length := length + length pass 6; i. e. m. rc 85.10.02 fortran, pass 6 \f ▶EOF◀