|
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: 63744 (0xf900) Types: TextFile Names: »algpass53tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »algpass53tx «
;rc 4.12.1970 algol 6, pass 5, page ...1... ;pass 5 contents: ; ;pg 1 : descriptions of pass 5 ;pg 1 : introduction ;pg 1 : central logic ;pg 2 : layout of store ;pg 3ff : table and stack formats ;pg 6 : code ;pg 8 : central input action ;pg 9 : declaration action ;pg 14 : output description ;pg 20ff: input tables ;pg 20 : kind table ;pg 21 : count table ;pg 22 : increment table ;pg 22 : action table ;pg 24 : initialize pass 5 ;general introduction: ; pass 5 allocates storage for the variables and distributes the ;descriptions of the identifiers. ; a table of identifiers, ident table, is build based on the ;declarations collected at block begin. this table is checked for ;double declarations by identifiers left at the place where the ;declaration actually occurred. all other occurrencies of ;identifiers are in the output replaced by the description from ;the table. ;central logic of pass 5: ; when pass 5 is entered at next the central logic inputs a byte and ;treats it in one of three ways depending on the size: ; 1: byte>=min identifier: jump to the current identifier action. ; there are four possible actions on an identifier: ; 1: it is declared, i.e. entered in ident table with the ; current description given by the variable prepare decl. ; this action is set by <begin block> or <begin proc>. ; 2: the entry in ident table is checked for double declaration. ; this action is set by <end decl>, <end bounds>, ; <end zone decl> and <exit proc> and is explicitly performed ; by <label colon>. ; 3: the kind part of the entry in ident table is changed from ; <for label> to <label> and the original description is ; stored in decl stack as an redeclaration. ; this action is set by <do>. ; 4: the corresponding description is output from ident table. ; this action is set by <end head>. ; 2: byte>= interest. the byte is output, return to next. \f ;rc 4.12.1970 algol 6, pass 5, page ...2... ; 3: byte < interest. the byte refers to the input tables as follows: ; 1: byte>= outbase. kind table(entry) is output and a jump to ; action table(entry) is performed. ; 2: if byte>=type limit then byte//4 is used otherwise the byte ; itself is used as index to the input tables which are: ; kind table gives the kind-type, stored in kind part of ; prepare decl. ; count table gives a counter for storage allocation and ; flags to be stored in ident table. ; increment table determines the number of words to be used ; for storage allocation to the declared identifier. ; action table holds the address of the declaration action ; to be executed. ; the variable prepare decl is assigned with kind, current ; block no and flags. increment and counter is set to their ; respective values from the tables and a jump to the ; declaration action is performed. ; layout of store: ; ================ ;lowest address: ( pass 5 code ) ; ( ) ; ( ) ; ( ) ; ================ ; ( pass 5 ) <- decl base ; ( initialization ) - ; ( code ) - decl stack ; ---------------- - ; ( ) - ; ( ) <- decl top ; ( ) ; ..... ; ( ) ; ( ) <- spec top ; ( ) - ; ( ) - spec stack ; ( ) - ; ( ) <- spec base ; ================ ; ( ) ; ( st proc table ) ; ( ) <- st table base ; ================ ; ( ) ; ( ident table ) ; ( ) ; last work for pass: ( ) ; ================ \f ; rc 4.12.1970 algol 6, pass 5, page ...3... ;table and stack formats: ; there are four tables and stacks: ; 1: ident table contains four bytes per entry, i.e. per used ; identifier. the format is: ; byte 0: rel addr ; byte 1: bit 0-7: block no, bit 7 =1 if external or global ; bit 8-11: flag ; entry:byte 2: kind ; byte 3: ref part ; the table is initialized to: rel addr=0, block no=0, ; flag=not declared not used. ; ; the table entry for a declared identifier holds: ; rel addr: block relative address or external number ; block no: block number; if external or global then block number+1 ; flag : see below ; ref part: refers in some cases to further information in the ; stacks, namely: ; 1. for arrays with known no of subscripts: ; spec stack(ref part+specbase) contains description ; of dope vector. ; 2. for procedures with parameters: spec stack(ref part ; +specbase) contains the specification list. ; 3. for procedure values: decl stack(ref part+declbase) ; contains the description of the procedure. ; for all others ref part is undefined. ; ; the flag determines how the identifiers are distributed. ; following flags are used: ; (0) 0000 formal array with subscripts: treated as (1). ; (1) 0001 array with subscripts: output as (6) followed by ; dope description (also as 6) from spec stack. ; (2) 0010 zone or zone array: treated as (6). ; (4) 0100 proc value: if following delimiter is <first:=> or ; <:=> then output as (6) else treat the word referenced ; by ref part (as 6 or 7). ; (5) 0101 own: output as (6) with block no= no of fictive own ; block. ; (6) 0110 normal identifier: output <kind> <rel addr> <block no>. ; (7) 0111 procedure with parameters: output as (6) followed by ; specification list from spec stack. ; (8) 1000 not declared not used: after error message ; ident table(ident) is replaced by: kind=undeclared, ; block no=current block, flag=normal and is then ; treated as (6). ; (9) 1001 formal identifier: treated as (6). ; (10)1010 undefined procedure: treated as (6). ; (14)1110 normal standard identifier not yet distributed: ; treated as (15). ; (15)1111 standard procedure with parameters not yet distributed: ; the corresponding entry to st table is put into the chain ; of used externals and ident table entry is replaced by: ; rel addr=external no, block no=no of fictive outer ; block+1, flag=flag-8. it is then treated as (6) or (7). \f ; rc 4.12.1970 algol 6, pass 5, page ...4... ; 2: spec stack holds for each declared (or standard) procedure with ; parameters one or more words in the following format: ; specification word: ; bit 0 - 5: specification - output base for spec ; bit 6 -11: do. ; bit 12-17: do. ; bit 18-23: do. ; last specification first. a zero denotes end of specifications. ; ; for each declared array the spec stack holds 2 words giving the ; corresponding dope description to be output as normal identifier: ; byte 0: rel addr of dope vector. ; byte 1: bit 0- 7: no of subscripts. ; bit 8-11: flag= normal identifier. ; byte 2: kind= <dope description>. ; byte 3: undefined. ; ; the entry into spec stack comes from ref part of the corresponding ; ident word. ; at each block (or proc) begin the address of the topword of the ; spec stack is put into the block stop information in the decl stack. ; at block (or proc) end this address is reset. ; 3: decl stack holds for each block level the declarations which are ; valid outside that block level for identifiers which are redeclared ; in that block. it also holds the pseudo redeclarations of for- ; labels if any when entering the for loop and of locally declared ; identifiers which are used out of scope in array bounds or as ; zone declaration parameters. at the block end (and <end do>, ; <end single do>, <end bounds> and <end check local>) these ; descriptions will be unstacked. ; decl stack holds for each entry three words: ; word 0: absolute address of the corresponding entry in ; ident table. ; word 1 and 2: a copy of the contents of ident table in this location. ; ; an stack-stop is stacked at each of the bytes: ; <begin block>, <begin proc>, <do>, <end bound head>, ; <end zone head> and <end zone array head>. the format of the ; stack-stop is: ; word 1 = 0, word 2 = irrelevant ; word 3 = stop inf = absolute address of top of spec stack. ; the unstacking will be terminated when the stack-stop is met ; and spec top will be set. \f ; rc 4.12.1970 algol 6, pass 5, page ...5... ; 4: st proc table holds for each possible external 14 bytes in ; following format: ; byte 0 - 1: chain part. ; byte 2 - 9: 8 bytes name of external ; byte 10-13: 4 bytes kind and spec ; where byte 2-13 is copies from the catalogue. ; ; chain part is used to chain those externals together which ; are actually used, so only the catalogue items for the used ; externals are transmitted to the following passes and in the ; sequence in which they are used in the program. ; chain part points at chain part of next used external; it is ; initialized to zero. to the chaining is used two variables: ; chain start : points at chain part of first used external ; chain last : points at chain part of last used external ; ; the ident part of a received external gives an entry to ; ident table which is set to: ; 20 bits address of entry to st table relative to st table base, ; 4 bits flag = not yet distributed external, ; kind= kind from <4 bytes kind and spec>, ; ref part= pointer to spec table if specifications. \f ; jz 1979.10.09 algol 8, pass 5, page ...6... k=e0 s. j10, i4, h53, g17, f51, d30, c42, b18, a40 w. i2: g8 ; number of words in pass 5 h. i3 ; entry address relative to first word 5<1+1; pass mode bits: pass no 5<1 + change of direction ;assignment of bases: h0 = 512; min identifier h1 = 198; interest h2 = 108; outbase h3 = 15; type limit h11= 299; spec limit h25= h3-3; type base h36= 285; base for output bytes ;input byte values: h17= 110, h18= 139, h19= 277, h20= 276; nl, error, first:=, := ;output byte values: h4 = h36+24, h5 = h36+22; undeclared, error h7 = h36+39, h8 = h36+ 9; simple int, take value h9 = h36+56, h10= h36+ 7; dope description, take array h13= h36+ 6, h14= h36+25; beg proc, label h24= 240, h27= h36+13; vanished opr, end external h28= h36+ 3, h30= h36+23; newline, end pass h35= h36+ 8 ; take zone array h37= h36- 1, h38= 241; end zone local, internal operand h39= 278, h40= h36+12; end block, exit block h41= h36+16 ; label colon h46= h36+ 29 ; no parproc ;error identifications: h6 = 16,h21= 17,h22= 18,h23= 15; +decl, for label, local, -decl ;others: h12= 63<5; block mask h15= 500; decl for label, internal value h16= -4; no of fictive own block h26= 2.1000; st flag diff h32= -5; par kind diff h34= -64<5; max block no h42=2048-97; min working base, max no of bytes for ; work in pass 7 = 97 h47= 513; context zone ident h49= 519; exit ident h50= 22; error ident for <:context zone:> h51= 21; error ident for <:context label:> h52= 23; error ident for <:context proc:> \f ; jz 1979.07.06 algol 8, pass 5, page ...7... h. f0: 0; rel addr part . f1: 0; block and flag. f2: 0; kind part .prepare decl f3: 0; ref part . w.h. -1; f4: -4 <4+0; current block h4; <undeclared> 0; w. f5: -1<5; block mask f6: 0; decl top f7: 0; spec top h. f8: 6; normal flag f9: 0; store for no of ext h. i1: ; counter array f10=k-i1, 0; standard external no f11=k-i1, 1; global no f12=k-i1, 0; varible address f13=k-i1, 0; own address f14=k-i1, 0; formal address w. f15: 2.11<22; array flag test h. f16: 0; rel addr of dope vector. f17: 0; no of subscripts < 4 +0. f18: h9; <dope description> . dope description f19: h36+85; spec output base w. f20: 0; spec ref f21: 0; spec base f23: 0; working location f24: 0; addr of min ident f25: 0; ident table base f26: h14<12; kindpart for label f27: 0; standard table base f28: 0; chain start f29: 0; chain last f30: 0, 0; ext spec(1:4) f31: 512<2; min ident*4 f33:<:blocks<0>:> ; f44:<:variables<0>:>; h. f34: -e52; zone increment f35: 4; formal increment f36: 1; ext and global increment f37: -2; array and field increment f39: -2,f38: -4,-4, -2;simple and own increment, int,real=zone array,long,bool w. f40: 0; addr of max ident f41: 0; return f42: 2.11111; mask 31 f43: 0, 0; save double register f51: -h42 ; min work base \f ; jz 1979.07.06 algol 8, pass 5, page ...8... d26: al w0 x2 ; ex out: outbyte:= byte; d0: jl. w3 e3. ; out: output(outbyte); c0: jl. w3 e2. ; next: input(byte); sl w2 h0 ; if byte>=min identifier then j0: jl. ; goto ident action; sl w2 h1 ; if byte>=interest then jl. d26. ; goto ex out; sl w2 h2 ; if byte>=out base then jl. a1. ; goto output action; al w1 0 ; if byte<type limit then sh w2 h3 ; begin entry:= byte; jl. a0. ; type:= 0; al w1 2.11 ; end else la w1 4 ; begin entry:= byte//4 + type base; ls w2 -2 ; type:= byte mod 4; al w2 x2+h25 ; end; a0: hs. w1 b0. ; bz. w1 x2+g0. ; kind.prepare decl:= b0=k+1; type ; kind table(entry)+type; al w1 x1 ; hs. w1 f2. ; bz. w1 x2+g1. ; block and flag.prepare decl:= la. w1 f42. ; current block + bit7-11.count table(entry); ba. w1 f4. ; comment block no shift 4 + flag. the block no hs. w1 f1. ; is uneven if global; bz. w1 x2+g1. ; counter:= bit0-6.count table(entry); ls w1 -5 ; hs. w1 b1. ; bl. w1 x2+g2. ; increment:= incr table(entry); sl w1 g7 ; if increment>=simple incr then ba. w1 b0. ; increment:= increment+type; hs. w1 b2. ; bl. w1 x2+g3. ; action addr:= action table(entry); j1: jl. x1 ; goto action addr; a1: bz. w0 x2+g11. ; output action: se w0 0 ; outbyte:= kind table(byte); jl. w3 e3. ; if outbyte<>0 then output(outbyte); bl. w3 x2+g12. ; action addr:= action table(byte); al. w1 c0. ; set return(next); j7: jl. x3 ; goto action addr; \f ; rc 29.04.1971 algol 6, pass 5, page ...9... c1: al. w3 i1. ; declare: b1=k+1; counter ; counter:= counter + counter base; al w3 x3 ; bz w0 x3 ; rel addr part.prepare decl:= hs. w0 f0. ; count array(counter); b2=k+1; increment ; j2: ba. w0 ; count array(counter):= hs w0 x3 ; count array(counter)+increment; g7=f39-j2;simple incr ; ls w2 2 ; wa. w2 f25. ; ident:= byte*4 + ident table base; dl. w1 f2. ; decl:= prepare decl; rl w3 x2-2 ; if ident table(ident)=not used then se w3 8 ; begin jl. a2. ; new declaration: ident table(ident):= decl; d1: ds w1 x2 ; goto next; jl. c0. ; end; a2: so w3 2.1110 ; jl. 4 ; jl. d2. ; if not standard identifier and lx w3 0 ; block part.ident table(ident)= sz w3 h12 ; block part.decl then jl. d2. ; begin dl. w1 f4.+2 ; double declaration: bz w0 1 ; rel addr part.decl:= 0; ba. w0 f8. ; block part.decl:= current block+normal flag; jl. d1. ; kind part.decl:= <undeclared>; ; goto new declaration; d2: rl. w3 e9.+2 ; end; al w3 x3+1 ; redeclaration: rs. w3 e9.+2 ; information 2:= information 2 + 1; jl. w3 d27. ; stack decl(ident); jl. d1. ; goto new declaration; c2: ls w2 2 ; for label: wa. w2 f25. ; ident:= byte*4 + ident table base; bz w1 x2 ; prepare decl:= ident table(ident); sn w1 h4 ; if kindpart.prepare decl = <undeclared> then jl. c0. ; goto next; rl w0 x2-2 ; kindpart.prepare decl:= <label>; rl. w1 f26. ; goto redeclaration; ds. w1 f2. ; jl. d2. ; d27: rs. w3 f41. ; procedure stack decl(ident); ds. w1 f43.+2 ; integer ident; comment in w2; rl. w3 f6. ; begin al w3 x3+6 ; decl top:= decl top + 6; rs. w3 f6. ; decl stack(decl top - 4):= ident; rs w2 x3-4 ; decl stack(decl top):= dl w1 x2 ; ident table(ident); ds w1 x3 ; jl. w3 d3. ; check stack; dl. w1 f43.+2 ; end redeclaration procedure; jl. (f41.) ; \f ; rc 4.12.1970 algol 6, pass 5, page ...10... c3: jl. w3 d25. ; label colon: byte:= next relevant; al w0 h41 ; output(<label colon>); jl. w3 e3. ; label:= true; hs. w0 b12. ; c4: ls w2 2 ; check declaration: wa. w2 f25. ; ident:= byte*4 + ident table base; bz w0 x2-2 ; decl:= ident table(ident); hs. w0 b8. ; ext or rel:= rel addr part.decl; b12=k+1; label ; sn w3 x3 ; if label then jl. a11. ; begin jl. w3 e3. ; output(ext or rel); al w3 0 ; label:= false hs. w3 b12. ; end; a11: bz w1 x2-1 ; la. w1 f42. ; sz w1 2.1100 ; flag:= flag part.decl; jl. a3. ; bz. w3 b7. ; if flag = zone or flag = zone array al w3 x3+1 ; or flag = array then hs. w3 b7. ; head count:= head count + 1; a3: al w0 h24 ; output( <vanished operand>); jl. w3 e3. ; bz w3 x2 ; if kind part.decl= <undeclared> sn w3 h4 ; and flag <> undef proc then sn w1 1<4+10 ; jl. c0. ; error(<+decl>); al w0 h6 ; jl. w3 d16. ; jl. c0. ; goto next; c35: am h35-h8 ; take zone array: take:=<take zone arr>; goto take; c36: al w1 h8 ; take value: take:= <take value>; ls w1 4 ; c5: al w0 h7 ; take: ba. w0 b0. ; outbyte:= <simple integer>+type; jl. w3 e3. ; output(outbyte); bl. w0 i1.+f14; output(formal address); jl. w3 e3. ; bl. w0 f1. ; current block:= block and flag shift -4; ld w1 -4 ; flag:= block and flag & 2.1111; jl. w3 e3. ; output(current block); al w0 x1 ; outbyte:= take; sz. w1 (f15.) ; if flag <> array then jl. d0. ; goto out; bl. w2 i1.+f14; al w2 x2+4 ; hs. w2 i1.+f14; formal address:= formal address + 4; al w3 g4 ; in take array:= true; hs. w3 b3. ; \f ; rc 4.12.1970 algol 6, pass 5, page ...11... c6: jl. w3 e2. ; array declaration: hs. w2 b4. ; input(byte); ls w2 1 ; no of subscripts:= byte; al w3 2 ; dope relative.dope description:= ba. w3 i1.+f12; variable address-(no of subscripts)*2 + 2; bs w3 5 ; hs. w3 f16. ; al w3 x3-4 ; variable address:= dope relative - 4; hs. w3 i1.+f12; ls w2 3 ; subscript.dope relative:= hs. w2 f17. ; no of subscripts shift 4; dl. w1 f18. ; comment placed as block part in prepare decl rl. w3 f7. ; with flag=0; ds w1 x3 ; spec stack(spec top):= dope description; al w3 x3-2 ; rs. w3 f20. ; spec ref:= spec top - 2; al w3 x3-2 ; spec top:= spec top - 4; rs. w3 f7. ; c7: rl. w3 f20. ; par proc decl: ws. w3 f21. ; refpart.prepare decl:= hs. w3 f3. ; spec ref - spec base; b3=k+1;return ; set return(if -, in take array then next j3: al. w3 c0. ; else take array); check stack; d3: rs. w3 f23. ; integer procedure check stack; rl. w3 f7. ; begin sh. w3 (f6.) ; check stack:= spec top; comment in w3; jl. i0. ; if decl top >= spec top then jl. (f23.) ; alarm(<:stack:>); i0: al. w1 e10. ; end; jl. w3 e5. ; g4=k-j3 ; c8: al w0 c0-j3 ; take array: hs. w0 b3. ; in take array:= false; al w0 h10 ; jl. w3 e3. ; output(<take array>); bz. w0 f16. ; jl. w3 e3. ; output(dope relative); b4=k+1;no of subscripts; al w0 ; outbyte:= no of subscripts; jl. d0. ; goto out; c37: al w0 h24 ; formal: outbyte:= <vanished operand>; jl. d0. ; goto out; \f ; jz 1979.07.06 algol 8, pass 5, page ...12... c9: rl. w1 f7. ; specifications: rs. w1 f20. ; spec ref:= spec top; jl. w3 e2. ; input(byte); a5: al w0 0 ; new spec word: spec word:=0; al w1 18 ; spec pos:=18; a6: sh w2 h11 ; new specification: if byte<spec limit then jl. a7. ; goto finish specifications; al w2 x2-h11 ; spec:= byte-spec limit; ls w2 x1 ; spec:=spec shift spec pos; lo w0 4 ; spec word:=spec word+spec; jl. w3 e2. ; input(byte); al w1 x1-6 ; spec pos:=spec pos-6; sl w1 0 ; if spec pos>=0 then jl. a6. ; goto new specification; am a5-e11 ; end word: action:= new spec word; goto in; a7: al. w1 e11. ; finish specifications: rl. w3 f7. ; action:= repeat input byte; rs w0 x3 ; in: al w3 x3-2 ; spec stack(spec top):=spec word; rs. w3 f7. ; spec top:=spec top-2; jl w3 x1 ; goto action; jl. c0. ; goto next; c10: al w0 h13 ; begin proc: jl. w3 e3. ; output(<begin proc>); ac. w3 j6. ; ref part.prepare decl:= wa. w3 f6. ; decl top - decl base + 12; al w3 x3+12 ; hs. w3 f3. ; bl. w3 f1. ; block part.prepare decl:= al w3 x3-2<4 ; block part.prepare decl - 2; hs. w3 f1. ; al w3 9 ; formal address:= 9; hs. w3 i1.+f14; bz. w0 b8. ; output(ext or rel); jl. w3 e3. ; comment external no; am 1 ; procedure block := true; skip next; c11: al w3 0 ; begin block: hs. w3 h53. ; else procedure block := false; jl. w3 e2. ; bl. w0 f4. ; input(byte); bl w2 5 ; w2 := signed(input byte); al w2 x2-e101 ; byte := byte - no of anonym. bytes in blocks; as w0 -4 ; comment - no of variable bytes; wa w0 5 ; working base:= current block + byte; al. w1 f44. ; if working base < min working base sh. w0 (f51.) ; then alarm(<:variables:>); jl. w3 e5. ; jl. w3 e3. ; output(working base); d4: al w3 c1-j0 ; block start: hs. w3 j0.+1 ; ident action:= declare; jl. w3 d28. ; set stop; al w3 0 ; hs. w3 b16. ; context := false; bl. w3 f4. ; as w3 -4 ; al w3 x3-1-e101 ; variable address:=current block-1-no of bytes for anonym. bytes in blocks; hs. w3 i1.+f12; al w3 -2<4 ; ba. w3 f4. ; current block := current block - 2; hs. w3 f4. ; sl w3 h34 ; if current block >= max block nest then jl. c0. ; goto next; al. w1 f33. ; alarm(<:block:>); jl. w3 e5. ; \f ;rc 1977.11.03 algol 6, pass 5, page ...13... c12: al w3 c4-j0 ; exit proc: hs. w3 j0.+1 ; ident action:=check declaration; c13: al w0 8 ; exit block: bl. w1 f4. ; not declared not used:= 0+not used flag; rl. w2 f24. ; a8: bl w3 x2-1 ; so w3 2.1110 ; for i:= min ident step 4 until max ident do la. w3 f5. ; if block part.ident table(i)=current block sn w3 x1 ; and flag.ident table(i)<>st flag then rs w0 x2-2 ; ident table(i):=not declared not used; al w2 x2+4 ; sh. w2 (f40.) ; jl. a8. ; al w3 2<4 ; ba. w3 f4. ; hs. w3 f4. ; current block:= current block+2; c14: jl. w3 d5. ; unstack for labels: rs. w2 f7. ; unstack decl(spec top); jl. c0. ; goto next; d5: rs. w3 f41. ; procedure unstack decl(stop inf); ds. w1 f43.+2 ; integer stop inf; comment output in w2; rl. w3 f6. ; begin a9: rl w2 x3-4 ; for ident:= decl stack(decl top - 4) sn w2 0 ; while ident <> 0 do jl. a10. ; begin dl w1 x3 ; ident table(ident):= decl stack(decl top); ds w1 x2 ; decl top:= decl top - 6; al w3 x3-6 ; end; jl. a9. ; comment decl top points at stack-stop; a10: rl w2 x3 ; stop inf:= decl stack(decl top); rl w0 x3-2 ; context := hs. w0 b16. ; decl stack(top-2); al w3 x3-6 ; decl top:= decl top - 6; rs. w3 f6. ; end; dl. w1 f43.+2 ; jl. (f41.) ; c41: jl. w3 d25. ; decl zone: jl. w3 e11. ; w0:=w2:=next relevant; repeat input byte; sn w2 h47 ; if byte = context zone ident then hs. w2 b16. ; context := true; jl. c0. ; goto next; \f ;rc 1977.11.03 algol 6, pass 5, page ...14... c15: b16=k+1;context ; output descriptions: sn w3 x3 ; se w2 h49 ; if -,context and ident = exit jl. a37. ; then al w0 h51 ; error(<:context label:>); jl. w3 d16. ; a37: ls w2 2 ; wa. w2 f25. ; ident:= byte*4 + ident table base; d6: al w1 2.1111 ; descript:= ident table(ident); la w1 x2-1 ; normal out: flag:= flag part.descript; sn w1 4 ; if flag= proc value then jl. d10. ; goto proc value; sn w1 8 ; if flag= not declared not used then jl. d15. ; goto undeclared; sl w1 14 ; if flag= first use of standard then jl. d19. ; goto first st use; d7: bz w0 x2 ; continue out: outbyte:= kind part.descript; sn w0 h15 ; if outbyte=<for label> then jl. d13. ; goto for label error; sn w1 5 ; if flag = own then jl. d8. ; goto cont dope out; b11=k+1; local mode ; se w3 x3 ; if local mode then jl. d14. ; goto check local; d8: jl. w3 e3. ; cont dope out: bl w0 x2-2 ; output(outbyte); jl. w3 e3. ; output(rel addr part.descript); bl w0 x2-1 ; outbyte:= block part.descript shift -4; ls w0 -4 ; if flag= own then sn w1 5 ; outbyte:= no of fictive own block; al w0 h16 ; jl. w3 e3. ; output(outbyte); sh w1 1 ; if flag = array with subs or jl. d12. ; flag = formal array with subs then sn w1 7 ; goto output dope description; jl. a13. ; if flag = parproc then goto output spec; d9: rl. w3 e9. ; count output: al w3 x3+1 ; information 1:= information 1 + 1; rs. w3 e9. ; goto if -,outerror then next else outerr; j9: jl. c0. ; d10: rs. w2 f23. ; proc value: store(ident); jl. w3 d25. ; byte:= next relevant; jl. w3 e11. ; repeat input byte := true; se w2 h19 ; if byte <> <first:=> and byte<> <:=> then sn w2 h20 ; begin jl. a12. ; take proc decl from stack: am. (f23.) ; bz w2 1 ; ident:= ref part.descript + decl base; al. w2 x2+j6. ; descript:= decl stack(ident); goto normal out; jl. d6. ; end; a12: rl. w2 f23. ; restore(ident); al w1 6 ; flag:= normal identifier; jl. d7. ; goto continue out; d30: bz. w0 b6. ; outerr: jl. w3 d16. ; error(error type); al w3 c0-j9 ; outerror:= false; hs. w3 j9.+1 ; goto next; jl. c0. ; ;d11: see p. 19 \f ;rc 4.12.1970 algol 6, pass 5, page ...15... d12: bl w2 x2+1 ; output dope description: wa. w2 f21. ; stack ref:= ref part.descript+spec base; al w2 x2+2 ; description:= spec stack(stack ref); al w1 6 ; flag:= normal identifier; bz w0 x2 ; outbyte:= kind part.descript; jl. d8. ; goto cont dope out; a13: bl w2 x2+1 ; output spec: jl. a15. ; stack ref:= refpart.descript+specbase; goto inn; a14: al w2 x2-2 ; next word: stack ref:= stack ref - 2; a15: am. (f21.) ; inn: stack word:= spec stack(stack ref); rl w1 x2 ; al w0 0 ; spec:= stack word // 2**18; ld w1 6 ; stack word:= stack word shift 6 + endmark; al w1 x1+63 ; a16: sn w0 0 ; next spec: if spec = 0 then jl. d9. ; goto count output; sn w0 63 ; if spec = endmark then jl. a14. ; goto next word; ba. w0 f19. ; spec:= spec + spec output base; jl. w3 e3. ; output(spec); al w0 0 ; spec:= stack word // 2**18; ld w1 6 ; stack word:= stack word shift 6; jl. a16. ; goto next spec; d14: bl w3 x2-1 ; check local: la. w3 f5. ; sn. w3 (f4.) ; if block no. descript <> current block sn w0 h4 ; or outbyte = <undeclared> then jl. d8. ; goto cont dope out; se w1 9 ; if flag=formal or sn w1 0 ; flag=formal array with subs then jl. d8. ; goto cont dope out; am h22-h21; error type:= <local>; goto a; d13: am h21-h23; for label error: error type:=<for label>; goto a; d15: al w0 h23 ; undeclared: error type:=<-decl>; hs. w0 b6. ; a: al w0 d30-j9 ; outerror:= true; hs. w0 j9.+1 ; dl. w1 f4.+2 ; rel addr part.descript:= 0; bz w0 1 ; ba. w0 f8. ; block part.descript:= current block+normal flag; bz. w3 b6. ; kind part.descript:= <undeclared>; sn w3 h21 ; if error type = <local> then al. w2 f2. ; stack decl(ident); sn w3 h22 ; if error type <> <for label> then jl. w3 d27. ; ident table(ident):= descript; ds w1 x2 ; jl. d6. ; goto normal out; d16: rs. w3 f23. ; procedure error(error type); hs. w0 b6. ; value error type; integer error type; al w0 h5 ; begin jl. w3 e3. ; output(<error>); b6=k+1; error type ; output(error type); al w0 ; end; jl. w3 e3. ; jl. (f23.) ; \f ;rc 1977.11.24 algol 6, pass 5, page ...16... c16: al w3 0 ; set head count: hs. w3 b7. ; head count:= 0; jl. c0. ; goto next; c17: bz. w0 b0. ; end bound head: jl. w3 e3. ; output(type); d17: b7=k+1; head count ; zone head: al w0 ; output(head count); jl. w3 e3. ; d18: ; zone array head: b8=k+1; ext or rel ; al w0 ; jl. w3 e3. ; output(ext or rel); hs. w0 b11. ; local mode:= true; jl. w3 d28. ; set stop; c18: am c15-c4 ; set descr: ident action:=output description; c19: am c4-c2 ; goto next; c20: al w3 c2-j0 ; set check: ident action:= check declarations; hs. w3 j0.+1 ; goto next; sn w3 c2-j0 ; set for label: ident action := for label; jl. w3 d28. ; set stop; jl. c0. ; goto next; c21: am d18-d17; end zone arr head:set return(zone array head); c22: al. w1 d17. ; copy 1; jl. c31. ; end zone head: set return(zone head); copy 1; c23: al w0 h37 ; end check local: jl. w3 e3. ; output(<end zone local>); am c0-c19 ; set return(next); goto reset local; c24: al. w1 c19. ; end bounds: set return(set check); al w3 0 ; reset local: hs. w3 b11. ; local mode:= false; jl. w3 d5. ; unstack decl(no interest); jl x1 ; return; d28: rs. w3 f41. ; procedure set stop; rl. w3 f6. ; begin al w3 x3+6 ; decl top:= decl top + 6; rs. w3 f6. ; decl stack(decl top):= jl. w3 d3. ; check stack; rs. w3 (f6.) ; comment spec top as stop inf; bz. w3 b16. ; am. (f6.) ; decl stack(top-2) := rs w3 -2 ; context; al w3 0 ; decl stack(decl top-4):= 0; am. (f6.) ; end; rs w3 -4 ; jl. (f41.) ; \f ; rc 1977.11.24 algol 7, pass 5, page ...16a... c42: jl. w3 d25. ; begin zone: jl. w3 e11. ; next relevant; repeat input byte; h53=k+1; procedure block se w3 x3+0 ; if procedure block se w2 h47 ; and byte = context zone then jl. a38. ; begin al w0 h52 ; error(<:context proc:>); jl. w3 d16. ; goto set head count; jl. c16. ; end; a38: bz. w0 b16. ; se w0 0 ; if context sn w2 h47 ; and jl. c16. ; byte <> context zone ident al w0 h50 ; then jl. w3 d16. ; error(<:context zone:>); jl. c16. ; goto set head count; \f ; rc 4.12.1970 algol 6, pass 5, page ...17... d19: rl w0 x2-2 ; first st use: as w0 -4 ; st address:= bit0-19.ident table(ident) wa. w0 f27. ; shift-4 + st table base; rl. w3 f29. ; sn w3 0 ; if chain last = 0 then al. w3 f28. ; chain start:= st address else rs w0 x3 ; chain part.st table(chain last):= st address; rs. w0 f29. ; chain last:= st address; bz. w3 i1.+f10; al w3 x3+1 ; rel addr part.ident table(ident):= hs. w3 i1.+f10; ext no:= ext no + 1; hs w3 x2-2 ; flag.ident table(ident):= flag-st flag diff; al w1 x1+(:h16+1:)<4-h26; block.ident table(ident):= hs w1 x2-1 ; fictive outer block no +1; jl. d6. ; goto normal out; c25: al w3 g9 ; begin external: hs. w3 g5. ; action table(decl no par proc):= decl ext proc; hs. w3 g16. ; action table(decl no proc not) := decl ext proc; al w3 g10 ; action table(decl parproc) := decl ext proc; hs. w3 g17. ; action table(decl parproc not) := decl ext parproc; hs. w3 g6. ; comment set action table to external; al w3 -2<4 ; hs. w3 f4. ; current block:= -2; hs. w3 b9. ; external:= true; jl. w3 e2. ; input(dummy byte); jl. d4. ; goto block start; c26: al. w3 c0. ; end external: b9=k+1;external ; set return(next); sn w3 x3 ; if -,external then jl. d29. ; out end; al w0 h27 ; jl. w3 e3. ; output(<end external>); al. w2 f30. ; a29: bz w0 x2 ; for i:= 1 step 1 until 4 do jl. w3 e3. ; output(ext spec(i)); al w2 x2+1 ; se. w2 f30.+4 ; jl. a29. ; jl. d24. ; goto cont end; \f ;rc 04.05.1971 algol 6, pass 5, page ...18... c27: ld w1 50 ; decl ext proc: al. w3 c0. ; spec1:= spec2:= 0; set return(next); jl. a17. ; goto contin; c28: dl. w1 (f20.) ; decl ext par proc: spec1:= spec stack(spec ref); rx w1 0 ; spec2:= spec stack(spec ref - 2); al. w3 c7. ; set return(par proc decl); a17: bz. w2 f2. ; contin: bz. w2 x2+g15. ; extkind:= ext kind table(type) shift 18; ls w2 18 ; sz w0 2.111111; if last spec.spec1 <> 0 then jl. a19. ; goto test spec2 ; al w1 0 ; spec2:= 0; a18: ld w1 -6 ; set ext spec: wa w0 4 ; ext spec(1:2):= ds. w1 f30.+2 ; extkind + (spec1 con spec2) shift (-8); al w2 c0-j1 ; hs. w2 g5. ; action table(decl no par proc):= next; hs. w2 g16. ; action table(decl parproc not) := parproc decl; al w2 c7-j1 ; action table(decl par proc):= par proc decl; hs. w2 g17. ; action table(decl no par not) := nexti; hs. w2 g6. ; comment reset action table; jl x3 ; return; a19: sz w1 2.111111; test spec2: jl. a33. ; if last spec. spec2 = 0 then jl. a18. ; goto set ext spec; a33: jl. w1 e5. ; alarm(<:ext param:>); <:ext param<0>:> ; g9 = c27-j1 ; table address of decl ext proc; g10= c28-j1 ; - - - decl ext par proc; h. g15=k-h46 3,4,5,2,1 ; ext kind table: int, real, long, bool, not 3,4,5,2,1 ; int, real, long, bool, not w. j4: c29 ; comment copy procedures called with return in w1; j5: c30 ; c29: rx. w1 j4. ; procedure copy 4;begin copy 2; copy 2 end; c30: rx. w1 j5. ; procedure copy 2;begin copy 1; copy 1 end; c31: jl. w3 e2. ; procedure copy 1; al w0 x2 ; begin input(byte); jl. w3 e3. ; output(byte); jl x1 ; end; d20: al w0 h28 ; nl: jl. w3 e3. ; output(<newline>); jl. w3 e1. ; nl counter:= nl counter + 1; jl. d11. ; return(nxt rel 1); c32: jl. w3 e1. ; nl action: nl counter:= nl counter + 1; jl. c0. ; goto next; \f ; jz 1979.10.09 algol 8, pass 5, page ...19... d21: al w0 h5 ; treat error: jl. w3 e3. ; output (<error>); jl. w1 c31. ; copy 1; jl. d11. ; return(nxt rel 1); c33: jl. w1 c31. ; error action: jl. c0. ; copy 1; goto next; c34: rl. w0 f4. ; end pass 5: sh w0 h16<4-1; if current block no < no of fictive jl. w3 d29. ; outer block then al w0 h30 ; out end; jl. w3 e3. ; output(<endpass>); d24: bz. w0 f9. ; cont end: jl. w3 e3. ; output(no of globals); bz. w0 i1.+f10; no of st proc:= bs. w0 f9. ; st ext no - no of ext + 1; ba. w0 1 ; jl. w3 e3. ; output(no of externals); rl. w1 f28. ; next st:= chainstart; a30: sn w1 0 ; for i:= next st while i<>0 do jl. w3 a40. ; begin al w2 x1+2 ; for j:= i+2 step 1 until i+13 do a20: bz w0 x2 ; output(byte.st table(j)); jl. w3 e3. ; comment <8 bytes name> and al w2 x2+1 ; <4 bytes kind and spec>; se w2 x1+14 ; next st:= chain part. st table (i) jl. a20. ; end st proc output; rl w1 x1 ; goto take next pass; jl. a30. ; a40: al. w2 b17. ; a39: bz w0 x2 ; output the pseudo jl. w3 e3. ; external entry al w2 x2+1 ; with the algol se. w2 b18. ; version number; jl. a39. ; used by pass9 only jl. e7. ; goto next pass; d25: rs. w3 f41. ; next relevant: store(return); d11: jl. w3 e2. ; nxt rel 1: input(byte); al w0 x2 ; outbyte:= byte; al. w3 d11. ; set return from output(nxt rel1); sn w2 h17 ; if byte = <newline> then jl. d20. ; goto nl; sn w2 h18 ; if byte = <error> then jl. d21. ; goto treat error; se w2 h24 ; if byte = <vanished operand> or sn w2 h38 ; byte = <internal operand> then jl. e3. ; output(outbyte); jl. (f41.) ; return; ;c35: see p. 10 ;c36: see p. 10 ;d26: see p. 8 ;d27: see p. 9 ;d28: see p. 16 ;c37: see p. 11 d29: rs. w3 f41. ; procedure out end; al w0 h39 ; begin jl. w3 e3. ; output(<end block>); al w0 h40 ; output(<exit block>); jl. w3 e3. ; jl. (f41.) ; end; b17: <:*version:>,0, e103, 0 ; pseudo external list item (version) b18: \f ; rc 9.1.1971 algol 6, pass 5, page ...20... h. ; kind table entry : kind - type g0=k-3 ; kind base h36+26 ; 3 decl switch : switch h14 ; 4 decl label : label h15 ; 5 decl for label : for label h4 ; 6 decl undef proc : undeclared h36+51 ; 7 decl zone : zone h36+57 ; 8 decl zone array : zone array h36+27 ; 9 formal label : formal label h4 ; 10 formal general : undeclared h4 ; 11 formal unspec : undeclared h36+28 ; 12 formal switch : formal switch h36+80 ; 13 formal zone : formal zone h36+57 ; 14 take zone array : zone array 0 ; 15 beg switch : - ;type limit h7 ; 16 beg parproc : simple 0 ; 20 beg parproc not : - h7 ; 24 beg no parproc : simple 0 ; 28 beg no par not : - h36+29 ; 32 decl no parproc : proc no par h36+33 ; 36 decl no par not : proc no par h36+34 ; 40 decl parproc : par proc h36+38 ; 44 decl par not : par proc h7 ; 48 decl simple : simple h36+43 ; 52 decl field : field h36+47 ; 56 decl array field : array field h7 ; 60 decl own : simple h36+52 ; 64 decl array : array h36+52 ; 68 take array : array h7 ; 72 take value : simple h36+58 ; 76 formal proc : formal proc h36+62 ; 80 formal proc not : formal proc h36+63 ; 84 formal simple : formal simple h36+67 ; 88 formal field : formal field h36+71 ; 92 formal array field : formal array field h36+75 ; 96 formal string : formal string h36+76 ; 100 anonymous array : anonymous array 0 ; 104 begin bounds : - ;output-action limit g11=k-h2; kindbase 2 0 ; 108 begin zone : - 0 ; 109 begin zone array : - h28 ; 110 newline : newline h36+5 ; 111 begin block : beg block h36+4 ; 112 begin external : begin ext 0 ; 113 endpass : - h36+17 ; 114 begin list : beg list h36+18 ; 115 begin list field : beg list 0 ; 116 specifications : - 0 ; 117 label colon : - h36+21 ; 118 end zone arr head : beg zone array h36+20 ; 119 end zone head : beg zone h36+19 ; 120 end bounds head : beg bounds h36+10 ; 121 end bounds : end bounds h36+11 ; 122 end zone decl : end zone decl 0 ; 123 end head : - 0 ; 124 end decl : - 0 ; 125 end check local : h40 ; 126 exit block : exit block \f ; rc 4.12.1970 algol 6, pass 5, page ...21... ; kind table entry : kind - type 0 ; 127 end external : - h36 ; 128 do : do h36+1 ; 129 end do : end do h36+2 ; 130 end single do : end single do h36+14 ; 131 exit proc no type : exit proc no type h36+15 ; 132 exit type proc : exit type proc h36+81 ; 133 integer literal : integer literal h36+82 ; 134 real literal : real literal h36+83 ; 135 long literal : long literal h36+84 ; 136 boolean literal : boolean literal h36+85 ; 137 string first : string first h36+86 ; 138 string next : string next h5 ; 139 error : error ; count table entry : counter ,ext, flag g1=k-3; count base f11 <5+ 1 <4+ 6 ; 3 decl switch : global ,yes, normal f11 <5+ 1 <4+ 6 ; 4 decl label : global ,yes, normal f11 <5+ 1 <4+ 6 ; 5 decl for label : global ,yes, normal f11 <5+ 1 <4+10 ; 6 decl undef proc : global ,yes, undef proc f12 <5+ 2 ; 7 decl zone : variable addr ,no , zone f12 <5+ 2 ; 8 decl zone array : variable addr ,no , zone f14 <5+ 9 ; 9 formal label : formal addr ,no , formal f14 <5+ 9 ; 10 formal general : formal addr ,no , formal f14 <5+ 9 ; 11 formal unspec : formal addr ,no , formal f14 <5+ 9 ; 12 formal switch : formal addr ,no , formal f14 <5+ 9 ; 13 formal zone : formal addr ,no , formal f14 <5+ 9 ; 14 formal zone array : formal addr ,no , formal 4 ; 15 beg switch : - ,no , proc value ;type limit f12 <5+ 4 ; 16 beg par proc : variable addr ,no , proc value f12 <5+ 4 ; 20 beg parproc not : variable addr ,no , proc value f12 <5+ 4 ; 24 beg no parproc : variable addr ,no , proc value f12 <5+ 4 ; 28 beg no par not : variable addr ,no , proc value f11 <5+ 1 <4+ 6 ; 32 decl no parproc : global ,yes, normal f11 <5+ 1 <4+ 6 ; 36 decl no par not : global ,yes, normal f11 <5+ 1 <4+ 7 ; 40 decl parproc : global ,yes, parproc f11 <5+ 1 <4+ 7 ; 44 decl par not : global ,yes, parproc f12 <5+ 6 ; 48 decl simple : variable addr ,no , normal f12 <5+ 6 ; 52 decl field : variable addr ,no , normal f12 <5+ 6 ; 56 decl array field : variable addr ,no , normal f13 <5+ 5 ; 60 decl own : own addr ,no , own f12 <5+ 1 ; 64 decl array : variable addr ,no , array subscr f12 <5+ 0 ; 68 take array : variable addr ,no , form arr sub f14 <5+ 9 ; 72 take value : formal addr ,no , formal f14 <5+ 9 ; 76 formal proc : formal addr ,no , formal f14 <5+ 9 ; 80 formal proc not : formal addr ,no , formal f14 <5+ 9 ; 84 formal simple : formal addr ,no , formal f14 <5+ 9 ; 88 formal field : formal addr ,no , formal f14 <5+ 9 ; 92 formal array field: formal addr ,no , formal f14 <5+ 9 ; 96 formal string : formal addr ,no , formal f14 <5+ 9 ; 100 anonymous array : formal addr ,no , formal f14 <5+ 6 ; 104 begin bounds : formal addr ,no , normal \f ; rc 1977.11.03 algol 6, pass 5, page ...22... ; increment table entry : increment g2=k-3 ; incr base f36-j2 ; 3 decl switch : ext f36-j2 ; 4 decl label : ext f36-j2 ; 5 decl for label : ext f36-j2 ; 6 decl undef proc : ext f34-j2 ; 7 decl zone : zone f38-j2 ; 8 decl zone array : zone array f35-j2 ; 9 formal label : formal f35-j2 ; 10 formal general : formal f35-j2 ; 11 formal unspec : formal f35-j2 ; 12 formal switch : formal f35-j2 ; 13 formal zone : formal f35-j2 ; 14 take zone array : formal 0 ; 15 beg switch : - ;type limit f39-j2 ; 16 beg parproc : simple f39-j2 ; 20 beg par not : simple f39-j2 ; 24 beg no parproc : simple f39-j2 ; 28 beg no par not : simple f36-j2 ; 32 decl no parproc : ext f36-j2 ; 36 decl no par not : ext f36-j2 ; 40 decl parproc : ext f36-j2 ; 44 decl par not : ext f39-j2 ; 48 decl simple : simple f37-j2 ; 52 decl field : field f37-j2 ; 56 decl array field : field f39-j2 ; 60 decl own : simple f37-j2 ; 64 decl array : array f37-j2 ; 68 take array : array f35-j2 ; 72 take value : formal f35-j2 ; 76 formal proc : formal f35-j2 ; 80 formal proc not : formal f35-j2 ; 84 formal simple : formal f35-j2 ; 88 formal field : formal f35-j2 ; 92 formal array field : formal f35-j2 ; 96 formal string : formal f35-j2 ; 100 anonymous array : formal f35-j2 ; 104 begin bounds : formal ; action table entry : action g3=k-3 ; action base c0-j1 ; 3 decl switch : next c0-j1 ; 4 decl label : next c0-j1 ; 5 decl forlabel : next c0-j1 ; 6 decl undef proc : next c41-j1 ; 7 decl zone : decl zone c0-j1 ; 8 decl zone array : next c37-j1 ; 9 formal label : formal c37-j1 ; 10 formal general : formal c37-j1 ; 11 formal unspec : formal c37-j1 ; 12 formal switch : formal c37-j1 ; 13 formal zone : formal c35-j1 ; 14 take zone array : take zone array c10-j1 ; 15 beg switch : beg proc \f ; rc 1977.11.03 algol 6, pass 5, page ...23... ; action table entry : action ; type limit c10-j1 ; 16 beg par proc : beg proc c10-j1 ; 20 beg parproc not : beg proc c10-j1 ; 24 beg no parproc : beg proc c10-j1 ; 28 beg no par not : beg proc g5: c0 -j1 ; 32 decl no parproc : next g16:c0 -j1 ; 36 decl no par not : next g6: c7 -j1 ; 40 decl parproc : par proc decl g17:c7 -j1 ; 44 decl par not : par proc decl c0 -j1 ; 48 decl simple : next c0 -j1 ; 52 decl field : next c0 -j1 ; 56 decl array field : next c0 -j1 ; 60 decl own : next c6 -j1 ; 64 decl array : array declaration c5 -j1 ; 68 take array : take c36-j1 ; 72 take value : take value c37-j1 ; 76 formal proc : formal c37-j1 ; 80 formal proc not : formal c37-j1 ; 84 formal simple : formal c37-j1 ; 88 formal field : formal c37-j1 ; 92 formal array field: formal c37-j1 ; 96 formal string : formal c37-j1 ; 100 anonymous array : formal c16-j1 ; 104 begin bounds : set head count ; output action limit g12=k-h2 ; action base 2 c42-j7 ; 108 begin zone : begin zone c0 -j7 ; 109 begin zone array : next c32-j7 ; 110 newline : nl action c11-j7 ; 111 begin block : begin block c25-j7 ; 112 begin external : begin external c34-j7 ; 113 endpass : end pass 5 c31-j7 ; 114 begin list : copy 1 c31-j7 ; 115 begin list field : copy 1 c9 -j7 ; 116 specifications : specifications c3 -j7 ; 117 label colon : label colon c21-j7 ; 118 end zone arr head : end zone array head c22-j7 ; 119 end zone head : end zone head c17-j7 ; 120 end bounds head : end bounds head c24-j7 ; 121 end bounds : end bounds c19-j7 ; 122 end zone decl : set check c18-j7 ; 123 end head : set descr c19-j7 ; 124 end decl : set check c23-j7 ; 125 end check local : end check local c13-j7 ; 126 exit block : end block c26-j7 ; 127 end external : end external c20-j7 ; 128 do : set for label c14-j7 ; 129 end do : unstack for labels c14-j7 ; 130 end single do : unstack for labels c12-j7 ; 131 exit proc no type : end proc c12-j7 ; 132 exit type proc : end proc c30-j7 ; 133 integer literal : copy 2 c29-j7 ; 134 real literal : copy 4 c29-j7 ; 135 long literal : copy 4 c31-j7 ; 136 boolean literal : copy 1 c29-j7 ; 137 string first : copy 4 c29-j7 ; 138 string next : copy 4 c31-j7 ; 139 error : copy 1 \f ;rc 4.12.1970 algol 6, pass 5, page ...24... w. ;following initialization code is later overwritten by ;stacks and tables so j6 becomes decl base, see pg.2; i3= k-i2; entry pass 5 address j6: al. w3 c29. ; initialize pass 5: rs. w3 j4. ; initialize(addresses in copy procedure); al. w3 c30. ; rs. w3 j5. ; jl. w3 e2. ; input (no of ext); bl w0 5 ; hs. w2 f9. ; hs. w2 i1.+f10 ; st ext no:= no of ext; jl. w3 e2. ; input (no of own cells); al. w1 f44. ; sh w2 2047 ; if no of ext < 0 or sh w0 -1 ; no of own cells < 0 then jl. w3 e5. ; alarm(<:variables:>); al w0 x2 ; output (no of own cells); jl. w3 e3. ; al w2 x2-1 ; hs. w2 i1.+f13 ; own address:= no of own cells - 1; jl. w3 e2. ; input (identifier limit); ls w2 2 ; init ident table: rl. w3 e9.+4 ; if last work for pass mod 2<> 0 then sz w3 1 ; last work for pass:= last work for pass -1; al w3 x3-1 ; max ident addr:= last work for pass; rs. w3 f40. ; ident table base:= ws w3 4 ; last work for pass - identifier limit *4; rs. w3 f25. ; wa. w3 f31. ; min ident addr:= ident table base + 512 * 4; rs. w3 f24. ; sh. w3 j6. ; if min ident addr<= init pass 5 addr then jl. i0. ; alarm(<:stack:>); rl. w1 f40. ; al w2 8 ; not declared not used:=0+ not used flag; a21: rs w2 x1-2 ; for i:= max ident step -4 until min ident do al w1 x1-4 ; first word.ident table(i):= sl w1 x3 ; not declared not used; jl. a21. ; first free:= rs. w1 f27. ; st table base:= min ident -4; jl. w3 e2. ; read st proc: input (byte); a22: sn w2 0 ; for i:= first free - 11 while byte<>0 do jl. a24. ; begin al w1 x1-14 ; first free:= first free - 14; al w0 x1+3 ; sh. w1 j8. ; if first free<= last pass 5 addr then jl. i0. ; alarm (<:stack:>); a23: hs w2 (0) ; for j:= i step 1 until i+12 do jl. w3 e2. ; begin ba. w0 1 ; st proc table (i):= byte; se w0 x1+16 ; input (byte); jl. a23. ; end; jl. a22. ; end; \f ; jz.fgs 1983.03.30 algol 6, pass 5, page ...25... a24: rs. w1 f21. ; treat st proc: rs. w1 f7. ; spec base:= spec top:= first free; al. w0 j6. ; rs. w0 f6. ; decl top:= addr (init pass 5); al w1 x1+2 ; st:= first free+2; d22: sl. w1 (f27.) ; new st proc: if st >= st table base then jl. c0. ; goto next; al w2 0 ; kindspec1:= word.st proc table(st+10); dl w0 x1+12 ; kindspec2:= word.st proc table(st+12); ls w3 1 ; bit 0 = compiler (0:algol, 1:fortran) ignored ld w3 5 ; kind:= bit 1-5.kindspec1; sl w2 8 ; if kind < 8then jl. a27. ; begin bz. w2 x2+g13. ; comment standard procedure; hs. w2 b10. ; st kind:= proc kind table(kind); se w3 0 ; if bit6-23.kind spec1<>0 sn w2 h4 ; and st kind <> <undecl> then jl. a26. ; begin comment parameters; ls w3 -6 ; ld w0 6 ; kindspec1and2:= kindspec1and2 shift 6; rs. w3 (f7.) ; spec stack(spec top):= kindspec1; jl. w3 d3. ; check stack; specref:= spec top; al w3 x3-2 ; spec top:= spec top-2; am (x1+12) ; sn w3 x3 ; if kindspec2 <> 0 then jl. a25. ; begin comment more param; rs w0 x3 ; spec stack(spec top):= kindspec2; al w3 x3-2 ; spec top:= spec top - 2; a25: rx. w3 f7. ; end; ws. w3 f21. ; spec ref:= spec ref - spec base; al w0 15 ; flag:= par proc+st flag diff; jl. d23. ; end parameter proc else a26: se w2 h4 ; begin if st kind <> <undecl> then al w2 x2+h32 ; st kind:= st kind + par kind diff; jl. a28. ; flag:= normal ident+st flag diff; ; end no parameter proc; ; end proc else a27: ; begin ; comment standard variable or zone; bz. w2 x2+g14. ; st kind:= st var table(kind); a28: hs. w2 b10. ; flag:= normal ident + flag diff; al w0 14 ; end standard variable or zone; \f ;rc 11.1.1971 algol 6, pass 5, page ...26... d23: bz w2 x1+1 ; load ident table: ls w2 2 ; ident:= st proc table (st+1)*4 wa. w2 f25. ; + ident table base; hs w3 x2+1 ; ref part.ident table (ident):= spec ref; b10=k+1; st kind ; al w3 ; kind part.ident table(ident):= st kind; hs w3 x2 ; al w3 x1 ; st addr:= (st - st table base)shift 4; ws. w3 f27. ; ls w3 4 ; lo w3 0 ; st addr:= st addr + flag; rs w3 x2-2 ; bit 0-19. ident table (ident):= st addr; al w0 0 ; rs w0 x1 ; chain part. st table (st):= 0; al w1 x1+14 ; st:= st+14; j8: jl. d22. ; goto new st proc; h. g13=k-1; proc kind table h36+ 38; 1 param proc no type h36+ 37; 2 - - boolean h36+ 34; 3 - - integer h36+ 35; 4 - - real h36+36; 5 - - long integer h4 ; 6 - - long real h4 ; 7 - - complex g14=k-8; st var table h7 + 3; 8 simple boolean h7 ; 9 simple integer h7 + 1;10 simple real h7+2,h4,h4;11, 12, 13 long int, long real, complex h36+ 51 ;14 zone ;d24 see p.21 ;d25 see p.19 ;d30 see p.14 ;j9 see p.14 w. g8= k-i2; length of pass 5 in bytes e30=e30+g8 i. e. m. jz 1983.03.30 algol 8, pass 5 \f ▶EOF◀