|
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: 158976 (0x26d00) Types: TextFile Names: »tprinter«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦0b92c64d5⟧ »ctb« └─⟦this⟧
(bprinter = set 1 disc bprinter = slang proc.options scope user bprinter print bprinter integer words.4 0.6 end) \f ; bøt 28.12.71 general description paper printer ...1... b.w.p.1 ; include options s0 = 0, s1 = 1 ; initialize checksums ; printer coroutines ; ; the coroutines consists of one or more printer drivers printing ; directely on paper and one driver printing on magnetic tape, ; which later may be copied on paper (separately described) ; ; the coroutines consists of the following pages: ; ; ; paper descriptions (used by all printers) ; description of each paper format ; selecting routines to find a new paper ; ; main loop (paper printers) ; the central loop in printing (reading and ; writing). all other actions are concentrated ; on: ; ; central page (paper printers) ; start and stop of printing ; handling of end paper and errors ; handling of operator messages ; ; triangle page (paper printers) ; printing of leading and trailing triangle with associated information ; ; variables (paper printers) ; variables to be used by all paper printer pages ; ; ; ; the initialization code of each page is placed just after ; the page itself. ; initialization of the convert operations is placed before ; the first page \f ; bøt 28.12.71 general description paper printer ...2... ; options defining the printers ; ; i65 paper printers on disc ; i66 super buffer on disc ; i67 no of segments in super buffer ; i68 no of named papers + 1 ; i70 paper printer buffer on disc ; i71 no of paper printers ; i72 no of points ; i73 no of lines pr vt ; i74 no of lines pr ff ; i75 value of output mode (tape printer) ; i76 value of set mode (tape printer) ; i77 max no of segments in points ; i78 no of paper semaphores ; i79 standard repeat value ; i164 convert operations on disc ; i165 paper descriptions on disc ; i166 paper printer variables on disc ; i167 no of lines in triangle ; i168 no of ff before front page ; i169 no of ff after last page ; i170 min no of pages before kill ; i190 no of remote batch printers ; i191 max waiting time when reserving rbdevice (timeout period) ; i192 time interval in rb convert queue scan ; ; ; e35 start address of printer table ; e36 top address of printer table ; e37 length of printer table entry ; e38 start address of paper table ; e39 top address of paper table ; e40 length of core store print buffer ; e41 length of convert operation ; e42 length of point ; e43 length of printer operation ; e47 length of core store remote batch printer buffer ; ; ; global names: ; ; f-names relative addresses inside a page ; g-names absolute addresses of a page or initialization ; d-names relative addresses of variables s. h2 w. ; outermost segment h0, h1 ; checksums 78 12 11, 68; version id: m. boss 2 tprinter b. d70, f140, g200 w. f100 = 0 ; count k-assignments \f ; bøt 28.12.71 external list paper printer ...3... ; externals in main loop g20. , g21. , g22. , g23. , g24. , g26. g27. , g28. , g29. , g30. ; externals in central page g40. , g41. , g42. , g43. , g44. , g45. , g46. g47. , g48. , g49. , g50. , g51. , g52. , g53. g54. , g55. , g56. , g57. , g58. , g59. , g60. g61. , g62. , g63. , g64. , g65. , g66. , g67. g68. , g69. , g70. , g71. , g72. , g73. , g74. g75. ; externals in paper descriptions g90. , g91. , g92. , g93. , g94. , g95. , g96. , g99. g97. , g98. , g101. g173., g174., g175., g176., g177., g178. g181., g182., g183., g184., g185., g186. ; externals in triangle page g150., g151., g152., g153., g154., g155., g156. g157., g158., g159., g160., g161. ; externals in triangle page initialization g170., g171., g172. ; externals in initialize convert operations g109., g110., g111., g112., g113., g114. ; externals in initialize paper descriptions g115., g116., g117., g118., g119. ; externals in initialize variables g120., g121., g122., g123., g124., g125., g126. g105., g127., g128., g129. ; externals in initialize central page g130., g131., g132., g133., g134. ; externals in initialize main loop g140., g141., g142., g143., g144., g145. ; external 40 - reference to set-external-procedure; g165.,g166.,g167.,g168.,g169.,g180. ; end external list 0 \f ; bøt 28.12.71 initialization paper printer ...4... ; initialize convert operations ; ; the convert operations are inserted in the ; virtual store, and the semaphore convert ; operations is initialized b. a5, j10 w. al w0 1 ; no := 1; al w1 0 ; chain := 0; ds. w1 j1. ; save(no, chain); jl. w3 (2) ; set externals; g166: 40 ; j5: e13<12+19, 382 ; convert operations; j10: e13<12+19, 388 ; convert op sem type 2; 0 , -1000 ; end of externals; a0: al w0 i164 ; rep: w0 := reserve on disc; al w1 e41 ; w1 := operation length; jl. w3 (j7.) ; reserve virt (w0, w1, w2); al. w0 j1. ; w0 := start of operation; jl. w3 (j8.) ; move to virt ( w0, w1, w2); al w2 x2+1 ; virt := virt + writing; rs. w2 j1. ; chain := virt; rl. w1 j0. ; sn w1 1 ; if no = 1 then jl. a1. ; goto set last; sz w1 7 ; if no mod 8 jl. 4 ; = 0 then jl. w3 (j9.) ; newline; al w1 x1+1 ; no := no + 1; rs. w1 j0. ; if no <= sh w1 i104 ; no of operations then jl. a0. ; goto rep; al w0 x1-1 ; w0 := no - 1; rl. w2 j5. ; w2 := addr of sem; rl. w1 j1. ; w1 := virt of first op; ds w1 x2+2 ; value, first := w0, w1; jl. w3 (j9.) ; newline; \f ; bøt 11.03.72 initialization paper printer ...4a... al w0 0 ; rs. w0 j1. ; chain := 0; al w0 i164 ; w0 := reserve on disc; al w1 e41 ; w1 := operation length; jl. w3 (j7.) ; reserve virt (w0, w1, w2); al. w0 j1. ; w0 := operation addr; jl. w3 (j8.) ; move to virt (w0, w1, w2); al w2 x2+1 ; insert writing; rl. w3 j10. ; w3 := sem addr; al w1 x2 ; first := last := ds w2 x3+4 ; virt of operation; al w1 1 ; rs w1 x3 ; value := 1; am. (+4) ; jl. +2 ,g11.; goto init papers; a1: rl. w1 j5. ; set last: rs w2 x1+4 ; sem(last chain) := virt; al w1 2 ; no := 2; rs. w1 j0. ; jl. a0. ; goto rep; j0: 0 ; no: j1: h. 0 , r.e41 w. ; chain, operation j6: 0 ;* start of ext list j7: 12 ;* reserve virt j8: 13 ;* move to virt j9: 27 ;* newline g109 = j10, g110 = j5, g111 = j6, g112 = j7, g113 = j8, g114 = j9 ; externals e. \f ; bøt 28.12.71 paper descriptions paper printer ...5... ; paper description page ; ; this page contains descriptions of each paper ; format and the code handling them. ; ; all search strategies are concentrated on this ; page g6: k = 10000, f100 = f100 + 4 ; count k-assignments b. a10, b101, c10, h20 w. b0: 0 ; page 0 this page b1: 0 ; page 1 variables 0, 0, 0 ; page 2, 3 and 4 are not used 70<12+0 ; pageident: paper description page ; paper descriptions h0 = 0 ; rel of users h10= 2 ; rel of allowed h1 = 6 ; rel of name word 2 h2 = 10 ; rel of name word 4 h3 = 12 ; rel of sem addr h4 = 14 ; length of entry ; paper description area b25: h. 0, r.i78*h4 w. ; paper description area b26: 0,r.i71 ; addr of top description = device number table of paper printers b27: 0 ; waiter bits: a bit = 1 indicates, that the corresp. printer is waiting b28: 0 ; saved return from start next printer h5 = b26 - b0 ; rel of top description h6 = b25 - b0 ; rel of first description h9 = h6 + h4*i68-h4 ; rel top of named papers ; external variables b2: 3 ;* lock simple b3: 4 ;* open simple b4: 8 ;* page jump b5: 387 ;* virt of central b6: f61 ; rel of return to central b7: 381 ; printer wait b11:h. e13, 19 w. ;* reserve paper descriptions b12: 5 ;* lock chained b20: 380 ;* first paper queue b30: 377 ;* rb printer wait b31: 378 ;* rb convert queue b32: 6 ;* open chained b33: 7 ;* get pages b34: 1 ;* send and wait \f ; re 5.2.75 paper descriptions paper printer ...5a... ; local variables b15: h4 ; size of entry b16: 0 ; abs of first paper ; variables used by rb printers b40: 0 ; work; b38: 25 ; call; b39: 140 ; virt, b61: 141 ; rel. lookup and reserve device; b60: 146 ; rel. connect telex; b41: 0,r.5 ; term name and name table addr b42: 0,i192; timer message b43: <:clock:>,0,0,0; b44: 0 ; timer send (0 == false, else true) b45: 0 ; any scan trouble (0== false, > 0 true) b46: 0 ; zero (for set catbase) b47: 255 ; mask b48: 1<16 ; attention status b49: e13 ; size of semafor b50: 3 ; characters per word; b62: i185<12 ; defaultvalue for mode in rb-printer(punch) ; variables used by display convert b51: 25 ; call b52: 61 ; printer full sem b53: 162 ; virt, b54: 204 ; rel alarm print; b55: 229 ; rel general print; b56: 379 ; paper manipulation semaphore; b57: 32<16+32<8+32 ; three space characters; b58: 0, r.10 ; room for entry tail; b59: c. i190-1, <:remote<0>:> z. ; if no rb coroutines then c. -i190 , <:no rb:> z. ; rb-printer queue cannot be displayed; \f ; bøt 28.12.71 paper descriptions paper printer ...6... ; stepping stones to address page-0 and page-1 at top of page b100: b0. ; stepping stone to page-0-addres b101: b1. ; stepping stone to page-1-addres ; commandio actions for select and reject commands: ; syntax: reject <prno> all => no papers allowed ; reject <prno> <list of paperno> => those papers not allowed ; select <prno> all => all papers allowed ; select <prno> <list of paperno> => those papers allowed too b. a10, j10 w. j0: <:all:> f96=k-b0 ; entry reject command: am -1 ; f97=k-b0 ; entry select command al w0 0 ; rs. w0 b16. ; mask := if reject then -1 else 0; ; search deviceno table to get the corresponding idbit al w0 1<0 ; idbit := 1 shift 0; al w1 0 ; index :=0; rl w2 x3+6 ; w2=deviceno := param1 (integer); a0: sn. w2 (x1+b26.) ; search: if devno(index) = deviceno then jl. a3. ; goto found; ls w0 1 ; idbit := next idbit; al w1 x1+2 ; increase(index); sh w1 i71*2-2 ; if index < no of paper printers then jl. a0. ; goto search; am 6-4 ; device unknown: a1: am 4-0 ; param alarm: a2: al w1 0 ; after action: rl. w3 b1. ; dl w3 x3+2 ; page jump to commandio return + alarm index; wa w3 2 ; jl. (b4.) ; \f ; re 5.2.75 paper descriptions paper printer ...6a... a3: rs. w0 b40. ; found: la. w0 b16. ; save idbit; rs. w0 b16. ; mask := if reject then idbit else 0; dl w1 x3+14 ; if param2 text then sh w0 0 ; begin jl. a5. ; sn. w0 (j0.) ; if param2 <> <:all:> then se w1 0 ; jl. a1. ; goto param alarm; al w1 0 ; for paperno := 0 step 1 until no of queues -1 do a4: jl. w2 a6. ; al w1 x1+h4 ; set or clear idbit(paperno); se w1 i78*h4 ; jl. a4. ; a7: jl. w1 c6. ; start next printer; goto after action; jl. a2. ; end; a5: al w3 x3+8 ; for paramindex := paramindex + 8 dl w1 x3+14-8 ; while param(paramindex-8) <> empty do sn w0 -1 ; jl. a7. ; begin sl w1 i78-1 ; al w1 i78-1 ; paperindex := param (until no of queues); wm. w1 b15. ; set or clear idbit(paperindex); al. w2 a5. ; end; goto after action; a6: rl. w0 x1+b25.+h10;procedure set or clear idbit(w1): lo. w0 b40. ; w0 := allowed(paperno); ws. w0 b16. ; if select then set idbit else rs. w0 x1+b25.+h10; remove idbit; jl x2 ; return; e. \f ; re 5.2.75 paper descriptions paper printer ...6b... ; search paper / paper printer ; ; the paper descriptions are scanned from preferred paper and on. ; only the selected papers are tested, and preferably those, which ; are not used by other printers. ; if no papers are found, the next convert (or some change in ; paper-allows) is awaited, and the scan is repeated. ; during the search, the paper-manipulation semafore is reserved. ; ; call: d45 must contain preferred paper number ; exit: d45 is updated, corresponding to the convert got, ; w1 = rel paper description on page ; w2 = abs paper description b. a10 w. c0: rl. w2 b11. ; search paper: jl. w3 (b2.) ; lock(paper manipulation); jl. w1 c6. ; start next printer; al w0 -1 ; mask := first loop; bz w2 x3+d45 ; w2 := abs of sl w2 i78 ; preferred paper description; al w2 i78-1 ; wm. w2 b15. ; al. w2 x2+b25. ; rs. w2 b16. ; first paper := w2; rl w1 x2+h0 ; remove user bits from lo w1 x3+d44 ; users(preferred paper); ws w1 x3+d44 ; rs w1 x2+h0 ; a0: rl w1 (x2+h3) ; next: sh w1 0 ; if que(abs actual paper) empty jl. a1. ; then goto test next; rl w1 x2+h10 ; so w1 (x3+d44) ; if not allowed then jl. a1. ; goto test next; sn. w2 (b16.) ; if first paper then jl. a2. ; goto take it; sz w0 (x2+h0) ; if (used by other and first loop) jl. a1. ; then goto test next; a2: ac. w1 b25. ; take it: wa w1 4 ; w1 := rel paper description; al w0 0 ; wd. w1 b15. ; preferred paper := actual paper; hs w1 x3+d45 ; al w1 x2 ; ws. w1 b0. ; w1 := rel paper descr on page; jl. c3. ; goto paper exit; a1: al w2 x2+h4 ; test next: sn. w2 b26. ; w2 := next (cyclical) paper descr; al. w2 b25. ; se. w2 (b16.) ; if paper descr <> first paper then jl. a0. ; goto next; ba. w0 1 ; increase mask, i.e. next loop; sn w0 0 ; if mask = second loop then jl. a0. ; goto next; e. \f ; bøt 28.12.71 paper descriptions paper printer ...7... ; no papers were found. ; wait until any changes. rl. w2 b11. ; open(paper manipulation); jl. w3 (b3.) ; ; (it is not nescessary to have the ...printer-wait... semafore ; too much open) ; indicate that the printer is waiting for printer wait semafor rl. w2 b7. ; w2 := printer wait sem; al w0 1 ; sh w0 (x2) ; if sem value >= 1 then rs w0 x2 ; then sem value := 1; rl. w1 b27. ; set idbit in waiter bits; lo w1 x3+d44 ; rs. w1 b27. ; c.i71-2 ; if more than one std printer then include: am (66) ; al w1 +74 ; al. w3 b46. ; jd 1<11+72; set catbase(boss maxbase); al. w1 b43.+4 ; w1:=ref (zero,zero); al. w2 b43. ; jl. w3 (b34.) ; send and wait(clock, wait n secs); z. rl. w2 b7. ; jl. w3 (b2.) ; lock(printer wait); rl. w1 b27. ; remove idbit from waiter bits; ws w1 x3+d44 ; rs. w1 b27. ; jl. c0. ; goto search paper; ; new paper / paper printer / remote batch printer c1: bl w1 x3+d46 ; if printer kind = paper printer sn w1 0 ; then goto search paper, paper printer; jl. c0. ; b. a20 w. ; reserve paper queue admittance ; prepare scan of rb convert queue a0: rl. w2 b11. ; lock(paper manipulation); jl. w3 (b2.) ; al w0 0 ; hs w0 x3+d45 ; count:=0; rs w0 x3+d41 ; error count := 0; rs. w0 b45. ; any trouble:=false; ; scan rb convert queue to find an available rb printer. ; if queue was non-empty, but none was available, then ; the rb convert coroutine must wait a while. a1: bz w0 x3+d45 ;rep: ba. w0 1 ; count:=count+1; hs w0 x3+d45 ; rl. w1 (b31.) ; w1:=value of rb convert queue; sh w0 x1 ; if count >= queue value then jl. a2. ; begin \f ; re 5.2.75 paper descriptions paper printer ...7a... ; the following is just an ad hoc solution for this problem: ; there are files to be converted and there is at least one rb convert ; coroutine, but the rb printers are already in use. ; if the rb printers are used by boss, there will be no problem, since ; as soon as an rb conversion is finished, the rb converter will scan ; the queue and pick up the next file for that device, i.e. the system ; is kept alive without any delays for conversion. ; the real problem arises however, if one rb printer is used by a process ; in rc4000, running in parallel with boss. in this case boss will not ; be invoked when the printer becomes ready. ; the solution says: if any troubles comes up during the scan (e.g. reserved by ; other process in rc4000, or the rb terminal cannot get resources for a process ; description for the device) and the rb converter found no other files to ; convert, the rb converter will wait a while, and then repeat the scan to ; determine, whether the situation has changed. a14: rl. w2 b11. ;give up: open(paper manipulation); jl. w3 (b3.) ; rl. w2 b30. ; w2:=rb printer wait sem; al w0 1 ; if sem value >= 1 then sh w0 (x2) ; sem value:=1; rs w0 x2 ; al. w3 a0. ; return:=search rb paper; sh. w0 (b45.) ; rl. w0 b44. ; if no troubles during scan or sn w0 0 ; timer already send or sh w1 0 ; rb convert queue empty then jl. (b2.) ; lock(rb printer wait); goto return; rs. w3 b44. ; timer send:=true; am (66) ; al w1 +74 ; al. w3 b46. ; jd 1<11+72; set catbase(boss maxbase); al. w1 b42. ; w1:=delay message; al. w2 b43. ; jl. w3 (b34.) ; send and wait(clock, wait n secs); al w0 0 ; timer send:=false; rs. w0 b44. ; goto search paper; jl. a0. ; end; a2: rl. w2 b31. ; jl. w3 (b12.) ; lock chained(rb convert queue); al w0 d6 ; ws w1 0 ; w1:=modified reference to operation rl w0 x1+d60 ; move from operation to page 1 rs w0 x3+d60 ; error count rl w0 x1+d62 ; rs w0 x3+d62 ; device kind rl w0 x1+d59 ; rs w0 x3+d59 ; time of paper out or hard error jl. a7. ; goto release queue; a3: rs. w3 b45. ;error: any trouble:=true; a13: rl w2 x3+d41 ;reserved by boss: al w2 x2+1 ; increase(error count); rs w2 x3+d41 ; rl. w2 b31. ; queue:=rb convert queue; \f ; re 5.2.75 paper descriptions paper printer ...7b... a4: rs. w2 b16. ;put in queue: save queue; jl. w3 (b33.) ; get pages; rl. w1 b0.+4 ; w1:=convert operation; al w0 d6 ; ws w1 0 ; rl w0 x3+d60 ; move to operation rs w0 x1+d60 ; status, error count rl w0 x3+d62 ; device kind rs w0 x1+d62 ; al w1 x1+d6 ; rl. w2 b16. ; w2:=queue; jl. w3 (b32.) ; open chained; rl. w2 b16. ; se. w2 (b31.) ; if queue <> rb convert queue then jl. w1 c6. ; start paper printers; rl. w1 (b31.) ; if error count <= value of rb conv queue then sh w1 (x3+d41) ; jl. a14. ; goto give up; jl. a1. ; goto rep; ; in case of too many errors, the file is converted as a normal convert: a5: ; unknown bz w2 x3+d60 ; increase no of errors al w2 x2+1 ; during printing and hs w2 x3+d60 ; skip the file sh w2 i180 ; unless the error count jl. a3. ; is too big al w2 4 ; hs w2 x3+d61 ; status:= rerouted remotefile. al w2 14 ; rs w2 x3+d62 ; device kind:=printer bz w2 x3+d8 ; sl w2 i68-1 ; w2:=paper no; al w2 i78-1 ; wm. w2 b49. ; w2:=rel paper queue; wa. w2 b20. ; w2:=paper queue; jl. a4. ; goto put in queue; ; release the queue admittance ; if the queue is non-empty then start the next rb converter a7: rl. w2 b11. ; jl. w3 (b3.) ; open (paper manipulation); rl. w2 b30. ; ac w0 (x2) ; w0 := - value of rb printer wait; sl w0 1 ; if value < 0 and rl. w0 (b31.) ; sl w0 1 ; rb conv queue non-empty then jl. w3 (b3.) ; open(rb printer wait); \f ; lkn 76.1.22 paper descriptions printer ...7c... ; reserve the rb printer bz w0 x3+d61 ; w0:=status jd-1 sh w0 2 ; if status = continuation after hard error (= 2) sh w0 0 ; or status = continuation after end paper (= 1) then jl. a10. ; begin dl w1 110 ; w01:=clock ld w1 5 ; w0:=short clock jd-1 ws w0 x3+d59 ; - time of hard error jd-1 sh w0 i191 ; if time elapsed<=i191 then jl. a15. ; goto "reserved by boss" a10: ; end rl w2 (x3+d2) ; rs w2 x3+d32 ; save virt operation address; ac. w2 (b0.+4) ; w2:=negative abs operation address; ac w2 x2+d6 ; w2:=abs opaddr (modified); bz w1 x2+d8 ; hs w1 x3+d8 ; save papertype on page 1; ; begin a9: dl w1 x2+d52 ; ds w1 x3+r1+2 ; set devicename; ld w1 -100 ; ds w1 x3+r1+6 ; rl w0 x3+d4 ; rs w0 x3+r0 ; set abs ref message area dl w1 x2+d66 ; set catalog base ds w1 x3+r6+2 ; dl w1 x2+d50 ; ds w1 x3+r2+2 ; set device host description rl w0 x2+d62 ; wa. w0 b62. ; w0:= kind+ stdmode al w1 i191 ; ds w1 x3+r5 ; set mode,kind,timeout; dl. w3 b61. ; jl. w1 (b38.) ; call (lookup and reserve device); ; end; jl. a6. ;+2 error return; a17: rl w0 x3+r102 ;+4 rs w0 x3+d43 ; set logical device no; rl w0 x3+r103 ; am 1 ; hs w0 x3+d18 ; set mode; rl w2 (x3+r101) ; w2:=process descr addr of subprocess; al w3 x3+d21 ; w3:=abs ref process name; dl w1 x2+4 ; move process name; ds w1 x3+2 ; dl w1 x2+8 ; ds w1 x3+6 ; rl. w3 b0.+2 ; reestablish w3; rl w1 x3+r106 ; w1:=max blocksize; se w1 0 ; if maxblocksize set then sl w1 e47 ; al w1 e47 ; w1:= min(printerbuffer,maxblocksize); wa w1 x3+d4 ; al w1 x1-2 ; rs w1 x3+d5 ; last of buffer:=first of buffer rs w1 x3+d47 ; +length - 2; rl w2 x3+d32 ; rs w2 (x3+d2) ; restore virt operation address; dl. w3 b6. ; jl. (b4.) ; page jump to central; a6: rl w2 x3+d32 ; rs w2 (x3+d2) ; restore virt operation address; rl w0 x3+r100 ; w0:=result; sh w0 6 ; if result>6 then jl. a8. ; sl w0 8 ; am a13-a3 ; reserved by boss (regret); a15: am a3-a5 ; reserved by rc4000 process<>boss; a8: al. w3 a5. ; unknown; rl. w2 b11. ; jl. (b2.) ; lock (paper manipulation); e. \f ; re 5.2.75 paper descriptions printer ...7f... ; start next printer ; ; all paper queues are scanned, and compared to waiterbits and allowedbits. ; if at least one printer is found able to print, the ..printer wait.. ; semafor is opened c6: rs. w1 b28. ; save abs return; al w0 0 ; anything to print := false; am -2000 ; al. w2 b25.+2000 ; a2: rl w1 (x2+h3) ; for w2 := each paper descr entry do sh w1 0 ; jl. a3. ; if queue.entry > 0 then rl w1 x2+h10 ; anyprint := anyprint or la. w1 b27. ; (allowed.entry and waiterbits); lo w0 2 ; se w0 0 ; jl. a4. ; a3: al w2 x2+h4 ; se. w2 b26. ; jl. a2. ; a4: rl. w2 b7. ; if some of the waiting printers will be able to print then se w0 0 ; jl. w3 (b3.) ; open(printer wait); ; nb: if that printer is not the one, it will activate the next jl. (b28.) ; return; ; paper exit ; ; reserve current paper, lock the paper queue ; and open paper reservations c3: rl w0 x2+h0 ; am. (b101.) ; b101 stepping stone to b1 rl. w3 b101. ; lo w0 x3+d44 ; users := users or printer id-bit; rs w0 x2+h0 ; al w1 x1+h0 ; rs w1 x3+d29 ; set rel of cur paper state; al w3 x3+d41 ; w3 := addr of saved name area; dl w1 x2+h1 ; ds w1 x3+2 ; move name from paper dl w1 x2+h2 ; descriptions to variables; ds w1 x3+6 ; rl w2 x2+h3 ; w2 := abs addr of paper sem; jl. w3 (b12.) ; lock chained (w2); rl w0 (x3+d2) ; save virt addr of rs w0 x3+d32 ; convert operation; rl. w2 b11. ; jl. w3 (b3.) ; open (paper reservation); dl. w3 b6. ; w2, w3 := virt, rel of ok-return; jl. (b4.) ; page jump to central; \f ; bøt 28.12.71 paper descriptions paper printer ...8... c.-1 ; search any paper / tape printer ; ; the paper queues are scanned backwards from cur ; paper (or top if cur paper = 0) and the next ; paper is reserved (or cur paper := 0 on end). c4: rl. w2 b11. ; jl. w3 (b2.) ; lock paper reservations; al w1 x3 ; wa. w1 b13. ; w1 := abs paper descr (page 1); rl w2 x1 ; w2 := cur paper; sn w2 0 ; if w2 = 0 then al w2 h5 ; w2 := top paper; al w2 x2-h4 ; cur paper := previous (w2); rs w2 x1 ; save cur paper; wa. w1 b17. ; w1 := abs of sem addr; rl. w0 x2+b25.+h3 ; rs w0 x1 ; transfer sem addr; wa. w1 b18. ; w1 := abs of paper name (page 1); al. w2 x2+b25.+h1 ; w2 := abs of paper name (descr); dl w0 x2 ; ds w0 x1+2 ; transfer paper name; dl w0 x2+4 ; ds w0 x1+6 ; rl. w2 b11. ; jl. w3 (b3.) ; open paper reservations; dl. w3 b9. ; jl. (b4.) ; page jump (return); z. ; set paper name ; initialize paper name and ; semaphore addr in variables c5: al w2 h4 ; wm w2 x3+d30 ; w2 := abs of paper am -2000 ; al. w2 x2+b25.+2000; descr (spec paper); al w1 x2+h0 ; am. (b100.) ; b100 stepping stone to b0 ws. w1 b100. ; rs w1 x3+d29 ; set rel of cur paper state; dl w1 x2+h1 ; am 2 ; ds w1 x3+d41 ; move paper name dl w1 x2+h2 ; am 6 ; ds w1 x3+d41 ; rl w1 x3+d44 ; w1 := id-bit(printer); lo w1 x2+h0 ; reserve paper; rs w1 x2+h0 ; dl w3 x3+2 ; jl. (b4.) ; page jump (return); \f ; lkn 20.10.75 disp convert tprinter ...8a... b. a50, p3, q50 w. q1=i46-18 ; user name q2=q1+8 ; paper type q3=q2+2 ; paper semaphore q4=q3+2 ; relative address on job file page q5=q4+2 ; accumulated length of queue q6=q5+2 ; accumulated number of files q7=q6+2 ; user fits: 0 = no, >0 = yes; q10=4 ; paper description q11=12 ; <colon> q12=16 ; number of files q13=20 ; <:files:> q14=24 ; <nl> q15=28 ; output block and return q20=4 ; paper description q21=12 ; <colon> q22=16 ; number of files q23=20 ; <:files:> q24=24 ; number of segments q25=28 ; <:segments:> q26=32 ; <nl> q27=36 ; output block and return q30=4 ; <:after:> q31=8 ; number of segments q32=12 ; <:segments:> q33=16 ; paper description q34=24 ; <colon> q35=28 ; file description q36=36 ; number of segments q37=40 ; <:segments:> q38=44 ; <nl> q39=48 ; output block and return p1=4 ; param1 p2=12 ; param2 p3=20 ; param3 f98=k-b0 ; rel entry display convert; al w0 0 ; rs w0 x3+q1 ; clear username; rs w0 x3+q5 ; clear length of queue; rs w0 x3+q6 ; clear number of files; dl w1 x3+p2+2 ; sn w0 -1 ; if param2 empty then jl. a10. ; goto scan semaphores; sn w0 0 ; if param2 = integer then jl. a3. ; goto set papertype; \f ; lkn 20.10.75 disp convert tprinter ...8b... sn. w0 (b59.) ; if param2<>remote then se. w1 (b59.+2); jl. a1. ; dl w1 x3+p2+6 ; se. w0 (b59.+4); jl. a1. ; goto save username; rl w0 x3+p3 ; se w0 -1 ; if param3 not empty then jl. a4. ; alarm(param); al w1 i68 ; else papertype:=remote; jl. a5. ; goto set papertype; a1: dl w1 x3+p2+2 ; save username: ds w1 x3+q1+2 ; dl w1 x3+p2+6 ; ds w1 x3+q1+6 ; dl w1 x3+p3+2 ; w01:=param3; se w0 -1 ; if param3 empty then jl. a2. ; al w1 0 ; w1:=paper0; jl. a3. ; goto set papertype; a2: sn w0 0 ; if param3=integer then jl. a3. ; goto set papertype; sn. w0 (b59.) ; if param3<>remote then se. w1 (b59.+2); jl. a4. ; rl w0 x3+p3+4 ; se. w0 (b59.+4); jl. a4. ; print alarm(param); al w1 i68 ; papertype:=remote; jl. a5. ; a3: sl w1 i68-1 ; if paper not known then al w1 i68-1 ; paper:=special paper; a5: rs w1 x3+q2 ; jl. a20. ; a4: al w1 5 ; param1:=alarm(5)=param; rs w1 x3+4 ; dl. w3 b54. ; jl. w1 (b51.) ; call(alarm print); a10: al w0 0 ; scan semaphores: rs w0 x3+q2 ; current paper:=0; rl. w1 b20. ; w1:=paper0 semaphore; rs w1 x3+q3 ; save current semaphore; al w0 -2 ; initialize line; rs w0 x3+q12 ; insert(integer); al w0 0 ; al w1 44 ; ds w1 x3+q11+2 ; insert(colon); \f ; lkn 20.10.75 display convert tprinter ...8c... al w1 45 ; ds w1 x3+q13+2 ; insert(files); al w1 8 ; ds w1 x3+q14+2 ; insert(nl); al w1 -6 ; rs w1 x3+q15 ; insert(output block and return); a11: rl w1 x3+q3 ; w1:=current semaphore; rl w0 x1 ; w0:= semaphore value; al w1 x1+e13 ; a14: rs w1 x3+q3 ; current semaphore:=next semaphore; sh w0 0 ; if queue empty then jl. a12. ; goto next paper; rs w0 x3+q12+2 ; insert(no of files); al w2 x3+q10 ; w2:= addr(paper description); jl. w1 a30. ; insert(paper description); rl. w2 b53. ; rl. w3 b55. ; jl. w1 (b51.) ; call(general print); a12: rl w1 x3+q2 ; al w1 x1+1 ; rs w1 x3+q2 ; current paper:=next paper; se w1 i68 ; if paper=remote then jl. a13. ; rl. w1 b31. ; w1:=remote semaphore; jl. a14. ; a13: sh w1 i68 ; if more papers then jl. a11. ; goto next semaphore; jl. a45. ; goto end display; a20: rl w1 x3+q2 ; w1:=paper type; se w1 i68 ; if paper=remote then jl. a19. ; rl. w1 b31. ; w1:=remote semaphore; jl. a18. ; a19: wm. w1 b49. ; wa. w1 b20. ; w1:=paper semaphore; a18: rs w1 x3+q3 ; save current semaphore; rl w0 x3+q1 ; se w0 0 ; if no username then jl. a21. ; begin al w1 44 ; ds w1 x3+q21+2 ; insert(colon); al w1 45 ; ds w1 x3+q23+2 ; insert(files); al w1 47 ; ds w1 x3+q25+2 ; insert(segments); al w1 8 ; ds w1 x3+q26+2 ; insert(nl); al w1 -6 ; rs w1 x3+q27 ; insert(outblock and return); al w0 -2 ; rs w0 x3+q22 ; insert(integer); rs w0 x3+q24 ; - al w2 x3+q20 ; jl. w1 a30. ; insert(paper description); jl. a22. ; end else \f ; lkn 20.10.75 display convert tprinter ...8d... a21: al w0 -2 ; begin rs w0 x3+q31 ; insert(integer); rs w0 x3+q36 ; - al w0 0 ; al w1 48 ; ds w1 x3+q30+2 ; insert(after); al w1 47 ; ds w1 x3+q32+2 ; insert(segments); ds w1 x3+q37+2 ; - al w1 44 ; ds w1 x3+q34+2 ; insert(colon); al w1 8 ; ds w1 x3+q38+2 ; insert(nl); al w1 -6 ; rs w1 x3+q39 ; insert(output block and return); al w2 x3+q33 ; w2:=address(paper description); jl. w1 a30. ; insert(paper description); ; end; a22: al w0 q39+2 ; w0:=first free on job file page; rs w0 x3+q4 ; save current position on job file page; rl. w2 b56. ; jd-1 jl. w3 (b2.) ; lock(paper man. semaphore); a25: rl w2 x3+q3 ; w2:=paper semaphore; rl w0 x2 ; jd-1 sh w0 (x3+q6) ; if semaphore value <=accumulated number of files jl. a29. ; then goto end of papertype; jl. w3 (b12.) ; lockch(paper sem); al w2 x1+d70 ; w2:=operation; dl w1 x2+d12 ; sn w0 (x3+q1) ; test username; se w1 (x3+q1+2) ; jl. a15. ; dl w1 x2+d13 ; sn w0 (x3+q1+4) ; se w1 (x3+q1+6) ; if username does not fit then jl. a15. ; goto accumulate queue; rl w1 x3+q4 ; w1:=current position on job file page; rs w1 x3+q7 ; username fits (q7>0); al w1 x1+12 ; jd-1 sl w1 q1 ; if no more room then jl. a28. ; goto end of operation; rs w1 x3+q4 ; save next position on job file page; rl w0 x3+q5 ; w0:=length of queue so far; am (x3+q4) ; rs w0 x3-4 ; save length of queue; rl w1 x2+d7 ; jd-1 se w1 0 ; if type=convertfile then jl. a24. ; \f ; lkn 20.10.75 display convert tprinter ...8e... dl w1 x2+d68 ; move filename; am (x3+q4) ; ds w1 x3-10 ; dl w1 x2+d69 ; am (x3+q4) ; ds w1 x3-6 ; jl. a26. ; else a24: al w0 0 ; am (x3+q4) ; ds w1 x3-10 ; insert(type) primout or job controlled; sn w1 1 ; if type=primout then jl. a26. ; goto primout; rl. w1 (b52.) ; w1:=printer full sem; jl. a27. ; a15: al w1 0 ; rs w1 x3+q7 ; username does not fit; rl w1 x2+d7 ; accumulate length of queue; sh w1 1 ; if job controlled then jl. a26. ; rl. w1 (b52.) ; w1:=printer full sem; jl. a23. ; a26: dl w1 x2+d10 ; al. w3 b46. ; jd 1<11+72; set catalog base; al. w1 b58. ; w1:=entry tail; al w3 x2+d9 ; w3:=filename; jd 1<11+42; lookup entry; am. (b101.) ; b101 stepping stone to b1 rl. w3 b101. ; w3:=abs page 1 jd-1 se w0 0 ; if entry not found then jl. a28. ; goto end of operation; rl w1 x1 ; w1:= size; a27: sn w0 (x3+q7) ; if userfiles then jl. a23. ; am (x3+q4) ; rs w1 x3-2 ; save length of file; a23: wa w1 x3+q5 ; rs w1 x3+q5 ; accumulate length of queue; a28: al w1 x2+d6 ; rl w2 x3+q3 ; jl. w3 (b32.) ; opench(paper sem); rl w1 x3+q6 ; al w1 x1+1 ; rs w1 x3+q6 ; increment number of files; jl. a25. ; repeat; a29: rl. w2 b56. ; jl. w3 (b3.) ; open(paper manipulation sem); al w0 0 ; se w0 (x3+q1) ; if no username then jl. a40. ; rl w0 x3+q6 ; rs w0 x3+q22+2 ; insert(number of files); rl w0 x3+q5 ; rs w0 x3+q24+2 ; insert length of queue; \f ; lkn 20.10.75 display convert tprinter ...8f... rl. w2 b53. ; rl. w3 b55. ; jl. w1 (b51.) ; call(general print); jl. a45. ; goto end of display; a40: al w0 -1 ; am (x3+q4) ; rs w0 x3 ; save stopsymbol; al w0 q39+2 ; rs w0 x3+q4 ; set current position on job file page; jd-1 a41: am (x3+q4) ; rl w1 x3 ; sh w1 -1 ; if next block is a stop symbol then jl. a45. ; goto end display; rl w2 x3+q4 ; al w2 x2+12 ; rs w2 x3+q4 ; current position:=next position on job file page; am (x3+q4) ; dl w1 x3-10 ; jd-1 sn w0 0 ; if filename then jl. a42. ; lo. w0 b57. ; move filename and insert spaces; lo. w1 b57. ; jd-1 ds w1 x3+q35+2 ; am (x3+q4) ; dl w1 x3-6 ; lo. w0 b57. ; lo. w1 b57. ; ds w1 x3+q35+6 ; jl. a43. ; a42: al w1 x1+48 ; else insert(primout or job controlled); ds w1 x3+q35+2 ; al w1 19 ; ds w1 x3+q35+6 ; a43: am (x3+q4) ; dl w1 x3-2 ; rs w0 x3+q31+2 ; insert(length of queue); rs w1 x3+q36+2 ; insert(length of file); al w0 0 ; rs w0 x3+q30 ; reestablish print text command; a44: rl. w2 b53. ; rl. w3 b55. ; jl. w1 (b51.) ; call(general print); jl. a41. ; repeat; a45: al w1 -10 ; rs w1 x3+4 ; insert(print time); al w0 0 ; al w1 19 ; ds w1 x3+8 ; insert(space); al w1 21 ; ds w1 x3+12 ; insert(end display); \f ; lkn 20.10.75 display convert tprinter ...8g... al w1 -4 ; rs w1 x3+14 ; insert(output block and goto after action); jl. a44. ; goto call general print ; procedure insert paper description ; ; call return ; w0 - undefined ; w1 link undefined ; w2 addr.of paper descr. unchanged ; w3 addr.of job file page unchanged a34: 0 ; return address; a35: <:special :>,0 ; a36: <:remote :>,0 ; a30: rs. w1 a34. ; save return address; rl w1 x3+q2 ; w1:=paper; sl w1 i68-1 ; if standard paper then jl. a31. ; begin al w0 -2 ; ds w1 x2+6 ; insert(paper number); al w0 0 ; al w1 46 ; ds w1 x2+2 ; insert(paper); jl. (a34.) ; return; ; end; a31: se w1 i68-1 ; if special paper then jl. a32. ; begin dl. w1 a35.+2 ; ds w1 x2+2 ; insert(special); dl. w1 a35.+6 ; ds w1 x2+6 ; jl. (a34.) ; return; ; end; a32: dl. w1 a36.+2 ; begin ds w1 x2+2 ; dl. w1 a36.+6 ; insert(remote); ds w1 x2+6 ; jl. (a34.) ; return; ; end; e. \f ; bøt 28.12.71 paper descriptions paper printer ...9... ; define relative addresses to be used in ; initialization and other pages f80 = b2 - b0 ; lock simple f81 = b3 - b0 ; open simple f82 = b4 - b0 ; page jump f83 = b5 - b0 ; virt of central page f84 = b38 - b0 ; call f85 = b39 - b0 ; virt, f86 = b61 - b0 ; rel. lookup and reserve device; f89 = b60 - b0 ; rel. connect telex; f87 = b11 - b0 ; paper reservation sem f88 = b12 - b0 ; lock chained f90 = c1 - b0 ; rel entry new paper f91 = b7 - b0 ; paper manipulation sem f93 = c5 - b0 ; rel entry set printer name f120= b20 - b0 ; first paper queue f121= b30 - b0 ; rb printer wait f122= b31 - b0 ; rb convert queue f123= b32 - b0 ; open chained f124= b33 - b0 ; get pages f125= b34 - b0 ; send and wait f131= b51 - b0 ; call f132= b52 - b0 ; printer full sem f133= b53 - b0 ; virt, f134= b54 - b0 ; rel alarm print f135= b55 - b0 ; rel general print f136= b56 - b0 ; paper manipulation sem; ; define absolute addresses ; to external list or initialization g90 = f80 + g6 , g91 = f81 + g6 , g92 = f82 + g6 g93 = f83 + g6 , g94 = f84 + g6 , g95 = f85 + g6 g96 = f86 + g6 , g97 = f87 + g6 , g98 = f88 + g6 g99 = f89 +g6 , g100= f90 + g6 , g101= f91 + g6 g102= h5 + g6 , g103= h6 + g6 , g104= h9 + g6 g173= f120+ g6 , g174= f121+ g6 , g175= f122+ g6 g176= f123+ g6 , g177= f124+ g6 , g178= f125+ g6 g181= f131+ g6 , g182= f132+ g6 , g183= f133+ g6 g184= f134+ g6 , g185= f135+ g6 , g186= f136+ g6 ; terminate page f3 = k - b0 ; length of page k = g6 + f3 ; reset k g7 = k - 2 ; last of page f100 = f100 + 4; count k-assignments \f ; bøt 28.12.71 initialization paper printer ...10... ; the following code is executed during the translation ; ; it initializes the paper description entries. ; special paper names are copied from the options. ; if any error is found in the names, the translation ; is terminated with an alarm message. b. a15, j20 w. a0: ds. w3 j3. ; insert names: am -2000 ; al. w2 g103.-4+2000; to := first of paper descr; am -2000 ; al. w3 e38.+2000-f100; from := first of paper table; a1: al w1 x2 ; next paper: save to; al w0 0 ; set initial users; rs w0 x2+h0 ; rep1: al w0 -1 ; set initial allows: all papers allowed; rs w0 x2+h10 ; a2: rl w0 x3 ; word (to + namerel) := rs w0 x2+h1-2 ; word (from); aa. w3 j4. ; update pointers; sz w0 255 ; if last char <> 0 then jl. a2. ; goto rep1; sl w2 x1+h2+3 ; if w2 > last name word + 2 then jl. a4. ; goto alarm2; al w2 x1+h4 ; to := first of next entry; sn. w2 g104.-4 ; if to = top name then jl. a6. ; goto set fixed; am -2000 ; se. w3 e39.+2000-f100; if from <> top then jl. a1. ; goto next paper; a3: al. w0 j0. ; alarm1: jl. (j3.) ; <:too few paper names:>; a4: al. w0 j1. ; alarm2: jl. (j3.) ; <:paper name too long:>; a5: al. w0 j2. ; alarm3: jl. (j3.) ; <:too many paper names:>; a6: am -2000 ; se. w3 e39.+2000-f100; set fixed: if from <> top then jl. a5. ; goto alarm3; dl. w1 j6. ; insert general name ds w1 x2+h1 ; in name area; dl. w1 j7. ; ds w1 x2+h2 ; al w1 0 ; rs w1 x2+h0 ; initialize users; al w1 -1 ; initialize allowed rs w1 x2+h10 ; a7: sl. w2 g102.-h4-4; rep2: if to = last then jl. a8. ; goto insert devicenumbers; rl w1 x2 ; word(to + length of entry) rs w1 x2+h4 ; := word (to); al w2 x2+2 ; update to; jl. a7. ; goto rep2; \f ; bøt 28.12.71 initialization paper printer ...11... a8: ; insert devicenumbers: al. w2 g6.+h5-4; w2 := to := first of deviceno table; am -2000 ; al. w3 e35.+2000-f100; w3 := from := first of option table; a9: rl w0 x3 ; rep: rs w0 x2 ; move devicenumber; al w2 x2+2 ; increase(to); al w3 x3+e37 ; from := from + length of entry; am -2000 ; se. w3 e36.+2000-f100; if from <> top entry then jl. a9. ; goto rep; am -2000 ; al. w3 e58.-f100+2000; w3:=first of preselected papers rs. w3 j12. ; save first entry in preselect table am -2000 ; al. w2 g103.-4+2000; w2:=first of paper descriptions rs. w2 j14. ; set current paper description al w0 0 ; rs. w0 j15. ; clear all paper mask al w0 -2 ; rs. w0 j11. ; paper count:=-2 j17: rl. w3 j11. ; w3:=paper count al w3 x3+1 ; + 1 sl w3 i78 ; if more papers then jl. j20. ; begin rs. w3 j11. ; al w0 0 ; rs. w0 j13. ; clear allowed bits al w2 -1 ; j18: al w2 x2+1 ; w2:=next printer sl w2 i71 ; if more printers then jl. j19. ; begin rl. w3 j12. ; wa w3 4 ; w3:=abs ref current entry in preselect table bl w3 x3 ; w3:=preselected paper sn. w3 (j11.) ; if w3 = current paper am 1-0 ; then allowed := true al w0 0 ; else allowed :=false ls w0 x2 ; set idbit if allowed lo. w0 j13. ; rs. w0 j13. ; allowed mask:=idbit or allowed mask jl. j18. ; end j19: rl. w0 j13. ; w0:=allowed mask rl. w3 j11. ; w3:=current paper se w3 -1 ; if all papers (=-1) then jl. j16. ; begin rs. w0 j15. ; set all paper mask jl. j17. ; end else j16: ; begin sn w0 0 ; if current paper not preselected at all rl. w0 j15. ; then take all paper mask rl. w1 j14. ; w1:=current paper description rs w0 x1+h10 ; set allowed bits al w1 x1+h4 ; rs. w1 j14. ; set next paper description jl. j17. ; end j20: ; end al w0 0 ; finis: al w2 0 ; jl. (j3.) ; return (ok); c. e59-e58-i71-1 m.***table of preselected papers does not match printer table z. c.-e59+e58+i71-1 m.***table of preselected papers does not match printer table z. j0: <:<10>***too few paper names<0>:> j1: <:<10>***paper name too long<0>:> j2: <:<10>***too many paper names<0>:> 2 ; j4: 2 ; update pointers j6 = k + 2 ,0,0 j7 = k + 2 ,0,0 j10: 0 ; saved w2 j3: 0 ; saved w3 j11: 0 ; paper count j12: 0 ; first entry in preselect table j13: 0 ; allowed bits in current paper j14: 0 ; current paper description j15: 0 ; all paper mask jl. a0. ; goto insert names e. i. j. \f ; bøt 28.12.71 initialization paper printer ...12... ; initialize paper description page ; ; the semaphore addresses are initialized ; the page is put in the virtual store, and ; all external entries on it are put in the ; external list b. a5, j5 w. g11: rl. w3 j3. ; w3 := first of semaphores am -2000 ; al. w2 g103.+2000; w2 := first paper descr addr; rs. w3 g135. ; ext 380 := paper 0 queue addr; a0: rs w3 x2+h3 ; rep: queue addr(w2) := sem(w3); al w2 x2+h4 ; w2 := addr of next descr; al w3 x3+e13 ; w3 := addr of next semaphore; se. w2 g102. ; if w2 <> top descr addr then jl. a0. ; goto rep; rs. w3 g136. ; ext 381 := addr of all paper sem; am -2000 ; rl. w2 g97.+2000 ; ext(379) := paper manipulation sem; rs. w2 g137. ; rl. w2 j4. ; ext(378) := remote batch printer convert que; rs. w2 g138. ; al w2 x2+e13 ; ext(377):=rb printer wait sem; rs. w2 g139. ; al w0 i165 ; w0 := reserve on disc; am +2000 ; al w1 f3-2000 ; w1 := length of page; jl. w3 (j0.) ; reserve virt ( w0, w1, w2); am -2000 ; al. w0 g6.+2000; w0 := start of page; al w2 x2+1 ; writing bit; jl. w3 (j1.) ; move to virt (w0, w1, w2); rs. w2 g146. ; ext 385 := virt of papers jl. w3 (2) ; set externals; g167: 40 ; g135: 0 , 380 ; paper 0 queue addr; g136: 0 , 381 ; addr of all paper sem; g137: 0 , 379 ; paper manipulation sem; g138: 0 , 378 ; remote batch printer; g139: 0 , 377 ; rb printer wait sem; g146: 0 , 385 ; virt of papers; f98, 147 ; rel entry display convert; f97, 396 ; rel entry select; f96, 397 ; rel entry reject; 0 , -1000 ; end of externals; al w0 1 ; reserve paper descriptions am -2000 ; rs. w0 (g97.+2000) ; sem value := 1; jl. g10. ; goto initialize variables j0: 12 ;* reserve virt; j1: 13 ;* move to virt j2: 0 ;* first externals j3: h. e13*i78+e13 ;* semaphores 19 ; j4: ; c. i190-1, 2*e13 , 19 z. ;* remote batch printer convert queue, rb printer wait sem w. 0 ; (or first external) g115 = j0, g116 = j1, g117 = j2, g118 = j3, g119 = j4 e. e. \f ; bøt 28.12.71 variables paper printer ...13... ; variables for paper printers ; ; this page exists in as many incarnations as there ; is paper printers ; ; ; define start of page g4: b. k = 0, f100 = f100 + 4 ; count k-assignments w. d0: 0 ; work 0 (in state 3 and 4: rel of cur in) d1: 0,r.4 ; work 1,2,3,4 d30: 0,r.8 ; works d31: 0 ; work d2: 0 ; page 2 addr of virt addr d3: 0 ; page 3 addr of virt addr d4: 0 ; first of output buffer d5: 0 ; last of output buffer (modified) d47: 0 ; last of output buffer (constant) ; actual convert operation h. -1, r. e41-2 ; space for operation (except chain) w. d6 = k-e41 ; chain (not used) d7 = d6 + 2 ; type ; 0 = convert ; 1 = primout ; 2 = job controlled before -2 (end signal to printer); ; 3 = job controlled after -2 - d38 = d6 + 4 ; no of slices d8 = d6 + 5 ; paper number d9 = d6 + 6 ; document name d10 = d6 + 18 ; interval d11 = d6 + 20 ; project number d12 = d6 + 24 ; username 0,2 d13 = d6 + 28 ; username 4,6 d14 = d6 + 30 ; addr of user id d39 = d6 + 32 ; file name d68 = d39+2 ; first of file name; d69 = d39+6 ; last of file name; d70 = -d6 ; the points start with a pseudo point consisting of the following variables: d15 = d6 + 40 ; rel segmno or virt addr d16 = d15+ 2 ; no of segments to release d17 = d15+ 3 ; segment rel d36 = d15+ 4 ; global line count d37 = d15+ 6 ; global page count d49 = d6 + 48 ; device host description d50 = d6 + 50 ; - d51 = d6 + 52 ; local term id of rb term (two chars, left justified) d52 = d6 + 56;+54 ; local rb printer name (last of double word) d60 = d6 + 58 ; no of errors during printing d61 = d6 + 59 ; status of conversion: ; 0 = ok ; 1 = continues after endpaper ; 2 = continues after malfunction ; 4 = rerouted remote convert file d59 = d6 + 60 ;+60: time of hard error d62 = d6 + 62 ; device kind d66 = d6 + 66;+64 ; catalog base of job d70 = d6 + 70;+68 ; unused d40 = k-2 ; last of operation \f ; sm 75.07.07 variables paper printer ...14... c. (:(:e41-d40+d6-2:) a. 4095:) - 1 m.***convert buffer size z. h. d24: 0, r.i72*e42 ; first point d25 = k - e42 w. ; last point ; output operation d18: 5 < 12+i185 ; standard-printer mode = 2 in operation (see page 16) d19: 0 ; first of transfer d20: 0 ; last of transfer d21: 0,r.4 ; printer name 0 ; name table entry d22: 0 ; coroutine status d23: 0 ; segment claim ; rest no of segments to be locked ; in points d26: 0 ; top addr of input buffer d27: 0 ; local line count d28: 0 ; local page count d29: 0 ; rel paper address (zero for remote batch printers) d32: 0 ; virt addr of cur operation d33: 0 ; printer queue addr (undef for remote batch printers) d34: 0 ; virt of cur request line or 0 d35: 0 ; answer sem addr (undef for remote batch printers) d41: 0,r.4 ; paper name (remote batch printers: error count) d42: 0 ; segment buffer, virt d43: 0 ; printer device no d44: 0 ; id bit (zero for remote batch printers) d45: h. 0 ; preferred paper (initially std paper = 0) d46: 0 w. ; printer kind: 0 == standard printer ; 1 == remote batch printer d53: 0 ; operator mode (remote batch printers only) d54: 0 ; serial number of printer output d55: 0 ; saved statusword from output f2 = k ; define length of page k = g4 + f2 ; reset k e. g5 = k - 2 ; define last of page f100 = f100 + 4 ; count k-assignments \f ; bøt 28.12.71 initialization paper printer ...15... ; initialize variables ; ; the coroutine descriptions are initialized ; the core store buffers are reserved ; the variables are reserved and initialized b. a10, j20 w. g10: jl. w3 (2) ; set externals; g169: 40 ; j12: (:e13*i71:)<12+19,80; start printer queue; 0 , -1000 ; end of externals; am (66) ; dl w1 +74 ; w0, w1 := max interval; al. w3 j14. ; w3 := addr o fzero; jd 1<11+72 ; set catalog base; a0: rl. w1 j5. ; next; al w1 x1+1 ; incarnation := incarnation + 1; rs. w1 j5. ; sh w1 i71+i190; if incarnation > no of printers + remote batch printers then jl. 6 ; am 2000 ; goto initialize central; jl. g9. ; rl. w2 j6. ; w2 := coroutine descr addr; al w0 x2+10 ; rs. w0 g4.+d2 ; insert virt page 2 addr; al w0 x2+12 ; rs. w0 g4.+d3 ; insert virt page 3 addr; rl. w0 j8. ; rs w0 x2+6 ; page0(descr) := central; al w1 x1+39 ; return (descr):= ((39+incarnation) ls w1 15 ; shift 3 + test) shift 12 wa. w1 j9. ; + rel entry central; rs w1 x2+4 ; rel entry central; al w0 i166 ; w0 := variables on disc; al w1 f2 ; w1 := length of page; jl. w3 (j0.) ; reserve virt (w0, w1, w2); al w2 x2+1 ; insert writing rs. w2 j14. ; save virt; rl. w1 j6. ; w1 := descr addr; rs w2 x1+8 ; page1(descr) := variables; jl. w3 (j2.) ; put in active queue; al w1 x1+e12 ; descr addr := rs. w1 j6. ; descr addr + length of descr; \f ; re 22.7.1974 initialization paper printer ...15a... rl. w0 j5. ; w0 := incarnation; rl. w1 j7. ; w1 := actual buffer start; sl w0 i71+1 ; if incarnation > no of printers then am e47-e40; use remote batch printer buffer size; al w2 x1+e40-2 ; w2 := actual buffer end; ds. w2 g4.+d5 ; save buffer limits on page; rs. w2 g4.+d47; sl w0 i71+1 ; if incarnation > no of printers then am e47-e40; use remote batch printer buffer size; al w1 x1+e40 ; actual buffer start := rs. w1 j7. ; actual buffer start + length; sl w0 i71+1 ; if incarnation > no of printers then jl. a2. ; goto remote batch printer; am. (j5.) ; w2 := deviceno of bz. w2 j15. ; printer(incarnation)*2; rs. w2 g4.+d43; save device no; ls w2 1 ; wa w2 74 ; w2 := proc descr addr of printer; rs. w2 g4.+d21+8; set name table address; sl w2 (76) ; if illegal device number then jl. a3. ; goto alarm; rl w2 x2 ; al. w3 g4.+d21 ; w3 := printer name area on page; dl w1 x2+4 ; ds w1 x3+2 ; move printer name from dl w1 x2+8 ; process description to ds w1 x3+6 ; variable page; jd 1<11+ 6 ; initialize process \f ; bøt 28.12.71 initialization paper printer ...16... ;*** test for centronics printer al w0 i185 ; mode in message := rl w1 x2 ; if kind = 70 sn w1 70 ; (i.e. medium speed telemultiplexor) al w0 1<6 ; then 1<6 hs. w0 g4.+d18+1; else i185; ;*** al. w3 g4. ; w3 := page start; rl. w2 j16. ; rs w2 x3+d44 ; idbit(page 1) := ident bit; ls w2 1 ; rs. w2 j16. ; identbit := identbit shift 1; rl. w2 j12. ; w2 := queue addr; rs w2 x3+d33 ; actual queue(page 1):= w2; al w2 x2+e13 ; w2:= w2 + sem length; rs. w2 j12. ; queue addr := w2; rl. w2 j13. ; answer(page 1) := rs w2 x3+d35 ; answer sem; al w2 x2+e13 ; answer sem := rs. w2 j13. ; answer sem + sem length; a1: al w0 i70 ; reserve virt buffer: w0 := reserve on disc; al w1 512 ; w1 := length of buffer; jl. w3 (j0.) ; reserve virt (w0, w1, w2); al w2 x2+1 ; insert writing; rs. w2 g4.+d42 ; buffer addr(page 1) := virt; al. w0 g4. ; w0 := start of page 1; al w1 f2 ; w1 := length of page 1; rl. w2 j14. ; w2 := virt of page 1; jl. w3 (j1.) ; move to virt ( w0, w1, w2); jl. a0. ; goto next; a2: al. w3 g4. ; remote batch printer: al w0 1 ; hs w0 x3+d46 ; printer kind(page 1) := remote batch printer; al w0 0 ; idbit(page 1) := 0; rs w0 x3+d44 ; jl. a1. ; goto reserve virt buffer; a3: al. w0 j10. ; alarm: <:illegal printer device number:>; jl. w3 (j4.) ; \f ; bøt 28.12.71 initialization paper printer ...17... j0: 12 ;* reserve virt j1: 13 ;* move to virt j2: 24 ;* put in active queue j3: 0 ;* base externals j4: 31 ;* init alarm j5: 0 ; incarnation number j6: h. e12*i71+e12*i190, 18 ;* coroutine descr addr; j17: e40*i71, 19 ;* buffer area j7: e47*i190, 19 ;* buffer area j8: 0,387 ;* virt addr of central j9: e92,f60 w. ; test mode, entry in central j10: <:<10>illegal printer device no.<10><0>:>,0,0 j11: h. 0,r.i71 w. ; printer device no table h. j13: e13*i71,19 ;* answer sem addr (only paper printers) j14: w. 0 ; virt of descr j15 = j11-1 j16: 1 ; identification bit; c. (:e40*i71-4095:) o. (:e47*i190-4095:) m. ***sum of printer buffer sizes exceeds 4095 z. ; define externals g120 = j0, g121 = j1, g122 = j2, g123 = j3, g124 = j4 g126 = j6, g127 = j7, g128 = j8, g129 =j12, g125 = j13 g105 = j17 ; initialize printer device numbers a5: am -2000 ; am -2000 ; al. w1 e35.-f100+4000; w1 := start of option table al. w2 j11. ; w2 := start of page table; a6: rl w0 x1 ; rep: hs w0 x2 ; byte(w2) := word(w3); al w1 x1+e37 ; w1 := w1 + length of entry; al w2 x2+1 ; w2 := w2 + 1; am -2000 ; am -2000 ; se. w1 e36.-f100+4000; if w1 <> top entry then jl. a6. ; goto rep; al w0 0 ; al w2 0 ; jl x3 ; return to slang jl. a5. ; goto initialize j. e. \f ; bøt 28.12.71 central page paper printer ...18... ; central page ; ============ ; ; this page takes care of all special situations not handled ; in the main loop. all information about this is contained ; in the page-1 variable state ; ; state has the following contents: ; ; bit value contents ; 1 ; 2 progress ; 4 ; ; 8 waiting for operator message (queue) ; ; 16 end of paper ; 32 hard error printer bits ; 64 disconnected ; ; 128 wait for start operation ; ; progress defines the actual state of printing: ; ; value ; ; 0 no paper found ; 1 ready for printing, operation saved ; , points initialized ; 2 head printed ; 3 text conversion started ; 4 -2 passed ; 5 text ended ; 6 end printed, conversion not terminated ; ; ; the contents of state will be handled in the following ; order: ; 1. operator messages ; 2. hard error / disconnected ; 3. end paper ; 4. progress ; ; the handling of each part of state will allways result in a ; changing of state (normally a simplification) and as a rule ; a return to the central entry. ; ; when progress = 3 or 4 and the rest of state = 0, return ; is performed to the main loop. \f ; bøt 28.12.71 central page paper printer ...19... g2: k = 10000, f100 = f100 + 4 ; count k-assignments b. b100, c50 w. ; the names are used as follows: ; ; a-names local labels ; b-names global variables ; c-names global labels ; d-names global variables on page 1 ; j-names local variables ; ; i- and e- names are options ; f- and g- names are super global addresses used in ; other pages and in initialization ; ; the b- and c- names have same meaning in this page and in ; the main loop and in the triangle page ; ; ; the pages are used as follows: b0: 0 ; page 0 this page b1: 0 ; page 1 variables b2: 0 ; page 2 operations b3: 0 ; page 3 input buffer b4: 0 ; page 4 not used (= zero) 71<12+0 ; pageident: central page ; entries in central logic b5: 1 ;* send and wait b6: 2 ;* send and wait fast b7: 3 ;* lock simple b8: 4 ;* open simple b9: 5 ;* lock chained b10: 6 ;* open chained b11: 7 ;* get pages b12: 8 ;* page jump b15: 25 ;* call b16: 32 ;* prepare access b17: 33 ;* terminate access b18: 21 ;* priv output ; semaphores b20: 380 ;* first paper queue b21: 381 ;* printer wait b22: 67 ;* banker queue b23: 60 ;* segments free b24: 61 ;* segments full b25: 382 ;* convert operations 388 ;* b25+2: convert operations type 2 b27: 51 ;* request display queue b28: 52 ;* request lines b29: 0 ;- answer sem from banker (ext 76 + e13) b30: 78 ;* reserve banker access b31: 74 ;* catalock b32: 379 ;* paper manipulation b33: 378 ;* rb convert queue \f ; bøt 28.12.71 central page paper printer ...20... ; virtual addresses b41: 383 ;* first of super buffer b42: 384 ;* top of super buffer 385 ;* virt and b43: f90 ; rel of next free paper 386 ;* virt and b45: f21 ; rel of return to main loop b46: 435 ;* virt of account buf; b47: 436 ;* virt and b48: 431 ;* rel of account code; b81: 389 ;* virt of triangle page b82: f70 ; rel of print front page b83: f71 ; rel of print last page ; input operation b50: 3<12 ; operation b51: 0 ; first of transfer b52: 0 ; last of transfer b53: 0 ; segment number ; miscellaneous constants and variables b60: 7 ; mask progress b61: -1-7 ; clear progress b62: <: :> ; spaces b63: <:***:> ; stars b69: e13 ; size of semafor b70: e42 ; length of point 2 ; b71: 2 ; update pointers, malfunction status, malfunction status b72: 10 ; 2<12 + 1 ; banker operation - b74: 1<12 + 0 ; contents (2,4 or 6), error count increment, error count increment b75: -2 ;* boss private interval start b76: -1 ;* boss private interval end b77: <:printer <0>:> ; operator text fixed part b78 = k - b77 + 10 ; operator text rel of var part \f ; bøt 28.12.71 central page paper printer ...21... ; entry central page ; ; entry parameter : state (in x3+d22) ; ; the central page will first interprete ; a possible operation in the printer queue ; ; then the printer state will be handled ; and at last, the progress ; ; all parts of state may change during the ; handling, and this entry will be entered ; several times b. j4 w. c10: rl w1 x3+d22 ; if wait bits in state rl w0 x3 ; jd-1 ; w1:=state sz w1 128+8 ; > 0 then jl. c11. ; goto prepare examine; ls w1 -4 ; la. w1 b60. ; extract printer state; ba. w1 x1+j0. ; jl. x1+j0. ; goto action (printer state); ; prepare examine queue ; ; the queue bit in state (w1) is ; cleared c11: sz w1 8 ; if queue bit set then al w1 x1-8 ; state := state rs w1 x3+d22 ; - queue bit; ; examine queue ; ; the operation is locked and interpreted ; on exit w1 = param value and the operation ; is released c12: rl w2 x3+d33 ; jl. w3 (b9.) ; lock (printer queue); bz w2 x1+3 ; w2 := type * 2 ls w2 1 ; al w0 0 ; rs w0 x1+2 ; release operation; rs w0 (x3+d2) ; release page 2; rl w1 x1+4 ; w1 := param; rl w0 x3+d22 ; jd-1 ; w0:=state, w1:=param la. w0 x2+j2. ; st := state and mask (w2); sl. w0 (x2+j3.) ; if st < min(w2) or sl. w0 (x2+j4.) ; st > max(w2) then jl. c30. ; goto alarm; ls w2 -1 ; w2 := type; ba. w2 x2+j1. ; jl. x2+j1. ; goto action (type); \f ; bøt 28.12.71 central page paper printer ...22... ; printer state action table h. j0: c15. , c16. , c17. , c17. , c18. , c18. , c18. , c18. ; no bits , end , hard error , disconnected ; operations action table j1: c30. , c20. , c21. , c22. , c23. ; alarm start , repeat , kill , change w. ; state masks ; minimum state values ; top state values ; ; no op , start , repeat , kill , change j2: 0 , 0 , 128+7 , 128+7, 128+7 j3: 1 , -1 , 3 , 3 , 128+1 j4: -1 , 1 , 4 , 4 , 128+2 e. ; procedure reset points ; ; w1 = no of points to release ; w2 = return ; ; the top in the points is calculated as first point + ; no of points to release * point length. ; in case of job controlled output all segments locked ; in points before (and inclusive) top will be released by opening the ; simple semaphore segments full ; ; then top point will be moved to first point, top point + 1 ; will be moved to second point and so on, letting last point ; fill the ending points ; ; at last the local line- and page- counters will be ; cleared b. a10, j5 w. c13: rs. w2 j1. ; save return; wm. w1 b70. ; top := no of points * al w1 x1+d24 ; point length + rel of sl w1 d25+e42 ; first point; al w1 d25 ; if top > top of points then wa. w1 b1. ; top := last points; rs. w1 j0. ; save abs of top; \f ; bøt 28.12.71 central page paper printer ...23... ; reset points (continued) rl w1 x3+d7 ; if type <> so w1 2 ; job controlled output then jl. a3. ; goto move; al w2 x3+d24-e42 ; cur := addr of first point - point length; al w0 0 ; al w1 0 ; segm := 0; a1: sl. w2 (j0.) ; test: if cur = top then jl. a7. ; goto set claims; ba w1 x2+2+e42 ; segm := segm + no of jd-1 hs w0 x2+2+e42 ; segments to release(cur + point length); al w2 x2+e42 ; cur := addr of next point; jl. a1. ; goto test; a7: rl w0 x3+d23 ; set claims: wa w0 2 ; segment claim := segment claim rs w0 x3+d23 ; + no of segments to release; a2: sh w1 0 ; release: if segm = 0 then jl. a3. ; goto move; rl. w2 b24. ; jl. w3 (b8.) ; open (segments full); al w1 x1-1 ; segm := segm - 1; jl. a2. ; goto release; a3: rl. w2 j0. ; move : from := top; al w1 x3+d24 ; to := addr of first point; a4: rs. w2 j0. ; next point: save from; sn w1 x2 ; if to = from then jl. a6. ; goto finis; al w2 0 ; rel := 0; a5: am. (j0.) ; next word: rl w0 x2 ; word(to) := rs w0 x1 ; word(from + rel); aa. w2 b71. ; update to and rel; se w2 e42 ; if rel < point length then jl. a5. ; goto next word; wa. w2 j0. ; from := addr of next point to move; sh w2 x3+d25 ; if from <= last then jl. a4. ; goto next point; al w2 x3+d25 ; from := last point; al w0 0 ; no of segments to hs w0 x2+2 ; release := 0; jl. a4. ; goto next point; a6: al w0 0 ; finis: rs w0 x3+d27 ; local line count := rs w0 x3+d28 ; local page count := 0; rl w1 x3 ; jl. (j1.) ; return; j0: 0 ; saved top or saved from j1: 0 ; saved return; e. \f ; bøt 28.12.71 central page paper printer ...24... ; procedure put back in queue ; ; w2 = return ; the first point is inserted in the operation, ; which is set in front of the actual queue ; cur paper := no paper; b. a10 w. c14: ws. w2 b0. ; rs w2 x3+d1 ; save rel return; bl w1 x3+d46 ; se w1 1 ; if remote batch printer then jl. a6. ; begin al w1 4 ; w1:= rerouted status bz w0 x3+d60 ; w0:= error count sl w0 i180 ; if this file will be rerouted now then hs w1 x3+d61 ; status:= rerouted remote convert file am (66) ; dl w1 +74 ; al. w3 b4. ; jd 1<11+72; set boss max interval; rl. w3 b1. ; al w3 x3+d21 ; remove process(printer name); jd 1<11+64; al w0 0 ; name table address := 0; rs w0 x3+8 ; rl. w3 b1. ; end; a6: al w1 i79 ; jl. w2 c13. ; reset points (std value); rl w1 x3+d32 ; rs w1 (x3+d3) ; page 3 := operation; rl. w2 b32. ; lock(paper manipulation); jl. w3 (b7.) ; jl. w2 c29. ; release cur paper; rl. w2 b3. ; w2 := page 3; rl w0 x3+d59 ; move time of stop rs w0 x2+d59-d6 ; to operation rl w0 x3+d60 ; move status to rs w0 x2+d60-d6 ; operation; al w3 x3+e42 ; rel := length of point; a0: sn. w3 (b1.) ; while rel <> 0 do jl. a1. ; begin ss. w3 b71. ; w2 con rel:=w2 con rel - 2 con 2; rl w0 x3+d24 ; last wd(p3.pspoint):=last wd(p1.first point); rs w0 x2+d15-d6+e42; end; jl. a0. ; \f ; sm 75.06.09 central page paper printer ...24a... a1: dl w2 x3+d37 ; al w2 x2-1 ; global counters := al w1 x1-1 ; global counters - 1; ds w2 x3+d37 ; bz w2 x3+d8 ; w2 := paper type; sl w2 i68-1 ; al w2 i78-1 ; wm. w2 b69. ; w2 := rel paper que sem wa. w2 b20. ; + first paper que; bz w0 x3+d60 ; if remote batch and bl w1 x3+d46 ; error count < option limit then sn w1 1 ; sl w0 i180 ; jl. 4 ; rl. w2 b33. ; w2:=rb convert queue; al w1 -1 ; hs w1 x3+d8 ; paper type := no paper; rl. w1 b3. ; w1 := addr of operation; rl w0 x3+d32 ; w0 := virt op addr; rx w0 x2+2 ; first(sem) := w0; w0 := second; rs w0 x1 ; chain (operation) := second; rl w0 x1 ; rl w1 x3+d32 ; if second = 0 then sn w0 0 ; last(sem) := virt op; rs w1 x2+4 ; al w0 0 ; rs w0 (x3+d2) ; release page 2; rs w0 (x3+d3) ; release page 3; jl. w3 (b8.) ; open simple (cur paper sem); rl. w2 b21. ; jl. w3 (b8.) ; open (printer wait); rl. w2 b32. ; open(paper manipulation); jl. w3 (b8.) ; al w2 x3+d9 ; rl w0 x3+d7 ; if job controlled output sz w0 2 ; then jl. a2. ; goto job controlled; jl. w3 (b17.) ; terminate access (document); jl. a5. ; goto return; \f ; re 24.9.73 central page paper printer ...25... a2: rl w1 x3+d23 ; job controlled: w1:= segment claim; a3: sl w1 i77-1 ; for w1:= w1+1 while w1 < max segment claim do jl. a4. ; open(segments free); rl. w2 b23. ; jl. w3 (b8.) ; al w1 x1+1 ; jl. a3. ; a4: rl. w2 b24. ; se w1 i77 ; if segment claim <> max segment claim then jl. w3 (b8.) ; open (segments full); a5: rl w1 x3+d1 ; jl. x1+b0. ; return e. \f ; bøt 28.12.71 central page paper printer ...26... ; normal printer status ; ; switch to action (progress); b. j0 w. c15: rl w1 x3+d22 ; la. w1 b60. ; extract progress; ba. w1 x1+j0. ; jl. x1+j0. ; goto action(progress); h. j0: c31. ; 0 nextfile c43. ; 1 print front page c32. ; 2 start printing c19. ; 3 return to main loop c19. ; 4 return to main loop c44. ; 5 print last page c33. ; 6 end printing w. e. ; end paper action ; ; put operation back in queue ; state := 0 ; goto central; c16: ; dl w1 110 ; w01:=clock ld w1 5 ; w0:=short clock rs w0 x3+d59 ; set time of paper out al w0 1 ; status := 1 (i.e. continue after endpaper); hs w0 x3+d61 ; jl. w2 c14. ; put back in queue; al w0 0 ; rs w0 x3+d22 ; state := 0; jl. c10. ; goto entry central; ; release cur paper c29: ws. w2 b0. ; rs w2 x3+d30+2 ; save return; rl. w2 b43.-2 ; rs w2 (x3+d2) ; page 2 := paper descr; jl. w3 (b11.) ; rl. w1 b2. ; wa w1 x3+d29 ; w1 := addr of state rl w0 x1 ; of cur paper; lo w0 x3+d44 ; remove idbit from users; ws w0 x3+d44 ; rs w0 x1 ; al w0 0 ; rs w0 (x3+d2) ; release page 2; am (x3+d30+2) ; jl. b0. ; return; \f ; bøt 28.12.71 central page paper printer ...27... ; hard error ; disconnected ; ; clear printer status and set ; waiting for start + end paper+ queue bit ; goto print alarm; b. a1, j5 w. c17: am j2 ; hard error: c18: al w1 j1 ; disconnected: rs w1 x3+d30 ; save alarm addr; dl w1 110 ; w01:=clock ld w1 5 ; w0:=short clock rs w0 x3+d59 ; set time of hard error rl w0 x3+d60 ; error count:= wa. w0 b74. ; error count+1; hl. w0 b71. ; rs w0 x3+d60 ; jl. w2 c14. ; put back in queue; am (66) ; dl w1 +74 ; al. w3 b4. ; jd 1<11+72 ; set boss max interval; am. (b1.) ; al w3 +d21 ; jd 1<11+10 ; release printer rl. w3 b1. ; al w0 0 ; printer name rs w0 x3+d21+8 ; table addr := 0; bl w1 x3+d46 ; state:=if remote batch then ; no paper found se w1 1 ; else wait for start; al w0 128 ; rs w0 x3+d22 ; al w0 -1 ; type := rs w0 x3+d7 ; change not allowed; rl. w2 b28. ; jl. w3 (b9.) ; lock chained (w1, request op); bl w0 x3+d46 ; if remote batch printer then sn w0 1 ; operation := print line am 1-1<3 ; else al w0 1<3+1<1; operation:= rs w0 x1+2 ; insert line; al w2 x1+b78 ; cur out := var text start; am (x3+d30) ; al. w1 b0. ; jl. w3 c37. ; outtext (alarm); rl. w3 b1. ; rl w0 x3+d55 ; rl w1 x3+d30 ; saved status sn w1 j0 ; if hard error then jl. w3 c38. ; outnumber(saved status); jl. c39. ; goto print; ; operator texts ; each text will be headed by printer id j0 = k - b0 <: hard error, decimal status = <0>:> j1 = k - b0 <: disconnected<0>:> j2 = j0 - j1 e. \f ; bøt 28.12.71 central page paper printer ...28... ;return to main loop b. a5 w. c19: rl w1 x3+d0 ; al w1 x1-2 ; segmrel := segmrel - 2; rs w1 x3+d0 ; rl w0 x3+d7 ; page 3 := if file rl w1 x3+d42 ; conversion then sz w0 2 ; work page else rl w1 x3+d15 ; buffer page; rs w1 (x3+d3) ; sz w0 2 ; if job output then jl. a1. ; goto jump; jl. w3 (b11.) ; get pages; rl w0 x3+d15 ; rs. w0 b53. ; move segment number rl. w1 b3. ; and page 3 limits al w2 x1+510 ; to input operation; ds. w2 b52. ; al. w1 b50. ; w1 := operation addr; al w2 x3+d9 ; w2 := document name addr; jl. w3 (b6.) ; send and wait fast(w1, w2); sn w0 1<1 ; if not ok then jl. a1. ; rs w1 x3+d0 ; segm rel := rs w1 x3+d15 ; segm no := big; a1: dl. w3 b45. ; jump: get main loop addr; jl. (b12.) ; page jump; \f ; re 24.9.73 central page paper printer ...29... ; start operation ; ; clear waiting for start ; release request line ; goto central c20: rl w1 x3+d22 ; sz w1 128 ; if no wait bit then jl. a2. ; begin rl w2 x3+d0 ; segmrel := segmrel+2; al w2 x2+2 ; rs w2 x3+d0 ; goto central entry; jl. c10. ; end; a2: al w1 x1-128 ; rs w1 x3+d22 ; remove wait bit in state; rl w0 x3+d21+8 ; if printer name se w0 0 ; table addr = 0 then jl. a3. ; begin am (66) ; w0, w1:= boss max interval; dl w1 +74 ; al. w3 b4. ; w3 := addr of zero; jd 1<11+72 ; set catalog base; am. (b1.) ; al w3 +d21 ; jd 1<11+6 ; initialize process; rl. w3 b1. ; rl w2 x3+d4 ; w2 := buffer addr; al w1 x3+d18 ; w1 := message addr; al w0 12 ; output := ff; rs w0 x2 ; rs w2 x1+2 ; insert buffer limits; rs w2 x1+4 ; al w2 x3+d21 ; w2 := printer name addr; jl. w3 (b5.) ; send and wait; end; a3: al w1 x3+d30 ; operation := work area; al w0 1 ; rs w0 x1+2 ; op(2) := remove line; rl w0 x3+d35 ; rs w0 x1+4 ; op(4) := answer sem addr; al w0 0 ; rx w0 x3+d34 ; op(6) := line addr; rs w0 x1+6 ; line addr := 0; rl. w2 b27. ; jl. w3 (b10.) ; open chained (op, request queue); rl w2 x3+d35 ; jl. w3 (b7.) ; lock (answer sem); jl. c10. ; goto central entry; e. \f ; bøt 05.02.72 central page paper printer ...30... ; repeat operation ; ; if the parameter (w1) < 0, it will ; be changed to the standard value. ; the procedure is only called when progress = 3 b. a5, j5 w. c21: se w1 -2 ; if repeat all then jl. a1. ; begin rs w1 x3+d1 ; al w1 i72 ; reset point(max no of pages); jl. w2 c13. ; rl w0 x3+d7 ; sz w0 2 ; if file conversion then jl. a2. ; begin comment initialize operation point; ld w1 -100 ; segmno := (segm to release :=) ds w1 x3+d16+d15-d15; segmrel := ds w1 x3+d37+d36-d36; line,page counts := 0; jl. w2 c40. ; fix points; jl. a2. ; end; ; goto reset counters; a1: ; end; sh w1 -1 ; if no of pages < 0 then al w1 i79 ; no of pages := standard; rs w1 x3+d1 ; jl. w2 c13. ; reset points; a2: dl w1 x3+d24+d37-d15; reset counters: ds w1 x3+d37 ; reset global counters; bz w1 x3+d24+d17-d15; rel cur in := rs w1 x3+d0 ; rel segment (first point); rl w0 x3+d24 ; transfer segment no; rs w0 x3+d15 ; rl w2 x3+d4 ; rs w2 x3+d19 ; al. w1 j0. ; jl. w3 c37. ; outtext(operator repeat); am. (b1.) ; rl w0 +d1 ; outnumber(no of pages); se w0 -2 ; if repeat all then jl. a3. ; al. w1 j2. ; outtext ( all ); jl. a4. ; a3: jl. w3 c38. ; al. w1 j1. ; a4: jl. w3 c37. ; outtext(termination); rl. w3 b1. ; al w2 x2-2 ; rs w2 x3+d20 ; al w1 x3+d18 ; al w2 x3+d21 ; jl. w3 (b5.) ; print buffer; jl. c10. ; goto central entry; j0: <:<10><10><10>***operator repeat <0>:> j2: <:all:> ; (no termination of text) j1: <: ***<12><0>:> e. \f ; re 24.9.73 central page paper printer ...31... ; change operation ; ; a new paper is selected ; w1 = paper no b. j5 w. c23: rl w2 x3+d22 ; rl w0 x3+d7 ; sz w2 128 ; if not waiting for start sh w0 -1 ; or type < 0 then jl. c30. ; goto alarm; sl w1 i78 ; al w1 i78-1 ; variable d30 := hs w1 x3+d45 ; preferred paper := rs w1 x3+d30 ; new paper no; jl. w2 c14. ; put back in queue; al w0 128 ; state := waiting for start; rs w0 x3+d22 ; rl. w2 b43.-2 ; am +2000 ; al w3 f93 -2000 ; jl. w1 (b15.) ; call (set paper name); jl. c20. ; goto start operation; e. \f ; bøt 28.12.71 central page paper printer ...32... ; kill operation ; ; print kill-message on printer ; goto kill-action (type); b. a35, j10 w. c22: rl w0 x3+d28 ; if local page counter sh w0 i170 ; < min value then jl. c30. ; goto alarm; rl w2 x3+d4 ; cur out := first of transfer rs w2 x3+d19 ; := first of buffer; al. w1 j0. ; jl. w3 c37. ; outtext(<:output killed:>); rl. w3 b1. ; restore w3; al w2 x2-2 ; last of transfer := rs w2 x3+d20 ; cur out - 2; al w1 x3+d18 ; w1 := message addr; al w2 x3+d21 ; w2 := printer name addr; jl. w3 (b5.) ; send and wait (w1, w2); rl w1 x3+d7 ; ba. w1 x1+j1. ; jl. x1+j1. ; goto kill action (type); j0: <:<10><10><15>*** output killed ***<10><0>:> h. j1: a1. , a10. , a20. , a20. w. ; kill action (convert file); ; ; fix points to eternal segment no; ; progress := end text; ; goto entry central (via end kill); a1: rl. w0 j2. ; rs w0 x3+d15 ; segm no := eternal; al w0 5 ; progress := end text; jl. a30. ; goto end kill; j2 = b63 ; use stars as eternal value; \f ; bøt 28.12.71 central page paper printer ...33... ; kill action (convert primary output); ; ; skip until -2 ; set points to this point ; progress := -2 passed ; goto entry central (via end kill); a10: rl. w1 b3. ; al w2 x1+510 ; w2 := last of input; wa w1 x3+d0 ; w1 := addr of cur input word; a12: rl w0 x1 ; rep: if word(w1) sh w0 -1 ; < 0 then jl. a16. ; goto test neg; a13: al w1 x1+2 ; w1 := addr of next input; sh w1 x2 ; if w1 <= last then jl. a12. ; goto rep; rl w1 x3+d15 ; al w1 x1+1 ; segmno := rs w1 x3+d15 ; segmno + 1; rs. w1 j6. ; rl. w1 b3. ; w1 := first of buffer; ds. w2 j5. ; save buffer limits; al. w1 j4. ; w1 := message addr; al w2 x3+d9 ; w2 := area name addr; jl. w3 (b6.) ; send and wait fast(w1, w2); se w0 1<1 ; if not normal answer then jl. a14. ; goto terminate; rl. w1 b3. ; w1 := first of buffer; al w2 x1+510 ; w2 := last of buffer; jl. a12. ; goto rep; a14: al w0 5 ; terminate: progress := end text; jl. a30. ; goto end kill; a16: sn w0 -2 ; test neg: if word = -2 then jl. a18. ; goto exit; se w0 -1 ; if word <> -1 then jl. a13. ; return; jl. a14. ; goto terminate; a18: ws. w1 b3. ; exit: rs w1 x3+d0 ; save rel of buffer rs w1 x3+d17 ; save rel in operation; al w0 4 ; progress := -2 passed; jl. a30. ; goto end kill; j4: 3<12 , 0 ; input operation j5: 0 ; buffer limits; j6: 0 ; segment no; \f ; bøt 28.12.71 central page paper printer ...34... ; kill action (convert job-controlled output); ; ; release points and buffer ; skip until -1 or -2 ; progress := end text ; goto central entry (via end kill); a20: al w1 i77-1 ; no := max claim - ws w1 x3+d23 ; segment claim; a21: sh w1 0 ; test: if no = 0 then jl. a22. ; goto empty; rl. w2 b23. ; jl. w3 (b8.) ; open (segments free); al w1 x1-1 ; no := no - 1; jl. a21. ; goto test; a22: rl. w1 b3. ; empty: al w2 x1+510 ; w2 := addr of last word; wa w1 x3+d0 ; w1 := addr of cur word; a23: rl w0 x1 ; rep: so w0 -2 ; if cur word = -1 or -2 then jl. 4 ; jl. a26. ; goto neg; a24: al w1 x1+2 ; w1 := addr of next word; se w1 x2 ; if w1 <= last then jl. a23. ; goto rep; rl. w2 b23. ; jl. w3 (b8.) ; open (segments free); rl w1 (x3+d3) ; virt := virt addr of al w1 x1+512 ; page3 + 512; sn. w1 (b42.) ; if virt = top then rl. w1 b41. ; virt := first; rs w1 (x3+d3) ; virt of page3 := virt; rl. w2 b24. ; jl. w3 (b7.) ; lock segments full); rl. w1 b3. ; w1 := addr of first; al w2 x1+510 ; w2 := addr of last; jl. a23. ; goto rep; a26: al w1 3 ; neg: if cur word = -2 then se w0 -1 ; type := 3; comment rs w1 x3+d7 ; account := true; al w0 i77-1 ; segment claim := rs w0 x3+d23 ; max claim - 1; al w0 5 ; progress := 5; ; end kill ; ; set progress in state ; fix points and ; goto central entry; a30: rl w1 x3+d22 ; state := state la. w1 b61. ; except progress wa w1 0 ; + progress; rs w1 x3+d22 ; jl. w2 c40. ; fix points; jl. c10. ; goto central entry; e. \f ; bøt 28.12.71 central page paper printer ...35... ; alarm illegal command ; ; print operator alarm via print b. j1 w. c30: rl w1 x3+d0 ; al w1 x1+2 ; segmrel := segmrel+2; rs w1 x3+d0 ; rl. w2 b28. ; jl. w3 (b9.) ; lock chained (request line); al w0 3 ; operation := print line; rs w0 x1+2 ; al w2 x1+b78 ; al. w1 j0. ; jl. w3 c37. ; outtext (alarm); jl. c39. ; goto print; j0: <: illegal command<0>:> e. ; next file ; ; all paper sem is locked ; if cur paper sem value < 1 then search new paper ; initialize points ; increase state by 1 ; if no new paper format then goto central ; state := state or queue bit or wait bit ; insert change paper message via print b. a5, j5 w. c31: bz w0 x3+d8 ; rs w0 x3+d1 ; work1 := act paper no; dl. w3 b43. ; page jump(next paper); jl. (b12.) ; c42: ; return \f ; bøt 28.12.71 central page paper printer ...36... a2: rl. w2 b2. ; init: w2 := op addr; al w1 x3+d7 ; w1 := addr of saved op; a3: rl w0 x2+2 ; rep: rs w0 x1 ; page1(w1) := operation(w2); aa. w2 b71. ; update w1, w2; sh w1 x3+d40 ; if w1 < saved op top then jl. a3. ; goto rep; jl. w2 c40. ; fix point; al w0 0 ; rs w0 x3+d27 ; local counters := 0; rs w0 x3+d28 ; rl w1 x3+d22 ; al w1 x1+1 ; state := state + 1; rs w1 x3+d22 ; al w0 i77 ; segment claim := max segment claim; rs w0 x3+d23 ; bz w0 x3+d8 ; if actual paperno sn w0 (x3+d1) ; = last paperno then jl. c10. ; goto central entry; bl w0 x3+d46 ; if remote batch printer then sn w0 1 ; jl. c10. ; goto central entry; al w1 x1+128+8 ; state := state + queue bit rs w1 x3+d22 ; + waiting for start bit; a4: rl w2 x3+d33 ; while queue value > 0 do rl w0 x2 ; lock chained (queue); sh w0 0 ; jl. a5. ; jl. w3 (b9.) ; al w0 0 ; release operation rs w0 x1+2 ; jl. a4. ; a5: rl. w2 b28. ; jl. w3 (b9.) ; lock chained (request line); al w0 1<3+1<1 ; rs w0 x1+2 ; operation := insert line; al w2 x1+b78 ; set cur out; al. w1 j0. ; jl. w3 c37. ; outtext (change); am. (b1.) ; bz w0 +d8 ; jl. w3 c38. ; outnumber (paper no); am. (b1.) ; bz w0 +d8 ; if paper <> sl w0 i68-1 ; named paper then jl. c39. ; goto print; al. w1 j1. ; jl. w3 c37. ; outtext ( = ); am. (b1.) ; al w1 +d41 ; jl. w3 c37. ; outtext (paper name); jl. c39. ; goto print; j0: <: change to <0>:> ; j1: <: = <0>:> ; e. \f ; bøt 28.12.71 central page paper printer ...37... ; start printing ; ; separate start actions are performed for ; jobcontrolled output and file output b. a10 w. c32: rl w1 x3+d22 ; al w1 x1+1 ; state := state + 1; rs w1 x3+d22 ; bz w0 x3+d24+d17-d15; rs w0 x3+d0 ; transfer segment rel; rl w0 x3+d7 ; so w0 2 ; if file conversion then jl. a5. ; goto start file; ; start job controlled conversion rl w0 x3+d15 ; page 3 := rs w0 (x3+d3) ; first of buffer; rl. w2 b24. ; jl. w3 (b7.) ; lock(segments full); al w0 i77-1 ; segment claim := rs w0 x3+d23 ; max no of segments - 1; jl. c10. ; goto central entry; ; start file conversion a5: dl w1 x3+d10 ; w0, w1 := interval; al w2 x3+d9 ; w2 := doc name addr; jl. w3 (b16.) ; prepare access (w0, w1, w2); jl. a6. ; goto error; bz w0 x3+d61 ; if status se w0 4 ; <> remote-rerouted then jl. c10. ; goto central entry rl. w2 b28. jl. w3 (b9.) ; lock chained(request line) al w0 3 ; w0= print line rs w0 x1+2 ; al w2 x1+b78 ; x2= cur out jd-1 al w0 32 ; w0= space rs w0 x2 ; output space rl w0 x3+d7 ; w0= type al w3 x3+d39 ; w3text= filename se w0 0 ; if type <> convertfile then al. w3 a10. ; w3text= primout dl w1 x3+2 ds w1 x2+4 ; move w3text to line dl w1 x3+6 al w1 x1+32 ; add one space ds w1 x2+8 ; dl. w1 a9. ; text= from ds w1 x2+12 rl. w3 b1. ; w3 = page1 dl w1 x3+d12 ; ds w1 x2+16 ; output username dl w1 x3+d13 ; al w1 x1+32 ; add one space ds w1 x2+20 ; al w2 x2+22 ; update cur out rl w0 x3+d50 ; w0=hostid jl. w3 c38. ; outnumber(hostid) jl. c39. ; goto print (returns to central entry) a10: <:primout<0><0><0><0><0>:> ; 12 chars a9=k+2, <:from :> ; 6 chars a6: ; error: al w0 8<6+15 ; al w1 x3+d9 ; testout(name); jl. w3 (b18.); al w0 2 ; rs w0 x3+d9 ; name := name table rs w0 x3+d9+8 ; addr := dummy; jl. c10. ; goto central entry; e. \f ; bøt 28.12.71 central page paper printer ...38... ; end printing ; ; release convert operation ; progress := 0; ; release resources b. a5 w. c33: rl w0 x3+d22 ; la. w0 b61. ; progress := 0; rs w0 x3+d22 ; bl w0 x3+d46 ; se w0 1 ; if remote batch printer then jl. a3. ; begin am (66) ; dl w1 +74 ; al. w3 b4. ; jd 1<11+72; set boss max interval; rl. w3 b1. ; al w3 x3+d21 ; jd 1<11+64; remove process(printer name); rl. w3 b1. ; end; a3: rl w0 x3+d32 ; rs w0 (x3+d2) ; page 2 := jl. w3 (b11.) ; convert operation; rl. w1 b2. ; w1 := abs addr of operation; rl w0 x3+d36 ; rs w0 x1+d36-d6 ; transfer global rl w0 x3+d37 ; counters to operation; rs w0 x1+d37-d6 ; al w0 0 ; status in operation := 0 rs w0 x1+d60-d6 ; (i.e. ok termination); rs w0 x1+d62-d6 ; device kind:=undef; rl w0 x3+d7 ; so w0 2 ; if file output then jl. a0. ; goto terminate file; al w1 i77 ; while any locked segment do ws w1 x3+d23 ; a2: sh w1 0 ; jl. a4. ; open(segments free); al w1 x1-1 ; rl. w2 b23. ; jl. w3 (b8.) ; jl. a2. ; a4: ; ;***test begin rl. w0 (b23.) ; w0 := value of segments free; rl. w1 (b24.) ; w1 := value of segments full; sn w0 i67 ; if segments free <> buffer size or se w1 0 ; segments full <> 0 then c.-1, o74, z. ; (bossfault xref) jd -74 ; bossfault(74); ;***test end rl. w1 b2. ; rl. w2 b25.+2 ; open chained(convert operation, job convert queue); jl. w3 (b10.) ; jl. c10. ; goto central entry; \f ; re 24.9.73 central page paper printer ...39... a0: rl. w2 b25. ; open chained(convert operation, convert queue); jl. w3 (b10.) ; rl. w2 b30. ; terminate file: jl. w3 (b7.) ; lock(banker access); dl. w1 b74. ; set banker operation: ds w1 x3+d30+4 ; op(2) := 2<12 + 1; al w0 0 ; op(4) := 1<12 + 0; rs w0 x3+d30+6 ; op(6) := 0; al w2 x3+d9 ; jl. w3 (b17.) ; terminate access (document); dl w1 x3+d10 ; w0, w1 := interval (document); sn. w0 (b75.) ; if interval (document) se. w1 (b76.) ; <> interval (boss) then jl. a1. ; goto exit; rl. w2 b31. ; lock(catalock); jl. w3 (b7.) ; dl w1 x3+d10 ; w0w1:= interval(document); al. w3 b4. ; w3 := addr of zero; jd 1<11+72 ; set document interval; am. (b1.) ; al w3 +d9 ; w3 := name addr; jd 1<11+48 ; remove document; se w0 0 ; if result <> 0 then c.-1, o72, z. ; (bossfault xref) jd -72 ; bossfault(72); rl. w2 b31. ; open(catalock); jl. w3 (b8.) ; rl. w0 b74. ; op(6) := 1<12 + ba w0 x3+d38 ; no of slices; rs w0 x3+d30+6 ; a1: al w1 x3+d30 ; exit: w1 := addr of op; rl. w2 b22. ; w2 := banker queue sem addr; jl. w3 (b10.) ; open chained (w1, w2); rl. w2 b29. ; jl. w3 (b7.) ; lock (answer); rl. w2 b30. ; jl. w3 (b8.) ; open (banker access); jl. c10. ; goto central entry; e. \f ; bøt 18.1.72 central page paper printer ...40... ; outtext ; ; transfer text from area (cur in) to ; area (cur out) ; ; w0 - destroyed ; w1 cur in destroyed ; w2 cur out cur out ; w3 return return c37: rl w0 x1 ; word(cur out) := rs w0 x2 ; word(cur in); aa. w2 b71. ; update cur in, out; sz w0 255 ; if not end text then jl. c37. ; goto outtext; jl x3 ; return ; outnumber ; ; convert number to text in area(cur out) ; ; w0 number destroyed ; w1 - destroyed ; w2 cur out cur out ; w3 return return b. a10, j10 w. c38: al w2 x2+4 ; cur out := cur out + 4; ds. w3 j0. ; save cur out, return; al w1 0 ; place := 0; rs w1 x2-4 ; text area := 0; rs w1 x2-2 ; am 16 ; place := 16; a0: al w1 x1+8 ; next: place := place + 8; se w1 24 ; if place <> 24 then jl. a1. ; goto char; al w2 x2-2 ; text := text - 2; al w1 0 ; place := 0; a1: al w3 0 ; char: wd. w0 b72. ; number := number//10; al w3 x3+48 ; char := remainder + 48 ls w3 x1 ; shift place; wa w3 x2 ; text := text + rs w3 x2 ; char; se w0 0 ; if number <> 0 then jl. a0. ; goto next; dl. w3 j0. ; restore cur out, return; jl x3 ; return; 0 ; saved cur out; j0: 0 ; saved return; e. \f ; bøt 28.12.71 central page paper printer ...41... ; print ; ; on entry w2 = last cur out (= top of text); ; the operator text has been inserted in the ; operation in rel b78. the text is headed c39: al w1 x2-6 ; ws. w1 b2. ; rl. w2 b2. ; insert text length; rs w1 x2+4 ; al w2 x2+6 ; w2 := start of text; al. w1 b77. ; jl. w3 c37. ; outtext (printer); am. (b1.) ; rl w0 d43 ; jl. w3 c38. ; outnumber (device no); rl. w3 b1. ; rl. w1 b2. ; w1 := abs of operation; rl w0 x1+2 ; rl w2 (x3+d2) ; if operation = so w0 1 ; insert line then rs w2 x3+d34 ; save virt of operation; rl. w2 b27. ; w2 := request queue; jl. w3 (b10.) ; open chained (w1, w2); jl. c10. ; goto central entry; ; fix point ; ; w2 = return ; the point from the operation is ; copied to all points b. a1, j0 w. c40: rs. w2 j0. ; save return; al w1 x3+d24 ; w1 := addr of first point; a0: al w2 x3+d15 ; next point: w2 := addr of op point; a1: rl w0 x2 ; move: move point word to rs w0 x1 ; point area; aa. w2 b71. ; update w1 and w2; sh w2 x3+d37 ; if w2 <= last of point then jl. a1. ; goto move; sh w1 x3+d25 ; if w1 <= last point then jl. a0. ; goto next point; jl. (j0.) ; return; j0: 0 ; saved return e. \f ; re 18.9.73 central page paper printer ...42... ; page jump to - ; print front page: ; in triangle page c43: dl. w3 b82. ; jl. (b12.) ; ; page jump to - ; print last page: ; in triangle page c44: rl. w2 b81. ; rl. w3 b83. ; jl. (b12.) ; \f ; re 18.9.73 central page paper printer ...43... ; define relative addresses to be used in ; initialization f30 = b5 - b0 ; send and wait f31 = b6 - b0 ; send and wait fast f32 = b7 - b0 ; lock simple f33 = b8 - b0 ; open simple f34 = b9 - b0 ; lock chained f35 = b10 - b0 ; open chained f36 = b11 - b0 ; get pages f37 = b12 - b0 ; page jump f39 = b15 - b0 ; call f40 = b16 - b0 ; prepare access f41 = b17 - b0 ; terminate access f42 = b21 - b0 ; all paper sem addr f43 = b22 - b0 ; banker queue f44 = b23 - b0 ; segments free sem addr f45 = b24 - b0 ; segments full sem addr f46 = b25 - b0 ; convert operations sem addr f47 = b27 - b0 ; request display queue sem addr f48 = b28 - b0 ; request lines sem addr f49 = b30 - b0 ; reserve banker access sem addr f50 = b41 - b0 ; virt addr : first of super buffer f51 = b81 - b0 ; virt addr: triangle page f52 = b75 - b0 ; boss private interval start f53 = b76 - b0 ; boss private interval end f54 = b43 - b0-2 ; virt addr: next paper f55 = b45 - b0-2 ; virt addr: main loop f56 = b29 - b0 ; banker answer sem f57 = b42 - b0 ; virt addr: top super buffer f58 = b20 - b0 ; first paper f59 = b31 - b0 ; catalock sem addr f60 = c10 - b0 ; rel entry on central page f61 = c42 - b0 ; rel return from next paper, found f62 = b32 - b0 ; paper manipulation semafore f63 = b46 - b0 ; virt of account buf f64 = b47 - b0 ; virt and f65 = b48 - b0 ; rel of account code f66 = b18 - b0 ; priv output f67 = b33 - b0 ; rb convert queue semaphore ; define absolute addresses to be used in external list g40 = f30 + g2 , g41 = f31 + g2 , g42 = f32 + g2 g43 = f33 + g2 , g44 = f34 + g2 , g45 = f35 + g2 g46 = f36 + g2 , g47 = f37 + g2 , g48 = f67 + g2 g49 = f39 + g2 , g50 = f40 + g2 , g51 = f41 + g2 g52 = f42 + g2 , g53 = f43 + g2 , g54 = f44 + g2 g55 = f45 + g2 , g56 = f46 + g2 , g57 = f47 + g2 g58 = f48 + g2 , g59 = f49 + g2 , g60 = f50 + g2 g61 = f51 + g2 , g62 = f52 + g2 , g63 = f53 + g2 g64 = f54 + g2 , g65 = f55 + g2 , g66 = f56 + g2 g67 = f57 + g2 , g68 = f63 + g2 , g69 = f64 + g2 g70 = f65 + g2 , g71 = f58 + g2 , g72 = g56 + 2 g73 = f66 + g2 , g74 = f59 + g2 , g75 = f62 + g2 ; terminate page f1 = k - b0 ; define length of page k = g2 + f1 ; k := real value of load address g3 = k-2 ; define last of page f100 = f100 + 4 ; count k-assignments i. e. \f ; bøt 28.12.71 central page paper printer ...44... ; initialize central page ; ; initialize boss private interval and ; banker access semaphore in externals ; write page b. j10 w. g9=k-2000 ; (because of stepping stone) am (66) ; boss private interval := rl w1 +76 ; point interval (std al w1 x1+1 ; interval start + 1); al w0 x1 ; rs. w0 g147. ; ext(-2); rs. w1 g148. ; ext(-1); rl. w1 j4. ; al w1 x1+e13 ; insert banker answer rs. w1 g66. ; sem addr; al w0 i65 ; w0 := reserve on disc; al w1 f1 ; w1 := length of page; jl. w3 (j2.) ; reserve virt (w0, w1, w2); al. w0 g2. ; w0 := start addr of page; jl. w3 (j3.) ; move to virt ( w0, w1, w2); rs. w2 g149. ; ext(387); jl. w3 (2) ; set externals; g168: 40 ; g147: 0 , -2 ; boss private g148: 0 , -1 ; interval; j5: e13<12+19, 78 ; banker access sem; g149: 0 , 387 ; virt addr of central; 0 , -1000 ; end of externals; al w0 1 ; reserve banker access rs. w0 (j5.) ; sem value := 1; jl. g14. ; goto initialize triangle page; j0: 0 ;* base of externals j2: 12 ;* reserve virt j3: 13 ;* move to virt j4: 76 ;* banker answers, start g130 = j0, g131 = j2 , g132 = j3 , g133 = j4 , g134 = j5 e. \f ; re 18.9.73 triangle page paper printer ...45... ; triangle page ; ============= ; ; this page is an extension of the central page and performs the printing of ; the leading and trailing triangles including the additional information ; which is printed on these two pages. ; g12: k=10000, f100=f100 +4 ; count k-assignments b. b100, c50 w. ; the names are used as follows: ; ; a-names local labels ; b-names global variables ; c-names global labels ; d-names global variables on page 1 ; j-names local variables ; ; i- and e- names are options ; f- and g- names are super global addresses used in other pages ; and in initialization. ; the b- and c- names have the same meaning in this page and in ; the central page and in the main loop page. \f ; re 24.9.73 triangle page paper printer ...46... ; ; the pages are used as follows b0: 0 ; page 0 this page b1: 0 ; page 1 variables b2: 0 ; page 2 not used (= zero) b3: 0 ; page 3 input buffer b4: 0 ; page 4 not used (= zero) 72<12+0 ; pageident: triangle page ; entries in central logic b5: 1 ;* send and wait b6: 2 ;* send and wait fast b11: 7 ;* get pages b12: 8 ;* page jump b15: 25 ;* call ; printer state bit patterns b36: -1 - 1<23 - 1<1 ; error bits b37: 1<18 ; end of paper bit b38: -1 - 1<23 - 1<1 - 1<18 - 1<4 ; hard error bits b39: 1<8 ; stopped bit ; virtual addresses b46: 435 ;* virt of account buf b47: 436 ;* virt and b48: 431 ;* rel of account code b79: 162 ;* virt and b80: 229 ;* rel of general print b84: 387 ;* virt and b85: f60 ; rel of central entry in central page ; input operation b50: 3<12 ; operation b51: 0 ; first of transfer b52: 0 ; last of transfer b53: 0 ; segment number ; miscellaneous constants and variables b64: <:usercat:>,0 ; usercat name b65: 286 ; usercat name table address b66: c. i168-1,12,r.i168 ; extra ff before front z. 15<8 ; si b67: c. i169-1,12,r.i169 ; extra ff after last page z. c. i167-1 12<16+25<8+0 ; ff,em z. c.-i167 0<16+25<8+0 ; em z. 2 ;-2 b71: 2 ; update pointers b72: 10 ; b73: 768 ; constant (chars per segm) b74: 9<12+1 ; output operation (operator mode); 0 ; 0 ; 0 ; process description address b75: 0<12+2,0,0,0,0,0,0,0 ; sense ready operation b20: 0 ; serialno in triangle b21: 0 ; work ; page jump to - ; central entry: ; in central page c10: dl. w3 b85. ; jl. (b12.) ; \f ; re 18.9.73 triangle page paper printer ...47... ; outtext ; ; transfer text from area (cur in) to ; area (cur out) ; ; w0 - destroyed ; w1 cur in destroyed ; w2 cur out cur out ; w3 return return c37: rl w0 x1 ; word(cur out) := rs w0 x2 ; word(cur in); aa. w2 b71. ; update cur in, out; sz w0 255 ; if not end text then jl. c37. ; goto outtext; jl x3 ; return ; outnumber ; ; convert number to text in area(cur out) ; ; w0 number destroyed ; w1 - destroyed ; w2 cur out cur out ; w3 return return b. a10, j10 w. c38: al w2 x2+4 ; cur out := cur out + 4; ds. w3 j0. ; save cur out, return; al w1 0 ; place := 0; rs w1 x2-4 ; text area := 0; rs w1 x2-2 ; am 16 ; place := 16; a0: al w1 x1+8 ; next: place := place + 8; se w1 24 ; if place <> 24 then jl. a1. ; goto char; al w2 x2-2 ; text := text - 2; al w1 0 ; place := 0; a1: al w3 0 ; char: wd. w0 b72. ; number := number//10; al w3 x3+48 ; char := remainder + 48 ls w3 x1 ; shift place; wa w3 x2 ; text := text + rs w3 x2 ; char; se w0 0 ; if number <> 0 then jl. a0. ; goto next; dl. w3 j0. ; restore cur out, return; jl x3 ; return; 0 ; saved cur out; j0: 0 ; saved return; e. \f ; bøt 05.01.73 triangle page paper printer ...48... ; output triangle ; ; the triangle with asterisks and user name is ; printed. the following variables are used: ; ; d0 current line number in triangle ; d1 last line number in triangle ; d30+0 partial word ; d30+2 saved w1 ; d30+4 saved returns, locally used ; d30+6 direction of triangle (-1 meaning leading, +1 trailing triangle) ; d30+8 saved return from out triangle ; d30+10 saved sub - return from writetext ; d30+12 saved page - number in writetext ; d4 first of buffer (considered constant) ; d5 last of buffer - - ; d14 adresses of user id - - ; d19 first transferred - - ; d20 word address and last transferred ; ; At call time, the following registers and variables ; must be initialized: ; w0 = -1 meaning leading, +1 meaning trailing triangle ; w1 = 0 means only ff are output ; <> 0 means everything is output ; w2 return address (this page) ; w3 page 1 address ; d19 = d4 ; d20 must point at the last word to be output before the triangle ; starts (d4-2 <= d20 < d5). ; ; At return all registers except w3 are spoiled. ; ; The procedure outputs the leading text, the triangle, various messages ; and a number of formfeed, depending on leading or trailing triangle. b. a19, j8 w. j1: 255<16 ; mask for partial word filled j2: <:<10><10><10>:> ; three new lines j3: <:<10><10>contents of <0>:> j4: <:primary output<0>:> j5: <:job printer output<0>:> j6: <:<15><12><0>:> j7: <:<10>printing initiated at <0>:> j8: <:<10>printing terminated at <0>:> c41: ws. w2 b0. ; rs w2 x3+d30+8 ; save rel return sn w1 0 ; if no triangle then jl. a9. ; goto output ff; \f ; bøt 15.03.73 triangle page paper printer ...49... al w1 15 ; partial word:= 15; (15 = shiftin) rs w1 x3+d30+0 ; al w1 i167 ; if leading triangle then al w2 1 ; begin first line:=size; last line:=1; sl w0 0 ; direction:=-1; rx w1 4 ; end else ds w2 x3+d1 ; begin first line:=1; last line:=size; rs w0 x3+d30+6 ; direction:=+1; jl. a1. ; end; a0: wa w1 x3+d30+6 ; for line:=first line step direction rs w1 x3+d0 ; until last line do a1: al w0 10 ; begin jl. w2 a10. ; outchar(NL); ac w1 x1-i167 ; a2: al w0 32 ; for i:=size-line step -1 until 0 do jl. w2 a10. ; begin al w1 x1-1 ; outchar(space); sl w1 0 ; end; jl. a2. ; rl w1 x3+d0 ; for i:=line step -1 until 0 do a3: jl. w2 a11. ; begin al w1 x1-1 ; outasterisk; sl w1 1 ; end; jl. a3. ; al w0 32 ; jl. w2 a10. ; output(space) jl. w2 a15. ; terminate partial word; al w0 2 ; al w1 d12-2 ; writetext(username, page1); jl. w2 a17. ; al w0 32 ; jl. w2 a10. ; output(space) rl w2 x3+d54 ; w2:=serial number al w1 0 ; wd. w2 b72. ; w1:=serialno mod 10 al w1 x1+48 ; hs. w1 b21.+1 ; store third digit in work+1 al w1 0 ; wd. w2 b72. ; w1:=serial number // 10 mod 10 al w1 x1+48 ; hs. w1 b21. ; store second digit in work jd-1 al w0 x2+48 ; jl. w2 a10. ; output(first digit) bl. w0 b21. ; jl. w2 a10. ; output(second digit) bl. w0 b21.+1 ; jl. w2 a10. ; output(third digit) al w0 32 ; jl. w2 a10. ; output(space) rl w1 x3+d0 ; a4: jl. w2 a11. ; for i:=line step -1 until 0 do al w1 x1-1 ; begin sl w1 1 ; outasterisk; jl. a4. ; end; rl w1 x3+d0 ; comment w1:=line; se w1 (x3+d1) ; end for line:=; jl. a0. ; jl. w2 a15. ; terminate partial word; rl. w0 j2. ; outword(3 NL) jl. w2 a12. ; \f ; rc 15.03.73 triangle page paper printer ...50... ; print user id, contents id and end text rl w0 x3+d42 ; rs w0 (x3+d3) ; page 3 := work page; jl. w3 (b11.) ; bz w1 x3+d14 ; segm := addr of user id; rs. w1 b53. ; rl. w1 b3. ; first address; al w2 x1+510 ; last address; ds. w2 b52. ; al. w1 b50. ; al. w2 b64. ; input(<:usercat:>); jl. w3 (b6.) ; send and wait fast; se w0 1<1 ; if not ok c.-1, o70, z. ; (bossfault xref) jd -70 ; then bossfault(70); bl w1 x3+d14+1 ; al w0 6 ; writetext(user id, page3); jl. w2 a17. ; al w0 0 ; rs w0 (x3+d3) ; release page 3; al w1 j3-b0 ; end text: al w0 0 ; jl. w2 a17. ; writetext(<:contents of:>, page0); rl w0 x3+d7 ; writetext( al w1 d39 ; if outputtype=1 then sn w0 1 ; <:primary output:> al w1 j4-b0 ; else if type = 2 or 3 then sz w0 2 ; <:job controlled output:> al w1 j5-b0 ; else <:convert file:>); sn w1 d39 ; am 2 ; select page; al w0 0 ; jl. w2 a17. ; \f ; re 24.9.73 triangle page paper printer ...51... ; print date and time rl w0 x3+d30+6 ; if leading triangle sh w0 0 ; am j7-j8 ; then writetext(start print, page0) al w1 j8-b0 ; else writetext(stop print, page0); al w0 0 ; jl. w2 a17. ; rl w0 x3+d47 ; if correct last of buffer ws w0 x3+d20 ; - word address sh w0 40-1+2 ; <= 40 bytes jl. w2 a14. ; then outblock; rl w1 x3+d30+6 ; save triangle kind rs w1 x3+d30+10 ; rl w1 x3+d20 ; al w1 x1+2 ; param(0,1) := first free in buffer; al w0 -12 ; ds w1 x3+6 ; al w0 -10 ; param(2) := print time; rs w0 x3+8 ; al w0 0 ; al w1 8 ; param(3):=new line ds w1 x3+12 ; al w0 -18 ; param(4):=installation text (from options) al w1 -5 ; ds w1 x3+16 ; param(5):=return dl. w3 b80. ; jl. w1 (b15.) ; call(general print); rl w1 x3+d30+10 ; restore triangle kind; rs w1 x3+d30+6 ; ; test rl w0 x3+4 ws w0 x3+d20 sl w0 40+1 ; if date, time and inst.text exceed 40 bytes then alarm; c.-1, o73, z. ; (bossfault xref) jd -73 ; end test rl w0 x3+4 ; rs w0 x3+d20 ; word address := last used in buffer; rl w0 x3+d30+6 ; if leading triangle a9: sl w0 0 ; then writetext(leading ff, page0) am b67-j6 ; else writetext(trailing ff, page0); al w1 j6 -b0 ; al w0 0 ; jl. w2 a17. ; rl w0 x3+d20 ; sl w0 (x3+d4) ; if word address >= first buffer jl. w2 a14. ; then outblock; am (x3+d30+8) ; jl. b0. ; return; \f ; rc 17.01.73 triangle page paper printer ...52... ;subprocedures outchar, outasterisk, outword, outblock and terminate ; partial word. the procedures assume that their parameters, i.e. ; partial word and word address have been initialized. all procedures ; have their return point in w2, and a possible parameter in w0. ; w0 and w2 may be spoiled. a11: ; entry outasterisk: al w0 42 ; call outchar(*); a10: ; entry outchar(w0): rx w0 x3+d30+0 ; ls w0 8 ; partial wd:= partial wd shift 8 lo w0 x3+d30+0 ; + char; rs w0 x3+d30+0 ; sz. w0 (j1.) ; if partial wd full jl. a12. ; then call outword(partial wd) jl x2 ; else return; a12: rx w1 x3+d20 ; entry outword(w0): al w1 x1+2 ; word addr:=word addr + 2; rs w0 x1 ; buf(word addr):=word; al w0 0 ; partial wd:=0; rs w0 x3+d30+0 ; sl w1 (x3+d5) ; if buffer full then jl. a13. ; call outblock rx w1 x3+d20 ; else return; jl x2 ; a13: rx w1 x3+d20 ; entry outblock from outword: a14: ws. w2 b0. ; entry outblock from outside: ds w2 x3+d30+4 ; save w1, rel return; al w1 x3+d18 ; al w2 x3+d21 ; jl. w3 (b5.) ; output(buffer); se w0 1<1 ; if no errors jl. a16. ; rl w2 x3+d20 ; al w2 x2+2 ; ws w2 x3+d19 ; se w2 (x1+2) ; and bytes transferred<>bytes sent then lo. w0 b39. ; status:=status or 1<8; a16: rs w0 x3+d55 ; saved status:=status jd -1 se w0 1<1 ; if error jl. w2 c45. ; then test result; rl w1 x3+d4 ; word address:= first of buffer - 2; al w1 x1-2 ; rs w1 x3+d20 ; dl w2 x3+d30+4 ; reestablish w1; jl. x2+b0. ; return; a15: rl w0 x3+d30+0 ; entry terminate partial word: sn w0 0 ; if partial wd = 0 jl x2 ; then return; jl. a12. ; else call outword(partial wd); \f ; rc 19.02.73 triangle page paper printer ...53... ; sub-procedure write text; ; outputs a text constant stored on any page. ; at entry the registers have the following meaning: ; w0 page number*2 ; w1 relative address of text on page ; w2 return (this page) ; w3 page 1 address ; ; at return all registers except w3 are spoiled a17: ws. w2 b0. ; entry writetext: rs w2 x3+d30+10 ; save relative return; rs w0 x3+d30+12 ; k:=pagenr*2; jl. a19. ; i:=textaddr; a18: jl. w2 a12. ; repeat al w1 x1+2 ; wordaddr:= pageaddr(k) + i; a19: am (x3+d30+12) ; outword(word(wordaddr); am. (b0.) ; i:=i+2; rl w0 x1 ; until last char( sz w0 255 ; word(wordaddr+2)) = 0; jl. a18. ; rl w2 x3+d30+10 ; reestablish return; wa. w2 b0. ; outword(word(wordaddr+2); jl. a12. ; comment and return from there; e. ; end output triangle; \f ; bøt 05.01.73 triangle page paper printer ...54... ; print front page ; ; the start text and the triangle is printed b. a5, j9, q10 w. j1: <:<10>continuation after endpaper<10><10><0>:> j2: <:<10>continuation after malfunction<10><10><0>:> j3: <: prepare :> j4: <:host:>,0,0,0 ; name of host process j5: <:clock:>,0,0,0 ; name of clock process j6: 0,5 ; timer message j7: 1<21 ; timeout status j8:<:<10>obs obs obs this is a rerouted remote convertfile<10><10><0>:> j9:<:primout<0><0><0><0><0>:> ; 12 chars q0 = 0 ; first of empty word (12*null) q1 = 8 ; username q2 = 16 ; <: prepare :> q3 = 22 ; device name q4 = 26 ; space q5 = 28 ; filename q6 = 36 ; new line c43: bz w0 x3+d62+1 ; if device kind <> printer then se w0 14 ; skip the triangle page jl. a3. ; al w2 i167 ; w2:=triangle size sh w2 0 ; if size=0 then jl. a3. ; skip triangle page rl. w2 b20. ; rs w2 x3+d54 ; set current serial number al w2 x2+1 ; w2:=next serial number sl w2 1000 ; al w2 0 ; mod 1000 rs. w2 b20. ; set next serial number rl w2 x3+d4 ; cur out := rs w2 x3+d19 ; first of buffer; bz w0 x3+d61 ; w0:= status sn w0 0 ; if status=0 then jl. a1. ; goto a1; al. w1 j5. ; text:= dummy sn w0 1 ; if status=1 then al. w1 j1. ; text:= j1 sn w0 2 ; if status=2 then al. w1 j2. ; text:= j2 sn w0 4 ; if status=4 then al. w1 j8. ; text:= j8 jl. w3 c37. ; a1: ; al. w1 b66. ; jl. w3 c37. ; outtext ( start text); rl. w3 b1. ; al w2 x2-2 ; rs w2 x3+d20 ; set last of buffer; rl w0 x3+d62 ; if printer mode <> 0 then se w0 14 ; am 0-1 ; triangle:=w0 al w1 1 ; else al w0 -1 ; triangle = leading; jl. w2 c41. ; print triangle; a2: al w0 1 ; wa w0 x3+d22 ; state := state + 1; rs w0 x3+d22 ; jl. c10. ; goto central entry; \f ; lkn 11.3.76 triangle page paper printer ...54a... a3: se w0 12 ; if device kind=punch jl. a2. ; then rl w2 x3+d4 ; w2:=start of output buffer; al w0 10 ; move <nl> rs w0 x2+q0 ; dl w1 x3+d12 ; move user name; ds w1 x2+q1+2 ; dl w1 x3+d13 ; ds w1 x2+q1+6 ; ld w1 -100 ; set empty text ds w1 x2+q0+2 ; ds w1 x2+q0+6 ; dl. w1 j3.+2 ; move <: prepare :>; ds w1 x2+q2+2 ; rl. w0 j3.+4 ; rs w0 x2+q2+4 ; dl w1 x3+d52 ; move device name; sh w0 31 ; if not text then ld w1 -100 ; device name:=0; ds w1 x2+q3+2 ; al w0 32 ; move <space>; rs w0 x2+q4 ; dl w1 x3+d39+2 ; move file name; ds w1 x2+q5+2 ; dl w1 x3+d39+6 ; ds w1 x2+q5+6 ; al w0 10 ; move <nl>; rs w0 x2+q6 ; al w2 x2-8 ; include 8 dummy bytes first in output rs. w2 b74.+2 ; set first of buffer; al w2 x2+q6+8 ; rs. w2 b74.+4 ; set last of buffer; al w3 x3+d21 ; w3:=printer process name jd 1<11+4 ; get process description address rs. w0 b74.+6 ; set process description address in operator message al. w1 b74. ; w1:=message; al. w2 j4. ; w2:=abs ref <:host:> jl. w3 (b5.) ; send and wait(operator message); jd-1 a4: bz w0 x3+d18+1 ; output mode rs. w0 b75.+2 ; in sense ready message rl w0 x3+d7 ; w0= type of convert al w3 x3+d39 ; w3= filename se w0 0 ; if type <> convert al. w3 j9. ; then name := primout dl w1 x3+2 ds. w1 b75.+6 ; move filename to message dl w1 x3+6 ds. w1 b75.+10; rl. w3 b1. ; w3:= page1 used in al w2 x3+d21 al. w1 b75. ; w1:=message; al w2 x3+d21 ; w2:=name; jl. w3 (b5.) ; send and wait(sense ready); so. w0 (j7.) ; if timer status then jl. a2. ; begin al. w1 j6. ; w1:=timer message al. w2 j5. ; w2:=<:clock:> jl. w3 (b5.) ; send and wait jl. a4. ; goto send sense ready ; end e. \f ; re 5.2.75 triangle page printer ...54b... ; print last page ; ; account ; print triangle and end text b. a5, j10 w. c44: rl w2 x3+d4 ; cur out := first of buffer; rs w2 x3+d19 ; al w0 i167 ; w0:=triangle size sh w0 0 ; if size=0 then jl. a2. ; skip triangle page rl w0 x3+d62 ; if device kind <>printer then se w0 14 ; then skip the triangle page; jl. a2. al. w1 j0. ; jl. w3 c37. ; outtext ( accounted ); am. (b1.) ; rl w0 +d36 ; jl. w3 c38. ; outnumber ( lines ); al. w1 j1. ; jl. w3 c37. ; outtext (lines on); am. (b1.) ; rl w0 +d37 ; jl. w3 c38. ; outnumber ( pages); al. w1 j2. ; jl. w3 c37. ; outtext ( pages); rl. w3 b1. ; rl w0 x3+d15 ; if segmentno (or virtual address) < 999999 chars then sl w0 999999/768+1+1; jl. a1. ; begin condition not fulfilled for job contr printing al. w1 j3. ; or after kill; jl. w3 c37. ; outtext( output ); am. (b1.) ; rl w0 +d15 ; ba. w0 1 ; wm. w0 b73. ; outnumber( chars = segmentno * 768 + 768 ); jl. w3 c38. ; al. w1 j4. ; jl. w3 c37. ; outtext( characters ); rl. w3 b1. ; a1: ; end; \f ; bøt 05.01.73 triangle page paper printer ...55... am 1 ; triangle=yes; a2: al w1 0 ; triangle=no; al w2 x2-2 ; last := cur out - 2; rs w2 x3+d20 ; al w0 1 ; triangle = trailing jl. w2 c41. ; print triangle; rl w2 x3+d62 ; w2:=devicekind bz w1 x3+d18+1 ; w1:= mode in output-operation sn w1 2 ; if mode <> 2 se w2 14 ; or kind <> 14 jl. a3. ; then goto no duoble buffering al. w1 j5. ; sense printer, to resieve the last status, al w2 x3+d21 ; in case of mode-2 (doubble) buffering jl. w3 (b5.) ; send and wait rs w0 x3+d55 ; save status se w0 1<1 ; if not normal answer jl. w2 c45. ; then goto testresult a3: ; no double buffering: al w0 1 ; wa w0 x3+d22 ; state := state + 1; rs w0 x3+d22 ; rl w0 x3+d7 ; if type = job controlled sn w0 2 ; output and not account then jl. a0. ; goto return; al w0 3 ; account: set page 1 rs w0 x3+4 ; (4) type ( = 3) dl w1 x3+d37 ; (6) pages ds w1 x3+8 ; (8) lines dl w1 x3+d12 ; ds w1 x3+12 ; (10-16) user name dl w1 x3+d13 ; ds w1 x3+16 ; rl w1 x3+d11 ; (18) project rs w1 x3+18 ; bz w0 x3+d8 ; rs w0 x3+20 ; (20) paper number; rl. w0 b46. ; rs w0 (x3+d3) ; page 3 := account buffer; dl. w3 b48. ; jl. w1 (b15.) ; call account; a0: ; jl. c10. ; j0: <:<10><15><12>accounted : <0>:> j1: <: lines on <0>:> j2: <: pages<10><10><0>:> j3: <:output <0>:> j4: <: characters (approx. upper limit)<10><0>:> j5: 0 ; sens-message e. ; test result ; ; w0 = logical status ; w2 = return c45: la. w0 b36.,jd-1; extract error bits; sn w0 0 ; if no error then jl x2 ; return; al w1 0 ; st := 0 + sz. w0 (b37.) ; if end of paper then al w1 x1+16 ; end paper bit; sz. w0 (b38.) ; if hard error then al w1 x1+32 ; hard error bit; sz w0 1<4 ; if disconnected then al w1 x1+64 ; disconnected bit; lo w1 x3+d22 ; state := state rs w1 x3+d22 ; or st; al w0 0 ; rs w0 (x3+d3) ; release page 3; jl. c10. ; goto central entry; \f ; re 18.9.73 triangle page paper printer ...56... ; define relative addresses to be used in the initialization f101 = b5 - b0 ; send and wait f102 = b6 - b0 ; send and wait fast f103 = b11- b0 ; get pages f104 = b12- b0 ; page jump f105 = b15- b0 ; call f106 = b65- b0 ; usercat name table address f110 = b46- b0 ; virt addr of account buf f111 = b47- b0 ; virt and f112 = b48- b0 ; rel addr of account code f113 = b79- b0 ; virt and f114 = b80- b0 ; rel addr of general print f115 = b84- b0 ; virt addr of central page f70 = c43- b0 ; rel of print front page f71 = c44- b0 ; rel of print last page ; define absolute addresses to be used inthe external list g150 = f101 + g12, g151 = f102 + g12, g152 = f103 + g12, g153 = f104 + g12 g154 = f105 + g12, g155 = f110 + g12, g156 = f111 + g12, g157 = f112 + g12 g158 = f113 + g12, g159 = f114 + g12, g160 = f106 + g12, g161 = f115 + g12 ; terminate page f4= k-b0 ; define length of page k=g12 + f4 ; k:=real value of load address g13=k-2 ; define last of page f100=f100 + 4 ; count k-assignments i. e. ; re 18.9.73 triangle page paper printer ...57... ; initialize triangle page b. j10 w. g14: al w0 i65 ; w0:= reserve on disc; al w1 f4 ; w1:= length of page; jl. w3 (j1.) ; reserve virt(w0, w1, w2); al. w0 g12. ; w0:= start addr of page; jl. w3 (j2.) ; move to virt(w0, w1, w2); al w2 x2+1 ; w2:=virt + writing rs. w2 g162. ; ext(389); jl. w3 (2) ; set externals; g180: 40 ; g162: 0 , 389 ; virt addr of triangle page; 0 , -1000 ; end of externals; jl. g8. ; goto initialize main loop; j0: 0 ;* base of externals j1: 12 ;* reserve virtual j2: 13 ;* move to virtual g170 = j0, g171 = j1, g172 = j2 e. \f ; bøt 28.12.71 main loop page paper printer ...58... ; this page contains the main loop in the printing, ie ; copying from the input area to the output buffer. ; furthermore the input- and output routines are placed ; here ; ; all seldom used actions such as treatment of errors ; and operator operations, start and ending of printing ; etc are placed on a separate page, the central page, ; which is entered with the state as parameter. the ; state will then define what to do. ; ; the state will in the main loop be <= 4 and only ; equal to 4 during printing of the last buffer. ; on exit to the central page the value may be greater ; than 4. ; ; ; the names are used as follows : ; ; a-names are local labels on page 0 ; b-names are global varibles (used on all page 0-s) ; c-names are global labels (used on all page 0-s) ; d-names are relative addresses on page 1 ; f- and g- names are used in the initialization ; i-names are options ; j-names are local variables on page 0 ; ; the b- and c- names have the same meaning in this page and in ; the central page and in the triangle page ; ; ; the pages are used as defined in the following ; start of page, all addresses will be relative to g0 - 10000 g0: k = 10000, f100 = f100 + 4 ; count k-assignments b. b80, c9 w. ; define page addresses b0: 0 ; page 0, this page b1: 0 ; page 1, variables b2: 0 ; page 2, not used b3: 0 ; page 3, input buffer b4: 0 ; page 4, not used (= zero) 73<12+0 ; pageident: main loop \f ; bøt 28.12.71 main loop page paper printer ...59... ; entries in central logic b5: 1 ;* send and wait b6: 2 ;* send and wait fast b7: 3 ;* lock simple b8: 4 ;* open simple b12: 8 ;* page jump ; semaphores ; super buffer: b23: 60 ;* segments free b24: 61 ;* segments full ; bit patterns b35: 32<16+32<8+32 ; interesting bits b36: -1 -1<23 -1<1 ; error bits from printer b37: 1<18 ; end paper bit = bit 5 b38: -1-1<23-1<1-1<18-1<4 ; hard error bits b39: 1<8 ; stopped bit ; virtual addresses 387 ;* entry central page b40: f60 ; b41: 383 ;* super buffer start b42: 384 ;* super buffer top ; input operation b50: 3<12 ; operation code =input b51: 0 ; first of transfer b52: 0 ; last of transfer b53: 0 ; segment number \f ; bøt 28.12.71 main loop page paper printer ...60... ; get next segment from area b. a5, j5 w. c0: al w0 1 ; segment no := wa w0 x3+d15 ; segment no + 1; rs w0 x3+d15 ; prepare: a0: rl. w1 b3. ; w1 := buffer start; al w2 x1+510 ; w2 := buffer end; ds. w2 b52. ; save buffer limits rs. w0 b53. ; and segment no; al. w1 b50. ; w1 := message address; al w2 x3+d9 ; w2 := area name addr; jl. w3 (b6.) ; send and wait fast (w1, w2); sn w0 1<1 ; if ok then jl. c2. ; return with segment; so. w0 (b37.) ; if error then jl. c8. ; goto hard error; al w1 5 ; state := 5; rs w1 x3+d22 ; jl. c6. ; goto central page; e. ; next virtual segment ; ; increase virt addr ; change segment counters ; lock segments full b. a5 w. c1: al w0 512 ; virt := 512 + wa w0 x3+d15 ; actual virt; sn. w0 (b42.) ; if virt = top then rl. w0 b41. ; virt := first; rs w0 x3+d15 ; actual virt := rs w0 (x3+d3) ; page 3 := virt; al w1 1 ; no of segments := ba w1 x3+d24+d16-d15; no of segments + 1 hs w1 x3+d24+d16-d15; (in first point); rl w0 x3+d23 ; bs. w0 1 ; segment claim := rs w0 x3+d23 ; segment claim - 1; sh w0 -1 ; if segment claim < 0 jl. a1. ; then goto release; a0: rl. w2 b24. ; get: jl. w3 (b7.) ; lock (segments full); jl. c2. ; goto return with segment; \f ; bøt 28.12.71 main loop page paper printer ...61... ; release point ; a point binding segments is found and released ; and the corresponding part of the super buffer is ; released, the segment counters are updated a1: al w0 0 ; rs w0 x3+d16 ; segment rel := 0; al w2 x3+d25+e42; point := top of points; a2: al w2 x2-e42 ; while no of segments to bz w1 x2+d16-d15 ; release (point) = 0 do sh w1 0 ; point := point - jl. a2. ; point length; rx w1 x3+d23 ; segment claim := wa w1 x3+d23 ; segment claim + rx w1 x3+d23 ; no of segments; sn w2 x3+d24 ; am -d24+d15 ; rl w0 x2-e42 ; rs w0 x2 ; move virt addr; sn w2 x3+d24 ; am -d24+d15 ; bz w0 x2-e42+d17-d15; no of segments := 0; a3: rs w0 x2+d16-d15+d17-d17; al w2 x2+2 ; while point < top point sh w2 x3+d24+e42-2-d16+d15; am -d24+d15 ; rl w0 x2-e42+d16-d15; move preceding point se w2 x3+d25+e42-d16+d15; to point; jl. a3. ; a4: rl. w2 b23. ; while no of segments to jl. w3 (b8.) ; release > 0 do begin al w1 x1-1 ; decrease no of segments; se w1 0 ; open (segments free); jl. a4. ; end; jl. a0. ; goto get; e. \f ; bøt 28.12.71 main loop page paper printer ...62... ; copy block from input buffer to printer buffer ; ; in the central loop the registers are used as follows: ; ; w0 cur word to be moved ; w1 input addr of cur word ; w2 output addr of cur word ; w3 page 1 addr ; ; in the loop all states <= 4 b. a30, j5 w. a0: al w1 x1+2 ; next: cur in := addr of next word; sl w1 (x3+d26) ; if cur in = top then jl. a25. ; goto next segment; a1: rl w0 x1 ; move: word(cur out) := rs w0 x2 ; w0 := word (cur in); sh w0 0 ; if w0 <= 0 then jl. a8. ; goto test negative; a2: so. w0 (b35.) ; if special characters then jl. a10. ; goto test chars; a3: al w2 x2+2 ; cur out := addr of next word; sh w2 (x3+d5) ; if w2 <= last of buffer then jl. a0. ; goto next; ; print contents of output buffer ws. w1 b3. ; w1 := work0 := rs w1 x3+d0 ; rel addr of cur in; a4: al w2 x2-2 ; output: w2 := last of transfer; rl w1 x3+d4 ; w1 := first of transfer; sh w2 x1-1 ; if first > last then jl. a5. ; goto test queue; ds w2 x3+d20 ; insert buffer limits; rl w0 x3+d47 ; rs w0 x3+d5 ; insert last of buffer; al w1 x3+d18 ; w1 := output message addr; al w2 x3+d21 ; w2 := printer name addr; jl. w3 (b5.) ; send and wait (w1, w2); se w0 1<1 ; if result=1 jl. a6. ; rl w2 x3+d20 ; al w2 x2+2 ; ws w2 x3+d19 ; se w2 (x1+2) ; and bytes transterred <> bytes sent then lo. w0 b39. ; status:=status or 1<8 a6: rs w0 x3+d55 ; saved status:=status; jd -1 sz. w0 (b36.) ; if any error then jl. w2 c4. ; goto test result; a5: bl w0 x3+d46 ; test queue: sn w0 1 ; if not remote batch printer jl. a29. ; and rl w0 (x3+d33) ; sl w0 1 ; printer queue sem value > 0 then jl. c5. ; goto prepare examine; a29: rl w0 x3+d22 ; sl w0 5 ; if state > max then jl. c6. ; goto call central; c7: rl. w1 b3. ; return from central: al w2 x1+512 ; wa w1 x3+d0 ; w1 := abs addr of cur in; rs w2 x3+d26 ; restore top in; rl w2 x3+d4 ; cur out := first of buffer; jl. a0. ; goto next; \f ; bøt 28.12.71 main loop page paper printer ...63... ; test negative a8: sn w0 0 ; if word = 0 then jl. a0. ; goto next; so w0 -2 ; if word <>-1 or -2 then jl. a2. ; return; rl w0 x3+d7 ; sn w0 0 ; if type = 0 then jl. a0. ; goto next; rs w2 x3+d1 ; save cur out; rl w0 x1 ; se w0 -2 ; if word = -1 then jl. c3. ; goto end text; rl w0 x3+d7 ; if type = 2 then se w0 2 ; begin jl. a9. ; type := 3; al w0 3 ; comment account := true; rs w0 x3+d7 ; goto end text; jl. c3. ; end; a9: al w0 4 ; state := rs w0 x3+d22 ; -2 passed; jl. a0. ; goto next; ; test chars a10: ds w2 x3+d1 ; work0,1 := save w1,w2; rl w2 x1 ; w2 := word; a11: sn w2 0 ; test rest: if w2 = 0 then jl. a12. ; goto exit; al w1 0 ; char := first char (w2); ld w2 8 ; w2 := w2 shift 8; sl w1 26 ; if char > 25 then jl. a11. ; goto test rest; bl. w1 x1+j0. ; jl. x1+a11. ; goto action (char); a12: dl w2 x3+d1 ; exit: restore w1,w2; jl. a3. ; return; a13: am i73-1 ; vt: inc := vt no of lines or a14: al w0 1 ; nl: inc := 1; rl w1 x3+d36 ; global linecount := wa w1 0 ; global linecount + inc; rs w1 x3+d36 ; wa w0 x3+d27 ; local linecount := rs w0 x3+d27 ; local linecount + inc; sh w0 i74-1 ; if linecount < max then jl. a11. ; goto test rest; jl. a22. ; goto virt ff; a15: al w0 1 ; ff: al w1 1 ; aa w1 x3+d37 ; global counters := ds w1 x3+d37 ; global counters + 1; a22: al w0 0 ; virt ff: rs w0 x3+d27 ; local linecount := 0; al w0 1 ; wa w0 x3+d28 ; local pagecount := rs w0 x3+d28 ; local pagecount + 1; \f ; bøt 28.12.71 main loop page paper printer ...64... ; release eldest point and create a new bz w1 x3+d25+d16-d15; w1 := no of segments to release; rl w0 x3+d23 ; segment claim:= wa w0 2 ; segment claim rs w0 x3+d23 ; + no of segments to release; rs. w2 j1. ; save rest chars; a16: sh w1 0 ; rep2: if w1 = 0 then jl. a17. ; goto move points; rl. w2 b23. ; jl. w3 (b8.) ; open(segments free); al w1 x1-1 ; w1 := w1 - 1; jl. a16. ; goto rep2; a17: al w1 x3+d25+e42; move points: to := top of points; al w2 x3+d25 ; from := last point; a18: sn w2 x3+d24 ; rep3: if from = first point then al w2 x3+d15+e42; from := top of pseudo point; al w1 x1-2 ; decrease(to, from); al w2 x2-2 ; rl w0 x2 ; move word; rs w0 x1 ; se w2 x3+d15 ; if from <> start of pseudo point then jl. a18. ; goto rep3; rl w1 x3+d0 ; ws. w1 b3. ; rel of segment rs w1 x3+d24+d16-d15+d17-d17; (no of segments to release = 0) rl w2 x3+d1 ; last of buffer := bl w1 x3+d46 ; if remote printer then sn w1 0 ; unchanged else rs w2 x3+d5 ; cur out; rl. w2 j1. ; restore rest chars; jl. a11. ; goto test rest; a20: rs. w2 j1. ; em: save rest chars; rl w1 (x3+d0) ; al w0 0 ; remove em from word: ld w1 8 ; so w0 25 ; shift until em char got; jl. -4 ; sz w0 1<8-25-1 ; jl. -4 ; ls w0 -8 ; w0 now contains the leading chars, rigth justified; rl w2 x3+d7 ; w1 contains the remainigs chars, left justified; sn w2 0 ; if type <> 0 then jl. a19. ; ld w1 8 ; shift the remaining chars into the word; se w1 0 ; jl. -4 ; a19: rs w0 (x3+d0) ; save in buffers; rs w0 (x3+d1) ; rl. w2 j1. ; w2 := rest chars; rl w0 x3+d7 ; se w0 0 ; if type <> 0 then jl. a11. ; goto test rest; ; end text ; ; set end of text bit and print rest of buffer c3: al w1 5 ; status := rs w1 x3+d22 ; end text; al w0 1 ; al w1 1 ; global counters := aa w1 x3+d37 ; global counters + 1; ds w1 x3+d37 ; rl w2 x3+d1 ; restore w2; al w2 x2+2 ; jl. a4. ; goto output; \f ; re 24.9.73 main loop page paper printer ...65... ; next segment ; ; type = 2 : next virt segment ; type = 0 or 1 : next area segment a25: rs w2 x3+d1 ; save cur out; rl w0 x3+d7 ; so w0 2 ; if type <> 2 or 3 then jl. c0. ; goto next area segment; jl. c1. ; goto next virt segment; c2: rl w2 x3+d1 ; return with segment: restore w2; rl. w1 b3. ; cur in := start of input buffer; al w0 x1+512 ; rs w0 x3+d26 ; restore top in; jl. a1. ; goto move; ; action table ; index is a character value < 26 j0: h. 0,r.10 , a14-a11 , a13-a11 , a15-a11 , 0,r.12 , a20-a11 ;char: 0-9, nl , vt , ff , 13-24 , em w. j1: 0 ; save w2 c8: ld w2 -100 ; hard error: al w3 0 ; w1w2w3:=0; a26: ld w2 8 ; repeat ls w2 -8 ; ld w3 8 ; w1w2w3:=w1w2w3 shift 8 ls w3 -3 ; + status shift (24-3) ld w0 3 ; + 48; al w3 x3+48 ; status:=status shift 3; sh w1 255 ; jl. a26. ; until w1w2w3 contains 8 characters; ds. w2 j3. ; rs. w3 j2. ; octal status:=w1w2w3; ; al. w1 j4. ; rl. w3 b1. ; reestablish page1 address; rl w2 x3+d4 ; cur in := error text addr; rs w2 x3+d26 ; cur out := top := first of buffer; jl. a1. ; goto move; j4: <:<15><10><10>:> ; si, 2 newlines <:<32>file unreadable, octal status = :>, 0, j3: 0, j2: 0 ; octal status <:<25>:>, -1 ; e. ; end copy block \f ; re 24.9.73 main loop page paper printer ...66... ; test printer status ; ; the coroutine state is updated depending ; on the printer status bits ; ; w0 = printer status ; w2 = return ; w3 = page 1 addr c4: rl w1 x3+d22 ; w1 := state; sz. w0 (b37.) ; if end of paper then al w1 x1+16 ; set end paper bit; sz. w0 (b38.) ; if hard error then al w1 x1+32 ; set hard error bit; sz w0 1<4 ; if disconnected then al w1 x1+64 ; set disconnected bit; rs w1 x3+d22 ; save state; jl x2 ; return; ; set queue bit c5: rl w1 x3+d22 ; al w1 x1+ 8 ; state := state rs w1 x3+d22 ; or queue > 0; ; call central page c6: dl. w3 b40. ; w2,w3 := addr; jl. (b12.) ; page jump (central); \f ; bøt 28.12.71 main loop page paper printer ...67... ; define relative addresses to be used ; in initialization f10 = b5 - b0 ; send and wait f11 = b6 - b0 ; send and wait fast f12 = b7 - b0 ; lock simple f13 = b8 - b0 ; open simple f14 = b12 - b0 ; page jump f16 = b23 - b0 ; segments free f17 = b24 - b0 ; segments full f18 = b40 - b0 ; entry central f19 = b41 - b0 ; super buffer start f20 = b42 - b0 ; super buffer top f21 = c7 - b0 ; return from central ; define absolute addresses to ; the external list g20 = f10 + g0 g21 = f11 + g0 g22 = f12 + g0 g23 = f13 + g0 g24 = f14 + g0 g26 = f16 + g0 g27 = f17 + g0 g28 = f18 + g0 - 2 g29 = f19 + g0 g30 = f20 + g0 f0 = k - b0 ; define length of page k = g0 + f0 ; k := absolute value of load addr g1 = k - 2 ; define last of page f100 = f100 + 4; count k-assignments i. e. \f ; bøt 28.12.71 main loop page paper printer ...68... ; initialize main loop ; ; reserve super buffer and ; initialize the semaphores, free and full ; write page b. a5, j10 w. g8: al w0 i66 ; w0 := reserve on disc; al w1 512 ; w1 := page size; jl. w3 (j1.) ; reserve virt (w0, w1, w2); al w2 x2+1 ; w2 := virt + writing; am. (j6.) ; al w3 x2 ; w3 := top virt; rs. w2 g163. ; ext(383); rs. w3 g164. ; ext(384); sn w2 x3 ; if no super buffer then jl. a1. ; goto rest; al w3 x3-513 ; rs. w3 j7. ; save last virt; a0: jl. w3 (j1.) ; reserve last of buffer se. w2 (j7.) ; jl. a0. ; rest: a1: al w1 i67 ; segments free value := rs. w1 (j4.) ; length of buffer; al w0 i65 ; w0 := reserve on disc; al w1 f0 ; w1 := length of page; jl. w3 (j1.) ; reserve virt (w0, w1, w2); al. w0 g0. ; w0 := abs start of main loop; jl. w3 (j2.) ; move to virt (w0, w1, w2); rs. w2 g179. ; ext(386); jl. w3 (2) ; set externals; g165: 40 ; g163: 0 , 383 ; buffer g164: 0 , 384 ; limits; j4: e13<12+19, 60 ; segments free; j5: e13<12+19, 61 ; segments full; g179: 0 , 386 ; virt of main lop; 0 , -1000 ; end of externals; jl. w3 (j3.) ; end init j0: 0 ;* base of externals j1: 12 ;* reserve virt j2: 13 ;* move to virt j3: 15 ;* end init j6: w. i67<9 ; length of superbuffer j7: 0 ; last virt g140 = j0, g141 = j1, g142 = j2, g143 = j3 g144 = j4, g145 = j5 e. i. h0 = s0, h1 = s1 ; define final checksums h2 = f100 ; transfer k-assignments to ; tape printer e.e. ; end global blocks e.e. ; end options \f ▶EOF◀