|
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: 33792 (0x8400) Types: TextFile Names: »algpass23tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »algpass23tx «
;rc 3.12.1970 algol 6, pass 2, page ...1... ;explanation of pass 2: ;pass 2 recognizes byte strings representing identifiers and ;substitutes a unique byte for each such string. this is done ;regardless of block structure, so that the same identifier will ;be represented by the same byte throughout the text. the values ;of the bytes will be in the range 512< <byte> <4096. ;pass 2 uses three tables to accomplish this task: ;letter table(1:58), ;main(first free after pass 2:first free+2*no. identifiers), ;aux(last word in pass:last word-no.long identifier parts). ;identifiers are packed into these tables and recognized as follows: ;the first character is saved in a working location. the second and ;succeeding characters are packed as an integer base 69 into the ;rightmost 23 bits of word 2 of the current main entry. when this ;is done bit(0) of word 2 is set to 1 and the search routine begins. ;if the identifier cannot be packed into 23 bits, the rightmost 23 ;bits of aux words (beginning with the current aux word and working ;backwards in the store) are used. bit(0) in these aux words is set ;to zero except in the word the identifier terminates, where it is ;set to one. then the absolute address of the first aux word used ;for the identifier is placed in word 2 of the current main entry. ;this also makes bit(0) of word 2=0, and the search routine commences. ;if the identifier consists of only one character, current main word 2 ;will be all zeroes except bit(0). ;the search routine begins by checking the letter table entry corres- ;ponding to the first character. if it is zero the current main address ;is placed in it, and the not-found action begins. otherwise the ;main entry whose address is stored in the letter table, and succeeding ;entries whose addresses are stored in word 1 of the main entries are ;checked until either the identifier is found or the chain is exhausted. ;in searching for an identifier that uses aux words, bit(0) of word 2 ;of a main entry is checked first. if it is a one, the chaining ;continues in the main table; but if it is a zero, the identifier is ;checked against the appropriated entries which word 2 points to. ;when an identifier is found the main base is subtracted from the ;main entry address, divided by 4 (since the addresses refer to bytes), ;added to 513, the identifier base, and output. the current main ;address remains the same. when an identifier is not found the main ;base is subtracted from the current main address and output as above. ;the current main address is increased by 4 (a double word), and the ;pass continues. ;after endpass is recognized and output, pass 2 enters the catalog scan. ;up to 4 catalog segments are read into the free area between main and ;aux words. each algol procedure identifier is unpacked from the catalog ;and packed into the current main word 2 or the necessary number of ;aux words, and the search routine proceeds as before. if the procedure ;identifier is not found, the next one is read in and the process ;continues. if it is found the identifier number is output followed ;by 12 bytes copied from the catalog which contain the procedure kind ;and specifications. the catalog scan continues until the catalog is ;exhausted, a zero is output, and the pass terminates. \f ; jz 1979.06.22 algol 8, pass 2, page ...2... k=e0 s. a36,b8,d22,f45,g3,h35,j0 w. j0:g1 ; number of bytes in pass 2; h. d0 ; entry address relative to first word; 2<1 ; pass mode bits (0=forward); w. f0: 0; current word addr; f1: 0; main top addr; f2: 0; aux top addr; f3: 0; current aux addr; main link f4: 0; search word; f5: 0; aux main word addr; f6: 0; current cat entry addr; f7: 0; cat entry name part; f8: <:catalog:> ; name: 0; 0; f9: 3<12; message: 0; first storage addr; 0; last storage addr; 0; first segment no.; f15: 0; answer: (8 words) status; 0; number of bytes; 0; number of characters; 0; 0; 0; 0; 0; f13: 69; packing base; f14: 613; first identifier; f16: <:variables<0>:> ; f17: 1<23; end mark; f18: 0; aux cat addr; f19: 0; min interval; f20: 0; - ; 0; f38-2: beginbits(1) f38: 0; beginbits(2) h. f10: 0, 0; first char, char; f11: 0, 0; no.entries processed, no.segments processed; f12: 0, 0; number of segments transported; w. h0= 134 ; end pass1 h1= 135 ; error h2= 136 ; new line h3= 133 ; last normal terminator h4= 139 ; space h5= 144 ; test mode initial h6 = 75 ; begin h7 = 95 ; ( h8 = 92 ; ; h9 =140 ; context h10=112 ; ) h11=100 ; , h12= 84 ; zone h13= 59 ; 0 h14= 79 ; own h15= 81 ; long \f ; jz 1979.06.22 algol 8, pass 2, page ...3... h16 = 77 ; for h17 =101 ; := h18 = 99 ; while h19 =104 ; do h20 =141 ; exit (in context programs) h21 =142 ; continue (in context programs) h22 =143 ; repeat (in repeat untill constructs) h23 = 98 ; until h24 = 93 ; end h25 = 94 ; else h26 = 96 ; -, h27 = 132 ; extract h28 = 122 ; = h29 = 78 ; if h30 =135 ; error (used for operans count) h31 =103 ; trouble h32 =145 ; special delimiter h33 =146 ; end special delimiter h34 =139 ; exit (output value) h35 =140 ; continue (output value) h. f21: h12,513,h7,514,h7,515,h11,h30,4093 ; context decl 1: ; zone z(init context(l, f25: f22: h10,h11,h13,h11,516,h10,h8,h14,h15,515,h30,4093; context decl 2: ; ),0,context zone proc); own long l; f26: f28: h16,517,h17,517,h18,h30,4094 ; while do f29: f24: h16,517,h17,517,h11,517,h18,h26,518,h19,h6,h8,h30,4092 ; repeat f30: f31: h8,518,h17,h30,4095 ; until(repeat) f32: f41: h23, h24, h24, ; until, end, end f40: f23: 514,0,r.4,4095,r.8,3<6+19,19<6+19,21<6,0 ; cat specs: ; interval, name, specs for init context(l,i,n,m) 516,0,r.4,4094,r.8,1<6+3,3<6+8,0,0 ; cat specs: ; interval, name, specs for context zone proc(z,s,b) 519,0,r.4,4091,r.8,1<6+10,0,0,0 ; cat specs: ; cat specs for exit operator in context programs 520,0,r.4,4090,r.8,1<6,0,0,0 ; cat specs: ; cat specs for continue operator in context programs; 517,0,r.4,4093,r.8,9<6, 0,0,0 ; cat specs: ; interval, name , specs for while <i> ; 518,0,r.4,4093,r.8,8<6,0,0,0 ; cat specs ; interval, name etc for repeat boolean f27: f44: h34 ; exit identifier f45: h35 ; continue identifier \f ; fgs 1985.03.08 algol 6, pass 2, page ...4... w. b2: 0 ; stop d19: rs. w3 b2. ; output: a23: sl. w2 (b2.) ; for byte := core(w2) jl x1 ; while w2 < stop do bz w0 x2 ; jl. w3 e3. ; begin al w2 x2+1 ; outbyte(byte); ; w2:=w2+1; jl. a23. ; end; h. f42: 5,24, 9,20, h32 ; exit 3,15,14,20, 9,14,21, 5,h32 ; continue h33 ; end special ident. w. f43: 0 ; initial pointer d21: ; d21 + 1 = initial phase se w3 x3+1 ; inbyte1: jl. e2. ; if -,initial phase then goto pass0-inbyte; rl. w2 f43. ; initial pointer := al w2 x2+1 ; initial pointer + 1; rs. w2 f43. ; bz w2 x2-1 ; byte := next special; sn w2 h33 ; if byte = end special then hs. w2 d21.+1; initial phase := false; jl x3 ; return; d0= k-j0; al. w1 g2. ; start pass 2: rs. w1 f0. ; rs. w1 f1. ; current word addr:=main top addr rl. w1 e9.+4 ; :=lower main limit; rs. w1 f2. ; aux top addr:=current aux addr rs. w1 f3. ; :=last word in pass; rl. w3 e23. ; min interval := am (x3+e66) ; own process.catbase; dl w3 +70 ; al w3 x3-1 ; ds. w3 f20. ; rl. w3 e9.+6 ; w3 := contextmode; se w3 0 ; if context mode then jl. d1. ; goto program scan; al w3 613 ; hs. w3 f44. ; exit ident := declared; al w3 614 ; hs. w3 f45. ; continue ident := declared; al w3 0 ; hs. w3 d21.+1 ; initial phase := true; al. w3 f42. ; initial pointer := start special ident; rs. w3 f43. ; d22: jl. w3 d21. ; special ident: inbyte1; sn w2 h33 ; if byte = end special then jl. d1. ; goto program scan; jl. d2. ; goto first char; \f ; rc 1977.11.02 algol 6, pass 2, page ...5... d1: jl. w3 e2. ; program scan: byte := inbyte; d18: sh w2 58 ; check byte: jl. d2. ; if byte < 59 then goto first char; b0 = k + 1; incontext ; special bytes: d3: se w3 x3 ; if incontext then jl. a21. ; goto check bracket; se w2 h6 ; if byte <> begin then jl. a22. ; goto check further; dl. w1 f38. ; begin: ld w1 1 ; beginbits := ds. w1 f38. ; beginbits shift 1; al w0 x2 ; jl. w3 e3. ; outbyte(byte); jl. w1 d20. ; next relevant; se w2 h9 ; if byte <> context then jl. d18. ; goto check byte; jl. w1 d20. ; next relevant; (expected to be left bracket) sn w2 h7 ; if byte = left bracket then jl. a24. ; goto context; al w0 h12 ; jl. w3 e3. ; outbyte(zone); jl. d18. ; goto check byte; a24: hs. w2 b0. ; context: al w1 1 ; hs. w1 b6. ; bracketcount := 1; al. w2 f21. ; incontext := true; al. w3 f25. ; jl. w1 d19. ; output(context decl 1); jl. d1. ; goto program scan; a21: se w2 h10 ; check bracket: jl. a22. ; if byte <> right bracket then goto check further bl. w1 b6. ; right bracket: al w1 x1-1 ; bracketcount := hs. w1 b6. ; bracketcount - 1; se w1 0 ; if bracketcount <> 0 then jl. a22. ; goto check further; al. w2 f22. ; end context: al. w3 f26. ; jl. w1 d19. ; output(context decl 2); al w0 0 ; hs. w0 b0. ; initcontext := false; jl. d1. ; goto program scan; d20: jl. w3 e2. ; next relevant: sn w2 h4 ; if inbyte = space then jl. d20. ; goto next relevant; se w2 h2 ; if byte <> newline then jl x1 ; return; al w0 x2 ; jl. w3 e3. ; outbyte(byte); jl. w3 e1. ; new line; jl. d20. ; goto next relevant; \f ; rc 1977.11.08 algol 6, pass 2, page ...6... a22: se w2 h7 ; check further: jl. a31. ; if byte <> left bracket then goto check exit: b6=k+1; bracketcount al w0 0 ; left bracket: ba. w0 1 ; bracketcount := bracketcount + hs. w0 b6. ; 1; jl. a1. ; goto output 1; a31: se w2 h20 ; check exit: jl. a32. ; if byte <> exit then goto check2; bz. w2 f44. ; exit: byte := exit identifier; jl. a1. ; goto output 1; a32: se w2 h21 ; check2: jl. a29. ; if byte <> continue then goto check repeat; bz. w2 f45. ; continue: byte := continue identifier; jl. a1. ; goto output 1; a29: se w2 h22 ; check repeat: jl. a34. ; if byte <> repeat then goto check until; al. w2 f24. ; repeat found: al. w3 f30. ; output(for <i> := <i>, <i> while -, <b> jl. w1 d19. ; do begin error -4 ); b8 = k + 1; repeat count al w1 0 ; al w1 x1+1 ; repeat count := hs. w1 b8. ; repeat count + 1; dl. w1 f38. ; beginbits := ld w1 1 ; beginbits shift 1; al w1 x1+1 ; beginbits := ds. w1 f38. ; beginbits + 1; jl. d1. ; goto program scan; \f ; jz 1979.08.10 algol 8, pass 2, page ...7... a34: se w2 h23 ; check until: jl. a35. ; if byte <> until then goto check end expr; bz. w0 b3. ; until found: bl. w1 b8. ; if repeat count = 0 se w1 0 ; or se w0 0 ; after for then jl. a27. ; goto check1; bz. w0 b7. ; sn w0 h24 ; if until expr = end byte then jl. w3 e3. ; then outbyte; rl. w0 f38. ; so w0 1 ; if beginbits extract 1 = 0 then jl. a27. ; goto check; al w1 x1-1 ; repeatcount := hs. w1 b8. ; repeatcount - 1; al w0 h24 ; hs. w0 b7. ; until expr := end byte; al. w2 f31. ; al. w3 f32. ; output(; <b> := error -1); jl. w1 d19. ; dl. w1 f38. ; ld w1 -1 ; ds. w1 f38. ; beginbits := beginbits shift (-1); jl. d1. ; goto program scan; a35: al w0 0 ; check end expr: se w2 h8 ; if byte = ; sn w2 h24 ; or byte = end al w0 h24 ; then byte1 := end; b7 = k + 1; until expr se w3 x3 ; if until expr <> 0 se w0 h24 ; or byte1 <> end then jl. a27. ; goto check; jl. w3 e3. ; outbyte(byte1); al w0 0 ; hs. w0 b7. ; until expr := false; a27: se w2 h24 ; check: if byte <> end then jl. a36. ; goto check1; dl. w1 f38. ; end: al w3 x1 ; bits := beginbits; ld w1 -1 ; ds. w1 f38. ; beginbits := beginbits shift (-1); so w3 1 ; if bits extract 1 = 0 then jl. a36. ; goto check; al. w2 f41. ; al. w3 f40. ; jl. w1 d19. ; output(until,end,end); bl. w1 b8. ; al w1 x1-1 ; hs. w1 b8. ; repeatcount := repeatcount - 1; jl. d1. ; goto programscan; \f ; rc 1977.11.02 algol 6, pass 2, page ...8... a36: sn w2 h16 ; check1: hs. w2 b3. ; if byte=for then al w0 0 ; after for := true; sn w2 h19 ; if byte = do then hs. w0 b3. ; after for := false; b3=k + 1; after for ; sn w3 x3 ; if after for se w2 h18 ; or byte <> while then jl. a25. ; goto check; al. w2 f28. ; while: al. w3 f29. ; jl. w1 d19. ; output(for <i> := <i> while); al w0 0 ; hs. w0 b3. ; after for := false; jl. d1. ; goto program scan; a25: sn w2 h9 ; check : al w2 h12 ; if byte = context then sh w2 h3 ; byte := zone; jl. a1. ; if inbyte<=last normal terminator sn w2 h4 ; then goto output 1; jl. d1. ; if inbyte=space then goto program scan; sn w2 h2 ; jl. a15. ; if inbyte=new line then goto new line; sn w2 h1 ; jl. a0. ; if inbyte=error then goto output 2; sn w2 h0 ; jl. d15. ; if inbyte=endpass then goto prepare cat scan; sn w2 h5 ; if inbyte=test mode initial jl. d17. ; then goto test mode identifier; al w0 x2 ; jl. w3 e3. ; output(inbyte); jl. w3 e2. ; al w0 x2 ; jl. w3 e3. ; output(inbyte); jl. w3 e2. ; al w0 x2 ; jl. w3 e3. ; output(inbyte); jl. w3 e2. ; a0: al w0 x2 ; output 2; jl. w3 e3. ; output(inbyte); jl. w3 e2. ; a1: al w0 x2 ; output 1; jl. w3 e3. ; output(inbyte); jl. d1. ; a15: al w0 x2 ; new line; jl. w3 e3. ; output(new line); jl. w3 e1. ; new line; jl. d1. ; goto program scan; \f ;rc 1977.11.08 algol 6, pass 2, page ...9... d17: al w2 59 ; test mode identifier: d2: ls w2 1 ; first char: hs. w2 f10. ; al w0 0 ; first char:=inbyte; al w1 0 ; main(top-1):=main(top):=0; ds. w1 (f1.) ; a10: jl. w3 d21. ; next char: sl w2 69 ; w2:=inbyte; jl. a16. ; if inbyte<69 hs. w2 f10.+1 ; then begin char:=inbyte; jl. w3 d10. ; packchar; jl. a10. ; goto next char end; a16: sn w2 h1 ; else if inbyte<>error then jl. a18. ; begin search; jl. w3 d11. ; if identifier not found then jl. a17. ; begin rl. w1 f1. ; last iden(link):=main top addr; sl. w2 g3. ; comment- letter table linking; am -2 ; rs w1 x2 ; rl. w2 f1. ; w2:=main top addr; al w1 x1+4 ; w1:=main top addr+4; sl. w1 (f2.) ; if w1>=aux top addr then got stack overflow; jl. d12. ; main top addr:=w1; rs. w1 f1. ; a17: rl. w1 f1. ; current word addr:=main top addr; rs. w1 f0. ; al. w0 g3. ; ws w2 0 ; identifier no.:= ls w2 -2 ; (identifier no.-main bottom addr)/4 wa. w2 f14. ; first identifier; bz w0 5 ; if identno>4095 then al. w1 f16. ; alarm(<:variables:>); se w0 x2 ; jl. w3 e5. ; bz. w3 d21.+1 ; if initial phase then sn w3 0 ; goto special ident; jl. d22. ; jl. w3 e3. ; output(identifier no.); jl. w3 e11. ; repeat input; jl. w3 e2. ; jl. d3. ; goto special bytes; end; a18: al w0 x2 ; jl. w3 e3. ; else begin jl. w3 e2. ; output(inbyte);comment-error; al w0 x2 ; output(inbyte);comment-error identification; jl. w3 e3. ; goto next char; jl. a10. ; end; \f ;rc 1977.11.02 algol 6, pass 2, page ...10... d15:al w0 x2 ; prepare cat scan: jl. w3 e3. ; output(endpass); am. (f1.) ; al w0 -4 ; al. w2 g3. ; ws w0 4 ; as w0 -2 ; wa. w0 f14. ; jl. w3 e3. ; output(last identifier); al. w3 f8. ; w3:=<:catalog:>addr; jd 1<11+6 ; initialise area process; sn w0 3 ; if result = 1 then jd 1<11+52 ; create area process; se w0 0 ; if result <> 0 then jl. d13. ; goto transport error; rl. w1 f1. ; al w1 x1+2 ; first storage addr:= rs. w1 f9.+2 ; main top addr+2; rl. w1 f2. ; aux cat addr:= rs. w1 f18. ; aux top addr; al w1 x1-8 ; last storage addr:= rs. w1 f9.+4 ; aux top addr-8; ws. w1 f9.+2 ; if last storage addr sh w1 509 ; - first storage addr < 510 then jl. d12. ; goto stack overflow; al. w2 f23. ; output context externals: al. w3 f27. ; output(init context and jl. w1 d19. ; context zone procs); d4: al. w1 f9. ; begin drum transport: al. w3 f8. ; w1:=message addr; w3:=name addr; jd 1<11+16 ; send message; al. w1 f15. ; w1:=answer addr; w2:=buffer addr; jd 1<11+18 ; wait answer; sn w0 2 ; if message rejcted jl. d4. ; then goto begin drum transport; se w0 1 ; if -,normal answer jl. d13. ; then goto transport error; bz. w0 f15. ; sn w0 0 ; if status word=0 jl. d5. ; then goto set seg transported; so w0 1<6 ; if -,end of area jl. d13. ; then goto transport error; al. w3 f8. ; w3:=<:catalog:>addr; jd 1<11+64 ; remove process; rs. w0 e9. ; pass inf01:=result; jl. d14. ; goto end pass; d5: rl. w1 f9.+2 ; set seg transported: rs. w1 f6. ; cat entry addr:=first storage addr; rl. w0 f15.+2 ; sn w0 0 ; if bytes transferred = 0 jl. d4. ; then goto repeat; ls w0 -9 ; no. segments transported:= hs. w0 f12. ; no. bytes transported//512; al w0 0 ; no. entries processed:= rs. w0 f11. ; no. segments processed:=0; \f ;rc 1977.11.02 algol 6, pass 2, page ...11... d6: rl w0 x1 ; unpack cat entry: sn w0 -1 ; if namekey-catkey=-1 jl. d9. ; then goto next cat entry; bz w0 x1+30 ; se w0 4 ; if content<>4 sl w0 32 ; and content<32 jl. 4 ; jl. d9. ; then goto next cat entry; rl w0 x1+6 ; w0:=first word cat name; al w3 0 ; w3:=0; ld w0 8 ; w3:=first char; rs. w0 f7. ; cat entry name part:= sl w3 97 ; first cat name word shift 8; al w3 x3-61 ; w3:=2*(if first cat char>96 al w3 x3-35 ; then first cat char-96 ls w3 1 ; else first cat char-35); rl. w2 x3+g0. ; if letter(w3)=0 then got next cat entry; sn w2 0 ; jl. d9. ; hs. w3 f10. ; first char:=cat char; al w3 0 ; main(top-1):=main(top):=0; am. (f1.) ; rs w3 -2 ; rs. w3 (f1.) ; jl. w3 d7. ; next cat char; jl. w3 d7. ; next cat char; am. (f6.) ; rl w2 8 ; w2:=second word cat name; jl. w3 a3. ; next cat char; jl. w3 d7. ; next cat char; jl. w3 d7. ; next cat char; am. (f6.) ; rl w2 10 ; w2:=third word cat name; jl. w3 a3. ; next cat char; jl. w3 d7. ; next cat char; jl. w3 d7. ; next cat char; am. (f6.) ; rl w2 12 ; w2:=fourth word cat name; jl. w3 a3. ; next cat char; al. w3 d8. ; return:=end name; next cat char; d7: rl. w2 f7. ; procedure next cat char; load name part; a3: sn w2 0 ; if name part=0 jl. d8. ; then goto end name; al w1 0 ; ld w2 8 ; cat entry name part:= rs. w2 f7. ; cat entry name part shift 8; al w2 -96 ; char:=(if cat char>96 sh w1 93 ; then cat char-96 al w2 -35 ; else if cat char>64 sh w1 57 ; then cat char-36 al w2 11 ; else cat char+11); wa w1 4 ; hs. w1 f10.+1 ; jl. d10. ; pack char; \f ;rc 1977.11.02 algol 6, pass 2, page ...12... d8: jl. w3 d11. ; end name: search if identifier found jl. d16. ; then goto cat entry found; d9: rl. w1 f1. ; next cat entry: current word addr:= rs. w1 f0. ; main top addr; bz. w2 f11. ; no.entries processed:= al w2 x2+1 ; no.entries processed+1; sn w2 15 ; if no. entries processed<15 jl. a5. ; then hs. w2 f11. ; begin rl. w1 f6. ; current cat entry addr:= al w1 x1+34 ; next cat entry addr; rs. w1 f6. ; goto unpack cat entry; jl. d6. ; end a5: bz. w2 f11.+1 ; else al w2 x2+1 ; begin no.segments processed:= bz. w1 f12. ; no.segments processed+1; sn w2 x1 ; if no.segments processed<no.seg.for transport jl. a6. ; then hs. w2 f11.+1 ; begin al w0 0 ; no.entries processed:=0; hs. w0 f11. ; current cat entry addr:= rl. w1 f6. ; next segment head; al w1 x1+36 ; rs. w1 f6. ; goto unpack cat entry; jl. d6. ; end a6: rl. w1 f9.+6 ; else ba. w1 f12. ; begin segment no.:=segment no. rs. w1 f9.+6 ; +no.segments for transport; jl. d4. ; goto begin drum transport end end; d16: al w0 x2 ; cat entry found: c.e77<3 ; if monitor 3 then begin am. (f6.) ; w2w3:= interval.entry; dl w3 +4 ; if interval.entry does not contain sh. w2 (f19.) ; min interval then sh. w3 (f20.) ; goto next cat entry; jl. d9. ; end; z. al. w2 g3. ; ws w0 4 ; ls w0 -2 ; wa. w0 f14. ; jl. w3 e3. ; output(found identifier no.); al w1 2 ; al w2 13 ; a4: am. (f6.) ; comment: output of name, specs; bz w0 x1 ; for w1:= 2 step 1 until 13, jl. w3 e3. ; 26 step 1 until 29 al w1 x1+1 ; sh w1 x2 ; jl. a4. ; do output(byte(cat entry addr+w1)); se w2 13 ; jl. d9. ; goto next cat entry; al w2 29 ; al w1 26 ; jl. a4. ; \f ;rc 1977.11.02 algol 6, pass 2, page ...13... ;procedure pack char multiplies the current word by 69, adds char, ;and restores the result in the main table if there is space in a ;main word, otherwise an aux word. d10: rl. w1 (f0.) ; procedure pack char; wm. w1 f13. ; current word:=current word*69+char; ba. w1 f10.+1 ; sx 1 ; if no overflow ba. w0 1 ; then sh w1 -1 ; begin jl. a7. ; current link:=0; se w0 0 ; jl. a7. ; ds. w1 (f0.) ; return; jl x3 ; end a7: ld w1 1 ; else begin ls w1 -1 ; current aux word(bit23):= rl. w2 f3. ; current word(bit0); al w2 x2-2 ; current aux addr:=current aux addr-2; sh. w2 (f1.) ; if current aux addr<=main top addr jl. d12. ; then goto stack overflow; rs. w2 f3. ; current word addr:=current aux addr; rs. w2 f0. ; current aux word+2:=current word; ds w1 x2+2 ; return; jl x3 ; end; ;procedure search first marks the search word at (bit0). the search ;then proceeds through the main table for linking and then through ;either the main or aux table looking for an identifier equal to the ;last packed identifier. d11: rl. w1 f0. ; procedure search; rl w2 x1 ; search word:=search word or 1(bit0); lo. w2 f17. ; rs w2 x1 ; rs. w2 f4. ; al. w2 g0. ; ba. w2 f10. ; w0:=letter table(first char); rl w0 x2 ; se. w1 (f1.) ; if current word<>main top addr jl. a9. ; then goto aux search; a8: sn w0 0 ; check link: if link=0 jl x3+2 ; then not found return; rl w2 0 ; else if main(link)=search word dl w1 x2 ; then found return se. w1 (f4.) ; jl. a8. ; else goto check link; jl x3 ; \f ;rc 1977.11.02 algol 6, pass 2, page ...14... a11: rl. w0 f3. ; load link: w0:=main link; rl. w2 f5. ; w2:=aux main word addr a9: sn w0 0 ; aux search: jl. a14. ; if link<>0 rl w2 0 ; then dl w1 x2 ; begin sz. w1 (f17.) ; if main(link(bit0))=1 jl. a9. ; then goto aux search; rs. w0 f3. ; main link:=link; rs. w2 f5. ; aux main word addr:=last link; rl. w2 f2. ; for w2:=aux top addr step -1 a12: rl w0 x1 ; do for w1:=main(link) step -1 rs. w0 f4. ; while aux(w1(bit0))=0 rl w0 x2 ; do if aux(w1)<>aux(w2) se. w0 (f4.) ; then goto load link jl. a11. ; else sz. w0 (f17.) ; begin jl. a13. ; current aux addr:=aux top addr; al w1 x1-2 ; found return; al w2 x2-2 ; end; jl. a12. ; a13: rl. w2 f5. ; rl. w1 f2. ; rs. w1 f3. ; jl x3 ; a14: rl. w1 f2. ; else rs. w1 (f1.) ; begin rl. w1 f0. ; main(top):=aux top addr; al w1 x1-2 ; aux top addr:=current aux addr:= sh. w1 (f1.) ; current word addr-2; jl. d12. ; if aux top addr<=main top addr sn. w3 d8.+2 ; then goto stack overflow; rl. w1 f18. ; if catalog search then rs. w1 f2. ; auxtop addr:= current auxaddr:= aux cat addr; rs. w1 f3. ; not found return; jl x3+2 ; end; d12: al. w1 e10. ; stack overflow: w1:=<:stack:>addr; jl. e5. ; terminate pass; d13: al. w1 f8. ; transport error: w1:=<:catalog:>addr; jl. e5. ; terminate pass; d14: al w0 0 ; end pass: jl. w3 e3. ; output(0); jl. e7. ; call next pass; ;letter table; g0=k-2 0 ; r. 59 w. g1=(:k-j0:) e30=e30+g1 g3=k g2=k+2 i. ; idlist e. m. jz 1985.03.08 algol 8, pass 2 \f ▶EOF◀