|
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: 122112 (0x1dd00) Types: TextFile Names: »ftnpass83tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »ftnpass83tx «
\f ;rc 21.08.72 fortran pass8 , v.59 \f ;rc 08.05.70 fortran pass8 page 1 ; names , contents and survey ;names , contents and survey: ;a-names: local references witin actions ;b-names: local variabels in actions ;c-names: global entries to actions and subroutines ;d-names: rs entry no ;f-names: global constants and variables ;g-names: base for a table or entry to a table relative to base ;j-names: global variabels ;contents: ; names and contents p 1 ; beginning p 3 ; code p 4 ; f-names p 18 ; interpretation p 21 ; switch to central actions p 20 ; central actions p 31 ; subroutines p 22 ; main control table p 44 ; continuation table p 47 ; macro instruction table p 54 ; skip instructions table p 55 ; external tab. and label tab.p 56 ; descr of labels from doloopsp 57 ; use of stack p 60 ; initiation p 61 ; survey: ;leading bytes from pass 7 is inbyted by next in(interpretation)and the ;corresponding table word in main control table is interpretated and the ;central action refered to in table word is called, this may effect ;call of code sequenses or interpretation of continuation table, macro ;instr. table or skip instr. table. \f ;rc 18.09.70 fortran pass8 page 2 ;names, contents and survey ;core store ; ! ! ! ; ! ! ! ; ! ! ! ; ! pass 9 ! ! ; ! information ! ! ; ! ! ! ; ! <--------------! -! ; ! ! ! ; ! ! ! ; ! ! ! ; ! ! ! ; ! ! ! ; ! ! ! ; ! ! ! ; ! external label ! ! ; ! ! table ! table !stack ! ; ! !------->!----------> <- - !------! ; ! ! ! ! ! ; ! ! ! ! ! ; ! ! ! ; ! pass 8 code ! ! ; !---------------------! - - -> ! ; ! ! ! ; ! ! ; ! ! ; !>------------------core store------------------------->! \f ;rc 21.08.72 fortran pass8 page 3 ;beginning ;beginning k=e0 s. a150, b92, c150, d22, f170, g110, j20; w. j5 ; length of pass 8 h. j6, 8<1+1 ; entry to pass 8, change direction w. e39=512 ;length of segments j20=-1 ;j20=1 for stacktop output else -1 j0 =1 ;j0=1 for testoutput else -1 j8= 12 ; bytes per external j9= 12 ; - - commen j10=18 ; - - zonecommen j11= 2 ; - - global j13=28 ; length of entry in init catalog j7=511 ; no of label 0 d0= 53 ; rs goto point d1= 13 ; rs last used d2= 3 ; rs reserve d3= 12 ; rs uv1 d4= 9 ; rs init zones d5= 29 ; rs param alarm (starray) d6= 17 ; rs index alarm (chlower) d7= 17 ; rs zone alarm (zreck) d8= 18 ; rs zone index (zindex) d9= 18 ; rs no of zones alarm (chzone) d10= 48 ; rs take expression d11= 52 ; rs alarm, undef label, segment, (labvarlist) d13= 49 ; rs dr1 d14= 50 ; rs dr3 d15= 20 ; rs syntax d16= 51 ; rs uv0 d17= 25 ; rs mult alarm d21=150 ; first fortran special rsno (see also pass7, pass9) d22= 22 ; number of fortran special rsno (see also pass7) d18=d21+d22-1 ; last rsno d19= 8 ; rs end addr expression d20= 10 ; rs release zones \f ;rc 09.08.71 fortran pass8 page 4 ;code ;code ;code sequenses jumped to from main table or continue table ;return to tab by f2. c119: ; gloentry al w1 a106 ; out segment, store return am 1000 ; stepping stone hs. w1 j17. ; jl. c110. ; a107: al w0 1 ; rs. w0 f39. ; boolean for not program rl. w1 f35. ; al w1 x1+2 ; rs. w1 f35. ; change in order to stop by sl-instr al w1 x1-6 ; 4 empty words rs. w1 f13. ; f13:=a:init catalog byte0, decreased for every entry rl. w1 f155. ; al. w1 x1+c0. ; upper limmit for catalog rs. w1 f40. ; rl. w1 e9.+4 ; unit pointer:=stack bottom al w1 x1+1 ; rs. w1 f66. ; jl. w3 e2. ; inbyte no of bytes in global list a100: ; unit: bl. w1 (f66.) ; w1:=no of entries wm. w1 f143. ; w1:=appetite ac w1 x1 ; rs. w1 f71. ; f71:= chain to main, changed for every entry wa. w1 f13. ; sh. w1 (f40.) ; if not room jl. b23. ; then goto stack error bl. w1 (f66.) ; ls w1 1 ; ac w1 x1 ; wa. w1 f66. ; rs. w1 f66. ; change pointer ,f66:=a:last entry rel al w1 x1-2 ; rs. w1 f64. ; f64:=a:program rel,changed to a:entry seg,rel bl w1 x1-1 ; ls w1 12 ; rs. w1 f73. ; save programseg, 0 a101: ; loop: for every shared entry rl. w1 f71. ; f71= chain to main al w1 x1+j13 ; sl w1 0 ; jl. a103. ; goto main entry rs. w1 f71. ; jl. w3 a102. ; goto commen for main and shared al w0 0 ; w1=a:init catalog rs w0 x1+6 ; fill byte 6,7 hs w0 x1+23 ; fill byte 23 rl. w0 f71. ; rs w0 x1+24 ; fill byte 24,25 jl. a101. ; goto loop \f ;rc 09.08.71 fortran pass8 page 5 ;code a103: jl. w3 a102. ; store common for main and shared rl. w3 f64. ; main entry: bl w3 x3+1 ; w3:=funitseg bs. w3 f73. ; al w3 x3+1 ; x1=a: init catalog hs w3 x1+24 ; fill byte 24 ba. w3 f73. ; rl. w2 f66. ; bs w3 x2-5 ; rs w3 x1+6 ; fill byte 6,7 bl w3 x2-4 ; hs w3 x1+23 ; fill byte 23 rl. w1 f66. ;finish unit: al w1 x1-6 ; rs. w1 f66. ; f66=a:no of entries sl. w1 (f35.) ; jl. a100. ;goto unit rl. w3 e9.+4 ;if stackpointer=stacktop rl. w1 f39. ;then finish rs w1 x3 ;w3=last byte of pass:= rl. w1 f13. ; 0 if program else 1 rs w1 x3-4 ; rs w1 x3-2 ; save ref to 1th main jl. (f2.) ;return a102: ;common for main and shared: rs. w3 b56. ;save return rl. w1 f64. ; al w1 x1+2 ; rs. w1 f64. ; f64:=a:entry point seg,rel j15=k+1 ; al w0 0 ;j13 is stored as operand al w1 j13 ; hs. w1 j15. ; ac w1 x1 ; wa. w1 f13. ; rs. w1 f13. ; ffirst:=ffirst-length rs w0 x1 ;fill byte 0,1 al w0 0 ; rs w0 x1+2 ;fill byte 2,3,4,5,25 rs w0 x1+4 ; hs w0 x1+25 ; a104: jl. w3 e2. ;loop: inbyte j16=k+1 ; hs w2 x1+21 ;operand=21,...8 bl. w3 j16. ;fill byte 21,...8 al w3 x3-1 ; a114: hs. w3 j16. ; sn w3 17 ; jl. a105. ;examine byte 18 and skip 16 and 17 se w3 7 ; jl. a104. ;goto loop al w3 21 ;after loop hs. w3 j16. ; rl. w0 (f64.) ;w1:=entry seg, rel ws. w0 f73. ;seg rel to programseg rs w0 x1+16 ;fill byte 16,17 al w0 8 ; hs w0 x1+22 ;fill byte 22 jl. (b56.) ;return to main or shared entry \f ;rc 06.11.71 fortran pass8 page 6 ;code b56: 0 ;saved return a105: al w0 0 ;examine kind = w2 sn. w2 (f152.); rs. w0 f39. ;if program then store 0 al w3 x3-2 ; jl. a114. ;goto loop c23: ;dataexist al w0 2 ; rs. w0 f67. ;dataexist:=2 for appetite jl. (f2.) ;return c26: ;entryvalue jl. w3 e2. ;w2:=inbyted no of entries rs. w2 f68. ;save no of entries al w2 x2-1 ; ls w2 1 ; rs. w2 f71. ;store w2=bytes for entry points wa. w2 f67. ; se w2 0 ; jl. (f2.) ; al w2 g60 ; if no data and main only rs. w2 f0. ; jl. (f2.) ; c25: ; check appetite and store entrypoints a26: rl. w2 f71. ; rep: wa. w2 f67. ;add 2 if dataexist al w2 x2+2 ;w2:=appetite for points and instr sl. w2 (f98.) ; jl. a35. ; if to many entries jl. w3 c97. ;goto test and change jl. a26. ;goto rep if change rl. w0 f67. ; se w0 0 ;if dataexist then jl. a27. ;goto code for data point a31: rl. w1 f26. ; rl w0 x1+2 ; w0:=last point ws. w1 f71. ; al w1 x1+2 ; ; update next point=f26 and do half down if nec. jl. w3 a45. ; al w2 0 ; f26=point no 0 ie. point before entry 1 a28: sl. w2(f71.) ;loop:store one point jl. a29. ;goto after loop al w2 x2+2 ; jl. w3 c87. ;w0:=segno, rel from stack ws. w0 f24. ;w0:=rel segno, rel wa. w0 f85. ;add point key am. (f26.) ; rs w0 x2 ; store point jl. a28. ;goto loop a29: ;after loop h.al w2 ,rl w1 x1 ; w.hs. w2 f1. ;instr:=rl w1 x1 rl. w1 f26. ; ws. w1 f23. ;w1:=point preceeding entry ;points rel to point base jl. f136. ;goto action 0 to store instr c112: rl. w1 f68. ; goto next if no of entries-1+data=0 wa. w1 f67. ; se w1 1 ; jl. (f2.) ; return to tab jl. c0. ; next in \f ;rc 26.10.70 fortran pass8 page 7 ;code a27: jl. w3 c85. ;datapoint:goto inrease ;labelno and init rl. w2 f90. ;increase no of globals al w2 x2+1 ; rs. w2 f90. ; hs w2 x1-1 ;store globalno in labeltab ls w2 12 ; wa. w2 f86. ;add key for point al w0 x2 ;w0:=point rl. w1 f26. ; jl. w3 a45. ; store point jl. a31. ;goto loop store point ; c24: bl. w0 f38. ;switch to continiation, table hs. w0 f13. ; rl. w1 f68. ;wo=-s:entryvalue al w1 x1-1 ; rs. w1 f71. ;save no of entries -1 rl. w2 f0. ; sh w1 0 ; al w2 g41 ; change return to tab for main entry only sn w0 0 ; al w2 g39 ;change return for subroutine rs. w2 f0. ; se w0 0 ; jl. (f2.) ;return to tab a33: sn w1 0 ;loop:for inbyte zeroes jl. (f2.) ;return to tab al w1 x1-1 ; jl. w3 e2. ;inbyte jl. a33. ;goto loop ; c18: ;get and check appetite, h.al w1,ba w0 x1 ;store ba instr and a:entry values w.hs. w1 f1. ; a32: rl. w2 f68. ;rep: al w2 x2+3 ;1 for round, 2 for bl instr jl. w3 c97. ;goto test and change jl. a32. ;goto rep if change rl. w1 f68. ; x1=no of values al w2 2 ; rs. w2 f64. ; length of constant jl. a76. ; a34: al w1 x2 ; loop: jl. w3 e2. ; inbyte -s:value hs. w2 f13. ; a76: al w2 x1-1 ; entry 1th loop sh w2 0 ; jl. a77. ; goto after loop rs. w1 f73. ; save no of s:value to be inbyted jl. w3 e2. ; hs. w2 f38. ; a77: rl. w2 f14. ; \f ;rc 78.03.02 fortran pass8 page 8 ;code al w2 x2+2 ; rs. w2 b20. ; store claimed a:constant jl. w3 c93. ; store constant rl. w2 f73. ; al w2 x2-2 ; rs. w2 f73. ; sl w2 1 ; jl. a34. ; goto loop ws. w1 f68. ; so w1 2.1 ; al w1 x1+1 ; add 1 if even no jl. f136. ; goto action 0 a35: jl. b23. ; error:to many entries <----------- ;entry point c22: rl. w2 f68. ;check appetite, rep: ls w2 1 ; wa. w2 f67. ;w2:=appetite for start instr. rs. w2 f71. ;save bytes for am instr. al w2 x2+4 ; save space for extlist:date and time jl. w3 c97. ;goto test and change jl. c22. ;goto rep if change jl. w3 c87. ; w0:=funitseg.,rel rl. w1 f68. ; hs w1 1 ; w0:=funitseg., no of entries jl. c47. ; stack and return ; c21: rl. w1 f71. ;count am instr. al w1 x1-2 ; rs. w1 f71. ; sh w1 0 ; jl. a142. ;goto next in al w0 g37 ; rs. w0 f0. ; jl. (f2.) ; a142: rl. w1 f67. ; se w1 2 ; jl. c0. ; jl. (f2.) ; if data then return to tab c10: rl. w1 f67. ; data jump to after formal sn w1 0 ; jl. a79. ; rl. w1 f68. ; jl. c9. ; store operand in skip instr a79: al w2 g61 ; no data: rs. w2 f0. ; jl. w3 c87. ; unstack label in declarations jl. (f2.) ; c20: ;labvarlist jl. w3 e2. ;inbyte and store no of labels sn w2 0 ; jl. c0. ; if emty list goto interprete next rs. w2 f71. ; al w0 d11 ; stack:=rsalarm+no of externals wa. w0 f78. ; ws. w0 f80. ; jl. w3 c86. ; c41: rl. w2 f71. ; al w2 x2-1 ; al w0 g56 ; sl w2 0 ;if no of remaining labels>0 then rs. w0 f0. ;repeat table word a40: rs. w2 f71. ;store remaining no of labels jl. (f2.) ;return \f ; fgs 1985.08.22 fortran pass8 page 9 ;code c17: ;cominit al. w1 b33. ;change operand type to rs. w1 f66. ; commonaddr. jl. (f2.) ; c12: ;complist rl. w1 f13. ;appetite:=6 x no labels +2 rs. w1 f71. ; wm. w1 f154. ; a56: al w2 x1+2 ;rep: am. (f98.) ; sh w2 -16 ; if appetite > usable part of segs - 16 then jl. a58. ; begin al. w1 b76. ; alarm (out, <:too many labels in comp goto:>; jl. e5. ; end; a58: jl. w3 c97. ; goto test and change; jl. a56. ;goto rep if change al w1 1 ; boolean true jl. a59. ; store boolean and return c46: rl. w1 f71. ;w1=remaining labels al w1 x1-1 ; sh w1 0 ; jl. a59. ; rs. w1 f71. ; al w1 g57 ;repeat table word rs. w1 f0. ; jl. (f2.) ;return a59: rs. w1 f97. ;boolean false for end complist or true for complist jl. (f2.) ;return b76: <:too many labels in computed goto<0>:> c29: ;label jl. w3 e2. ;w2:=inbyted labelno a67: jl. w3 c83. ;goto declare and store label, entry b74: rl. w1 f77. ; return for label, end format, new line: se w1 1 ; jl. (f2.) ; if not format return to tab a121: jl. w3 e2. ; else inbyte al. w1 a140. ; change return rs. w1 f2. ; se w2 g84 ; sn w2 g105 ; jl. c140. ; al w1 0 ; rs. w1 f77. ; rs. w2 b73. ; save inbyte jl. a99. ; goto a.20 to store goto, w1=0 b73: 0 ; saved inbyte a140: rl. w2 b73. ; get byte jl. c140. ; interprete c11: ; zoneinit rl. w1 f13. ; w1:=no of zones rl. w0 f0. ; se w1 0 ; al w0 g70 ; rs. w0 f0. ; jl. (f2.) ; else return to tab \f ;rc 78.05.16 fortran pass8 page 11 ;code c33: jl. w3 c87. ; save stack rs. w0 f73. ; jl. (f2.) ; c34: rl. w0 f73. ; stack saved stack c47: ; stack and return jl. w3 c86. ; jl. (f2.) ; \f ;rc 78.05.16 fortran pass8 page 12 ;code c38: ; xxchange: ; exchanges two labels in the stack ; (used for intermixing <goforw> and <gobackw> ) jl. w3 c87. ; rl w2 0 ; unstack (lab1); jl. w3 c87. ; unstack (lab2); rx w2 0 ; jl. w3 c86. ; stack (lab1); al w0 x2 ; jl. w3 c86. ; stack (lab2); jl. (f2.) ; return; c39: ; xxbackw: ; the stacktop contains a labelno to be declared with the current pos jl. w3 c87. ; rl w2 0 ; unstack (labelno); jl. w3 c83. ; declare and store label (labelno); jl. (f2.) ; return; c40: ; gobackw: ; the action should resemble action 22, with a non-decl label. ; the labelno is stacked rs. w1 f74. ; skip instruction := false; rl. w1 f2. ; rs. w1 f20. ; save return; jl. w3 c85. ; increase labelno and init; al w0 x2 ; jl. w3 c86. ; stack (labelno); am 2047 jl. b92. ; goto action 22; c42: ; store whole instruction: rl. w2 f0. ; al w2 x2-2 ; decrease (table pointer); rs. w2 f0. ; am 1000 ; wa. w1 x2+g86. ; f1 := word (table pointer) + w1; rs. w1 f1. ; (w1 rigth = address part) jl. c55. ; goto action 10; c43: ; prepare dogoforw: rl. w1 f13. ; am 2000 ; save opand-byte in hs. w1 b86. ; skip instruction; jl. (f2.) ; return; \f ;rc 78.05.16 fortran pass8 page 13 ;code c15: ac. w1 (f13.) ;sub, called from macro rs. w1 f13. ; rl. w2 b54. ; al w2 x2-2 ; jl. c102. ; c111: ; funit 7 jl. w3 e2. ; inbyte no of externals al w1 x2 ; jl. w3 e2. ; inbyte and store no of globals rs. w2 f80. ; wa w2 2 ; add reg1 rs. w2 f78. ; store no of globals+externals jl. w3 e2. ; inbyte and store no of labels rs. w2 f79. ; jl. w3 e2. ; jl. w3 e2. ; inbyte and store -stacksize hs. w2 f137. ; jl. w3 e2. ; hs. w2 f70. ; rl. w2 f70. ; al w2 x2-1 ; rs. w2 f70. ; jl. w3 e2. ; inbyte and store size param area rs. w2 f157. ; \f ;rc 17.11.70 fortran pass8 page 14 ;code al w0 1 ; rs. w0 f90. ; actual globalno al w0 0 ; rs. w0 f67. ; boolean false for data j12=k+1 ; se w0 0 ; if not 1th funit jl. w3 a95. ; al w0 0 ; al w1 x1+d18 ; no of externals + rs entries rl. w2 f89. ; w2:=start of ext. tab a109: sn w1 0 ; ext loop: w1=no of remaining externals jl. a110. ; goto after loop al w2 x2+2 ; al w1 x1-1 ; rs w0 x2 ; zero in ext.word jl. a109. ; goto ext.loop; a110: rs. w2 f91. ; w2:=start of lab tab rs. w2 f33. ; stacklimit=last byte of lab tab al w2 511 ; hs. w2 j12. ; rs. w2 f94. ; a80: ; loop: increase labno and init sn. w2 (f79.) ; jl. (f2.) ; return jl. w3 c85. ; w2:=labelno jl. a80. ; goto loop a95: al w0 3 ; hs. w0 j4. ; store in segment change jl. c100. ; goto segment change. return ; to funit c113: ; dataentry rl. w2 f94. ; w2:=labelno jl. a67. ; goto declare label and return c115: ;comzones jl. w3 c85. ;increase labelno and init tab rl. w1 f67. ;w1:=2 if data exist jl. w3 c82. ;w0:= segno, rel sn w1 2 ; jl. w3 c87. ;if data exist then w0 from stack rl. w3 f33. ;w3:= last byte of label table rs w0 x3-2 ; al w0 1 ; hs w0 x3-1 ;store globalno=1 in table jl. w3 c82. ;declare code start in w0 rs. w0 f70. ; al w1 0 ; hs. w1 f156. ; save programseg,0 jl. w3 c86. ;stack code start a98: al w2 4 ;creation time: rep: jl. w3 c114. ;goto extest and change, appetite=4 bytes jl. a98. ;goto rep if change rl. w1 f151. ; jl. a123. ;store creation time, return to tab. ; c117: rl. w1 f150. ; a123: rs. w1 f1. ; jl. c94. ;store creation date and time, return to tab \f ;rc 24.09.70 fortran pass8 page 15 ;code c116: ;unit al w2 4 ;rep: appetite jl. w3 c114. ;goto extest and change jl. c116. ;goto rep if change rl. w1 f141. ; rl. w0 f142. ; a125: hs. w1 f1. ; hs. w0 f37. ;store no of commens, jl. c94. ; no of zone commens c118: rl. w1 f80. ; rl. w0 f140. ; jl. a125. ; store no of globals,no of externals c120: ; end pass bl. w1 j2. ; pass inf1=no of max lines per block rs. w1 e9. ; pass inf2=no of half-up and -downs jl. e7. ; goto end pass c122: ; point w01 rl. w2 f13. ; w2:=paramno ls w2 2 ; hs. w2 f13. ; jl. w3 c87. ; w0:=stacktop rs. w0 b42. ; save in action 20 bl w2 1 ; w2:=rel al w2 x2+1 ; hs. w2 f38. ; litt2:=paramno*4, rel+1 jl. (f2.) ; return to tab. c121: hs. w1 j19. ; j19:=0 or 2 jl. (f2.) ; return to tab c125: ; suite jl. w3 e2. ; inbyte 0,1,2or 3, 3 for drstore hs. w2 b62. ; store in databack se w2 3 ; jl. c0. ; goto next in if not drstore jl. (f2.) ; c124: ; databack b62=k+1 ; al w0 0 ; operand is placed by suite al w1 g79 ; sn w0 3 ; rs. w1 f0. ; jl. (f2.) ; \f ;rc 78.05.08 fortran pass8 page 16 ;code ; appetite amodify: c134: al w2 2 ; rx. w2 f158. ; rs. w2 f159. ; save appetite sn w2 2 ; jl. (f2.) ; return to tab if not modifier wa w1 4 ; a129: al w2 x1 ; rep: jl. w3 c97. ; go test and change jl. a129. ; goto rep if change jl. (f2.) ; return to tab c135: rl. w2 f159. ; rs. w2 f158. ; get saved appetite jl. (f2.) ; return to tab c129: ; contform jl. w3 e2. ; hs. w2 f37. ; jl. w3 e2. ; hs. w2 f1. ; a116: al w2 2 ; appetite, store instr: jl. w3 c97. ; goto test and change jl. a117. ; goto after change and rep if change jl. c94. ; store instr and return a117: ; after change: jl. w3 c136. ; store instr=format cont. to next segment rl. w2 f73. ; return rs. w2 f1. ; store saved bytes jl. a116. ; c131: ; endform h.al w1 ,15<8+3 ; w.hs. w1 f131. ; jl. w3 c82. ; w0:=segno,rel rl. w1 f77. ; se w1 1 ; jl. w3 c86. ; if 1th format stack a:last instr al w1 1 ; rs. w1 f77. ; boolean:=1 for format jl. w3 e2. ; hs. w2 f138. ; f131:=15<20+2<12+no of words jl. w3 e2. ; hs. w2 f139. ; f132:=15<20+5<12+stacklength jl. (f2.) ; return \f ;rc 77.10.31 fortran pass8 page 17 ;code c132: ; begform closed(and open) am 2 ; store f132 rl. w1 f131. ; entry, store f131 rs. w1 f1. ; jl. a116. ; goto contform to store and appetite and return c130: ; begform closed h.al w1 , 15<8+2 ; w.hs. w1 f131. ; jl. (f2.) ; c133: ; amodify rl. w1 f13. ; al w0 4 ; bl w3 3 ; if integer < -2048 or integer >= 2048 then se w3 x1 ; jl. a126. ; index 2 bytes a127: rs. w0 f158. ; store appetite=4 or 8 al. w1 b29. ; rs. w1 f66. ; store operand type=byte al w1 1 ; rs. w1 f64. ; jl. w3 e2. ; inbyte opx2i jl. w3 e2. ; inbyte <-s: > am 2000 ; stepping stone hs. w2 b63. ; jl. c0. ; goto next in a126: al w0 8 ; index 2 bytes: appetite=8 al w1 0 ; rx. w1 f13. ; const=0 rs. w1 f160. ; saved index jl. a127. ; a128: rl. w1 f158. ; w1:=appetite; entry from a.0 if appetite>2 al w2 g91 ; se w1 4 ; al w2 g92 ; al w1 2 ; rs. w1 f158. ; jl. c1. ; goto interprete w2 c139: bl. w0 j19. ; if j19<>0 then get w3:=next stack al w1 g107 ; sn w0 0 ; rs. w1 f0. ; jl. (f2.) ; c137: ; locinit rl. w1 f13. ; wa. w1 f70. ; al w1 x1+1 ; array base=displ-stacksize+1+param area wa. w1 f157. ; rs. w1 f13. ; jl. (f2.) ; c106: ; pass7 jl. w3 e2. ; inbyte segment type hs. w2 j3. ; store in segment change routine rl. w3 f2. ; set return address rs. w3 b24. ; jl. c142. ; goto segment change routine c141: ; trouble operand jl. w3 e2. ; inbyte errous operand description jl. (f2.) ; return \f ;rc 09.08.71 fortran pass8 page17a ;code ;subroutines for speciel actions b57: rl. w0 b42. ; get absword:=key+rel seg ws. w0 f24. ; hl. w0 f117. ; wa. w0 f83. ; jl x3 ; b61: bl. w2 b71. ; se w2 0 ;if globalno=0 get next globalno jl x3 ; rl. w2 f90. ; al w2 x2+1 ; rs. w2 f90. ; increase no of globals hs. w2 b71. ; rl. w1 b71. ; rs. w1 (b72.) ; store globalno in labeltable jl x3 ; return b60: al w2 x2-j7 ; get tablewords to w01 for label no w2 ls w2 2 ; wa. w2 f91. ; dl w1 x2 ; ds. w1 b71. ; rs. w2 b72. ; jl x3 ; return \f ;rc 24.11.70 fortran pass8 page 18 ;f names ;f names ;global constants and working locations ;f0-f36 almost as algol pass8 f0: 0 ;table pointer to main, continue and macro table f1: 0 ;instruction being assembled f37=f1+1 ; f2: 0 ;return address from central actions and store instr. f7: 0 ;top instr, a:next instr. on segment f13: 0, 0, 0, 0 ;constants, max 8 bytes, latest constant input; init catalog f38=f13+1 ; f39=f13+4 ; f40=f13+6 ; f14: 0 ;lastconst., a:last const. on segment f15: 0 ;segment base, a:byte 0 on segment f20: 0 ;saved f2 f23: 0 ;pointbase, a: first const and 0th point f26: 0 ;must be f23+2, a: next point on segment f24: 0<12 ;current segment, 0. cur. seg =-1.-2.. f117=f24+1 ; f25: 0 ;last absw., a: last absvord on segment f27: 0 ;line block, a: next instr. where line inf. is to be packed f28: 0 ;prev line, line count of previous lineblock f29: 0 ;line alarm, a: doubleword where line inf is packed f31: 1<22-1 ;mask, used by set modifier. f32: 23 ;used by set modifier f33: 0 ;stack limit, a: last byte used for labels and globals f35: 0 ;stack top, a: first free stack word f36: 0 ;smallest top, smallest stack top yet used f64: 0 ;length of litteral; no of elementbytes in extlists; init catalog f66: 0 ;operand type, a: operand handling of action 0; extlists; init catalog f69=f66+1 ;f66 must be f64+2 f65: 0 ;wmx part of operand, 0; init catalog f67: 0 ;:=2 by dataexist,:=0 by funit 7 f68: 0 ; no of entries f70: 0 ;- stacksize, got from start of unit; 1 code segment,0 f71: 0 ;local variabel for counting f72=f71+1 ; f73: 0 ;local for saving f74: 0 ;:=2 if skip instr else =0 f75: 0 ;no of skipinstr f76: -1 ;all ones f77: 0 ;1 for store formats, else 0 f78: 0 ;no of globals and externals f79: 0 ;no of labels, got from start unit f80: 0 ;no of globals, got from start unit f81: ;key for absword, external/global f82: ;key for absword, rs-entry f86: 0 ;key for point, external/global/rs-seg. f83: ;key for absword, later local label f84: ;key for absword, common area f85: 1<23 ;key for point, later local label/entry points f89: j8 ; byte preceeding ext.table f90: 1 ;last used globalno, =1,2,;1 is reserved for datapoint f91: j8 ;byte preceeding labeltabel f92: 0 ;0 for do and 1 for implied do f93: -1<12 ;one in 12 first bits, used by goafter f94: 0 ;no of last label and global (p1) f95: 0 ;no of next global to be declared,doloops (p2) \f ;rc 78.04.13 fortran pass8 page 19 ;f names f96: ; 2 doublewords for rs entry table,bit=1 for segment 1<22+1<21+1<11+1<10+1<9+1<8+1<7;no 48,...,25 1<8+1<1+1 ; no 24,...,1 -1 ; no 96,...,73 -1<12+1<3 ; no 72,...,49 f97: 0 ;=1 during complist else 0 f98: -8 ;useable part of segment, start of run adds e39 f100: ; rs segment table,bit=1 for operands,0 for procedures -1 ; rs no 48,...,25 -1-(:1<8:) ; rs no 24,...,1 1<23+1<22+1<21+1<20+1<19+1<18+1<17+1<16+1<11+1<5+1<4+1<3+1<2; ; rs no 96,...,73 0 ; rs no 72,...,49 f101:jl. 0 ;goto f102:rl w3 x2-2 ; last used f106:am () ;used by ls, ld, sh, sl . . . f107:jl w3 x3+0 ;goto f108:rl.w3 () ;goto f110:aw. ;action 0 f111:aw () ;action 0 f114:jl x3+0 ;segment change, operand is stored f116:rl w1 ; f130= j7 ;0th label f131:15<20+3<12+0;beginformat open,changed by closed f132:15<20+5<12+0;beginformat,f132must be f131+2 f138=f131+1 ; f139=f132+1 ; f134: 2.1111 ;mask used by action 6 f135: jl. e2. ; inbyte, stepping stone f136: jl. b31. ; goto action 0, stepping stone f137=f70+1 ; f140: 0 ; no of externals f141: 0 ; no of commens f142: 0 ; no of zonecommens f143: j13 ; no of bytes per entry f150: 0 ; date*10 000 +monts*100 +year f151: 0 ; hours*100+minute f152: 1<11 ; b23: al. w1 e10. ; alarm(<:stack:>); jl. e5. ; b54: 0 ; saved table pointer for a:58 f153: jl. e8. ; out segment, stepping stone f154: 6 ; complist f155: g9 ; gloentry f156=f70+1 ; f157: 0 ; size param area, got from start unit f158: 2 ; appetite used by action0 f159: 2 ; saved appetite used be drload,drstore f160: 0 ; saved index, amodify f161: jl. a107. ; stepping stone for gloentry f162: h5 ; size of zone descriptor f163: f. -1.0 w.; (for truncate real to integer) f164: f. 0.5 w.; (for truncate real to integer) \f ;rc 04.11.70 fortran pass8 page 20 ;switch ;switch ;switches to central action=bit 18-23 of table word from main or continue ;table, by interpreter b0: ; switch to central actions jl. c50. ; 0: store instruction and operands jl. c51. ; 2: goto special code jl. c52. ; 4: store instr, inbyte rs entryno, store absword and ref jl. c53. ; 6: inbyte and store bytes, wmx part, 0-addr. jl. c54. ; 8: rs entryno from tab, store instr, ref and absw. jl. c55. ; 10: store instr., wmx, and constant operand jl. c56. ; 12: inbyte and stack word or byte jl. c57. ; 14: do nothing jl. c58. ; 16: check free bytes and contin. impl. jl. c59. ; 18: check free bytes, store next instr, store skip a99:jl. c60. ; 20: store goto, get segno, rel from stacktop jl. c61. ; 22: store goto, inbyte labelno jl. c62. ; 24: store goto, unstack labelno jl. c63. ; 26: externalno from stack, store instr, point and ref jl. c64. ; 28: store instr,absw. seg rel from a:20 jl. c65. ; 30: goto external, inbyte ext.no. jl. c66. ; 32: store instr,point. labelno. from stack jl. c67. ; 34: store instr,absword for inbyted extno(perm core) jl. c68. ; 36: store const in f13, addr and length=2 from tab jl. c69. ; 38: as 0, modify if necessary jl. c70. ; 40: as 8, rs=d0 jl. c71. ; 42: as 8, rs=d13 jl. c72. ; 44: as8, rs=d14 jl. c73. ; 46: read and send ext lists jl. c74. ; jl. c75. ; 50: as 20, with skip instr no = bit 0-1 jl. c76. ; 52: as 22, - - jl. c77. ; 54: as 24, - - jl. c78. ; 56: stack actuel segno, rel a75:jl. c79. ; 58: macroalgoritmes jl. c80. ; 60: store inst, wmx, const.op. and inbyted op. jl. c81. ; 62: store byte = bit 0-11 as opx0 \f ;rc 26.10.70 fortran pass8 page 21 ;interpretation c0: ; next in ; inbytes leading bytes from pass 7 jl. w3 e2. ; w2:=inbyte c140: sl w2 f130+1; f130 = no of 0th label jl. c3. ; goto stack label ls w2 1 ; c1: ; interprete al. w3 c0. ; prepare return, w2 = table rs. w2 f0. ; pointer (main or continue) bl. w1 x2+g0. ; f1 := bit 0-11 of table word hs. w1 f1. ; bl. w1 x2+g1. ; ad w2 -6 ; w1 := bit 12-17 of tab.w. ls w2 -18 ; w2 := bit 18-23 of tab.w. so w2 1 ; if not last in sequense then al. w3 c2. ; w3 := return to interprete next rs. w3 f2. ; w3 = return (=c2 or c0) jl. x2+b0. ; switch to central actions c2: ; interprete next rl. w2 f0. ; al w2 x2-2 ; table pointer := table pointer - 2 jl. c1. ; goto interprete ; c103: ; spec interprete move rl. w2 f0. ; al w2 x2-2 ; rs. w2 f0. ; move f0 = tab pointer ; c102: ; spec interprete bl. w1 x2+g0. ; f0 = pointer hs. w1 f1. ; f1 := bit 0-11 of tab.w. bl. w1 x2+g1. ; ad w2 -6 ; w1 := bit 12-17 of tab.w. ls w2 -18 ; w2 := bit 18-23 of tab.w. jl. x2+b0. ; switch to cental actions c3: al w0 x2 ; jl. w3 c86. ; stack labelno jl. c0. ; return to next in \f ;rc 27.01.71 fortran pass8 page 22 ;subroutines ; subroutines ; code sequenses jumped to from code or central actions, returns by w3 or f2 c88: ; w1,w2=appetite absword(w0,w2) rl. w1 f15. ; w0 = absword, w2 = appetite al w1 x1+2 ; a38: sh. w1 (f25.) ; rep: compare absword sn w0 (x1) ; to abswords of segment jl. a39. ; al w1 x1+2 ; jl. a38. ; repend a39: sh. w1 (f25.) ; am -2 ; ajust appetite for new absword al w2 x2+2 ; ds. w1 b16. ; save absw, absw. addr. jl x3 ; return,w1=wanted a:absword,w2=appetite 0 ; saved absword, point, m.m b16: 0 ; saved absword addr, point addr. c89: ; w1=store absword dl. w1 b16. ; get absw, addr. of absw. sh. w1 (f25.) ; if absw. addr <= last absw. then jl x3 ; return rs. w1 f25. ; last absw. := absword addr. rx w0 x1 ; sh. w1 (f26.) ; if absw.addr <= top point then jl x3 ; return,w1=a:absword rx w0 x1 ; c99: ; half down ; called from store absword and store point ds. w1 b25. ; save absw or point and addr. rl. w1 f7. ; ws. w1 f14. ; ls w1 -2 ; ls w1 1 ; displacement := left on segment //4 x 2 hs. w1 b17. ; store displacement. rl. w2 f14. ; w2 := addr. of moving part a41: sh. w2 (f26.) ; loop: top point = last jl. a42. ; word to be moved dl w1 x2 ; move doubw.(points and constants) b17=k+1 ; ds w1 x2+0 ; displacement is stored in ap. al w2 x2-4 ; jl. a41. ; goto loop a42: dl. w1 f26. ; ajust moveable part, entry from half up rs. w1 b91. ; save old next point address ba. w0 b17. ; ba. w1 b17. ; ds. w1 f26. ; point base and top point rl. w1 f14. ; ba. w1 b17. ; rs. w1 f14. ; last constant dl. w1 b25. ; rl. w2 b91. ; al w2 x2+2 ; if old next point address+2 >= sl. w2 (f25.); last absw address then rs. w0 (f25.); store w0 as last absw. al w0 1 ; pass inf2 wa. w0 e9.+2 ; rs. w0 e9.+2 ; jl x3 ; return b91: 0 ; saved old next point address \f ;rc 26.10.70 fortran pass8 page 23 ;subroutines c90: ; w1,w2=appetite point(w0,w2) rl. w1 f23. ; w1 := point base = 0th point a43: al w1 x1-2 ; loop: w1 = addr of point to comperation se. w1 (f26.) ; limit = top point = last point + 2 sn w0 (x1) ; jl. a44. ; jl. a43. ; goto loop a44: sn. w1 (f26.) ; al w2 x2+2 ; if new point ajust appetite ds. w1 b16. ; save point, point addr. jl x3 ; return,w1=a:point,w2=appetite a45: ds. w1 b16. ; entry c91: ; w1=store point dl. w1 b16. ; get point, point addr. al w2 x1-2 ; ws. w1 f23. ; sl. w2 (f26.) ; jl x3 ; if point = a stored point then return rs. w2 f26. ; new top point al w2 x2+2 ; if next point address+2 >= sl. w2 (f25.); last absw address then rx w0 x2 ; store point al w2 x2-2 ; sl. w2 (f25.) ; jl x3 ; return,w1=a:point jl. c99. ; goto half down c92: ; w2=appetite constant(w2) ds. w3 b19. ; save appetite and return rl. w1 f23. ; w1:=addr. of 1th stored const. rl. w2 f64. ; w2 := length (=2,4 or 8) dl. w0 f13.+2; w3-0 = 1th - 2nd word of const. al w1 x1-2 ; ; compare constant to constants already stored on seg a46: al w1 x1+2 ; loop: sn w3 (x1) ; addr. of stored const. jl. a48. ; goto 1th word matching a47: sh. w1 (f14.) ; limit = last const jl. a46. ; goto loop a49: wa. w1 f64. ; finish: al w1 x1-2 ; rs. w1 b20. ; stored claimed addr ws. w1 f14. ; rl. w2 b18. ; sl w1 0 ; wa w2 2 ; w2 := (ajusted) appetite jl. (b19.) ; return a48: sn w2 2 ; 1th word is matching: jl. a49. ; goto finish if length = 2 se w0 (x1+2) ; test 2nd word jl. a47. ; if <> goto next sn w2 4 ; jl. a49. ; if length = 4 goto finish dl. w0 f13.+6; w3-0 := word 3 and 4 se w3 (x1+4) ; test 3rd word jl. a47. ; se w0 (x1+6) ; test 4th word jl. a47. ; jl. a49. ; b18: 0 ; saved appetite b19: 0 ; saved return b20: 0 ; claimed addr. of const. \f ;rc 18.11.70 fortran pass8 page 24 ;subroutines c93: ; w1=store const ; returns w1th w1=a:const rel to ith const rl. w2 b20. ; get addr. of constant al w1 x2 ; ws. w1 f23. ; w1 := addr of const rel to 1th const. sh. w2 (f14.) ; jl x3 ; if const = stored const then return rs. w3 b19. ; save return rs. w2 f14. ; last const am. (f7.) ; test last const < top instr. sl w2 +2 ; <-- may be sl. w2 (f7) - - - jl. w3 c98. ; else goto half up dl. w0 f13.+2; w3-0 := 1th and 2nd word rl. w2 f64. ; w2 := length in bytes rs. w3 (f14.) ; store 1th word sn w2 2 ; jl. (b19.) ; return if 1 word sn w2 4 ; jl. a50. ; goto store am. (f14.) ; ds w0 -4 ; dl. w0 f13.+6; w3-0 := 3rd + 4th word a50: ds. w0 (f14.) ; jl. (b19.) ; return c98: ; half up ; called by store instr rl. w0 (f25.) ; prepare adjust moveable ds. w1 b25. ; part in half down rl. w1 f14. ; ws. w1 f7. ; w1 := claimed (neg) rs. w1 b20. ; wa. w1 f25. ; ws. w1 f26. ; w1 := - left on segment := ls w1 -2 ; claimed + last abs - top point ls w1 1 ; ws. w1 b20. ; w1 := displacement :=(- ; left on segment)//4 x2 ; - claimed (neg) hs. w1 b17. ; store displacement in half down hs. w1 b21. ; - - in half up rl. w2 f26. ; w2 := word to be moved-2 a51: sl. w2 (f14.) ; loop: jl. a42. ; goto ajust moveabel part in half down al w2 x2+2 ; rl w1 x2 ; move 1 word b21=k+1 ; rs w1 x2-0 ; jl. a51. ; goto loop c94: ; store instr ; store instr.word saved in f1 rl. w2 f7. ; al w1 x2-2 ; test top instr > last const sh. w2 (f14.) ; jl. w3 c98. ; goto half up sh. w1 (f27.) ; if top instr -2 <= line block then jl. w3 c101. ; goto store line inf rs. w1 f7. ; store new top instr addr rl. w0 f1. ; rs w0 x1+2 ; store instruction word \f ;rc 20.10.70 fortran pass8 page 25 ;subroutines c.j0 ; if in testing time rl. w2 e17. ; begin sz w2 1<5 ; if test mode then jl. c138. ; goto instr print z. ; end jl. (f2.) ; return c101: ; store line inf ; called from store instr ; linecounter uses the last 8 bytes of each segment: ; 13 bits: old linecount ; 16*5 bits: linecounts per 16 instr words(max31) ; 3 bits: 0 1 0 for linecount. al w0 x3 ; save return rl. w3 e6. ; rx. w3 f28. ; ws. w3 f28. ; w3 := line change = prev line - line count j2=k+1 ; max line change sl w3 0 ; store pass inf = max line change hs. w3 j2. ; sl w3 32 ; if line change >= 32 then al w3 31 ; line change := 31 al w2 0 ; w2-w3 = seg (line alarm addr) j1=k+1 ; ld w3 3 ; line inf shifts = 3+5+5... aa. w3 (f29.) ; ds. w3 (f29.) ; add line inf in bit pattn. rl. w3 f27. ; top of line block is al w3 x3-34 ; changed to next rs. w3 f27. ; bl. w3 j1. ; line inf shifts is al w3 x3+5 ; increased hs. w3 j1. ; sh w3 43 ; if line inf shifts <= 43 jl (0) ; then return al w3 0 ; else change alarm double- hs. w3 j1. ; word to next doubleword rl. w3 f29. ; al w3 x3-4 ; rs. w3 f29. ; jl (0) ; return c105: ; test ; called from test and change, extest and change wa. w2 f14. ; get w2 = appetite + last const ws. w2 f26. ; - next point wa. w2 f25. ; + last abs j19=k+1 ; 2 for last used to w3,else 0 al w2 x2+0 ; pointw01: :=2,last used: :=0 sh. w2 (f7.) ; check <= last instr. jl x3+2 ; return: no change jl x3 ; c97: ; test and change rs. w3 b24. ; save return jl. w3 c105. ; if test = change jl. c110. ; then goto segment change rl. w3 b24. ; else return jl x3+2 ; b24: 0 ; saved return \f ;rc 26.11.70 fortran pass8 page 26 ;subroutines c100: ; segment change ; called from test and change,funit and initiate. ;survey of segmentchange: ;save w01; fill unused points; ;get increment to constants and points(used by modifier); ; generate topword for segment; modify ref from instr to points and constants; ;store lineinf; store pass inf; change segment; ;save r:start of instructions on segment; initialize line inf and f-words; ;generate jump to next segment;get w01 and return by b24; rs. w3 b24. ; save return c110: ds. w1 b25. ; entry from check and change, and end pass ; save w0-w1 bl. w0 j19. ; if parameters se w0 0 ; jl. a131. ; generate get last used a132: rl. w0 f85. ; fill unused points: rl. w1 f25. ; fill from last abs to point top a61: sl. w1 (f26.) ; loop: jl. a60. ; al w1 x1+2 ; rs w0 x1 ; points := point key f85 jl. a61. ; a60: rl. w1 f23. ; al w0 x1+1 ; rs. w0 b26. ; store increment for constants ws. w1 f15. ; - ref to last byte of constants hs. w1 b27. ; store rel point base al w1 x1-2 ; w1 = last point rel to seg.base rl. w2 f25. ; ws. w2 f15. ; w2 = last abs rel to seg.base rs. w2 (f15.) ; segment byte(1) hs. w1 (f15.) ; segment byte(0) rl. w1 f15. ; modify ref. from instr. to al w1 x1+503 ; points and constants al w2 44 ; w1 := last inst on segment w2 := tab word h. al w0,ba w1 x3 ; w. jl. w3 a62. ; goto modify code -2<12 +0 ; table increment ; jl. w3 c101. ; store line inf: rl. w1 f7. ; addr. of 1th instr rel to seg ws. w1 f15. ; - used in jl instr. al w1 x1+2 ; hs. w1 f114.+1; instr = jl x3 + rel c48: ; change segment, entry from start c.510-e39 ; if short segment: w. rl. w3 f15. ; al w3 x3+e39 ; w3 := segment base := segment base + length bl. w1 j14. ; al w2 -1000 ; sn w1 a106 ; jl. 6 ; sh. w3 (x2+e20.-4+1000); if segment base <= last on segment jl. a66. ; goto after change z. ; end short segment ; \f ;rc 06.04.72 fortran pass8 page 27 ;subroutines j17=k+1-1000 ; j14=k+1 ; a106=f161-k ; jl. w3 f153. ; call gpa out segm. or global list c142: am -1000 ; called from directing byte pass7 rl. w3 e20.-2+1000; w3 := segment base a66: rs. w3 f15. ; after change: w3 = seg. base rl. w1 f28. ; initialize line inf: ld w1 30 ; 1th doub word(bit 1-17) := prev line ds w1 x3+e39-6 ; j3=k+1 ; segment type is stored (3 bits) al w2 2 ; w1 = 0; 2 is changed to 1 if external ds w2 x3+e39-2 ; 2nd doub word(bit 20-23) := type al w0 3 ; line inf shifts := 3 hs. w0 j1. ; al w1 x3+e39-2 ; addr of line inf. doub.word rs. w1 f29. ; al w1 x3+e39-36; rs. w1 f27. ; a: top instr of line inf block ; initialize f-words b27=k+1 ; rel point base, init =1/4 of segment al w1 x3+e39>3<1; al w2 x1-2 ; top point ds. w2 f26. ; init point base, top point rs. w2 f14. ; init last point rs. w3 f25. ; init last abs := seg. base bl. w1 f24. ; al w1 x1-1 ; hs. w1 f24. ; init current segment al w1 x3+e39-10; init top instr := last of segment - 4 words rs. w1 f7. ; rl. w1 f77. ; se w1 1 ; jl. a122. ; if not format continue al w1 3 ; else hs. w1 j4. ; no instr. ref to next segment bl. w1 f114.+1; rx. w1 f1. ; save bytes to be stored rs. w1 f73. ; prepare continue bytes:= h.al w1, 15<8+1 ; 15<8+1, rel to next segment w.hs. w1 f1. ; j4=k+1 ; a122: sh w0 3 ; w0 = 3, operand = 0 after seg.change jl. a55. ; no ref to next segment ; generate jump to next seg: rl. w1 f7. ; al w1 x1-4 ; 2 instr , 1 absword rs. w1 f7. ; al w3 x3+2 ; rs. w3 f25. ; rl. w2 f114. ; rs w2 x1+4 ; store jl x3 + rel ac w2 e39-14; op = (x3+e39-12) - (x3+2) hs. w2 f108.+1; rl. w2 f108. ; rs w2 x1+2 ; store rl. w3 a:abs. al w2 1 ; ls w2 12 ; wa. w2 f83. ; absword = key + 1 , 0 rs w2 x3 ; store absword \f ;rc 09.08.71 fortran pass8 page27a ;code a55: dl. w1 b25. ; get w0-w1 al w2 0 ; hs. w2 j4. ; after 1th segment := true jl. (b24.) ; return 0 ; b25: 0 ; saved w0-1 b26: 0 ; ref increment=a:1th point+1, used by modifier b66: 0 ; saved f1 a131: rl. w1 f102. ; generate get last used rx. w1 f1. ; rs. w1 b66. ; jl. w3 c136. ; store instr,return to a133 rl. w1 b66. ; rs. w1 f1. ; jl. a132. ; \f ;rc 05.05.70 fortran pass8 page 28 ;subroutines a62: ; modify:, called twice ; from segment change ; w2 = table word rel to g2 hs. w0 b51. ; w0 = 0, ba or bs w1 x3 a64: rs. w1 b28. ; next pattern: segment addr := w1; a57: rl. w0 x2+g2. ; normallize: w0 := modifier pattern := sn w0 0 ; modifier table(modifier index); jl. a63. ; if mod pattern <> 0 then ns w0 x3+1 ; begin call1 := distance to next; la. w0 f31. ; modifier table(modifier index) := rs. w0 x2+g2. ; normalized pattern - bit 22; b51: bs w1 x3+1; or ba; w1 := w1 +- distance to next; bl w0 x1 ; wa. w0 b26. ; segment byte(w1) := segment byte(w1) hs w0 x1 ; + ref increment; jl. a57. ; goto normalize a63: rl. w1 b28. ; end; w1 := segm addr; sh. w1 (f26.) ; if segm addr <= top point then jl x3+2 ; return; al w1 x1-23 ; w1 := segm add := segm addr - 23; ba w2 x3 ; w2 := modifier index := modifier index + call 0; jl. a64. ; goto next pattern; b28: 0 ; segm addr c96: rl. w1 f7. ; set modifier: w1 := top instr; ; called when instr. refers to const. or points ws. w1 f15. ; set byte modifier: w1 = top instr - 1. al w1 x1+26 ; w1 := w1 - segment base + 26; a65: al w0 0 ; set: w0 = bit position := w1 mod 23; wd. w1 f32. ; w1 := modifier index := w1//23 x 2; ls w1 1 ; al w2 1 ; ls w2 (0) ; modifier table (modifier index) wa. w2 x1+g2. ; := modifier table (modifier index) rs. w2 x1+g2. ; + 1 shift bit position; jl x3 ; return; ; modifier table page 100 ; instr print p 100 ; modifier table contains one bit for each byte on a segment, stored with ; 23 bits a word. the first part of the table corresponds to point bytes ; referencing constants*, the second part to instructions referencing points ; and constants. bit = 1 designates a byte to be modified with the final ; value of point base + 1. the bits are allocated like this: ;* not used in fortran ; bit 22 bit 0 ; g2: point base-23 point base-1 ; g2+2:point base-46 point base-24 ; g2+42: 480 458 ; g2+44: 503 481 ; modifier table page 100 ; instr print p 100 \f ;rc 14.12.70 fortran pass8 page 29 ;subroutines c86: ; stack(w0) rl. w1 f35. ; store w0 in stacktop and rs w0 x1 ; change stacktop pointer. al w1 x1-2 ; check for room rs. w1 f35. ; sh. w1 (f33.) ; jl. w3 b23. ; goto stack error am 2000 ; jl. a143. ; goto print stacktop ; c87: ; w0=unstack rl. w1 f35. ; al w1 x1+2 ; rs. w1 f35. ; change stack pointer rl w0 x1 ; w0 := stacktop. am 2000 ; jl. a146. ; goto print stacktop ; c82: ; w0=declare label al w0 2 ; wa. w0 f24. ; wa. w0 f7. ; ws. w0 f15. ; w0 := segno, rel jl x3 ; return ; c83: ; declare and store label ; store segno,rel in label table rs. w3 b22. ; store return jl. w3 c82. ; w0 := segno, rel al w2 x2-f130 ; w2 = labelno ls w2 2 ; wa. w2 f91. ; w2 := last byte of part of labeltab rs w0 x2-2 ; store segno, rel jl. (b22.) ; b22: 0 ; saved return ; c85: ; increase labelno and init rl. w2 f94. ; al w2 x2+1 ; rs. w2 f94. ; ajust labelno ; c84: ; tabel init rl. w1 f33. ; al w1 x1+4 ; sl. w1 (f35.) ; if last of lab.tab >= stacktop then jl. b23. ; goto alarm in stack rs. w1 f33. ; store new last of lab.tab. al w0 0 ; rs w0 x1-2 ; store bytes i lab.tab = 0 rs w0 x1 ; jl x3 ; return ; \f ;rc 09.10.70 fortran pass8 page 30 ;subroutines c9: am 1000 ; hs. w1 b53. ; store operand in used skip instr jl. (f2.) ; c107: rs. w3 b52. ; prepare skip instr c104: ; skip instr. ; called from action 18,50,52,54 rl. w1 f75. ; w1 := rel addr of skip instr or -1 sl w1 0 ; jl. a30. ; jl. w3 f135. ; inbyte skipinstr no ls w2 1 ; al w1 x2 ; w1:=r:skipinstr a30: al w1 x1+1000 ; rl. w2 x1+g103. ; rs. w2 f1. ; f1 := instruction rl. w1 b52. ; rs. w1 f2. ; f2 := saved return jl. c94. ; goto store instruction b52: 0 ; saved return c114: ;extest and change rs. w3 b55. ;save return jl. w3 c105. ;if test=change jl. a81. ;then goto prep. seg. change rl. w3 b55. ;else return jl x3+2 ; b55: 0 ;saved return a81: al. w3 a82. ;prepare seg. change: rs. w3 b24. ;store return after seg. ch. al w3 3 ; hs. w3 j4. ;no ref to next segment jl. c110. ;goto segment change a82: bl. w1 f114.+1;after segment change rs. w1 (f7.) ;store ref to next segment rl. w1 f7. ; al w1 x1-2 ; rs. w1 f7. ; jl. (b55.) ;return c136: ; store instr., return to w3 rs. w3 b68. ; al. w1 a134. ; rx. w1 f2. ; rs. w1 b69. ; jl. c94. ; goto store instr. b68: 0 ; saved w3 b69: 0 ; saved f2 a134: rl. w1 b69. ; rs. w1 f2. ; jl. (b68.) ; \f ;rc 78.05.08 fortran pass8 page 31 ;central actions ; centrale actions c50: ; 0: store instructions and operands ; entry: f1=instr and wmx , - ; w1=addr. modefication(usualy 0) ; f64,f65,f66=operand description ; f13,...,=operand ; action:test free bytes on segment for operand ; and instruction; ; store instr.,wmx ,operand and modification; hs. w1 f1.+1 ; rl. w1 f1. ; lo. w1 f65. ; only for bytes rs. w1 f1. ; f1 := instr + const. op. a5: rl. w2 f158. ; rep: w2:=appetite sn w2 2 ; if appetite amodify = 2 then jl. (f66.) ; switch to part of action 0; rl. w3 f0. ; bl. w1 x3+g1. ; if current table entry sz w1 1 ; is last in sequence then al w3 g96 ; table pointer := <do nothing> + <stop>; am +2000 ; hs. w3 b85. ; save table pointer in am-code; al. w0 a128. ; rs. w0 f2. ; set return to amodify code; jl. (f66.) ; switch to part of action 0 b29: ; operand = byte: jl. w3 c97. ; goto test and change jl. a5. ; goto rep if change rl. w1 f13. ; ba. w1 f1.+1 ; add 1th word of operand hs. w1 f1.+1 ; f1 := instr word jl. c94. ; store instr., return to (f2) b30: ; operand = litteral: jl. w3 c92. ; w2 := appetite constant jl. w3 c97. ; goto test and change jl. a5. ; goto rep if change jl. w3 c93. ; w1 := store const ws. w1 f7. ; ba. w1 f1.+1; jl. a135. ; b31: ws. w1 f7. ; entry a135: hs. w1 f1.+1 ; modulo 1<12 rl. w1 f1. ; lo. w1 f110. ; f1 := instr, wmx, modefication, ref. to op. and . rs. w1 f1. ; jl. w3 c96. ; goto set modifier jl. c94. ; goto store instr b75: ; operand= ext rl. w2 f13. ; get extno jl. c108. ; goto action 34 b32: ; operand = common: rl. w1 f1. ; lo. w1 f111. ; add ( ) rs. w1 f1. ; b33: ; operand = addr. of common: rl. w0 f13. ; wa. w0 f84. ; w0 := absword := operand + key jl. w3 c88. ; w2 := appetite absword jl. w3 c97. ; goto test and change jl. a5. ; goto rep if change b34: ; entry, entry a.20 rl. w1 f1. ; lo. w1 f110. ; add . rs. w1 f1. ; jl. w3 c89. ; w1:= a:stored absword b35: ws. w1 f7. ; entry hs. w1 f1.+1 ; f1 := instr, wmx, ref to abs-wmx incl. jl. c94. ; goto store instr, return via f2 \f ;rc 26.11.70 fortran pass8 page 32 ;central actions c51: ; 2: goto code ; entry: f1=a:code relative to f0 , - ; action:goto code; bl. w2 f1. ; jl. w3 x2+f0. ; x2=addr-f0 jl. (f2.) ; c52: ; 4: store instr, inbyte rs entry no, ; store absw. and ref. ; entry: f1=instr. and wmx , - ; w1=1 for rs gotopoint if rs segment ; 0 - takeexpr - ; f96,...,= rs table ; action:inbyte rs no; ; test free bytes on segment for absw.and instr. ; store absw. and instr. as follows: ; rs in corestore: ; <instr>.wx (r:absw for rs) ; rs on segments(relev. for instr jl): ; rl. w1 r: poinrw for rs ; <instr>. wx (r:a: for rs takeexp/gotop); jl. w3 f135. ; w2 := rs entry no=1,...,96 al w0 x2 ; b36: rl w1 0 ; entry from action 8, w1 := w0 := rs sl w1 75 al w1 x1+75-d21 sh w1 48 ; lookup in rs table = 2 double words jl. a23. ; bit = 1 for rs on segments al w1 x1-48 ; bit = 0 for rs in corestore am 4 ; a23: dl. w3 f96.+2; ac w1 x1-1 ; ld w3 x1 ; sz w3 1 ; jl. a24. ; goto rs on segments b67: wa. w0 f78. ; rs in corestore, w0 := absword + key, entry b82: ls w0 12 ; entry wa. w0 f82. ; a6: al w2 2 ; rep: jl. w3 c88. ; w2 := appetite absword jl. w3 c97. ; goto test and change jl. a6. ; goto rep if change rl. w1 f1. ; lo. w1 f111. ; add ( ) to instr. rs. w1 f1. ; jl. b34. ; goto action 0 a24: ; rs on segments: sl w0 49 ; am 4 ; dl. w3 f100.+2; ld w3 x1 ; rl w2 0 ; wa. w2 f78. ; w0=-(rsno,x1=rs-1(-48)) so w3 1 ; jl. a141. ; rs procedures ws. w2 f80. ; w2=rs+externals, operands: jl. b41. ; a141: ls w2 12 ; procedures rs. w2 f73. ; al. w2 a25. ; rx. w2 f2. ; rs. w2 f20. ; save old return al w0 d10 ; rs take expression jl. b36. ; goto store absw. and instr. a25: rl. w2 f20. ; rs. w2 f2. ; rl. w1 f116. ; rs. w1 f1. ; rl. w0 f73. ; get saved rs no jl. b47. ; goto a.26 to store point and instr \f ;rc 06.11.71 fortran pass8 page 33 ;central actions c53: ; 6: inbyte and store bytes wmx and op. kind ; entry: f1= wmx , -. w1=operand kind ; action:inbytes and store operand in f13,...; ; store operand descr.in f64,f65,f66; al. w2 b29. ; operand kind is represented sn w1 1 ; as addr. of entry in action 0 jl. a7. ; operand kind = byte al. w2 b75. ; sn w1 0 ; jl. a7. ; operand kind=external al. w2 b30. ; sh w1 16 ; jl. a7. ; operand kind = litteral al. w2 b32. ; operand kind = common a7: rs. w2 f66. ; store operand kind bl. w2 f1. ; ls w2 12 ; rs. w2 f65. ; store wmx part,0 la. w1 f134. ; w1 := length of operand rs. w1 f64. ; sh w1 1 ; jl. a8. ; get operand = byte only a9: al w1 x1-1 ; loop: inbyte length times and store jl. w3 f135. ; w2 := inbyte, hs. w2 x1+f13. ; se w1 0 ; jl. a9. ; goto loop jl. (f2.) ; return a8: jl. w3 f135. ; get and store byte b37: rs. w2 f13. ; entry jl. (f2.) ; return c54: ; 8: rs entry no from tab. or const, ; store instr, absw. and ref. ; entry: f1=instr. and wmx , - . w1=rs no ; action as action 4; al w0 x1 ; sn w0 0 ; rl. w0 f13. ; if const jl. b36. ; goto action 4, w0 = rs no c55: ; 10: store instr, wmx and const. op. ; entry:f1=instr and wmx, - . w1=operand ; action:test free bytes for instr on segment; ; store instr,wmx and operand; hs. w1 f1.+1 ; a10: al w2 2 ; rep: w2 := appetite jl. w3 c97. ; goto test and change jl. a10. ; goto rep if change jl. c94. ; goto store instr. \f ;rc 11.11.70 fortran pass8 page 34 ;central actions c56: ; 12: inbyte and stack word or byte ; entry: w1=no of bytes =1 or 2 ; action:inbyte and stack word or byte; jl. w3 f135. ; al w0 x2 ; w0 := 1th byte al w2 0 ; se w1 1 ; jl. w3 f135. ; w2 := 2nd byte or 0 hs w2 0 ; store in (byte 0) jl. a124. ; goto a.56 to stack and return c58: ; 16: check free bytes and contin. impl. ; entry:f1=a:next tab.word to be implemented+2 rel to g0 ; w1=no of wanted free bytes on segment ; action:test free bytes on segment; ; change table pointer; bl. w2 f1. ; rs. w2 f0. ; change next tabel implementation a11: al w2 x1 ; rep: w2 := appetite jl. w3 c97. ; goto test and change jl. a11. ; goto rep if change c57: ; 14: do nothing jl. (f2.) ; return c59: ; 18: check free bytes, ; store next inst., store skip ; entry: f1=a:skipinstr. rel to1th skipinstr or ; -1 if a*skipinstr is to be inbyted ; w1=no of wanted free bytes on segment ; next tableword=instrandwmx,operand<6+11 ; action:test free bytes on segment; ; implement next tablew.(ac.10); ; store skipinstr.; al w2 x1 ; rep: w2 := appetite jl. w3 c97. ; goto test and change jl. c59. ; goto rep if change al. w2 a12. ; rx. w2 f2. ; store return in f2 rs. w2 b52. ; store old f2 = return after skip bl. w1 f1. ; rs. w1 f75. ; store skip no jl. c103. ; goto interprete next tab. a12: jl. c104. ; return from store next instr. ; goto store skip instr. return in b27 \f ;rc 12.02.73 fortran pass8 page 34a ;central actions b42: 0 ; saved segmno,rel b48= b42+1 ; c60: ; 20: store goto, segno + rel from stack ; entry: stacktop=segno,rel ; action:test free bytes on segment for instr(and absw); ; store goto as follows: ; segno<>actual: jl. rel. ; segno<>actual: rl.w3 r:absw for segno ; jl x3+rel; rs. w1 f74. ; store if skip := 0 rl. w1 f2. ; rs. w1 f20. ; save f2 = return b38: jl. w3 c87. ; entry from action 50 ; w0 := segno, rel from stack b39: rs. w0 b44. ; entry from action 22, 24; w1 := rel a14: rl. w0 b44. ; rep: bl w1 1 ; ws w0 2 ; w0 := segno, 0 se. w0 (f24.) ; if segno <> actual segno then jl. a13. ; goto later segment rl. w2 f97. ; se w2 1 ; jl. a136. ; al w0 0 ; rs. w0 f1. ; jl. w3 c136. ; bl. w1 b70. ; a136: wa. w1 f15. ; goto, actual segment ws. w1 f7. ; sn w1 2 ; if jump to actual position jl. (f20.) ; no instr wa. w1 f101. ; rs. w1 f1. ; instr := jl. rel. al w2 2 ; wa. w2 f74. ; add 2 if skip instr jl. w3 c97. ; w2 := appetite, goto test and change jl. a14. ; goto rep if change jl. c94. ; goto store instr b40: jl. w3 c107. ; entry for action 50, 52, 54: jl. (f20.) ; store skip instr and return a13: ; later segment, goto rs. w0 b42. ; save segno wa. w1 f107. ; rs. w1 f1. ; instr := jl w3 x3 + rel a15: jl. w3 b57. ; rep: w0:=absw al w2 4 ; wa. w2 f74. ; add 2 if skip to appetite jl. w3 c88. ; w2 := appetite absw jl. w3 c97. ; goto test and change jl. a15. ; goto rep if change b43: ; entry from 22, 24 jl. w3 c136. ; store instr , return rl. w1 f74. ; se w1 0 ; jl. w3 c107. ; if skip then goto skipcode rl. w1 f108. ; w1 := rl. w3 rl. w2 f20. ; rs. w2 f2. ; rs. w1 f1. ; jl. b34. ; goto action 0 \f ;rc 11.11.70 fortran pass8 page 35 ;central actions ; 22: store goto, inbyte labelno ; entry: - ; action:inbyte labelno; get tablewords for label; ; test free bytes on segment for instr ; and (absw.) ; store goto as follows: ; label declared: as ac.20 ; lab not decl. : rl.w3 r:absw for globelno ; jl x3+chain ; , globalno and chain is stored in label table; b44: 0 ; tabel words: segno, rel b70=b44+1 ; 0 ; globalno, chain 0 ; a: last byte of table words b71=b44+2 ; b72=b44+4 ; c61: rs. w1 f74. ; entry, f74 := 0 for no skip rl. w1 f2. ; rs. w1 f20. ; save return b49: jl. w3 f135. ; entry from 52, w2 := labelno b45: b92=b45-2047 jl. w3 b60. ; entry from 24, get lable table bl. w2 b44.+1; w2 := rel se w2 0 ; if label is declared then jl. b39. ; goto action 20, w0 = segno, rel ; earlier label: jl. w3 b61. ; w2:=globalno al w1 -3 ; store -3 for labeltable a17: hs. w1 j18. ; store -3 or -1 , entry rl. w2 f107. ; w0-1 = tabel words rs. w2 f1. ; instr := jl w3 x3 a18: al w2 4 ; rep: wa. w2 f74. ; add 2 to appetite if skip bl. w3 b44. ; ls w3 12 ; w3 := segno, 0 se. w3 (f24.) ; note segno was stored when ; label was refered to jl. a19. ; goto generate absword ; label has been refered to from this segment jl. w3 c97. ; goto test and change jl. a18. ; goto rep if change bl. w2 b44.+3; get chain = a:r:absword wa. w2 f15. ; rs. w2 b16. ; store a: absw for dummy store absw. bl w3 x2+1 ; hs. w3 f1.+1 ; store absw. chain in instr. rl. w0 f7. ; ws. w0 f15. ; ba. w0 1 ; hs w0 x2+1 ; store instr chain in absword jl. b43. ; goto action 20 to store jl instr and rl instr a19: bl. w0 b44.+2; 1th ref to label on this segment ls w0 12 ; wa. w0 f7. ; ws. w0 f15. ; ba. w0 1 ; wa. w0 f81. ; w0 := absword := globalno or ext.no, a:r:next instr + key jl. w3 c88. ; w2 := appetite absword jl. w3 c97. ; goto test and change jl. a18. ; goto rep if change rl. w1 b16. ; ws. w1 f15. ; hs. w1 (b44.+4); store a:r:absw as chain \f ;rc 11.11.70 fortran pass8 page36 ;central actions rl. w1 f24. ; store actual segno in tab. ls w1 -12 ; am. (b44.+4); j18=k+1 ; hs w1 -3 ; jl. b43. ; goto action 20 to store jl instr, absw and rl instr c62: ; 24: store goto, labelno from stack ; entry: stacktop=labelno ; action:as ac.22; rs. w1 f74. ; f74 := 0 for no skip rl. w1 f2. ; rs. w1 f20. ; b46: jl. w3 c87. ; entry from 54, w0 := labelno rl w2 0 ; w2 := labelno jl. b45. ; goto action 22 c63: ; 26: externalno from stack, ; store instr, point and ref. ; entry: f1=instr and wmx , - ; stacktop=externalno ; action:check free bytes on segment forpointw and instr; ; store pointw and instr: ; <instr>.wmx r:pointw for extno; jl. w3 c87. ; w0 := unstack wa. w0 f80. ; add no of globals b58: ls w0 12 ; entry from 32: w0 := externalno, 0 b47: wa. w0 f86. ; w0 := point incl key, entry a73: al w2 2 ; rep: jl. w3 c90. ; w2 := appetite point jl. w3 c97. ; goto test and change jl. a73. ; goto rep if change b59: jl. w3 c91. ; entry from 32: w1 := a: stored point rel to point base jl. b31. ; goto action 0 to store instr \f ;rc 06.04.72 fortran pass8 page 37 ;central actions c64: ; 28: store instr,absw. seg,rel from a:20 ; entry: f1=instr and wmx , - ; word of action 20=segno, rel ; action:check free bytes; ; store: <instr>. wmx r:absw. for segno jl. w3 b57. ; rep: goto action 20 to get absword al w2 2 ; from stored segno jl. w3 c88. ; w2:=appetite absword jl. w3 c97. ; goto test and change jl. c64. ; goto rep if change jl. b34. ; goto action 0 to store instr ; and absword c65: ; 30: goto external. inbyte extno ; entry: - ; action:inbyte externalno; ; store: jl and absw, by ac.22; jl. w3 f135. ; inbyte operand external (not used) jl. w3 f135. ; inbyte extno b41: rl. w0 f2. ; entry from ac.4 rs. w0 f20. ; al w1 x2 ; wa. w1 f80. ; hs. w1 b44.+2; store in action 22 ls w2 1 ; wa. w2 f89. ; w2:= last byte preceeding exttab rs. w2 b44.+4; store in action 22 rl w0 x2 ; get tableword rs. w0 b44. ; store seg in action 22 hs. w0 b44.+3; store chain al w1 0 ; rs. w1 f74. ; no skip instr al w1 -1 ; j18:=-1 for ext table jl. a17. ; goto action 22 c66: ; 32: store instr,point. labelno from stack ; entry: f1=instr and wmx, - . stacktop=labelno ; action:check free bytes and store pointw and instr: ; pointw for globalno if label not declared ; - - seg,rel - - is - ; jl. w3 c87. ; w0:=stacktop=labelno rl w2 0 ; jl. w3 b60. ; get label table bl w3 1 ; w3:=rel se w3 0 ; jl. a108. ; goto label is declared; ; not declared: jl. w3 b61. ; get globalno to w2 al w0 x2 ; jl. b58. ; goto action 26 to store instr and point a108: ; declared: rl. w0 b44. ; rep: ws. w0 f24. ; wa. w0 f85. ; w0=rel segno, rel +key al w2 2 ; jl. w3 c90. ; w2:=appetite point jl. w3 c97. ; goto test and change jl. a108. ; goto rep if change jl. b59. ; goto action 26 to store instr and point \f ;rc 78.04.18 fortran pass8 page 38 ;central actions c67: ; 34: store instr,ref and absword for inbyted extno(permanent core) ; entry: f1=instr and wmx , - ; action:inbyte extno; test free bytes on segment ; store: ; <instr>.wx (r:absw for core store ext) jl. w3 f135. ; inbyte extno c108: al w0 x2 ;entry: wa. w0 f80. ; add no of globals jl. b82. ; goto action 4 c68: ; 36: store const in f13, ; addr. and length from tab ; entry: f1=a:constant rel to f0 , - ; w1=length (=2 or =4) ; action:get constant and store in f13 ; store operand descr. in f64,f65,f66; al w2 0 ; rs. w2 f65. ; wmx part := 0 rs. w1 f64. ; length := 2, got from tab al. w2 b30. ; operand kind := litteral = rs. w2 f66. ; addr. in action 0 bl. w2 f1. ; rl. w0 x2+f0. ; fo as stepping stone rs. w0 f13. ; store constant rl. w0 x2+f0.+2 ; rs. w0 f13.+2; jl. (f2.) ; return c69: ; 38: as 0, am if necessary ; entry: f1=instr and wmx, - ; w1=addr.modefication (0 or -4 usualy) ; f64,f65,f66=operand descr. ; f13,...,=operand ; action:if operand type<>commen or external and & no() in operand ; then goto action 0 ; else store f1, modegication ; am, operand rl. w2 f66. ; se. w2 b75. ; sn. w2 b32. ; jl. a68. ; operand =commen or external bl. w2 f65. ; w2=wmx part of operand so w2 1<2 ; jl. c50. ; goto action 0 a68: ; operand=commen ! () in operand hs. w1 f1.+1 ; f1=instr+instwmx,modefication a36: al w2 6 ; rep: jl. w3 c97. ; test and change jl. a36. ; goto rep if change jl. w3 c136. ; store f1 instr h.al w1, am ; w.hs. w1 f1. ; al w1 0 ; jl. c50. ; goto action 0 c70: ; 40: as 8, rs=d0 al w0 d0 ; jl. b36. ; goto a.4 c71: ; 42: as 8, rs=d13 al w0 d13 ; jl. b36. ; goto a.4 c72: ; 44: as 8, rs=d14 rl. w2 f158. ; al. w0 a128. ; se w2 2 ; if appetite>2 then rs. w0 f2. ; return:=ammodify code al w0 d14 ; jl. b36. ; goto a.4 \f ;rc 25.09.70 fortran pass8 page 39 ;central actions c73: ; 46: read and send ext lists ; entry: f1=a:no of elelments , - ; w1=no of bytes per element ; action:store list of elements, the bytes of ; the elements on the same segment; ; - used for globallists,externallists, ; commonlists, zonecommonlists specified by f1. rs. w1 f64. ; store no of bytes bl. w1 f1. ; rs. w1 f66. ; store type of list=a:elements sn w1 f80-f0 ; if global list jl. a83. ; no inbytes jl. w3 f135. ; inbyte, stepping stone jl. w3 f135. ; inbyte no of elements rs. w2 x1+f0. ; a84: rs. w2 f71. al. w3 a87. ; rx. w3 f2. ; save return rs. w3 f20. ; a85: rl. w2 f71. ; loop for elements: sn w2 0 ; jl. (f20.) ; return from action al w2 x2-1 ; rs. w2 f71. ; a86: rl. w2 f64. ; rep: appetite:=no of bytes in elements jl. w3 c114. ; goto extest and change jl. a86. ; goto rep if change rl. w2 f64. ; ls w2 -1 ; no of words in element rs. w2 f73. ; a87: rl. w2 f73. ; loop for words: sn w2 0 ; jl. a85. ; goto element loop al w2 x2-1 ; rs. w2 f73. ; rl. w1 f66. ; sn w1 f80-f0 ; jl. a88. ; if global list sn w1 f142-f0; jl. a89. ; if zone commen a90: jl. w3 f135. ; hs. w2 f1.+1 ; jl. w3 f135. ; a91: hs. w2 f1. ;f1:=inbyte2, inbyte 1 jl. c94. ; goto store instruction, return to word loop \f ;rc 16.11.70 fortran pass8 page 40 ;central actions a89: se w2 j10>1-1; zone commen: jl. a90. ; al w0 0 ; rs. w0 f1. ; jl. w3 f135. ; wa. w2 f80. ; add no of globals to external no hs. w2 f1.+1; jl. c94. ; return to loop a83: rl. w1 f91. ; prepare for global list: al w1 x1-1 ; w1:=ord byte al w2 x1 ; a92: al w2 x2+4 ; loop: sl. w2 (f33.) ;w1=:a last globalno=0 jl. a93. ; goto after loop bl w3 x2 ; se w3 0 ; jl. a92. ; al w1 x1+4 ; w2=a:globalno=0 dl w0 x1 ; update w1 and change ds w0 x2 ; jl. a92. ; a93: rs. w1 f13. ; after loop: store last a: globalno=0 rl. w2 f80. ; rs. w2 f13.+2 ; store last global no ; jl. a84. ; return to general lists a88: rl. w1 f13.+2; rl. w2 f67. ; sn w1 1 ; se w2 0 ; jl. a113. ; rs. w2 f1. ; globalno=1&no data jl. c94. ; store globalelement:=0 a113: rl. w1 f13. ; global list: get globalelement for al w2 x1 ; global no (f13.+2) a94: al w2 x2+4 ; bl w3 x2 ; se. w3 (f13.+2); jl. a94. ; al w1 x1+4 ; rl w0 x2-1 ; ws. w0 f70. ; sub 1th code segment rs. w0 f1. ; dl w0 x1 ; change ds w0 x2 ; f13=a:last sent global elem rs. w1 f13. ; rl. w1 f13.+2 ; al w1 x1-1 ; rs. w1 f13.+2 ; jl. c94. ; goto store instr \f ;rc 23.10.70 fortran pass8 page 41 ;central actions c74: ; 48: c75: ; 50: as20, skip no from tab. ; entry: f1=a:skipinstr relative to 1th skipinstr , - ; if f1=-1 then inbyte a:skipinstr ; action:check free bytes for skip and goto; ; store skipinstr and goto as in ac.20 - ; skipinstr preceeding jl instr. al. w0 b38. ; return to action 20 jl. b50. ; goto action 54 c76: ; 52: as22, skip no from tab. ; entry: as ac 50 ; action:as ac 50,22; al. w0 b49. ; return to action 22 jl. b50. ; goto action 54 c77: ; 54: as24, skip no from tab. ; entry: as ac 50 ; action: as ac 50,24; al. w0 b46. ; return to action 24 b50: al w1 2 ; entry am -1000 rs. w1 f74.+1000 ; f74 := 2 for skip instr := true am -1000 bl. w1 f1.+1000 ; sl w1 0 ; jl. a139. ; am -1000 jl. w3 f135.+1000 ; ls w2 1 ; al w1 x2 ; a139: am -1000 rs. w1 f75.+1000; f75:=a:skip instr rel to oth ; skip instr al. w2 b40. ; return to action 20, used am -1000 rx. w2 f2.+1000 ; for jump to actual segment am -1000 rs. w2 f20.+1000 ; jl (0) ; goto action 20, 22 or 24 \f ;rc 77.10.31 fortran pass8 page 42 ;central actions c78: ; 56: stack actual segno, rel ; entry: - ; action:stack actual segno,rel am -1000 jl. w3 c82.+1000 ; w0 := segno, rel a124: am -1000 jl. w3 c86.+1000; stack(w0) am -1000 jl. (f2.+1000) ; return c79: ; 58: macro algoritmes ; entry: f1=a:table entry for 1th instr , - ; action:analyse operand and choose one of two instr: ; if operandtype=litlength=1th byte=0 ; ! operand type=bytwmx=0 ; then choose 1th instr ; else 2nd instr; am -1000 bl. w2 f1.+1000 ; am -1000 rl. w0 f66.+1000 ; w0 := operand kind se. w0 b29. ; jl. a20. ; am -1000 rl. w1 f65.+1000 ; w1 := wmx part la. w1 b83. ; if x register = 0 then sn w1 0 ; jl. a21. ; goto use 1th table word a20: am -1000 rl. w1 f13.+1000 ; operand = byte x <> 0 ; ! operand <> byte se. w0 b30. ; jl. a22. ; goto use 2nd table word sh w1 2047 ; (byte-range is: -2047<=byte<=2047, sh w1 -2048 ; because of: subw1 const => al w1 x1-const) jl. a22. ; al. w0 b29. ; operand = short litt, change kind to byte op. am -1000 rs. w0 f66.+1000 ; jl. a21. ; goto use 1th table word a22: al w2 x2+2 ; a21: am -1000 rs. w2 b54.+1000 ; save table pointer store pointer to tab word am -1000 jl. c102.+1000 ; goto spec interpreter b83: 3<12 ; mask for x register c80: ; 60: store instr, wmx, const op. ; and inbyted op. ; entry: f1=instr and wmx , -. ; w1=modifier of operand(usualy=0) ; action:inbyte operand; add modifier; ; check free bytes for instr on segment ; store instr, wmx and operand; am -1000 jl. w3 f135.+1000 ; w2 := inbyte wa w1 4 ; w1 := w1+w2 = const op. + inbyted op am -1000 jl. c55.+1000 ; goto action 10 c81: ; 62: store byte = bit 0-11 ; entry: f1=operand ; action:store operand and operand specification: ; wmx=0, lentgh=1, type=byte; am -1000 rs. w1 f65.+1000 ; wmx part := 0 al. w1 b29. ; am -1000 rs. w1 f66.+1000 ; store op. kind := op. byte am -1000 ; bl. w2 f1.+1000; jl. b37. ; goto action 6 to store byte c.j0 ; if testing time c138: jl. c95. ; stepping stone z. ; \f ;rc 78.05.16 fortran pass8 page 44 ;main control table ; main control table ; each entry consist of 12 bit, 6 bit, 6 bit = action ; and it is interpreted by interpreter, action is jumped to by ; swich. interpretation of preceeding tab word when action is even ; contents of table ; inbyte no, name , no of bytes when>1 g1=k+1,h. ; g0:0,1 ; 0,not used g86=g0-1000 ; stepping stone c120-f0 , 3 ; 1, end 7 c106-f0 , 3 ; , pass7 ,2 g67 , 16 ; , unit 7 g68 , 16 ; , funit 7 , 8 g105=k>1-g0>1 ; g106 , 16 ; , newline g9=k-c0 ; c119-f0 , 3 ; , gloentry, list . last byte tobe saved for cat f141-f0 ,j9<6 +47 ; , comlist, list g69 , 16 ; , comzones, list f140-f0 ,j8<6 +47 ; , extlist, list g38 , 16 ; 10, entryvalue, list g35 , 16 ; , labvarlist, list g36 , 16 ; , entrypoint c113-f0 , 3 ; , dataentry c23-f0 , 3 ; , dataexist g77 ,12<6 +16 ; , suite, 2 0 , 57 ; , entry g83=k>1-g0>1 ; c29-f0 , 3 ; , label, 2 * g32 , 16 ; , locinit rl w1 , 1 ; , rlw1 c17-f0 , 2 ; 20, cominit g34 , 16 ; , zoninit , 6 g30 , 14<6 +16 ; , starray , 4 g101 , 16 ; , extzone , 3 0 , 1<6 +7 ; , opx0 , 2 aw x1 , 1<6 +7 ; , opx1 , 2 aw x2 , 1<6 +7 ; , opx2 , 2 aw x3 , 1<6 +7 ; , opx3 , 2 aw () , 1<6 +7 ; , opx0i , 2 aw (x2) , 1<6 +7 ; , opx2i , 2 aw (x3) , 1<6 +7 ; 30, opx3i , 2 0 ,18<6 +7 ; , opcommon , 3 0 , 0<6 +7 ; , opext ,2 0 , 2<6 +7 ; , , litt2 , 3 0 , 4<6 +7 ; , litt4 , 5 0 , 8<6 +7 ; , litt8 , 9 g104 , 59 ; , hlw1 hs w1 , 1 ; , hsw1 rs w1 , 1 ; , rsw1 g13 , 59 ; , loadw1 g14 , 59 ; 40, addw1 g15 , 59 ; , subw1 0 , 15 ; , (not used) b64:g93 , 16 ; , mulw1 changed if spill alarm g110 , 16 ; , divw1 \f ;rc 78.05.08 fortran pass8 page 45 ;main control table al w1 , 1 ; , alw1 ac w1 , 1 ; , acw1 g11 , 59 ; , lsw1 g12 , 59 ; , ldw1 g26 , 16 ; , notw1 g27 , 16 ; 50, notw01 la w1 , 1 ; , law1 g87 , 16 ; , law01 lo w1 , 1 ; , low1 g88 , 16 ; , low01 dl w1 , 1 ; , dlw1 ds w1 , 1 ; , dsw1 fa w1 , 1 ; , faw1 fs w1 , 1 ; , fsw1 fm w1 , 1 ; , fmw1 fd w1 , 1 ; 60, fdw1 aa w1 , 1 ; , aaw1 ss w1 , 1 ; , ssw1 g28 , 16 ; , signlong rl w0 , 43 ; , signdoub g16 , 59 ; , loadw0 g70=k-g0 ; initzones rl w3 , 1 ; , rlw3 rs w3 , 1 ; , rsw3 g17 , 59 ; , addw3 ds w1 ,d3<6 +9 ; , regtouv g66 , 16 ; 70, regtouv0 dl w1 ,d3<6 +9 ; , uvtow01 g80 , 16 ; , drload g81 , 16 ; , drstore g73 , 16 ; , draddr g64 , 16 ; , i conv l b65:g96 , 16 ; , l conv i ,changed if spill alarm ci w1 , 11 ; , i float r b84:g71 , 16 ; , r trunc i g65 , 16 ; , r conv c dl w1 , 43 ; 80, c trunc r g18 , 59 ; , shw0 g10 , 59 ; , shw1 g42 , 59 ; , slw1 sh w0 ,-1<6 +11; , shw0-1 \f ;rc 78.05.16 fortran pass8 page 46 ;main control table g29 , 6<6 +16 ; , relation , 2 g90 , +16 ; , amodify , 6 g25 ,14<6 +16 ; , chlower (room for: ls,sh,const,sh,const,jl,abs) g22 , +16 ; , zindex g21 ,16<6 +16 ; 89, zrechk g20 ,12<6 +16 ; , chzono 0 , 57 ; , xxforw 0 , 21 ; , goforw g78 , 4<6 +16 ; , databack 0 , 25 ; , gosimple -1 , 55 ; , goif , 2 -1 , 51 ; , go if forw , 2 rl w1 , 33 ; , prepjump c39-f0 , 3 ; , xxbackw c40-f0 , 3 ; , gobackw 0 , 31 ; , goexternal , 2 g75 , 16 ; 101,goformal g24 , 16 ; , complist , list rs w2 , 1 ; , boolean first := false wm w1 , 1 ; , domul g43 , 4<6 +16 ; , doclear (room for: se w2 (x2-rel), ld-65 ) g44 , 16 ; , do go forw c38-f0 , 3 ; , xxchange 0 , 15 ; , (not used) 0 , 15 ; , (not used) 0 , 15 ;110, (not used) 0 , 15 ; , (not used) 0 , 15 ; , (not used) 0 , 15 ; , (not used) 0 , 15 ; , (not used) 0 , 15 ; , (not used) g100 , 16 ; , parproc g99 , 16 ; , last used g76 , 2<6 +16 ;118, pointw01 , 3 rs w2 , d1<6 +9 ; , return g84=k>1-g0>1 c131-f0 , 3 ; , endformat , 3 c129-f0 , 3 ; , contform , 3 g89 , 16 ; , begform open, 3 c130-f0 , 2 ; , beg form closed, 3, continue jl w3 , 5 ; , gors , 2 jl w3 ,d15<6 +9 ;125, trouble c141-f0 , 2 ; 126, trouble operand ; modifier table w. g2: 0 ; modifier table, 23 words, described in set modifier r.23; j6=k-e0 ; entry pass8 jl. g82. ; stepping stone \f ;rc 21.08.71 fortran pass8 page 47 ;continuation table ; continuation table ; ; format as main control table, the name of the inbyte which ; uses a section is placed at the end of the section. interpreta- ; tion proceeds upwards. h. g39 , 16; al w0 x2 , 0; rs w0 x2 , -4<6 +10; g41=k-g0 ; entry for main entry only rl w1 x2 , -4<6 +11; c112-f0 , 2; goto next in if no.entries-1+data=0 g39=k-g0 ; return for main entry al w0 x2 , 10; c18-f0 , 2; code for entryvaluelist and ba rs w0 x2 , -4<6 +10; c24-f0 , 2; code for entry point list 0 , 1<6 +6; inbyte 1th -s:value g60=k-g0 ; after entry point tab g6 , 50; generate goto if snw10 ls w1 , 1<6 +10; c34-f0 , 2; stack saved stack c25-f0 , 2; code for appetite and place entry table jl , 40; rs goto point c33-f0 , 2; save stack 0 , 56; declare main entry c26-f0 , 2; code : if no.entries-1+data=0 goto g60 g38=k-g0 ; entry value rs w2 , d1<6 +9 ; jl w3 ,d20<6 +8; release zones jl w3 ,d19<6 +8 ; return from data c21-f0 , 2; code - returns to c0 0 , 56; stack entry point am , 1<6 +10; g37=k-g0 ; for am code c21-f0 , 2; goto next in if 1 entry only 0 , 56; stack entry point al w0 , 10; c22-f0 , 2; code for check appetite, and stack no of entries rl w2 , d1<6 +8; g13 , 58; load macro f70-f0 , 2<6 +36; litt2:=-stacksize jl w3 , d2<6 +8; rs w2 x1 , 10; ds w1 x2 , -2<6 +10; g13 , 58; load macro f157-f0 , 2<6 +36; litt2:=size param area rs w1 x2 ,-6<6 +10; g61=k-g0 ; no data c9-f0 , 2; ajust used skip instr g62 , 50; c10-f0 , 2; data jump to after formal g36=k-g0 ; entry point rl w1 , 27; c41-f0 , 2; rs w1 x2 , 60; inbyte operand,store instr g56=k-g0 ; c20-f0 , 2; g35=k-g0 ; labvarlist al w1 x2 , 11; g14 , 58; add c137-f0 , 2; g32=k-g0 ; locinit \f ;rc 1.4.71 fortran pass8 page 48 ;continuation table al w1 x1 , 1; -h5 , 62; al w0 , 1<6 + 10; c11-f0 , 2; goto next in if no of zones>0 0 , 1<6 +6; inbyte no of zones ds w1 , d3<6 +8; return from single zones al w1 x1 , 0; h5 , 62; store length of zonedescr. g16 , 58; 0 , 2<6 +6; inbyte bufsize rs w0 x1 , 0; h0+2 , 62; store addr. of bufsize al w0 , 60; rs w0 x1 , 0; h0 , 62; store addr. of no of shares rl w0 , 26; 0 , 1<6 +12; inbyte and stack external al w3 , 10; ds w0 x1 , 0; h4+2 , 62; store addr. of blockproc g59=k-g0 ; g59 , 4<6 +16; 2 instr,w3 jl w3 , d4<6 +8; rs init zones g34=k-g0 ; zoneinit al w3 , 61; inbyte typemask la w3 , 10; se w3 , 60; inbyte compare jl w3 , d5<6 +8; g31=k-g0 ; g31 , 10<6 +16; appetite for jump and w3 g4 , 50; skip, goto name ls w0 , -5<6 +10; g15 , 58; sub macro 0 , 1<6 +6; inbyte length jl. , 14<6 +10; 0 , 56; stack addr. of name rl w3 x1 , 10; ba w1 , 10; reg 0 rl w0 x1 , -2<6 +10; ws w0 x1 , 10; rl w1 x1 , 10; wa w1 , 6<6 +10; reg 3 g30=k-g0 ; starray am , -1<6 +11; -1 , 4<6 +19; inbyte skipno, store am and skip al w1 , 1<6 +10; g29=k-g0 ; relation jl. , 6<6 +11; g58 , 4<6 +19; check free bytes, store next and skip al w0 , 1<6 +10; g5 , 8<6 +18; g28=k-g0 ; sign long \f ;rc 78.05.16 fortran pass8 page 49 ;continuation table lx w1 , 1; f76-f0 , 2<6 +36; store litt2 = 2.11...1 g26=k-g0 ; not w1 lx w0 , 0; f76-f0 , 2<6 +36; store litt = 2.11...1 g27=k-g0 ; not w01 g10 , 59; sh code jl w3 , d6<6 +8; rs index err g25=k-g0 ; chlower sh w1 , 11; al w1 , 1<6 +10; k-g0 , 4<6 +16; sl w1 , 0; al w1 , 0; operand = no of labels k-g0 , 4<6 +16; as w1 , 2<6 +10; jl. x1 , -2<6 +10; c46-f0 , 2; 0 , 22; inbyte labelno, goto g57=k-g0 ; c12-f0 , 2; 0 , 1<6 +6; inbyte label no g24=k-g0 ; complist sh w1(x3), 1; h3+4 , 62; store addr. of record length sh w1 , 10; jl w3 , d7<6 +8; rs zone alarm wa w1 x3 , 0; h3 , 62; store addr. of record base g21=k-g0 ; zrechk sh w1 , 11; jl w3 , d8<6 +8; k-g0 , 10<6 +16; (check room for: sh, const, sh, jl, abs) wm w1 , 0; f162-f0 , 2<6 +36; store litt = h5 (size of zone descr) g22=k-g0 ; zindex bl w1 , 11; al w0 x1 , 1<6 +10; g18 , 58; sh code jl w3 , d9<6 +8; g20=k-g0 ; chzono \f ;rc 78.05.16 fortran pass8 page 50 ;continuation table se w2 (), 39 ; skip unless first time in doloop ld w1 , -65 ; clear w0w1 c42-f0 , 2 ; store next instruction g43=k-g0 ; doclear: g8 , 51 ; skip, goto after init; c43-f0 , 2 ; move opand-byte to skip instruction; g44=k-g0 ; do go forw: \f ;rc 78.05.16 fortran pass8 page 51 ;continuation table bl w0 , 2<6 +11; bl w0 , 10; g64=k-g0 ; i conv l ds.w1 () , 43; ld w1 , 0; 65 , 62; ds.w1 () , 44; g65=k-g0 ; r conv c 0 , 57; stack externallist entry c118-f0, 2; outbyte 1th head word c116-f0, 2; outbyte 2 nd head word f80-f0 ,j11<6 +46; global list g67=k-g0 ; unit 0 , 57;stack funitseg,rel c111-f0 , 2; code g68=k-g0 ;funit f142-f0,j10<6 +47;zonecommenlist c117-f0, 2;outbyte creationdate c115-f0, 2;data global and creationtime g69=k-g0 ;comzones rl w1 , 1 ; w01:=formals al w0 , 10 ; stack:=0 jl , 40 ; rs goto point g75=k-g0 ; goformal rl w0 , 29; ref to absw rl w1 , 0; c122-f0 , 2; litt2:=paramno*4, rel +1 0 , 2<6 +6; litt2:=paramno ds w1 x3 , 4<6 +10; c121-f0 , 2<6 +2; code j19:=2 g76=k-g0 ; point w01 g77 ,22<6 +17; c125-f0 , 2; g77=k-g0 ; suite \f ;rc 78.05.08 fortran pass8 page 52 ;continue table se w3 (), 1; jl. , -12<6 +10; g79=k-g0 ; se w3 () , 1; jl. , -6<6 +10; c124-f0 , 2; code: goto g79 if regstore=drstore g78=k-g0 ; databack dl w1 , 1; c135-f0 , 2; ds w1 , 44; dl w1 , -4<6 +38; c134-f0 , 6<6 + 2; (appetite amodify: rlw3,wa.w3,const,dlw1,ds.w1,abs,dlw1) ds w1 , 42; g80=k-g0 ; drload dl w1 , 45; ds w1 , 0; c135-f0 , 2; dl w1 , 42; ds w1 , -4<6 +38; c134-f0 , 6<6 + 2; (amodify appetite: rlw3,wa.w3,const,dsw1,dl.w1,abs,dsw1) g81=k-g0 ; drstore c132 -f0, 3; store f132 c132+2-f0, 2; store f131 c129-f0 , 2; as contform g89=k-g0 ; begform closed al w1 , 9; d14 , 62; w1:=a:dr g73=k-g0 ; draddr b85=k-2000 ; (continuation address after amodify) 0 , 16; goto continue after amodify code (often = g96) rl w3 x2 , 0; b63=k-2000 ; g91=k-g0 ; 0 , 62; 1 byte is stored=<-s:base>, entry for index=one byte wa w3 , 0; g92=k-g0 ; f160-f0 , 2<6 +36; litt2:=saved index, entry for index=two bytes c133-f0 , 3; goto code for appetite ect. aw x3 , 2<6 +6; litt2, x3 g107=k-g0 ; rl w3 x2 ,-2<6 +10; if parameter c139-f0 , 2; g90=k-g0 ; amodify wm w1 , 1; g93=k-g0 ; no spill alarm c135-f0 , 2; sh w1 ,-1<6 +10; am ,-1<6 +10; se w0 , 10; jl.w3 ,d17<6 +8; c134-f0 , 10<6 +2; (appetite amodify: rlw3,wa.w3,const,wmw1,shw1,am,sew0,jl,abs) g94=k-g0 ; g94 ,10<6 +16; g95=k-g0 ; mult la w1 , 1; c135-f0 , 2; la w0 , -2<6 +38; c134-f0 , 2<6 +2; (appetite amodify: rlw3,wa.w3,const,law1,law0) g87=k-g0 ; law01: lo w1 , 1; c135-f0 , 2; lo w0 , -2<6 +38; c134-f0 , 2<6 +2; (appetite amodify: rlw3,wa.w3,const,low1,low0) g88=k-g0 ; low01: \f ;rc 78.04.18 fortran pass8 page 53 ;central actions 0 , 15; nothing g96=k-g0 ; no spill alarm sh w1 ,-1<6 +10; am ,-1<6 +10; se w0 , 10; jl.w3 ,d17<6 +8; g97=k-g0 ; g97 ,10<6 +16; g98=k-g0 ; l conv i rl w3 , 11; w3 := sign (operand) sh w3 ,-1<6 +10; fm.w1 , 0; w0w1 := abs (operand) f163-f0 , 4<6 +36; (operand = floating -1.0) fs.w1 , 0; f164-f0 , 4<6 +36; (operand = floating 0.5) cf w1 , 10; w1 := entier ( abs (operand)) sh w3 ,-1<6 +10; ac w1 x1 , 10; w1 := ifix(operand) k-g0 ,22<6 +16; (room for whole sequence) g71=k-g0 ; r trunc i: cf w1 , 11; g72=k-g0 ; r conv i: rl w3 x2 ,-2<6 +11; c121-f0 , 0<6 +2; code j19:=0 g99=k-g0 ; last used rl. w1 , 27; 0 , 1<6 +12; 0 , 1<6 +6; inbyte operand external (not to be used) g100=k-g0 ; parproc al.w1 , 35; rs w1 , 0; aw x2 , 1<6 +6; inbyte stack rel g101=k-g0 ; extzone rs w1 , 9; d16 , 62; g66=k-g0 ; reg to uv0 b74-f0 , 3; goto label for format test e1-f0 , 2; g106=k-g0 ; new line bl w0 , 2<6 +11; extend sign bl w0 , 0<6 +10; from w1 to w0 wd w1 , 0; g110=k-g0 ; div w1 \f ;rc 06.11.70 fortran pass8 page 54 ;macro ; macro instruction tabel ; ; format as main and continuation table. entry is used for operand- ; byte and x = 0 or operand = short litteral, for other cases entry+2 ; is used (action 58). g10=k-g0 ; sh w1 sh w1 , 1; sh w1 ( ), 39; g18=k-g0 ; sh w0 sh w0 , 1; sh w0 ( ), 39; g42=k-g0 ; sl w1 sl w1 , 1; sl w1 ( ), 39; g11=k-g0 ; ls w1 ls w1 , 1; ls w1 ( ), 39; g12=k-g0 ; ld w1 ld w1 , 1; ld w1 ( ), 39; g13=k-g0 ; load w1 al w1 , 1; rl w1 , 1; g16=k-g0 ; load w0 al w0 , 1; rl w0 , 1; g14=k-g0 ; add w1 al w1 x1 , 1; wa w1 , 1; g17=k-g0 ; add w3 al w3 x3 , 1; wa w3 , 1; al w1 x1 , 1; g15=k-g0 ; sub w1 c15-f0 , 2; ws w1 , 1; g104=k-g0 ; hl w1 al w1 , 1; hl w1 , 1; \f ;rc 78.05.16 fortran pass8 page 55 ;skip instr ; skip instructions ; the first 16 instructions is used in relations and logical mask, addr. ; relative to g3 is inbyted. w. g3: so w0 1 ; g103=g3-1000 ; sh w0 0 ; g58=k-g3 ; se w0 0 ; signlong sh w0 -1 ; g7=k-g3 ; sl w0 0 ; dotest g62=k-g3 ; b53=k+1-1000 ; sn w0 0 ; entrypoint sl w0 1 ; sz w0 1 ; so w1 1 ; sh w1 0 ; g5=k-g3 ; se w1 0 ; signlong sh w1 -1 ; sl w1 0 ; g6=k-g3 ; sn w1 0 ; entryvalue sl w1 1 ; sz w1 1 ; g4=k-g3 ; so w0 2.11000 ; starray g8=k-g3 ; b86=k+1-2000 ; sn w2 (x2+0-0-0); skip if first do loop \f ;rc 85.09.30 fortran pass 8 page 55a ; test print a147: ds. w2 a118. ; al. w1 g108. ; a143=a147-2000 ; jl. 6 ; a148: ds. w2 a118. ; al. w1 g109. ; a146=a148-2000 ; ds. w0 a145. ; al w2 -2000 ; al w2 x2-1000 ; rl. w0 x2+e17.+3000; so w0 1<2 ; jl. a119. ; return if not details c.j20 ; if test mode then load w. jl. w3 x2+e4.+3000 ; write text bl. w0 a145. ; jl. w3 x2+e16.+3000; write contents of stacktop rl. w0 a145. ; jl. w3 x2+e16.+3000; rl. w0 x2+e9.+4+3000; write length of stack ws. w0 x2+f35.+3000; jl. w3 x2+e16.+3000; z. a119: dl. w2 a118. ; rl. w0 a145. ; jl. (a144.); return a144: 0 ; saved w3 a145: 0 ; saved w0 0 ; a118: 0 ; saved w1,w2 g108:<: stack<0>:> g109:<: unstack<0>:> \f ;rc 85.09.30 fortran pass8 page 55b ;subroutines c.j0 b. b12,a2 ; if test mode then load: w. c95: al w1 x1+2 ; instr print: return in f2, w0 = instr, w1 = addr - 2. ; called from store instr, ; writes:rel addr,segno, instr,wmx,operand,nl al w2 -2000 ; ws. w1 x2+f15.+2000; w0 := rel address := top instr + 2 - segment base; rx w1 0 ; w1 := instr; al. w2 x2+c0.+2000; w2 := stepping stone to gpa; al w3 10 ; rs w3 x2+e42-c0; print count := 10; jl w3 x2+e16-c0; print byte (rel address); am -2000 ; bz. w0 f24.+2000; jl w3 x2+e14-c0; write integer (current segm, 32<12 +6 ; blanks, max 6 positions); al w3 0 ; al w0 x1 ; w0 := instr; ld w0 6 ; w3 := basic operation part ls w3 1 ; * 2 rl. w1 x3+b0. ; rs. w1 b1. ; text1 := mnemonics (basic operation part); al w3 0 ; ld w0 3 ; w3 := w part and relative mark ls w3 1 ; * 2 rl. w1 x3+b6. ; rs. w1 b2. ; text 2 := w table(w3); rl. w1 b8. ; sh w0 -1 ; rl. w1 b9. ; end text := if relative mark then rs. w1 b5. ; <:)nl:> else <:nl:>; al w3 0 ; ld w0 3 ; w3 := indirect and xpart ls w3 1 ; * 2 rl. w1 x3+b7. ; rs. w1 b3. ; text3 := xtable(w3); rl. w1 b10. ; w1 := sign := <:+:>; sl w0 0 ; if displacement <0 then jl. a0. ; begin rl. w1 b11. ; w1 := sign := <:-:>; ac w0 (0) ; displacement := displacement a0: ls w0 -12 ; end; rs. w1 b4. ; text4 := sign; al. w1 b1. ; jl w3 x2+e13-c0; writetext (text1 to 4); jl w3 x2+e14-c0; writeinteger (displacement, nuls, max 4 pos.); 0<12 +4 ; al. w1 b5. ; jl w3 x2+e13-c0; writetext (end text); am -2000 ; jl. (f2.+2000); return; b1:0,b2:0,b3:0,b4:0,b5:0 ; text 1,...text 4, end text b6:<: w0.w0 w1.w1 w2.w2 w3.w3:>; w table b7:<: x1 x2 x3( (x1(x2(x3:>; x table b8:<: :>, b9: <:):> ; end texts b10:<:+:> , b11:<:-:> ; sign of displacement b0: <: 00 do el hl la lo lx wa ws am wm al ri jl jd je:> ; mnemonics <: xl es ea zl rl sp re rs wd rx hs xs gg di ap ul:> ; <: ci ac ns nd as ad ls ld sh sl se sn so sz sx gp:> ; <: fa fs fm ks fd cf dl ds aa ss dp mh lk ix 62 63:> ; e.z. ; end test mode \f ;rc 07.07.70 fortran pass8 page 56 ;ext tab and lab tab w. j8 =k+1 ;a:byte preceeding external table ;external table ;the table consists of 2 bytes per externalno and per rs entry: ; ; ! ! ! ! ; !ext -------------------------------------------------------- ; !no ! seg. for last ref. to ext.! g:absword ! ; v -------------------------------------------------------- ; ! ! ! ; ;the table is placed and initiated for every program unit. ;label table ;the table consists of 4 bytes per program label and per pass8 label ; ; ! ! ! ! ! ; ---------------------------------------------------------- ! ; ! segno ! rel ! globalno ! g:absword! ! lab ; ---------------------------------------------------------- ! ; ! ! ! ! ! v no ; ;the table bytes for the programlabels(given by pass5) is placed and ;initiated; pass8 labels(used in doloops and data) gets a labelno and ;the tablewords is filled with zeroes when they turns up. ;for defined labels segno,rel means place of definition. ;for undefined labels is rel=0 and segno=seg for last reference. undefined ;labels gets a globalno once they are refered to, g:absword is used for ;chains. ; \f ;rc 18.09.70 fortran pass8 page 57 ;do loop labels ; do loop labels ; survey of pass8 labels and xxlabels(labels saved in stack and not in ;label table) used in doloops and implied loops: ;* notes that a label is used undefined(is a global) ;(p1 is stored in f94, and p2 is stored in f95) ; ; type of loop labelno pass8 labels xxlabels ; ------------ ------- ------------ -------- ; do general p2-1 afterdo step ; p2 step * doloop ; p1 test * ; ; do special p2-1 afterdo test ; p2 step * ; ; implied general p2-1 loop * impinit ; p2 test * step ; step ; afterdo ; ; implied special p2-1 loop * impinit ; p2 test * afterdo ; \f ;rc 18.09.70 fortran pass8 page 58 ; do loop labels ;algoritmes for leading bytes: ; ;doinit(do gen,imp gen): ; declare tes tand store in labeltable; ; generate goto step; ; generate instructions; ;dotest(do gen): ; declare step and store in label table; ; generate goto afterdo; ; generate skip goto doloop; ; stack segno,rel for step; ; p2:=old p2, saved as afterdo s globalno; ; (implied): ; save stacktop; declare and stack step; stack saved top; ; generate goto afterdo; ; generate skip goto loop; ;dofalse(do gen, imp gen): ; generate 2 instructions; ;dostep(do gen): ; declare and stack doloop; ; p1:=p1+1; initiate labeltable for p1; ; generate goto test; ; test free bytes and generate 4 instructions; ;doend(do gen, do spec): ; p1:=p1+1; initiate labeltable for p1; globalno:=p2; ; p1:=p1+1; initiate label table for p1; ; p2:=p1; ; declare afterdo and store in labeltable; ; generate goto step; ; fimp:=false; ;dospec(do spec): ; declare step and store in label table; ; generate goto test; ; p2:=old p2 saved as globalno for afterdo; ;prepafter(dospec,imp spec): ; get segno,rel for afterdo from action 20; ; generate rl a:absw if segno<> actual segno; ;goafter(do spec, imp spec): ; store segno,rel for afterdo in action 20; ; test free bytes; ; generate jl instr; \f ;rc 18.09.70 fortran pass8 page 59 ;do loop labels ;impbeg(imp gen,imp spec): ; fimp:=false; ; declare loop and store in label table; ; generate goto impinit; ; p2:=stacktop; ;impinit(imp gen): ; save stacktop; declare and stack impinit; stack saved top; ; generate goto step; ;impstep(imp gen): ; fimp:=true; ; stack old p2; ; declare and stack afterdo; ; p1:=p1+1; initiate label table for p1; ; -- -- ; ; genenrate goto test; ; test free bytes and generate instr; ;xximp(imp spec): ; declare test and store in label table; ;imploop(imp spec): ; save stacktop; declare and stack impinit; stack saved top; ; generate goto loop; ;goimp(do spec): ; stack old p2; ; declare and stack afterdo; ; p1:=p1+1; initiate label table for p1; ; -- --; ; p2:=p1; ; generate goto test; ; fimp:=true; \f ;rc 24.09.70 fortran pass8 page 60 ;use of stack ;use of stack ; 1)during handling of units the stack is used for temporary ; savings of xxlabels ; 2)for every unit entrypoints are saved as follows: ; ; ! ! ; ! ! n-1 th unit ; ---------------------------------------- ; ! unit seg ! rel ! ; ------------------------------------- ; ! program seg ! rel ! ; ------------------------------------- ; ! last entry seg ! rel ! ; ------------------------------------- ; ! . ! . ! ; ! . ! . ! n th unit ; ! . ! . ! ; ------------------------------------- ; ! 2nd entry seg ! rel ! ; ------------------------------------- ; ! main entry seg ! rel ! ; ------------------------------------- ; ! end of unit seg ! no of entries ! ; ---------------------------------------- ; ! ! n+1 th unit ; ! ! \f ;rc 78.04.18 fortran pass8 page 61 ;initialisation ;initialisation g82: al. w3 j18. ; stepping stone al w3 x3+c0-j18; rl w1 x3+f98-c0 ; al w1 x1+e39 ; rs w1 x3+f98-c0 ;length of useable part of segment al. w1 j8. ; rs w1 x3+f89-c0; label table start sl w1 (x3+e9+4-c0); jl x3+b23-c0 ;goto alarm <:stack:> al w1 0 ; rs w1 x3+e9-c0 ; 0 in pass inf 1 and 2 rs w1 x3+e9+2-c0; rl w1 x3+e9+4-c0; rs w1 x3+f35-c0 ;stacktop:=last of core rs w1 x3+f36-c0 ; rl w1 x3+e6-c0 ; rs w1 x3+f28-c0 ;prevline:=line count al w0 g72 ; rl w1 x3+e29-c0 ; if trunc.no then so w1 1<0 ; hs. w0 b84. ; change r trunc i rl w1 x3+e17-c0; w1=mode bits so w1 1<6 ; if overflow alarm jl. a130. ; al w0 g95 ; change mult hs. w0 b64. ; al w0 g98 ; change l conv i hs. w0 b65. ; a130: ; creation time dl w1 x3+e74-c0 ; ds w1 x3+f151-c0; jl x3+c0-c0 ;next in as return j5=k-e0 ;length of pass 8 e30 = e30 + j5 ; length := length + length pass 8; i. e. ;end pass 8 m. rc 85.09.30 fortran, pass 8 ▶EOF◀