|
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: 26880 (0x6900) Types: TextFile Names: »retprint3tx «
└─⟦01e83a425⟧ Bits:30008166 Bånd med SW8010 og SW8500 source code └─⟦75ff9bef3⟧ └─⟦this⟧ »retprint3tx «
mode list.yes print4tx=edit print3tx ; ; new : format hex ; 4.1.2 : print from relocated processes ; 4.1.3 : print from bs areas exceeding 32768 segments ; : print from addresses beyound 4194304 up to 8388606 ; 4.1.3 : print accesses each segment from 0 up until the first one to print ; 4.1.4 : print does not connect via bs entries ; l./1985.03.26/, r/85.03.26/88.11.21/ l./i24/, r/i24/i30/ l./jl. e2./, d l./f8:/, i/ f31: 0 ; block base f32: 0 ; hwd base / l./f8:/, r/1<22 /1<23-1/ l./f11:/, r/1<22 /1<23-1/ l./f12:/, i/ 0 ; /, l1, r/total/total (double)/, p-1 l./print, page 2/, r/rc 8.7.1970 /fgs 1988.07.17/ l./rl. w0 f12./, r/rl/dl/ l./a5:/, d1, i/ a5: al w0 x3 ; ok: al w3 0 ; aa. w0 f12. ; no := first + total; /, p-2 l./rl. w0 f12./, r/f12./f1. / l1, r/wa/aa/, r/f1. /f12./ l1, r/rs/ds/ l./page ...3/, r/rc 1977.09.14/fgs 1988.07.12/ l./a2:/, l./bz. w0 i4./, r/i4. /i14./, r/blocked/bs area/, i# rl. w0 f17. ; sn w0 0 ; if input descr.name (1) <> 0 then jl. a54. ; begin am. (f13.) ; dl w0 +4 ; sn. w3 (f17. ) ; if name in area descr in parameter <> se. w0 (f17.+2) ; jl. a53. ; am. (f13.) ; dl w0 +8 ; sn. w3 (f17.+4) ; name in input descriptor then se. w0 (f17.+6) ; jl. a53. ; jl. a54. ; begin a53: jl. w3 c3. ; writecr; al w2 40 ; jl. w3 c9. ; write (<:(:>); al. w0 f17. ; jl. w3 c5. ; writetext (input descr name); al w2 41 ; jl. w3 c9. ; write (<:):>); a54: ; end; \f ; fgs 1988.07.12 fp utility, print, page ...3a... # l./a3:/, l-1, d, i/ 32<12 +1 ; zl. w0 i1. ; se w0 6 ; if segmented then jl. a3. ; begin jl. w3 c3. ; writesp; al w2 40 ; jl. w3 c9. ; writechar (<:(:>); rl. w0 f21. ; bs. w0 1 ; w0 := segm count - 1; jl. w3 c4. ; writeinteger (<<d>, w0); 32<12 +1 ; al w2 46 ; jl. w3 c9. ; writechar (<:.:>); zl. w0 i0. ; w0 := rel; jl. w3 c4. ; writeinteger (<<d>, w0); 32<12 +1 ; writechar (<:):>); al w2 41 ; end; jl. w3 c9. ; end; /, p2 l./a7:/, l./32<12 +6/, r/6/8/, r/dddddd/dddddddd/ l./i20=/, l-1, d./jl. w3 c9./, i# rl. w0 f6. ; w0 := address; \f ; fgs 1988.07.12 fp utility, print, page ...3b... i20=k+1 ; ; jl. 2 ; (if octal) jl. i22. ; skip; jl. w3 c31. ; writeoctal (addr); al w2 46 ; jl. w3 c9. ; writechar (point); rl. w0 f6. ; w0 := address; i22=k+1 ; ; jl. 2 ; (if hex) jl. i3. ; skip; jl. w3 c33. ; writehex (addr); al w2 46 ; jl. w3 c9. ; writechar (point); #, p-14 l./page 4/, r/rc 14.8.1969 /fgs 1988.07.12/ l./jl. a10./, r/a10./a52./ l./a10:/, i/ i26 = k + 1; hex ; print octal: a52: sn w3 x3 ; if octal then jl. a51. ; begin rl. w0 f10. ; w0 := current word; jl. w3 c31. ; write_octal (word); i25 = k + 1; hex ; print hexadecimal: a51: sn w3 x3 ; if hex then jl. a10. ; begin rl. w0 f10. ; w0 := current word; jl. w3 c33. ; write_hex (word); /, p-10 l./page ...5/, r/rc 1977.10.12 /fgs 1988.07.12/ l./se w1 0/, d./jl. a14./ l./sz w2 3<2/, d, i/ sz w2 3<2 ; if x-field <> 0 and sn w1 0 ; displacement <> 0 then jl. a55. ; /, p-3 l./sh w1 -1/, r/ /a55: / l./b2 =/, l2, i/ sz w2 3<2 ; if x-field <> 0 and se w0 0 ; displacement = 0 then jl. a56. ; begin al. w0 g14. ; writetext (<:____:>); jl. w3 c5. ; goto print right bracket; jl. a14. ; end; / l./sh w0 -1/, r/ /a56: / l./jl. w3 c4./, r/<<d>/<<dddd>/ l1, r/+1/+4/ l./rs. w0 f29./, r/f29./ f29./ l1, r/c4./c4. / l./1<23+32<12+1/, r/+1/+9/, r/<<-d>/<<-dddddddd>/ l1, r/f29./f29. / l2, r/2/2 / l1, r/a6./i23./, r/increase number/hex/ l1, r/;/ ;/ l./jl. a6./, d, i/ i23=k+1 ; ; jl. 2 ; (if hex) jl. a6. ; goto increase number; jl. w3 c33. ; writehex (final addr); jl. a6. ; goto increase number; /, p-5 l./page ...5a/, r/rc 1977.10.13 /fgs 1988.07.12/ l./al w1 9/, i/ al. w0 g12. ; jl. w3 c5. ; outtext (out, <:8.:>); /, p-3 l./al w1 9/, r/9 /-3/, r/9/-3/ l./i3:/, l2, i# ;procedure write_hex (value); ; ; call : return : saved in: ; ; w0 : value unch b0 ; w1 : - unch b1 ; w2 : - unch b2 ; w3 : link unch b3 ; b. a10, b10 ; w. ; c33: ds. w1 b1. ; entry: ds. w3 b3. ; save registers; jl. w3 c3. ; outchar (out, sp); al. w0 g13. ; jl. w3 c5. ; outtext (<:16.:>); al w0 -24 ; shifts := -24; a0: rl. w2 b0. ; for shifts := shifts + 4 wa. w0 b4. ; while shifts <= 0 do sl w0 1 ; begin jl. a1. ; char := ls w2 (0) ; value shift shifts la. w2 b6. ; 4; zl. w2 x2+b5. ; hex := jl. w3 c9. ; hextable (char); jl. a0. ; end; a1: dl. w1 b1. ; restore registers; dl. w3 b3. ; jl x3 ; return; b0: 0 ; saved w0 b1: 0 ; - w1 b2: 0 ; - w2 b3: 0 ; - w3 b4: 4 ; constant b6: 2.1111 ; mask h. ; hextable (0:15): b5: 48, 49, 50, 51 ; 0, 1, 2, 3 52, 53, 54, 55 ; 4, 5, 6, 7 56, 57, 65, 66 ; 8, 9, A, B 67, 68, 69, 70 ; C, D, E, F w. ; i. e. ; end block # l./page ...6/, r/85.03.26/88.07.12/ l./g9:/, l1, i/ g12: <:8.:> ; g13: <:16.<0>:> ; g14:<:<32><32><32><32>:>; /, l1, p-3 l./c0:/, l./wa. w1 f9./, d1, i/ rl w0 x1-2 ; current word := word (current core relative - 2); /, p-1 l./page 8/, r/rc 31.1.1974 /fgs 1988.07.14/ l./b4:/, r/numbering/limit violation/ l./b7:/, r/core/memory/ l./c25:/, l1, d./hs. w0 i0./, i/ ld w1 -9 ; current core relative := w0; ls w1 -15 ; rel := hs. w1 i0. ; (w3, w0) extract 9; ld w1 9 ; ld w0 -9 ; segment := ba. w0 1 ; (w3, w0) shift (-9) + rs. w0 f0. ; 1; /, p-7 l./page ...8a/, r/rc 1976.03.11 /fgs 1988.07.22/ l./f30:/, r/14/h76/, r/16/h76+2/ l./page ...9/, r/rc 1977.09.14 /fgs 1988.07.12/ l./c.h57<3/, d./z./ l./page 10/, r/rc 7.7.1970 /fgs 1988.07.17/ l./al w0 0/, d./ds. w1 f3./, i/ al w0 0 ; from word := 0; rl. w1 f11. ; to word := infinite ; ds. w1 f3. ; rl. w0 f31. ; from block := block base; ds. w1 f5. ; to block := infinite ; rs. w0 f7. ; block := block base; al w3 0 ; ld w0 9 ; total := double wa. w0 f32. ; (block base < 9 + ds. w0 f12. ; hwd base ); /, p-10 l./page ...11/, r/rc 1970.07.15 /fgs 1988.07.14/ l./al w1 0/, d./rs. w1 f5./, i/ rl. w1 f31. ; save pointer (field specification); rs. w1 f4. ; from block := block base; rs. w1 f5. ; to block := block base; rs. w1 f7. ; block := block base; rl w2 0 ; save w0; al w0 0 ; ld w1 9 ; total := double wa. w1 f32. ; (block base < 9 + ds. w1 f12. ; hwd base ); al w0 x2 ; restore w0; rl. w2 g9. ; restore w2; al w1 0 ; /, p-11 l./a27:/, l./sn w1 4/, d1, i/ se w1 4 ; if w1 = 4 then jl. a68. ; begin rl. w0 x1+f2. ; from block := wa. w0 f31. ; from block + rs. w0 x1+f2. ; block base; rs. w0 f7. ; block := al w3 0 ; from block; ld w0 9 ; total := block < ds. w0 f12. ; 9; rl. w0 x1+f2.+2 ; to block := wa. w0 f31. ; to block + rs. w0 x1+f2.+2 ; block base; jl. a28. ; goto execute; a68: ; end; /, p-7 l./page 11a/, r/rc 7.7.1970 /fgs 1988.07.17/ l./jl. w2 c25./, l-1, d1, i/ dl. w0 f12. ; begin wa. w0 f2. ; (w3, w0) := jl. w2 c25. ; total + from word; /, p1 l1, l./jl. w2 c25./, l-1, d, i/ dl. w0 f12. ; (w3, w0) := wa. w0 f3. ; total + to word; /, p1 l1, l./jl. w2 c25./, l-1, d, i/ dl. w0 f12. ; (w3, w0) := wa. w0 b34. ; total + center address; /, p1 l./a64:/, d l./page 11b/, r/rc 16.7.1970 /fgs 1988.07.14/ l./a28:/, d, i/ a64: rl. w2 d0. ; al w0 0 ; rl. w1 f31. ; rs. w1 f7. ; block := block base; ld w1 9 ; total := double wa. w1 f32. ; (block base < 9 + ds. w1 f12. ; hwd base ); a28: al w3 x2 ; execute: /, p-5 l./rs. w0 f7./, d1 l./page ...12/, r/rc 1977.10.13 /fgs 1988.07.21/ l./b19:/, d./b40:/, i# b19: 32<12 + 1 ; b20: 32<12 + 2 ; 12<12 +23 ; b21: 1<23+32<12+ 6 ; b22: 1<23+32<12+ 9 ; b23: 3 ; b25: 32<12+ 5 ; b36: 32<12+ 4 ; b37: 8<12+15 ; b38: 16<12+23 ; b39: 48<12+ 1 ; b40: 3<12+ 3 ; # l./page ...12a/, r/rc 1977.10.13 /fgs 1988.07.12/ l./c30:/, l./rl. w1 b39./, d15, r/a31./a20./, i/ hs. w0 i26. ; octal := true; <*in write word*> / l./c18:/, i/ ; hex: c32: se w3 4 ; if next delim <> sp then jl. a22. ; goto param error; jl. w3 c14. ; clear format list; al w0 2 ; hs. w0 i22. ; hex := true; <*in write address*> hs. w0 i23. ; hex := true; <*in write final addr*>; hs. w0 i25. ; hex := true; <*in write word*> jl. a20. ; goto scan parameterlist1; /, p-10 l./page ...14/, r/rc 1977.09.26 /fgs 1988.07.12/ l./g10:/, d./g11:/, i# g10: <:integer:> , 0 , c16-d7 ; format table: <:word:>, 0 , 0 , c16-d7 ; <:char:>, 0 , 0 , c28-d7 ; <:half:>, 0 , 0 , c17-d7 ; <:abshalf:> , 0 , c29-d7 ; <:octal:>,0 , 0 , c30-d7 ; <:hex:>,0,0 , 0 , c32-d7 ; <:byte:>, 0 , 0 , c17-d7 ; <:code:>, 0 , 0 , c19-d7 ; <:text:>, 0 , 0 , c20-d7 ; <:bits:>, 0 , 0 , c21-d7 ; <:words:>,0 , 0 , c23-d7 ; g11: <:all:>,0,0 , 0 , c18-d7 ; #, p-13 l./page ...15/, d b, i# \f ; fgs 1988.07.12 fp utility, print, page ...15... b28: <:s:> ; b29: <:,xi:> ; replaces <:,ri:> in instr table in mpu b35: <:connect out<0>:>; e2: am -2000 ; initialize print: rs. w1 f15.+2000 ; am -2000 ; rs. w2 f24.+2000 ; save top command; am -2000 ; rs. w3 f16.+2000 ; save fp base; save command pointer; rl. w0 b29. ; gg w3 2*17 ; sl w3 60 ; if cpu ident >= 60 then rs. w0 i24. ; replace <:,ri:> with <:,xi:> in instr.table; al. w3 d5. ; al w0 x3+510 ; first core := first free core; am -2000 ; ds. w0 f20.+2000 ; last core := first core + 510; al w3 x3+512 ; comment: bs segment buffer; am -2000 ; rs. w3 f14.+2000 ; base bit group table := last core + 2; am -2000 ; rs. w3 f25.+2000 ; bit group point := last core + 2; sh w3 x2-4 ; if last core + 2 >= top command then jl. a36. ; begin al. w1 b7. ; message(<:core size:>); jl. w3 c12. ; goto exit fp jl. d8. ; end; a36: dl w0 x1+h10+h76+2; rx. w3 f30.-2 ; exchange two first words of rx. w0 f30. ; fp break with entries at print; al. w0 e4. ; ds w0 x1+h10+h76+2; al w0 x1+h21 ; am -2000 ; rs. w0 f28.+2000 ; secondary out := current out; am -2000 ; rl. w2 f16.+2000 ; w2 := command pointer(point); \f ; fgs 1988.07.12 fp utility, print, page ...16... bz w1 x2 ; se w1 6 ; if delimiter = <=> then jl. a37. ; begin am -2000 ; am. (f15.+2000); jl w3 h29-4 ; stack current input; am -2000 ; rl. w2 f16.+2000 ; al w2 x2-8 ; am -2000 ; rl. w3 f15.+2000 ; al w1 x3+h20 ; zone := current in; al w0 1<2+0 ; comment: one segm. , temporary; jl w3 x3+h28 ; connect out(zone); (=secondary output); sn w0 0 ; if result <> 0 then jl. d10. ; begin al. w1 b35. ; jl. w3 c12. ; message(<:connect out:>); jl. d3. ; goto exit fp; d10: am -2000 ; rs. w1 f28.+2000 ; secondary out zone := current in; bl w0 x1+h1+1 ; sn w0 4 ; if -,bs and jl. 6 ; -,mt se w0 18 ; then jl. a44. ; skip; am -2000; rl. w2 f16.+2000; al w2 x2-8 ; w2:=name addr am -2000 ; am. (f15.+2000); al w1 h54 ; w1:=lookup area jl. w3 a65. ; prepare output \f ; fgs 1988.07.12 fp utility, print, page ...17... a44: am -2000 ; rl. w2 f16.+2000 ; a37: al w0 0 ; again: am -2000 ; hs. w0 i1.+2000 ; am -2000 ; rs. w0 f9.+2000 ; jl. w3 c8. ; next param; bl w1 x2 ; sl w1 4 ; if param = <end list> then jl. a43. ; begin al. w1 b3. ; message(<:area:>); jl. w3 c12. ; goto exit fp jl. d3. ; end; a43: am -2000 ; rs. w2 f13.+2000 ; save pointer(area description); bz w1 x2+1 ; se w1 4 ; if param = integer then jl. a66. ; am -2000 ; rs. w0 f27.+2000 ; current core relative := param; am -2000 ; rs. w0 f32.+2000 ; hwd base := param; a66: sn. w3 (b11.) ; if next param = (point, integer) then jl. a41. ; goto numbering; sn. w3 (b14.) ; if next param = (point,name) then jl. a40. ; goto segmented; a38: bl w1 6 ; test space: sn w1 4 ; if delimiter = space then jl. a42. ; goto area or process name; \f ; fgs 1988.07.12 fp utility, print, page ...18... a39: al. w1 b5. ; syntax error: jl. w3 c12. ; message(<:param:>); am -2000 ; rl. w2 f13.+2000 ; w2 := addr(area description); jl. w3 c1. ; list parameter; jl. a37. ; goto again; a40: jl. w3 c8. ; segmented: next param; se. w0 (b28.) ; if param <> <:s:> then jl. a39. ; goto syntax error; al w0 6 ; am -2000 ; hs. w0 i1.+2000 ; content := 6; se. w3 (b11.) ; if next param <> (point,integer) then jl. a38. ; goto test space; a41: jl. w3 c8. ; numbering: am -2000 ; rs. w0 f9.+2000 ; first number := next param; al w1 1 ; hs. w1 i27. ; first number read in memory area := hs. w1 i28. ; first number read in bs area := true; jl. a38. ; goto test space; a42: am -2000 ; area or process name: rs. w2 f16.+2000 ; am -2000 ; rl. w3 f13.+2000 ; al w3 x3 +2 ; jd 1<11+4 ; process description; sn w0 0 ; if process does not exist then jl. d11. ; goto area; rl w2 (0) ; se w2 0 ; if process kind <> internal then jl. d11. ; goto area; \f ; fgs 1988.07.12 fp utility, print, page ...19... rl w2 0 ; proc := process descr addr; rl w0 x2+22 ; first addr := wa w0 x2+98 ; proc.first logical + proc.base; am -2000 ; rs. w0 f27.+2000 ; current core relative := first address; am -2000 ; rs. w0 f32.+2000 ; hwd base := first address; rl w1 x2+24 ; last addr := wa w1 x2+98 ; proc.top logical addr + al w1 x1-2 ; proc.base - 2; am -2000 ; rs. w1 f8.+2000 ; am 1 ; internal process := true; a50: al w1 0 ; ready: am -2000 ; rl. w0 f32.+2000 ; w0 := current core relative; <* = first address*> am -2000 ; rx. w0 f9. +2000 ; i27 = k + 1; first number read: sn w3 x3 ; if first number read then jl. a70. ; first number := if internal process then se w1 0 ; first number + proc.first logical addr else wa w0 x2+22 ; first number ; am -2000 ; else rx. w0 f9.+2000 ; first number := a70: rl w1 x2+24 ; current core relative; al w0 0 ; hs. w0 i17. ; blocked := false; am -2000 ; rl. w2 f16.+2000 ; restore command pointer; jl. a48. ; restore command pointer; goto all1; \f ; fgs 1988.07.12 fp utility, print, page ...20... d11: am -2000 ; area: am. (f13.+2000); w1 := tail := first free core; al w3 2 ; w3 := addr(area name); dl w1 x3+2 ; am -2000; ds. w1 f17.+2+2000; move name from dl w1 x3+6 ; parameter stack am -2000; to ds. w1 f17.+6+2000; input description; al. w1 d5. ; jd 1<11+42 ; lookup entry; sn w0 0 ; if result <> 0 then jl. a46. ; begin sn w0 6 ; if name format illegal then jl. a50. ; abs core addr: goto ready; a45: al. w1 b6. ; unknown: mess name(<:unknown); al w2 1 ; am -2000 ; rs. w2 f23.+2000 ; fpresult:=1; jl. w3 c13. ; goto exit fp jl. d3. ; end; \f ; fgs 1988.07.12 fp utility, print, page ...21... a46: am -2000 ; descriptor found: zl. w0 i1.+2000 ; sn w0 6 ; if content <> 6 <*segmented*> then jl. a58. ; zl w0 x1+16 ; content := am -2000 ; hs. w0 i1.+2000 ; entry tail (16); a58: rl w2 x1+14 ; blockno := entry tail (14); zl w0 x1+16 ; sh w0 31 ; if content >= 32 then jl. a67. ; begin rl w2 0 ; blockno := al w2 x2-32 ; content - 32; a67: rl w0 x1 ; end; sl w0 0 ; if tail(0) >= 0 then jl. a47. ; goto prepare area process; al w3 x1+2 ; w3 := addr(document name); dl w1 x3+2 ; am -2000; ds. w1 f17.+2+2000; move name from dl w1 x3+6 ; entry tail am -2000; to ds. w1 f17.+6+2000; input description; al. w1 d13. ; w1 := first free core + 10; jd 1<11+42 ; lookup entry; se w0 0 ; if result <> 0 then jl. a45. ; goto unknown; am -2000 ; rs. w2 f31.+2000 ; blockbase := blockno; rl w0 x1 ; sh w0 -1 ; if entry tail.size < 0 then jl. a46. ; goto descriptor found; \f ; fgs 1988.07.12 fp utility, print, page ...22... a47: am -2000 ; prepare area process: al. w3 f17.+2000 ; prepare area process: jd 1<11+52 ; create area process; se w0 0 ; if result <> 0 then; jl. d4. ; goto area alarm; am -2000 ; rl. w1 f11.+2000 ; am -2000 ; rs. w1 f5. +2000 ; to block := infinite ; am -2000 ; rl. w1 f31.+2000 ; am -2000 ; rs. w1 f4. +2000 ; from block := block base; am -2000 ; rs. w1 f7. +2000 ; block := blockbase; ld w1 9 ; total := double am -2000 ; wa. w1 f32.+2000 ; (block base < 9 + am -2000 ; ds. w1 f12.+2000 ; hwd base ); am -2000 ; bz. w0 i1. +2000 ; i28 = k + 1; first number read: sn w3 x3 ; if first number read se w0 7 ; or content <> 7 then jl. d12. ; goto start print; al w0 0 ; hs. w0 i17. ; blocked := false; am -2000 ; dl. w0 f12.+2000 ; (w3, w0) := total; jl. w2 c25. ; setposition; jl. w3 c26. ; am -2000 ; rl. w0 f10.+2000 ; get word; am -2000 ; rs. w0 f9. +2000 ; first number := current word; d12: am -2000 ; start print: rl. w2 f16.+2000 ; restore command pointer; al w0 1 ; hs. w0 i14. ; bs area := true; jl. a48. ; goto all1; \f ; fgs 1988.07.12 fp utility, print, page ...23... ; procedure prepare entry for textoutput ; w0 not used ; w1 lookup area ; w2 name addr, entry must be present ; w3 return addr b. a2 w. a65: ds. w1 a1. ; save w0.w1 ds. w3 a2. ; save w2.w3 al w3 x2 ; w3:=name addr jd 1<11+42 ; lookup bz w2 x1+16 ; sh w2 32 ; if contents=4 or sn w2 4 ; contents>=32 jl. 4 ; then jl. a0. ; file:=block:=0; rs w0 x1+12 ; rs w0 x1+14 ; a0: rs w0 x1+16 ; contents.entry:=0; rs w0 x1+18 ; loadlength:=0; dl w1 110 ; ld w1 5 ; shortclock; rl. w1 a1. ; rs w0 x1+10 ; jd 1<11+44 ; changeentry; dl. w1 a1. ; restore w0,w1 dl. w3 a2. ; restore w2,w3 jl x3 ; return 0 ; saved w0 a1: 0 ; saved w1 0 ; saved w2 a2: 0 ; saved w3 e. \f ; fgs 1988.07.12 fp utility, print, page ...24... d1 = k - d0 , d5 = k, d6 = k + 512, d13 = k + 10 0 ; zero, to terminate program segment m0 = k - h55 ; load length m1 = e2 - h55 ; entry point i. ; id list e. ; end segment: print m.rc 1988.11.21 fp utility, print \f ; fgs 1988.07.12 fp utility, print, page ...25... g0:g1: (:m0+511:)>9 ; segm 0,r.4 s2 ; date 0,0 ; file, block 2<12+m1 ; contents, entry m0 ; length d. p.<:insertproc:> # f end ▶EOF◀