|
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: 96000 (0x17700) Types: TextFile Names: »algpass93tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »algpass93tx «
\f ; fgs.jz 1985.10.03 algol/fortran, pass 9, page 1 s. a203, b33, c50, g62, h35, i10, j10 ; begin segment pass 9; h8 = 0 ; chain to next catalogentry, relative. h0 = 2 ; value (rel addr iin entry in external catalog); h1 = 6 ; area kind - - - - - - h2 = 8 ; name - - - - - - h3 = 16 ; entry point - - - - - - h4 = 18 ; kind and spec - - - - - h5 = 22 ; ident - - - - - - h6 = 24 ; sizes - - - - - - h9 = 26 ; dataentrypoint h7 = 28 ; entry length - - - - - - h10 = 64 ; remove process (monitor entry) h11 = 52 ; create area process - - h12 = 42 ; look up entry - - h13 = 16 ; send message - - h14 = 18 ; wait answer - - h15 = 44 ; change entry - - h16 = 76 ;lookup head and tail h17 = 4 ;process description h18 = 4 ; name (rel address in fp note) h19 = 14 ; file number - - - - - h20 = 16 ; block number - - - - - h21 = 18 ; content,entry - - - - - h22 = 20 ; length - - - - - h23 = 2047; supposed length of shared main entry h24 =14-h1; length of head-kind rel in ext entry h28 = 14 ; length of entry in common catalog h29 = 20 ; length of entry in zonecommon catalog h30 = 0 ; chain to next common catalog entry, relative h31 = 2 ; final value h32 = 4 ; name h33 = 12 ; length of whole common h34 = 14 ; description of zonecommon h35 = 149 ; h35 + 1 = first rs-no for not basic rs. \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 2 k = e0; w. j0 ; no of bytes in pass 9; h. j1, 9<1+0 ; entry pass 9, pass no = 9, same direction as pass8; w. ; a50: am. (e40.) ; finis assembly: se w3 x3 ; if stop translation then jl. e7. ; goto end pass; ; move own core, datapoints and zonecommon ; descriptons to tail of program; rl. w0 e9.-4 ; outsegment := rs. w0 g51. ; segm no for first own := rs. w0 g8. ; used segments; ; ; w0 := word to move; ; w1 := index in core; ; w2 := link; ; w3 := index in outputbuffer; ; rl. w3 g6. ; move core picture: rl. w1 g28. ; ac w0 x1 ; length of owns := inf1 := wa. w0 g18. ; base of external list - rs. w0 g52. ; first own rs. w0 e9. ; al w0 0 ; rs own1 := <*first free :=*> rs w0 x1 ; rs own2 := 0; <*no of own/data/zcommon halfs := 0*> rs w0 x1+2 ; <*rts init knows no of own/data/zcommon halfs*> al w3 x3+4 ; skip leading two words in outputbuffer; a85: sl. w1 (g18.) ; if current own address > last own address jl. a86. ; then goto end own; rl w0 x1 ; jl. w2 c22. ; move word(w0) to outputbuffer al w1 x1+2 ; get address af next own; jl. a85. ; ; end own: a86: al w0 0 ; no of bytes moved:=0 rs. w0 g50. ; rl. w1 g16. ; w1:=address of first catalog entry; ; move data entry points a87: am (x1+h1) ; nextdata: sl w1 x1 ; if area kind <> area then jl. a127. ; goto next entry; rl w0 x1+h9 ; se w0 0 ; if data in this unit then jl. w2 c22. ; move word(w0) to outputbuffer; a127: rl w0 x1+h8 ; next entry: if last entry then sn w0 0 ; goto end data; jl. a88. ; wa w1 1 ; next entry:=current entry+chain; jl. a87. ; goto nextdata; a88: rl. w0 g50. ; enddata: rs. w0 g53. ; save no of data point bytes; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 3 al w0 0 ; rs. w0 g50. ; no of bytes moved := 0 rl. w1 g41. ; w1:=address of first zonecommon entry; ; move zonecommon description a89: rl w0 x1+h30 ; nextzon: sn w0 0 ; if last zonecommon then jl. a90. ; goto end copy; wa w1 1 ; next zonecommon:=current+chain; rl w0 x1+h31 ; move start of common jl. w2 c22. ; rl w0 x1+h34 ; move no of zones, no of shares; jl. w2 c22. ; rl w0 x1+h34+2 ; move buffer length jl. w2 c22. ; rl w0 x1+h34+4 ; move point for blockprocedure; jl. w2 c22. ; jl. a89. ; goto nextzon; a90: rl. w1 g50. ; endcopy: rs. w1 g54. ; save no of zonecommonbytes; wa. w1 g53. ; bytes total := no of zonebytes wa. w1 g52. ; + no of databytes rs. w1 g50. ; + no of own bytes se w1 0 ; if bytes total <> 0 then jl. w2 c11. ; output last buffer ; transfer values to prog descr vector: al. w2 b4. ; w2 := addr of prog descr; dl. w1 e17.+2 ; ds w1 x2+2 ; modebits word (1:2); rl. w0 e41. ; am. (g47.) ; rl w1 +h0 ; ds w1 x2+18 ; interrupt mask, entry point to program; dl. w1 g53. ; ds w1 x2+22 ; no of own bytes, no of data bytes; rl. w0 g54. ; rl. w1 g51. ; ds w1 x2+26 ; no of zdescr bytes, segm no first own segm; rl. w0 g42. ; rs w0 x2+28 ; length of common area; \f ; fgs.jz 1987.06.04 algol/fortran, pass 9, page 4 ; finis program: rl. w2 e24. ; w2:=address of fp result note rl. w3 g47. ; w3:=address af program entry al w0 0 ; block no(note):= al w1 0 ; file no (note):= ds w1 x2+h20 ; block no(tail):= ds w1 x3+h5-2 ; file no (tail):= 0 dl. w1 g36. ; set prog call descr in note and tail; ds w1 x2+h22 ; ds w1 x3+h6 ; rl. w0 b3. ; move prog descr entry from b3 ld w1 -9 ; as seg<12+rel ls w1 -3 ; ld w1 -12 ; rs w1 x3+h4 ; to tail word 7; dl w1 110 ; set shortclock ld w1 5 ; rs w0 x3+h3 ; in tail word 6; jl. a28. ; goto change. ; finis external procedure: a52: rl. w3 g16. ; w3:=address of first catalog entry; am (x3+h1) ; sn w3 x3 ; if shared entry then wa w3 x3+h6 ; w3:=address of main entry; rl. w2 e24. ; w2:=address of fp result note; dl w1 x3+h6 ; move parameters from tail ds w1 x2+h22 ; to last part of note; dl w1 x3+h5-2 ; ds w1 x2+h20 ; rl w1 x3+h3 ; lo. w1 b18. ; set bit 0 in catalog entry rs w1 x3+h3 ; rs w1 x2+h19-2 ; al w1 4 ; content(note):= hs w1 x2+h21 ; content(tail):= 4 hs w1 x3+h5 ; ; change: a28: rl. w0 b12. ; set kind and mode rs w0 x2+2 ; in fp note c. e77 < 2 ; if system 2 then begin rl. w1 e17. ; w1:=modebits; rl. w0 e9.-2 ; w0:=available segments; so w1 1<7 ; if work area created by pass 0 then jl. a132. ; z. ; end system 2; rl. w0 e9.-4 ; w0:=used segments; rs w0 x3+h1 ; area length(tail):=w0; al w0 0 ; al w1 0 ; clear document name of tail ds w1 x3+h2+2 ; ds w1 x3+h2+6 ; al w1 x3+h1 ; w1:=tail address al. w3 g5. ; w3:=name of area (output descr) jd 1<11+h15 ; change entry \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 5 rl. w1 e17. ; if work area created by pass 0 then sz w1 1<7 ; jl. e7. ; goto endpass; rl. w0 (a113.) ; se w0 0 ; if program sz w1 1<8 ; or note supplied by fp (always false in system3) jl. a133. ; then goto add rs segments to prog.; rl. w3 g16. ; w3:=first entry in catalog a124: bl w0 x3+h5 ; check entry: se w0 8 ; if content<> 8 <*not maincat entry*> then jl. a126. ; goto next entry al. w2 g0. ; w2 := addr input descr; dl w1 x3+h2+2 ; save name of external catalog entry ds w1 x2+2 ; in dl w1 x3+h2+6 ; name of input descr.; ds w1 x2+6 ; rl. w0 b12. ; create new tail rs w0 x3+h1 ; 1<23 + 4 to modekind in ext cat entry; al. w2 g5. ; w2 := addr output descr; dl w1 x2+2 ; name:= name of main entry <*name in output descr*>; ds w1 x3+h2+2 ; to dl w1 x2+6 ; name of ext cat entry; ds w1 x3+h2+6 ; rl w1 x3+h3 ; set program unit bit (code entry) lo. w1 b18. ; in entry point for rs w1 x3+h3 ; catalog entry al w0 4 ; content:=4 hs w0 x3+h5 ; rs. w3 g17. ; save address of entry al w1 x3+h1 ; w1:=tail address al. w3 g0. ; w3:=name address jd 1<11+40 ; create entry; sn w0 3 ; if name conflict then jd 1<11+44 ; change entry; se w0 0 ; if result <> 0 then jl. w1 c7. ; alarm (<:name trouble:>); jl. a125. ; <:name trouble<0>:> a125: rl. w3 g17. ; reset catalog entry a126: rl w0 x3+h8 ; w0:=chain sn w0 0 ; if last entry in catalog jl. e7. ; then goto end pass wa w3 1 ; w3:=next entry jl. a124. ; goto check entry \f ; fgs.jz 1983.06.20 algol/fortran, pass 9, page 6 a133: al w2 0 ; add rs segments to program: am 2 ; al. w0 b3. ; w0 := addr prog descr + 2; el. w1 g58. ; w1 := addr prog descr + ls w1 9 ; no of rs segments * 512; al. w1 x1+b3. ; am. (e9.+4) ; if w1 >= last work for pass + am 1024 ; gpa input buffers + sl w1 1026 ; gpa out buffers + 2 then jl. w1 c9. ; alarm (<:stack:>); jl. a135. ; <:stack <0>:> ; a135: rl. w3 e20. ; first addr output := w0; ds w1 x3+14 ; last addr output := w1; rs w2 x3+16 ; outsegment := 0; rl. w3 e21. ; first addr input := w0; ds w1 x3+14 ; last addr input := w1; rl. w2 g25. ; insegment := segm base for rs; rs w2 x3+16 ; al. w2 e107. ; move dl w1 x2+2 ; name of runtime system ds w1 x3+2 ; to dl w1 x2+6 ; name gpa input descr; ds w1 x3+6 ; together with rl w0 x2+8 ; name table address; rs w0 x3+8 ; jl. w3 e90. ; input segments; rl. w3 e21. ; w3 := gpa input descr; jl. w2 e59. ; wait segment; jd 1<11+64 ; remove process (name of rts); al w1 0 ; al. w2 b4. ; w2 := index in prog descr; rl. w3 b3. ; w3 := index in program + am. (e21.) ; first address input; wa w3 +18 ; a123: rl w0 x2 ; repeat sn w1 (x3) ; if prog (index) <> 0 then rs w0 x3 ; prog (index) := descr (index); al w2 x2+2 ; increase al w3 x3+2 ; indices; se. w2 b3. ; until index in prog descr = jl. a123. ; addr of prog descr addr; jl. w3 e8. ; output segments; rl. w3 e20. ; w3 := addr of gpa output descr; jl. w2 e59. ; wait segment; jl. e7. ; goto end pass; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 7 b4: 0 ; prog descr: 0 ; 30 hwds of working locations mainly ; for transfer of program descriptor ; to runtime system segments: e103 ; compiler version e104 ; - release<12 + subrelease e105 ; - release year<12 + date b20: 0, r.10 ; during assembly b20 : b20+6 may be ; used as working locations for test- ; output and b4 is used as working location; b3: 0 ; addr of prog descr: (ends prog descr) ; the following locations are overwritten by add rs segments to program. b15: 0 ; saved w2, returnaddress ; procedure moveword, w2=returnaddress ; w3=pointer in outputbuffer ; w0=word to set in outbuf c22: rs. w2 b15. ; save returnaddress; am. (g7.) ; if not place for this word then sl w3 +2 ; shiftbuffer; jl. w2 c11. ; rs w0 x3 ; set word in buffer; al w3 x3+2 ; bufferindex:=bufferindex+2 rl. w2 g50. ; no of bytes transferred:= al w2 x2+2 ; no of bytes transferred + 2 rs. w2 g50. ; jl. (b15.) ; return 0 b16: 0 ;save registers 0 0 ; procedure shiftbuffer: w2=returnaddress c11: ds. w1 b16. ; save registers; ds. w3 b16.+4 ; rl. w1 g8. ; rl. w3 g47. ; w3:=address of program entry; sl. w1 (e9.-2) ; if outsegment >= available segments then jl. a53. ; alarm (<:program too big:>) jl. w2 c0. ; output segment; rl. w1 g8. ; outsegment := used segments al w1 x1+1 ; outsegment + 1 rs. w1 g8. ; rs. w1 e9.-4 ; dl. w3 g2. ; rx. w2 g6. ; shift buffers; rx. w3 g7. ; ds. w3 g2. ; rl. w3 g6. ; w3:=first core output + 4; al w3 x3+4 ; <*leave 4 halfs on each segment*> dl. w1 b16. ; w0-w1:=saved wo-w1; jl. (b16.+2) ; return; \f ; fgs.jz 1986.03.06 algol/fortran, pass 9, page 8 ; next area: a0: am. (g12.) ; sn w3 x3 ; if processed <> 0 then jl. a60. ; jl. w2 c0. ; begin output segment; rl. w2 g8. ; outsegment:= al w2 x2+1 ; outsegment + 1; rs. w2 g8. ; end; rs. w2 g27. ; outbase := outsegment; a60: rl. w3 g15. ; bz w0 x3+h5 ; sn w0 8 ; if main catalog entry then jl. a1. ; begin al. w3 g0. ; w3:=address of name of process; rl. w0 g61. ; sn w0 0 ; if version = 0 then jl. w1 c17. ; message1 (<:wrong version:>, version); jl. a13. ; return; <:wrong version <0>:> a13: jd 1<11+h10 ; remove process; se w0 0 ; if not removed then jl. w1 c17. ; message1 (<:remove proc:>, result); jl. a1. ; return; <:remove process <0>:> ; end; ; get next area: a1: al w0 0 ; rs. w0 g61. ; version := 0; rl. w3 g15. ; a4: rl. w0 e17. ; print pass information: so w0 1<2 ; if pass information wanted then jl. a3. ; begin al w1 x3+h0 ; comment: the pass information is one line al w2 x1+h1-h0 ; for each entry in the external catalog. jl. w3 e19.+2 ; rs. w2 b4. ; the content of the line is the name a2: bz w0 x1 ; of the entry followed by 6 integers. jl. w3 e14. ; the integers are: 32<12+6 ; entry segment, entry rel on segment, al w1 x1+1 ; first segment of this area, se. w1 (b4.) ; first core in own core area, jl. a2. ; if area entry then am (x1) ; first word of date, sl w3 x3 ; jl. a56. ; if area entry then jl. w1 c5. ; second word of the date. the integers rl. w0 g30. ; are printed in the same order as written jl. w3 e14. ; above. the first 4 integers are the 48<12+6 ; first 4 bytes of the entry in the jl. w1 c5. ; external catalog. the last 2 integers rl. w0 g31. ; are the last 2 words in the external jl. w3 e14. ; list for the area, or zeroes if 48<12+6 ; the entry does not describe area; a56: jl. w1 c5. ; writespace; rl. w1 g15. ; w1 := address(name part(entry)); al w1 x1+h2 ; el w0 x1 ; sh w0 0 ; if first half of name > 0 then jl. a62. ; writetext jl. w3 e13. ; else jl. a63. ; writeinteger (rs no); a62: ac w0 (0) ; jl. w3 e14. ; 48<12 + 6 ; al. w1 b33. ; jl. w3 e13. ; a63: rl. w3 g15. ; end; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 9 a3: rl w0 x3+h8 ; after inf: sn w0 0 ; if last entry in external catalog then jl. a50. ; goto finis assembly; wa w3 1 ; current entry address:= rs. w3 g15. ; current entry address + chain; rl w0 x3+h0+2 ; if base part (entry) = -1 then se w0 -1 ; begin jl. a55. ; al w3 x3+h2 ; jl. w1 c8. ; message(<:size:>); jl. a66. ; return; <:size:> ; a66: al w3 x3-h2 ; ; start assembly: a55: am (x3+h1) ; if kind(entry) <= 0 then sl w3 x3 ; jl. a4. ; goto print pass information bz w0 x3+h5 ; sn w0 8 ; if main catalog entry then jl. a91. ; begin al w0 0 ; insegment := 0; rs. w0 g3. ; al w3 x3+h2 ; w3 := external.namepart; rl. w1 g6. ; w1 := first core output <*lookup area*>; jd 1<11+h16 ; lookup head and tail (w1, w3); se w0 0 ; if result <> 0 then jl. a26. ; goto cat error; bz w2 x3-h2+h5 ; if shared main entry then sh w2 31 ; begin jl. a131. ; insegment := content - 32; al w2 x2-32 ; rs. w2 g3. ; rs. w2 g4. ; inbase := insegment; al w2 h23 ; length := supposed length; rs w2 x1+14 ; name addr := addr of docname in entry; am 16-6 ; end else a131: al w3 x1+6 ; name addr := addr of entry name; jd 1<11+h11 ; create area process; se w0 0 ; if result <> 0 then jl. a26. ; goto cat error; am +8 ; rs. w0 g0. ; clear name table addr; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 10 am. g0. ; al w2 -h2 ; w2 := addr of name in input descr - h2; jl. w1 c2. ; update name at w2 by name of area process; am. (g6.) ; al w2 +h24 ; w2 := entry addr as for external entry; jd 1<11+h17 ; get area process descr; am (0) ; dl w1 -2 ; if entry bases <> sn w0 (x2-h24+2) ; proc bases then se w1 (x2-h24+4) ; jl. w1 c8. ; goto base message; jl. a5. ; return; <:bases<0>:> ; message (<:bases:>); a5: rl. w3 g15. ; al w3 x3+h2 ; w3 := addr of entry name; jl. w1 c2. ; update entry name; bz w0 x2-h24+30 ; sh w0 31 ; if shared main entry then jl. a6. ; begin al w2 x2+2 ; entry addr := entry addr + 2; al w3 x3+2 ; tail addr := tail addr + 2; ; end; a6: rl w0 x2+h1 ; compare: se w0 (x3-h2+h1) ; if tail (tail addr) <> entry (entry addr) then jl. w1 c9. ; goto entry alarm1 (<:entry changed:>); jl. a7. ; unused return; <:entry:> ; a7: al w3 x3+2 ; entry addr := entry addr + 2; al w2 x2+2 ; tail addr := tail addr + 2; am. (g15.) ; if entry addr <> current entry addr then se w3 h7 ; goto compare; jl. a6. ; end main catalog entry else jl. a47. ; begin <*ext cat entry*> a91: rl. w0 g48. ; insegment:=next insegment; rs. w0 g3. ; wa w0 x3+h1 ; next insegment:=next insegment rs. w0 g48. ; + area size ; end <*ext cat entry*>; end \f ; fgs.jz 1986.03.03 algol/fortran, pass 9, page 11 a47: rl. w3 g15. ; w3:=saved entry address al w0 1 ; fortran:=if kind an spec < 0 rl w1 x3+h4 ; then 1 sl w1 0 ; al w0 0 ; else 0 rs. w0 g46. ; ls w1 1 ; if program (i.e. kindword1 extract 23 = 0) sn w1 0 ; then rs. w3 g47. ; save entry address; bz w0 x3+h5+1 ; entry address := current entry address; sl w0 e39-10 ; if start ext list > segm length - 10 then jl. c13. ; goto relative alarm; wa. w0 g1. ; current word address := rs. w0 b5. ; start of ext list(entry) + first core input; bz w0 x3+h6 ; program size:=code length(emtry); rs. w0 g23. ; used segments := wa. w0 e9.-4 ; used segments + program size; rs. w0 e9.-4 ; sh. w0 (e9.-2) ; if used segments > available segments then jl. a8. ; a53: al w3 x3+h2 ; jl. w1 c9. ; alarm(<:program too big:>); 0 ; unused return; <:program too big<0>:>; a8: bz w0 x3+h6+1 ; core length:= rs. w0 g32. ; byte 2(size part(entry)); bz w0 x3+h0+2 ; program base := rs. w0 g9. ; byte 1(base part(entry)); bz w0 x3+h0+3 ; core base := rs. w0 g14. ; byte 2(base part(entry)); jl. w2 c1. ; input segment; jl. w2 c4. ; w0 := next word from external list; bz w1 0 ; rs. w1 g34. ; no of globals := byte 1(w0); bz w0 1 ; rs. w0 g35. ; no of externals := byte 2(w0); wa w1 0 ; no of globals and externals := rs. w1 g24. ; no of globals + no of externals; sh. w1 (g38.) ; if no of globals + no of ext > max then jl. a61. ; begin rs. w1 g38. ; max := no of globals + no of ext; rs. w1 e102. ; pass0 (sum2) := max; rs. w0 e102.-2 ; pass0 (sum1) := no of ext; a61: ; end; jl. w2 c4. ; core to copy := rs. w0 g33. ; next word from external list; rl. w3 g46. ; if algol unit then sn w3 0 ; al w0 0 ; w0 := 0; (commons = zones = 0) bz w1 0 ; no of commons:= rs. w1 g43. ; byte1(w0); bz w1 1 ; no of zonecommons:= rs. w1 g44. ; byte2(w0); al w0 0 ; if fortran unit then se w3 0 ; rs. w0 g33. ; core to copy := 0; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 12 rl. w3 g18. ; copy bytes to permanent core al w1 0 ; index := 0; w3 := base external table; a9: sl. w1 (g32.) ; next core: if index >= core length jl. a10. ; then goto global points; al w1 x1+2 ; index := index + 2; al w0 0 ; w0 := 0; sh. w1 (g33.) ; if index <= core to copy then jl. w2 c4. ; w0 := next word from external list; rs w0 x3 ; external table(index) := w0; al w3 x3+2 ; w3 := w3+2; jl. a9. ; goto next core; a10: rs. w3 g18. ; global points: base external table := w3; al w0 0 ; datapoint := false am. (g15.) ; rs w0 h9 ; rl. w1 g34. ; index := 0; count := no of globals; a11: sh w1 0 ; next global: if count <=0 then jl. a12. ; goto next external; al w3 x3+2 ; index := index + 2 al w1 x1-1 ; count := count-1; jl. w2 c4. ; w0 := next word from external list; sn w0 0 ; if global=0 (datapoint empty) jl. a11. ; then goto next global; bz w2 0 ; wa. w2 g9. ; segment := byte 1(w0) + program base sh. w2 (b31.) ; if segment > 4095 then jl. a105. ; begin rs. w1 b4. ; save w1; rl. w2 b31. ; segment := 4095; al w3 x3+h2 ; w1 := ext cat entry name; jl. w1 c8. ; message1 (<:size:>, name); jl. a138. ; return; <:size<0>:> ; a138: al w3 x3-h2 ; restore w3; rl. w1 b4. ; restore w1; a105: ; end; hs w2 0 ; byte 1(w0) := segment; rs w0 x3-2 ; external table(index) := w0; am. (g34.) ; sn w1 -1 ; if first global point am. (g46.) ; sn w3 x3 ; and fortran unit then jl. a11. ; am. (g15.) ; save entry point giving start og rs w0 h9 ; datainit code; jl. a11. ; goto next global point; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 13 ; next external: a12: rl. w1 g35. ; sl w1 1 ; if no of externals > 0 then jl. a29. ; goto search for external; rs. w3 g45. ; save start of commonlist a108: rl. w1 g43. ; sl w1 1 ; if no of commons > 0 then jl. a72. ; goto search for common rl. w1 g44. ; sl w1 1 ; if no of zonecommons > 0 jl. a80. ; then goto search for zonecommon; jl. w2 c4. ; date 1 := rs. w0 g30. ; next word from external list; jl. w2 c4. ; date 2 := rs. w0 g31. ; next word from external list; jl. w2 c4. ; remove continuation word al w0 0 ; processed:=0; rs. w0 g12. ; jl. a30. ; goto next segment; ; search for external: a29: al w1 x1-1 ; no of externals:= rs. w1 g35. ; no of externals - 1; rs. w3 g22. ; save external table index; al. w1 a12. ; set returnaddress from search in rs. w1 b28. ; catalog to next external al w1 12 ; read the next 12 bytes giving the rs. w1 g53. ; next element in external list jl. w2 c12. ; a121: rl. w2 g16. ; w2:=first entry in external catalog; ; try this entry in external catalog: a15: dl w1 x3+2 ; sn w0 (x2+h2) ; se w1 (x2+h2+2) ; if name part (external list)<> jl. a49. ; dl w1 x3+6 ; name part(external catalog) then sn w0 (x2+h2+4) ; se w1 (x2+h2+6) ; try next entry in external catalog; jl. a49. ; jl. a19. ; goto found; a49: rl w0 x2+h8 ; get next external in external catalog: sn w0 0 ; if chain(entry) = 0 then jl. a16. ; goto search main catalog; wa w2 x2+h8 ; current entry address:=current entry address jl. a15. ; + chain; ; goto try this entry in external catalog; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 14 ; search main catalog: a16: rl. w1 g49. ; w1:=last used; al w1 x1-h7 ; last used:=last used - entry sice; am. (g22.) ; sh w1 11 ; if last used <= top external table + 12 jl. a14. ; then goto stack alarm; rs. w1 g49. ; ws w1 5 ; chain(last entry):=w1 - w2; rs w1 x2+h8 ; wa w1 5 ; al w0 0 ; chain(new entry) := 0; rs w0 x1+h8 ; al w1 x1+h1 ; tail address := last entry address + h1; jl. w2 c6. ; look up in main catalog and check; am (x1) ; sh w3 x3-1 ; if tail(0) > 0 then jl. a18. ; goto area entry; rl. w2 g49. ; bz. w0 i0. ; se w0 0 ; if share then jl. a59. ; goto wrong kind rl w1 x2+h4 ; w1 := kindword (1); rs. w2 g21. ; saved entry addr := last entry addr; al w0 0 ; ls w1 1 ; delete 1. bit of kind and spec ld w1 5 ; ident type := bits(0,5,kind word 1); ls w1 -6 ; rs entry := bits(6,23,kindword 1); sl w0 8 ; if ident type < 8 <*procedure*> sn w1 0 ; or rs entry = 0 then <*variable in perm core area*> jl. a17. ; goto share entry; \f ; fgs.jz 1985.09.26 algol/fortran, pass 9, page 15 al w1 x1-1 ; rs variable: am (x2+h2) ; sh w3 x3-1 ; if normal rs entry and sh. w1 (g39.) ; rs entry - 1 > no of std rs entries then jl. a58. ; begin rx w1 6 ; swop (w1, w3); jl. w1 c16. ; message (<:rs entry:>, rs no); rx w1 6 ; swop (w1, w3); end; a58: ls w1 1 ; rs entry := 2 * (rs entry - 1); am. (g19.) ; rl w0 x1 ; entry value := rs table (entry value); am (x2+h2) ; check special rs entry: sl w3 x3 ; if name (entry) < 0 then ls w0 12 ; entry value := entry value shift 12; rs w0 x2+h0 ; value(entry) := entry value; al w0 0 ; rs w0 x2+h0+2 ; base part(entry) := 0; jl. a20. ; goto update entry name; a17: al w0 1 ; share entry: hs. w0 i0. ; share := true; rl. w2 g16. ; entry:=first entry address; rl. w3 g49. ; al w3 x3+h2 ; w3 := address(name part(entry)); jl. a15. ; goto search external catalog; \f ; fgs.jz 1985.09.26 algol/fortran, pass 9, page 16 a18: rl. w2 g49. ; area entry: entry address:=last used; rl. w0 g20. ; w0 := current bases; jl. w1 c3. ; update entry value; jl. w1 c23. ; goto add entry bases to current bases; jl. w1 c2. ; update entry name; a19: ; found: se. w2 (g62.) ; if entry = version entry then jl. a104. ; begin rl. w0 g46. ; sn w0 0 ; if fortran unit <*and pseudo external added*> then jl. a77. ; noofglobals + noofexternals := rl. w1 g24. ; noofglobals + noofexternals - 1; al w1 x1-1 ; rs. w1 g24. ; a77: rl w0 x3+8 ; rs. w0 g61. ; version :=ext list.entry.kind (1); sl w0 (x2+h4) ; if version < ext cat.entry.kind (1) then jl. a23. ; begin <*version < smallest version number in external accepted*> al. w3 g0. ; name addr := input.name; jl. w1 c17. ; message1 (<:wrong version:>, version); jl. a23. ; end; <:wrong version<0>:> ; goto prepare next external item; ; end; a104: sn w3 x2+h2 ; found: if entry=ego jl. a49. ; then goto try next entry; i0 = k + 1 ; share ; sn w3 x3 ; if -,share then jl. a21. ; goto test kind and spec; a59: rl w0 x2+h1 ; wrong kind: w0 := tail(0) of entry; sh w0 0 ; if size <= 0 then jl. w1 c17. ; begin jl. a70. ; message1 (<:modekind:>); <:modekind<0>:> ; end else a70: sl w0 1 ; w0 := rl w0 x2+h0+2 ; base part (entry); rl. w2 g21. ; entry address := saved entry address; jl. w1 c3. ; update entry value; a20: rl. w3 g22. ; update name: w3 := external table index; jl. w1 c2. ; update entry name; al w0 0 ; hs. w0 i0. ; share := false; \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 17 a21: rl w0 x3 ; test kind and spec: sh w0 0 ; if name (entry) <= 0 then jl. a23. ; goto prepare next external item; dl w1 x3+10 ; sn w0 (x2+h4) ; if kind word 1(entry) <> kind word 1(external) se w1 (x2+h4+2) ; or kind word 2(entry) <> kind word 2(external) jl. a22. ; then goto kind alarm; jl. a23. ; goto prepare next external item; a22: sn w0 -1 ; if kind and spec = -1 (rs-extend) jl. a23. ; then goto prepare next external rs. w1 b4. ; kind alarm: jl. w1 c8. ; jl. a67. ; return; <:kind<0>:> ; message(<:kind:>); a67: jl. w1 c5. ; writespace; jl. w3 e14. ; 1<23+32<12+8 ; writeinteger(kind word 1(external)); jl. w1 c5. ; rl. w0 b4. ; writespace; jl. w3 e14. ; 1<23+32<12+8 ; writeinteger(kind word 2(external)); a23: rl. w3 g22. ; prepare next external item: c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ds. w3 b20.+6 ; ds. w1 b20.+2 ; al w0 c43 ; test 3, value, 2 bytes rl w1 x2+h0 ; jl. w2 c19. ; z. ; end test; rl w0 x2+h0 ; restore external table index; rs w0 x3 ; external table(index) := value(entry); al w3 x3+2 ; index := index + 2; jl. (b28.) ; goto next external; b28: 0 ; returnaddress \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 18 ; search for common: a72: al w1 x1-1 ; no of commons:= rs. w1 g43. ; no of commons-1 rs. w3 g22. ; save external table index al w1 12 ; rs. w1 g53. ; jl. w2 c12. ; read 12 bytes from external list rl. w2 g40. ; w2:=first entry in common catalog a73: dl w1 x3+2 ; try this entry in (zone)common catalog: sn w0 (x2+h32) ; se w1 (x2+h32+2) ; if name part(common list) <> jl. a74. ; name part(common catalog) then dl w1 x3+6 ; goto get next in common catalog; sn w0 (x2+h32+4) ; se w1 (x2+h32+6) ; jl. a74. ; jl. a75. ; goto common name match; a74: rl w0 x2+h30 ; get next in common catalog: sn w0 0 ; if chain=0 then jl. a79. ; goto create new common; wa w2 1 ; common address:=common address + chain; jl. a73. ; goto check this common; a75: ; common match: rl w1 x3+8 ; test length and zone common description se w1 (x2+h33) ; if length(common list) <> jl. w1 a107. ; length(common catalog) then ; common alarm; a76: bz w0 x3+10 ; compute value of this common: rs w0 x3+0 ; move commonno for first in fictive part bs w0 x3+11 ; relative for first in fictive part:= ls w0 11 ; (commonno for forst in fictive part wa w0 x2+h31 ; - commonno for first in real part) rs w0 x3+2 ; *2**11 + relative to common base; rl. w0 b17. ; next commonno := great rs w0 x3+4 ; rl. w0 g53. ; if not zonecommon then se w0 18 ; goto return; jl. a78. ; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 19 ; check zonecommon description: dl w1 x2+h34+2 ; sn w0 (x3+12) ; se w1 (x3+14) ; jl. a107. ; rl w0 x2+h34+4 ; se w0 (x3+16) ; a107: jl. w1 c8. ; goto message (<:common:>); jl. a78. ; return; <:common<0>:> ; ; return: a78: rl. w3 g22. ; w3:=saved external list index al w3 x3+4 ; external index:= jl. a108. ; external index+4 ; goto next common; ; create new common in common catalog: a79: rl. w1 g49. ; last used:=last used - entry size; al w1 x1-h28 ; quess: entry is common; rl. w0 g53. ; se w0 12 ; if entry is zonecommon then al w1 x1-6 ; entry size:=entry size-6 am. (g22.) ; if last used <= top external table+18 then sh w1 18 ; jl. a14. ; goto stack alarm rs. w1 g49. ; chain(last entry):=w1-w2; ws w1 5 ; rs w1 x2+h30 ; move name part of common list wa w2 3 ; w2:=address of new entry al w0 0 ; chain:=0 rs w0 x2+h30 ; dl w1 x3+2 ; to name part of common catalog; ds w1 x2+h32+2 ; dl w1 x3+6 ; ds w1 x2+h32+6 ; move length of common rl w1 x3+8 ; rs w1 x2+h33 ; rl. w1 g42. ; final value(common catalog) := common area length; rs w1 x2+h31 ; wa w1 x2+h33 ; common area length:=common area length rs. w1 g42. ; end; rl. w0 g53. ; sn w0 12 ; if common then jl. a76. ; goto set value in common list; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 20 dl w1 x3+14 ; move zonedescription ds w1 x2+h34+2 ; rl w0 x3+16 ; rs w0 x2+h34+4 ; jl. a76. ; goto set value in common list; ; search for zonecommon: a80: al w1 x1-1 ; no of zonecommons:= rs. w1 g44. ; no of zonecommons-1; rs. w3 g22. ; save external table index; al w1 18 ; set element length for check rs. w1 g53. ; jl. w2 c12. ; read 18 bytes from external list; rl w1 x3+16 ; replace externalno in list rl. w0 g18. ; by final value(external) sh. w1 (g24.) ; if external no > no of globals jl. a81. ; and externals rl. w0 g19. ; then begin base:=base rs-table ws. w1 g24. ; extno:=extno-globals and externals; end a81: am (1) ; else base := base external table; am x1 ; final value := table.base.extno; rl w0 x1-2 ; rs w0 x3+16 ; rl. w2 g41. ; w2:=first entry in zone catalog; jl. a73. ; goto try this entry in zonecatalog; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 21 ; next segment: a30: rl. w3 g12. ; sl. w3 (g23.) ; if processed >= program size then jl. a0. ; goto next area; al w3 x3+1 ; processed:=processed+1; rs. w3 g12. ; jl. w2 c1. ; input segment; rl. w1 g3. ; insegment:=insegment+1; al w1 x1+1 ; rs. w1 g3. ; sn w3 1 ; jl. a82. ; if processed <> 1 then jl. w2 c0. ; begin output segment; rl. w1 g8. ; outsegment:= al w1 x1+1 ; outsegment + 1; rs. w1 g8. ; end; a82: rl. w2 g1. ; absword address:=first core input; al w0 2.111 ; la w0 x2+e39-2 ; segment type := last word extract 3; sn w0 0 ; if segment type = 0 <*code*> then al w0 3 ; segment type := 3 <*rs*>; sn w0 3 ; if segment type = 3 <*rs*> then rs. w0 g61. ; version := 3; <*to prevent version alarm*> ; <*type 1 : prog, 2 : ext => version check*> bz w0 x2 ; rel of last point := hs. w0 i2. ; byte(absword addr); sl w0 e39 ; if rel > segm length - 1 then jl. c14. ; goto relative alarm1; bz w0 x2+1 ; rel of last absword := hs. w0 i1. ; byte(absword addr + 1); sl w0 e39 ; if rel > segm length - 1 then jl. c14. ; goto relative alarm1; \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 22 a31: am. (g1.) ; next absword: point addr := absword addr; i1 = k + 1 ; rel of last absword ; if absword addr >= sl w2 0 ; first core input + rel of last absword jl. a36. ; then goto next point; al w2 x2+2 ; absword addr := absword addr + 2; rl w0 x2 ; absword := word(absword addr); c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ds. w1 b20.+2 ; ds. w3 b20.+6 ; al w0 c44 ; test 4, absword as 2 bytes rl w1 x2 ; jl. w2 c19. ; z. ; end test; bl w3 0 ; w3 := external no := bits(0,11,absword); sz w3 -1<11 ; if bits(0,absword) <> 0 then jl. a32. ; goto abs own segment or common; sn w3 0 ; if external no = 0 then jl. a33. ; goto abs own core; bz w0 1 ; chain for rel := bits(12,23,absword); rl. w1 g18. ; w1 := base external table; sh. w3 (g24.) ; if w3 > no of globals and externals then jl. a37. ; begin ws. w3 g24. ; rs no := ext no - (no of globals + no of ext); sh w3 h35 ; if rs no >= first fortran special then jl. a42. ; begin jl. w1 c21. ; get value of rs extended; jl. a128. ; goto check chain; a42: am. (g39.) ; end else sl w3 +1 ; if rs no > no of std rs entries then jl. w1 c16. ; message (<:rs entry:>); rl. w1 g19. ; w1 := base rs table; a37: am x1 ; end; comment: w3 = external no; am x3 ; external index := al w1 x3 ; w1 + 2*external no; a128: sn w0 0 ; if chain for rel = 0 then jl. a34. ; goto abs external core; \f ; fgs.jz 1986.02.18 algol/fortran, pass 9, page 23 zl w3 x1-1 ; abs external and global segments: se w3 0 ; if rel part = 0 then jl. a43. ; begin <*special rs entry*> zl w3 x1-2 ; word (absword addr) := rs w3 x2 ; half1 (exttable (index-2)); al w3 0 ; rel part := 0; jl. a46. ; end else a43: zl w3 x1-2 ; begin <*segment*> ls w3 1 ; segment part := 2 * segment part add wa. w3 b11. ; 3<22; rs w3 x2 ; word (absword addr) := segment part; zl w3 x1-1 ; rel part := half2 (exttable (index-1)); ; end; a46: bz w1 1 ; next in chain: sl w1 e39 ; if rel > segm length - 1 then jl. c15. ; goto relative alarm2; wa. w1 g1. ; chain := chain for rel; bz w0 x1 ; chain for rel := byte(chain + first core input); hs w3 x1 ; byte(chain + first core input) := rel part; se w0 0 ; if chain <> 0 then jl. a46. ; goto next in chain; jl. a31. ; goto next absword; ; abs own segment or common: a32: bz w3 1 ; if bits(12.23,absword) = 0 then sn w3 0 ; goto abs own segment; jl. a84. ; ; abs common area: rl. w1 g45. ; w1:=commonlist start al w1 x1-4 ; bz w0 0 ; w0:=commonno + 1<12; la. w0 b13. ; w0:=w0 - 1<12 a83: al w1 x1+4 ; w1:=next in commonlist; sl w0 (x1) ; if commonno >= first no then jl. a83. ; take next common list element; ws w0 x1-4 ; absword:= ls w0 11 ; (commonno - first commonno(prec. element) ba w0 x2+1 ; *2**11 + rel; wa w0 x1-2 ; + rel to commonbase; wa. w0 b19. ; add 7<21 jl. a35. ; goto store absword; \f ; fgs.jz 1986.02.18 algol/fortran, pass 9, page 24 a84: rl. w3 g8. ; abs own segment: ws. w3 g27. ; curr segm := zl w0 0 ; outsegment - outbase; wa w0 6 ; abs word := la. w0 b13. ; ((curr segm + rel segm) extract 11 + wa. w0 g27. ; outbase) * ls w0 1 ; 2 + wa. w0 b11. ; 3<22 ; jl. a35. ; goto store absword; a33: wa. w0 g14. ; abs own core: wa. w0 g59. ; abs word := abs word + own base; jl. a35. ; absword := absword + corebase; ; goto store absword; a34: ; abs external core: zl w0 x1-1 ; absword := half2 (exttable (index-2)); se w0 0 ; if absword > 0 then jl. a51. ; goto normal external no; zl w0 x1-2 ; absword := half1 (exttable (index-2)); jl. a35. ; goto store absword; a51: rl w0 x1-2 ; absword := word (exttable (index-2)); a35: rs w0 x2 ; store absword: c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ds. w1 b20.+2 ; ds. w3 b20.+6 ; al w0 c45 ; test 5, new absword as 2 bytes rl w1 x2 ; jl. w2 c19. ; z. ; end test; jl. a31. ; word(absword addr) := absword; ; goto next absword; \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 25 a36: am. (g1.) ; next point: i2 = k + 1 ; rel of last point ; if point addr >= sl w2 0 ; first core input + rel of last point jl. a40. ; then goto finis update; al w2 x2+2 ; point addr := point addr + 2; c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ds. w1 b20.+2 ; ds. w3 b20.+6 ; al w0 c46 ; test 6, point as 2 bytes rl w1 x2 ; jl. w2 c19. ; z. ; end test; rl w0 x2 ; point := word(point addr); bl w3 0 ; w3 := bits(0,11,point); sz w3 -1<11 ; if bits(0,point) <> 0 then jl. a38. ; goto own point; ; external point: rl. w1 g18. ; w1 := base external table; sh. w3 (g24.) ; if w3 > no of globals and externals then jl. a54. ; begin ws. w3 g24. ; rs no := ext no - (no globals + no ext); sh w3 h35 ; if rs no >= first fortran special then jl. a44. ; begin jl. w1 c21. ; get value of rs extended; al w3 x1 ; goto set point; jl. a203. ; goto set point; a44: am. (g39.) ; end else sl w3 +1 ; if rs no > no of std rs entries then jl. w1 c16. ; message (<:rs entry:>); rl. w1 g19. ; w1 := base rs table; ; end; a54: am x1 ; end; am x3 ; external index := w1 + 2*w3; a203: rl w0 x3-2 ; point := external table(external index - 2); jl. a39. ; goto store point; \f ; fgs.jz 1986.02.18 algol/fortran, pass 9, page 26 a38: rl. w3 g8. ; own point: ws. w3 g27. ; curr segm := ea w3 0 ; outsegment - outbase; la. w3 b13. ; bits (0, 11, point) := wa. w3 g27. ; (rel segment + curr segm) extract 11 + hs w3 0 ; outbase; a39: rs w0 x2 ; store point: c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ds. w1 b20.+2 ; ds. w3 b20.+6 ; al w0 c47 ; test 7, new point as 2 bytes rl w1 x2 ; jl. w2 c19. ; z. ; end test; jl. a36. ; word(point addr) := point; ; goto next point; a40: dl. w3 g2. ; finis update: rx. w2 g6. ; rx. w3 g7. ; swap(first core input, first core output); ds. w3 g2. ; swap(last core input, last core output); jl. a30. ; goto next segment; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 27 ; input description for area i/0: g0: 0,0,0,0,0 ; name and name table address; 3<12 ; message: operation = input; g1: 0 ; first core input; g2: 0 ; last core input; g3: 0 ; insegment; g4: 0 ; inbase; ; output description for area i/o: g5: 0,0,0,0,0 ; name and name table address; 5<12 ; message: operation = output; g6: 0 ; first core output; g7: 0 ; last core output; g8: 0 ; outsegment; g27: 0 ; outbase; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 28 ; other variables: g11: 0 ; segment; g12: 0 ; processed; g13: 0 ; move; g14: 0 ; core base; g9: 0 ; program base; g15: 0 ; current entry address (in external catalog) g16: 0 ; first entry address - - - g17: 0 ; last entry address - - - g18: 0 ; base external table, save length of own core; g19: 0 ; base rs table; g20: 0 ; current program base<12 + current core base; g21: 0 ; saved entry address (in external catalog); g22: 0 ; saved external table index; g23: 0 ; program size; g24: 0 ; no of globals and externals; g25: 0 ; segment base for rs; g26: 0 ; first in cycle; g28: 0 ; first free core = first own g29: 0 ; rs segments; g30: 0 ; date 1; g31: 0 ; date 2; g32: 0 ; core length; g33: 0 ; core to copy; g34: 0 ; no of globals; g35: 0 ; no of externals; 0 ; prog call descr - 2 : 2<12 + entry point rs g36: 0 ; prog call descr : load length rs g37: 0 ; top special rs entries g38: 0 ; max no of globals + no of externals g39: 0 ; no of std rs entries g40: 0 ; first common entry address g41: 0 ; first zonecommon entry address g42: 0 ; length of common area g43: 0 ; no of commons g44: 0 ; no of zonecommons g45: 0 ; start of common list g46: 0 ; fortran, = 1 in case of fortran unit, else 0 g47: 0 ; address of catalog entry holding programdescription g48: 0 ; segmentno for first segment of next programunit g49: 0 ; address of last used byte in external catalog g50: 0 ; no of bytes copied to output g51: 0 ; segmentno for first segment of core picture g52: 0 ; no of bytes in core picture g53: 0 ; no of databytes g54: 0 ; no of zonedescriptionbytes; base name table \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 29 ;************** g54 : base name table, must not be separated from table ** ; table holding the 3 first characters of the catalog ; name for rs-no > h35. ; before using the characters is added <:aaa:>. ; after occurence of rs-no i, nametable(i) holds the ; final value. 1<23 + 11<16 + 12<8 + 11 ; h35+1+ 0 lml long * long 1<23 + 11<16 + 3<8 + 11 ; + 1 ldl long / long 1<23 + 8<16 + 15<8 + 8 ; + 2 ipi integer ** integer 1<23 + 11<16 + 15<8 + 8 ; + 3 lpi long ** integer 1<23 + 3<16 + 15<8 + 3 ; + 4 dpd double ** double 1<23 + 11<16 + 2<8 + 3 ; + 5 lcd long conv double 1<23 + 17<16 + 2<8 + 3 ; + 6 rcd real conv double 1<23 + 3<16 + 2<8 + 11 ; + 7 dcl double conv long 1<23 + 3<16 + 2<8 + 17 ; + 8 dcr double conv real 1<23 + 2<16 + 2<8 + 17 ; + 9 ccr complex conv real 1<23 + 3<16 + 0<8 + 3 ; +10 dad double + double 1<23 + 3<16 + 18<8 + 3 ; +11 dsd double - double 1<23 + 3<16 + 12<8 + 3 ; +12 dmd double * double 1<23 + 3<16 + 3<8 + 3 ; +13 ddd double / double 1<23 + 2<16 + 0<8 + 2 ; +14 cac complex + complex 1<23 + 2<16 + 18<8 + 2 ; +15 csc complex - complex 1<23 + 2<16 + 12<8 + 2 ; +16 cmc complex * complex 1<23 + 2<16 + 3<8 + 2 ; +17 cdc complex / complex 1<23 + 8<16 + 13<8 + 17 ; +18 inread 1<23 + 8<16 + 13<8 + 22 ; +19 inw inwrite 1<23 + 17<16 + 4<8 + 0 ; +20 rea read 1<23 + 22<16 + 17<8 + 8 ; +21 wri write g56: 0 ; <:rcrcrcrc<0>:> ; the last 9 characters of the name -1 ; kind and spec for rs-extended g57: <:aaa:> ; to be added to the name in the table g55: 0 ; no of rs entries g58: 0 ; rs segments < 12 + no of rs own bytes g59: 0 ; own base g60: 0 ; stepping stone used 0 ; for testoutput g61: 0 ; version g62: 0 ; addr of version entry in ext catalog \f ; fgs.jz 1983.12.28 algol/fortran, pass 9, page 30 ; working locations and constants : b5 : 0 ; current word address b11: -1<22 ; 2.110000000000000000000000 b12: 1<23 + 4 ; modekind = backing storage b13: 2047 ; 2.000000000000011111111111 b17: 1<22 ; the greatest common no b18: 1<23 ; program unit bit b19: 3<21 ; 2.011000000000000000000000, defines common 0 ; a110: 0 ; b22: 0, r.6 ; generated external cat entry: size, name, entry: b21=k+1 ; 9<18 ; kind and specs (integer variable, rs no) 0 ; - 4<12 ; 4<12 + start external list 0 ; code<12 + core b26: e106 ; pseudo entry in external catalog, final value: (see below) e103 ; base part (compiler version) 0 ; modekind <:*version<0>:> ; name 0 ; - 0 ; entry point e106 ; kind and specs (smallest version no in ext accepted) 0 ; - 0 ; 4<12 + start external list 0 ; code<12 + core b27: ; end label: b31: 4095 ; b33: <: rs proc<0>:> ; \f ; fgs.jz 1986.01.18 algol/fortran, pass 9, page 31 ; stepping stones to pass0 entries am -1000 ; jl. e7.+1000 ; stepping stone to pass0, end pass; e7= k-4 am -1000 ; jl. e19.+1002 ; - , print linehead; e19= k-6 am -1000 ; jl. e12.+1000 ; - , writechar e12= k-4 am -1000 ; jl. e13.+1000 ; - , writetext e13= k-4 am -1000 ; jl. e14.+1000 ; - , writeinteger; e14= k-4 am -1000 ; jl. e16.+1000 ; - , print byte, used in testoutput e16= k-4 am -2047 ; jl. e69.+2047 ; - , backing store fault; e69= k-4 ; pass 0 entries a109: 0 ; addr of e24. , fp result note a111: 0 ; value e9. - 4, used segments a112: 0 ; - e9. - 2, available segments a113: 0 ; - e9. + 4, last work for pass a114: 0 ; addr of e9. - 4, used segments a115: 0 ; - e17. , modebits word1 and word2 a116: 0 ; - e21. , gpa byte input descr a117: 0 ; - e20. , - output - a118: 0 ; - e59. , wait segment a119: 0 ; - e107. , name of rts a120: 0 ; - e8. , gpa output segment a147: 0 ; - e40. , boolean stop translation (sorry) \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 32 c0: ; output segment: am g5-g0 ; w0 := name address(output); skip next; c1: al. w0 g0. ; input segment: c10: ds. w3 b2. ; transfer: w0 := name addr(input descr); rs. w1 b0. ; save(w1,w2,w3); rl w3 0 ; w3 := name address; (=w0); a57: ; repeat: al w1 x3+10 ; w1 := message address; jd 1<11+h13 ; send message; al. w1 g10. ; w1 := answer address; jd 1<11+h14 ; wait answer; am (x1) ; sn w3 x3 ; if statusword <> 0 se w0 1 ; or result <> 1 then jl. e69. ; goto pass 0 backing store fault; am (x1+2) ; sn w3 x3 ; if no of bytes transferred = 0 jl. a57. ; then goto repeat; c. (:e15 a. 1<9:) - 1<9 ; if spec testoutput pass9 then jl. w2 c25. ; goto write (out, in- or out- mess and answ); z. ; dl. w3 b2. ; rl. w1 b0. ; restore(w1,w2,w3); jl x2 ; return; g10: 0,0,0,0,0,0,0,0 ; answer; b0: 0 ; saved w1; b1: 0 ; saved w2; b2: 0 ; saved w3; \f ; fgs.jz 1986.02.18 algol/fortran, pass 9, page 33 ; procedures c9: al w0 0 ; alarm1: w0 := 0; c7: rs. w1 b8. ; alarm: mess := false; c17: rs. w1 b30. ; message 1: mess1 := true; c8: ds. w0 b10. ; message: save(w0,w3); ; ; w0 maybe integer param ; w1 link, w1+2 text addr ; w2 not used ; w3 addr area name ; all registers are unchanged at return; rs. w1 b7. ; save return; jl. w3 e19.+2 ; print linehead; rl. w1 b9. ; w1 := saved w3; jl. w3 e13. ; writetext(entry name); jl. w1 c5. ; writespace; rl. w1 b7. ; restore(w1); al w1 x1+2 ; parameter text in return + 2; jl. w3 e13. ; writetext(parameter); rl. w1 a115. ; al w3 1<10 ; lo w3 x1+2 ; modebits2.warning := rs w3 x1+2 ; true ; al w3 1 ; rs. w3 (a147.) ; sorry := true; am. (b8.) ; if mess then se w3 x3 ; begin jl. a27. ; am. (b30.) ; sn w3 x3 ; if mess1 then jl. a65. ; begin rl. w0 b10. ; jl. w1 c5. ; writespace; jl. w3 e14. ; writeinteger (w0); 32<12 + 1 ; end; ld w0 100 ; ds. w0 b8. ; mess := mess1 := false; a65: dl. w0 b10. ; restore (w0, w3, w1); rl. w1 b7. ; return; jl x1 ; end; a27: rl. w0 b10. ; print result: sn w0 0 ; if saved w0 <>0 then jl. e7. ; begin jl. w1 c5. ; writespace; jl. w3 e14. ; writeinteger(result); 32<12+1 ; end; jl. e7. ; goto end pass; b30: 0 ; mess1 and b8 : 0 ; mess must be kept together b9 : 0 ; saved w3 b10: 0 ; saved w0 b7 : 0 ; saved w1 \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 34 ; procedures c15: al w0 x1 ; relative alarm2 : rel into w0 c14: al. w3 g0. ; relative alarm1 : name := name of area c13: jl. w1 c7. ; goto alarm (<:relative:>); 0 ; unused return; <:relative<0>:> ; 0 ; b24-2 : saved w0 b24: 0 ; b24 : saved w1 0 ; b25-2 : saved w2 b25: 0 ; b25 : saved w3 c16: ds. w1 b24. ; rs entry message: ds. w3 b25. ; save registers; al. w3 g0. ; w3 := addr name of input descr; rl. w0 b25. ; w0 := saved w3; <*rs no*> jl. w1 c17. ; goto message1 (<:rs entry:>, w0); jl. a64. ; return; <:rs entry<0>:> ; a64: dl. w1 b24. ; dl. w3 b25. ; restore registers; jl x1 ; return; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 35 ; procedure lookup in maincat and check: ; ; w0 irrelevant ; w1 ext cat.entry.tail part ; w2 link ; w3 ext table index ; all registers unchanged at return ; c6: ds. w1 b24. ; lookup in maincat and check: ds. w3 b25. ; bl w0 x3 ; sl w0 0 ; if first half in name < 0 then jl. a71. ; begin <*special rs entry*> al w2 x3 ; w2 := index in external table; wa. w0 g37. ; rs no (cat entry) := first half name signed + a45: hs. w0 b21. ; top special rs entries; dl. w0 b22.+2 ; move ds w0 x1+2 ; cat entry dl. w0 b22.+6 ; to ds w0 x1+6 ; tail dl. w0 b22.+10 ; area ds w0 x1+10 ; looked dl. w0 b22.+14 ; up; ds w0 x1+14 ; ds w0 x2+10 ; revise kind and specs in ext list; dl. w0 b22.+18 ; ds w0 x1+18 ; return; jl. a146. ; end; a71: jd 1<11+h12 ; look up entry; sn w0 3 ; if result = unknown then jl. a41. ; goto unknown entry; se w0 0 ; if result <> 0 then jl. a26. ; goto alarm (<:catalog:>); bz w2 x1-h1+h5 ; sn w2 4 ; if content <> 4 then jl. a146. ; begin rl w0 x1 ; if size >= 0 sh w0 -1 ; or content < 32 then sh w2 31 ; goto alarm (<:catalog:>); jl. a26. ; else al w0 h23 ; size := supposed size; rs w0 x1 ; end; a146: dl. w1 b24. ; restore registers; dl. w3 b25. ; jl x2 ; return; a149: ; prepare rs entry: rl. w1 b24. ; w1 := ext catalog.entry.tail part; rl. w2 b25. ; w2 := ext table.entry; al w0 1 ; w0 := rs entry := 1; jl. a45. ; goto move rs entry to tail part; a41: jl. w1 c8. ; unknown entry: jl. a149. ; goto prepare rs entry; <:unknown<0>:> ; message (<:unknown:>); a26: jl. w1 c7. ; catalog error: 0 ; unused return from alarm; <:catalog<0>:> ; alarm(<:catalog:>, result); \f ; fgs.jz 1985.09.26 algol/fortran, pass 9, page 36 c5: ds. w0 g10.+2 ; writespace: al w0 32 ; writechar(<space>); jl. w3 e12. ; dl. w0 g10.+2 ; jl x1 ; return; c2: rs. w1 b6. ; procedure update entry name: dl w1 x3+2 ; ds w1 x2+h2+2 ; move name part of current dl w1 x3+6 ; external to name part of ds w1 x2+h2+6 ; entry pointed at by w2; jl. (b6.) ; return; b6: 0 ; return ; c3: rs w0 x2+h0+2 ; procedure update entry value: rs. w1 b6. ; base part(entry) := w0; rs w0 x2+h0 ; value (entry) := w0; sn w0 -1 ; if w0 <> -1 then jl x1 ; return; rl w1 x2+h3 ; if entry point(entry) >= 0 then sh w1 -1 ; begin jl. a24. ; comment: core reference; zl w1 1 ; relative own base := wa w1 x2+h3 ; half2 (w0) + entry point (entry); sh. w1 (b31.) ; if relative own base > 4095 then jl. a68. ; begin al w0 x1 ; alarm ( jl. w1 c7. ; <:owns:>, relative own base); <:owns:> ; end; a68: wa. w1 g59. ; value (entry) := relative own base + own base; rs w1 x2+h0 ; return; jl. (b6.) ; end; a24: zl w1 x2+h3 ; segment reference: al w1 x1-1<11 ; half1 (value (entry)) := hs w1 x2+h0 ; half1 (entry point) - 1<11; zl w1 0 ; segment := current segment base + ea w1 x2+h0 ; half1 (value (entry)); sh. w1 (b31.) ; if segment > 4095 then jl. a69. ; begin al w0 x1 ; alarm ( jl. w1 c7. ; <:segs:>, segment); <:segs:> ; end; a69: hs w1 x2+h0 ; half1 (value (entry)) := segment; zl w1 x2+h3+1 ; half2 (value (entry)) := hs w1 x2+h0+1 ; half2 (entry point); jl. (b6.) ; return; \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 37 ; procedure next word from external list: c4: rx. w2 b5. ; if current word address <= am. (g1.) ; first core input+segment length-2 sh w2 e39-12 ; jl. a25. ; then goto get word; ; get next segment: zl w0 x2+1 ; save rel:=displacement of hs. w0 i3. ; word(current word address); sl w0 e39-10 ; if rel > segm length - 10 then jl. c14. ; goto relative alarm1; rl. w2 g3. ; insegment:=insegment+1; al w2 x2+1 ; rs. w2 g3. ; jl. w2 c1. ; input segment; am. (g1.) ; i3 = k + 1 ; save rel ; current word address := al w2 0 ; first core input + save rel; a25: rl w0 x2 ; get word: c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin am -1000 ; ds. w1 b20.+1002 ; am -1000 ; ds. w3 b20.+1006 ; al w0 c42 ; rl w1 x2 ; test 2, external list word jl. w2 c20. ; am 10 ; al w0 c42 ; rl w1 x2 ; jl. w2 c19. ; as halfs am 20 ; al w0 c42 ; rl w1 x2 ; jl. w2 c24. ; and chars as well; z. ; end test; al w2 x2+2 ; w0 := word(current word address); rx. w2 b5. ; current word address := jl x2 ; current word address + 2; return; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 38 b32: 0 ; saved w2, returnaddress ; procedure next element from external list: ; w1=no of words in actual element ; w2=returnaddress ; w3=start address for new element in core c12: rs. w2 b32. ; save returnaddress a106: jl. w2 c4. ; w0:=next word from external list rs w0 x3 ; store word al w3 x3+2 ; external table index:=external index +1 al w1 x1-2 ; no of words:=no of words-1 sl. w3 (g49.) ; if external index > last byte in catalog jl. a14. ; then goto stack alarm se w1 0 ; if no of words <> 0 jl. a106. ; then goto next element rl. w3 g22. ; jl. (b32.) ; goto returnaddress a14: rl. w3 g15. ; al w3 x3+h2 ; w3:=address of entry name jl. w1 c9. ; stack owerflow 0 ; unused return; <:stack<0>:> ; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 39 b29: 0 ; saved return; b23: 0, r.4 ; save registers; ; procedure rs extended: c21: rs. w1 b29. ; save returnaddress al w3 x3-h35 ; transform rs-no to index in name table ls w3 1 ; rl. w1 x3+g54. ; w1 := name table(rs-no) sh w1 -1 ; if w1 >= 0 then jl. a200. ; begin a202: al w1 x3+2 ; w1:=pointer to value + 2 al. w1 x1+g54. ; jl. (b29.) ; return ; end; a200: wa. w1 b18. ; w1 = 1<23 + name - <:aaa:> wa. w1 g57. ; rs. w1 g56. ; create name of head and tail al. w1 a201. ; set returnaddress from search in rs. w1 b28. ; catalog ds. w1 b23.+2 ; save registers ds. w3 b23.+6 ; al. w3 g56. ; x3 points to actual name rs. w3 g22. ; saved ext-index := address of name jl. a121. ; goto search catalog a201: dl. w1 b23.+2 ; restore registers dl. w3 b23.+6 ; rl. w1 g56. ; move value to name table rs. w1 x3+g54. ; jl. a202. ; goto set pointers \f ; fgs.jz 1985.09.26 algol/fortran, pass 9, page 40 ; procedure add bases to current bases (current bases, entry); ; ; call : return : ; ; w0 : current bases unchanged ; w1 : link destroyed ; w2 : addr curr entry addr curr ent ; w3 : not used - ; ; g20: current bases current bases + entry bases ; b. a1, b2 w. b0: 0 ; saved link; b1: 4096 ; limit segments b2: 4095 ; limit own bytes c23: rs. w1 b0. ; add bases: save link; zl w1 0 ; segment base := current bases.segments + ea w1 x2+h6 ; entry.code segments; sl. w1 (b1.) ; if segment base >= segment limit then jl. a1. ; goto overflow; hs. w1 g20. ; current bases.segments := segment base; zl w1 1 ; own base := current bases.own base + ea w1 x2+h6+1 ; entry.own base; sl. w1 (b2.) ; if own base >= limit then jl. a1. ; goto overflow; hs. w1 g20.+1 ; current bases.own base := own base; jl. (b0.) ; return; a1: al w1 -1 ; overflow: rs. w1 g20. ; current bases := (4095, 4095); jl. (b0.) ; return; e. \f ; fgs.jz 1985.12.19 algol/fortran, pass 9, page 41 c. (:e15 a. 1<9:) - 1<9 ; if spec test pass9 then begin ; procedure testoutput ; w0=test numbe ; w1=word to print ; w2=returnaddress c40 = 0, c41 = 1, c42 = 2, c43 = 3, c44 = 4, c45 = 5, c46 = 6, c47 = 7 b. a2, b1, d4 ; block procedure testoutput w. d0: 0 ; saved w0 d1: 0 ; saved w1 d2: 0 ; saved w2 (return) d3: 0 ; saved w3 d4: <:<10>test <0>:> ; test id c20: ds. w1 d1. ; print w1 as word: ds. w3 d3. ; save registers; al. w0 d4. ; jl. w2 a0. ; outtext (out, <:<10>test :>); rl. w0 d0. ; jl. w2 a1. ; outinteger (out, w0 in call); rl. w0 d1. ; jl. w2 a1. ; outinteger (out, w1 in call); am -1000 ; al. w2 b20.+1000 ; dl w1 x2+2 ; dl w3 x2+6 ; jl. (d2. ) ; return; \f ; fgs 1985.12.19 algol/fortran, pass 9, page 41a c19: ds. w1 d1. ; print w1 as halfs: ds. w3 d3. ; save registers; al. w0 d4. ; jl. w2 a0. ; outtext (out, <:<10>test :>); rl. w0 d0. ; jl. w2 a1. ; outinteger (out, w0 in call); zl. w0 d1. ; jl. w2 a1. ; outinteger (out, half1 (w1 in call)); zl. w0 d1.+1 ; jl. w2 a1. ; outinteger (out, half2 (w1 in call)); am -1000 ; al. w2 b20.+1000 ; dl w1 x2+2 ; dl w3 x2+6 ; jl. (d2. ) ; return; c24: ds. w1 d1. ; print w1 as chars: ds. w3 d3. ; save registers; al. w0 d4. ; outtext (out, <:<10>test :>); jl. w2 a0. ; rl. w0 d0. ; outinteger (out, w0 in call); jl. w2 a1. ; b0: al w2 32 ; jl. w1 a2. ; outchar (out, 'sp'); al w2 0 ; rl. w3 d1. ; char := next char; ld w3 8 ; rs. w3 d1. ; save remaining chars; sh w2 127 ; if char > 127 sh w2 31 ; or char < 32 then jl. b1. ; goto slut; jl. w1 a2. ; outchar (out, char); jl. b0. ; b1: am -1000 ; slut: al. w2 b20.+1000 ; dl w1 x2+2 ; dl w3 x2+6 ; jl. (d2.) ; return; \f ; fgs 1985.12.19 algol/fortran, pass 9, page 41b a0: am -2000 ; procedure outtext (out, text); am. (e23.+2000); jl w3 e34 -2 ; fp outtext (out, text); jl x2 ; end; a1: am -2000 ; procedure outinteger (out, integer); am. (e23.+2000); jl w3 e35 -2 ; fp outinteger (out, integer, layout); 1<23+32<12+9 ; jl x2 ; end; a2: rs w1 0 ; procedure outchar (out, char); am -2000 ; am. (e23.+2000); jl w3 e33 -2 ; fp outchar (out, char); rl w1 0 ; jl x1 ; end; e. ; end block testprocedure \f ; fgs 1985.11.05 algol/fortran, pass 9, page 41c b. a3, b1 ; procedure write (out, in- or out- mess and answ); w. ; begin c25: ds. w1 a1. ; save registers; rs. w3 a3. ; al. w1 b0. ; jl. w3 e13. ; write (out, <:<10>mess :>); rl. w1 a3. ; w2 := message address; jl. w3 e13. ; write (out, area name); el w0 x1+10 ; jl. w3 e14. ; write (out, operation); 32<12+3 ; rl w0 x1+12 ; jl. w3 e14. ; write (out, first address); 32<12+9 ; rl w0 x1+14 ; jl. w3 e14. ; write (out, last address); 32<12+9 ; rl w0 x1+16 ; jl. w3 e14. ; write (out, segment); 32<12+6 ; al. w1 b1. ; jl. w3 e13. ; write (out, <:<10>answ :>); rl. w1 a3. ; jl. w3 e13. ; write (out, area name); rl. w0 a0. ; jl. w3 e14. ; write (out, result); 32<12+3 ; rl. w1 a1. ; w2 := answer address; rl w0 x1 ; jl. w3 e14. ; write (out, status); 32<12+9 ; rl w0 x1+2 ; jl. w3 e14. ; write (out, halfs xferred); 32<12+9 ; rl w0 x1+4 ; jl. w3 e14. ; write (out, chars xferred); 32<12+6 ; dl. w1 a1. ; restore registers; rl. w3 a3. ; jl x2 ; return; a0: 0 ; saved w0 : result a1: 0 ; - w1 : answer addr a3: 0 ; - w3 : mess addr b0: <:<10>mess <0>:> ; b1: <:<10>answ <0>:> ; e. ; end procedure write (out, ...); z. ; end test; \f ; fgs.jz 1986.02.18 algol/fortran, pass 9, page 42 ; procedure initialize pass 0 entries c18: al w3 -2047 ; al. w1 x3+e24.+2047; rs. w1 a109. ; al. w1 x3+e9.+2047-4; rs. w1 a114. ; rl w1 x1 ; ; rs. w1 a111. ; rl. w1 x3+e9.+2047-2; rs. w1 a112. ; rl. w1 x3+e9.+2047+4; rs. w1 a113. ; al. w1 x3+e17.+2047; rs. w1 a115. ; al. w1 x3+e21.+2047; rs. w1 a116. ; al. w1 x3+e20.+2047; rs. w1 a117. ; al. w1 x3+e59.+2047; rs. w1 a118. ; al. w1 x3+e107.+2047; rs. w1 a119. ; al. w1 x3+e8.+2047; rs. w1 a120. ; al. w1 x3+e40.+2047; rs. w1 a147. ; al. w1 g0.+2 ; rs. w1 x3+g60.+2047; al. w1 g0.+6 ; rs. w1 x3+g60.+2047+2; jl x2 ; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 43 ; the following code is overwritten by pass 9 j1 = k - e0 ; define pass 9 entry (rel to first word pass9) j2: al. w0 g0. ; start pass: al. w1 g54. ; addr for testoutput of tables; ds. w1 a110. ; jl. w2 c18. ; initialize pass0 entries; rl. w1 (a115.) ; w1 := modebits word 1; sz w1 1<8 ; if result not supplied by fp is false then jl. a122. ; addr of result note := al. w0 j2. ; first free core; rs. w0 (a109.) ; a122: rl. w3 a113. ; w3 := last work for pass; rl w0 x3-2 ; first entry addr := rs. w0 g15. ; curr entry addr := rs. w0 g16. ; cont (last work for pass - 2); rl w0 x3 ; se w0 0 ; if program then jl. a136. ; begin rl. w3 g16. ; entry addr := first antry addr; a144: rl w0 x3+h8 ; while entry.chain <> 0 do sn w0 0 ; begin jl. a145. ; wa w3 1 ; entry addr := entry.chain; jl. a144. ; end; a145: rl. w2 g16. ; <*find last entry and link rts entry up*> al w2 x2-h7 ; entry := entry - h7; rs. w2 g49. ; last used := rs. w2 g17. ; last entry addr := entry; ws w2 7 ; rs w2 x3+h8 ; prev entry.chain := addr prev - adr entry; wa w2 7 ; al w0 0 ; rs w0 x2+h8 ; entry.chain := rs w0 x2+h9 ; entry.datapoint := 0; al w1 x2+h1 ; w1 := addr entry.tail part; rl. w3 a119. ; w3 := addr of name of rts; jl. w2 c6. ; lookup and check (w1, w3); \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 44 al w1 x1-h1 ; w1 := addr as for entry in ext cat; al w0 0 ; rs. w0 g3. ; insegment := 0; rl w0 x1+h4 ; ls w0 -18 ; se w0 15 ; if kindword1.kind <> 15 then jl. w1 c9. ; goto alarm (<:kind:>); jl. a139. ; <:kind<0>:> ; a139: bz w2 x1+h5 ; w2 := tail.content key; rl w0 x1+h1 ; sl w0 0 ; if tail.size < 0 then jl. a140. ; begin sh w2 31 ; if tail.content key > 31 then jl. a141. ; insegment := al w2 x2-32 ; tail.content key - 32; rs. w2 g3. ; a141: al w3 x1+h2 ; name addr := addr tail.docname; ; end; a140: jd 1<11+52 ; create area process (w3); se w0 0 ; if not created then jl. w1 c7. ; goto alarm (<:area:>, result); jl. a142. ; <:area<0>:> ; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 45 a142: rl w2 x1+h4 ; ls w2 6 ; ls w2 -6 ; no of entries := rs. w2 g55. ; kindword1.specs; ls w2 -1 ; al w2 x2-9 ; top special entries := rs. w2 g37. ; no of entries//2 - 9; rl w0 x1+h6 ; prog bases := rs. w0 g58. ; rs segments<12 + rs own bytes; al. w2 j2. ; rs. w2 g28. ; first free core := addr start pass; ea w2 1 ; base external table := rs. w2 g18. ; first free core + no of rs own bytes; rl. w0 g3. ; rs. w0 g25. ; segm base for rs := insegment; ea. w0 g58. ; insegment := rs. w0 g3. ; insegment + no of rs segments; rl. w2 g49. ; al w2 x2-2 ; last addr input := last used - 2; al w1 x2-510 ; first addr input := last addr input - 510; ds. w2 g2. ; rs. w1 g19. ; base rs table := first addr input; al. w2 g0.-h2 ; from to (name of area process, jl. w1 c2. ; name of pass9 input descr); rl. w3 a119. ; from to (name of gpa rts, rl. w2 g17. ; name of rts ext cat entry); jl. w1 c2. ; al w2 x3-h2 ; from to (name of pass9 input descr, al. w3 g0. ; name of gpa rts); jl. w1 c2. ; jl. w2 c1. ; input segment (rs table); rl w2 x3+8 ; move name table addr area process am. (a119.) ; to rs w2 +8 ; name table addr gpa rts name; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 46 ; <*move rs interface entries to pass9 names*> rl. w2 g19. ; index := al w2 x2-2 ; base rs table - 2 + wa. w2 g55. ; no of rs entries; rl w1 x2 ; own base := rs. w1 g59. ; rs table (index); al w2 x2-2 ; index := index - 2; zl w0 x2 ; w0 := segm part of prog descr addr; zl w1 x2+1 ; w1 := rel - - - - - ; ls w0 9 ; w0 := w0 * 512; wa w1 0 ; w1 := w1 + w0; am -1000 ; rs. w1 b3.+1000 ; prog descr addr := w1; al w2 x2-8 ; index := index - 8; rl w1 x2 ; no of std entries := rs. w1 g39. ; rs table (index); al w2 x2-2 ; index := index - 2; dl w1 x2 ; rs entry point := ds. w1 g36. ; rs table (index - 2, index); al w2 x2-4 ; index := index - 4; rl. w3 g17. ; dl w1 x2 ; last entry.final value := rts release; ds w1 x3+h0+2 ; last entry.base part := rts date; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 47 ; <*output of dummy rs segments gpa output*> zl. w1 g58. ; w1 := no of rs segments; a143: jl. w3 (a120.) ; repeat al w1 x1-1 ; output segment; se w1 0 ; w1 := w1 - 1; jl. a143. ; until w1 = 0; ; end <*program*>; ; <*finish gpa i/o operations*> a136: rl. w3 (a116.) ; w1 := addr gpa input descr; jl. w2 (a118.) ; wait segment; <*finish input*> rl. w3 (a117.) ; w3 := addr gpa output descr; jl. w2 (a118.) ; wait segment; <*finish output*> ; <*init pass9 i/o buffers and names*> rl. w3 a113. ; w3 := lastwork for pass; al w0 x3+2 ; first addr input := last work for pass+2; al w1 x3+512 ; last addr input := last work for pass+512; ds. w1 g2. ; al w0 x1+2 ; first addr output := last addr input + 2; al w1 x1+512 ; last addr output := last addr input + 512; ds. w1 g7. ; rl. w3 (a116.) ; from to (name gpa input descr, al. w2 g0.-h2 ; name pass9 input descr); jl. w1 c2. ; al. w2 g5.-h2 ; from to (name gpa input descr, jl. w1 c2. ; name pass9 output descr); \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 48 ; compute final value and ; programbase, core base in initial ; catalog. rl. w3 g16. ; w3:=first entry address rl. w0 g58. ; current bases := rs. w0 g20. ; rs segments<12 + rs own bytes; a92: rl w0 x3+h1 ; rep: se w0 0 ; if area length = 0 then jl. a93. ; begin rs. w3 g15. ; save w3 wa w3 x3+h6 ; w3:=address of main entry; al w0 0 ; shared entry:=true hs. w0 i6. ; end; a93: rl w0 x3+h0 ; se w0 0 ; if final value <> 0 then jl. a95. ; goto next in catalog; rl. w0 g20. ; base part:=current bases rs w0 x3+h0+2 ; al w2 x3 ; w2 := entry address; jl. w1 c23. ; add bases to current bases; ; shared: a94: bl w0 x3+h0+2 ; final value segm(current entry):= ba w0 x3+h3 ; program base(current entry) hs w0 x3+h0 ; + entry point segm(current entry); bl w0 x3+h3+1 ; hs w0 x3+h0+1 ; i6= k+1 ; shared entry, i=0, area entry, i=1; a95: se w3 x3+1 ; if shared entry then jl. a96. ; begin rl w0 x3+h0+2 ; w0:=program base, core base(current entry); rl. w3 g15. ; w3:=address of shared entry; rs w0 x3+h0+2 ; program base, core base(cshared entry) al w0 1 ; := program base, core base(main entry); hs. w0 i6. ; shared entry:=false; jl. a94. ; goto shared; ; end; a96: rl w0 x3+h8 ; sn w0 0 ; if chain <> 0 then jl. a97. ; begin wa w3 1 ; entry:=entry+chain; jl. a92. ; goto rep; ; end; \f ; fgs.jz 1983.05.17 algol/fortran, pass 9, page 49 ; move program segments to start ; of area. a97: rs. w3 g17. ; addr last entry := w3; rl. w2 (a113.) ; sn w2 0 ; if program then rs w0 x3+h1 ; last entry.size := 0; <*rts entry*> rl. w2 (a117.) ; w2 := addr gpa output byte descr; rl w1 x2+16 ; inbase := current gpa outsegment; al w1 x1+1 ; inbase := inbase + 1; sl. w1 (a112.) ; if inbase >= available segments then ws. w1 a112. ; inbase := inbase - available segments; rs. w1 g4. ; rl. w0 (a114.) ; rs segments:=used segments; rs. w0 g29. ; rl. w0 a112. ; w0:=available segments ws. w0 g4. ; move:=available segments - inbase; rs. w0 g13. ; al w1 0 ; segment:=0; a98: rs. w1 g11. ; save segment; rl. w3 g12. ; sl. w3 (g29.) ; if processed >= rs segments then jl. a103. ; goto end move; al w3 x3+1 ; processed:=processed+1; rs. w3 g12. ; rl. w0 g4. ; insegment:=inbase + segment; wa. w0 g11. ; sl. w0 (a112.) ; if insegment >= available segments ws. w0 a112. ; then insegment := insegment - avail segments; rs. w0 g3. ; \f ; fgs.jz 1986.03.06 algol/fortran, pass 9, page 50 jl. w2 c1. ; input segment; se w3 1 ; if processed <> 1 then jl. w2 c0. ; output segment; rs. w1 g8. ; outsegment:=segment; dl. w3 g2. ; rx. w2 g6. ; rx. w3 g7. ; swap(first core input, first core output); ds. w3 g2. ; swap(flast core input, last core output); rl. w0 g13. ; if move >= rs segments sl. w0 (g29.) ; then goto increase segment jl. a102. ; ; select segments: a99: wa. w1 g13. ; segment:=segment+move; a100: al w3 x1+1 ; test choise: sh. w3 (g29.) ; if segment < rs segments then jl. a101. ; goto next in cycle; sh. w3 (a112.) ; if segment < available segments then jl. a99. ; goto select segment ws. w1 a112. ; segment:=segment-available segment; jl. a100. ; goto test choise; a101: se. w1 (g26.) ; next in cycle: jl. a98. ; if segment=first in cycle then a102: al w1 x1+1 ; increase segment: rs. w1 g26. ; first in cycle:=segment:= ; first in cycle + 1; jl. a98. ; goto next in cycle; ; end move: a103: jl. w2 c0. ; output last rs segment \f ; fgs.jz 1983.06.20 algol/fortran, pass 9, page 51 rl. w3 (a113.) ; sn w3 0 ; if not program then jl. a137. ; am -2047 ; jl. a52.+2047 ; goto finis external; a137: al. w2 j2. ; base external table:= ea. w2 g58.+1 ; no of rs own bytes + rs. w2 g18. ; first frie core; el. w2 g58. ; next insegment := outsegment := rs. w2 g48. ; used segments := no of rs segments; rs. w2 g8. ; rs. w2 (a114.) ; rs. w2 g27. ; outbase := no of rs segments; rl. w2 g19. ; w2 := base rs table; al w0 0 ; al w2 x2-2 ; first common address:= rs. w2 g40. ; base rs table - 2; rs w0 x2 ; al w2 x2-2 ; first zonecommon address:= rs. w2 g41. ; base rs-table - 4; rs w0 x2 ; ; create pseudo entry in external catalog: al w2 x2-h7 ; last used := last used byte - entry size; al. w3 b26.+6 ; w3 := addr of name of pseudo entry; sh. w2 (g18.) ; if last used <= base external table then jl. w1 c9. ; goto alarm (<:stack:>); jl. a129. ; <:stack<0>:> ; a129: rl. w3 g17. ; w3 := addr last entry; rs. w2 g49. ; last used byte := rs. w2 g17. ; last entry addr := rs. w2 g62. ; addr of pseudo entry := last used; ws w2 7 ; last entry.chain := rs w2 x3+h8 ; addr (entry) - addr (last entry); wa w2 7 ; al w0 0 ; rs w0 x2+h8 ; entry.chain := rs w0 x2+h9 ; entry.datapoint := 0; al. w1 b26. ; w1 := index inpseudo entry; al w2 x2+h0 ; w2 := index in ext cat entry; a130: rl w0 x1 ; repeat rs w0 x2 ; ext cat (index) := pseudo (index); al w1 x1+2 ; increase indices; al w2 x2+2 ; se. w1 b27. ; until pseudo entry index = end index; jl. a130. ; rl. w3 g16. ; w3:=first entry address rs. w3 g15. ; save entry address am -2048 ; stepping jl. a55.+2048 ; goto start assembly \f ; fgs.jz 1983.06.20 algol/fortran, pass 9, page 52 0 ; zero to terminate segment j0 = k - e0 ; no of bytes in pass 9; e30 = e30 + j0 ; length := length + length pass 9; i. ; id list; e. ; end segment pass 9 m. jz.fgs 1987.06.04 alg/ftn, pass 9 i. ; id list; b. g1 ; begin block insertproc w. g0: g1: (:e30 + 511:) > 9 ; size 0, r.4 ; name s2 ; shortclock 0, 0 ; file, block count 2 < 12 + 4 ; content, entry e89 ; load length d. p. <:insertproc:> l. e. ; end block fpnames e. ; end block global \f ▶EOF◀