|
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: 70656 (0x11400) Types: TextFile Names: »algpass03tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »algpass03tx «
; jz.fgs.1987.09.10 algol 8, pass 0, page ...1... ; b. h99 ; fp names; this block head must always ; w. ; be loaded from somewhere, before pass 0 text; b. e107 ; begin block algol 6 translator; w. ; d. p.<:fpnames:> l. ;********************************************************** ;* * ;* compiler version, release and date (e103, e104, e105) * ;* * ;* should be updated each time the compiler is updated * ;* * ;********************************************************** e15 = 0 ; special testoutput; e18 = h35 ; fp console message; e22 = h20 ; fp current input zone descriptor (fp = file processor); e25 = h19 ; fp current program zone descriptor; e28 = h22 ; fp input block; e31 = h27 ; fp connect input; e32 = h7 ; fp end program; e33 = h26 ; fp outchar; e34 = h31 ; fp outtext; e35 = h32 ; fp outinteger; e37 = h65 ; end fp with break; e39 = 512 ; segment length of object program; e43 = h21 ; fp current output zone descriptor; e44 = h29 ; fp stack zone; e45 = h30 ; fp unstack zone; e48 = h0 ; fp start buffer and share description; e49 = h1 ; fp start process description; e50 = h2 ; fp start status handling description; e51 = h3 ; fp start record description of zone; e52 = h5 ; fp length of zone descriptor; e53 = h6 ; fp length of share descriptor; e54 = h4 ; fp start of users parameters; - pass 1 expects h4 to link h3 nb nb e55 = h54 ; fp lookup area e57 = h10 ; fp interrupt address; e58 = h17 ; fp parent description; \f ; fgs 1986.02.18 algol 8, pass 0, page ...1a... c. h57<2 ; if system2 then begin e60 = h52 ; fp first note; e61 = h53 ; fp last note + 22; z. ; end system2 c. h57<3 ; if system3 then e61 = h53 ; fp size of available area in front of zone buffer z. e63 = h8 ; fp current command; e65 = h15 ; fp console description address; e66 = h16 ; fp own process description address; e67 = h79 ; fp terminate zone; e68 = h55 ; fp base program; e70 = h51 ; fp mode bits e77 = h57 ; monitor version (may be 2 or 3) e78 = h28 ; fp connect output e80 =-12<1+0; standard size and -document for workarea (see fp connect) ; (4 segm for cur.in, 4 for copy, 4 for listing) e81 = -4<1+0; - - - - - sortarea - - - e84 = h33 ; fp outend e86 = -1<1+0; room left for error messages after pass12 e95 = h95 ; fp close up text output e101= 4 ; no of bytes for anonym. bytes in blocks e103 = 2 ; version of algol compiler e104 = 3<12 + 0 ; release of algol compiler e105 = 1987<12 + 1001 ; date of algol compiler e106 = 1 ; smallest version number in external accepted by pass9 c. h57<2 ; if system2 then begin e99 = h10+14 ; fp break routine e100= 14 ; bytes i reg.dump area z. ; end else c. h57<3 ; if system 3 then begin e99 = h10+h76; fp break routine e100= h76 ; bytes in reg.dump area z. ; end system 3 m. algol 6, pass 0 redefine e-names t. \f ; fgs 1986.02.18 algol 8, pass 0, page ...1b... s. c76, d38, f31, h5, j3 ; begin pass 0 segment; w. ; k = 10000+e68 ; k has this value to provoke slang test ; of relative byte addresses; e38: h5 ; length of entire pass 0 (in bytes), translator length; 0 ; dummy word (slang) jl. d22. ; entry pass 0: goto initialize translator; e103 ; version of this compiler \f ; fgs 1985.10.25 algol 6, pass 0, page 2 b. a15, b21 ; begin block: next pass, print char, print text, print integer; w. ; b5:f28:0 ; pass no; b4: 1<21 ; interrupt mask (pass 0); c7: rl. w0 b4. ; next pass: w0 := interrupt mask(pass 0); al. w3 d29. ; w3 := interrupt address (pass 0); jd 1<11 ; set interrupt; rl. w0 b5. ; sn. w0 (d7.) ; if pass no = stop pass then jl. d0. ; goto end translation; am. (d24.) ; bz w0 e49+1 ; se w0 4 ; if kind of translator medium <> 4 then jl. a2. ; goto next pass from tape; rl. w1 e38. ; next pass from backing store: ld w2 -9 ; segment := rs. w1 (d21.) ; translator length//512; ls w2 -15 ; from core := translator length mod 512; al. w1 c0. ; first core := first free core; rs. w1 (d27.) ; al w1 x1+510 ; last core := first core + 510; rs. w1 (d23.) ; rl. w1 d24. ; w1 := program zone descriptor address; jl. w3 (d13.) ; input block; comment: fp entry; al. w1 c0. ; to core := first free core; rl. w0 e38. ; wa. w0 x2+c0. ; translator length := rs. w0 e38. ; translator length + pass length; rl. w3 x2+c0. ; remaining := pass length; \f ; rc 28.10.1975 algol 6, pass 0, page 3 a0: sn w3 0 ; move words: jl. a3. ; if remaining = 0 then goto prepare pass; sn w2 512 ; if from core = 512 then jl. a1. ; goto transfer segments; rl. w0 x2+c0. ; word(to core) := rs w0 x1 ; word(first free core + from core); al w1 x1+2 ; to core := to core + 2; al w2 x2+2 ; from core := from core + 2; al w3 x3-2 ; remaining := remaining - 2; jl. a0. ; goto move words; a1: al w2 x3-1 ; transfer segments: ls w2 -9 ; ls w2 9 ; first core := to core; al w2 x2+510 ; last core := first core + 510 + wa w2 2 ; (remaining - 1)//512*512; rs. w1 (d27.) ; sl. w2 (f26.) ; if last core >= last work for pass then jl. a12. ; alarm(<:pass trouble:>); rs. w2 (d23.) ; rl. w1 d24. ; w1 := program zone descriptor address; jl. w3 (d13.) ; input block; comment: fp entry; jl. a3. ; goto prepare pass; a12: jl. w3 d8. ; alarm pass trouble: al. w3 d14. ; print linehead; al w2 1 ; set return(break); w2 := 1; jl. w1 c13. ; writetext(<:pass trouble:>); <:pass trouble<0>:>; a2: al. w0 c0. ; next pass from tape: rs. w0 (d27.) ; first core := first free core; rl. w0 f26. ; rs. w0 (d23.) ; last core := last work for pass ; rl. w1 d24. ; w1 := program zone descriptor address; jl. w3 (d13.) ; input block; comment: fp entry; d28: am. (c0.) ; test pass length; last of pass := al. w3 d11. ; first free core + pass length - 1; se w3 (x1+e51+2) ; if last of pass <> last byte(record) then jl. a12. ; goto alarm pass trouble; a3: bz. w0 d6. ; prepare pass: ls w0 -1 ; pass no := rs. w0 b5. ; bits(12,22,second word of pass); se w0 11 ; if pass no = 11 then jl. a13. ; begin jl. c7. ; end; a13: se w0 12 ; if pass no = 12 then jl. a15. ; begin rl. w2 c71. ; if connection mask = 0 then sn w2 0 ; goto next pass; jl. c7. ; end; a15: sh w0 15 ; if pass no > 15 or pass no < 1 then sh w0 0 ; goto alarm pass trouble; jl. a12. ; \f ; fgs 1985.11.04 algol 6, pass 0, page 4 al. w2 c0. ; pass entry := bz. w1 d10. ; first free core + bits(0,11,second word of pass); wa w2 2 ; comment: the address is calculated in rs. w2 b11. ; this funny way to give a 24-bits ; not negative number; sn w0 1 ; if passno = 1 then jl. a9. ; goto update; rl. w1 f1. ; unused outbuf := ws. w1 f0. ; last outaddress - rs. w1 b8. ; current outaddress ; c. (:e15 a. 1<0:) - 1 ; if spec testoutput pass0 then jl. w1 d38. ; begin rl. w0 b8. ; write (out, curr-, last in and out); jl. w2 d19. ; write8 (out, unused outbuf); z. ; end; jl. w3 c8. ; output segment; <*send the last segment*> rl. w3 f20. ; saved outsegment := rs. w3 b9. ; segment (output descr); rl. w3 c20. ; jl. w2 c59. ; wait segment (output); <*check it*> rl. w3 f13. ; saved insegment := es. w3 h0. ; segment (input descr) - rs. w3 b10. ; increment; rl. w1 d6. ; if change direction then ac. w0 (h0.) ; increment := sz w1 1 ; - increment; hs. w0 h0. ; segment (input descr) := rl. w0 b9. ; if change direction then so w1 1 ; (saved outsegment rl. w0 f13. ; else es. w0 h0. ; segment (input descr)) - rs. w0 f13. ; increment ; jl. w3 d9. ; input segment; <*check and send for the segment*> rl. w1 f4. ; used segments := al w1 x1+1 ; used segments + rs. w1 f4. ; 1 ; rl. w1 d6. ; sz w1 1 ; if change direction then jl. a4. ; goto change direction; rl. w0 f3. ; current inaddress := rs. w0 f2. ; last inaddress; <*check it at next inbyte*> jl. a8. ; goto print information; a4: ; change direction: jl. w3 d9. ; input segment; <*check in and send for the next*> rl. w0 f2. ; current in address := ws. w0 b8. ; current in address - es. w0 h0. ; unused outbuf - rs. w0 f2. ; increment ; dl. w1 f1. ; w0 := current outaddress; rs. w1 f0. ; current outaddress := last outaddress; rs. w0 f1. ; last outaddress := w0; rl. w0 b10. ; segment (output descr) := rs. w0 f20. ; saved insegment; jl. a8. ; goto print information; b8: 0 ; unused outbuf ; b9: 0 ; saved outsegment; b10: 0 ; saved insegment ; b11: 0 ; pass entry ; \f ; jz.fgs 1986.02.18 algol 6, pass 0, page ...5... e69: ; d15: al w2 1 ; backing store fault: ls w2 (0) ; sn w0 1 ; w2 := 1 shift result; wa w2 x1 ; if result = 1 then w2 := w2 + statusword; d14: rs. w2 f9. ; break: sorry := w2; rs. w3 b12. ; save(address of areaname); d18: al w2 0 ; finis translation : rx. w2 f24. ; w2 := message buffer address(byte input); al. w1 d17. ; w1 := answer address; se w2 0 ; if w2 <> 0 then jd 1<11+18 ; wait answer; al w2 0 ; rx. w2 f25. ; w2 := message buffer address(byte output); se w2 0 ; if w2 <> 0 then jd 1<11+18 ; wait answer; rl. w2 f9. ; return fp: al. w1 b21. ; text := addr(<:algol end:>); rl. w0 c17. ; w0 := modebits; sn w2 0 ; if -,sorry then jl. a14. ; goto ok; al. w3 f23. ; w3 := address(name of output area); c. e77<3 ; if system 3 then begin al. w1 b2. ; w1 := tail address; jd 1<11+42 ; lookup entry (work area); rl. w1 f4. ; tail(1) := used segments; rs. w1 b2. ; al. w1 b2. ; w1 := tail address; jd 1<11+44 ; change entry (work area); z. ; end system 3; al. w1 b13. ; text := addr(<:***algol sorry:>); a14: rl. w0 e29. ; ok: w0 := modebits; sz w0 1<7 ; if work area created by pass 0 jd 1<11+48 ; then remove entry; rl. w0 e29. jl. w3 c13. ; writetext(string text); c.e77<3 ; if system 3 then sz w0 1<10 ; if warning then al w2 x2+2 ; add warning bit; z. c.e77<2 ; if system 2 then al w3 -1-1<6 ; clear fpwarningbit; la. w3 e70-k+e38-e68; sz w0 1<10 ; if warning then al w3 x3+1<6 ; fpwarningbit := 1; rs. w3 e70-k+e38-e68; z. \f ; fgs 1985.12.18 algol 6,pass 0, page ...5a... al w0 32 ; writesp; jl. w3 c12. ; rl. w0 f4. ; write(<<d>, used segments); jl. w3 c14. ; 32<12 + 1 ; al. w3 f23. ; w3 := addr(name of output area); jd 1<11+64 ; remove process(name of byte input area); al w0 10 ; jl. w3 c12. ; writechar(<new line>); rl. w1 b12. ; w1 := saved address of areaname; al w3 x1 ; se w3 0 ; if addr(saved area name) <> 0 then jd 1<11+64 ; remove process(saved area); am. (c23.) ; b1 = k + 1; end program ; jl e32 ; goto fpbase + end program; e82: b12: 0 ; saved name address; b21: <:<10>algol end<0>:>; b13: <:<10>***algol sorry<0>:>; b2: 0, r.10 ; lookup area for change of work area \f ; fgs 1987.09.11 algol 8, pass 0, page ...5b... d29: <:algolix<0>:> ; interrupt address: 0, r.4 ; initially name to lookup to ; decide ix default option; c.e100-16 jl. 2 , r.(:d29.+e100+2:)>1 z. al. w2 d29. ; interrupt: w2 := interrupt address; c36: al w0 0 ; interupt service: rl. w3 c23. ; set interupt al w3 x3+e57 ; (0,fp-interupt service); jd 1<11+0 ; w3:=fpbase+ al w1 x2+e100-1 ; fp-interupt; a6: rl w0 x2 ; move next: w0 := word(w2); rs w0 x3 ; word(w1+fp interrupt address) := w0; al w3 x3+2 ; w1 := w1+2; al w2 x2+2 ; w2 := w2+2; sh w2 x1 ; if w1 <= interrupt address + (breaksize-1) then jl. a6. ; goto move next; c. e77<3 ; if system3 then begin rl. w3 c23. ; w3 := fp base; am (x3+e57+10); if break instruction = ks bl w0 -2 ; then enter fp break routine h. sn w0, ks w. ; comment if fp is not present jl x3+e99 ; a break will happen z. al w1 e99 ; hs. w1 b1. ; end program := fp break; jl. w3 d5. ; print line; al w2 1 ; w2 := 1; al w3 0 ; addr(area name) := 0; jl. d14. ; goto break; \f ; fgs 1985.10.30 algol 6, pass 0, page ...6... d0: al. w0 d18. ; end translation: rs. w0 b11. ; pass entry := finis translation; a8: rl. w0 c17. ; print information: am. (b5.) ; se w3 x3 ; if pass no = 0 so w0 1<2 ; or -,survey then jl. a9. ; goto update; jl. w3 d8. ; print linehead; rl. w0 f10. ; jl. w2 d19. ; write(8,sum 0); rl. w0 f11. ; jl. w2 d19. ; write(8,sum 1); rl. w0 f4. ; jl. w2 d20. ; write(4,used segments); rl. w0 c9. ; jl. w2 d20. ; write(4, inf 1); rl. w0 f16. ; jl. w2 d20. ; write(4,inf 2); a9: ; update: c. (:e15 a. 1<0:) - 1 ; if spec testoutput pass0 then jl. w1 d38. ; write (out, curr-, last in and out); z. ; am. (c23.) ; jl w3 e84-6 ; outend; rl. w0 b14. ; rl. w1 b5. ; outside pass interval := false; rs. w1 f31. ; pass := pass no; dl. w3 c18. ; sl w1 x2 ; if pass no < lower pass no sl w1 x3+1 ; or pass no > upper pass no rl. w0 b15. ; then outside pass interval := true; d3: rs. w0 j1. ; comment: see carret; al w0 1 ; w0 := 1; bl. w3 h0. ; rl. w2 d6. ; if backward pass then se w3 -1 ; begin jl. a11. ; w0 := old linecounter; rl. w0 b16. ; if change direction then sz w2 1 ; w0 := linecounter rl. w0 f8. ; end; a11: rs. w0 b16. ; old linecounter := w0; bs. w0 h0. ; w0 := w0 - increment; rs. w0 f8. ; linecounter := w0; al w0 0 ; rs. w0 f14. ; linecounter 1 := 0; rs. w0 c9. ; inf 1 := 0; rs. w0 f16. ; inf 2 := 0; al w0 -1-1<5 ; la. w0 c17. ; rs. w0 c17. ; testoutput := false; jl. w3 c1. ; carret; comment: to test lineinterval; rl. w0 f0. ; bs. w0 h0. ; current outaddress := rs. w0 f0. ; current outaddress - increment; jl. (b11.) ; goto word(pass entry); b14: jl. h1 ; outside pass interval = false; b15: rx. w1 h2 ; outside pass interval = true; b16: 0 ; old linecounter; \f ; rc 25.3.1969 algol 6, pass 0, page 7 d19: am 4 ; write(8,w0): d20: al w1 4 ; write(4,w0): hs. w1 a10. ; set positions in layout; rx. w0 b17. ; swap(w0,space); jl. w3 c12. ; writechar; rx. w0 b17. ; swap(w0,space); jl. w3 c14. ; writeinteger; a10 = k + 1 ; digits ; 32<12 ; jl x2 ; return; b17: 32 ; space ; c12: ds. w1 b18. ; printchar: ds. w3 b19. ; save(w0,w1,w2,w3); rl w2 0 ; w2 := w0; am. (c23.) ; jl w3 e33-2 ; outchar; comment: fp current output; dl. w1 b18. ; dl. w3 b19. ; restore(w0,w1,w2,w3); jl x3 ; return; c13: ds. w1 b18. ; print text: ds. w3 b19. ; save(w0,w1,w2,w3); al w0 x1 ; w0 := w1; am. (c23.) ; jl w3 e34-2 ; outtext; comment fp current output; dl. w1 b18. ; dl. w3 b19. ; restore(w0,w1,w2,w3); jl x3 ; return; c14: ds. w1 b18. ; print integer: ds. w3 b19. ; save(w0,w1,w2,w3); rl w2 x3 ; rs. w2 b20. ; layout := word(return); am. (c23.) ; jl w3 e35-2 ; outinteger; comment fp current output; b20: 0 ; layout ; dl. w1 b18. ; dl. w3 b19. ; restore(w0,w1,w2,w3); jl x3+2 ; return; 0 ; saved w0 ; b18: 0 ; saved w1 ; 0 ; saved w2 ; b19: 0 ; saved w3 ; e. ; end block: next pass, print char, print text, print integer; \f ; rc 8.4.1969 algol 6, pass 0, page 8 b. a1, b12 ; begin block: test line, byte sums, w. ; print linehead, print w0, print line; d1: ds. w3 b3. ; test line: rx. w0 c17. ; save(w2,w3); lo. w0 b1. ; testoutput := true; dl. w3 c19. ; comment: carret sets w1 = linecounter; sl w1 x2 ; if linecounter < lower line no sl w1 x3+1 ; or linecounter > upper line no bs. w0 b0. ; then testoutput := false; rx. w0 c17. ; comment: testoutput = modebit(18); rl. w2 b2. ; restore(w2); rx. w1 f8. ; swap(linecounter,w1); comment see j1; jl. (b3.) ; return; d2: ds. w0 b3. ; byte sums: bz w3 1 ; am. (f10.) ; comment: the instruction al w3 x3 al w3 x3 ; is used to avoid integer overflow; rs. w3 f10. ; sum 0 := sum 0 + right(w0); am. (f11.) ; sum 1 := sum 0 + sum 1; al w3 x3 ; rs. w3 f11. ; rl. w0 b3. ; restore(w0); rl. w3 c17. ; b0 = k+1 ; 1<5 ; sz w3 1<5 ; if testoutput then jl. w3 c16. ; print w0; rl. w3 b2. ; restore(w3); rx. w2 f0. ; swap(current outaddress,w2); jl. d16. ; goto test outaddress; b1: 1<5 ; b2: 0 ; saved w b3: 0 ; saved w d8: ds. w1 b4. ; print linehead: rs. w3 b5. ; save(w0,w1,w3); al w0 10 ; rs. w0 f15. ; printcount := 10; jl. w3 c12. ; writechar(<new line>); al. w1 b10. ; w1 := address(<: :>); rl. w0 f31. ; sh w0 -1 ; if pass no > -1 then jl. a0. ; begin jl. w3 c14. ; writeinteger(<:dd:>,pass no); 32<12 + 2 ; w1 := address(<:. :>) al. w1 f12. ; end; a0: jl. w3 c13. ; writetext; al w0 -1 ; pass no := -1; rs. w0 f31. ; dl. w1 b4. ; restore(w0,w1); jl. (b5.) ; return; 0 ; saved w0 ; b4: 0 ; saved w1 ; b5: 0 ; saved w3 ; b10: <: :> ; f12: <:. :> ; f10: 0 ; sum 0 ; f11: 0 ; sum 1 ; f31: 0 ; pass ; \f ; rc 24.3.1969 algol 6, pass 0, page 9 c16: ds. w0 b7. ; print w0: rl. w3 f8. ; save(w0,w3); se. w3 (f14.) ; if linecounter <> linecounter 1 then jl. w3 d5. ; print line; rl. w3 f15. ; al w3 x3+1 ; printcount := printcount + 1; sh w3 9 ; if printcount > 9 then jl. a1. ; begin jl. w3 d8. ; print linehead; al w3 0 ; printcount := 0; a1: rs. w3 f15. ; end; bz w0 1 ; byte := right(w0); jl. w3 c14. ; writeinteger(<:ddddd:>,w0); 32<12+5 ; rl. w0 b7. ; restore(w0); jl. (b6.) ; return; b6: 0 ; saved w3 ; b7: 0 ; saved w0 ; d5: rs. w3 b9. ; print line: rs. w1 b8. ; save(w1,w3); jl. w3 d8. ; print linehead; al. w1 b11. ; jl. w3 c13. ; writetext(<:line:>); jl. w3 c27. ; print linecount; al. w1 b12. ; jl. w3 c13. ; writetext(<:<32><32>:>); rl. w3 f8. ; rs. w3 f14. ; linecounter 1 := linecounter; rl. w1 b8. ; restore(w1); jl. (b9.) ; return; b8: 0 ; saved w1 ; b9: 0 ; saved w3 ; b12: <:<32><32>:> ; f14: 0 ; linecounter 1; b11: <:line<0>:> ; e. ; end block: test line, bytesums, print linehead, printw0, print line; \f ; fgs 1985.10.25 algol 6, pass 0, page 10 ; procedure wait segment(i/o description); ; if message buffer address = 0, the function is empty; otherwise ; a wait answer is performed, defined by message buffer address, ; segment is increased by increment and (first core,last core) and ; (other first core, other last core) are exchanged; ; call: w3 := description address; jl. w2 d12. ; ; exit: all registers unchanged; b. a3, b0 ; begin block: wait segment; w. ; c59: ; d12: am (x3+22) ; wait segment: sn w3 x3 ; if message buffer address = 0 then jl x2 ; return; ds. w1 b0. ; save(w0,w1); rx w2 x3+22 ; swap(w2,message buffer address); a1: al. w1 d17. ; repeat: w1 := answer address; jd 1<11+18 ; wait answer; al w2 0 ; w2 := 0; sn w2 (x1) ; if status word <> 0 se w0 1 ; or result <> 1 then jl. a0. ; goto bad answer; c. (:e15 a. 1<0:) - 1 ; if special test output pass0 then b. a1 ; begin w. ; rs. w1 a1. ; save w1; jl. w1 d37. ; write pass0 testoutput (<:wait:>); jl. a0. ; continue; <:<10> wait <0>:> ; a0: rl. w1 a1. ; restore w1; jl. a3. ; continue; a1: 0 ; saved w1 e. ; end block testoutput; z. a3: am (x1+2) ; if bytes transferred = 0 then se w3 x3 ; begin jl. a2. ; w1 := message address; al w1 x3+10 ; send message; jd 1<11+16 ; goto repeat; jl. a1. ; end; a2: rx w2 x3+22 ; swap(w2,message buffer address); dl w1 x3+20 ; rx w0 x3+12 ; swap(first core, other first core); rx w1 x3+14 ; swap(last core, other last core); ds w1 x3+20 ; rl w0 x3+16 ; ba. w0 h0. ; segment := segment + increment; sh w0 -1 ; if segment <= -1 then wa. w0 f5. ; segment := segment + available segments; sl. w0 (f5.) ; if segment >= available segments then ws. w0 f5. ; segment := segment - available segments; rs w0 x3+16 ; dl. w1 b0. ; restore(w0,w1); jl x2 ; return; a0: rs w2 x3+22 ; bad answer: message buffer address := 0; jl. d15. ; goto backing store fault; d17: 0,0,0,0,0,0,0,0 ; answer; 0 ; saved w0 ; b0: 0 ; saved w1 ; e. ; end wait segment ; \f ; fgs 1985.10.25 algol 6, pass 0, page 11 b. a2, b3 ; begin block: next segment; w. ; d4: ds. w2 b2. ; next segment: save(w1,w2); rs w3 x2+10 ; last address := w3; rl w3 x2+12 ; w3 := address of i/o description; rl. w2 f4. ; wa w2 x3+24 ; used segments := rs. w2 f4. ; used segments + segment increment; sh. w2 (f5.) ; if used segments > available segments then jl. a0. ; begin comment: work area exceeded; al. w1 b0. ; w1 := address of alarm text; jl. c5. ; alarm(<:program too big:>) ; end; a0: jl. w2 d12. ; wait segment; al w1 x3+10 ; w1 := message address; jd 1<11+16 ; send message; rs w2 x3+22 ; address of message buffer := w2; c. (:e15 a. 1<0:) - 1 ; if special testoutput pass 0 then b. a1 ; begin w. ; rs. w1 a1. ; save w1; jl. w1 d37. ; write test (<:send:>); jl. a0. ; continue; <:<10> send <0>:> ; a0: rl. w1 a1. ; restore w1; jl. a2. ; continue; a1: 0 ; saved w1; e. ; end; z. ; a2: bl. w1 h0. ; w2 := other first core; dl w3 x3+20 ; w3 := other last core; lo. w3 b3. ; w3 := w3 or boolean 1 ; comment: odd address; sn w1 -1 ; if increment = -1 then rx w2 6 ; swap(w2,w3); comment: backward pass; am. (b2.) ; rx w3 10 ; swap(w3,last address); rl. w1 b1. ; restore(w1); am. (b2.) ; return address := return address + 2; jl 2 ; return; b0: <:program too big<0>:> ; b1: 0 ; saved w1 ; b2: 0 ; saved w2 ; b3: 1 ; boolean 1 ; e. ; end block: next segment; \f ; fgs 1985.10.30 algol 8, pass 0, page ...11a... c. (:e15 a. 1<0:) - 1 ; if special testoutput pass0 then b. a7 ; begin block testoutput w. ; d37: ds. w1 a1. ; procedure write (out, segment, first, last); ds. w3 a3. ; begin al w1 x1+2 ; w0 := addr text from call; jl. w3 c13. ; outtext (out, text); am. (a3.) ; zl w0 +10 ; al. w1 a4. ; se w0 3 ; if input then al. w1 a5. ; outtext (out, <:in:> jl. w3 c13. ; else am. (a3.) ; outtext (out, <:out:>); rl w0 +16 ; jl. w3 c14. ; outinteger (out, segment); 32<12+5 ; am. (a3.) ; rl w0 +12 ; jl. w3 c14. ; outinteger (out, first); 32<12+10 ; am. (a3.) ; rl w0 +14 ; jl. w3 c14. ; outinteger (out, last); 32<12+10 ; dl. w1 a1. ; dl. w3 a3. ; jl x1 ; end procedure write (out, segment, first, last); d38: ds. w1 a1. ; procedure write (out, curr-, last- in and out); ds. w3 a3. ; save registers; al. w1 a6. ; jl. w3 c13. ; write (out, text1); rl. w0 f2. ; jl. w2 d19. ; write8 (out, current in); rl. w0 f3. ; jl. w2 d19. ; write8 (out, last in); al. w1 a7. ; jl. w3 c13. ; write (out, text2); rl. w0 f0. ; jl. w2 d19. ; write8 (out, curr out); rl. w0 f1. ; jl. w2 d19. ; write8 (out, last out); dl. w1 a1. ; dl. w3 a3. ; jl x1 ; end procedure write (out, curr-, last in and out); a0: 0 ; saved w0 ; a1: 0 ; saved w1 ; a2: 0 ; saved w2 ; a3: 0 ; saved w3 ; a4: <: in <0>:> ; a5: <: out <0>:> ; a6: <:<10>curr-, last in <0>:> a7: <:<10>curr-, last out <0>:> e. ; end block testoutput z. ; \f ; fgs 1985.10.25 algol 6, pass 0, page 12 ; byte input description: f22: 0,0,0,0,0 ; 0 name and name table address; 3<12 ; 10 operation = input; f6: 0 ; 12 first core; f7: 0 ; 14 last core; f13: 1 ; 16 segment; 0 ; 18 other first core; f17: 0 ; 20 other last core; f24: 0 ; 22 message buffer address; -1 ; 24 segment increment; ; byte output description: f23: 0,0,0,0,0 ; 0 name and name table address; 5<12 ; 10 operation = output; f18: 0 ; 12 first core; f19: 0 ; 14 last core; f20: 0 ; 16 segment; 0 ; 18 other first core; f21: 0 ; 20 other last core; f25: 0 ; 22 message buffer address; 1 ; 24 segment increment; e79 = f23 ; addr of pass 0 work area name ; pass 0 key variables: d7 : 9 ; stop pass; d21: 0 ; abs address of segment (program process descriptor (16)); d27: 0 ; abs address of first core (program share descriptor ( 2)); d23: 0 ; abs address of last core (program share descriptor (10)); d24: 0 ; abs address of program zone descriptor ; \f ; fgs 1986.02.18 algol 6, pass 0, page ...13... ; the official pass 0 - entries (i.e. references using e-names) ; are found in the following (resident) part of pass 0; e71:c71: 0 ; pass12-parameters : connection mask; e72:c72: 0 ; first line; e73:c73: 0 ; last line; e74:c74: 0 ; first name line; e75:c75: 0 ; last name line; e76:c76: 0 , r.5 ; sortareaname and address; e107: <:algftnrts<0>:>; name of runtime system 0 ; name table addr b. b2 ; begin block: carret, alarm, message, repeat w. ; input byte, outbyte, inbyte, print linecount; ; procedure carret; ; the routine increases the linecounter by increment; if then ; the linecounter belongs to lineinterval and pass no belongs to ; passinterval, the boolean testoutput is set to true, otherwise ; it is set to false; ; call: jl. w3 e1. ; ; exit: w0,w1,w2 unchanged; c1: ; e1: rx. w1 f8. ; carret: ba. w1 h0. ; linecounter := j1: rx. w1 f8. ; linecounter + increment; jl x3 ; if outside passinterval then return ; else goto test line; h1 = d1 - j1 ; comment : see d3, where j1: rx. w1 f8. is modif; ; procedure message; ; the routine prints the string: <linehead>line<linecounter><text>; ; call: w1 := address of <text>; jl. w3 e4. ; ; exit: w0,w1,w2 unchanged ; ; procedure alarm; ; the routine works as message, but terminates the translation; ; call: w1 := address of <text>; jl. e5. ; c5: ; e5: al w3 1 ; alarm: rs. w3 f9. ; sorry := 1; al. w3 d0. ; set return(end translation); c4: ; e4: rs. w3 b0. ; message: save(return); jl. w3 d5. ; print line; jl. w3 c13. ; writetext; jl. (b0.) ; return; b0: 0 ; saved return ; ; procedure repeat input byte; ; the routine decreases current inaddress by increment; ; call: jl. w3 e11. ; ; exit: w0,w1,w2 unchanged; c11: ; e11: rx. w3 f2. ; repeat input byte: bs. w3 h0. ; current inaddress := rx. w3 f2. ; current inaddress - increment; jl x3 ; return; \f ; fgs.jz 1986.02.18 algol 8, pass 0, page ...14... ; procedure outbyte; ; the routine outputs the rightmost byte of w0 to work; if pass infor- ; mation (survey) is wanted, then sum and double sum of all bytes ; are calculated; if pass no belongs to pass interval and linecounter ; belongs to lineinterval, then the byte is printed also; ; call: w0 := byte to be output; jl. w3 e3. ; ; exit: w0,w1,w2 unchanged; e3: c3: ; j0: rx. w2 f0. ; outbyte: if passinf then goto byte sums ; jl. d2. ; else swap(w2,current outaddress); d16: sn. w2 (f1.) ; test outaddress: e8:c8:jl. w2 d4. ; if current outaddress = last outaddress then h0 = k+1 ; increment ; output segment: next segment; comment see below; al w2 x2+1 ; w2 := w2 + increment; hs w0 x2 ; return from next segment: byte(w2) := right(w0); rx. w2 f0. ; swap(w2,current outaddress); jl x3 ; return; f0: 0 ; e20-4 ; current outaddress; f1: 0 ; e20-2 ; last outaddress; warning: next segment uses x2+10; e20:c20:0; ; output description; warning: - - - x2+12; h3 = d2 - j0 ; ; procedure inbyte; ; the routine supplies the next byte from work; ; call: jl. w3 e2. ; ; exit: w2 = inputbyte; left(w2) = 0; w0,w1 unchanged; c2: ; e2: rl. w2 f2. ; inbyte: sn. w2 (f3.) ; if current inaddress = last inaddress then e90: d9: jl. w2 d4. ; input segment: next segment; comment: see below; ba. w2 h0. ; current inaddress := current inaddress + increment; rs. w2 f2. ; return from next segment: bz w2 x2 ; w2 := byte zeroes(current inaddress); jl x3 ; return; f2: 0 ; e21-4 ; current inaddress; f3: 0 ; e21-2 ; last inaddress; warning: next segment uses x2+10; e21:c21:0; ; input description; warning: - - - x2+12; ; procedure print linecount; ; the routine prints the integer linecount; ; call: jl. w3 e27. ; ; exit: w0,w1,w2 unchanged; e64: 10 ; bossline c27: ; e27: ds. w0 b2. ; print linecount: rl. w0 f28. ; se w0 1 ; if pass=1 then jl. c6. ; begin j2=k+1 al w0 0 ; bossline.no ; al w0 1 ; bossline.yes sn w0 0 ; jl. c10. ; if bossline.yes then rl. w0 e64. ; then write(out,bossline); jl. w3 c14. ; 32<12+6 ; c10: j3=k+1 al w0 0 ; blocks.no ; al w0 1 ; blocks.yes sn w0 0 ; jl. c6. ; if blocks.yes then rl. w0 e85. ; write(out,begincount); jl. w3 c14. ; 32<12+3 ; end; c6: rl. w0 f8. ; save(w0,w3); jl. w3 c14. ; w0 := linecounter; 32<12+6 ; writeinteger(<:ddddd:>,w0); rl. w0 b2. ; restore(w0); jl. (b1.) ; return; b1: 0 ; saved w3 ; b2: 0 ; saved w0 ; e. ; end block: carret, alarm, message, repeat input byte, ; outbyte, inbyte, print linecount; \f ; fgs 1986.02.18 algol 6, pass 0, page ...15... h2 = k - j1 ; e6: f8: 0 ; linecount; e7: jl. c7. ; end pass: goto next pass; f4: 0 ; e9-4 used segments; f5: 0 ; e9-2 available segments; e9: c9: 0 ; e9 inf 1 (pass information); f16: 0 ; e9+2 inf 2 (pass information); f26: 0 ; e9+4 last work for pass; 0 ; e9+6 contextmode(0 or 1, used by pass 1 and 2) e10: <:stack:> ; alarm text; e12: jl. c12. ; writechar: goto printchar; e13: jl. c13. ; writetext: goto printtext; e14: jl. c14. ; writeinteger: goto printinteger; e16: jl. c16. ; print byte: goto print w0; e17:c17: 1<13+1<12+1<8+1<3+1<1 ; modebits1 : fp-, connect-, index-, message.yes e29: 0<10+0<5 ; modebits2 : warning-, fortran.no 0 ; e19-6 lower pass no in passinterval; c18: 0 ; e19-4 upper pass no in passinterval; 1 ; e19-2 lower line no in lineinterval; e19:c19: 1<22 ; e19 upper line no in lineinterval; jl. d8. ; e19+2 goto print linehead; e23:c23: 0 ; fileprocessor base; e24: 0 ; fileprocessor result note; e26: jl. d0. ; terminate translation: goto end translation; e36: jl. c36. ; interrupt from passes: goto interrupt service; e40:f9: 0 ; sorry (answer to fileprocessor); e41: 1<21 ; interrupt mask (pass 7, object code); e42:f15: 0 ; printcount; e46: 0 ; start source name list (pass 1); e47: 0 ; start insert list; e56: 0<7+0<6+0<3+0<2+0<1+1<0; modechange allowed (1<7 for xref) e59: jl. c59. ; wait segment: goto wait segment; e62:d13: 0 ; abs address of entry inblock (fileprocessor entry); e83: 0 ; max no of copy params (for pass 1) e102=f11 ; double(sum1,sum2) e0 = k, c0 = k ; the current pass will be loaded here: d11 = c0 - 1 ; d10 = c0 + 2 ; d6 = c0 + 3 ; ; first free core: m. algol 6, pass 0 resident \f ; fgs 1987.09.11 algol 8, pass 0, page ...16... b. a60, b40 ; begin block: initialize translator; w. ; b0: -2 ; after use reused for result of lookup algolix (fixed ix default) b1: 0 ; top command (address of the command algol); d22: rs. w1 c23. ; initialize translator: la. w3 b0. ; fpbase := w1; rs. w3 b1. ; top command := w3 and -2; comment: even address; rl. w0 e41. ; w0 := interrupt mask (1 shift 21); al. w3 d29. ; w3 := interrupt address (pass 0); jd 1<11 ; set interrupt; am. (c23.) ; w1 := al w1 e55 ; addr fp lookup area; al. w3 d29. ; w3 := addr name (interrupt address really); jd 1<11+42 ; lookup tail; rs. w0 b0. ; fixed default := result; rl. w3 b1. ; restore w3; bz w0 x3 ; al. w2 f22. ; w2 := address of dummy name; se w0 6 ; if command algol not preceded by <=> then jl. a1. ; goto no result area; am. (c23.) al w1 e55 ; w1:=lookup area al w3 x3-8 ; jd 1<11+42 ; lookup outfil b.j2,w. se w0 0 ; jl. j1. ; if found rl w2 x1 ; and sl w2 0 ; not bs jl. j2. ; bz w2 x1+1 ; se w2 4 ; jl. a4. ; then alarm; j2: rs w0 x1+12 ; clear tail(12:18); rs w0 x1+14 rs w0 x1+16 ; rs w0 x1+18 ; jd 1<11+44 ; change entry; j1: e. al w2 x3 ; w2 := address of result area name or note; c. e77<2 ; if system 2 then begin rl w0 x2 ; w0 := first word of name; al w3 x1+e60+4 ; w3 := address of document name(first fp note); a0: sn w0 (x3-4) ; may be next note: jl. a2. ; if w0 = name of current note then ; goto get work area; al w3 x3+22 ; current note := current note + 1; w3 := w3 + 22; sh w3 x1+e61 ; if current note <= last fp note then jl. a0. ; goto may be next note; z. ; end system 2; a1: al w0 -1-1<8 ; no result area: la. w0 c17. ; rs. w0 c17. ; note supplied by fp := false; al w3 x2 ; w3 := w2; a2: al w0 x3-4 ; get work area: rs. w0 e24. ; save address(result note); al w2 x3 ; w2 := addr of name; rl w0 x2 ; w0 := first part of name; se w0 0 ; if w0 = 0 then jl. a3. ; begin al w0 1<7 ; work area created by pass 0 := true; lo. w0 c17. ; rs. w0 c17. ; c. e77<2 ; if system 2 then begin al. w1 d25. ; w1 := tail address; jd 1<11+40 ; create entry (work name); se w0 0 ; if result <> 0 then goto error; jl. a4. ; end; z. ; end system 2; \f ;rc 76.06.28 algol 6, pass 0, page ...16a... a3: al w1 0 ; comment: no zone; al w0 e80 ; comment: take standard actions for workarea; am. (c23.) ; jl w3 +e78 ; connect output; se w0 0 ; if connect trouble then goto error; jl. a4. ; dl w1 x2+4 ; move name of workarea to ds. w1 f22.+2 ; name parts of ds. w1 f23.+2 ; byte i-o descriptions; dl w1 x2+8 ; ds. w1 f22.+6 ; ds. w1 f23.+6 ; al w3 x2+2 ; process description(work area); jd 1<11+8 ; reserve process(workarea); jd 1<11+4 ; se w0 0 ; if process does not exist then jl. a5. ; begin a4: al w2 1 ; error: w2 := error, other reason; al. w3 d14. ; set return (break); jl. w1 c13. ; outtext (<:***algol object area:>); <:***algol object area<10><0>:> ; ; end; a5: am (0) ; comment: find number of segments rl w1 +18 ; in area process; rs. w1 f5. ; available segments := number of segments; \f ; fgs 1987.09.10 algol 6, pass 0, page 17 am. (b1.) ; w2 := other last core(output) := al w2 -8 ; top command - 8; al w1 x2-510 ; w1 := other first core(output) := w2-510; ds. w2 f21. ; al w1 x1-512 ; w1 := w1-512; al w2 x1+510 ; w2 := w1+510; ds. w2 f19. ; first core(output) := w1; al w2 x2+1 ; last core(output) := w2; ds. w2 f1. ; current outaddress := w1; al w1 x1-512 ; last outaddress := w2 + 1; al w2 x1+510 ; w1 := w1-512; w2 := w1+510; ds. w2 f17. ; other first core(input) := w1; al w1 x1-512 ; other last core(input) := w2; al w2 x1+510 ; w1 := w1-512; w2 := w1+510; ds. w2 f7. ; first core(input) := w1; al w2 x2+1 ; last core(input) := w2; ds. w2 f3. ; current inaddress := w1; al w1 x1-2 ; last inaddress := w2+1; rs. w1 c9.+4 ; last work for pass := w1-2; sl. w1 c0.+512 ; if last work for pass < first free core + 512 then jl. a31. ; begin al. w3 d14. ; set return(break); al w2 1 ; w2 := 1; jl. w1 c13. ; writetext(<:***pass trouble:>); <:<10>***pass trouble<0>:> ; ; end; a31: al. w0 f23. ; rs. w0 c20. ; set address of byte output description; al. w0 f22. ; rs. w0 c21. ; set address of byte input description; rl. w2 b1. ; command point := top command; al w2 x2-4 ; top source list := rs. w2 b6. ; start source name list := rs. w2 e46. ; top command -4; al w2 x2-2 ; top command := rx. w2 b1. ; top command - 6; al. w0 b36. ; top copy list:= rs. w0 b7. ; work area; rl. w0 b0. ; se w0 0 ; if not fixed ix default then jl. a50. ; begin <*produce default from cpu*> al w0 1 ; w0 := ls w0 15 ; 1<15 <*mode.ix*> or lo. w0 c17. ; modeword1; gg w1 34 ; sl w1 60 ; if cpu identification >= 60 then rs. w0 c17. ; modeword1 := w0; ; end; a50: jl. w3 a21. ; scan: nextparam; bl w1 x2 ; sh w1 3 ; if endparam then jl. a55. ; goto finisscan; rl w1 x2 ; if param<>spacename se. w1 (b12.) ; then goto scan; jl. a50. ; se. w3 (b26.) ; if nextparam<>pointname jl. a50. ; then goto scan; al. w1 b39. ; search option in group2 and 3: a51: sl. w1 b15. ; nextoption: if not found then jl. a50. ; goto scan; al w1 x1+12 ; w1:=option addr; dl w0 x1+2 ; w3w0:=optionname; sn w0 (x2+4) ; if param1<> se w3 (x2+2) ; option1 then jl. a51. ; goto nextoption; \f ; rc 1975.01.15 algol 6, pass 0, page 17a dl w0 x1+6 ; if param2<> sn w0 (x2+8) ; option2 then se w3 (x2+6) ; goto nextoption; jl. a51. ; jl. w3 a21. ; next param; rl w3 x2+4 ; se w3 0 ; if param2<>0 then jl. a50. ; goto scan; rl w3 x2+2 ; se. w3 (b4.) ; if -,(param=yes sn. w3 (b5.) ; or param=no) then se w3 x3 ; jl. a50. ; goto scan; ac w0 (x1+10) ; if yesor no then bs. w0 1 ; modechange not allowed; la. w0 e56. ; rs. w0 e56. ; rl w0 x2+2 ; se. w0 (b4.) ; if param=no then jl. a52. ; goto no; rl. w0 c17. ; modebit:= lo w0 x1+10 ; modebit rs. w0 c17. ; or optionbit; jl. a50. ; goto scan; a52: ac w0 (x1+10) ; no: bs. w0 1 ; modebit:= la. w0 c17. ; modebit rs. w0 c17. ; and -,optionbit; jl. a50. ; goto scan; b32: <:on:> ; b33: <:off:> ; b34: 1<0 ; listbit a55: rl. w1 e56. ; finisscan: so w1 1<0 ; jl. a56. ; if listchange allowed then rl. w0 c17. ; am e70-e68 ; begin rl. w1 e38. ; if fp mode.listing then lo. w0 b34. ; sz w1 1<8 ; modebits:=modebits or 1;; rs. w0 c17. ; end; a56: rl. w2 b1. ; restore w2 al w2 x2+6 ; a6: am. (c23.) ; scan parameter list: rs w2 e63 ; fp current command := command point; jl. w3 a21. ; next param; bl w1 x2 ; sh w1 3 ; if preceding delimiter < 4 then jl. a22. ; goto end parameters; rl w1 x2 ; sn. w1 (b12.) ; if parameter = (space, name) then jl. a26. ; goto test name; \f ; rc 1975.01.15 algol 6, pass 0, page 18 b2 = k+1 ; alarm state ; alarm next: a27: se w3 x3 ; if alarm state then jl. a25. ; goto list parameter; al. w1 b8. ; hs. w1 b2. ; alarm state := true; jl. w3 c13. ; writetext(<:algol param:>); a25: bz w1 x2 ; list parameter: al. w1 x1+b13. ; jl. w3 c13. ; writetext(delimiter table(delimiter)); al. w3 a6. ; set return(scan parameter list); bz w0 x2+1 ; al w1 x2+2 ; w1 := address(param); se w0 4 ; if param is name then jl. c13. ; goto writetext; rl w0 x2+2 ; w0 := param; jl. w3 c14. ; writeinteger(<space>,1); 32<12+1 ; jl. a6. ; goto scan parameter list; a26: al w1 0 ; test name: hs. w1 b2. ; alarm state := false; bz w1 6 ; al w0 0 ; file:=0; sn w1 4 ; if following delimiter = <space> then jl. a19. ; goto source list; se w1 8 ; if following delimiter <> point then jl. a27. ; goto alarm next; a7: al. w1 b14. ; search option table: entry := base option table; a8: sl. w1 b15. ; next option: jl. a20. ; if entry >= last of options then al w1 x1+12 ; goto maybe source; dl w0 x1+2 ; entry := entry + 12; sn w0 (x2+4) ; comment: an entry in the option se w3 (x2+2) ; table consists of: jl. a8. ; 0 - 7 : name of option. dl w0 x1+6 ; 8 - 9 : action on integer, action on name sn w0 (x2+8) ; 10 - 11: modebits to set; se w3 (x2+6) ; if param <> option name(entry) then jl. a8. ; goto next option; jl. w3 a21. ; next param; bz w0 x2+1 ; se w0 4 ; if parameter = <name> then jl. a10. ; goto yes or no; bl w0 x1+8 ; integer: hs. w0 b3. ; action := action on integer(entry); a9: rl. w0 c17. ; set modebits: lo w0 x1+10 ; w0 := modebits or bits(entry); jl. a11. ; goto call action; \f ; fgs 1986.03.07 algol 6, pass 0, page 19 a10: bl w0 x1+9 ; yes or no: hs. w0 b3. ; action := action on name(entry); sn. w1 b28. ; if option name = <:xref:> then jl. a33. ; goto xref; sn. w1 b38. ; if optionname=copy jl. a28. ; then goto copy; sn. w1 b35. ; if optionname = rts then jl. a45. ; goto move name to rts name; rl w0 x2+4 ; se w0 0 ; if name word 2(param) <> 0 then jl. a27. ; goto alarm next; sh. w1 b39. ; if paramgroup>1 and se w1 x1 ; param=yes rl w0 x2+2 ; or param=no se. w0 (b4.) ; then goto scan; sn. w0 (b5.) ; jl. a6. ; rl w0 x2+2 ; if param=on or se. w0 (b32.) ; param=off sn. w0 (b33.) ; then goto onoff; jl. a57. ; sn. w0 (b4.) ; if name word 1(param) = <:yes:> then jl. a9. ; goto set modebits; se. w0 (b5.) ; may be no: jl. a27. ; if name word 1(entry) <> <:no:> then a18: ac w0 (x1+10) ; goto alarm next; bs. w0 1 ; la. w0 c17. ; w0 := -,bits(entry) and modebits; a11: rs. w0 c17. ; call action: rl w0 x2+2 ; modebits := w0; b3 = k+1; action ; w0 := parameter; a12: jl. 0 ; goto modifier(action); a57: sh. w1 b40. ; onoff: if -,group3 then jl. a27. ; goto alarm next; rl. w3 e56. ; if -,modechange allowed so w3 (x1+10) ; then jl. a6. ; goto scan param list; sn. w0 (b32.) ; if param=on then jl. a9. ; goto yes jl. a18. ; else goto no; b4: <:yes:> ; b5: <:no:> ; b8: <:<10>***algol param<32><0>:>; \f ; fgs 1986.03.07 algol 6, pass0, page 19a a30: se. w0 (b4.) ; details name: jl. a6. ; if parameter = <:yes:> then al w0 1 ; begin al w1 11 ; lower pass no := 1; ds. w1 c18. ; upper pass no := 11; jl. a6. ; end; goto scan parameter list; a45: dl w0 x2+4 ; move name to rts name: ds. w0 e107.+2 ; move dl w0 x2+8 ; parameter name ds. w0 e107.+6 ; to jl. a6. ; rts name; a13: al w1 -6 ; details: bound := -6; a14: rs. w0 x1+e19. ; next interval: sn. w3 (b10.) ; interval bound(bound) := parameter; jl. w3 a21. ; if next item head = (point,integer) then ; next param; rs. w0 x1+e19.+2 ; interval bound(bound+2) := parameter; al w1 x1+4 ; bound := bound + 4; sh w1 0 ; if bound > 0 se. w3 (b10.) ; or next item <> (point,integer) then jl. a6. ; goto scan parameter list; jl. w3 a21. ; next param; jl. a14. ; goto next interval; a15: rs. w0 d7. ; stop integer: stop pass := parameter; a16: al w0 1 ; stop name: rs. w0 f9. ; sorry := 1; jl. a6. ; goto scan parameter list; a28: rl. w1 b7. ; copy: sl. w1 b37. ; if number of copyparam>max jl. a27. ; then goto alarm next; dl w0 x2+4 ; ds w0 x1+2 ; dl w0 x2+8 ; move name ds w0 x1+6 ; rl. w0 c17. ; hs w0 x1+9 ; save modebit al w1 x1+10 ; copypointer.= rs. w1 b7. ; copypointer+10; rl. w3 e83. ; no.of copyparam:= al w3 x3+1 ; no.of copyparam+1; rs. w3 e83. ; rl w3 x2+10 ; ls w3 -12 ; if nextsep<>point se w3 8 ; then goto jl. a6. ; scan param list; jl. w3 a21. ; next param; rl w1 x2 ; sn. w1 (b26.) ; if delim=pointname jl. a28. ; then goto copy; am. (b7.) ; hs w0 -10+8 ; save fileno; sn w0 0 ; if fileno = 0 then jl. a27. ; goto alarm next; sn. w3 (b10.) ; if nextdelim=pointinteger then jl. a27. ; goto alarm next; se. w3 (b26.) ; if nextdelim<>pointname jl. a6. ; then goto scan param list; jl. w3 a21. ; nextparam; jl. a28. ; goto copy; b7: 0 ; top copy list; \f ; rc 1975.10.28 algol 6, pass 0, page 20 a20: rl w3 x2+10 ; maybe source: se. w3 (b10.) ; if following delim<>pointinteger jl. a27. ; then goto alarm next; jl. w3 a21. ; next param; sn w0 0 ; if fileno=0 then jl. a27. ; goto alarm next; am -10 ; a19: al w3 x2 ; rl. w1 b6. ; source list: w1 := top source list; rs. w2 b6. ; save w2 al w2 x3 ; hs w0 x1+8 ; save fileno rl. w0 c17. ; save modebits hs w0 x1+9 ; dl w0 x2+4 ; ds w0 x1+2 ; move parameter to dl w0 x2+8 ; top source list and on; ds w0 x1+6 ; al w1 x1+10 ; top source list := top source list + 10; rl. w2 b6. ; restore w2 rs. w1 b6. ; jl. a6. ; goto scan parameter list; b6: 0 ; top source list; ; nextparam ; entry exit ; w0 - fpparameter ; w1 - unchanged ; w2 addr of previous addr of leading ; leading separator separator ; w3 return addr following separator a21: rs. w3 b9. ; next param: ba w2 x2+1 ; save return; al w3 x2 ; command point := ba w3 x2+1 ; command point + bits(12,23,item head); rl w3 x3 ; w3 := next item head; bl w0 6 ; sh w0 3 ; if next delimiter < 4 then rl. w3 b12. ; w3 := (space,name); rl w0 x2+2 ; w0 := parameter; jl. (b9.) ; return; b9: 0 ; saved return; a22: rl. w2 b6. ; end parameters: al w2 x2+2 ; start copy list := w2 := rs. w2 e47. ; top source list + 2; al. w1 b36. ; w1 := top command; \f ; fgs 1985.10.29 algol 6, pass 0, page ...21... a23: dl w0 x1+2 ; move copyparam: sn w3 0 ; if name empty then jl. a24. ; goto set ends; ds w0 x2+2 ; dl w0 x1+6 ; move name; ds w0 x2+6 ; rl w0 x1+8 ; rs w0 x2+8 ; move file, modebit al w1 x1+10 ; pointers:=pointers+10; al w2 x2+10 ; jl. a23. ; goto move copyparam; a24: al w0 0 ; set ends: rs w0 x2 ; end branch interval list := 0; rs. w0 (b6.) ; end source list := 0; rl. w0 c17. ; w0 := modebits; al w1 1 ; sz w0 1<9 ; if bossline.yes then hs. w1 j2. ; modify; sz. w0 (b30.) ; if blocks.yes then hs. w1 j3. ; modify; rl. w1 b17. ; so w0 1<2 ; if pass information wanted then jl. a32. ; begin rs. w1 j0. ; modify procedure outbyte; c. (:e15 a. 1:) - 1 ; if special testoutput pass 0 then jl. w3 d8. ; begin print linehead; al. w1 f22. ; writetext(string name of object area); jl. w3 c13. ; rl. w0 c23. ; write4(fp base); jl. w2 d20. ; al. w0 c0. ; write4(first of pass); jl. w2 d20. ; rl. w0 f26. ; write4(last work for pass); jl. w2 d20. ; rl. w0 c17. ; end; z. ; end; a32: rl. w1 e41. ; sz w0 1<6 ; if integer overflow wanted then wa. w1 b18. ; set bit 1 in interrupt mask; rs. w1 e41. ; rl. w1 c23. ; al w3 x1+e25 ; set abs address of rs. w3 d24. ; current program zone descriptor; rl w2 x3+e48+6 ; w2 := address(program share descriptor); al w0 x2+10 ; set abs address of rs. w0 d23. ; last core(program share descriptor(10)); al w0 x3+e49+16 ; set abs address of rs. w0 d21. ; segment(program process description(16)); al w0 x2+2 ; set abs address of am -1000 rs. w0 d27.+1000 ; first core(program share descriptor(2)); bz w0 x3+e49+1 ; se w0 18 ; if process kind(program) = 18 then jl. a29. ; begin comment: translator on magnetic tape; rl. w0 b19. ; set bit 4 in give up mask; lo w0 x3+e50 ; comment: inblock will always return by the rs w0 x3+e50 ; give up action, because last core = last work; am -1000 ; al. w0 d28.+1000 ; set give up action to point to the first rs w0 x3+e50+2 ; instruction after the call of inblock; ; end; a29: al w1 x1+e28 ; set abs address of rs. w1 e62. ; inblock (fp entry); am -1000 ; jl. c7.+1000 ; goto next pass; \f ; rc 18.1.1971 algol 6, pass 0, page 21a a33: rs. w3 b27. ; xref: save (next item pointer); dl. w1 b21. ; ds. w1 c73. ; first line := first name line := 0; ds. w1 c75. ; last line := last name line := maximum; rs. w0 c71. ; connection mask := 0; rs. w0 c76. ; sortareaname := undefined; am b23 ; scan xref option list: a34: al. w3 b24. ; entry := option table base; a35: al w3 x3+8 ; entry := entry + 8; sl. w3 b25. ; if entry >= last of options then jl. a27. ; goto alarm next; rl w0 x2+2 ; if param <> option name(entry) then se w0 (x3) ; goto next option; jl. a35. ; dl w1 x2+6 ; sn w0 (x3+2) ; se w1 (x3+4) ; jl. a35. ; am (x3+6) ; a36: jl. ; goto action (xref option); a37: al w0 7 ; xref yes: rs. w0 c71. ; connection mask := 7; jl. a6. ; goto scan parameter list; a38: am 3 ; xref all: mask := 7; a39: am 2 ; xref use: mask := 4; a40: am 1 ; xref assign: mask := 2; a41: al w0 1 ; xref declare: mask := 1; lo. w0 c71. ; connection mask := rs. w0 c71. ; connection mask or mask; rl. w3 b27. ; w3 := next item head; se. w3 (b26.) ; if w3 = (point,name) then jl. a43. ; begin jl. w3 a21. ; next param; rs. w3 b27. ; save (next item head); jl. a34. ; goto scan xref option list; end; a43: al. w1 c72. ; for w1 := adr(first line),adr(first name line) do a42: se. w3 (b10.) ; begin if w3 <> (point,integer) then jl. a44. ; goto sortarea; jl. w3 a21. ; next param; rs w0 x1 ; first line(x1) := parameter; sn. w3 (b10.) ; if next item head = (point,integer) then jl. w3 a21. ; next param; ba. w0 1 ; last line(x1) := parameter + 1; rs w0 x1+2 ; al w1 x1+4 ; sh. w1 c74. ; jl. a42. ; end; \f ; fgs 1986.03.07 algol 6, pass , page 21b a44: ; sortarea: se. w3 (b26.) ; if next item head <> (point,name) then jl. a6. ; scan parameter list; jl. w3 a21. ; next param; rs. w0 c76. ; move parameter to sortareaname; dl w1 x2+6 ; ds. w1 c76.+4 ; rl w0 x2+8 ; rs. w0 c76.+6 ; jl. a6. ; goto scan parameter list; \f ; fgs 1987.05.13 algol 6, pass 0, page ...22... b17: jl. h3 ; modifier to procedure outbyte; b18: 1<22 ; modifier to interrupt mask; b19: 1<19 ; bit 4 to give up mask (block length error; b20: 0 ; standard values for: first xref-line b21: 1<22 - 1 + 1<22 ; last xref-line b10: 8<12 + 4 ; (point,integer); b11: 4<12 + 4 ; (space,integer); b12: 4<12 + 10 ; (space,name); b26: 8<12 + 10 ; (point,name); b27: 0 ; next item head; b13 = k - 4 ; delimiter table: <: :> ; space; <:=:> ; equal; <:.:> ; point; b14 = k - 12 ; option table: ; option name action on action on modebits ; integer name to change ; group 1, not treated in first param scan <:survey:> ,0,0, h. a27-a12, a6 -a12, w. 1<2 <:stop:> ,0,0, h. a15-a12, a16-a12, w. 1<4 <:details:> ,0, h. a13-a12, a30-a12, w. 1<2 <:blocks:> ,0,0, h. a27-a12, a6 -a12,b30:w.1<11 <:connect:> ,0, h. a27-a12, a6 -a12, w. 1<12 <:fp:> ,0,0,0, h. a27-a12, a6 -a12, w. 1<13 b38: <:copy:> ,0,0, h. a27-a12, a28-a12, w. 0 <:bossline:>,0, h. a27-a12, a6 -a12, w. 1<9 b28: <:xref:> ,0,0, h. a27-a12, a6 -a12, w. 0 b35: <:rts<0>:> ,0,0, h. a27-a12, a45-a12, w. 0 ; group 2, yes or no finished in first param scan b39=k-12 <:message:> ,0, h. a27-a12, a6 -a12, w. 1<1 <:index:> ,0,0, h. a27-a12, a6 -a12, w. 1<3 <:spill:> ,0,0, h. a27-a12, a6 -a12, w. 1<6 <:zonecheck:> , 0, h. a27-a12, a6 -a12, w. 1<14 <:ix:>, ,0,0,0, h. a27-a12, a6 -a12, w. 1<15 <:code:> ,0,0 h. a27-a12, a6 -a12, w. 1<16 ; group 3, on off allowed, else as group 2 b40=k-2 b29: <:list:> ,0,0, h. a27-a12, a6 -a12, w. 1<0 b15 = k - 12 ; last of options; ; xref option table: b22 = k ; first of xref options; ; option name action <:yes:> , 0 , 0 , a37-a36 ; <:no:> , 0 , 0 , a6 -a36 ; b23 = b22-k ; option table base (incl. yes,no ) b24 = k - 8 ; option table base (excl. yes,no ) <:all:> , 0 , 0 , a38-a36 ; <:use:> , 0 , 0 , a39-a36 ; <:assign:> , 0 , a40-a36 ; <:declare:> , a41-a36 ; b25 = k ; last of xref options; \f ; fgs 1986.02.18 algol 6, pass 0, page ...23... d25: 100 ; tail for look up entry and create entry; d26: 0,r.9 ; segments = 100, dummy entry b36: 0,r.151 ; max 30 copy-sources b37=k-2 h5 = k - e38 ; length of entire pass 0; e89= h5 ; load length for insertproc e30= h5 ; accumulated length of passes for insertproc i. ; id list; e. ; end block: initialize translator; i. ; id list; ;e. ; end block: pass 0 segment; m. jz.fgs 1987.09.11 algol 8, pass 0 \f ▶EOF◀